请教有关sql的update更新数据表中记录的问题(300分)

  • 主题发起人 dreameast-1
  • 开始时间
D

dreameast-1

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TfrmClsldDjsh.BitBtn1Click(Sender: TObject);
begin
frmSLD.aqSLDMAIN.FieldByName('AuditingPerson').value := GetEmployeeName;
DBEdit2.text:=getemployeename;
end;

procedure TfrmClsldDjsh.SpeedButton1Click(Sender: TObject);
var
SysDate: oleVariant;
vs_clbm: string;
vr_sssl, vr_yssl: integer; //入库单中实收数量,库存表中原有数量
query: TADOQuery;
str:string;
begin
aqKC.Close;
aqKC.Open;
if dbedit2.text = '' then
begin
application.MessageBox('审核人不能为空', '仓库管理系统', mb_iconinformation + mb_defbutton1);
dbedit2.SetFocus;
exit;
end;
frmsld.aqSLDMAIN.edit;
frmSLD.aqSLDMAIN.fieldbyname('IsAuditing').value := true;
frmSLD.aqSLDMAIN.post;
//从库存情况表中按材料编号寻找某种材料是否已经存在
vs_clbm := trim(frmSLD.edtmoldcode.Text);
query := TADOQuery.Create(Self);
query.Connection:= dmWarehouse.ACWarehouse;
query.SQL.Text:= 'select * from KCQKB where moldcode="'+vs_clbm+'"';
query.Prepared;
query.Open;
//如果该材料存在,那么在该材料的基础上完成增加数量的操作
if not query.Eof then
begin
vr_sssl := frmSLD.aqSLDmain.fieldbyname('yuansum').asinteger;
// vr_yssl := aqKC.fieldbyname('yuansum').asfloat;
str:= 'update KCQKB set yuansum=yuansum+vr_sssl where moldcode="'+vs_clbm+'"';
query := TADOQuery.Create(Self);
query.Connection:= dmWarehouse.ACWarehouse;
query.SQL.Clear;
query.SQL.add(str);
query.ExecSQL;
end
else
//否则,在库存情况表中添加新的记录
begin
vr_sssl := frmSLD.aqSLDmain.fieldbyname('yuansum').value;
vr_yssl := aqKC.fieldbyname('yuansum').value;
aqKC.Insert;
aqKC.FieldByName('MoldCode').value := frmSLD.aqSLDmain.fieldbyname('MoldCode').value;
aqKC.FieldByName('Moldname').value := frmSLD.aqSLDmain.fieldbyname('MoldName').value;
aqKC.FieldByName('Size').value := frmSLD.aqSLDmain.fieldbyname('Size').value;
aqKC.FieldByName('matprice').value := frmSLD.aqSLDmain.fieldbyname('matprice').value;
aqKC.FieldByName('machPrice').value :=0;
aqKC.FieldByName('allprice').value := frmSLD.aqSLDmain.fieldbyname('matprice').value;
aqKC.FieldByName('bansum').value := 0;
aqKC.FieldByName('chengsum').value := 0;
aqKC.fieldbyname('yuansum').value := vr_sssl;
aqKC.fieldbyname('curdate').asdatetime := date;
//aqKC.FieldByName('memo').asstring := frmSLD.aqSLDmain.fieldbyname('memo').value;
end;
aqKC.post;
close;
end;

procedure TfrmClsldDjsh.SpeedButton2Click(Sender: TObject);
begin
close;
end;

procedure TfrmClsldDjsh.FormActivate(Sender: TObject);
begin
dbedit2.setfocus;
end;

end.

此段程序的功能是材料入库时连带更新库存表中的材料数量(字段yuansum)为什么运行时总是提示“变量‘vr_sssl”没有默认值阿????????????
 
最前面选初始化一下它, vr_sssl:=0; 看看
 
试过也不好使
 
从你的这句
str:= 'update KCQKB set yuansum=yuansum+vr_sssl where moldcode="'+vs_clbm+'"';
来看,vr_sssl是表中的一个字段,在前端它有一个变量名也是vr_sssl。我想提示的出错信息是指:字段vr_sssl不允许为null,但是又没有指定默认值,于是在执行yuansum=yuansum+vr_sssl时没有值用来做加法。你再查查表设计是不是这么回事。
 
你的这句确保一定能取出数值来吗?有没有会取到空值,或所取道的数值不符合数据库中
关系约定的情况,如果有请处理。
vr_sssl := frmSLD.aqSLDmain.fieldbyname('yuansum').asinteger;
if vr_sssl< 0 then
vr_sssl = 1;
你的处理,可以付给默认值,或其它操作!
 
这个问题解决了主要是数值型转换到字符串就可以了
str:= 'update KCQKB set yuansum=yuansum+'+floattostr(vr_sssl)+' where moldcode="'+vs_clbm+'"';
query := TADOQuery.Create(Self);
query.Connection:= dmWarehouse.ACWarehouse;
query.SQL.Clear;
query.SQL.add(str);
query.ExecSQL;


可是我想在语句中同时更新日期为系统当前日期,可是日期的结果却总是“1905-01-30”
为什么阿?请教大家一下!
 
试试把这句
aqKC.fieldbyname('curdate').asdatetime := date;
改成
aqKC.fieldbyname('curdate').asdatetime := now();
 
我建议你不要直接对字段进行赋值,我觉得用语句来执行会安全很多的,而且有一个好处,比如说sql数据库,更新日期的时候可以直接update table set rq=getdate() where ...
很方便,不用担心本地工作站的日期是否正确。

还有一个好处就是,可以进行数据的初始化,如果frmSLD.aqSLDmain中某个值为空时可以做相应处理。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
626
import
I
S
回复
0
查看
842
SUNSTONE的Delphi笔记
S
顶部