線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:833
推到 Plurk!
推到 Facebook!

請教資料表真實欄位計算的處理事件

尚未結案
cashxin2002
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-19 16:11:56 IP:63.84.xxx.xxx 未訂閱
請教各位前輩.    當處理資料表計算欄位(虛擬欄位)時, 我們可將程式碼寫在OnCalcFields事件中, 但如果需要做計算的欄位的真實欄位, 該把計算的程式碼放在何處呢? 目前小弟是將其放在一個Button元件的OnClieck事件中, 可否放在ADOTable元件之事件中呢? 曾試過加在ADOTable元件的AfterPost事件中, 但后來發現, 因為程式碼中也有一個ADOTable.Post;的存入方法語句, 所以這樣寫會造成循環触發的現象, 勞煩各位前輩指點!    謝謝!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-19 17:42:49 IP:218.32.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-19 19:14:09 IP:63.84.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-20 09:14:51 IP:218.163.xxx.xxx 未訂閱
cashxin2002 你好 : Error 是 ADOQuery1.ExecSQL; 的時候出現的嗎 ? Access 我不熟... 不知 access 會不會像 MSSQL 等資料庫, 能"隱性"自動轉換.
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-20 09:23:43 IP:63.84.xxx.xxx 未訂閱
感謝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
------
忻晟
系統時間:2024-05-19 15:35:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!