Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In SQL Anweisung Feld Inhalt abfragen lassen (https://www.delphipraxis.net/14382-sql-anweisung-feld-inhalt-abfragen-lassen.html)

LuckyStrike4life 8. Jan 2004 09:49


In SQL Anweisung Feld Inhalt abfragen lassen
 
Morgen,

ich hab ein Code geschrieben der soweit auch funktioniert.
Es ging darum das geschaut wird, ob ein Eintrag der in eine DB gespeichert werden soll, nicht möglich ist - weil Überschneidungen in den angeforderten PKWs zu Tag XX besteht.

Das geht mit SQL und schaut so aus:
Delphi-Quellcode:
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.ADD ('SELECT * FROM "mainDB" WHERE dienst_pkw="Ford DM-162" and datum="08.01.2004"');
Query2.Active:=True;
Nun, das ist nur ein einfaches Beispiel, um zu lernen wie es überhaupt funktionieren kann.

Alles funktioniert, in nem DBGRid las ich mir dann die entsprechenden Datensätze anzeigen.

Jetzt muss der Code aber so verändert werden, dass ich nach
WHERE dienst_pkw= nicht im Code sagen muss, was für ein Fahrzeug ausgewählt wurde.
Das gleiche beim Datum.

Also muss ich den Code noch so verändern, dass die Abfrage der Felder automatisch erfolgt und sich in den Code einsetzt.
Die Fahrzeuge werden in einer DBLookupCombobox angegeben, das Datum über den DateTimePicker.

Angaben wie WHERE dienst_pkw="FieldByName('Dienst_PKW')" funktionieren natürlich nicht, hab ich probiert :) .

Smokey 8. Jan 2004 10:01

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Ich habe bisher weder mit DBLookupCombo gearbeitet noch mit DateTimePicker aber mal generell:

Wenn du in einen String irgendwas einbinden willst, was erst zur Laufzeit bekannt ist (Variable, Text aus Combobox usw.) dann so :

Delphi-Quellcode:
sSQL := 'SELECT * FROM myTable where myFeld = ' + textField1.Text + 'AND myField2 = ' + QuotedString(wasweissich.text)
sSql ist dabei ne String Variable. Du müsstest quasi nur textField1.text und wasweissich.text durch die Werte deiner beiden Controls ersetzen.

Oder hab ich dein Problem missverstanden??

LuckyStrike4life 8. Jan 2004 10:51

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Zitat:

Zitat von Smokey
Ich habe bisher weder mit DBLookupCombo gearbeitet noch mit DateTimePicker aber mal generell:

Wenn du in einen String irgendwas einbinden willst, was erst zur Laufzeit bekannt ist (Variable, Text aus Combobox usw.) dann so :

Delphi-Quellcode:
sSQL := 'SELECT * FROM myTable where myFeld = ' + textField1.Text + 'AND myField2 = ' + QuotedString(wasweissich.text)
sSql ist dabei ne String Variable. Du müsstest quasi nur textField1.text und wasweissich.text durch die Werte deiner beiden Controls ersetzen.

Oder hab ich dein Problem missverstanden??

Danke,
du hast das Problem richtig erkannt.

Dein Programmcode sieht auch gut aus, hab das Beispielprogramm mal so verändert, dass die Daten aus normalen Edit Feldern abgegriffen werden.

Hab dann sSQL als String deklariert, schaut nun so aus:
Delphi-Quellcode:
var
 sSQL: String;
procedure TForm1.Button1Click(Sender: TObject);
begin
Query2.Close;
Query2.SQL.Clear;
sSQL := 'SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" where dienst_pkw =' + PKW.Text + 'AND datum = ' + Datum2.text + ';
Query2.Active:=True;
end;
Nun mag Delphi aber nicht compilieren, ich bekomme immer die Aussage:
Zitat:

[Fehler] Unit1.pas(46): Nicht abgeschlossener String
[Fehler] Unit1.pas(47): Operator oder Semikolon fehlt
...

BluesKid 8. Jan 2004 11:06

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Versuchs mal so:

Delphi-Quellcode:
var
 sSQL: String;
procedure TForm1.Button1Click(Sender: TObject);
begin
Query2.Close;
Query2.SQL.Clear;
sSQL := 'SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" where dienst_pkw = "' +
         PKW.Text + '" AND datum = (' + Datum2.text +')';
Query2.sql.add(sSQL);
Query2.Active:=True;
end;
u.U. kannst du die Gänsefüsschen und Klammern auch weglassen :?:

schöne Grüße

Sam

Smokey 8. Jan 2004 11:23

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
In deinem Beispiel ist das allerletzte Hochkomma zuviel. Ka warum du das da hingemacht hast.
Deshalb denkt Delphi, da fängt nen neuer Teil vom String an, der aber nirgendwo endet.

Lies dir am besten nochmal generelles zum Handling von Strings durch, mir scheint da fehlen dir noch ein paar Grundlegende Informationen. Und ohne sicheren Umgang mit Strings kommst du bei Datenbanken und SQL nicht weit.

Ist nicht böse gemeint, sondern nur ein Rat :wink:


P.S.: Denk dran, dass im SQL bei einem Vergleich von String-Datenbankfeldern die Strings in Hochkommata stehen müssen, was bei dir mindestens im Fall dienst_pkw so ist.
Dafür am besten die Funktion QuotedString(PKW.Text) benutzen. Dann wird der String aus dem Textfeld direkt in Gänsefüsschen gepackt.

LuckyStrike4life 8. Jan 2004 12:21

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
BluesKid:
Thx, jetzt funktioniert es soweit.

Smokey:
Dein Rat fasse ich nicht böse auf. An sich muss ich noch sehr viel lernen, Strings und SQL gehört sicher mit dazu.

Wenn ich jetzt z.B.: QuotedString(PKW.text) schreibe, sagt Delphi das QuotedString ein undefinierter Bezeichner sei. Soll ichs als String deklarieren?

Aber gut, der Code funktioniert in der Forum:
Delphi-Quellcode:
Query2.Close;
Query2.SQL.Clear;
sSQL := 'SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" where dienst_pkw = "' + PKW.Text + '" AND datum = "' + Datum2.text + '"';
Query2.sql.add(sSQL);
Query2.Active:=True;
Nur, und das ist mir vorher nicht aufgefallen, wenn jetzt kein Datensatz dazu passt - dann bricht das Programm ab und Delphi meint:
Zitat:

Im Projekt soundso.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Keine Übereinstimmung der Typen im Ausdruck'. Prozeß...
Klare Sache,
wenn das jetzt eine If Abfrage wäre, hätte ich kein Problem - so könnte ich eben wenn nichts zutrift einfach einen anderen Weg weiterarbeiten lassen. Aber bei SQL bin ich so jungfräulich, dass mir die Lösung nicht einfällt.

Robert_G 8. Jan 2004 12:30

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Hi LuckyStrike, eine ähnliche Problematik hatten wir hier schon einmal.
Hier im Forum suchenfreien AND Belegungszeitraum AND ermitteln - Treffnix's Lösung war die richtige.

BluesKid 8. Jan 2004 12:35

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Moin

Also da werd ich jetzt nicht ganz schlau draus... :wiejetzt:

Was soll die offene Klammer vor PKW.text und warum hast du die Gänsefüsschen um den Abfrageausdruck für datum gemacht...

imho müsste die Exception bei jedem Versuch die Abfrage zu öffnen kommen...is jetzt reine Spekulation aber :

Zitat:

Im Projekt soundso.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Keine Übereinstimmung der Typen im Ausdruck'. Prozeß...
Diese Meldung besagt doch nur, dass der Typ eines Feldes in deiner DB und der Typ den du im SQL-Statement angegeben hast nicht übereinstimmen...denke nich dass das was damit zu tun hat ob ein Eintrag vorhanden is oder nich...(dann wäre recordcount einfach 0 aber die Abfrage geht trotzdem)

Mein Vorschlag:

Schau dir die Feldtypen in deiner DB an .. ich rate mal ins Blaue, aber ich denke PKW.txt musst du (siehe Post Smokey) mit Hochkommata übergeben und den Wert fürs Datum mit Klammern...


Verbesserungen erwünscht :zwinker:

schöne Grüße

Sam

LuckyStrike4life 8. Jan 2004 13:15

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Zitat:

Zitat von BluesKid
Moin

Also da werd ich jetzt nicht ganz schlau draus... :wiejetzt:

Was soll die offene Klammer vor PKW.text und warum hast du die Gänsefüsschen um den Abfrageausdruck für datum gemacht...

imho müsste die Exception bei jedem Versuch die Abfrage zu öffnen kommen...is jetzt reine Spekulation aber :

Zitat:

Im Projekt soundso.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Keine Übereinstimmung der Typen im Ausdruck'. Prozeß...
Diese Meldung besagt doch nur, dass der Typ eines Feldes in deiner DB und der Typ den du im SQL-Statement angegeben hast nicht übereinstimmen...denke nich dass das was damit zu tun hat ob ein Eintrag vorhanden is oder nich...(dann wäre recordcount einfach 0 aber die Abfrage geht trotzdem)

Mein Vorschlag:

Schau dir die Feldtypen in deiner DB an .. ich rate mal ins Blaue, aber ich denke PKW.txt musst du (siehe Post Smokey) mit Hochkommata übergeben und den Wert fürs Datum mit Klammern...


Verbesserungen erwünscht :zwinker:

schöne Grüße

Sam

Also die Klammer war nur ein Fehler, so würds natürlich nicht funktionieren.
Wenn ich keine Anführungsstriche um Datum setze, dann läßt es sich nicht compilieren. Da standen im Codebeispiel von eich Klammern. Die hab ich dann halt ausgetauscht, denn mit den Klammern gings auch nicht.

So nun hab ich mal noch n wenig getestet,

es schaut jetzt so aus - wenn im Feld Datum nichts eingetragen ist, oder nur zB. 12.12. dann bricht das Programm ab. Wenn dort irgendein richtiges ganzes Datum eingetragen wurde, egal ob es das in der DB gibt oder nicht - dann bricht das Programm nicht ab! So wies sein soll. Der Grid, in dem dann das Ergebniss ausgegeben wird, wird nur mit einer leeren Zeile gefüllt.

Das interessante, es ist egal ob etwas in dem Feld für PKW steht, da kann auch nichts stehen. Das programm bricht nicht ab. So wie es sein soll.

Nun könnte ich schon damit leben wenn es so bleibt, denn ein Datum gibt es immer - bei jedem Datensatz, ein Fahrzeug nicht.


Bin euch wirklich dankbar für die Hilfe!!
Was nicht heißen soll das dieser Thread damit beendet ist, ich muss noch n paar Dinge wissen.

r_kerber 8. Jan 2004 13:29

Re: In SQL Anweisung Feld Inhalt abfragen lassen
 
Zitat:

Zitat von LuckyStrike4life
Wenn ich keine Anführungsstriche um Datum setze, dann läßt es sich nicht compilieren.

Doch, mit doppelten Hochkommas! Und das ist genau das, was QuotedStr auch macht. Es gibt Datenbanken, die akzeptieren kein " als Klammerung für Zeichenketten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 Uhr.
Seite 1 von 3  1 23      

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