![]() |
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:
Nun, das ist nur ein einfaches Beispiel, um zu lernen wie es überhaupt funktionieren kann.
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; 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 :) . |
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 ist dabei ne String Variable. Du müsstest quasi nur textField1.text und wasweissich.text durch die Werte deiner beiden Controls ersetzen.
sSQL := 'SELECT * FROM myTable where myFeld = ' + textField1.Text + 'AND myField2 = ' + QuotedString(wasweissich.text)
Oder hab ich dein Problem missverstanden?? |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
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:
Nun mag Delphi aber nicht compilieren, ich bekomme immer die Aussage:
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; Zitat:
|
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Versuchs mal so:
Delphi-Quellcode:
u.U. kannst du die Gänsefüsschen und Klammern auch weglassen :?:
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; schöne Grüße Sam |
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. |
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:
Nur, und das ist mir vorher nicht aufgefallen, wenn jetzt kein Datensatz dazu passt - dann bricht das Programm ab und Delphi meint:
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; Zitat:
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. |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Hi LuckyStrike, eine ähnliche Problematik hatten wir hier schon einmal.
![]() |
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:
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 |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
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. |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
|
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
Also das:
Delphi-Quellcode:
geht auch, sieht komisch aus - aber okay.
''' + Datum2.text + ''''
Gleiches Ergebnis wie mit ". |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
oder
Delphi-Quellcode:
Sieht besser aus. Für mich sieht eher die Pfadangabe nach FROM komisch aus. Warum nutzt Du keine BDE-Aliase (in Verbindung mit TDatabase im Programm)?
sSQL := 'SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" where dienst_pkw = ' + QuotedStr (PKW.Text);
|
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
|
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
Der Code ist interessant, so könnte man sogar (eventuell) nach der Uhrzeit gucken lassen. Aber alles nach und nach. Jetzt fehlt mir noch n kleines Stück Wissen, bis ich den Code auch tatsächlich verwenden kann. Es ist ja so, ein User trägt sein Antrag ein, dass Programm schaut ob an dem Tag das Auto welches er haben möchte frei ist, wenn ja - dann soll der Datensatz einfach eingestellt werden. Sollte der gewünschte Wagen aber schon vergeben sein, so muss eine Meldung erscheinen (z.B. durch aufpoppen eines neuen Forms) und es muss der Datensatz angezeigt werden, der den Wagen schon belegt. Aber wie schreib ich den SQL Code um, dass wenn es ein Ergebnis gibt (sprich: der Wagen schon weg ist) auch eine Handlung vom Programm ausgeführt wird. Bis jetzt schreibt er das Ergebnis ja nur in ein Query, den ich über n Grid ausgeben lasse. Ideen? Gibts da eine Lösung oder muss ich ganz anders rangehen? [edit=sakura] :wall: Doppel-Post, dritten Post, vierten Post und :!: fünften Post :shock: gelöscht. Mfg, sakura[/edit] |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Moin.
Also wenn ich dich richtig verstanden habe, willst du eine eierlegende Wollmilchsau. :zwinker: Nehme eine Query, die prüft, ob es schon Einträge für das Auto zu dem Zeitpunkt gibt. (Genau das macht der Code in dem anderem Thread) Wenn die Abfrage nix gefunden hat kannst du normal weitermachen, andernfalls eine Meldung ausgeben. |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
@sakura
Das war wirklich nicht meine Absícht, ich hab immer nur Fehlermeldungen vom Browser erhalten, und dann auf ein neues versucht. Das es am Ende so schlimm aussah, wusste ich nicht. Sorry. Kleines Problem gibts noch mit dem Code. Ich hab dafür ja ein Testprogramm erstellt, nun wollte ich es übernehmen. Das Problem liegt in den verwendeten Komponenten, die Abfrage welcher PKW genutzt werden soll, erfolgt über eine DBCombobox. Kein Problem, läßt sich in der Form abgreifen:
Delphi-Quellcode:
Das Datum hingegen, stammt aus dem DateTimePicker. Und läßt sich natürlich nicht so einfach abgreifen,
Dienst_Pkw.text
ich habs dann mit:
Delphi-Quellcode:
versucht. Klang mir recht logisch.
DateT.Date
Der Code sieht demzufolge nun so aus:
Delphi-Quellcode:
Delphi mag aber nicht compilieren, Delphi sagt dazu:
var
sSQL: string; Procedure TForm1.Button9Click(Sender: TObject); Begin Query2.Close; Query2.SQL.Clear; sSQL := 'SELECT * FROM "t:eDienstreisebuch\mainDB.dbf" where dienst_pkw = "' + Dienst_Pkw.text + '" AND datum = ''' + DateT.Date + ''''; Query2.sql.add(sSQL); Query2.Active:=True; Zitat:
Delphi-Quellcode:
schreiben, aber in SQL funktioniert jenes nicht.
AsDateTime := DateT.Date;
Wie kann ich das Problem lösen... es hindert jetzt extrem am Fertigstellen... . *seufz* |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Wenn du SQL-Variablen benutzt bekommst du 1. ein paar Probleme weniger und 2. läuft es nächsten Ausführen wesentlich schneller.
Delphi-Quellcode:
p.s.: Die Lesbarkeit ist so auch wesentlich besser...
Query1.SQL.TEXT :=
'SELECT *' + #10 + 'FROM "t:eDienstreisebuch\mainDB.dbf"' + #10 + 'WHERE Dienst_PKW = :iDienst_PKW And' + #10 + ' Datum = :iDateT'; Query1.prepare; Query1.ParamByName('iDienst_PKW').AsString := Dienst_Pkw.text; Query1.ParamByName('iDateT').AsDateTime := DateT.DateTime; Query1.open; |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
brauch ich für prepare ein neuen Query? Weil du Query1 geschrieben hast, ich momentan für den eigentlichen Code allerdings Query 2 nutze. Wofür steht eigentlich '+ #10 +'? Nur damit ich auch mal n wenig was lerne. |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
:oops:
Ich hatte mich verschrieben. Es sollte in der ersten Zeile auch "Query1" stehen (ich werden den Post abändern) #10 ist ein LineFeed und reicht in SQL als Zeilenumbruch (du brauchst kein #13#10) |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Verdammt,
da gibts noch n Problem mit deinem Code. Er schaut jetzt im Programm so aus:
Delphi-Quellcode:
Ein Fehler fällt auf, die Zeile die ich ausgeklammert habe, kann in der Form ja auch nicht funktionieren. Denn sSQL ist ja nicht mehr vorhanden, die Deklaration davon - könnte ich also auch entfernen.
var
sSQL: string; procedure TForm1.Button2Click(Sender: TObject); begin Query2.Close; Query2.SQL.Clear; Query2.SQL.Text := 'SELECT *' + #10 + 'FROM "t:eDienstreisebuch\mainDB.dbf"' + #10 + 'WHERE Dienst_PKW = :iDienst_PKW And' + #10 + ' Datum = :iDateT'; Query2.prepare; Query2.ParamByName('iDienst_PKW').AsString := Dienst_Pkw.text; Query2.ParamByName('iDateT').AsDateTime := DateT.DateTime; Query2.open; //Query2.sql.add(sSQL); Query2.Active:=True; if Query2.Bof and Query2.Eof then begin ShowMessage('Dateneingabe'); end else ShowMessage('Keine Daten'); Nun sieht es leider so aus, dass das Programm immer
Delphi-Quellcode:
ausführt, niemals
then begin ShowMessage('Dateneingabe');
Delphi-Quellcode:
[/delphi]. Auch wenn es eine Summe im Query gibt.
else ShowMessage('Keine Daten');
Der alte Code, der funktioniert hat sah so aus:
Delphi-Quellcode:
Dabei gabs dann aber das Problem mit dem DateTimePicker... .
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; if Query2.Bof and Query2.Eof then ShowMessage('Keine Daten'); end; Was hab ich denn an dem Code oben falsch gemacht? |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Das Problem war, dass ich DateTime verwendet habe - für deine jetzige Tabelle müsste es Date sein.
Außerdem sollte die Tabelle 2 Datumsfelder enthalten: 1. ausgeliehen (StartDatum) 2.zurückgebracht(EndDatum) (beide mit Uhrzeit) dann könnte es So aussehen:
Delphi-Quellcode:
Damit dürftest du die Probleme umgehen können, die weiter oben beschrieben habe...
Query2.Close;
Query2.SQL.Clear; Query2.SQL.Text := 'SELECT *' + #10 + 'FROM "t:eDienstreisebuch\mainDB.dbf"' + #10 + 'WHERE Dienst_PKW = :iDienst_PKW AND' + #10 + ' (:iDate between StartDatum AND EndDatum)'; Query2.prepare; Query2.ParamByName('iDienst_PKW').AsString := Dienst_Pkw.text; Query2.ParamByName('iDate').AsDateTime := DateT.DateTime; |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
es läuft hier in der Art, dass jeder Mitarbeiter der eine Dienstreise machen muss, ein Auto haben kann, solange es noch nicht vergeben ist. Dienstreisen dauern für gewöhnlich ein Tag - wenn es länger dauert, dann muss der private Wagen genommen werden (gegen Entschädigung, klar). Daher gibt es keine Feld, wann der PKW wieder da ist, sondern nur die Uhrzeit. D.h. man könnte (und das wäre auch sehr gut) nach der Zeit schauen lassen, es gibt ein Feld für Beginn d. Reise und Ende d. Reise. Das würde jetzt aber sehr ausfühlichen Code benötigen, erstmal muss man von der Eingabemaske schauen lassen von wann bis wann ein Wagen genommen wird, in die DB schauen - von wann bis wann der PKW weg ist... usw. |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
*seufz*
hab den Code nun so geschrieben:
Delphi-Quellcode:
end
sSQL: string;
procedure TForm1.Button2Click(Sender: TObject); begin Query2.Close; Query2.SQL.Clear; Query2.SQL.Text := 'SELECT *' + #10 + 'FROM "t:eDienstreisebuch\mainDB.dbf"' + #10 + 'WHERE Dienst_PKW = :iDienst_PKW AND' + #10 + ' Datum = :iDate'; Query2.prepare; Query2.ParamByName('iDienst_PKW').AsString := Dienst_Pkw.text; Query2.ParamByName('iDate').AsDateTime := DateT.DateTime; Query2.open; //Query2.sql.add(sSQL); Query2.Active:=True; if Query2.Bof and Query2.Eof then begin ShowMessage('Dateneingabe'); else ShowMessage('Keine Daten');[/delphi] Leider wird immer noch kein Ergebniss in den Query geschrieben, wenn Datensätze (eigentlich) übereinstimmen. So läuft dann immer
Delphi-Quellcode:
ab.
then begin ShowMessage('Dateneingabe');
Der Fehler muss noch woanders liegen... . |
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Zitat:
|
Re: In SQL Anweisung Feld Inhalt abfragen lassen
Nun hab ichs,
der Fehler lag schon in der Zeile - wie du meintest. Richtig muss sie in meinem Programm in der Art geschrieben stehen:
Delphi-Quellcode:
"Date" könnte nicht ausreichen, denn die Komponente hat von mir den Namen "DateT" bekommen, warum auch immer ;).
Query2.ParamByName('iDate').asDate := DateT.DateTime;
Bedanke mich für deine Hilfe, hast mich wirklich weiter gebracht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz