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);
    //frm_Main.Show;
    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 > 0and (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 user profile iconraziel: 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

user profile iconraiguen hat folgendes geschrieben:

Query.SQL.Text := ... ;-)


Ich würde eher sagen es geht so besser:


Delphi-Quelltext
1:
Query.SQL.Text := '';                    


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 user profile icongamoes:

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;
   {weitere Anweisungen}
   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;
   {weitere Anweisungen}
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;
   {weitere Anweisungen}
   else
    begin
     qry_ReNr.Close;
     qry_ReNr.SQL.Text := 'SELECT renr FROM renummer';
     qry_ReNr.Open;
     lbl_ReNr.Caption:=qry_ReNr['renr'];
    end;
   {weitere Anweisungen}
end;
***************************************

user profile icongamoes 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?