請問有關Master/Detail的問題 |
尚未結案
|
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
請問一下,我現在要用Delphi6的ADO做Master/Detail的功能,遇到的問題如下:
我其中有個DataGrid是用來顯示明細的資料,我是用ADOQuery2連明細的資料表,然後寫入ClientDataSet,然後DataSource再指向ClientDataSet,我的程式大概是這樣寫的:
with qyPURORDS do begin cds.Append; cds.FieldByName('PO_NO').AsString:=FieldByName ('PO_NO').AsString; cds.FieldByName('ITEM_NO').AsString:=FieldByName('ITEM_NO').AsString; cds.FieldByName('ITEM_NAME').AsDateTime:=FieldByName('ITEM_NAME').AsDateTime; cds.Post; end; 可是結果是錯的: PO_NO ITEM_NO ITEM_NAME 85005 1 test1 85005 2 test2 85005 3 test3 85005 1 test1 85005 1 test1 也就是說最後兩筆的資料都是第一筆的,是因為我的ClientDataSet一直在Append嗎?要怎麼改呢?謝謝!^^ |
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 您是從ADOQuery對應的明細資料表中抓出資料﹐再寫入ClientDataSet嗎﹖
您的寫法似乎只抓取了ADOQuery對應的明細資料表中當前筆資料寫入ClientDataSet中﹒改成如下試試﹕
begin With qyPURORDS do begin First; While Not qyPURORDS.Eof do begin cds.Append; cds.FieldByName('PO_NO').AsString:=FieldByName ('PO_NO').AsString; cds.FieldByName('ITEM_NO').AsString:=FieldByName ('ITEM_NO').AsString; cds.FieldByName('ITEM_NAME').AsDateTime:=FieldByName ('ITEM_NAME').AsDateTime; cds.Post; Next; end; end; end;========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟 |
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 請問ADOQuery元件和ClientDataSet元件是否有正常連接資料庫并Open﹖
begin qyPURORDS.Close; qyPURORDS.SQL.Add('Select * From 資料表'); qyPURORDS.Open; qyPURORDS.First; While Not qyPURORDS.Eof do begin cds.Append; cds.FieldByName('PO_NO').AsString:=qyPURORDS.FieldByName ('PO_NO').AsString; cds.FieldByName('ITEM_NO').AsString:=qyPURORDS.FieldByName ('ITEM_NO').AsString; cds.FieldByName('ITEM_NAME').AsDateTime:=qyPURORDS.FieldByName ('ITEM_NAME').AsDateTime; cds.Post; qyPURORDS.Next; end; end;========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟 |
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
有啊,我的ADOQuery元件都有正常連接資料庫並Open,我再說一遍我的做法好了,有兩個ADOQuery,分別是qyMaster和qyDetail,qyMaster是連接主檔的資料表,qyDetail是連接明細的資料表,我在qyDetail的SQL屬性中直接輸入select * from DetailData where PO_NO=:PO_NO,在qyMaster的AfterScroll事件中輸入以下程式:
qyDetail.Close;
qyDetail.Parameters.ParamByName('PO_NO').Value := qyMaster.FieldByName('PO_NO').AsInteger;
qyDetail.Open;
ShowDetail_DATA;
---------------------
ShowDetail_DATA是我自己寫的procedure,裡面的程式如上面所發表的,也就是把qyDetail值寫入ClicentDataSet,就這樣…^^
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗
begin qyDetail.Close; qyDetail.Parameters.ParamByName('PO_NO').Value := qyMaster.FieldByName('PO_NO').AsInteger; qyDetail.Open; ShowDetail_DATA; {ShowDetail_DATA Procedure內容﹕ begin qyDetail.First; While Not qyDetail.Eof do begin cds.Append; cds.FieldByName('PO_NO').AsString:=qyDetail.FieldByName ('PO_NO').AsString; cds.FieldByName('ITEM_NO').AsString:=qyDetail.FieldByName ('ITEM_NO').AsString; cds.FieldByName('ITEM_NAME').AsDateTime:= qyDetail.FieldByName('ITEM_NAME').AsDateTime; cds.Post; qyDetail.Next; end; end;} end;========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟 |
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
T.J.B
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
加入紅色的字段試試看
qyDetail.First; While Not qyDetail.Eof do begin pono := qyDetail.FieldByName('PO_NO').AsString; itemno := qyDetail.FieldByName('ITEM_NO').AsString; if not cds.Locate('po_no;item_no',VarArrayOf([pono,itemno]),[]) then begin cds.Append; cds.FieldByName('PO_NO').AsString:=qyDetail.FieldByName ('PO_NO').AsString; cds.FieldByName('ITEM_NO').AsString:=qyDetail.FieldByName ('ITEM_NO').AsString; cds.FieldByName('ITEM_NAME').AsDateTime:= qyDetail.FieldByName('ITEM_NAME').AsDateTime; cds.Post; end; qyDetail.Next; end;天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2004/12/17 17:28:41
------
天行健 君子當自強不息~~@.@ |
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
Elaine1981
一般會員 ![]() ![]() 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 截取範例﹐在ADOTable的BeforeDelete事件中記錄當前刪除資料的鍵值﹐在ADOTable的AfterDelete事件中使用ADOQuery元件的SQL指令來刪除Detail資料表的對應明細資料﹒
var Form1: TForm1; I : Integer; implementation procedure TForm1.ADOTable1BeforeDelete(DataSet: TDataSet); begin I := ADOTable1.Fields.Fields[0].Value; end; procedure TForm1.ADOTable1AfterDelete(DataSet: TDataSet); Var MyCount : Integer; begin Form2.ADOQuery1.Close; Form2.ADOQuery1.SQL.Clear; Form2.ADOQuery1.SQL.Add('Delete From [訂貨明細] Where '); Form2.ADOQuery1.SQL.Add('訂單號碼=:OrderNo'); Form2.ADOQuery1.Parameters.ParamByName('OrderNo').Value := I; Form2.ADOQuery1.ExecSQL; MyCount := Form2.ADOQuery1.RowsAffected; ShowMessage('訂貨明細檔中有' IntToStr(MyCount) '筆資料已被同步刪除'); Form2.ADOTable1.Close; Form2.ADOTable1.Open; end;========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |