【问题标题】:How to create a TDataSet Lookup Field at runtime?如何在运行时创建 TDataSet 查找字段?
【发布时间】:2012-01-30 12:51:48
【问题描述】:

我正在使用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 中运行表单时验证是否收到异常,那就太好了。

【问题讨论】:

    标签: delphi delphi-7 lookupfield tadodataset


    【解决方案1】:

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

    您还需要将需要访问的任何其他字段添加为持久字段,否则它们将无法访问。以下程序应该有效。但是,如果可以的话,我建议您使用查询并加入您的表 - 在我看来,这样编码更少,而且更简洁。

    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;
    

    【讨论】:

    • 您的意思是我首先需要在设计模式下创建“您需要作为持久字段访问的任何其他字段”才能运行此代码?
    • 我在尝试打开数据集时收到EOleException with message 'An unknown error has occurred
    • 您可以在运行时添加所有持久字段。哪一部分抛出异常,哪一行?
    • 似乎只有当我在 AdoDataset1.Open; 中从 IDE 运行程序时才会引发异常。编译后的程序运行良好。你知道这是为什么吗?
    • 关于您的建议:我可以编辑/插入“查询并加入您的表格”数据集吗?如果是,我认为主要问题是当您在此类 DataSet 上附加新记录时,您需要 Requry 它以反映查找字段。没有?
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2018-02-05
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多