簡體   English   中英

如何在運行時創建TDataSet查找字段?

[英]How to create a TDataSet Lookup Field at runtime?

我正在使用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...if FieldCount = 1 then FLookupCursor.Find...

我接受答案,因為已編譯的程序正在運行。
如果有人在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM