是否可以找到CustomADODataSet即将滚动到的记录?

时间:2017-08-31 15:00:56

标签: delphi dataset ado

我想制作两个数据集DS1DS2,同时滚动。这些实际上是在具有不同字段的同一表上查询的结果。第一个用于UI并且具有许多计算字段,第二个是具有很少数据字段的简单可编辑数据集。我希望两个数据集都具有相同ID的活动记录。因此,由于我假设DS1记录集是DS2的子集,我只需在DS2.Locate中调用DS2.AfterScroll。但我的假设可能在技术上受到侵犯(由于配置错误)。因此,当DS1中没有相应记录时,我想中止DS2的滚动过程。通过滚动过程,我的意思是更改DS1的有效记录并触发DS1.AfterScroll

1 个答案:

答案 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即将滚动到的记录?

是你不需要的。