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

函數傳遞ADOQUERY的問題

缺席
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-22 06:12:34 IP:140.125.xxx.xxx 訂閱

我在表單上拉了兩個ADOQUERY物件,欲撰寫一個單據的輸入介面,ADOQUERY1為表頭,ADOQUERY2為表身,

我寫了一個函數,想要再使用者按下新增表單子項目時,計算出目前子表單,已經輸入幾項物品(因為KEY值關係)

要讓使用者同一編號編號輸入(兩次)所以一定要加入,"子單項次'"這個欄位,但是發現當我使用下方這個函數取得

子項次時,第一次會捉取OK,第二次為取得時並POST時,會出現ADOQUERY2並非在編輯狀態或新增狀態,
但是我明明有下達ADOQUERY2.APPEND指令也有ADOQUERY2.POST但是不知道為何失敗,後來以手動方式輸入
以人工計算的項次,其實是OK的也就是我下方的函數有錯誤,但一直找不到錯誤,請各位前輩幫忙解答一下。
Self.ADOQuery2.Append;
Self.ADOQuery2.Fields[0].Value := Self.D1.Text; // 單據號碼
Self.ADOQuery2.Fields[1].Value := (Get_MaxBodyItem(ADOQuery2));
Self.ADOQuery2.Post;

function TForm1.Get_MaxBodyItem(rs: TADOQuery): Integer;
var
i: Integer;
Max: Integer;
bm: TBookmark;
begin
Max := 0;
if rs.Recordset.RecordCount = 0 then
begin
// 沒有子項次
Result := 1;
end
else
begin
bm := rs.GetBookmark;
rs.First;
for i := 1 to rs.Recordset.RecordCount do
begin
if not Isnull(rs['子單項次']) then
begin
if rs['子單項次'] > max then
begin
max := rs['子單項次'] 1;
end;
end;
rs.Next;
end;
rs.GotoBookmark(bm);
rs.FreeBookmark(bm);
Result := max;
end;
end;

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-22 21:57:29 IP:220.134.xxx.xxx 訂閱

找到錯誤了!原來我傳入的RS物件變數,會關連到原來的物件,也就是我下達移動記錄對傳入的物件時,
原始物件也會跟著移動,現在不知道要怎麼傳入ADOQUERY物件,但是不影響原來的ADOQUERY物件,

不知道要怎麼設計這個函數,請大家幫幫,感謝!

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
cschen99
一般會員


發表:3
回覆:6
積分:6
註冊:2005-08-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-23 22:34:02 IP:59.115.xxx.xxx 未訂閱

===================引 用 文 章===================

我在表單上拉了兩個ADOQUERY物件,欲撰寫一個單據的輸入介面,ADOQUERY1為表頭,ADOQUERY2為表身,

我寫了一個函數,想要再使用者按下新增表單子項目時,計算出目前子表單,已經輸入幾項物品(因為KEY值關係)

要讓使用者同一編號編號輸入(兩次)所以一定要加入,"子單項次'"這個欄位,但是發現當我使用下方這個函數取得

子項次時,第一次會捉取OK,第二次為取得時並POST時,會出現ADOQUERY2並非在編輯狀態或新增狀態,
但是我明明有下達ADOQUERY2.APPEND指令也有ADOQUERY2.POST但是不知道為何失敗,後來以手動方式輸入
以人工計算的項次,其實是OK的也就是我下方的函數有錯誤,但一直找不到錯誤,請各位前輩幫忙解答一下。
Self.ADOQuery2.Append;
Self.ADOQuery2.Fields[0].Value := Self.D1.Text; // 單據號碼
Self.ADOQuery2.Fields[1].Value := (Get_MaxBodyItem(ADOQuery2));

======================================================

改成 Self.ADOQuery2.Fields[1].Value := adoquery2.recordcount;

不過,這樣會不準,基本上,你應該是把adoquery2的比數紀錄在adoquery1才對吧!

Self.ADOQuery2.Post;

bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-07-24 09:18:34 IP:60.248.xxx.xxx 未訂閱

這樣的處理模式會有問題,用即時計算明細筆數來做項目編號又同時當作主鍵的一部份。

給你一個狀況推演

1. 新增第一筆,項次編號帶入 1
2. 新增第二筆,項次編號帶入 2
3. 新增第三筆,項次編號帶入 3
4. 刪除項次 1 的,此時明細資料筆數為 2 筆
5. 再新增一筆,項次編號帶入 3 儲存時出現錯誤,因為項次編號 3 已存在

------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-07-24 09:57:17 IP:220.134.xxx.xxx 訂閱

感謝您的回覆:

我已經找傳入recoredset方法,寫一個函數取得項次。

function TForm1.Get_MaxBodyItem(rs_TEMP: TADOQuery): Integer;
var
i: Integer;
Max: Integer;
bm: TBookmark;
rs: TADOQuery;
begin
rs := TAdoQuery.Create(self);
rs.Recordset := rs_TEMP.Recordset._xClone;
Max := 0;
if rs.Recordset.RecordCount = 0 then
begin
// 沒有子單據項次
rs.FreeBookmark(bm);
Result := 1;
end
else
begin
// bm := rs.GetBookmark;
rs.First;
for i := 1 to rs.Recordset.RecordCount do
begin
if not Isnull(rs.Fields[1].Value) then
begin
if rs.Fields[1].Value >= max then
begin
max := rs.Fields[1].Value 1;
end;
end;
rs.Next;
end;
// rs.GotoBookmark(bm);
// rs.FreeBookmark(bm);
rs.Free;
Result := max;
end;
end;

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-07-24 09:57:31 IP:220.134.xxx.xxx 訂閱

感謝您的回覆:

我已經找傳入recoredset方法,寫一個函數取得項次。

function TForm1.Get_MaxBodyItem(rs_TEMP: TADOQuery): Integer;
var
i: Integer;
Max: Integer;
bm: TBookmark;
rs: TADOQuery;
begin
rs := TAdoQuery.Create(self);
rs.Recordset := rs_TEMP.Recordset._xClone;
Max := 0;
if rs.Recordset.RecordCount = 0 then
begin
// 沒有子單據項次
rs.FreeBookmark(bm);
Result := 1;
end
else
begin
// bm := rs.GetBookmark;
rs.First;
for i := 1 to rs.Recordset.RecordCount do
begin
if not Isnull(rs.Fields[1].Value) then
begin
if rs.Fields[1].Value >= max then
begin
max := rs.Fields[1].Value 1;
end;
end;
rs.Next;
end;
// rs.GotoBookmark(bm);
// rs.FreeBookmark(bm);
rs.Free;
Result := max;
end;
end;

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2024-05-19 2:35:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!