2012-01-30 5 views
6

Używam TADODataSet (D7).
Nie tworzę trwałych pól w trybie projektowania z moim DataSet.Jak utworzyć pole wyszukiwania TDataSet w czasie wykonywania?

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

Gdybym kliknij dwukrotnie dsItems i „Dodaj wszystkie fileds”, a następnie kliknąć przycisk „Nowy złożony” i zdefiniować wyszukiwanie moje pole, wszystko działa bez zarzutu. Powstały dsItems powinien zawierać: ID, ItemName, UserIDCreate, LoginName_Lookup

Jak mogę uniknąć robi to wszystko w czasie projektowania i dodać Lookup polu po/lub przed (nie wiem?) DataSet jest otwarty.

Innymi słowy: Jak mogę naśladować „Dodaj wszystkie fileds” a następnie „New złożone” dodanie odnośnika złożonej w czasie wykonywania?


UWAGA: uzyskać wyjątek, gdy uruchomiony Jana kod z IDE. Wyjątek występuje podczas próby otwarcia DataSet: EOleException with message 'An unknown error has occured'.

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

jestem przyjmując odpowiedź na becouse przestrzegane programu działa.
Byłoby miło, gdyby ktoś mógł zweryfikować otrzymywanie (lub nie) wyjątku podczas uruchamiania formularza wewnątrz IDE.

Odpowiedz

8

Zbiór danych nie może być otwarty, aby dodać pola odnośnika przy starcie.

Będziesz również dodać cokolwiek innego pola trzeba przejść, a także uporczywe pola, w przeciwnym razie będą one niedostępne. Poniższe procedury powinny działać. Zalecam jednak, jeśli możesz, korzystanie z zapytań i dołączanie do tabel - jest to o wiele mniej kodowania i znacznie czystsze w mojej opinii.

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

Czy to znaczy, że najpierw trzeba stworzyć „cokolwiek innego pola trzeba przejść jak uporczywe pól” w trybie projektowania, aby uruchomić ten kod? – Vlad

+0

Otrzymuję 'EOleException z komunikatem 'Wystąpił nieznany błąd' podczas próby otwarcia DataSet. – Vlad

+0

Możesz dodać wszystkie trwałe pola w czasie wykonywania. Która część rzuca wyjątek i która linia? –