2017-08-31 61 views
0

我想制作两个数据集,DS1DS2,同时滚动。这些实际上是在具有不同字段的同一张表上查询的结果。第一个用于用户界面,有很多计算字段,第二个是一个简单的可编辑数据集,只有很少的数据字段。我希望两个数据集都具有相同的活动记录ID。所以,因为我假设DS1记录集是DS2的子集,我只需拨打DS2.Locate,DS2.AfterScroll即可。但是我的假设在技术上可能会被违反(由于配置错误)。所以我想在DS2没有相应的记录时中止DS1的滚动过程。通过滚动过程,我的意思是更改活动记录DS1并解雇DS1.AfterScroll是否有可能找到CustomADODataSet即将滚动到的记录?

+0

您是否试过让DS2使用与DS1相同的ADO RecordSet对象? – MartynA

+0

@MartynA不,实际上我并不熟悉这个技巧。 – saastn

+0

@saastn你的意思是如果record1中的DS1 DS2也应该在record1中? – Sami

回答

1

下面应该做我理解你的意思,换句话说DS2的活动记录跟踪DS1的活动记录。该示例使用Sql Server的MS演示pubs数据库的 authors表。理想情况下,它会有一个整数主键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; 

如果你做这种方式,回答您的问与答

是否有可能发现CustomADODataSet即将滚动到记录?

是你不需要。

+0

嗯,这是一个有趣的技术,但并没有解决我的问题。我真的需要使用两个独立的数据集。但在你的解决方案中,两个数据集都有相同数量的记录,'DS2'只能有'DS1'中存在的字段。即使没有DS2.SQL.Text:= ...行,你的代码行为也是一样的。 – saastn

相关问题