Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tutorial - Query (https://www.delphipraxis.net/55565-tutorial-query.html)

davar 23. Okt 2005 12:54

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

Tutorial - Query
 
Hallo Leute,

wenn auch nur ganz langsam geschehen, habe ich begriffen, dass man sich irgendwann mal mit querys auseinandersetzen sollte.

Ich habe eine Paradox-Datenbank und möchte gern mit Querys darauf zugreifen, um z.B. für Quickreports o.ä. nur bestimmte Daten aus der Datenbank auszulesen, die auch noch in verschiedene Tabellen verteilt sind.

Wo finde ich ein Tuto o.ä., was mir einen Query gut erklären kann, bzw. gibt es eine andere Möglichkeit als Querys für den oben beschriebenen Fall?

Bin für jede Hilfe dankbar.

MfG

davar

Pfoto 26. Okt 2005 17:39

Re: Tutorial - Query
 
Wenn Du mit "Query" jetzt allgemein die "SQL-Syntax" meinst, habe ich hier ein paar Seiten, auf denen ich schon nützliche Infos sammeln konnte:

http://www.sql-und-xml.de/xml/index.xml
http://aam.ugpl.de/sql_hilfe
http://www.w3schools.com/sql/sql_join.asp


Die Komponente "Query" kenne ich zwar nur aus der Benutzung mit anderen DBs, aber vom Prinzip her ist das sicherlich gleich:

Du erstellst per Komponente oder zur Laufzeit die Query-Komponente und weist dieser die Datenbank zu.
Wenn du im Thread per Query Daten auslesen willst, musst du unbedingt auch eine eigene Session zuweisen.

Die Query fütterst Du dann mit dem SQL-Befehl:
Delphi-Quellcode:
Query.SQL.Text:= 'SELECT .... ');
oder zeilenweise aufgebaut:
Delphi-Quellcode:
Query.SQL.Add('...');
Query.SQL.Add('...');
Den SELECT-Befehl führst du dann mit
Delphi-Quellcode:
Query.Open;
aus.

Dann kannst Du entweder manuell zeilenweise eine gewünschte Komponente mit den Daten füllen, oder per DataSource eine DBKomponente verknüpfen. Letzeres ist natürlich der einfachere Weg.


So, ich hoffe du kannst was davon gebrauchen

Gruß
Pfoto

davar 26. Okt 2005 21:59

Re: Tutorial - Query
 
Hallo,

danke für die Antwort.

Die SQL-Syntax ist eher weniger ein Problem, habe schon die eine oder andere Abfrage mit PHP gemacht.

Viel mehr hätte ich mir so ein umfangreiches Tutorial gewünscht, in dem ausführlich dargestellt wird, was ich wo wie einstellen muss, um die Komponente TQuery zu benutzen, wie ich z.B. die Datenbank erstelle, ob ich eine Query auch neben einer Tabelle benutzen kann usw.. Bisher arbeite ich mit Tabellen, aber da sind die Abfragen schon umständlich.

MfG

davar

Leuselator 26. Okt 2005 23:39

Re: Tutorial - Query
 
Denkanstöße
TQuery unterscheidet sich nicht so großartig von TTable, wie Du vielleicht annimmst. Stell Dir TQuery als TTable vor, mit dem Unterschied, das Du bei TQuery die Struktur/den Aufbau der zugrundeliegenden Tabelle selbst über die Eigenschaft/das Property "SQL" und die darin enthaltene Abfrage (engl. Query) bestimmst. Nimm weiterhin an, das eine Query in der SQL-Logik aus den physischen Tabellen der Datenbank eine temporäre "AntwortDatenMengenTabelle" erzeugt. Der Vorteil einer Query ist also im Wesentlichen der, daß Du mit ihr die feste Tabellenstruktur Deiner DB überwinden kannst und zur Laufzeit Deines Programmes genau die Tabelle aus den physisch vorhanden Tabellen Deiner DB erzeugen kannst, die Du gerade benötigst - Schlaraffenland also :mrgreen:
Gruß

davar 29. Okt 2005 23:00

Re: Tutorial - Query
 
hmmmmmmm........

ich kann mich wohl nicht ganz ausdrücken..

Die Syntax und die Möglichkeiten mit TQuerys sind mir mehr oder weniger bekannt.

Mir geht es eigentlich nur um einen kleinen Einstieg "TQuery für ganz doofe". Quasi eine Schritt für Schritt-Anleitung...

Zwischenzeitlich habe ich mal versucht, es selbst zu verstehen, hänge aber immer noch dran.

Wenn ich jetzt über den Objektinspektor unter SQL " SELECT * FROM test " eintrage (DB test wurde natürlich angelegt), bekomme ich den Inhalt der Datenbank und kann sie in einer Listbox anzeigen.

Wenn ich jetzt jedoch folgenden Code eingebe, kommt die Fehlermeldung "Ungültiges Schlüsselwort Symbol-String: FROM Zeilennnummer 1' ".

Delphi-Quellcode:
query1.close;
query1.SQL.clear;
query1.SQL.add('SELECT Vorname FROM `test`;');
query1.ExecSQL;

MfG

davar

x000x 29. Okt 2005 23:16

Re: Tutorial - Query
 
Moin moin,
dann füg doch das selbe Statement wie im OI auch zur Laufzeit hinzu...
Delphi-Quellcode:
//..
query1.SQL.add('SELECT Vorname FROM test');
//..
[EDIT]
bei select Statements solltest du statt query1.ExecSQL besser query1.Open nehmen
(siehe Delphi Hilfe)
[/EDIT]

davar 2. Nov 2005 22:37

Re: Tutorial - Query
 
Hallo,

also der Verzweiflung komme ich immer einen Schritt näher :-)

Jetzt hänge ich hier dran:

Delphi-Quellcode:
1: DBs.QHTrHin.close;
2: DBs.QHTrHin.SQL.clear;
3: DBs.QHTrHin.Params.ParamValues['datum'] := datetostr(date);
4: DBs.QHTrHin.SQL.add('SELECT * FROM DBs\Flugdate WHERE DatumHin = :datum');
5: DBs.QHTrHin.open;
6: Showmessage(DBs.QHTRhin.Fieldbyname('Datum').AsString);
Wenn ich das so ausführe, kommt die Fehlermeldung "Parameter 'datum' nicht gefunden.", und zwar in der Zeile 3. Wenn ich die Zeile 3 weglasse, kommt die Meldung "Feld 'datum' nicht gefunden".

Mit "DBs.QHTrHin.Params.ParamByName('datum').AsString: = datetostr(date);" habe ich es auch schon probiert, geht auch nicht.

Wenn ich aber die 3. Zeile weglasse und die SELECT-Abfrage ohne WHERE durchlaufen lasse, geht es ohne Probleme.


Also wer kann mir helfen? :wall:

MfG

davar

ibp 2. Nov 2005 22:48

Re: Tutorial - Query
 
heisst das feld datum oder datumhin ?

x000x 2. Nov 2005 23:57

Re: Tutorial - Query
 
Moin moin,
Zitat:

Zitat von davar
Wenn ich aber die 3. Zeile weglasse und die SELECT-Abfrage ohne WHERE durchlaufen lasse, geht es ohne Probleme.

Kleiner Tip: vertausche die Zeilen 3 und 4 einmal...
Du willst einem Parameter einen Wert zuweisen, der aber gar nicht existiert. Das kann dann so auch nicht funktonieren.
Erst wenn du dein Statemnt zugewiesen hast, ist auch der Parameter bekannt.

Gibt es bei TQuery nicht auch AsDateTime? dann brauchst du dein Datum nicht noch in einen String umwandeln...

Sharky 3. Nov 2005 06:40

Re: Tutorial - Query
 
Zitat:

Zitat von x000x
... Gibt es bei TQuery nicht auch AsDateTime? dann brauchst du dein Datum nicht noch in einen String umwandeln...

Hai davar,
wie x000x richtig anmerkte solltest Du zum setzen von Parametern immer versuchen den richtigen Datentyp zu verwenden.
Dies macht es nicht nur leichter für dich sondern Du hast durch Typumwandlungen auch immer eine unnötige Fehlerquelle erzeugt.

Dein Code könnte dann zum Beispiel so aussehen:
Delphi-Quellcode:
procedure TForm1.btn_SqlTestClick(Sender: TObject);
begin
  with DBs.QHTrHin do
  begin
    Close; // Verbindung schliessen
    ParamCheck := True; // Parameter benutzen
    SQL.Text := 'SELECT * FROM DBs\Flugdate WHERE DatumHin = :datum'; // SQL setzen
    Params.Items[0].AsDate := date; // Ersten Parameter setzen
    Open; // Abfrage durchführen
    ShowMessage(FieldByName('Datum').AsString); // Feld "Datum" als String
    Close; // Und nach dem arbeiten wieder schliessen
  end;
end;
Gerade bei Datumsfeldern kannst Du dir bei SQL-Abfragen ganz schnell ein Eigentor schiessen.
Jede Datenbank erwartet ein Datum, wenn es als String in dem Query steht, in dem vom DBMS vorgegebenen Format.
Bei mySQL wäre das: YYYY-MM-DD
Bei MSSQL ist es das in den Regionaloptionen des Rechners auf dem der Server läuft eingestellen Format
usw.
usw.

Datum solltest Du alles daran setzen ein Datum immer als TDate bzw. TDateTime an die DB zu senden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz