改为: 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 := '加不加分随你'; —————————————————————————————————
你的代码是在OnCalcFields事件下么?
select a.*,b.addressID from student a, address b where a.addressid=b.addressid
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; -----------------
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;;
>>把ADOQUERY2的次序写在上面,然后ADOQUERY1写在下面 在哪儿做调整?
为什么第一条记录为空。因为: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;
为什么第一条记录为空。因为: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;
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 := '加不加分随你';
—————————————————————————————————
我在学习计算字段和主从表,不是想实现这个功能。
请大家继续发言。
-----------------
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;
-----------------
但我想知道我的方法为什么计算字段在第一条记录里没有,以后的才有?
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;;
在哪儿做调整?
之后从第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;
之后从第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;