我想制作两个数据集DS1
和DS2
,同时滚动。这些实际上是在具有不同字段的同一表上查询的结果。第一个用于UI并且具有许多计算字段,第二个是具有很少数据字段的简单可编辑数据集。我希望两个数据集都具有相同ID
的活动记录。因此,由于我假设DS1
记录集是DS2
的子集,我只需在DS2.Locate
中调用DS2.AfterScroll
。但我的假设可能在技术上受到侵犯(由于配置错误)。因此,当DS1
中没有相应记录时,我想中止DS2
的滚动过程。通过滚动过程,我的意思是更改DS1
的有效记录并触发DS1.AfterScroll
。
答案 0 :(得分:1)
以下内容应该按照我的理解去做,换句话说,DS2的有效记录会跟踪DS1的有效记录。该示例使用了
Sql Server的MS演示authors
数据库的pubs
表。理想情况下,它会有一个整数主键ID列,但不幸的是authors
没有。
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
DS1: TADOQuery;
DS2: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DBNavigator1: TDBNavigator;
DBNavigator2: TDBNavigator;
procedure DS1AfterScroll(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
protected
DS2au_id,
DS2au_lname,
DS2au_fname : TStringField;
public
end;
[...]
procedure TForm1.DS1AfterScroll(DataSet: TDataSet);
begin
if DS2.Active then
DS2.Locate('au_ID', DS1.FieldByName('au_ID').AsString, []);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DS1.SQL.Text := 'select * from authors';
DS2.SQL.Text := 'select au_id, au_name, au_fname from authors';
DS1.Open;
DS2au_id := TStringField.Create(Self);
DS2au_id.FieldName := 'au_ID';
DS2au_id.Size := 11;
DS2au_id.DataSet := DS2;
DS2au_lname := TStringField.Create(Self);
DS2au_lname.FieldName := 'au_lname';
DS2au_lname.Size := 40;
DS2au_lname.DataSet := DS2;
DS2au_lname := TStringField.Create(Self);
DS2au_lname.FieldName := 'au_fname';
DS2au_lname.Size := 20;
DS2au_lname.DataSet := DS2;
DS2.Recordset := DS1.Recordset;
end;
如果你这样做,你q的答案
是否可以找到CustomADODataSet即将滚动到的记录?
是你不需要的。