写了个进销存系统,出库时写入出库明细表,并从库存表扣数量和金额,下面是代码,可在程序使用时老提示出库失败,不知代码错在哪里了,找了半天差不多原因,请高人给看看,谢谢了if application.MessageBox('您确定要出库吗?','提示',mb_yesno)=id_yes then
begin
try
f_data.ADOConnection1.BeginTrans ; //开始事务
for i:=1 to stringgrid2.RowCount-2 do //开始循环
begin
with f_data.ADOQuery2 do //先从库存表中取出该物资的金额
begin
close;
sql.Clear ;
sql.Add('select [库存金额],[库存] from [库存表] where [物料代码]=:a and [库房]=:b and
[material_sort]=:c');
parameters.ParamByName('a').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('b').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('c').Value :=trim(stringgrid2.Cells[9,i]);
open;
end;
stockvalues:=f_data.ADOQuery2.fieldbyname('库存金额').Value ; //把库存金额赋给变量存放
stockquantity:=f_data.ADOQuery2.fieldbyname('库存').Value ; //把库存数量赋给变量存放
with f_data.Add do //写入出库明细表
begin
close;
sql.Clear ;
sql.Add('insert [出库明细表]([出库单号],[物料代码],[出库类别],[出库日期],[库房],[出库数量],
[领用部门],[使用项目],[合同号],[工程项目],[库位号],[备注],[领用人],[库管],[state],
[Material_sort],[出库单价],[出库金额])');
sql.Add('values(:outid,:itemid,''一次性'',:outdate,:store,:quantity,:dept,:item,:contract,:project,
:address,:memo,:handleman,:storeman,0,:M_sort,:price,:values)');
parameters.ParamByName('outid').Value :=trim(outid.Text );
parameters.ParamByName('itemid').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('outdate').Value :=formatdatetime('yyyy-mm-dd hh:mm:ss',datetimepicker1.DateTime );
parameters.ParamByName('store').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('quantity').Value :=strtofloat(stringgrid2.Cells[3,i]);
parameters.ParamByName('dept').Value :=trim(dept.Text);
parameters.ParamByName('item').Value :=trim(stringgrid2.Cells[4,i]);
parameters.ParamByName('contract').Value :=trim(contract.Text );
parameters.ParamByName('project').Value :=trim(stringgrid2.Cells[6,i]); parameters.ParamByName('address').Value :=trim(stringgrid2.Cells[8,i]);
parameters.ParamByName('memo').Value :=trim(stringgrid2.Cells[6,i]);
parameters.ParamByName('handleman').Value :=trim(handleman.Text);
parameters.ParamByName('storeman').Value :=trim(f_main.StatusBar1.Panels[5].Text) ;
parameters.ParamByName('M_sort').Value :=trim(stringgrid2.Cells[9,i]);
parameters.ParamByName('price').Value :=stockvalues/stockquantity; //库存总加除单价
parameters.ParamByName('values').Value :=(stockvalues/stockquantity)*strtofloat(stringgrid2.Cells[3,i]); //上面单价×出库数量
execsql;
end;
with f_data.ADOQuery1 do //更新库存表
begin
close;
sql.Clear;
sql.Add('update [库存表] set [库存]=([库存]-:storage),[库存金额]=[库存金额]-:outvalues,[末出库日期]=:enddate where ([物料代码]=:itemid) and ([库房]=:storeid) and ([Material_sort]=:m_sort)');
parameters.ParamByName('storage').Value :=strtofloat(stringgrid2.Cells[3,i]);
parameters.ParamByName('enddate').Value :=formatdatetime('yyyy-mm-dd hh:mm:ss',datetimepicker1.DateTime );
parameters.ParamByName('itemid').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('storeid').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('outvalues').Value :=stockvalues/stockquantity*strtofloat(stringgrid2.Cells[3,i]); //库存金额-出库金额
parameters.ParamByName('M_sort').Value :=trim(stringgrid2.Cells[9,i]);
execsql;
end;
end; // end for
f_data.ADOConnection1.CommitTrans ; //提交事务
application.MessageBox('出库成功','提示',64);
except
f_data.ADOConnection1.RollbackTrans ; //回滚事务
application.MessageBox('出库失败','提示',0+64) ;
exit;
end;
end;//end if massageboxend ;
begin
try
f_data.ADOConnection1.BeginTrans ; //开始事务
for i:=1 to stringgrid2.RowCount-2 do //开始循环
begin
with f_data.ADOQuery2 do //先从库存表中取出该物资的金额
begin
close;
sql.Clear ;
sql.Add('select [库存金额],[库存] from [库存表] where [物料代码]=:a and [库房]=:b and
[material_sort]=:c');
parameters.ParamByName('a').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('b').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('c').Value :=trim(stringgrid2.Cells[9,i]);
open;
end;
stockvalues:=f_data.ADOQuery2.fieldbyname('库存金额').Value ; //把库存金额赋给变量存放
stockquantity:=f_data.ADOQuery2.fieldbyname('库存').Value ; //把库存数量赋给变量存放
with f_data.Add do //写入出库明细表
begin
close;
sql.Clear ;
sql.Add('insert [出库明细表]([出库单号],[物料代码],[出库类别],[出库日期],[库房],[出库数量],
[领用部门],[使用项目],[合同号],[工程项目],[库位号],[备注],[领用人],[库管],[state],
[Material_sort],[出库单价],[出库金额])');
sql.Add('values(:outid,:itemid,''一次性'',:outdate,:store,:quantity,:dept,:item,:contract,:project,
:address,:memo,:handleman,:storeman,0,:M_sort,:price,:values)');
parameters.ParamByName('outid').Value :=trim(outid.Text );
parameters.ParamByName('itemid').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('outdate').Value :=formatdatetime('yyyy-mm-dd hh:mm:ss',datetimepicker1.DateTime );
parameters.ParamByName('store').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('quantity').Value :=strtofloat(stringgrid2.Cells[3,i]);
parameters.ParamByName('dept').Value :=trim(dept.Text);
parameters.ParamByName('item').Value :=trim(stringgrid2.Cells[4,i]);
parameters.ParamByName('contract').Value :=trim(contract.Text );
parameters.ParamByName('project').Value :=trim(stringgrid2.Cells[6,i]); parameters.ParamByName('address').Value :=trim(stringgrid2.Cells[8,i]);
parameters.ParamByName('memo').Value :=trim(stringgrid2.Cells[6,i]);
parameters.ParamByName('handleman').Value :=trim(handleman.Text);
parameters.ParamByName('storeman').Value :=trim(f_main.StatusBar1.Panels[5].Text) ;
parameters.ParamByName('M_sort').Value :=trim(stringgrid2.Cells[9,i]);
parameters.ParamByName('price').Value :=stockvalues/stockquantity; //库存总加除单价
parameters.ParamByName('values').Value :=(stockvalues/stockquantity)*strtofloat(stringgrid2.Cells[3,i]); //上面单价×出库数量
execsql;
end;
with f_data.ADOQuery1 do //更新库存表
begin
close;
sql.Clear;
sql.Add('update [库存表] set [库存]=([库存]-:storage),[库存金额]=[库存金额]-:outvalues,[末出库日期]=:enddate where ([物料代码]=:itemid) and ([库房]=:storeid) and ([Material_sort]=:m_sort)');
parameters.ParamByName('storage').Value :=strtofloat(stringgrid2.Cells[3,i]);
parameters.ParamByName('enddate').Value :=formatdatetime('yyyy-mm-dd hh:mm:ss',datetimepicker1.DateTime );
parameters.ParamByName('itemid').Value :=trim(stringgrid2.Cells[1,i]);
parameters.ParamByName('storeid').Value :=trim(stringgrid2.Cells[2,i]);
parameters.ParamByName('outvalues').Value :=stockvalues/stockquantity*strtofloat(stringgrid2.Cells[3,i]); //库存金额-出库金额
parameters.ParamByName('M_sort').Value :=trim(stringgrid2.Cells[9,i]);
execsql;
end;
end; // end for
f_data.ADOConnection1.CommitTrans ; //提交事务
application.MessageBox('出库成功','提示',64);
except
f_data.ADOConnection1.RollbackTrans ; //回滚事务
application.MessageBox('出库失败','提示',0+64) ;
exit;
end;
end;//end if massageboxend ;
try
...
except
f_data.ADOConnection1.RollbackTrans;
application.MessageBox('出库失败','提示',0+64) ;
end;
f_data.ADOConnection1.CommitTrans;
application.MessageBox('出库成功','提示',64);
except on e: Exception do
begin
ShowMessage(e.Message);
end;
end;
could not convert variant of type (null) into type (double)
我定义的stockvalues和stockquantity变量都是double类型,而下面的“库存金额"和"库存"数据库中是money类型
难道不行吗?
stockvalues:=f_data.ADOQuery2.fieldbyname('库存金额').Value ; //把库存金额赋给变量存放
stockquantity:=f_data.ADOQuery2.fieldbyname('库存').Value ; //把库存数量赋给变量存放
这些类性难道运算是还要转换吗?得如何转换?