不必使用计算字段
这样用:
AdoQuery1的SQL:
select a.*,b.addressID from student a, address b where a.addressid=b.addressid
就可以了

解决方案 »

  1.   

    改为:
    OnCalcFields事件如下
    begin
     if Not ADOQuery2.Active then    ADOQuery2.Open; ADOQuery1.FieldByName('addressName').AsVariant:=ADOQuery2.FieldByName('addressName).AsVariant;
    end;—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
        
      

  2.   

    你的代码是在OnCalcFields事件下么?
      

  3.   

    select a.*,b.addressID from student a, address b where a.addressid=b.addressid
      

  4.   

    lxpbuaa(桂枝香在故国晚秋):按你说的做,还是不行。
    我在学习计算字段和主从表,不是想实现这个功能。
    请大家继续发言。
      

  5.   

    ADOQuery2:select * from address
    -----------------
    try
    if not ADOQuery2.Active then ADOQuery2.Active:=true;
    if ADOQuery2.locate('addressID',ADOQuery1.FieldByName('addressID').value,[]) then
    ADOQuery1.FieldByName('addressName').asstring:=ADOQuery2.FieldByName('addressName).Value
    else ADOQuery1.FieldByName('addressName').asstring:='';
    finally
    ADOQuery2.Active:=False;
    end;
    -----------------
      

  6.   

    zhangpeigao(东部一绝) :你说的方法可以。
    但我想知道我的方法为什么计算字段在第一条记录里没有,以后的才有?
      

  7.   

    ADOQuery1:select * from student;新增计算字段addressName,OnCalcFields事件如下:
    ADOQuery2:select * from address where addressID = :addressID;它的datasource设为ADOQuery1
    把ADOQUERY2的次序写在上面,然后ADOQUERY1写在下面
    try
    ADOQuery2.Active:=True;
    ADOQuery1.FieldByName('addressName').Value:=ADOQuery2.FieldByName('addressName).Value;
    finally
    ADOQuery2.Active:=False;
    end;;
      

  8.   

    >>把ADOQUERY2的次序写在上面,然后ADOQUERY1写在下面
    在哪儿做调整?
      

  9.   

    为什么第一条记录为空。因为:ADOQUERY1第一条在完全打开时前就要将计算字段算出,因为此时ADOQUERY1尚未完全打开,而ADOQUERY2即使被打开,此时取道的ADOQUERY1的addressID为空。所以为空。
    之后从第2条开始,ADOQUERY2已经和ADOQUERY1完全对应,因此后面的是对的。
    你可以跟踪去查一查,第一条的ADOQUERY1的addressID是否为空。我觉得你可以用另外个QUERY 做,不要将DATASOURCE连ADOQUERY1。
    With query1 do
    begin
      if Active then Close;
      SQL.Clear;
      SQL.ADD('Select address_AddressName from  address');
      SQL.ADD('Where address_addressID=:ID');
      ParamByname('ID').AsString := ADOQuery1StudentAddressId.AsString;
      ADOQuery1addressName.AsString := Fields[0].AsString ;
      Close;
    end;
      

  10.   

    为什么第一条记录为空。因为:ADOQUERY1第一条在完全打开时前就要将计算字段算出,因为此时ADOQUERY1尚未完全打开,而ADOQUERY2即使被打开,此时取道的ADOQUERY1的addressID为空。所以为空。
    之后从第2条开始,ADOQUERY2已经和ADOQUERY1完全对应,因此后面的是对的。
    你可以跟踪去查一查,第一条的ADOQUERY1的addressID是否为空。我觉得你可以用另外个QUERY 做,不要将DATASOURCE连ADOQUERY1。
    With query1 do
    begin
      if Active then Close;
      SQL.Clear;
      SQL.ADD('Select address_AddressName from  address');
      SQL.ADD('Where address_addressID=:ID');
      ParamByname('ID').AsString := ADOQuery1StudentAddressId.AsString;
      ADOQuery1addressName.AsString := Fields[0].AsString ;
      Close;
    end;