請教資料表真實欄位計算的處理事件 |
尚未結案
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
請教各位前輩. 當處理資料表計算欄位(虛擬欄位)時, 我們可將程式碼寫在OnCalcFields事件中, 但如果需要做計算的欄位的真實欄位, 該把計算的程式碼放在何處呢? 目前小弟是將其放在一個Button元件的OnClieck事件中, 可否放在ADOTable元件之事件中呢? 曾試過加在ADOTable元件的AfterPost事件中, 但后來發現, 因為程式碼中也有一個ADOTable.Post;的存入方法語句, 所以這樣寫會造成循環触發的現象, 勞煩各位前輩指點! 謝謝! =====================
努力,相信會獲得美麗!
忻晟
------
忻晟 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
cashxin2002 你好 : 可以放在 Dataset.BeforePost Event 如 :
procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin Table1SubTotal.Value := Table1Item1.Value Table1Item2.Value; end;另外, 可以考慮用 Database 的 Trigger 機制(好處是任何的異動, 都能維持計算規則) 如用 AfterPost, 可直接下 "Update ..." SQL, 壞處是需要重新 Open DataSet 並 Locate 到原紀錄. |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
感謝Mickey版主大人的回應. 小弟現在將相關計算的程式碼寫在ADOTable元件的AfterPost事件中, 利用SQL語法的Update來更新資料內容, 但目前出現形態錯誤的問題, 勞煩各位前輩幫我看看是哪里出錯了? 出錯信息為Invalid Variant Type Conversion.
procedure TForm7.ADOTable1AfterPost(DataSet: TDataSet); Var IDRemark, OldSQL : String; HourRemark : Variant; begin IDRemark := ADOTable1.FieldByName('Idno').AsString; if Not ADOTable1.FieldByName('O_OT_Hours').AsVariant > 15.0 then begin OldSQL := 'Update TableName Set Salary_Money=Round(Salary_Month / 26 * Work_Days) and ' 'Salary_Money_H=Round(Salary_Month / 26 / 8) and ' 'O_OT_Money=Round(Salary_Month / 26 / 8 * O_OT_Hours * 1.5) and ' 'H_OT_Money=Round(Salary_Month / 26 / 8 * H_OT_Hours * 2.5) and ' 'Meal=Round(Work_Days * 2000) and ' 'Total_Amount=Round(Salary_Month / 26 * Work_Days) ' ' Round(Salary_Month / 26 / 8 * O_OT_Hours * 1.5) ' ' Round(Salary_Month / 26 / 8 * H_OT_Hours * 2.5) ' ' Round(Work_Days * 2000) ' ' Bonus Where Idno=''' IDRemark ''''; ADOQuery1.Close; ADOQuery1.SQL.Text := StringReplace(OldSQL, 'TableName', ADOTable1.TableName, [rfReplaceAll, rfIgnoreCase]); end else begin HourRemark := ADOTable1.FieldByName('O_OT_Hours').AsVariant - 15.0; OldSQL := 'Update TableName Set Salary_Money=Round(Salary_Month / 26 * Work_Days) and ' 'Salary_Money_H=Round(Salary_Month / 26 / 8) and ' 'O_OT_Money=Round(Salary_Month / 26 / 8 * 15.0 * 1.5) and ' 'H_OT_Money=Round(Salary_Month / 26 / 8 * H_OT_Hours * 2.5) and ' 'Meal=Round(Work_Days * 2000) and ' 'Bonus=Bonus Round(Salary_Month / 26 / 8 * ''' HourRemark ''' * 2.5) and ' 'Total_Amount=Round(Salary_Month / 26 * Work_Days) ' ' Round(Salary_Month / 26 / 8 * 15.0 * 1.5) ' ' Round(Salary_Month / 26 / 8 * H_OT_Hours * 2.5) ' ' Round(Work_Days * 2000) ' ' Bonus Round(Salary_Month / 26 / 8 * ''' HourRemark ''' * 2.5) Where Idno=''' IDRemark ''''; ADOQuery1.Close; ADOQuery1.SQL.Text := StringReplace(OldSQL, 'TableName', ADOTable1.TableName, [rfReplaceAll, rfIgnoreCase]); end; ADOQuery1.ExecSQL; ADOTable1.Close; ADOTable1.Open; DBGrid1.SelectedIndex := 0; end;使用Access資料庫形態 Idno欄位是字串形態. Salary_Month, Salary_Money, Salary_Money_H, O_OT_Money, H_OT_Money, Meal, Bonus, Total_Amount是無小數之貨幣形態. Work_Days, O_OT_Hour, H_OT_Hour是一位小數的Integer形態. 勞煩各位前輩了! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
感謝Mickey版主大人﹒ 不是在ADOQuery1.ExecSQL時出現的錯誤﹒
錯誤指針指向這一句﹕
OldSQL := 'Update TableName Set Salary_Money=Round(Salary_Month / 26 * Work_Days) and ' 不過﹐現在小弟將資料表的欄位形態稍更改了一下﹐將貨幣欄位形態全部改為數字類的雙精准數﹐此形態錯誤已經不再出現﹐所以小弟先此問題結案了﹒但在執行ADOQuery1.ExecSQL時資料表似乎沒有反應﹐請見小弟另一提問連接﹕
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39201 謝謝﹗ =====================
努力,相信會獲得美麗!
忻晟 發表人 - cashxin2002 於 2003/10/20 09:30:58
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |