问题描述:
【1】目前界面中有四个个TEdit:edtPO,edtStep1,edtStep2,edtStep3,
     access数据库中有表T_PO,中间包含有四个字段:生产任务单,工序一,工序二,工序三,
     运行程序后,在edtPO中输入生产任务单,在三个edit中输入三个数字,
     点击btnUpdate之后,希望能根据PO,将三个edit中的数字分
     别对应加到原字段的数值中,即最后的字段值为:工序一 = 工序一 + strtoint(edtStep1.text),
                                                 工序二 = 工序二 + strtoint(edtStep2.text),
                                                 工序三 = 工序三 + strtoint(edtStep3.text)
     我写成这样,不对:
    
    procedure TQueryForm.btnUpdateClick(Sender: TObject);
    
    VAR first,second,third : integer;         //设定工序一,工序二,工序三的更新数量(从edit里取)
     //VAR str1,str2 : string;
   begin
     first := strtoint(edtStep1.Text);
     second := strtoint(edtStep2.Text );
     third := strtoint(edtStep3.Text );     with datamd.adoQryUpdate do
      begin
        close;
         sql.Clear ;
         SQL.Text :='update T_PO SET 工序一 = 工序一 +'+ first +', 工序二 = 工序二 +'+ second+',工序三 = 工序三 + '+ third +'where 生产任务单 =D99994 ' ;  //测试先假定生产任务单为D99994
         execsql;   end;
end;请问该怎么改呢?我不知道怎么在原来字段值的基础上加上edit中的数值.问题【2】另开一问好了。
在此先鞠躬感谢各位关注的人,谢谢每一个回答的人.

解决方案 »

  1.   


    SQL.Text :='update T_PO SET 工序一 = 工序一 +'+ IntToStr(first) +
               ', 工序二 = 工序二 +'+ IntToStr(second)+
               ',工序三 = 工序三 + '+ IntToStr(third) +
               ' where 生产任务单 =D99994' ;
      

  2.   

    bdmh,您好,
    我按您给的提示修改之后,不能编绎:
    错误为:There is no overload version of 'IntToStr' that can be called with these arguments
    因为我看你的sql语句中改成intToStr,把first,second,third又转回str了,所以我就干脆把sql改成: SQL.Text :='update T_PO SET 工序一 = 工序一 +'+ trim(edtStep1.Text) +
              ', 工序二 = 工序二 +'+ trim(edtStep2.Text) +
              ',工序三 = 工序三 + '+ trim(edtStep3.Text) +
              ' where 生产任务单 =D99994' ;这样就能编绎了,但是点btnUpdate时,跳出Debugger Exception Notification错误:
    Project Project1.exe raised exception class EConvertError with message "'is not a valid integer value'.Process stopped. Use Step or Run to continue.看起来不能用string型 去累加,
    请问各位,SQL该怎么修改呢
      

  3.   

    bdmh 用string来连接字符串是对的,你刚开始用Integer类型来拼接SQL字符串是不正确的,其次看你的意思,工序一等字段应该是数字类型的,你可以先把SQL放到Access的查询里面试一下,先把SQL语句调试正确然后再调试程序,这样能快点找到问题。
      

  4.   

    谢谢,确实你理解的那样,我的工序一、二、三都是长整型,
    比如原来分别是100,100,100,我在三个edit里都写100,100,100后,点btnUpdate之后,希望数据库里字段值能变成200,200,200,
    我想的是数值相加,可能是没表述清楚,让bdmh兄误会成字符串连接了。
    像这样的话,应该怎么写SQL语句?
      

  5.   

    直接加减:
    Update A set a=a+10 where b=1
      

  6.   

    "'is not a valid integer value
    空格不是一个有效的数字
    查看edit是否有空值
      

  7.   

    谢谢,确实直接加减是可以,可是,我不知道该怎么去把edtStep1/2/3里的数值给取出来,
    请您看看我提问时的那段代码,那样写有错吗?我用三个变量去取值了,strToInt(edtStep1.text)
      

  8.   

    为什么不直接用numericedit 控件呢?
    所有edit.text的后续操作,最好都去空格,strtoint(trim(edit.text))
      

  9.   

    update T_PO SET 工序一 = 工序一 +convert(int,'+ first +') where 生产任务单 =D99994提供个测试代码,强制转换,看看,是否正确赋值了。
      

  10.   

    请问numericedit 控件在哪里能找到?
      

  11.   

    程序执行sql报错,最好在执行前先打出组合完毕的sql(写到日志也可,赋值到一个Tmemo.lines.text也可)
    看看它能否粘贴到查询分析器执行
      

  12.   

    谢谢你的回答,上个问题也是在你的帮助下解决的。
    这次组合出来的语句没有问题。
    我换了一个解决思路:
    先把四个edit的值插入到另一表T_UpdateTemp里,然后再通过查询语句把它汇总查询出来,现在差不多可以说功能实现了一半(能够实现累加,但是不能马上更新显示,要关闭程序,下一次打开才能把累加的值更新出来),代码如下:procedure TQueryForm.btnUpdateClick(Sender: TObject);begin
        //在执行此段代码之前,datamd.adoQryUpdate.sql.text := SQL语句一(如下注释)
       with datamd.adoQryUpdate do
       begin
          close;
          sql.Clear ;
            //第一步:将四个edit数据存入临时表
            SQL.Text:= 'INSERT INTO T_UpdateTemp VALUES(:a,:b,:c,:d)' ;        parameters.ParamByName('a').Value := Trim(DBEdit52.Text );
            parameters.ParamByName('b').Value := Trim(edtBySpecStep1.Text );
            parameters.ParamByName('c').Value := Trim(edtBySpecStep2.Text );
            parameters.ParamByName('d').Value := Trim(edtBySpecStep3.Text );
            execsql;        close;
            sql.Clear ;    //下面为SQL语句一 (第二步:以生产任务单号为依据汇总历次更新数值)
            SQL.Text:='SELECT T_PO.生产任务单, T_PO.部门, T_PO.物料代码, T_PO.规格型号, T_PO.批量, T_PO.开单日期, T_PO.预计入库日期, ' ;
            SQL.Text:= SQL.Text + ' Sum(T_UpdateTemp.工序一) AS 工序一, Sum(T_UpdateTemp.工序二) AS 工序二, Sum(T_UpdateTemp.工序三) AS 工序三, ';
            SQL.Text:= SQL.Text + ' Last(T_PO.已入库数量) AS 已入库数量, Last(T_PO.待入库数量) AS 待入库数量, Last(T_PO.是否结单) AS 是否结单, T_PO.备注 AS 备注 ';
            SQL.Text:= SQL.Text + ' FROM T_PO  LEFT JOIN T_UpdateTemp  ON T_PO.生产任务单 = T_UpdateTemp.生产任务单 ';
            SQL.Text:= SQL.Text + ' GROUP BY T_PO.生产任务单, T_PO.部门, T_PO.物料代码, T_PO.规格型号, T_PO.批量, T_PO.开单日期, T_PO.预计入库日期, T_PO.备注 ';
           execsql;
       end;
    end;
    怎么才能实现:一点btnUpdate 按钮就立刻显示新的结果呢?用DBGrid的导航条上的Refresh 不行,一定要关闭程序重新开才能出现新结果
      

  13.   

    假设你的数据表直接就绑的T_updatetemp
    execsql 后增加
    close;
    sql.clear;
    sql.add('select * from T_updatetemp ')
    open;目的,手动刷新数据表。PS:我从来不用refresh的,rrefresh 只刷新缓存区,一般来说,只有直接在dbgrid 里面插入,修改,删除或其它操作的数据,用refresh 才会更新,而直接用execsql的数据库操作,用此方法都无法显示的。只能用查询语句重新取数。如果你有很多此类操作,可以写一个公共过程,比方:procedure TXX.refreshdg,然后有需要操作的地方,直接调用此过程就好了。
      

  14.   

    你可以在adoquery的before post 事件写相对应的代码