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

我設的關聯有錯誤 請大大指正

尚未結案
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-08 01:21:24 IP:211.76.xxx.xxx 未訂閱
我想做一個有關進貨單的管理 我的做法是這樣: 表單form1上有 ADOTable1 --> DataSource1 ADOTable2 --> DataSource2 ADOQuery1 --> DataSource3 & ADOTable3 DBGrid1 --> DataSource3    ADOTable1 和 ADOTable2 是關聯兩個資料表(進貨主表和進貨明細表) ADOQuery1 是想在 DBGrid1 中輸入"商品編號"可以帶出商品的資料 且可以一直在 DBGrid1 中一直新增 可是執行時出現這樣的錯誤訊息: Project HFUPOS.exe raised exception class EOleException with message 'primarykey' 違反條件約束 'PK_goods'  無法在物件 'goods' 上插入重複索引鍵     我知道是 ADOTable2 --> DataSource2  ADOQuery1 --> DataSource3 & ADOTable3 DBGrid1 --> DataSource3 這之間的關聯錯了 可是我又不知道是要改哪 可否請各位大大指導我該如何修改 謝謝!!    
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-08 18:57:12 IP:61.221.xxx.xxx 未訂閱
papalili 你好: 應該是 DataSource1.dataset:=ADOTable1 ; DataSource2.dataset:=ADOTable2 ; DataSource3.dataset:=ADOTable3 ; DBGrid1.DataSource:=DataSource3; 至於ADOQuery1 ...不了解是做啥用
------
======================
昏睡~
不昏睡~
不由昏睡~
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-09 00:35:56 IP:211.76.xxx.xxx 未訂閱
謝謝大大 可是我的作法就像你所說的 可是還是不行啊 我是想利用ADOQuery1 & ADOTable3 和 DataSource3 可以帶出整筆商品資料 又 ADOTable1 和 ADOTable2 是用來找出兩個資料表的關連 使我在新增一筆新的進貨單時 可以把資料同時存回"進貨表"和"進貨明細表"裡 ADOQuery1 是用來在 DBGrid1 裡的其中一個欄位中可以輸入條碼 然後自動帶出商品的整筆資料 ADOQuery1 的SQL指令: select * from goods where 商品名稱 =:p1 procedure TPurchaseF.FormCreate(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.Parameters.ParamByName('p1').Value:= ''; ADOQuery1.Open; end; procedure TPurchaseF.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin IF ((Key = vk_RETURN) and (DBGrid1.SelectedIndex = 0)) THEN BEGIN ADOQuery1.Append; END; end;
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-09 08:45:53 IP:210.65.xxx.xxx 未訂閱
Hi:    你的 goods 檔,應該是料號主檔吧,ADOQuery1 的SQL指令應該是:    select * from 進貨明細表 where 商品名稱 =:p1     -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-09 12:48:27 IP:63.84.xxx.xxx 未訂閱
引言: ADOTable1 和 ADOTable2 是關聯兩個資料表(進貨主表和進貨明細表) ADOQuery1 是想在 DBGrid1 中輸入"商品編號"可以帶出商品的資料 且可以一直在 DBGrid1 中一直新增 可是執行時出現這樣的錯誤訊息: Project HFUPOS.exe raised exception class EOleException with message 'primarykey' 違反條件約束 'PK_goods' 無法在物件 'goods' 上插入重複索引鍵
您好﹗ 商品編號應是goods資料表中的鍵值欄位名(PK)吧﹐檢查看看新增時在此欄位是否有重新的值鍵入﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-10 01:26:48 IP:211.76.xxx.xxx 未訂閱
謝謝Fishman大大的回覆 可是我改過以後就出現這種錯誤的訊息 而cashxin2002大大說 我設成進貨單號為PK,新增的時候,資料不能輸入 所以不好意思麻煩各位大大
cashxin2002
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-10 09:04:11 IP:63.84.xxx.xxx 未訂閱
引言: 可是我改過以後就出現這種錯誤的訊息
//請檢查相關程式碼﹐因為資料表中并沒有存在國際條碼這個欄位﹐而相關程式碼中有此欄位名﹐故出錯
引言: 而cashxin2002大大說 我設成進貨單號為PK,新增的時候,資料不能輸入 所以不好意思麻煩各位大大
//小弟的意思是﹐在您新增的程式碼中是否有鍵入相同值的PK值﹐故出現PK值不能重复的錯誤﹐而不是更改PK值的鍵值欄位名 再試試看﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-11 03:09:16 IP:211.76.xxx.xxx 未訂閱
還是謝謝大大的教導 可是我試了另一個方法 執行時沒有bug 但就是不能輸入 我的元件現在拉成這樣 我按新增時會出現這個錯誤訊息 之後關掉就會再出現這個訊息指示 salenumber := IntToStr(ADOQuery3.Fields[0].AsInteger + 1); 可否請教大大們 這是啥的錯誤?? 我的程式碼寫成這樣 //ADOQuery1 是銷貨單的關連 //ADOQuery2 是商品基本資料的關連 //ADOQuery3 是從銷貨單上選擇銷貨單號的關連 procedure Tsell.ADOQuery1NewRecord(DataSet: TDataSet); begin //設定銷貨單的銷貨單號=form1上的銷貨單號 ADOQuery1sale_no.Value := salenumber; end; //輸入國際碼後就自動帶出商品資料 procedure Tsell.ADOQuery1EAN13Validate(Sender: TField); begin ADOQuery2.Close; ADOQuery2.Parameters[0].Value := ADOQuery1EAN13.Value; ADOQuery2.Open; if ADOQuery2.RecordCount > 0 then begin ADOQuery1goodsname.Value := ADOQuery2goodsname.Value; ADOQuery1price.Value := ADOQuery2price.Value; FLAG := true; end else ShowMessage('無此條碼!'); end; procedure Tsell.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if (key = #13) and (FLAG) then //判別國際碼&判別值 begin ADOQuery1.Post;//銷貨單存檔 ADOQuery1.Append;//新增下一筆 FLAG := false;//將判別值改為否 end; end; procedure Tsell.FormCreate(Sender: TObject); begin //設定一開始的判別值為否,表示無資料輸入 FLAG := false; end; procedure Tsell.Button1Click(Sender: TObject); begin ADOQuery3.Close; ADOQuery3.Open; if ADOQuery3.RecordCount > 0 then begin //銷貨單號自動加1 ADOQuery3.Last; //把銷貨單號移到最後一筆記錄 salenumber := IntToStr(ADOQuery3.Fields[0].AsInteger + 1); end else //否則銷貨單號從第一筆開始 salenumber := '1'; Edit1.Text := salenumber; ADOQuery1.Close; ADOQuery1.Parameters[0].Value := salenumber; ADOQuery1.Open; DBGrid1.Enabled := true; DBGrid1.SetFocus;//一執行就把焦點放在DBGrid end; end.
cashxin2002
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-11 09:29:06 IP:63.84.xxx.xxx 未訂閱
您好﹗    從您貼出的程式碼部分來看﹐似乎各個資料表的第一個欄位都是Integer形態的鍵值欄位﹐那樣的話﹐您在取出資料并將值賦予String形態變數時﹐如下﹕
begin //銷貨單號自動加1
  ADOQuery3.Last; //把銷貨單號移到最後一筆記錄
  salenumber := IntToStr(ADOQuery3.Fields[0].AsInteger   1);
end;
即會用到IntToStr函數做形態的轉換﹐同理﹐當您將String形態變數的資料存入資料表時﹐如果對應的欄位形態不同﹐也是需要先經轉換再存入﹐否則就會出現您上篇貼出的錯誤信息了﹐相對以上的程式碼﹐在存入的時候﹐就必須使用StrToInt的函數來做轉換了﹒比較可疑的所在﹕
Edit1.Text := salenumber;
ADOQuery1.Close;
ADOQuery1.Parameters[0].Value := StrToInt(salenumber);
salenumber是String形態變數﹐經Edit.text取得值﹐但相對應的Parameters[0]對應的形態是否也是String? 若不是﹐則需加上StrToInt函數﹒ 參考看看﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-12 02:11:29 IP:211.76.xxx.xxx 未訂閱
謝謝大大的指導 我試了你說的方法 可是還是不行 出現的錯誤是一樣的 所以我又檢查了一次資料庫的設定值 我是設字元沒錯啊 且ADOQuery1.Parameters[0].Value := salenumber; 所要的資料也是 string 而非 integer 是不是 ADOQuery3 的 Field 是要用 New field 而非 Add field 還有 ADOQuery1 和 ADOQuery2 也要用 New field 來建立欄位嗎
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-12 10:13:02 IP:61.221.xxx.xxx 未訂閱
papalili 你好: 你的觀念錯了! 1.當ADOTable的DataSource關聯到DBGrid   DBGrid 在delphi的預設值中只要更動某一個欄位就會引發一次異動(insert   或UPDATE)的動作,所以首先你要將ADOTable.AutoCalcFields的值設成false 2.當ADOQuery的DataSource關聯到DBGrid   其實他並不會幫你在DBGrid上輸入"商品編號"可以帶出商品的資料   這裡ADOQuery的角色並不用與DBGrid有任何關聯,只要在BGrid1ColEnter   裡面編寫   with ADOQuery do     begin     Close;     SQL.Clear;     SQL.Add('select 商品的資料 from goods where 商品編號='DBGrid.DBGrid.Fields[0].AsString);    end;   if ADOQuery.IsEmpty then ShowMessage('查無此商品');    else    begin     DBGrid.Columns.Grid.Fields[].AsString=ADOQuery.FieldByName('價錢').AsString;     ...     ..    end; 那使用者在DBGrid商品編號Col按下Enter就會去找資料了!! 不是用關聯他就會幫你做喔!! >
------
======================
昏睡~
不昏睡~
不由昏睡~
kakene
一般會員


發表:22
回覆:52
積分:19
註冊:2003-01-07

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-12 16:04:24 IP:203.204.xxx.xxx 未訂閱
引言: 還是謝謝大大的教導 可是我試了另一個方法 執行時沒有bug 但就是不能輸入 我的元件現在拉成這樣 我按新增時會出現這個錯誤訊息 之後關掉就會再出現這個訊息指示 salenumber := IntToStr(ADOQuery3.Fields[0].AsInteger + 1); 可否請教大大們 這是啥的錯誤??
看起來好像是按下新增時,ADOQuery3.Fields[0].AsInteger 是空字串,所以出現
'        ' is not a valid integer value 
空字串不是有效的數值, 請在該行下中斷點,查查該value 是否有值 salenumber := IntToStr(ADOQuery3.Fields[0].AsInteger + 1); 善用F7 & F8 發表人 - kakene 於 2003/12/12 16:14:51
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-12-16 01:18:36 IP:211.76.xxx.xxx 未訂閱
謝謝大大 我試過了 都沒問題 而且也沒BUG 可是一執行新增的時候 就有那個錯誤出來 所以不知道為什麼
kakene
一般會員


發表:22
回覆:52
積分:19
註冊:2003-01-07

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-12-16 09:38:48 IP:203.204.xxx.xxx 未訂閱
你好: 要不要把程式放上來看看
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-12-17 02:13:34 IP:211.76.xxx.xxx 未訂閱
謝謝大大們的教導 我在重作試試看 謝謝kakene的辛苦 所以我如果還有問題的話 請各位大大再來指導 謝謝
系統時間:2024-06-24 20:22:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!