问题描述:
【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】目前界面中有四个个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】另开一问好了。
在此先鞠躬感谢各位关注的人,谢谢每一个回答的人.
解决方案 »
- 好久不来了,提个弱智问题吧
- 求助!!!在三层结构里实现动态SQL查询出错怎么解决?
- 求控件或原代码,实现从‘商业大厦’到‘SYDS'(拼音首字母)的转化。
- 关于SQL Server的用法,大家来帮忙出主意----十万火急!!!!
- ADO+ACCESS的SQL,解决立刻结贴;
- Delphi自带的图片虽然好,但是看久了不免乏味,请问哪儿有别的图片下载?
- 我是一名Delphi的菜鸟,我现在有个问题,请问哪位前辈可以帮我!
- 如果在软件是使用flash,那么要在其它的机子上运行必须安装什么?
- 各位大哥,快来帮忙。。。!!!急啊,急啊,十万火急。。。
- 网友请帮忙,这条SQL该怎么写:由一个表中向另一个表中成批增加数据?
- 不懂就要问
- 大家帮我看下这个用什么控件好。
SQL.Text :='update T_PO SET 工序一 = 工序一 +'+ IntToStr(first) +
', 工序二 = 工序二 +'+ IntToStr(second)+
',工序三 = 工序三 + '+ IntToStr(third) +
' where 生产任务单 =D99994' ;
我按您给的提示修改之后,不能编绎:
错误为: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该怎么修改呢
比如原来分别是100,100,100,我在三个edit里都写100,100,100后,点btnUpdate之后,希望数据库里字段值能变成200,200,200,
我想的是数值相加,可能是没表述清楚,让bdmh兄误会成字符串连接了。
像这样的话,应该怎么写SQL语句?
Update A set a=a+10 where b=1
空格不是一个有效的数字
查看edit是否有空值
请您看看我提问时的那段代码,那样写有错吗?我用三个变量去取值了,strToInt(edtStep1.text)
所有edit.text的后续操作,最好都去空格,strtoint(trim(edit.text))
看看它能否粘贴到查询分析器执行
这次组合出来的语句没有问题。
我换了一个解决思路:
先把四个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 不行,一定要关闭程序重新开才能出现新结果
execsql 后增加
close;
sql.clear;
sql.add('select * from T_updatetemp ')
open;目的,手动刷新数据表。PS:我从来不用refresh的,rrefresh 只刷新缓存区,一般来说,只有直接在dbgrid 里面插入,修改,删除或其它操作的数据,用refresh 才会更新,而直接用execsql的数据库操作,用此方法都无法显示的。只能用查询语句重新取数。如果你有很多此类操作,可以写一个公共过程,比方:procedure TXX.refreshdg,然后有需要操作的地方,直接调用此过程就好了。