Entwickler-Ecke

Datenbanken - ADOQuery aus Datei gefüllt, dann damit arbeiten


J.Borchert - So 25.08.19 12:23
Titel: ADOQuery aus Datei gefüllt, dann damit arbeiten
Hallo zusammen,

ich habe in meinem Programm einen Offline-Modus. Hier werden die Daten der letzen Sitzung, welche zuvor beim Beenden immer in einer Datei gespeichert werden, geladen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if fileexists('last_Funk.db'then
          WITH ADOQuery16 DO
            BEGIN LoadFromFile('last_Funk.db');
                  Last;
                  First;
                  LabeL509.Caption := IntToStr(RecordCount);
            END;


Jetzt wird die gesamte Datenmenge im verknüpften DBGrid angezeigt.
Danach möchte ich mit einem Select die Datenmenge filtern, aber ich habe irgendwas vergessen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
with ADOQuery16 do
          begin Close;
                SQL.Clear;
                SQL.Text := 'SELECT * FROM FUNK'//Habe jetzt extra gekürzt zur Fehlersuche
                Prepared := False;
                Open;
                Last;
                First;
                LabeL509.Caption := IntToStr(RecordCount);
          end;


Jetzt wird nichts mehr im verknüpften DBGrid angezeigt...und ich weiß nicht warum ?


Th69 - So 25.08.19 13:18

Du solltest einen SQL-Fehler zur Laufzeit erhalten, denn der Filter muß in einfachen Anführungszeichen stehen.


J.Borchert - So 25.08.19 14:40

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du solltest einen SQL-Fehler zur Laufzeit erhalten, denn der Filter muß in einfachen Anführungszeichen stehen.


Sorry, das ist es nicht, ich habe das Select hier nur falsch zusammenkopiert. Es muß so sein:

Delphi-Quelltext
1:
SQL.Text := 'SELECT * FROM FUNK WHERE TEAM LIKE ''%GSM%'' ORDER BY User';                    


Wenn ich die Datenbankverbindung habe, geht es und es kommt kein SQL-Fehler.


J.Borchert - So 25.08.19 14:57

Also so wie jetzt oben gekürzt kommt ein SQL-Fehler:


Quelltext
1:
2:
3:
4:
5:
---------------------------
Die Datei SELECT * FROM FUNK

 kann nicht gefunden werden.
---------------------------


Holgerx - So 25.08.19 20:16

Hmm..

Delphi-Quelltext
1:
2:
WITH ADOQuery16 DO
  BEGIN LoadFromFile('last_Funk.db');

-> Die Datenmenge wird ins Query geladen und 'geöffnet'...


Delphi-Quelltext
1:
2:
with ADOQuery16 do
  begin Close;

-> Die Datenmenge wird geschlossen und deren Inhalt 'weggeworfen'....

Ein Filtern auf einer geöffneten Datenmenge ohne DB geht nur noch mit '.Filter' des ADOQuery.
Wenn die 'Offline' Datenmenge durch Close geschlossen wird, greift ein nachfolgender SQL auf die eventuell vorhandenen Connection, aber nicht mehr auf die eben geladene und wieder weggeworfene Datenmenge zu...

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


J.Borchert - So 25.08.19 21:00

Ok, super. Danke für deine Hilfe. Habe versucht, das Ganze umzusetzen. Leider gibt es nach dem Filtern nur einen einzigen Datensatz (leer) im Grid:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Procedure FunkOfflineFiltern(s:string);
begin
 with Form1, ADOQuery16 do
  begin Edit113.Text := s;  // Zur Anzeige, was da gerade passiert
        Filtered := False;
        Filter := s;        // 'Team LIKE ' + QuotedStr('%' + ComboBox3.Text + '%')
        Filtered := True;
  end;
end;


Fehlt da noch was ?


jaenicke - Di 27.08.19 07:15

Im Filter ist nicht jede SQL Klausel erlaubt, eventuell funktioniert dort LIKE schlicht nicht.

Falls es sich um eine Enterprise Edition handelt, wäre auch FireDAC mit Local SQL im Speicher möglich. Da kann man dann sogar joins im Speicher auf den Offline-Daten machen, auch auf selbst im Speicher komplett neu erstellte Tabellen.


Holgerx - Di 27.08.19 09:26

Hmm..

Hab da ein Testprogramm für ClientDataset mit ADOQuery.

Damit läst sich ein neues DataSet erstellen, dieses bearbeiten, speichern, laden.
Bei aktivierung des Filters wird dessen Edit eingefärbt, ob das ADOQuery den Filter verwendet oder mit einer Exception ablehnt.

Zu beachten ist, das ein führendes '%' nur geht, wenn auch ein abschließendes '%' nach einem Text folgt...

(Erstellt mit D6, ja und ich will nicht wechseln...)


J.Borchert - Di 27.08.19 18:29

Zitat:
Zu beachten ist, das ein führendes '%' nur geht, wenn auch ein abschließendes '%' nach einem Text folgt...


Das war der entscheidende Hinweis. Danke Euch allen.

Letzte Bitte:

Wie kann ich im DBGrid, wenn ich Select nicht benutzen kann, Spalten nach meiner gewünschten Reihenfolge anordnen bzw. nur einzelne Spalten anzeigen lassen ?


Th69 - Di 27.08.19 18:42

Jede Spalte (DbGrids.TColumn [http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.DBGrids.TColumn]) hat die Eigenschaften Visible und Index.