adoquery7.First;
      while (not adoquery7.eof) do
       begin   //0
          try
                   adoquery6.Append;
                   adoquery6.edit;
                   cwhcode:=adoquery7.fieldbyname('cwhcode').value;  //仓库编码
                   //cwhname:=F_function.get_value_string('Warehouse','cWhCode',cWhCode,'cWhName');//仓库名称
                   cInvCode:=adoquery7.fieldbyname('cInvCode').value;  //存货编码
                   //cBatch:=adoquery7.fieldbyname('cBatch').value;  //批号
                   adoquery6.FieldByName('autoid').value:=adoquery7.fieldbyname('autoid').value;
                   adoquery6.FieldByName('仓库').value:=cwhname;
                   adoquery6.FieldByName('日期').value:=adoquery7.fieldbyname('ddate').value;
                   adoquery6.FieldByName('单据类型').value:=adoquery7.fieldbyname('type').value;
                   adoquery6.FieldByName('是否为入库').value:=adoquery7.fieldbyname('is_rk').value;
                   adoquery6.FieldByName('存货编码').value:=adoquery7.fieldbyname('cInvCode').value;
                   {adoquery6.FieldByName('存货名称').value:=F_function.get_value_string('inventory','cInvCode',cInvCode,'cInvName');
                   adoquery6.FieldByName('客户').value:=F_function.get_value_string('customer','cCusCode',trim(adoquery7.fieldbyname('cCusCode').value),'cCusAbbName');
                   adoquery6.FieldByName('供应商').value:=F_function.get_value_string('Vendor','cvenCode',trim(adoquery7.fieldbyname('cVenCode').value),'cvenAbbName');
                   adoquery6.FieldByName('批号').value:=adoquery7.fieldbyname('cBatch').value;
                   adoquery6.FieldByName('入库数量').value:=adoquery7.fieldbyname('iQuantity').value;
                   k:=1;
                   if (adoquery7.fieldbyname('iUnitCost').value=null) and (adoquery7.fieldbyname('is_rk').value=1)  then   //如果入库单价数量没填
                       adoquery6.FieldByName('入库单价').value:=0
                   else
                       adoquery6.FieldByName('入库单价').value:=adoquery7.fieldbyname('iUnitCost').value;
                  k:=2;
                   adoquery6.FieldByName('发出数量').value:=adoquery7.fieldbyname('iquantity_out').value;
                   adoquery6.FieldByName('发出单价').value:=adoquery7.fieldbyname('iUnitCost_out').value;                   if adoquery7.fieldbyname('is_rk').value=1 then      //入库
                     begin
                       k:=3;
                       adoquery6.FieldByName('结余数量').value:=F_function.get_qc(cwhname,cInvCode)+F_function.get_rk(cwhname,cInvCode)+adoquery7.fieldbyname('iQuantity').value-F_function.get_ck(cwhname,cInvCode);
                       IF (F_function.get_price_prior(cwhname,cInvCode,'quantity')+adoquery7.fieldbyname('iQuantity').value)=0 THEN
                         price:=0
                       else
                       price:=(F_function.get_price_prior(cwhname,cInvCode,'money')+adoquery7.fieldbyname('iQuantity').value*adoquery7.fieldbyname('iUnitCost').value)/(F_function.get_price_prior(cwhname,cInvCode,'quantity')+adoquery7.fieldbyname('iQuantity').value);
                           //(上一次结余金额+入库金额)/(上一次结余+入库数量)
                     end
                   else
                   if adoquery7.fieldbyname('is_rk').value=0 then       //出库
                     begin
                       k:=4;
                       adoquery6.FieldByName('结余数量').value:=F_function.get_qc(cwhname,cInvCode)+F_function.get_rk(cwhname,cInvCode)-F_function.get_ck(cwhname,cInvCode)-adoquery7.fieldbyname('iquantity_out').value;                       price:=F_function.get_price_prior(cwhname,cInvCode,'price');//取上一次的成本单价
                           //如果以前没入库,只有退货的话单价就变0了?
                     end
                   else
                   if adoquery7.fieldbyname('is_rk').value=2 then    //期初
                     begin
                       k:=5;
                      adoquery6.FieldByName('结余数量').value:=F_function.get_qc(cwhname,cInvCode)+adoquery7.fieldbyname('iQuantity').value;
                      IF (F_function.get_price_prior(cwhname,cInvCode,'quantity')+adoquery7.fieldbyname('iQuantity').value)=0 THEN
                         price:=0
                       else
                      price:=(F_function.get_price_prior(cwhname,cInvCode,'money')+adoquery7.fieldbyname('iQuantity').value*adoquery7.fieldbyname('iUnitCost').value)/(F_function.get_price_prior(cwhname,cInvCode,'quantity')+adoquery7.fieldbyname('iQuantity').value);                     end;
                     }
                   adoquery6.FieldByName('结余价格').value:=price;
                   adoquery6.FieldByName('单据号').value:=adoquery7.fieldbyname('cCode').value;
                   adoquery6.FieldByName('失效日期').value:=adoquery7.fieldbyname('dVDate').value;
                   adoquery6.FieldByName('备注').value:=adoquery7.fieldbyname('cMemo').value;
                   k:=6;
                   adoquery6.UpdateBatch();                   //adoquery6.edit;
                   //price:=F_function.My_get_price_current(cwhname,cInvCode);//移动平均法算成本单价
                   //adoquery6.FieldByName('结余价格').value:=price;  //
                   //adoquery6.UpdateBatch();
             {    if e=1 then
                begin
                    if adoquery7.fieldbyname('is_rk').value=0 then       //更新发货单成本单价
                   begin                    with ADOQuery_function2 do     //u8
                      begin
                        Close;
                        SQL.Text:='update dispatchlists set cdefine26=:price from dispatchlist a ,dispatchlists b where a.dlid=b.dlid '+
                                  'and cdlcode=:cdlcode and cinvcode=:cinvcode and cwhcode=:cwhcode';
                        Parameters.ParamByName('price').value :=price;  //
                        Parameters.ParamByName('cdlcode').value :=adoquery7.fieldbyname('cCode').value; //单据号
                        Parameters.ParamByName('cWhCode').value :=cWhCode;  //仓库
                        Parameters.ParamByName('cInvCode').value :=cInvCode; //存货编码
                        prepared;
                        ExecSQL;
                      end;
                   end;
                end;
                   k:=7;
                 
                  if cwhcode='08' then    //存货档案只更新08仓库
                   begin//1.0                    with ADOQuery_function2 do     //u8
                      begin
                        Close;
                        SQL.Text:='update inventory set iInvLSCost=:iInvLSCost where cinvcode=:cinvcode';
                        Parameters.ParamByName('iInvLSCost').value :=price;  //                        Parameters.ParamByName('cInvCode').value :=cInvCode; //存货编码
                        prepared;
                        ExecSQL;
                      end;                   end;//1.0
                   }
                    k:=8;
           except
             showmessage(inttostr(k)+',仓库:'+cwhname+'单据类型:'+adoquery7.fieldbyname('type').value+'单据号:'+adoquery7.fieldbyname('cCode').value+'单价:'+floattostr(price));
           end;             adoquery7.next;
      end;  //0

解决方案 »

  1.   

    交互次数过多,建议使用存储过程,象这种操作最好的办法是先批量insert到临时表,然后再用存储过程进行更新.
      

  2.   

    看看能不能写个sql语句解决两个表的数据迁移
      

  3.   

    主要原因在于与数据库的交互次数过多和ADOQuery内部的处理过于复杂.
      

  4.   

    代码贴在BBS看着超累,要不你把数据库结构以及你想要的处理结果写出来吧
    感觉应该是几个SQL语句就能完成的事,不知道你写那么长的代码干啥。
      

  5.   

    LZ的问题即是一个大批量录入数据的问题,我前几天也遇到类似的问题,11W条记录用了600多秒,
    后改用先将数据写入到TXT文档中,然后用异构数据库的处理方法一次性导入,包括生成TXT全部共用时6秒到8秒
      

  6.   

    加上这一句,速度会提高,如果你用到了Grid或者其它DB控件显示数据的话
    -----------------------
    adoquery7.DisableControls;
    adoquery7.First; 
    while (not adoquery7.eof) do 
    begin  //0 
              try 
                      adoquery6.Append; 
                      adoquery6.edit; --这一句多余
                ...............
              ................
    end;
    adoquery7.EnableControls;