全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2841
推到 Plurk!
推到 Facebook!

如何在程式中產生暫存檔 (xxx.db)

答題得分者是:TWY
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-02 23:23:36 IP:118.166.xxx.xxx 訂閱
因為報表邏輯比較複雜,就以暫存檔的方式讓報表直接吃結果..
先由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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-03 00:29:30 IP:220.132.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-03 00:58:31 IP:118.166.xxx.xxx 訂閱
您好~
忘了說...是Paradox沒錯
BDE Administrator裡的path 是設 d:\TEMPFILES
在這個資料夾以及搜尋全部檔案都沒找到唷...
TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-03 01:23:17 IP:220.132.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-03 23:11:43 IP:118.166.xxx.xxx 訂閱
原來是我少設了Query1.DatabaseName
加上Query1.DatabaseName := D:\TEMPFILES 就OK囉....

這短短的一行,讓我花上了一整天的時間...

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-03 23:19:55 IP:61.67.xxx.xxx 未訂閱
僅補充個人的經驗
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' 定義
發帖時沒見仁兄已找到重點了, 恭喜啦!
編輯記錄
P.D. 重新編輯於 2009-10-03 23:21:41, 註解 無‧
P.D. 重新編輯於 2009-10-03 23:23:01, 註解 無‧
TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-10-04 10:17:03 IP:220.132.xxx.xxx 訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-10-29 00:41:58 IP:61.64.xxx.xxx 訂閱
不知道報表複雜多少,報表可以連無數的資料表,太誇張,很多個啦!用關聯欄位就可以了吧!也可以計算。
真的複雜到不行嗎??

===================引 用 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,是會付錢的又不是沒錢,但是理由還是一堆)
系統時間:2024-04-20 16:06:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!