写了个进销存系统,出库时写入出库明细表,并从库存表扣数量和金额,下面是代码,可在程序使用时老提示出库失败,不知代码错在哪里了,找了半天差不多原因,请高人给看看,谢谢了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 ;

解决方案 »

  1.   

    f_data.ADOConnection1.BeginTrans;
    try
      ...
    except
      f_data.ADOConnection1.RollbackTrans;
      application.MessageBox('出库失败','提示',0+64) ;
    end;
    f_data.ADOConnection1.CommitTrans;
    application.MessageBox('出库成功','提示',64); 
      

  2.   

    看一下是什么错误
      except on e: Exception do
      begin
        ShowMessage(e.Message);
      end;
      end;
      

  3.   

    用ShowMessage(e.Message)捕捉异常,提示如下,提示变量类型不能转换是什么意思?
    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 ;    //把库存数量赋给变量存放 
      

  4.   

    原因查出来了,就是数量类型转换的问题,变量定义的是DOUBLE类型,金额数据库中是money类型,数量数据库中是float类性
    这些类性难道运算是还要转换吗?得如何转换?
      

  5.   

    我的问题解决了,谢谢各位,原来我的数据库中的金额值有NULL,所以回复的都给分