如何在程式中產生暫存檔 (xxx.db) |
答題得分者是:TWY
|
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
因為報表邏輯比較複雜,就以暫存檔的方式讓報表直接吃結果..
先由QUERY把資料加工完再丟到暫存表 但是一直沒有找到暫存檔(REPORTS.DB)可以拉進報表裡 (似乎沒有產生成功?) 以下是我的做法及設定... 請問各位是我的程式有哪裡有問題嗎? 一、表單上元件的設定: (1)Table1 TableName:REPORTS.DB (2)BatchMove1 Destination:Table1 Mode:batCopy Source:Query2 (3) 報表是Crystal Reports 二、FormCreate時先建立暫存表結構 [code delphi] try Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('CREATE TABLE REPORTS ( ' A01 CHAR(3), A02 CHAR(5), A03 CHAR(5) )'); Query1.Execsql; except end; [/code] 三、主要按鈕OnClick事件 (Query2處理的邏輯很多,以下就簡略帶過) [code delphi] Query2.Close; Query2.SQL.Clear; Query2.SQL.Add('SELECT A.ID_NO, A.TYPE, B.DESCP FROM PROD A, PROM B WHERE A.ID_NO = B.ID_NO AND A.TYPE='4' ); Query2.Open; // while not Query2.Eof do begin Table1.Append; Table1.FieldByName('A01').AsString := Query2.FieldByName('ID_NO').AsString; Table1.FieldByName('A02').AsString := Query2.FieldByName('TYPE').AsString; Table1.FieldByName('A03').AsString := Query2.FieldByName('DESCP').AsString; Table1.Post; end; [/code] |
TWY
高階會員 ![]() ![]() ![]() ![]() 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
xxx.db 是 Paradox 的嗎!?
若是的話 1. 若妳的程式可以執行,用檔案總館搜尋一下 2. 利用 TDatabase 可指定檔案存放路徑,例如 Database1.Params.Values['Path'] := 'c:\MyParadoxDB\'; 3. 需要暫存表格(Table),不一定要用實際資料庫 Table,利用外部元件 TkbmMemTable 或內部元件 TClientDataSet 也很方便, 由於透過記憶體運作所以效能應該會比另外用 Paradox or Access 等實際資料庫檔案來的快許多。 |
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
|
TWY
高階會員 ![]() ![]() ![]() ![]() 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
1. 若妳元件相關屬性設定非連結到該 BDE Administrator 設定的 Alias,那就與 BDE 無關了 (TDatabase、TQuery、TTable 設可以獨自設定,不需要透過 BDE Alias 連結資料庫)
2. 妳的程式可以正常執行嗎? 3. 沒有產生 REPORT.DB 原因可能有很多,我不知道可否用 TQuery 動態建立 Paradox Table,不過我確定可以使用 TTable,可以參考下面寫法。 4. 若妳堅持使用原本的 TQuery 寫法來建立 Paradox Table,建議將片段抽離出來 New Application 去試,不要與妳的複雜報表綁在一起,這樣應該會比較容易找出問題點。 [code delphi] procedure TForm1.Button1Click(Sender: TObject); begin //New Form, 拉一個 Table1 and Button1 with Table1 do begin Close; DatabaseName := 'd:\Tmp1'; TableType := ttParadox; TableName := 'REPORTS'; FieldDefs.Clear; FieldDefs.Add('Field1',ftInteger,0,True); FieldDefs.Add('Field2',ftString,30,False); IndexDefs.Clear; //IndexDefs.Add('','Field1',[ixPrimary]); //IndexDefs.Add('Fld2Indx','Field2',[ixCaseInsensitive]); if not Table1.Exists then Table1.CreateTable; Open; InsertRecord([999,'ABC']); end; end; [/code]
編輯記錄
TWY 重新編輯於 2009-10-03 01:37:44, 註解 無‧
|
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
僅補充個人的經驗
1.TQuery 如果我沒記錯, 要指定 DATABASENAME 的路徑 2.使用 TClientDataSet, 必須發放 Midas.dll 檔到客戶檔, 這支檔似乎很多程式都會使用, 所以往往我的客戶安裝了其他軟體, 就把 Midas.dll 在Delphi設計中的預設路徑給改掉, 程式一執行就出錯, 另外 TClientDataSet 所使用的資料格式 .cds , 其crash 的機率相當高, 之前我也是用 TClientDataSet 來做報表的暫存, 但常常發生檔案無法存取的問題, 只要把備份的 cds檔覆蓋就好了, 造成後續維護不少的麻煩 3.使用 TKbmMemTable 目前看來是最好的選擇, 這個元件又是Free, 使用上速度也比db 要快上很多, 但缺點是借用記憶體來處理, 所以pc 記憶體不夠的可能會比較麻煩, 再者, kbm 沒有實質資料檔, 因此一旦當機, 甚至 TKbmMemTable close 之後, 這個資料表就完全消失了, 不只是 data, 包含結構 field 都被 free, 也就是說它的保存功能幾乎等於0, 因此自己要做好保存功能, 不過我還是會建議報表temp用這個是不錯的選擇 註: kbm 可以當成 db 來看, 唯不同的是 db 如果要存圖, 必須設定結構為 'G', kbm 則是必須以 'B' 定義 發帖時沒見仁兄已找到重點了, 恭喜啦! |
TWY
高階會員 ![]() ![]() ![]() ![]() 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
TkbmMemTable v4.03 for Delphi7 可使用 kbmMemTable1.SaveToFileViaFormat('c:\tmp1\test.bin',kbmBinaryStreamFormat1); 來存檔,另外 LoadFromFileViaFormat method 可讀回。
與 TClientDataSet 存讀檔不同的是讀檔時 kbm 可以是完全空的沒有任何 Field 結構,而 TClientDataSet 卻需要先建立好 Field 結構才能讀入。 這兩個元件我都常在用,有些細微特性不同所以適用處也有些不同。 所幸我的客戶皆為企業用戶環境單純還沒遇到 ClientDataSet 檔損毀等問題,不過還是感謝版主 P.D. 的經驗分享,經驗即價值之所在。 ===================引 用 P.D. 文 章=================== 3.使用 TKbmMemTable 目前看來是最好的選擇, 這個元件又是Free, 使用上速度也比db 要快上很多, 但缺點是借用記憶體來處理, 所以pc 記憶體不夠的可能會比較麻煩, 再者, kbm 沒有實質資料檔, 因此一旦當機, 甚至 TKbmMemTable close 之後, 這個資料表就完全消失了, 不只是 data, 包含結構 field 都被 free, 也就是說它的保存功能幾乎等於0, 因此自己要做好保存功能, 不過我還是會建議報表temp用這個是不錯的選擇 |
heartgame0
一般會員 ![]() ![]() 發表:2 回覆:29 積分:11 註冊:2008-07-28 發送簡訊給我 |
不知道報表複雜多少,報表可以連無數的資料表,太誇張,很多個啦!用關聯欄位就可以了吧!也可以計算。
真的複雜到不行嗎?? ===================引 用 cindyliu 文 章=================== 因為報表邏輯比較複雜,就以暫存檔的方式讓報表直接吃結果.. 先由QUERY把資料加工完再丟到暫存表 但是一直沒有找到暫存檔(REPORTS.DB)可以拉進報表裡 (似乎沒有產生成功?) 以下是我的做法及設定... 請問各位是我的程式有哪裡有問題嗎? 一、表單上元件的設定: (1)Table1 ??? TableName:REPORTS.DB (2)BatchMove1 ??? Destination:Table1 ??? Mode:batCopy ??? Source:Query2 (3) 報表是Crystal Reports 二、FormCreate時先建立暫存表結構 [code delphi] try ??? Query1.Close; ??? Query1.SQL.Clear; ??? Query1.SQL.Add('CREATE TABLE?REPORTS ( ' A01 CHAR(3),?A02 CHAR(5),?A03 CHAR(5) )'); ??? Query1.Execsql; ? except ? end; [/code] 三、主要按鈕OnClick事件 (Query2處理的邏輯很多,以下就簡略帶過) [code delphi] Query2.Close; Query2.SQL.Clear; Query2.SQL.Add('SELECT A.ID_NO, A.TYPE, B.DESCP FROM PROD A, PROM B WHERE A.ID_NO = B.ID_NO AND A.TYPE='4' ); Query2.Open; // while not Query2.Eof do begin ??Table1.Append; ??Table1.FieldByName('A01').AsString := Query2.FieldByName('ID_NO').AsString; ??Table1.FieldByName('A02').AsString := Query2.FieldByName('TYPE').AsString; ??Table1.FieldByName('A03').AsString :=?Query2.FieldByName('DESCP').AsString; ??Table1.Post; end; [/code] ?
------
資訊業是永遠不能停止學習的行業! 但是進步都只是一點點一點點! ==可以不用理我!因為我的程度只有2成,或許不到!! ==我只會拉拉元件,打打迴圈,打打條件判斷,連連資料庫,rs232送送訊號,印表機簡單列印。 只有寫寫小小的點餐軟體(為何想寫,因為叫人家改的小東西,都ooxx,是會付錢的又不是沒錢,但是理由還是一堆) |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |