Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Generierter Insert-Befehl erzeugt Fehler (https://www.delphipraxis.net/96479-generierter-insert-befehl-erzeugt-fehler.html)

RWarnecke 25. Jul 2007 07:56

Datenbank: Firebird • Version: 2.0 • Zugriff über: Zeoslib

Generierter Insert-Befehl erzeugt Fehler
 
Hallo zusammen,

ich erzeuge mit der folgenden Procedure einen INSERT-Befehl und einen UPDATE-Befehl.
Delphi-Quellcode:
procedure TMainPostForm.BBtn_PostClick(Sender: TObject);
var
  s_fullname: string;
  sqltext1, sqltext2: string;
begin
  with MainDataModule.ZQueryTemp do
  begin
    SQL.Clear;
    SQL.Text := 'SELECT count(*) from buchungen where serialnumber = ''' + LEdt_Serialnumber.Text + ''';';
    Open;
    Active := true;
    if (not RBtn_Lager.Checked) and (not RBtn_Schrott.Checked) then
      if Fields[0].AsInteger = 1 then
        s_fullname := LEdt_Fullname.Text
      else
        s_fullname := LEdt_Fullname.Text
    else
    begin
      if RBtn_Lager.Checked then
        s_fullname := rsLagerStg;
      if RBtn_Schrott.Checked then
        s_fullname := rsSchrott;
    end;
    if Fields[0].AsInteger = 1 then
    begin
      sqltext1 := Format(s_toolexists, [s_fullname,
         LEdt_UserID.Text, CB_Department.Text, LEdt_Room.Text,
         CB_Company.Text, LEdt_CostCentre.Text, DateToStr(now),
         GetCurrUserName, M_Comment.Lines.Text, LEdt_SerialNumber.Text]);
    end
    else
    begin
      sqltext1 := s_toolcreate1 + #13#10 + Format(s_toolcreate2, [s_fullname,
         LEdt_UserID.Text, CB_Department.Text, LEdt_Room.Text,
         CB_Company.Text, CB_Department.Text, copy(LEdt_UserID.Text, 1, 2)]);
      sqltext2 := Format(s_toolcreate3, [LEdt_ProductID.Text,
         LEdt_ProductID.Text, LEdt_SerialNumber.Text, DateToStr(now),
         GetCurrUserName, M_Comment.Lines.Text]);
    end;
    Active := false;
  end;
  with MainDataModule.ZQuery do
  begin
    SQL.Clear;
    SQL.Add(sqltext1);
    SQL.Add(sqltext2);
    SQL.SaveToFile('D:\Buchungen.txt');
    ExecSQL;
  end;
  close;
end;
In der Datei Buchungen.txt erhalte ich folgenden INSERT-Befehl:
SQL-Code:
INSERT INTO Buchungen(FULLNAME, USERID, DEPARTMENT, ROOM, COMPANY, COSTCENTRE, TOOLTYPE, PRODUCTID, SERIALNUMBER, UNSETTLED, FINISHED, CREATEDATE, CREATEUSERID, BEMERKUNGEN)
 VALUES ('Mustermann,Max', 'gummu', 'IN41', '', 'Musterfirma', (SELECT * FROM proc_costcentre('IN41', 'gu')),
(SELECT * FROM proc_tooltype('DSGAVIIDDRHPLSJT1320')), 'DSGAVIIDDRHPLSJT1320', 'CNMJP09920', 1, 0, '24.07.2007', 'Administrator', '');
Wenn ich den Befehl nun mit der ZQuery ausführe, sagt er mit in Zeile 3 Spalte 104 ein unbekanntes Token. Wenn ich aber nun den Inhalt der Buchungen.txt in ein SQL-Editor (IBExpert) kopiere und dann ausführe, wird der Datensatz eingefügt.

Warum funktioniert das ganze über den SQL-Editor und nicht über die ZQuery ? Selbst dann, wenn ich den Inhalt manuell ins ZQuery.SQL schreibe und es dann per ZQuery.ExecSQl ausführe funktioniert es.

RavenIV 25. Jul 2007 08:10

Re: Generierter Insert-Befehl erzeugt Fehler
 
Erst ein mal ein Hinweis:
Da wo Du ''' benutzt, solltest Du mit der Funktion QuotedStr arbeiten. Einfach die Hilfe konsultieren.

Die Fehlermeldung könnte von dem #13#10 kommen. Das wird eh nicht von SQL benötigt.
Das txt-file machst Du sicher im Windows-Editor auf. Der korrigiert den falschen Zeilenumbruch. Beim rauskopieren des Textes und reinkopieren in den SQL-Editor stimmt dann alles.

DeddyH 25. Jul 2007 08:22

Re: Generierter Insert-Befehl erzeugt Fehler
 
Zitat:

Zitat von RWarnecke
Delphi-Quellcode:
if Fields[0].AsInteger = 1 then
  s_fullname := LEdt_Fullname.Text
else
  s_fullname := LEdt_Fullname.Text

:wiejetzt: :gruebel:

Hat zwar nichts mit dem Problem zu tun, war mir aber aufgefallen.

sirius 25. Jul 2007 08:54

Re: Generierter Insert-Befehl erzeugt Fehler
 
Ich würde meinen in den SubSelects kommen mehrere Zeilen zurück. Das mag Insert IMHO nicht.

marabu 25. Jul 2007 09:46

Re: Generierter Insert-Befehl erzeugt Fehler
 
Hallo Rolf,

du hast sicher schon nachgesehen, was an Stelle 104 in deinem beanstandeten SQL-Statement steht. Wenn ich an der richtigen Stelle hingeschaut habe, dann wird das nicht standardkonforme Datumsliteral bemängelt. ZEOS und IBExpert parsen das SQL-Statement und verwenden mit Sicherheit nicht den gleichen Parser.

Mich irritiert ein wenig, dass du stored procedures aufrufst - und die dann auch noch mit "SELECT *".

Grüße vom marabu

RWarnecke 25. Jul 2007 10:40

Re: Generierter Insert-Befehl erzeugt Fehler
 
Zitat:

Zitat von sirius
Ich würde meinen in den SubSelects kommen mehrere Zeilen zurück. Das mag Insert IMHO nicht.

In den SubSelects kommen keine mehreren Zeilen zurück.

Zitat:

Zitat von marabu
Mich irritiert ein wenig, dass du stored procedures aufrufst - und die dann auch noch mit "SELECT *".

Wieso ? Ich habe es so aus der Dokumentation aus Firebird. Dort war es auch so in einem Beispiel ausgeführt. Denn wenn ich nur den Procedurenamen in den Insert-Befehl schreibe, kommt der Fehler unbekanntes Token.

Zitat:

Zitat von marabu
du hast sicher schon nachgesehen, was an Stelle 104 in deinem beanstandeten SQL-Statement steht. Wenn ich an der richtigen Stelle hingeschaut habe, dann wird das nicht standardkonforme Datumsliteral bemängelt. ZEOS und IBExpert parsen das SQL-Statement und verwenden mit Sicherheit nicht den gleichen Parser.

Ja, die Position 104 ist genau vor dem Datum. Ich habe bis eben auch gedacht, es irgendwas mit dem Datum zu tun. Es ist aber das nächste Feld, da wo Administrator drin steht. Es war nämlich die Procedure "GetCurrUserName" die mir da einen Streich gespielt hat. Manchmal war es so, dass dann im Einzelschritt am Ende vom Usernamen ein #0 angehängt wurde und auch mal wieder nicht. Ich lese jetzt die Systemvariable "Username" aus.

Hansa 25. Jul 2007 10:54

Re: Generierter Insert-Befehl erzeugt Fehler
 
Zitat:

Zitat von marabu
Mich irritiert ein wenig, dass du stored procedures aufrufst - und die dann auch noch mit "SELECT *".

Ja wie denn sonst ? :shock: Die Rückgabewerte der SPs sind auch Datenmengen und auf die wird zum Lesen mit SELECT zugegriffen.

marabu 25. Jul 2007 11:29

Re: Generierter Insert-Befehl erzeugt Fehler
 
Hallo Rolf,

Zitat:

Zitat von RWarnecke
Zitat:

Zitat von marabu
Mich irritiert ein wenig, dass du stored procedures aufrufst - und die dann auch noch mit "SELECT *".

Wieso ? Ich habe es so aus der Dokumentation aus Firebird. Dort war es auch so in einem Beispiel ausgeführt. Denn wenn ich nur den Procedurenamen in den Insert-Befehl schreibe, kommt der Fehler unbekanntes Token.

deine Syntax ist schon richtig, sonst hätte IBExpert ja die Ausführung verweigert. Meine Irritation rührt daher, dass die SP eine Lookup-Funktion zu implementieren scheint - und dafür ist keine SP nötig. Das dafür notwendige singleton select kannst du gleich in dein INSERT Statement einbetten. Wenn die SP allerdings mehr macht als ich vermute, dann würde ich den Stern durch eine benannte Spaltenauswahl ersetzen - alleine aus dokumentarischen Gründen.

Freundliche Grüße

RWarnecke 25. Jul 2007 11:54

Re: Generierter Insert-Befehl erzeugt Fehler
 
Die beiden Proceduren aus dem INSERT-Befehl geben eigentlich immer nur einen Wert zurück. Deshalb kann man sich jetzt drüber streiten, ob man es mit dem Sternchen schreibt oder nicht. So sehe ich das ganze.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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