我使用的是TADODataSet
(D7)
我不使用数据集在设计模式下创建持久字段。
dsItems.CommandText := 'select ID, ItemName, UserIDCreate from Items';
dsUsers.CommandText := 'select ID, LoginName from Users'; // lookup dataset
如果我双击dsItems
和"添加所有文件",然后单击"新建文件"并定义我的查找字段,一切都很好。生成的dsItems
应包含:ID, ItemName, UserIDCreate, LoginName_Lookup
如何避免在设计时执行所有这些操作,并在打开数据集之后/之前(?不确定)添加查找字段。
换句话说:我如何模拟"添加所有文件",然后《新文件》在运行时添加查找文件?
注意:在IDE中运行John的代码时,我遇到了一个异常。尝试打开数据集时发生异常:EOleException with message 'An unknown error has occured'
。
if FieldCount = 1 then FLookupCursor.Find...
线路中的function TCustomADODataSet.LocateRecord (ADODB.pas)
我接受这个答案,因为这个程序正在运行
如果有人能在IDE中运行表单时验证是否收到异常,那就太好了。
无法在运行时打开数据集以添加查找字段。
您还需要将需要访问的任何其他字段添加为持久字段,否则,它们将无法访问。以下程序应该有效。然而,如果可以的话,我建议您使用查询并连接表——在我看来,这会减少编码,而且更干净。
procedure CreatePersistentFields(ADataset: TDataset);
Var
i: Integer;
Begin
ADataset.FieldDefs.Update;
for I := 0 to ADataset.FieldDefs.Count - 1 do
if ADataset.FindField(ADataset.FieldDefs[i].Name) = Nil then
ADataset.FieldDefs.Items[i].CreateField(ADataset);
End;
Procedure CreateLookupField( ATable: TDataSet; AFieldName: String; ALookupDataset: TDataset; AKeyfields: String; ALookupKeyfields: String; ALookupResultField : String);
Var
I : Integer;
NewField : TField;
Begin
with ATable do begin
if FieldDefs.Updated = False then
FieldDefs.Update;
If FindField(AFieldName) = Nil then
begin
NewField := TStringField.Create(ATable);
NewField.FieldName := AFieldName;
NewField.KeyFields := AKeyFields;
NewFIeld.LookupDataSet := ALookupDataset;
NewField.LookupKeyFields := ALookupKeyFields;
NewField.LookupResultField := ALookupResultField;
NewField.FieldKind := fkLookup;
NewField.Dataset := ATable;
end;
end;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
AdoDataset1.Close;
CreatePersistentFields(TDataset(AdoDataset1));
CreateLookupField(TDataset(AdoDataset1), 'EmployeeNameLook', TDataset(EmployeeTable), 'EmployeeID', 'EmployeeID', 'EmployeeName');
end;