有一个表,表名为A,另有一表,表名为A_HIS。它们都有BranchNO、ReportDate、LastBalance、NowBalance等字段我想用A_HIS表中的某个字段的内容替换到A表中,条件是A表的BranchNO要等于A_HIS中的BranchNO且A_HIS中的ReportDate要等于一个指定值,该值用参数指导定。我写了下面的代码,执行时出错!提示说“至少有一个参数没有被指定值”,请问我的代码哪有问题??请指教!
  .......
  .......
with AdoQuery1 do
  begin
  close;
  sql.Clear ;
  sql.Add('Update A set LastBalance=A_his.NowBalance ');
  sql.Add('where BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
  Parameters.ParamByName('mLdateA').Value :=StrToDate(mLdate);
    Execsql;
  end;
  ........
  ........

解决方案 »

  1.   

    --------------
    不能使用.value
    直接使用字段名ReportDate
      

  2.   

    ParamByName('ReportDate').AsDate:=mLDataA
    这样对么
      

  3.   

    应该是SQL语句错误,写成这样应该没
    update a set LastBalance=(select LastBalance from A_his where A_his.BranchNO=A.BranchNO and A_his.ReportDate=:mLdateA)
      

  4.   

    不对,是你负值语句的问题,
    ParamByName('ReportDate').AsDate:=mLDataA
    这么些就可以了
      

  5.   

    To iceshape
       用你的推荐仍是出现同样的错误。:(
    To 哭沙、Jency
       我用的是AdoQuery,它的参数附值方法和Query的附值方法不同。:(
    To 新新虫
       能写写你用的代码吗?谢谢!! 
      

  6.   

    To iceshape:
       用你的方法出现的错误是:“操作必须使用一个事更新的查询”!!
      

  7.   

    我现在的解决方法是先把A_HIS中的表中满足ReportDate的数据先放到一个AdoQueryTemp中,然后对A表进行循环,逐个与AdoQueryTemp中的数据进行匹配,这样能实现我的要求,可是较慢,若数据量很大时………… 天哪!!那不知道会要等多久,有没有好办法呀?难道用一条SQL语句不能解决吗??
    盼请指教!!!
      

  8.   

    我也遇到过相同问题。主要是Delphi出问题。
    你可以手工修改Paramter参数(在对象面板上),主要参数长度(Size)和类型
    (type).
      

  9.   

    谢谢zxkid!
       可你是怎么实现的呢?我一直以为是SQL的问题,因为以前我用VB写程序的时候就遇到过这类似的问题,也没有办法解决,可能是我动脑不够吧,可实在是想不出来了。
    :(
      

  10.   

    对不起是我没看清楚。  sql.Add('Update A set LastBalance=A_his.NowBalance ');
      sql.Add('from a_His,a where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
      

  11.   

    To zxkid:
       还是有问题啊,update命令里面是没有...from <表>...这样的写法的啊,这样的写法对SQL来说是非法的,程序也这样提示。若去掉from a_his,a 则提示“至少有一个参数未指定值”
      

  12.   

    什么数据库?
      sql.Add('Update A set LastBalance=A_his.NowBalance');
      sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA)');
    再试试
      

  13.   

    To zxkid
    Access 数据库
    用你刚才的建议,仍是出现“至少有一个参数未指定值”的提示,我想应该是delphi中,不能写a_his.BranchNO之类的语句吧,deplphi可能会把BranchNO当成a_his的一个属性而不是字段。
     :(:(((((
      

  14.   

    1、可能是Delphi的问题。在对象面板上设置Adoquery的Paramters属性,看看有没有参数,核对参数是否正确。如name是否是mLdateA,字段长度和类型是否与数据库的A_his.ReportDate字段相匹配。
    2、如果还不行。只有不用参数了,直接写SQL语句也一样啊。如下:
    sql.Add('Update A set LastBalance=A_his.NowBalance');
    sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO');
    sql.Add('and A_his.ReportDate=''#'+datetostr(日期字段)+'#'')');
      

  15.   


    可是错误还是出现,报告说“参数A_his.NowBalance没有默认值”!百思不得其解…………………………
      

  16.   

    这些是Access中的表 
    A表:
    --------------------------------------
    BranchNO    Lastbalance    ReportDate
    --------------------------------------
    A001                 0     2002-10-01
    A002                 0     2002-10-01
    A003                 0     2002-10-01
    A004                 0     2002-10-01
    A005                 0     2002-10-01
    A006                 0     2002-10-01
    A007                 0     2002-10-01
    A008                 0     2002-10-01
    A009                 0     2002-10-01
    A010                 0     2002-10-01
    --------------------------------------A_HIS表:
    --------------------------------------
    BranchNO    Nowbalance    ReportDate
    --------------------------------------
    A001               100     2002-9-30
    A002               100     2002-9-30
    A003               200     2002-9-30
    A004               200     2002-9-30
    A005                 0     2002-9-30
    A006               100     2002-9-30
    A007               100     2002-9-30
    A008               200     2002-9-30
    A009               200     2002-9-30
    A010                 0     2002-9-30
    --------------------------------------
    通过一条SQL语句将A表变成如下表所示:
    --------------------------------------
    BranchNO    Lastbalance    ReportDate
    --------------------------------------
    A001               100     2002-10-01
    A002               100     2002-10-01
    A003               200     2002-10-01
    A004               200     2002-10-01
    A005                 0     2002-10-01
    A006               100     2002-10-01
    A007               100     2002-10-01
    A008               200     2002-10-01
    A009               200     2002-10-01
    A010                 0     2002-10-01
    --------------------------------------
    我的头都大了……:(((((((((((::((((((((
      

  17.   

    试试这样的SQL语句:
    update a set lastbalance =(select Nowbalance from a_his where branchno=a.branchno and reportdate=‘2002-10-01’)
      

  18.   

    To b51:
      还是提示"操作必须是一个可更新的查询。"
      失败了………………
      

  19.   

    在Access里面update语句应该如此:
    with AdoQuery1 do
      begin
      close;
      sql.Clear ;
      sql.Add('Update A,A_his set a.LastBalance=A_his.NowBalance ');
      sql.Add('where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
      Parameters.ParamByName('mLdateA').Value :=StrToDate(mLdate);
        Execsql;
      end;
    你再试试看!