2012-01-30 16 views
6

私はTADODataSet(D7)を使用しています。
私は、データセットでデザインモードで永続フィールドを作成しません。実行時にTDataSet参照フィールドを作成する方法は?

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

私はdsItemsをダブルクリックし、「すべてのfiledsを追加」して、「新規申請」をクリックし、自分のルックアップフィールドを定義し、すべてが正常に動作している場合。 結果dsItemsが含まれている必要がありますID, ItemName, UserIDCreate, LoginName_Lookup

を私がデザイン時にこのすべてをやって回避した後/または(いないことを確認?)データセットが開かれる前に、参照フィールドを追加するにはどうすればよいです。言い換えれば

:どのように私はをエミュレートします「すべてのfiledsを追加」し、その後、実行時に提出されたルックアップを追加しを「新規申請しましたか」?


注: IDEからジョンのコードを実行しているとき、私は例外を取得します。例外は、データセットを開くときに発生します:EOleException with message 'An unknown error has occured'。行の

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

遵守プログラムが動作しているbecouse私は答えを受け入れています。
IDE内でフォームを実行しているときに誰かが例外を取得するかどうかを検証できればいいと思います。

答えて

8

データセットを開いて実行時にルックアップフィールドを追加することはできません。

また、永続フィールドとしてアクセスする必要がある他のフィールドも追加する必要があります。そうしないと、アクセスできなくなります。以下の手順を実行する必要があります。しかし、可能ならば、クエリを使用してテーブルに加わることをお勧めします。これはコーディングが大幅に少なくなり、私の意見ではもっとクリーンです。

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; 
+0

このコードを実行するには、デザインモードで「永続フィールドとしてアクセスする必要がある他のフィールドは何でも」作成する必要がありますか? – Vlad

+0

DataSetを開こうとしたときに、「不明なエラーが発生しました」というメッセージが表示された 'EOleExceptionを取得しました。 – Vlad

+0

すべての永続フィールドを実行時に追加できます。どの部分が例外をスローしていますか、どの行ですか? –

関連する問題