ADO - 2 lookupy na gridzie generują wyjątek

0

Delphi 5, Oracle 12c

Na formie kładę kompomenty: TADOConnection, 3 x TADOQuery, TDataSource, TDBGrid, TButton.
1 TADOQuery służy do zapytania głównego którego wynik ma być wyświetlany ( i modyfikowany ) w TDBGrid. Załóżmy dla prostoty takie maleństwo:

select id, kolumna1, kolumna2 from tabela

kolumna1 i kolumna2 to wartości kluczowe do innej tabeli ( słownik przeróżności, typu statusy itd )
2 pozostałe TADOQuery służą do zapytań pobierających dane z tego słownika przeróżności ( na potrzeby Lookup'ów w gridzie )

Łączę te komponenty ze sobą: ADOconnection--> ADOquery --> dataSource --> grid
plus
te 2 dodatkowe query łączę z ADOconnection

Pod przyciskiem dodaję tylko 1 linijkę:

ADOquery1.Insert;

Ustawiam wszystkim query Active na True. Na liście kolumn ADOquery1 dodaję kolumnę lookup_kolumna1 i lookup_kolumna2 którym KeyField ustawiam jako kolumna1 i kolumna2 a LookupKeyField i LookupResulField zgodnie z kolumnami z tych lookupowych SQLek i dodaję te 2 nowe kolumny lookupwe do grida. Czyli jakby prawidłowo.

Uruchamiam aplikację, wciskam przycisk ( czyli robię ADOquery1.Insert ) i na gridzie pojawia się pusty wiersz. I w tym pustym wierszu po wpisaniu danych do jakiejkolwiek kolumny dostaję komunikat

Project1.exe raised exception class EOLEException with message "Wystąpił nieznany błąd" Process stopped. Use Step or Run to continue.

Wystarczy, że z listy pól TADOquery1 i grida usunę któregokolwiek lookup'a a wszystko działa jak należy.
Gdzieś coś popełniam nie tak i nie mogę się tego dopatrzeć. Pomocy bo ładnych kilka godzin już przy tym spędziłem próbując przeróżne dziwy i nic.

0

Na wstępie nie używaj ADO tylko np darmowego ZeosLib dlaczego ... otóż problem jest taki, że robiąc edycję z grida i wywołując insert nie masz kontroli nad zapytaniem "aktualizującym"/"dodającym" rekord. W zeosach masz dodatkowy komponent o nazwie TZUpdateSQL gdzie wpisujesz sobie całą składnię zapytania czyli

inser into tabela (...,...) values (...,...)

Dzięki temu wykonując metodę post wykona się zapytanie jakie potrzebujesz, a nie to co ADO sobie samo wygenerowało.
Co do samego problemu to przypuszczam, że właśnie te lookupy powodują że wygenerowany insert do tabeli jest nieprawidłowy i baza danych rzuca Ci wyjątkiem. Przykładowo jeśli twoja tabela wygląda tak jak napisałeś:
Tabela(ID,FK_DoInnejTabeli) gdzie oba pola są typu INT to lookup może powodować, że insert wygląda tak:

insert into tabela (id, FK_DoInnejTabeli) values (1281,'String ze słownika zamiast IDka') 

i baza zwraca exception, który jest w taki a nie inny sposób interpretowany przez ADO. Problemem może być również to, że źle podpiąłeś kolumny bo teorytycznie jeśli masz rekord i chcesz z combo wybierać wartości słownikowe to do głównego query musisz dopisać ich ID ... ciężko powiedzieć bo musiałbym wiedzieć co dokładnie zwraca Ci baza danych. Najlepiej jakimś profilerem zobaczyć jakie zapytanie leci do bazy.

0

Przepraszam, zapomniałem napisać, że profiler uruchamiałem, ale nie zwracał nic. I w sumie prawidłowo, bo jeśli jest się w ramach tej pustej lini ( wywołanej metodą Insert ) w gridzie, to zapytanie jeszcze siedzi w buforze, aby poszło do bazy to trzeba przejść do innej lini albo ręcznie uruchomić Post. Czego ja jeszcze nie robiłem, to się dzieje jeszcze na etapie jakby budowania zapytania przez ADO, jakby coś mu nie pasowało i wywalał się. Szkoda tylko, że z informacją "nieznany błąd".
Ale zupełnym przypadkiem uruchomiłem exe nie z poziomu środowiska Delphi a po prostu z systemu operacyjnego i kurcze wszystko gra. No to już zupełnie nie kapuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1