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

請教SQL語法部分不會立即更新的問題

尚未結案
cashxin2002
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-22 18:28:43 IP:63.84.xxx.xxx 未訂閱
請教各位前輩﹒    小弟程式碼如下﹐使用SQL的Update語法來根据使用的輸入再計算其它欄位值﹐但很奇怪的是標注紅色處(利用if..else來判斷ParamByName變數值)就不會立即更新﹐而需要再重新Edit該筆記錄一次﹐然后再次Post﹐才會真正計算出欄位值﹐但其它的欄位計算時都不會有這樣的現象﹐同樣是寫在ADOTable元件的AfterPost事件之后﹐一触發Post后﹐即可計算出結果﹐請問是何原因﹖
procedure TForm7.ADOTable3AfterPost(DataSet: TDataSet);
Var
 AmountRemark : Variant;
begin
  IDRemark := ADOTable3.FieldByName('Idno').AsString;
  ADOQuery3.Close;
  ADOQuery3.SQL.Text := 'Update TableName3 Set Total_Amount= '
      'First_Amount   Second_Amount   Non_Leave_Pay   Sanitary_Pay '
      'Where Idno=''' IDRemark '''';
  ADOQuery3.SQL.Text := StringReplace(ADOQuery3.SQL.Text, 'TableName3', ADOTable3.TableName, [rfReplaceAll, rfIgnoreCase]);
  ADOQuery3.ExecSQL;      ADOQuery3.Close;
  ADOQuery3.SQL.Text := 'Update TableName3 c, Employee a Set c.Medical_Insurance= '
      'Round(Total_Amount / 100 * 4.5) Where a.Medical_Insurance=''Yes'' and '
      'c.Idno=a.Idno and c.Idno=''' IDRemark '''';
  ADOQuery3.SQL.Text := StringReplace(ADOQuery3.SQL.Text, 'TableName3', ADOTable3.TableName, [rfReplaceAll, rfIgnoreCase]);
  ADOQuery3.ExecSQL;      AmountRemark := ADOTable3.FieldByName('Total_Amount').AsVariant -
    ADOTable3.FieldByName('Medical_Insurance').AsVariant;
  ADOQuery3.Close;
  ADOQuery3.SQL.Text := 'Update TableName3 Set Income_Tax= :Tax Where Idno=''' IDRemark '''';
  ADOQuery3.SQL.Text := StringReplace(ADOQuery3.SQL.Text, 'TableName3', ADOTable3.TableName, [rfReplaceAll, rfIgnoreCase]);
  if AmountRemark <= 200000 then
    begin
      ADOQuery3.Parameters.ParamByName('Tax').Value := 0;
    end
  else
  if (AmountRemark > 200000) and (AmountRemark <= 700000) then
    begin
      ADOQuery3.Parameters.ParamByName('Tax').Value := Round((AmountRemark - 200000) / 100 * 5);
    end
  else
  if (AmountRemark > 700000) and (AmountRemark <= 1900000) then
    begin
      ADOQuery3.Parameters.ParamByName('Tax').Value := Round((AmountRemark - 700000) / 100 * 10)
          25000;
    end
  else
  if (AmountRemark > 1900000) and (AmountRemark <= 3700000) then
    begin
      ADOQuery3.Parameters.ParamByName('Tax').Value := Round((AmountRemark - 1900000) / 100 * 15)
          120000   25000;
    end
  else
  if (AmountRemark > 3700000) and (AmountRemark <= 5900000) then
    begin
      ADOQuery3.Parameters.ParamByName('Tax').Value := Round((AmountRemark - 3700000) / 100 * 20)
          270000   120000   25000;
    end;
  ADOQuery3.ExecSQL;      ADOQuery3.Close;
  ADOQuery3.SQL.Text := 'Update TableName3 Set Total_Receive= '
      'Total_Amount - Medical_Insurance - Income_Tax Where '
      'Idno=''' IDRemark '''';
  ADOQuery3.SQL.Text := StringReplace(ADOQuery3.SQL.Text, 'TableName3', ADOTable3.TableName, [rfReplaceAll, rfIgnoreCase]);
  ADOQuery3.ExecSQL;      ADOTable3.Close;
  ADOTable3.Open;
  ADOTable3.Locate('Idno', IDRemark, []);
  ADOTable3.Next;
  DBGrid3.SelectedIndex := 0;
end;
===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
cashxin2002
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-24 13:01:29 IP:63.84.xxx.xxx 未訂閱
找出問題所在, 可在紅色部分之前先加上對應的ADOTable元件Close&Open的方法, 然后再執行ExecSQL就可即時更新.    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
sun_chih_yen
一般會員


發表:40
回覆:33
積分:13
註冊:2003-10-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-24 13:20:28 IP:211.74.xxx.xxx 未訂閱
請問 ADOQuery3.ExecSQL; 這一句是什麼意思???我好像都常看到.....
系統時間:2024-06-22 18:46:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!