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

如何避免在设计时执行所有这些操作,并在打开 DataSet 之后/或之前(?不确定)添加一个查找字段。

换句话说:我如何模拟“添加所有文件”然后“新建文件”以在运行时添加查找文件?


注意: 从 IDE 运行 John 的代码时出现异常。尝试打开 DataSet 时发生异常:EOleException with message 'An unknown error has occured'

function TCustomADODataSet.LocateRecord (ADODB.pas)排队if FieldCount = 1 then FLookupCursor.Find...

我接受答案,因为编译的程序正在运行。
如果有人可以在 IDE 中运行表单时验证是否收到异常,那就太好了。

4

1 回答 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;
于 2012-01-30T13:47:17.840 回答