AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Generierter Insert-Befehl erzeugt Fehler

Generierter Insert-Befehl erzeugt Fehler

Ein Thema von RWarnecke · begonnen am 25. Jul 2007 · letzter Beitrag vom 25. Jul 2007
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 07:56
Datenbank: Firebird • Version: 2.0 • Zugriff über: Zeoslib
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 08:10
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 08:22
Zitat von RWarnecke:
Delphi-Quellcode:
if Fields[0].AsInteger = 1 then
  s_fullname := LEdt_Fullname.Text
else
  s_fullname := LEdt_Fullname.Text


Hat zwar nichts mit dem Problem zu tun, war mir aber aufgefallen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 08:54
Ich würde meinen in den SubSelects kommen mehrere Zeilen zurück. Das mag Insert IMHO nicht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 09:46
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 10:40
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 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 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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 10:54
Zitat von marabu:
Mich irritiert ein wenig, dass du stored procedures aufrufst - und die dann auch noch mit "SELECT *".
Ja wie denn sonst ? Die Rückgabewerte der SPs sind auch Datenmengen und auf die wird zum Lesen mit SELECT zugegriffen.
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 11:29
Hallo Rolf,

Zitat von RWarnecke:
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#9

Re: Generierter Insert-Befehl erzeugt Fehler

  Alt 25. Jul 2007, 11:54
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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