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 "ż".