dbExpress locate na ostatnio dodany rekord

0

Mam mały problem w systemie, który piszę. Wcześniej pisałem go za pomocą komponentów BDE, a teraz stopniowo zmieniam je na dbExpress.

Bardzo często pobieram dane z jakiejś tabelki i wpisuję do drugiej. Przykładowo w cenniku mam przycisk "dodaj z bazy produktów", po kliknięciu w niego pojawia się ta baza produktów (tabelka t_produkty). Klikam w któryś z wierszy i ma mi zrobić appenda w cenniku (tabelka t_cennik). Na ekranie nie wyświetla się jednak tabelka t_cennik, a widok (query) q_cennik, więc trzeba zrobić locate, aby kursor ustawił się na tym ostatnio dodanym wierszu. Na BDE wszystko ładnie działało:

  if gdzie_wkleic_produkt = 'cennik' then
  begin
    t_cennik.Append;
    t_cennik['id'] := t_produkty['id'];
    t_cennik.Post;
    q_cennik.locate('poz', t_cennik['poz'], []);
    TN_main.ActivePage := 'Cenniki';
  end;

Po przerobieniu tego na dbExpress, locate przestał działać tak, jak powinien. Komponenty TTable i TQuery musiałem zmienić na TSQLDataSet, TDataSetProvider i TClientDataSet. Niestety komponent TClientDataSet nie odświeża się od razu po wywołaniu metody "Post". W efekcie po niej pole "poz" w tabeli cds_t_cennik ma wartość taką, jaka była przed wywołaniem metody "Post", no i locate wskazuje nie na tą pozycję w widoku, na którą powinien.

  if gdzie_wkleic_produkt = 'cennik' then
  begin
    cds_t_cennik.Append;
    cds_t_cennik['id'] := cds_t_produkty['id'];
    cds_t_cennik.Post;
    cds_q_cennik.locate('poz', cds_t_cennik['poz'], []);
    TN_main.ActivePage := 'Cenniki';
  end;

Ma ktoś jakiś pomysł na rozwiązanie tego problemu? Od razu mówię, że metoda cds_q_cennik.Last odpada, bo ten widok cds_q_cennik może być posortowany np. po nazwie i ostatnim wierszem nie będzie ten ostatnio dodany, a ten który ma nazwę np. na "ż".

0

Przy bazach SQL i wielodostępie locate bym nie używał. Po prost wybierałbym żądany rekord poprzez osobne zapytanie SQL z danym kluczem rekordu, przy tym należy sprawdzać czy rekord istnieje i ma niezmienioną wartość a przed zapisem to samo sprawdzać (bo na innej końcówce mógł ktoś go zmienić). Jednym ze sposobów tego sprawdzenia jest dodanie dodatkowego pola "lock" i zwiększanie jego wartości po każdej zmianie rekordu. Do edycji rekordu odczytujemy lock a w transakcji, przed zapisem, odczytujemy go ponownie i jeśli ma inną wartość niż ta do edycji, to blokujemy zapis (bo ktoś zmienił rekord na innej końcówce).

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