aq: TADOQuery;
With aq Do
   begin
      //加入主表信息
      Close;
      SQL.Clear;
      decStr:=       '  declare @shl1 decimal(25,3), '+
                     '  @cbdj decimal(25,3), '+
                     '  @kcje decimal(25,3), '+
                     '  @spbh varchar(15), '+
                     '  @jls int, '+
                     '  @shl2 decimal(25,3), ' +
                     '  @je1 decimal(25,3),   '+
                     '  @err int';
      SQL.Add(decStr) ;
      SQL.Add(' Begin tran');
      SQL.Add(' select  @err = 0 ');
      SQL.Add(' Insert Into jh (bm,kprq,jhrbh,jhr,gysbh,dwmc,bmid,jhrq,fkfs,fk,'
             +' jehj,czrid,czr,bmmc) values ('''+Ed_bh.Text+''','''+DateToStr(Dpk1.Date)+''','
             +' '''+Ed_zybh.Text+''','''+Ed_zy.Text+''','''+Ed_w_id.Text+''','
             +' '''+Ed_wldw.Text+''','''+bm_id+''','''+DateToStr(Dpk2.Date)+''','
             +' '''+cb_fkfs.Text+''','''+Ed_fk.Text+''','''+lbje.Caption+''','
             +' '''+czyid1+''','''+czy1+''','''+Ed_bm.Text+''') ');
      SQL.Add(' if @@error <> 0  ');
      SQL.Add(' begin');
      SQL.Add(' select  @err = @err +1 ');
      SQL.Add(' end');
      //导入到进货明细表里面
      SQL.Add(sqljhmx);
      SQL.Add(' if @@error<> 0  ');
      SQL.Add(' begin');
      SQL.Add(' select  @err = @err +1 ');
      SQL.Add(' end ');
      //写入或者更新数据
      SQL.Add(xrkcsql);
      SQL.Add(' if @@error <>0  ');
      SQL.Add(' begin');
      SQL.Add(' select  @err = @err +1 ');
      SQL.Add(' end ');
      if StrToFloat(Ed_fk.Text)>0 Then
      begin
      SQL.Add(xrje);    //写入当时的付款
      SQL.Add(' if @@error <> 0  ');
      SQL.Add(' begin');
      SQL.Add(' select  @err = @err +1 ');
      SQL.Add(' end');
      end;      SQL.Add(' if  @err<>0 begin  rollback return  end ') ;
     SQL.Add(' if  @err= 0 begin  Commit end ') ;
      SQL.Add(' select @err as aa ') ;
      Prepared;
      Open;
      if FieldByname('aa').AsInteger = 0 Then
      begin
          MessageBox(handle,'保存单据成功','提示',MB_OK);
          try
            //移动库存景象
            With astpro Do
            begin
                astpro.Close;
                astpro.ExecProc;
            end;
          except
             MessageBox(handle,'进货库存镜像出错1','提示',MB_OK);
             exit;
          end;
      end
      else
      MessageBox(handle,'保存进货单据出错1','提示',MB_OK);
      P_HW.EnaEdAneCb(GroupBox1,0);
      P_HW.EnaEdAneCb(GroupBox3,0);
      Dbg1.Enabled := False;
   end;
   except
       MessageBox(handle,'保存进货单据出错','提示',MB_OK);

解决方案 »

  1.   

    Prepared;
    Open;在这里用Open已经执行过了,这样是有结果集返回的,不需要返回结果集用Execsql执行,这是两者的区别。decStr:= 后面是定义的变量,应该是个存储过程,具体的操作都在这里完成,数据库应该是SQLServer吧!
      

  2.   

    Prepared;
    Open;
    要是在最ADD全部结束后再执行吗?
      

  3.   

    decStr:=       '  declare @shl1 decimal(25,3), '+
                         '  @cbdj decimal(25,3), '+
                         '  @kcje decimal(25,3), '+
                         '  @spbh varchar(15), '+
                         '  @jls int, '+
                         '  @shl2 decimal(25,3), ' +
                         '  @je1 decimal(25,3),   '+
                         '  @err int';
    什么意思?
      

  4.   

    没见过这样写存储过程的,不过一般存储过程都是用excusql.
      

  5.   

    decstr是个变量,存放的是后面那段用来执行的sql语句。
    这样写存储过程还真是累啊。