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

ADO QUERY 批次更新問題-主子明細檢查

答題得分者是:bestlong
g9221712
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-16 13:19:23 IP:220.134.xxx.xxx 訂閱

各位前輩:

目前我欲開發主子明細的表單輸入,由於採用ltBatchOptimistic模式,讓我真是頭大!
想請教
1.ltBatchOptimistic如何鎖住紀錄不讓其他使用者編輯,不知如何判別有人在編輯狀態!
2.由於我在子TABLE的細項中有"項次"這個欄為,需要取得項次的順序,因為列印時需要依照打的順序列出
且同一商品可能打兩次,因為單價可能不同(一為一般單價、一為贈品),所以項次順序由於在未更新前的批次狀態
取得的項次編號都會相同,我在想是否開啟表單前先將"最大項次"捉入成一個變數,然後由變數代入,不過不知道是 否為正確作法。
3.檢查庫存的問題,其實這個問題跟第二個問題類似,由於需要於輸入時強迫檢查,若無庫存不可以出貨,但是由於批次更新的模式,需要更新時才會更新庫存,不知道有無方法檢查庫存數。

4.表單的修改問題,由於表單會有修改狀態,就是輸入完若發現有錯誤,會進入修改,目前的想法是想說進入前先將庫存內的數量,若是單據別為出貨,則將原本扣除的數量加回,若是進貨則將庫存數量減去,等使用者完成修改後,再一次,增加或減少庫存,不知道這樣的作法是否正確,或者不知道有無更好的作法!

救人喔!真是想破頭了!

============================================================================
Access就像毒品,簡單的讓你上癮,卻不一定解決你所有的問題!
Delphi就像解毒針,效果很強,但是你卻必須挨上刺進心臟的那種痛苦! 唉!
============================================================================

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


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-19 15:13:06 IP:60.248.xxx.xxx 未訂閱

1.ltBatchOptimistic如何鎖住紀錄不讓其他使用者編輯,不知如何判別有人在編輯狀態!

批次更新的處理架構就是在 Client 端建立一個緩衝區保存快取資料。而用戶端對資料的所有異動都是保存在緩衝區,直到 UpdateBatch 後才真正更新到資料庫。

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


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-19 16:58:19 IP:220.134.xxx.xxx 訂閱

那怎麼對這塊記憶體區域,作資料的檢查或加總計算? 因為我寫了一個函數,去加總子單據項目內的金額,

但是由於資料尚未寫到實際的資料庫內,所以我不管怎麼捉都捉不到記錄!我怎麼加總緩衝區內的紀錄呢?

怎麼操作這個暫存的Recordset 內的紀錄?

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


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-07-19 17:25:21 IP:60.248.xxx.xxx 未訂閱

因為修改的資料都是在 Client 的緩衝區,所以就直接計算 Detail DataSet 的資料。程式碼大致如下:

[code]
procedure TfrmMasterDetail.qy_dAfterPost(DataSet: TDataSet);
begin
inherited;
// 主檔要為編輯模式時, 才可以執行 CalcAmount 這個虛擬方法並把結果回饋到主檔
if qy_m.State = dsEdit then
CalcAmount;
end;

procedure TfrmMasterDetail.CalcAmount;
var
i: integer;
begin
// 明細異動更新主檔的統計欄位
qy_d.DisableControls;
qy_d.First;
while not qy_d.Eof do
begin
i := i qt_d.FieldByName('IntegerField').AsInteger;
qy_d.Next;
end;
qy_d.EnableControls;
end;
[/code]

------
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-20 13:57:18 IP:220.134.xxx.xxx 訂閱

感謝您不嫌厭煩的回應:

我改寫自己的計算,不過第一次計算會正確,但是若更改數量內容後,又按下計算則數量又會不正確
不知道我是否哪裡觀念錯誤,之前我一直宣告另外一個ADOQUERY去捉原始DB內的表身資料表,所以
都捉出不正確值,經過前輩您的提醒已經OK,不過不知道現在問題出在哪!DEBUG無效啊!

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: Integer;
sum: Integer;
begin
if ADOQuery2.Eof then
begin
// 沒有子項次
ShowMessage('無法計算');
end
else
begin
計算數量
sum := 0;
ADOQuery2.Recordset.MoveFirst;
for i := 1 to ADOQuery2.Recordset.RecordCount do
begin
sum := sum ADOQuery2['數量'];
ADOQuery2.Recordset.MoveNext;
end;
ShowMessage(IntToStr(sum));
end;
end;

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


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-07-22 01:24:16 IP:140.125.xxx.xxx 訂閱

原來我下錯ADOQUERY語法:
正確語法為 Self.ADOQuery2.First;
Self.ADOQuery2.Next;
Self.ADOQuery2.Prior;
Self.ADOQuery2.Last;

不過我正另外的想法是,不是針對ADOQuery2的RECODSET操作?怎麼我的語法會錯?

唉!VB用太久中毒了!

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