2012-10-25 21 views
7

Używając jednego TADOQuery I wyciągnąć rekordy z dwóch różnych tabel za pomocą lewe sprzężenie zewnętrzne:TADOQuery Dołącz tabele - Insert Usuń rekordy od wyniku

Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier 

używam TDBGrid z powodzeniem po aktualizacji pola do mojego MSSQL DB .

Ponieważ istnieje odniesienie klucz obcy (FK_Courier_Identifier z Courier_Identifier) pojawia się błąd, kiedy wstawić rekord,

nie można wstawić wartość null w kolumnie „FK_Courier_Identifier”, stół Courier_VT; kolumna nie zezwala na wartości null

ale płyta jest zamieszczona w tabeli Courier, wiem, że muszę przypisać do FK_Courier_IdentifierCourier_Identifier przed wysłaniem, ale nie jak i gdzie to zrobić

Jak zrobić wstawiamy \ Usunąć rekordy w tym scenariuszu? Czy można osiągnąć przy użyciu pojedynczego TADOQuery?

+3

Możesz użyć własności dynamicznej ADO "Unikalna tabela". możliwy duplikat [tutaj] (http://stackoverflow.com/questions/7981718/adodataset-deleting-z-joined-table). jednak nie jestem pewien, czy część 'Insert' \' Update' będzie działać (nie mogę tego teraz zweryfikować). I uważam, że musisz podać 'FK_Courier_Identifier' na' BeforePost'. – kobik

Odpowiedz

1

AFAIK TADOQuery nie może obsłużyć instrukcji wstawiania/usuwania/aktualizacji w przypadku łączenia wielu tabel. Powodem jest to, że nie wie, która tabela ma zaktualizować lub jak to zrobić.

Typowe podejście z innymi komponentami dostępu do baz danych polega na podaniu właściwości dla każdego typu zdania DML (ODAC components są jednym z przykładów) lub trzeba dodać drugi komponent "update SQL" powiązany z zapytaniem, który będzie zawierał Zdania DML (Zeos to jeden z przykładów komponentów wykorzystujących to podejście).

Powiedział, że prawdopodobnie najlepiej będzie użyć procedur obsługi zdarzeń BeforeDelete i BeforePost w celu leczenia scenariusza. Zasadniczo użyjesz ich do wydania zdania DML, wykonania go z jakimś storedProc lub komponentu sql, a następnie przerwania obsługi zdarzenia. Sprawdź akceptowaną odpowiedź na tę SO question, aby uzyskać więcej informacji i próbkę kodu.


EDIT: jeśli kod może obsługiwać aktualizacje i usuwa jak mówisz w swoim komentarzu, to problem leży tylko z przydzieleniem FK_Courier_Identifier na wstawienie (powinien bardziej uważnie przeczytać pytanie .. .), które można rozwiązać za pomocą obsługi zdarzeń OnBeforePost:

procedure TMyForm.MyADOQueryBeforePost(Sender: TObject); 
begin 
    MyADOQuery.FieldByName('FK_Courier_Identifier').AsString := CourierId; 
end; 

oczywiście, trzeba będzie dostosować ten kod, ponieważ jestem tutaj zakładając pole jest varchar i że wiesz, przed włożeniem w baza danych wartość ID Courier.

HTH

+0

ADOQuery jest w stanie obsłużyć update \ delete, ale nie wstawić, szukam w linkach dziękuję! – user1775091

+0

Edytowałem swoją odpowiedź po przeczytaniu Twojego komentarza. Mam nadzieję, że pomaga teraz lepiej! –