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
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

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

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

0
  1. jakiś błąd to nie jest konkret.
  2. jak masz to wszystko połączone
  3. po co tam jest ttable
0

odp 1. w parametrze SQL dla Query1 mam wpisane

SELECT * FROM temp ORDER BY 'Nazwisko';

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

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 :)

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.

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

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ń.

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.

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