請教一個重複利用TDataModule的問題... |
尚未結案
|
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
請教各位先進:
這個問題有點不知如何表達才能讓前輩們了解我的意思,然後再進一步幫助我,所以我的描述如有不解的地方請提問。 假設:有一個表單Form1,Form1上有許多可視的資料庫表現元件組,相關資料庫作業程式已經撰寫完畢,元件組對應的相關TDataSet,如TTable,TQuery等元件放在一個TDataModule上,假設它的名字為DMF1,然後一切資料庫程式都已經實現完畢成功了,假設它所關聯的資料內容是A部門的。 現在我的問題是:要在目前上述已經完成的程式架構上,在同一支程式中要新增另一個B部門且能進行切換方便瀏覽及顯示A部門與B部門資訊,也就是可能我只需按個A鍵及顯示A部門資訊,按個B鍵及顯示B部門資訊。B部門的資料庫與A部門的完全一樣(從表格到欄位結構),換言之對應的資料庫是獨立的另一份,我構想中最好的方式是能共用上述Form1等已經做好表單。請問該如何做才能最省事呢? 我盡量簡單描述我的需求,希望能讓前輩明白,最主要整個程式內的資料庫表單決不會只有Form1一個而是好多個,如果要重新再複製一份恐怕程式會變得很大,維護上也沒效率,希望有前輩能指引個想法來解決這問題。 Thanks for your help.
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
你的解法正確的阿~~直接使用 TdataSource 做切換就好了.
更改 TdataSource 的 DataSet 到A或B的部門即可.
(PS1. 先決條件,兩者的欄位都是一模一樣)
(PS2. 記得資料庫要先Close()過再Open(); 免得出問題 ) 另外還有很多解法啦~~例如用 SQL 語法來選著資料庫
select *from A where... 或者 select * from B where.... 還有一種解法就是在資料庫內再多一個 Department 的欄位.
下 SQL select 指令時,在 where 裡面加入部門的篩選條件.
|
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
引言: 你的解法正確的阿~~直接使用 TdataSource 做切換就好了. 更改 TdataSource 的 DataSet 到A或B的部門即可. (PS1. 先決條件,兩者的欄位都是一模一樣) (PS2. 記得資料庫要先Close()過再Open(); 免得出問題 ) 另外還有很多解法啦~~例如用 SQL 語法來選著資料庫 select *from A where... 或者 select * from B where.... 還有一種解法就是在資料庫內再多一個 Department 的欄位. 下 SQL select 指令時,在 where 裡面加入部門的篩選條件.海星前輩您好: 首先感謝您的回應。 只是我還沒有適當的解法啊。因為上述的DMF1中有許多TDataSource,TTable與TQuery元件,如果要手寫程式去逐一切換TDataSource的話,恐怕要費許多力氣,更別提Form1等許多資料庫瀏覽表單上的程式中,有需多是直接引用DMF1內的TTable與TQuery,一但用切換的方式,恐怕工程不小。 我使用的資料庫是Paradox。 你另外提的方法都是很好,如果是一開始我就會參照,把部門用個變數代替,只是現在是,程式完成後再新增了一個部門,一旦修改起來實在沒玩沒了。原先我的想法是複製一份DMF1,假設另一份為DMF2,修改DMF2內的TTable與TQuery中有關表格名稱成為B部門對應的表格名稱,然後假設一個變數為aDMF,在切換部門時用 aDMF := DMF1; 與 aDMF := DMF2; 指定aDMF內容,再置換程式碼中所有原先是DMF1的變數,但失敗了,因為aDMF並不認識DMF1與DMF2內的TTable,TQuery,也對,因為我還找不出如何宣告aDMF的變數型態,使它能繼承DMF1與DMF2的成員。 所以,能再請您想想有其他方式嗎?還是我不明瞭您上述的建議,那再煩請您說明多一些。THKS 發表人 - David 於 2004/01/09 21:22:54 |
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
假設你是使用 Table 來寫程式.
在 DM 上擺 Table1、Table2、DataSource1 這三個元件就好.
記住 TDataSource 只有擺一個而已.不是兩個. TDataSource1 裡面是不是有 DataSet 屬性? 當用戶按按鈕就執行
DataSource1.DataSet := Table2;
再執行一次,就變成
DataSource1.DataSet := Table1; 這樣瞭解了沒??? 其餘的 TDBEdit 的 DataSource 全部都是只有指向 DataSource1
你有 100個 TDBEdit 也是只有一行程式碼而已.
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
上面那個方式你不喜歡的話,另一個方式就是改 Table 的 TableName
他有100個部門也沒差,每個部門做成一個資料庫,
但欄位內容一定要一模一樣,
假設部門有 QC、IT、RD三個..那你就製造 QC.DB、IT.DB、RD.DB 三個資料庫.
以後要切換就
Table1.Active := false;
Table1.TableName := QC;
Table1.Active := true;
這樣子去切換就好了. 反正方法太多種啦~~你高興怎樣做就怎樣做..完全都不會麻煩.
都用同一組元件就好,不要再去增加新的 DM、Table或 xxoo
|
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
引言: 假設你是使用 Table 來寫程式. 在 DM 上擺 Table1、Table2、DataSource1 這三個元件就好. 記住 TDataSource 只有擺一個而已.不是兩個. TDataSource1 裡面是不是有 DataSet 屬性? 當用戶按按鈕就執行 DataSource1.DataSet := Table2; 再執行一次,就變成 DataSource1.DataSet := Table1; 這樣瞭解了沒??? 其餘的 TDBEdit 的 DataSource 全部都是只有指向 DataSource1 你有 100個 TDBEdit 也是只有一行程式碼而已. 上面那個方式你不喜歡的話,另一個方式就是改 Table 的 TableName 他有100個部門也沒差,每個部門做成一個資料庫, 但欄位內容一定要一模一樣, 假設部門有 QC、IT、RD三個..那你就製造 QC.DB、IT.DB、RD.DB 三個資料庫. 以後要切換就 Table1.Active := false; Table1.TableName := QC; Table1.Active := true; 這樣子去切換就好了. 反正方法太多種啦~~你高興怎樣做就怎樣做..完全都不會麻煩. 都用同一組元件就好,不要再去增加新的 DM、Table或 xxoo實在非常感謝海星前輩的不吝指點與費時解說。 依照您的方法1,是很好的方式,但是上一篇有報告過: ”Form1等許多資料庫瀏覽表單上的程式中,有許多是直接引用DMF1內的TTable與TQuery,一但用切換的方式,恐怕工程不小。” 換言之Unit1.pas(Form1對應的程式檔)內有許多如: DMF1.Query1.SQL.Add('select * from t1 where f1 > 121...'); ... DMF1.Active := True; x := DMF1.Query1.FieldByName('f1').AsString; ... 這種直接引用DMF1內的TTable與TQuery的程式作為其他資料運算的成果,並沒有連結TDataSource,所以才費事。 依照您的方法2,如果是只有TTable元件還好,只有TableName修改即可,但是TQuery要keyin的就不少了,而Unit1.pas的程式碼也無法解決。 很感謝您的熱情義助,能請問還有其他想法嗎?THKS. |
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
引言: 換言之Unit1.pas(Form1對應的程式檔)內有許多如: DMF1.Query1.SQL.Add('select * from t1 where f1 > 121...'); ... DMF1.Active := True; x := DMF1.Query1.FieldByName('f1').AsString; ...不要懶惰..事後補救該花時間的就該花..你逃避不了的.. 反正你程式碼只需再改一次而已. 把資料庫名稱改為變數型態,這樣你的問題就一次解決了. String BaseName; // 資料庫名稱用動態的. String SQLStr; BaseName := 'f1'; SQLStr := 'select * from ' BaseName ' where f1 > 121...'; DMF1.Query1.SQL.Add( SQLStr ); x := DMF1.Query1.FieldByName( BaseName ).AsString;發表人 - 海星 於 2004/01/09 23:25:58 發表人 - 海星 於 2004/01/09 23:27:07 |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名?
如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991
|
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
引言: 請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名? 如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991謝謝前輩的指引,我會朝這個想法測試看看,再向各位報告。更謝謝海星前輩的幫忙指引,謝謝各位,萬分感謝。 |
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
引言: 請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名? 如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991感謝Chance36前輩的指引,小弟測試後確定可達到自己的需求,再次感謝您的不吝指點與海星前輩的幫忙,謝謝您們。 Best regards. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |