如何在运行时创建TDataSet Lookup字段?

7

我正在使用TADODataSet (D7)。
我没有在设计模式下使用DataSet创建持久化字段。

dsItems.CommandText := 'select ID, ItemName, UserIDCreate from Items';
dsUsers.CommandText := 'select  ID, LoginName from Users'; // lookup dataset

如果我在设计时双击 dsItems 并选择 "添加所有字段",然后点击 "新建字段" 并定义我的查找字段,一切都正常工作。生成的dsItems应包含:ID, ItemName, UserIDCreate, LoginName_Lookup 如何避免在设计时执行所有这些操作,并在打开数据集之后/之前添加查找字段?换句话说,如何模拟“添加所有字段”,然后“新建字段”以在运行时添加查找字段?
注意:运行 John 的代码时会出现异常。当尝试打开数据集时出现异常:EOleException with message 'An unknown error has occured'TCustomADODataSet.LocateRecord 函数 (ADODB.pas) 中的第 if FieldCount = 1 then FLookupCursor.Find... 行。
接受答案是因为编译后的程序可以工作。如果有人能验证在IDE内部运行时是否会出现异常,那就太好了。
1个回答

10

无法在运行时打开数据集以添加查找字段。

您还需要将其他需要访问的字段作为持久字段添加,否则它们将无法访问。以下过程应该有效。但是,我建议如果可能,请使用查询并连接表格-这样编码量少得多,并且在我看来更加清洁。

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;

你的意思是我需要先在设计模式下创建“任何其他需要作为持久字段访问的字段”才能运行这段代码吗? - Vlad
当我尝试打开数据集时,出现“EOleException with message 'An unknown error has occurred”错误。 - Vlad
您可以在运行时添加所有持久字段。哪个部分抛出了异常,哪一行? - John Easley
这不应该有什么影响。您需要设置一些断点并逐步执行代码,以确切了解发生了什么... - John Easley
1
关于您的建议:我能在“查询和连接表”数据集上进行编辑/插入吗?如果可以,我认为主要问题是当您在这样的数据集上附加新记录时,您需要重新查询它以反映查找字段。对吗? - Vlad
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接