線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2717
推到 Plurk!
推到 Facebook!

讀取TXT文字檔

尚未結案
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-09-03 00:30:14 IP:124.11.xxx.xxx 訂閱
請問各位板大~以下程式碼是讀取TXT文字檔到DBGIRD..
第一次執行程式結果正常..但第2次執行程式會出現"Duplicate name'ID'in TFieldDefs"
必須關閉視窗再執行一次才會正常.
請問各位板大..此錯誤需如何修正...請指導~謝謝!!

procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
wStr,filename: String;
wList: TStringList;
i: Integer;
begin
DBGrid1.DataSource := DataSource1;
DataSource1.DataSet := ADODataSet1;
wList := TStringList.Create;
with ADODataSet1.FieldDefs do
begin
Add('ID', ftInteger);
Add('Col_1', ftString, 50);
Add('Col_2', ftString, 50);
end;
ADODataSet1.CreateDataSet;
if OpenTextFileDialog1.Execute then
filename:= OpenTextFileDialog1.FileName;
if fileexists(filename)=true then
begin
i := 1;
Assignfile(f, filename);
Reset(f);
while not eof(f) do
begin
Readln(f, wStr);
wStr := StringReplace(wStr, '|',',', [rfReplaceAll]);
wList.CommaText := wStr;
ADODataSet1.Append;
ADODataSet1.FieldByName('ID').AsInteger := i;
ADODataSet1.FieldByName('Col_1').AsString := wList.Strings[0];
ADODataSet1.FieldByName('Col_2').AsString := wList.Strings[1];
ADODataSet1.Post;
Inc(i);
end;
closefile(f);
wList.Free;
end;
end;
end.

編輯記錄
smallmi 重新編輯於 2012-09-02 10:31:15, 註解 無‧
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-09-03 05:51:17 IP:210.66.xxx.xxx 未訂閱
紅色那段是把 "欄位" 加入 dbgrid 中嗎?  如果是......那 dbgrid 中,當然會重複
這功能只要執行一次即可.....

所以...
法1
在加入一個 button2
把 紅色 那段,放在 button2 中,先按 button2 產生欄位.....,再按 button1 把資料加入
程式結束前, button2 不用再按

法 2
或者把 把 紅色 那段,放在 onformcreate 也可以,程式一啟用,就建立
省下 button2

法3
在 ide 的設計時,就加入,讓 DBGRID 有此三個 FIELDS




===================引 用 smallmi 文 章===================
請問各位板大~以下程式碼是讀取TXT文字檔到DBGIRD..
第一次執行程式結果正常..但第2次執行程式會出現"Duplicate name'ID'in TFieldDefs"
必須關閉視窗再執行一次才會正常.
請問各位板大..此錯誤需如何修正...請指導~謝謝!!

procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
wStr,filename: String;
wList: TStringList;
i: Integer;
begin
DataSource1.DataSet := ADODataSet1;
with ADODataSet1.FieldDefs do
Add('ID', ftInteger);
Add('Col_2', ftString, 50);
end;
ADODataSet1.CreateDataSet;
if OpenTextFileDialog1.Execute then
filename:= OpenTextFileDialog1.FileName;
if fileexists(filename)=true then
begin
i := 1;
Assignfile(f, filename);
Reset(f);
while not eof(f) do
begin
Readln(f, wStr);
wStr := StringReplace(wStr, '|',',', [rfReplaceAll]);
wList.CommaText := wStr;
ADODataSet1.Append;
ADODataSet1.FieldByName('ID').AsInteger := i;
ADODataSet1.FieldByName('Col_1').AsString := wList.Strings[0];
ADODataSet1.FieldByName('Col_2').AsString := wList.Strings[1];
ADODataSet1.Post;
Inc(i);
end;
closefile(f);
wList.Free;
end;
end;
end.

------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-09-03 21:25:11 IP:124.11.xxx.xxx 訂閱
 請指導~謝謝!!
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-09-04 11:00:34 IP:118.169.xxx.xxx 未訂閱
顯然你是一位完全生手, 不了解Delphi基本功, 所以建議多看一些Delphi的初階書
DBGrid 是一個顯示介面, 把資料庫的記錄明白顯示到螢幕上而已, 不是DBGrid 儲存到資料庫
所你應該要了解, 只要資料庫有資料, DBGrid 就可以顯示,
要DBGrid 做任何顯示, 也是要從資料庫進行動作,
如何將資料存到資料庫, 請回頭看書, 會比我們寫的更詳細!
===================引 用 smallmi 文 章===================
請指導~謝謝!!
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-09-09 16:37:57 IP:124.11.xxx.xxx 訂閱
 謝謝以上版大的指導..請教各位版大..我寫了2個BUTTON,第一個BUTTON讀取文字檔並顯示在DBGRID,等待USER確認無誤,按BUTTON2存檔至資料庫中,目前問題,按下BUTTON2不會存檔至資料庫..請版大指導~謝謝!!
已有將 ADODataSet1 CommandType屬性值設定為cmdText
CommandText屬性值設為Select * From aaa
Active屬性設為True
LockType設為ltBatchOptimistic

procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
wStr,filename: String;
wList: TStringList;
i: Integer;
begin
if OpenTextFileDialog1.Execute then
filename:= OpenTextFileDialog1.FileName;
if fileexists(filename)=true then
begin
wList := TStringList.Create;
ADODataSet1.Close;
ADODataSet1.FieldDefs.Clear;
ADODataSet1.FieldDefs.Add('ID', ftInteger);
ADODataSet1.FieldDefs.Add('DAT_SRDT', ftString, 8);
ADODataSet1.FieldDefs.Add('NUM_PS', ftString, 12);
ADODataSet1.FieldDefs.Add('COD_EMP', ftString, 5);
ADODataSet1.FieldDefs.Add('LIN_SRDT', ftString, 2);
ADODataSet1.CreateDataSet;
i := 1;
Assignfile(f, filename);
Reset(f);
while not eof(f) do
begin
Readln(f, wStr);
wList.CommaText := wStr;
ADODataSet1.Append;
ADODataSet1.FieldByName('ID').AsInteger := i;
ADODataSet1.FieldByName('DAT_SRDT').AsString := wList[0];
ADODataSet1.FieldByName('NUM_PS').AsString := wList[1];
ADODataSet1.FieldByName('COD_EMP').AsString := wList[2];
ADODataSet1.FieldByName('LIN_SRDT').AsString := wList[3];
ADODataSet1.Post;
Inc(i);
end;
closefile(f);
wList.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.updateBatch(arAll);
end;
end.
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-09-09 21:56:41 IP:210.66.xxx.xxx 未訂閱
 您的順序恐巔倒了.....
如 PD 大所言.....

一般會是 TEXT -> DB -> DBGRID
意思是 TEXT 存入 DATABASE ,再用 DBGRID 顯示 DATABASE 的內容

不知這樣是否符合您的流程 ?? !!

------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
系統時間:2024-03-29 0:51:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!