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
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 :] )
Bobik, jest takie coś jak bookmark :]
Ale konkretne rozwiązanie rzeczywiście zależy od użytych kontrolek.
z DBGridem użyłem DBEdit-ów oraz LookupComboBox. są one powiązane ze sobą...
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ę)
b0bik napisał(a)
(pewnie BookmarkIsValid czy coś w tą mańkę)
No i sam sobie odpowiedziałeś :]
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.
"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...
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...
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.
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ń)
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ć.
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.
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.
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ć.
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.
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źć :]
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? :]
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
OK, jasne, użyłem nadmiernego skrótu myślowego :) Tak czy siak Bookmark zostanie prawidłowy, bo rekord nie zniknie :>
Daruje sobie odpowiedź, bo nie sięgam Twojego poziomu.
Pozdrawiam