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:ponad 12 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:prawie 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:około 2 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:około 2 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
szatkus
Jak ktoś idzie na uczelnię, gdzie uczą Delphi to ma dużo większy problem.
pstmax
Tak, wiem... "C++" itp itd - tam w kodzie można "burdel robić", a potem zarabiać na aktualizacjach (i już wychodzi nasza polska cecha charakteru)
szatkus
C++ też już powoli idzie w odstawkę.
pstmax
Widzisz fajnie można sobie pogadać w komentarzach.... :-) Parafrazując J Stuhr: "Programować może każdy, troszkę lepiej lub gorzej"
flowCRANE
Pascale to świetne języki, szczególnie Free Pascal i Delphi — dają to samo co C++, ale bez skomplikowanej składni i masy kruczków czy UB, dzięki czemu są łatwe w użyciu i przewidywalne. Szkoda, że poszły w odstawkę dawno temu.
PW
@furious programming nie do końca poszły w odstawkę np. pascal dla uC https://www.mikroe.com/mikropascal-arm
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:około 21 lat
  • Ostatnio:około miesiąc
  • Postów:1082
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 :-)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)