Query SELECT nie działa prawidłowo.. albo ja coś spaprałem

0

Witam wszystkich jako że to mój pierwszy post.
Do wszystkich znawców mam pytanie (bo już mnie szlag trafia).
Mam formularz, a na nim TreeView i 2 x DBGrid i teraz po kolei:

  • pozycje TreeView tworzone są na podstawie danych z bazy danych - DZIAŁA
  • po wybraniu wpisu w TreeView uzupełnia się pierwszy DBGrid (pokazane są szczegóły dla wybranego rekordu) - DZIAŁA
  • ten DBGrid posiada też PopMenu i opcję "Zapamiętaj". Ma on na celu dodanie wskazanego rekordu z Grida to odzdzielnej tabeli - i tu jest problem..... bo drugi DBGrid ma wyświetlać dane właśnie z tej tabeli i za cholere nie mogę go odświeżyć.

Teraz o samej bazie i połączeniu z nią. Pracuje z fb_embedded. Mam IBConnection oraz transakcję domyślną do obsługi SELECT-ów. Mam dodatkowo jeszcze dwie transakcje. Jedna zarezerwowana jest dla updatu bazy wykonywanej w tle. Druga jest własnie do operowania wyżej wymienionym INSERT-em z pierwszego DBGrida.

Niestety nie chce to działać. Zauważyłem, że po wybraniu "Zapamiętaj", rekord zostaje zapisany, DBGrid się przeładowuje, ale Query który jest źródłem dla Grida nie widzi świeżo dodanego rekordu (dopiero po zamknięciu formularza i otwarci go ponownie jest on widoczny).
Transakcje zatwierdzem i kończe po dodaniu nowego rekordu. Query zamykam i otwieram ponownie (refresh też nie działa), ale ono zwraca zestaw rekordów przed INSERT-em.
Raz przy kombinowaniu z transakcjami udało się wyświetlić rekord, ale okazało się, że nie został zapisany w bazie i po ponownym otwarciu formularzu nie był widoczny.

Nie mam już pomysłow, pomóżcie (Misiekd może ty na coś wpadniesz).
Mam nadzieje że jasno opisałem problem.

0

Przy readcommited muszisz też zakończyć i rozpocząć transakcję do selecta w drugim gridzie, inaczej tego nie będziesz widział.

0

Dzięki bobik, ale niestety qpa. Ale...
Zrobiłem coś takiego (nie mówie, że jest to dobre rozwiązanie, ale działa):
Transakcja1 - domyslna;
Transakcja2 - dla inserta;
Query - do wyswietlania danych
i teraz

Query ma domyslnie ustawione Transakcja1. Klikam "Zapamietaj" i
Query.Close
Zmiana transakcji Query na Transakcja2.
Insert
Commit
Transakcja2.Close
Transakcja1.Close
Transakcja1.Open
Zmiana transakcji Query na Transakcja1.
SELECT
i widzę wszystkie rekordy.

Tyle , że jak na to patrze to jest kur... bez sensu. Pomijam fakt, ze po zamknieciu Transakcji1 musze otworzyc zrodlo dla wczesniejszego Grida (tego ze szczegółami).

Powinno działac tak:
Dodatkowe Query dla Inserta z domsylna Transakcją2.
Otwieram Transakcja2
Robię INSERT-a
Commit
Zamykam Transakcje2
Zamykam Transakcje1
Otwieram Transakcje1
Otwieram Query dla SELECT-a i wszycho

No ale nie chce śmigać

0
armar napisał(a)

...
Powinno działac tak:
Dodatkowe Query dla Inserta z domsylna Transakcją2.
Otwieram Transakcja2
Robię INSERT-a
Commit
Zamykam Transakcje2
Zamykam Transakcje1
Otwieram Transakcje1
Otwieram Query dla SELECT-a i wszycho...

A czym się różni Commit od zamykania ? Pytanie czy do insert'a i selecta nie możesz mieć tej samej transakcji ? Moja wersja :

QI.Transaction.StartTransaction
..
QI.Post
..
QI.Transaction.CommitTransaction

QS.Close;
QS.Transaction.Commit;
QS.Transaction.StartTransaction;
QS.Open;

Poza tym sprawdzaj sobie przy starttransaction, czy jesteś w ogóle InTransaction, może gdzieś rozpoczynasz transakcje niejawnie.

0

2 razy na ibtransaction i ustaw read_commited.

Przy readcommited muszisz też zakończyć i rozpocząć transakcję do selecta w drugim gridzie, inaczej tego nie będziesz widział.
nieprawda

0
Misiekd napisał(a)

nieprawda

Racja, moja teoria tyczyła się poziomu izolowania SNAPSHOT - ale to przez pośpieech : )

0

Ooooo jest mój Guru. A Misiek możesz wyjaśnic czemu "nieprawda"?. Jak nie zamykałem domyślnej to nic się nie chciało odświeżać.

Ok więc zrobiłem tak:
Jako, że nie chciałem niczego mieszać w domyślnej dodałem dodatkową transakcje.
Jest ona ustawiona dla tego właśnie SELECT - a i read_commited (jako, że piszę w Lazarusie musiałem jej to ustawić przez Params).
Rozpoczynam transakcje i wyświetlam dane.
Robię INSERT (odzielne query i oddzielna transakcja), commit, zamykam transakcje dla SELECT-a i otwieram ponownie, otwieram Query SELECt-a i nic , dalej nie widzę dodanego rekordu.

Wiem, że marudze i zgadzam się z wami ze tak to powinno działac (mniej więcej) ale nie chce. Wygląda tak jakby wszystkie operacje dotyczące danej tabeli muszą być wykonane przez jedno Query. Wiem, głupota.

0
armar napisał(a)

...Jak nie zamykałem domyślnej to nic się nie chciało odświeżać...

Głowy nie dam ale jeśli nie ustawisz żadnego poziomu izolowania transakcji, to przynajmniej IBX'y zachowują się tak jakbyś ustawił SNAPSHOT - czyli widzisz bazę zawsze taką jak przy rozpoczynaniu transakcji.

0

Dobra już sobie poradziłem. Problem był z izolowaniem, a dokładniej z parametrami. Po prostu w Lazarusie parametry odpowiedzialne za ustawienie read_committed są inne niż w Delphi. No ale w końcu znalazłem te prawidłowe i teraz wszystko działa tak jak chciałem.
Dzięki wszystkim za pomoc.

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