請問當treeview新增資料時怎樣設計才能不用再異動程式碼? |
尚未結案
|
goodjimmy
一般會員 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
請問各位高手 我的程式是用treeview的元件,去讓使用者選擇項目後,去資料庫呼叫欄位值回傳到程式,做統計分析
現在遇到一個問題,我的treeview的項目,如果新增後,程式碼一般是要再新增那一個項目的程式,可否能新增分析項目,但不用動到程式碼,因為已經封裝完畢,每次改一個項目,都要再封裝一次,實為麻煩,謝謝
分析項目的程式碼如下
if (Node.Text = '平均住院日') then //判斷treeview的項目 begin table := 'INH '; //資料庫欄位 pk := 'INH_YYYMM'; //資料庫欄位 mitem := 'SUM(INH_SUMDAY)'; //資料庫欄位 str := 'INH_SEX =' '1'; //資料庫欄位 ditem := 'SUM(INH_PTCT)'; //資料庫欄位 mSQL(mitem, str);//統計的分子程序 dSQL(ditem); //統計的分母程序 start := 'INH_SEX'; //資料庫欄位 add := 'SUM(INH_SUMDAY) , SUM(INH_PTCT) '; //資料庫欄位 SQL(start, add); //統計分析圖表的主程序 end |
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
當然有可能,但是這關係到你一開始treeview的設計,
給你一點小小的建議,一般來說你如果想做到可以動態的
增加or減少一些條件,然後程式碼又可以不動,你在程式設
計的初期就必需想好一個彈性比較大的架構,然後在利用
一些命名原則,就可以做到條件異動,但不需要異動到程式
碼了,就拿你treeview為例好了,你可以在TreeNode.data
(這是一個指標型態你可以自己訂義要放那些東西)記錄欄
位名稱,最後當然你的sql語法,也是用串的串起來,送到資
料庫去,不知道這樣說,你可以理解嗎??
我想你現在的問題一定是,user每加一個條件你就要加一段
程式碼,然後再去安裝一次,很麻煩,但是我想在你的架構不
變的情況之下,這種情形可能是不可避免的喔...
|
goodjimmy
一般會員 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
|
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
|
goodjimmy
一般會員 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
您好:
是判斷treenode的文字,去執行上述的語法,設定好treenode
ex:
住院品質指標
平均住院日
住院性別比率
超過30人比率
住院感染率 如果使用者選擇了「住院性別比率」,那程式就會判斷,該如何組合上述的sql語法,到資料庫中找資料,到程式中組合運算,跑出統計分析和圖表分析!! 以下是我的主FUNCTION
function TForm2.SQL(start: string; add: string): string; var I, SUM: Integer; AddVal: Double; begin try Form4 := Tform4.Create(Application); while not DataModule1.ADOQuery2.EOF do//分子陣列 begin Form4.Series4.DataSource := DataModule1.ADOQuery2; Form4.Series4.XLabelsSource := DataModule1.ADOQuery2.Fields[0].FieldName; Form4.Series4.YValues.ValueSource := DataModule1.ADOQuery2.Fields[1].FieldName; DataModule1.ADOQuery2.Next; end; while not DataModule1.ADOQuery3.EOF do//分母陣列 begin Form4.Series5.DataSource := DataModule1.ADOQuery3; Form4.Series5.XLabelsSource := DataModule1.ADOQuery3.Fields[0].FieldName; Form4.Series5.YValues.ValueSource := DataModule1.ADOQuery3.Fields[1].FieldName; DataModule1.ADOQuery3.Next; end; for I := 0 to Form4.DBChart2.Series[0].Count - 1 do //圖表分析 begin //Form4.Series5.YValue[I] = 0 if (Node.Text = '平均住院日') then //AddVal := Form4.Series4.YValue[I] AddVal := Form4.Series4.YValue[I] / Form4.Series5.YValue[I] else AddVal := (Form4.Series4.YValue[I] / Form4.Series5.YValue[I]) * 100; //value := floattostr(AddVal); if (I = 0) then SUM := 0 else if (I > 0) then SUM := SUM 1; if ((StrToInt(showmonth) I) > 12) then begin showmonth := '01'; SUM := 0; if (StrToInt(showyear) 1 > 092) then showyear := '093' else if (StrToInt(showyear) 1 > 091) then showyear := '092' end; Form4.Series2.addxy(I, AddVal, showyear '年' IntToStr(StrToInt(showmonth) SUM) '月', clDefault); Form4.Series1.AddPie(AddVal, showyear '年' IntToStr(StrToInt(showmonth) SUM) '月', clDefault); Form4.Series3.Add(AddVal, showyear '年' IntToStr(StrToInt(showmonth) SUM) '月', clDefault); end; Form4.Series4.Active := false; Form4.Series5.Active := false; Form4.ShowModal; finally Form4.Free; end; DataModule1.ADOQuery1.Close; DataModule1.ADOQuery2.Close; DataModule1.ADOQuery3.Close; end; |
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
你好,我没太仔细看你的代码,也看不大懂。 基本上,你是要根据TreeView里的node的不同,来生成不同的SQL语句,是吧? 如果我来做,我首先把 TreeView 和一个Table绑定。这样,就可以直接通过增加Table里的Record,来使TreeVieW在运行时增加项目而不需要重新compile程序。 其次,新增加的项目需要的新的SQL语句,我也可以写好在那个Table里,选了某个Node,就去Table的相应Record里去读保存SQL语句的Field。 这样一来,将来有变动,只需要去更新那个Table就可以了。不需要再重新compile程序。
|
goodjimmy
一般會員 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |