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

請問有關Master/Detail的問題

尚未結案
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-17 13:47:05 IP:220.130.xxx.xxx 未訂閱
請問一下,我現在要用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-17 14:11:16 IP:202.62.xxx.xxx 未訂閱
您好﹗    您是從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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-17 14:40:59 IP:220.130.xxx.xxx 未訂閱
我改成你的寫法之後,結果執行的時候就停住了,過了好久才出現錯誤訊息:「Project1.exe raised exception class EOleException with message'無法指出的錯誤'」、「Project1.exe raised exception class EOleException with message '被開啟的物件'」請問到底要怎麼改呢?謝謝!^^
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-17 15:00:11 IP:202.62.xxx.xxx 未訂閱
您好﹗    請問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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-17 15:28:05 IP:220.130.xxx.xxx 未訂閱
有啊,我的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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-17 15:58:01 IP:202.62.xxx.xxx 未訂閱
您好﹗
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-17 16:18:49 IP:220.130.xxx.xxx 未訂閱
這跟你在第二篇發表的意思一樣呀,我照著改之後還是發生同樣的情形,^^
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-17 17:25:30 IP:211.75.xxx.xxx 未訂閱
加入紅色的字段試試看
  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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-18 10:29:13 IP:220.130.xxx.xxx 未訂閱
不行耶…還是一樣會停很久然後出現錯誤訊息,請問做master/detail有什麼比較好的方法嗎?因為我最主要的問題是在新增一個全新的主檔的時候,它的訂購單號編碼方式是年月日加序號,也就是在存入資料庫的時候才給的,可是這樣的話,新增明細的時候它並沒有訂購單號,這時就會產生錯誤,所以我才想說新增明細時,先存在ClientDataSet之後,等使用者按確定時,再把主檔跟明細一起存入資料庫,請問還有什麼其他比較好的方法嗎?謝謝!^^
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-18 11:58:10 IP:202.62.xxx.xxx 未訂閱
您好﹗    從您的描述來看﹐新增主檔的訂購單編號賦值的程式碼可能是寫在資料集元件的BeforePost事件中﹐您可稍做修改﹐在新增一個全新的主檔的時候,將此訂購單號編碼賦值的程式碼加入在資料集元件的AfterInsert事件中﹐然后在BeforePost的時候再將此訂購單編輯賦值給明細檔﹒    ========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-18 17:32:29 IP:211.74.xxx.xxx 未訂閱
sorry!我不太懂你的意思耶…而且我沒有用過BeforePost和AfterInsert這兩個事件,你能用NorthWind這個資料庫做個簡單的範例給我看嗎?謝謝!^^
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-18 17:52:06 IP:202.62.xxx.xxx 未訂閱
引言: sorry!我不太懂你的意思耶…而且我沒有用過BeforePost和AfterInsert這兩個事件,你能用NorthWind這個資料庫做個簡單的範例給我看嗎?謝謝!^^
請問用NorthWind這個資料庫做何種功能的範例﹖稍做描述﹐會比較容易切題﹒ 另外請告之Email Address﹒ ========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-18 18:00:47 IP:211.74.xxx.xxx 未訂閱
就是用Northwind資料庫裡的Orders和Order Details做Master/Detail的新增、修改、刪除、查詢的功能…
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-12-20 09:13:03 IP:202.62.xxx.xxx 未訂閱
您好﹗    周六已完成範例并上傳﹐請根据Mail給您的連結下載﹐資料庫檔案路徑為預設的NorthWind資料庫所在路徑(C:\Program Files\Microsoft Office\Office\Sample)﹒    ========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-21 11:06:47 IP:220.130.xxx.xxx 未訂閱
sorry!我沒有看你做的範例,我還是用TClientDataSet做,但是我現在遇到了問題,就是我按刪除的時候,程式裡是先刪除明細資料,再刪除主檔資料,可是出現了錯誤訊息:「更新或重整所需索引鍵資料行資訊不足」我也有設主索引鍵,可是還是一樣,請問要怎麼解決呢?謝謝! 不好意思,還讓你白做範例,總之還是感謝你…^^
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-12-21 11:40:18 IP:202.62.xxx.xxx 未訂閱
您好﹗    截取範例﹐在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;
========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
系統時間:2024-11-22 16:47:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!