我設的關聯有錯誤 請大大指正 |
尚未結案
|
papalili
一般會員 發表:28 回覆:31 積分:11 註冊:2003-09-02 發送簡訊給我 |
我想做一個有關進貨單的管理
我的做法是這樣:
表單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 發送簡訊給我 |
|
papalili
一般會員 發表:28 回覆:31 積分:11 註冊:2003-09-02 發送簡訊給我 |
謝謝大大
可是我的作法就像你所說的
可是還是不行啊
我是想利用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 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
papalili
一般會員 發表:28 回覆:31 積分:11 註冊:2003-09-02 發送簡訊給我 |
還是謝謝大大的教導
可是我試了另一個方法
執行時沒有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 發送簡訊給我 |
您好﹗ 從您貼出的程式碼部分來看﹐似乎各個資料表的第一個欄位都是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 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
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 發送簡訊給我 |
引言: 還是謝謝大大的教導 可是我試了另一個方法 執行時沒有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 發送簡訊給我 |
|
kakene
一般會員 發表:22 回覆:52 積分:19 註冊:2003-01-07 發送簡訊給我 |
|
papalili
一般會員 發表:28 回覆:31 積分:11 註冊:2003-09-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |