DBGrid zaznaczanie wybranego wiersza po edycji

0

jak zrobić, żeby po edytowaniu jakiegoś rekordu z bazy zaznaczenie widniało dalej na tym rekordzie? i to samo chce zrobić po dodaniu rekordu - żeby kursor wskazywał właśnie na ten rekord
za wszelką pomoc z góry dziękuje

0

Zależy jak to wszystko robisz. Jeśli edycja odbywa się na zasadzie: wyświetlenie modalnego okna z danymi rekordu, zapisanie zmian, zamknięcie okna i odświeżenie danych w DBGridzie, to prosto można to zrobić zapisując ID rekordu przed odświeżeniem, a po odświeżeniu spróbować go zlokalizować np przy użyciu Locate. Przy dodawaniu można postąpić analogicznie.

Aha taki Locate będzie się źle sprawdzał, jeśli w gridzie są setki tysiący rekordów ; ]

Jeśli edytujesz dane w gridzie, to trzeba by ID rekordu zapisać w trakcie wystąpienia jakiegoś zdarzenia (ale podejrzewam że wtedy byś nie pytał bo kursor się ustawia sam :] )

0

Bobik, jest takie coś jak bookmark :]
Ale konkretne rozwiązanie rzeczywiście zależy od użytych kontrolek.

0

z DBGridem użyłem DBEdit-ów oraz LookupComboBox. są one powiązane ze sobą...

0
TBSO napisał(a)

Bobik, jest takie coś jak bookmark :]

Nie chce mi się sprawdzać, ale czy bookmark na pewno zadziała po zamknięciu i otwarciu zapytania ? Bo z tego co mi się wydaje to nie bardzo. Zresztą, nie trudno sobie wyobrazić sytuację że przy kolejnym odświeżeniu danych ten czy inny rekord znikł - bo np edycja zmieniła wartość pola występującego w WHERE i co wtedy z tym bookmarkiem ? (pewnie BookmarkIsValid czy coś w tą mańkę)

0
b0bik napisał(a)

(pewnie BookmarkIsValid czy coś w tą mańkę)

No i sam sobie odpowiedziałeś :]

0

Ja sobie odpowiedziałem bo znałem odpowiedź, ale Ty sobie spróbuj odpowiedzieć czy udzieliłeś poprawnej odpowiedzi dla milosz28 czy też nie.

Stwierdzić:

TBSO napisał(a)

Bobik, jest takie coś jak bookmark :]

jest łatwo lecz sprawdzić coś zanim się napisze jest równie łatwo.

Prosty przykład:

otwarte zapytanko
zapisujemy bookmark
modyfikujemy rekord
odświeżamy zapytanko (Close, Open) (w między czasie coś się zmieniło i wyświetla się o jeden rekord mniej, ten dla którego zapisaliśmy bookmark oczywiście został).
BookmarkIsValid zwraca True - ale gwarancji że jesteś na tym samym rekordzie nie masz żadnej.

Następnym razem radzę się zastanowić zanim napisze się posta.

0

"W międzyczasie coś się zmieniło"

A, to ja przepraszam, nie wiedziałem, że rozmawiamy nie o tworzeniu prostych programów a o Wyższym Kursie Zmieniania Się Czegoś W Serwerach SQL.

Na podobnej zasadzie jestem w stanie wysadzić w powietrze 95% programów i wyśmiać 99% Twoich wypowiedzi tu na forum - jak często bierzesz w nich pod uwagę to, że inny proces/wątek może zmodyfikować ci dane? Wolne żarty...

0

P.S.
Zanim zaczniesz bić znowu pianę - proponuję zastanowić się, skoro TBookmark to taki niedoskonały mechanizm - na psi [---] w ogóle go wprowadzono? Przecież w międzyczasie może coś zniknąć, żeby zacytować Miszcza...

0

Zgadzam się. Bookmark jest lepszym rozwiązaniem niż zapisywanie ID i później Locate. Bookmarka sam używam i nie mam z nim problemów.

0

dziękuje wszystkim za żywą dyskusję... spróbuje się więc nauczyć używać bookmarka (bo dotąd jeszcze nie używałem)... a tak nawiasem pisząc: nie ma możliwości, żeby rekord zmienił wartość ID, bo nie dopuszczam możliwości modyfikacji ID. W programie jest jedynie opcja Dodaj/Edytuj, ale jak już napisałem, bez możliwości zmiany ID. Usuwanie rekordu będzie możliwe jedynie wtedy, gdy nie będzie on powiązany w żaden sposób z innymi tabelami (choć nie wiem, czy w ogóle będzie opcja Usuń)

0

Bić piany nie zamierzam bo widzę że i tak nie zrozumiesz o co mi chodzi.

TBSO napisał(a)

"W międzyczasie coś się zmieniło"
A, to ja przepraszam, nie wiedziałem, że rozmawiamy nie o tworzeniu prostych programów a o Wyższym Kursie Zmieniania Się Czegoś W Serwerach SQL.

Nie czegoś tylko danych człowieku. Koleś pyta o bazę DANYCH a te mogą być modyfikowane - obudź się.

TBSO napisał(a)

Na podobnej zasadzie jestem w stanie wysadzić w powietrze 95% programów i wyśmiać 99% Twoich wypowiedzi tu na forum - jak często bierzesz w nich pod uwagę to, że inny proces/wątek może zmodyfikować ci dane? Wolne żarty...

To że potrafisz wyśmiać to już wiem. Wiem też że nie potrafisz zrozumieć prostej rzeczy. Nie biorę pod uwagę że inny proces/wątek zmodyfikuje dane (zresztą rozwiązanie z Locate zadziała i w tym przypadku, Bookmark nie), tylko że dane zmodyfikuje inny użytkownik bazy. Jeśli dla Ciebie wolnymi żartami jest to że dwa kolejne zapytania do bazy zwracają różny wynik - to nie mamy o czym mówić.

0
Juhas napisał(a)

Zgadzam się. Bookmark jest lepszym rozwiązaniem niż zapisywanie ID i później Locate. Bookmarka sam używam i nie mam z nim problemów.

Nie stwierdzam bynajmniej wyższości Locate nad TBookmark. Twierdzę tylko że to drugie nie zawsze zadziała.

0
milosz28 napisał(a)

dziękuje wszystkim za żywą dyskusję... spróbuje się więc nauczyć używać bookmarka (bo dotąd jeszcze nie używałem)... a tak nawiasem pisząc: nie ma możliwości, żeby rekord zmienił wartość ID, bo nie dopuszczam możliwości modyfikacji ID. W programie jest jedynie opcja Dodaj/Edytuj, ale jak już napisałem, bez możliwości zmiany ID. Usuwanie rekordu będzie możliwe jedynie wtedy, gdy nie będzie on powiązany w żaden sposób z innymi tabelami (choć nie wiem, czy w ogóle będzie opcja Usuń)

Nie koniecznie musi zmienić się ID aby TBookmark nie zadziałał. Prosty przykład:

Jest sobie formatka, na niej DBGrid a w nim wyświetlone wyniki zapytania:

SELECT * FROM OSOBY WHERE IMIE LIKE 'OLEK%'

Ustawiasz się na jakimś rekordzie zapisujesz bookmark (do poźniejszego użycia) i klikasz edytuj. Wyświetla Ci się okienko w którym modyfikujesz rekord. W tym czasie (wcale nie jakimś mierzonym w milisekundach) ktoś inny edytuje inny rekord zmieniając IMIE z OLEK na ALEK. Ty skonczyłeś edytować, zapisujesz zmiany. Otwierasz ponownie zapytanie i odpalasz GotoBookmark (oczywiście poprzedzając to kontrolą czy BookmarkIsValid) i co ? jajco - zaznaczony zostaje inny rekord. To jest oczywiście przypadek szczególny. Istnieją jeszcze dwa: 1. uda się zaznaczyć właściwy rekord, 2. BookmarkIsValid zwróci False, bo zmieniłeś imie na NOT LIKE 'OLEK'. Tyle filozofii.
Rozwiązanie o którym pisałem, zapisuje ID (które u Ciebie (zresztą nie tylko) się nie zmienia) a po edycji zamiast BookmarkIsValid i GotoBookmar robisz Locate('ID', ID ...). Wiadomo że jeśli twojego rekordu nie będzie na liście to nie zostanie on zaznaczony. Jest jednak inna różnica dla mnie podstawowa - jeśli w między czasie zmieni się rezultat zwrócony przez Query - to nie zostanie zaznaczony niewłaściwy rekord.

0
TBSO napisał(a)

skoro TBookmark to taki niedoskonały mechanizm - na psi [---] w ogóle go wprowadzono?

A jeszcze Ci odpowiem, żebyś wiedział na przyszłość. Bookmark jest po to, że jak robisz coś na datasecie iterując po jego kolejnych wierszach. To po zakończonej operacji mozesz sobie z Bookmark'a skorzystać.

0

A ja już wiem (nie od dzisiaj, spokojna twoja rozczochrana) że czepiasz się detali idąc w zaparte. Nie pomyślałeś o zastosowaniu TBookmark? Nie pomyślałeś. Zacząłeś wyciągać sytuacje, w których nie zadziała, zamiast powiedzieć człowiekowi co ma zrobić żeby się zabezpieczyć? Zacząłeś. Klasyczne bicie piany przez [---], z drobnego własnego przeoczenia zrobiłeś wielki problem i bicie piany, przed którym cię przestrzegałem. Stosuj sobie dalej swoje locate, powodzenia ;]

Gdybyś dalej nie rozumiał (a są na to wielkie szanse) to mój post nie był podaniem ROZWIĄZANIA, rzadko to robię - był po prostu podrzuceniem koledze kierunku, w którym może pójść żeby przy okazji czegoś się nauczyć. Twoje uniesienie się honorem w związku z tym jest jeszcze śmieszniejsze niż zazwyczaj.

0
b0bik napisał(a)

A jeszcze Ci odpowiem, żebyś wiedział na przyszłość. Bookmark jest po to, że jak robisz coś na datasecie iterując po jego kolejnych wierszach. To po zakończonej operacji mozesz sobie z Bookmark'a skorzystać.

MISZCZU!!!! A podczas iteracji datasetu też nie możesz nic zmienić?? Czyżby istniały wyjątki od twojej reguły??

Żebyś wiedział na przyszłość - jak będę potrzebował wiedzy, zwrócę się do mądrzejszych już nawet nie od ciebie, tylko od siebie. A przynajmniej do takich z mniejszym ego niż twoje - na pewno będzie łatwo ich znaleźć :]

0
b0bik napisał(a)

po edycji zamiast BookmarkIsValid i GotoBookmar robisz Locate('ID', ID ...). Wiadomo że jeśli twojego rekordu nie będzie na liście to nie zostanie on zaznaczony. Jest jednak inna różnica dla mnie podstawowa - jeśli w między czasie zmieni się rezultat zwrócony przez Query - to nie zostanie zaznaczony niewłaściwy rekord.

Miszcz niewątpliwie napisał wiele baz danych w życiu, zapewne kilka nawet takich, które miały więcej niż tysiąc rekordów. Miszcz jednak nie umie czytać ze zrozumieniem i nie zauważył że była mowa o tym, że dane nie będą zmieniane. Poza tym miszcz ze znanych tylko sobie powodów wymyślił, że dataseta należy zamykać i ponownie otwierać. Gdzie jest kolejka do ucałowania sygnetu miszcza? :]

0

burzliwa to dyskusja ale owocna... przy okazji można się dowiedzieć o wadach i zaletach obu rozwiązań, aczkolwiek

TBSO napisał(a)

Miszcz jednak nie umie czytać ze zrozumieniem i nie zauważył że była mowa o tym, że dane nie będą zmieniane

nie będzie zmieniane jedynie ID... dopuszczenie kilku transakcji w jednym czasie jest możliwe... czyli dane można edytować, ale nie można zmieniać wartości ID (żeby się baza nie posypała), bo korzystać z programu będzie kilka działów... ale poznać warto oba rozwiązania... oba na pewno można wykorzystać jeszcze w innych zadaniach.
dziękuję i pozdrawiam

0

OK, jasne, użyłem nadmiernego skrótu myślowego :) Tak czy siak Bookmark zostanie prawidłowy, bo rekord nie zniknie :>

0

Daruje sobie odpowiedź, bo nie sięgam Twojego poziomu.

Pozdrawiam

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