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 に答える