我下面的代码为何在运行期提示'将截断字符串或二进制数据'并不能得到正确的结果?
对于这样的多表操作什么方法最行之有效?
procedure Tfrm_ylck.bzeditKeyPress(Sender: TObject; var Key: Char);
var tempo,temrq,temxh,temdm,temmc,temgg,temsl,temkc:string;
begin
temxh:=xhedit.Text;
tempo:=poedit.Text;
temrq:=ckrqedit.Text;
with DM.AQ_One do
 begin
 DM.AQ_One.SQL.Clear;
 DM.AQ_One.SQL.Add('Select * from Detail_one where Cpxh='''+temxh+'''');
 DM.AQ_One.Open;
 if DM.AQ_One.RecordCount=0 then
   begin
  Application.MessageBox('此PO号不存在于数据库,请检查你的输入是否正确,确定后再进行PO出库操作!','提示',mb_ok+mb_iconinformation);
  end
  else
  DM.AQ_One.First;
  While not DM.AQ_One.Eof  do
   begin
   temdm:=DM.AQ_One.fieldbyname('Wldm').Value;
   temmc:=DM.AQ_One.fieldbyname('Wlmc').Value;
   temgg:=DM.AQ_One.fieldbyname('Wlgg').Value;
   temsl:=DM.AQ_One.fieldbyname('Sl').Value;
   temkc:=inttostr((strtoint(temsl)*strtoint(posledit.Text)));
   with DM.AQ_pock DO
    begin
   DM.AQ_pock.SQL.Clear;
   DM.AQ_pock.SQL.Add('Insert Into Po_ck(PoNo,Ckrq,Wldm,Wlmc,Wlgg,Yl,Cksl,Bz)values(:no,:rq,:dm,:mc,:gg,:yl,:cksl,:bz)');
   DM.AQ_pock.Parameters.ParamByName('no').Value:=poedit.Text;
   DM.AQ_pock.Parameters.ParamByName('rq').Value:=ckrqedit.Text;
   DM.AQ_pock.Parameters.ParamByName('dm').Value:=temdm;
   DM.AQ_pock.Parameters.ParamByName('mc').Value:=temmc;
   DM.AQ_pock.Parameters.ParamByName('gg').Value:=temgg;
   DM.AQ_pock.Parameters.ParamByName('Yl').Value:=temsl;
   DM.AQ_pock.Parameters.ParamByName('cksl').Value:=(strtoint(temsl)*strtoint(posledit.Text));
   DM.AQ_pock.Parameters.ParamByname('bz').Value:=bzedit.Text;
   DM.AQ_pock.ExecSQL;
   end;
   with DM.AQ_Kc DO
   begin
   SQL.Add('Update detail_all Set Sl=Sl-'+temkc+' where Wldm='''+temdm+'''');
   DM.AQ_Kc.ExecSQL;
   end;
  temdm:='';
  temmc:='';
  temgg:='';
  temsl:='';
  DM.AQ_one.Next;
end;
  With DM.AQ_pock do
   begin
   SQL.Clear;
   SQL.Add('Select * from Po_ck where PoNo='''+tempo+''' and Ckrq='''+ckrqedit.Text+'''');
   DM.AQ_pock.Open;
   DM.DS_pock.DataSet:=DM.AQ_pock;
end;
END;
end;

解决方案 »

  1.   

    procedure Tfrm_ylck.bzeditKeyPress(Sender: TObject; var Key: Char);
    var tempo,temrq,temxh,temdm,temmc,temgg,temsl,temkc:string;
    begin
    temxh:=xhedit.Text;
    tempo:=poedit.Text;
    temrq:=ckrqedit.Text;
    with DM.AQ_One do
     begin
     DM.AQ_One.SQL.Clear;
    ///// DM.AQ_One.SQL.Add('Select * from Detail_one where Cpxh='''+temxh+'''');
    ///改为下句
     DM.AQ_One.SQL.Add('Select * from Detail_one where Cpxh='+''''+temxh+'''');
     DM.AQ_One.Open;
     if DM.AQ_One.RecordCount=0 then
       begin
      Application.MessageBox('此PO号不存在于数据库,请检查你的输入是否正确,确定后再进行PO出库操作!','提示',mb_ok+mb_iconinformation);
      end
      else
      DM.AQ_One.First;
      While not DM.AQ_One.Eof  do
       begin
       temdm:=DM.AQ_One.fieldbyname('Wldm').Value;
       temmc:=DM.AQ_One.fieldbyname('Wlmc').Value;
       temgg:=DM.AQ_One.fieldbyname('Wlgg').Value;
       temsl:=DM.AQ_One.fieldbyname('Sl').Value;
       temkc:=inttostr((strtoint(temsl)*strtoint(posledit.Text)));
       with DM.AQ_pock DO
        begin
    /////加一句
    DM.AQ_pock.close;
       DM.AQ_pock.SQL.Clear;
       DM.AQ_pock.SQL.Add('Insert Into Po_ck(PoNo,Ckrq,Wldm,Wlmc,Wlgg,Yl,Cksl,Bz)values(:no,:rq,:dm,:mc,:gg,:yl,:cksl,:bz)');
       DM.AQ_pock.Parameters.ParamByName('no').Value:=poedit.Text;
       DM.AQ_pock.Parameters.ParamByName('rq').Value:=ckrqedit.Text;
       DM.AQ_pock.Parameters.ParamByName('dm').Value:=temdm;
       DM.AQ_pock.Parameters.ParamByName('mc').Value:=temmc;
       DM.AQ_pock.Parameters.ParamByName('gg').Value:=temgg;
       DM.AQ_pock.Parameters.ParamByName('Yl').Value:=temsl;
       DM.AQ_pock.Parameters.ParamByName('cksl').Value:=(strtoint(temsl)*strtoint(posledit.Text));
       DM.AQ_pock.Parameters.ParamByname('bz').Value:=bzedit.Text;
       DM.AQ_pock.ExecSQL;
       end;
       with DM.AQ_Kc DO
       begin
    //////加上
       close;
       sql.clear;
    /////
       SQL.Add('Update detail_all Set Sl=Sl-'+temkc+' where Wldm='''+temdm+'''');
       DM.AQ_Kc.ExecSQL;
       end;
      temdm:='';
      temmc:='';
      temgg:='';
      temsl:='';
      DM.AQ_one.Next;
    end;
      With DM.AQ_pock do
       begin
       SQL.Clear;
       SQL.Add('Select * from Po_ck where PoNo='''+tempo+''' and Ckrq='''+ckrqedit.Text+'''');
       DM.AQ_pock.Open;
       DM.DS_pock.DataSet:=DM.AQ_pock;
    end;
    END;
    end;
      

  2.   

    加上CLOSE还是一样会出现‘将截断字符串或二进制数据'的错误!
      

  3.   

    注意,delphi里在向数据库提交sql语句时处理语句对有些符号敏感,好象是“-”,看看你的sql语句有什么特殊字符,如果有,改个名字试试!!!
      

  4.   

    看样是其中一个表格的字段太短了,装不下你所保存的内容,找到那个字段增长点:
    也可以试试下面的方法,先在查询分析器运行下面的语句:
    ALTER DATABASE 你的数据库名字
      SET  NUMERIC_ROUNDABORT         OFF
      

  5.   

    应该是字段长度比写入的小,如:field1 varchar(4) 写入'12345'就会出这样的错误