Sortowanie bazy przy pomocy Query

Sortowanie bazy przy pomocy Query
0

Witam !

Szlifuję sobie ten mój projekcik i natrafiłem na kolejny problem. Czytałem już kilka postów na ten temat ale nic z tego. Otóż mam tabelę w bazie którą chcę posortować.

  1. Stworzyłem dodatkowy formularz nazwijmy go form4 i wrzuciłem na niego TTable, TDataSource, TDBGrid i TQuery. Chciałem żeby po kliknięciu w tytuł kolumny w DBGridzie posortowała mi się tabela wg danej kolumny. Na tym forum dotarłem do kodu
Kopiuj
var
     atrybut, wartosc: string;
begin
     atrybut:=Column.Title.Caption;
     if atrybut='imie' then wartosc:='NR_ID';
     if atrybut='LP' then wartosc:='LP';
     if atrybut='IMIĘ' then wartosc:='IMIE';
     if atrybut='nazwisko' then wartosc:='nazwisko';
     if atrybut='DATA URODZENIA' then wartosc:='DATA_UR';
     if atrybut='ADRES' then wartosc:='ADRES';
     if atrybut='TELEFON' then wartosc:='TELEFON';

with IBQuery1, SQL do begin
    Close;
    Clear;
    Add('SELECT * FROM Book ORDER BY '+wartosc+';');
    Open;
end;
end;

i starałem się przerobić to na swoje potrzemy. Przede wszystkim co to jest za komponent IBQuery ja nie mam takiego używam Delphi 5. Ale próbowałem dalej

Wrzuciłem kod

Kopiuj
var
     atrybut, wartosc: string;
begin
     atrybut:=Column.Title.Caption;
     if atrybut='NAZWISKO' then wartosc:='NAZWISKO';

with Query1, SQL do begin
    Close;
    Clear;
    Add('SELECT * FROM temp ORDER BY '+wartosc+';');  //temp to tabela z którą jest połączony Table1 
    Open;
end;
end;

do obsługi zdarzenia DBGrid > OnTitleClick. Program się uruchamia ale przy próbie sortowania wyrzuca jakiś błąd

Kopiuj
Project Uruchom.exe raised exception class EDBEngineError with message 'Invalid use of keyword.
Token:BY
Line number: 1'.Process stopped .Use Step or Run to continue.

może ktoś znajdzie błąd co robię źle??

z góry dzięki

acha przy próbie wpisania zapytania SQLowego do Query1.SQL
"SELECT * FROM temp ORDER BY Nazwisko ;" i zmianie parametru Active z False na True też wywala jakiś błąd

edytowany 1x, ostatnio: cerrato
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0
  1. jakiś błąd to nie jest konkret.
  2. jak masz to wszystko połączone
  3. po co tam jest ttable

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
0

odp 1. w parametrze SQL dla Query1 mam wpisane

Kopiuj
SELECT * FROM temp ORDER BY 'Nazwisko';

a błąd wyświetla mi się taki:

Kopiuj
Unexpekted end of command.
Token
Line number 1.

Odp 2.
Jak mam to wszystko połączone........hmmmmmmmmmm
na formularzu mam obiekt TTable o nazwie Table1 który wskazuje na tabele temp
TDataSource wiadomo połączone z TTable
A TTable jest po to żebym w TDBGrid widział rekordy z tabeli w której mam rekordy (Table1)
TQuery (Query1) wrzuciłem po to żeby sortować TDBGrida i nie wiem jak wykorzystać ten obiekt Query ?

Odp 3.

TTable jest po to żebym widział w TDBGridzie rekordy. I klikając w tytuł kolumny w TDBGridzie sortował tą kolumnę.

0

Witam!

Już wszystko wiem :) a dowiedziałem się stąd
http://www.issi.uz.zgora.pl/stpd/pomoce/bazy_danych_lab6.pdf
polecam i miłej lektury

0

I rzeczywiście TTable jest niepotrzebne :)

TO
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 4 lata
0

Drobna uwaga - to znaczy nie wiem jak jest w IBQuery, ale wiekszosc DataSetów automatycznie zamyka źródło danych jeżeli dasz Clear wiec pisanie Close, a pozniej Clear jest moim zdaniem bez sensu (chyba, że IB rzeczywiście wymaga takiej sekwencji operatji to zwracam honor).

Poza tym ... walenie pełnego zapytania SELECT * FROm tabela tylko dla posortowania elementów ... to przepraszam, ale jest to fuszerka.

Spróbuj odpalić ten soft po wolnym łączu, nawal do tej tabeli np. milion rekordów i posadź przed tym zwykłego użytkownika - gwarantuje ci, że po 5 minutach dostaniesz monitorem w głowe ;)

Lepiej poszukaj komponentu Gridowego (jest ich masa), który robi sortowanie DataSeta po stronie klienta.

Poza tym. Nie da sie do jednego Grida podpiac dwoch DataSetów - zamien TTable na TQuery - to przynajmniej jako tako będzie ci to działać (w sensie wypierdziel TTable i używaj tylko TQuery). Zreszta - Ja w swoich programach stosuję tylko TQuery lub podobne innych dostawców (TMyQuery czy TZQuery) - TTable jest wygodne średnio.

pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

Można też po prostu tak: ADOTable1.Sort: = 'Year DESC, ArticleDate ASC';
Year, ArticleDate - nazwy pól w tabeli

Sort: = Column.Field.FieldName; // + ' ASC' lub ' DESC'

Do prostych zapytań SQL typu SELECT * FROM DBNAME ORDER BY 'AAA' / itp


Piotr Strzemkowski
edytowany 3x, ostatnio: pstmax
flowCRANE
Ten wątek ma 11 lat — naprawdę myślałeś, że był sens go odkopywać? :|
UglyMan
A może akurat jeszcze OP szuka rozwiazania.
pstmax
Może będzie strona, która pokaże jak zmieniały się rozwiązania w danym narzędziu...
flowCRANE
@pstmax: wątki na forum to nie kompendium wiedzy i nie SO — w nich się dyskutuje, a nie wymienia rozwiązania. Ta dyskusja zakończyła się dawno temu, a odpowiadając w niej, sugerujesz, że trwa dalej. Poza tym odpowiadanie w wątkach generuje powiadomienia itp., dlatego lepiej, aby stare wątki zostały stare. Natomiast jeśli chcesz porozmawiać na temat swojego rozwiązania, to śmiało możesz założyć swój wątek i dyskutować, wymieniać się wiedzą i kodem — nie ma problemu.
pstmax
  • Rejestracja:ponad 18 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Reda
  • Postów:68
0

@pstmax: Mówiąc tak dosadnie i brutalnie - Co roku nasze Uczelnie "produkują" następne roczniki PROGRAMISTÓW. Przy naszym "polskim charakterze narodowym" czyli "cwaniakuj", ale nie pomagaj innym - myślę, że warto aby była strona, choćby jedna, która będzie miała zbiór wielu różnoletnich rozwiązań.


Piotr Strzemkowski
Zobacz pozostałe 6 komentarzy
szatkus
Po co komu Pascal, gdy jest JavaScript?
flowCRANE
@PrzemysławWiśniewski: co z tego, że taki produkt istnieje (tak jak Delphi), skoro znacznie bardziej popularne są inne technologie? To jest główny problem Pascali — mało kto wybiera je do nowych projektów.
flowCRANE
@szatkus: nie dowcipkuj. :D
robertz68
c++ idzie w odstawkę? A to dobre :). Co do Delphi, ma ono swoje miejsce i jeszcze trochę będzie miało. Wg. mnie dzisiaj jest to idealne środowisko do prototypowania, może inaczej, do pisania aplikacji "na wczoraj". Jako przykład podam: w poniedziałek wieczorem dostałem zlecenie na prostą aplikację udającą tzw. potykacz na chodniku do restauracji. Jako że restauracjom teraz ciężko postanowiłem pomóc. We wtorek około 9.00 rozpocząłem prace. W południe wszystko było gotowe. Zarządzanie z prostą bazą, technologia VCL, komunikacja TCP, Klient w FMX aby coś tam zaanimować.
szatkus
@robertz68: czemu ludzie piszący w Delphi zachowują się jakby żyli w 2000 roku? O ile nie mogę się nie zgodzić, że dostając projekt do zrobienia to najszybciej zrobimy go w technologii, którą znamy to obiektywnie patrząc Delphi nie ma niczego do zaoferowania w dzisiejszych czasach. Język nie jest nawet zarządzany, ani nie ma REPL, do tego ma słaby ekosystem oparty na ściąganiu plików z netu. Składnia jest dosyć przyjemna, ale obecnie jest taki wybór, że nawet tutaj się niczym nie wyróżnia.
WL
  • Rejestracja:ponad 21 lat
  • Ostatnio:27 dni
  • Postów:1083
2

@pstmax:

pstmax napisał(a):

Można też po prostu tak: ADOTable1.Sort: = 'Year DESC, ArticleDate ASC';

No nie do końca można.
To zadziała tylko w ADO i tylko pod warunkiem, że zostanie ustawiony kursor po stronie klienta (a to ma kolejne ciekawe implikacje); podobnie da się to zrealizować również w FireDAC i np. W FIBPLus czy UniDAC, ale na pewno nie w IBX a tego OP używał...

Poza tym, sortowanie w ten sposób wymaga pobrania wszystkich danych z serwera na klienta (dla ADO na pewno, a dla innych bibliotek - bywa różnie) i posortowanie ich na kliencie.
Żadnego order by serwer bazy danych nie wykona, za to wyśle wszystkie dane do klienta aby sobie to posortował.
Zgadnij jak "super" to zadziała ze sporymi zestawami danych?
Ile pamięci to zajmie?
Już widziałem specjalistów, którzy działając w ten sposób wyssali całą pamięć dostępną dla programu.
I o ile to "jakoś" działa w sieci lokalnej, to przy słabszym połączeniu... No nie.

Year, ArticleDate - nazwy pól w tabeli

Sort: = Column.Field.FieldName; // + ' ASC' lub ' DESC'

Do prostych zapytań SQL typu SELECT * FROM DBNAME ORDER BY 'AAA' / itp

Raczej dokładnie odwrotnie... Ale, tu nie ma jednej reguły - to zależy.

pstmax
Dziękuję za informacje, bardzo przydatne. Mała sugestia z mojej strony: Jeżeli ja lub ktoś inny przytacza "przestarzałe" rozwiązanie warto wskazać coś nowego co się teraz stosuje. Jeszcze raz dziękuję.
pstmax
Dziękuję bardzo za komentarze, niektóre są interesujące. Dla mnie, który programuje amatorsko, hobbistycznie praca z bazą danych to poznanie i nauka jak to działa, jak z tego korzystać. Z chęcią poznam dobre praktyki jakie powinno się wykorzystać szczególnie z podziałem na amatorskie/domowe i firmowe/duże. Nawyki, to zła rzecz :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.