Entwickler-Ecke
Datenbanken - SQL_Befehl wurde nicht korrekt beendet
gamoes - Fr 14.04.06 21:24
Titel: SQL_Befehl wurde nicht korrekt beendet
Wenn ich mit folgendem Quelltext den Formularinhalt in die DB abspeichere klappt das zunächst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| ***************************************************** procedure Tfrm_Rechnung.bt_SpeichernClick(Sender: TObject); begin if(lbl_ReNr.Caption<>'0') AND (cb_Nachname.Text<>'') AND(Ed_Vorname.Text<>'') THEN begin ora_qry_SpeichernR.SQL.Text:='INSERT INTO rechnung' +'(renr, datum,' +' r_kdnr, gesamtbetrag)' +'VALUES(:RENR, :DATUM,' +' :R_KDNR, :GESAMTBETRAG)'; ora_qry_SpeichernR.Params.ParamByName('RENR').AsInteger:=StrToInt(lbl_ReNr.Caption); ora_qry_SpeichernR.Params.ParamByName('DATUM').AsDateTime:=dtp_Rechnung.DateTime; ora_qry_SpeichernR.Params.ParamByName('R_KDNR').AsInteger:=StrToInt(Ed_Kdnr.Text); ora_qry_SpeichernR.Params.ParamByName('GESAMTBETRAG').AsFloat:=StrToFloat(lbl_BruttoGesamtbetrag.Caption); ora_qry_SpeichernR.Execute;
Re_Speichern;
ora_qry_ArtUebernehmen.SQL.Text:='TRUNCATE TABLE tempredat'; ora_qry_ArtUebernehmen.Execute;
application.MessageBox('Die Rechnungsdaten wurden gespeichert','Rechnung gespeichert',64); end else begin ShowMessage('Solange Sie keine Artikel in Rechnung stellen, läßt sich die Rechnung nicht abspeichern'); frm_Main.Show; end; end; **************************************************** |
Würde ich jetzt mit frm_Main.Show mein aktuelles Formular schließen, dann wieder öffnen kann ich problemlos die nächste Rechnung eingeben und abspeichern. Wenn ich aber das Formular nicht schließé erhalte ich den Fehler:
SQL-Befehl wurde nicht korrekt beendet. Wieso denn das?
Mit folgendem Quelltext beginne ich eine neue Rechung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| *************************************** procedure Tfrm_Rechnung.bt_NeuClick(Sender: TObject); begin qry_ReNr.Close; qry_ReNr.SQL.Add('SELECT MAX(RENR)+1 AS nr FROM rechnung'); qry_ReNr.Open; if (qry_ReNr.Recordset.RecordCount > 0) and (qry_ReNr['nr']<> NULL) THEN begin lbl_ReNr.Caption:=qry_ReNr['nr']; end else begin qry_ReNr.Close; qry_ReNr.SQL.Clear; qry_ReNr.SQL.Add('SELECT renr FROM renummer'); qry_ReNr.Open; lbl_ReNr.Caption:=qry_ReNr['renr']; end; cb_Nachname.Clear; Ed_Vorname.Clear; Ed_Kdnr.Clear; end; *************************************** |
Verstehen kann ich das nicht, denn beim erste Abspeichern gibt es keine Probleme alle Daten werde korrekt in die DB gespeichert.
Viele Grüße
Gabi
Moderiert von
raziel: Delphi-Tags hinzugefügt
bwolf - Fr 21.04.06 09:30
Hi,
du solltest immer, bevor du eine Anweisung in eine Query schreibst diese vorher leeren:
query.SQL.clear;
Ansonsten werden die folgenden Anweisungen nämlich dazu geschrieben, und dann geht da nix ;)
Gruß ben
raiguen - Fr 21.04.06 09:46
Moin :-)
Genau! Speziell dann, wenn sich die Statements ändern...
Am einfachsten geht natürlich auch mit
Query.SQL.Text := ... ;-)
so wie Du das hier gemacht hast :
ora_qry_SpeichernR.SQL.Text:=...
Alpha_Wolf - Fr 21.04.06 10:03
raiguen hat folgendes geschrieben: |
Query.SQL.Text := ... ;-)
|
Ich würde eher sagen es geht so besser:
Oder kenn ich die Zuweisung "..." schlichtweg nicht? ;)
gamoes - Fr 21.04.06 10:40
Vielen Dank für Eure Hilfe.
Zum einen klappt es jetzt fehlerfrei und zum anderen habe ich es auch verstanden warum es vorher nicht geklappt hat.
Viele Grüße
Gabi
raiguen - Fr 21.04.06 10:48
boarrrr :roll:
Also zur Verdeutlichung nehme ich noch mal das Codebeispiel von
gamoes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| *************************************** procedure Tfrm_Rechnung.bt_NeuClick(Sender: TObject); begin qry_ReNr.Close; qry_ReNr.SQL.Add('SELECT MAX(RENR)+1 AS nr FROM rechnung'); qry_ReNr.Open; else begin qry_ReNr.Close; qry_ReNr.SQL.Clear; qry_ReNr.SQL.Add('SELECT renr FROM renummer'); qry_ReNr.Open; lbl_ReNr.Caption:=qry_ReNr['renr']; end; end; *************************************** |
Das kann man auch so schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| *************************************** procedure Tfrm_Rechnung.bt_NeuClick(Sender: TObject); begin qry_ReNr.Close; qry_ReNr.SQL.Text := 'SELECT MAX(RENR)+1 AS nr FROM rechnung'; qry_ReNr.Open; else begin qry_ReNr.Close; qry_ReNr.SQL.Text := 'SELECT renr FROM renummer'; qry_ReNr.Open; lbl_ReNr.Caption:=qry_ReNr['renr']; end; end; *************************************** |
gamoes selbst hat ja bereits diese Art benutzt:
Delphi-Quelltext
1: 2: 3: 4: 5:
| ora_qry_SpeichernR.SQL.Text:='INSERT INTO rechnung' +'(renr, datum,' +' r_kdnr, gesamtbetrag)' +'VALUES(:RENR, :DATUM,' +' :R_KDNR, :GESAMTBETRAG)'; |
und darauf bezog sich meine Anmerkung
ora_qry_SpeichernR.SQL.Text:=... ;-)
Selbstredend sind die
... durch ein entsprechendes Statement zu ersetzen ;-)
Mit Query.SQL.Text := '' weist Du dem Statement nix zu, also wird beim Ausführen die Query natürlich meckern...
bwolf - Fr 21.04.06 10:58
Hi,
du solltest immer, bevor du eine Anweisung in eine Query schreibst diese vorher leeren:
query.SQL.clear;
Ansonsten werden die folgenden Anweisungen nämlich dazu geschrieben, und dann geht da nix ;)
Gruß ben
Alpha_Wolf - Fr 21.04.06 11:01
Sicher kann sie das ;) war eigentlich eher als späßle gedacht.
Es sah für mich nur so aus als würde sich dein Post auf das vorige Post beziehen und da ging es ums clearen.
Und deine Variante funktioniert natürlich genauso :)
@bwolf
Was hat das für einen Sinn dein Post von oben zu kopieren und erneut zu posten?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!