Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit SQL.Add (https://www.delphipraxis.net/209984-problem-mit-sql-add.html)

jmich 14. Feb 2022 19:32

Delphi-Version: 5

Problem mit SQL.Add
 
Hi Leute,

möchte in SQL-Datenbank eine größere Menge Datensätze bzw. Felder updaten.
Mit SQL.Text wird mir die Zeile zu lang.Deshalb möchte ich das SQL Statement SQL.Add verwenden.
Leider Funktioniert das Speichern nicht.
Was mache ich falsch ?
Hier mein Code:
Delphi-Quellcode:
  with LiteQuery_rechng do
              begin
                Close;
                SQL.Clear;
             
                SQL.Add('UPDATE Rechnung SET');
                SQL.Add('MWsteuer = :mw');
                SQL.Add('Nachlassumme = :nasum');
                SQL.Add('Sicherheitsumme = :ssum');
                SQL.Add('Skontosumme = :sksum');
                SQL.Add('Nettosumme = :nsum');
                SQL.Add('Bruttogesamt = :bsum');
                SQL.Add('Where Rechnr = + QuotedStr(ed_rechngd_rechnr.Text)+');
               
                ParamByName('mw').AsCurrency := StrToCurr(lbl_mwst.Caption);
                ParamByName('nasum').AsCurrency := StrToCurr(lbl_nachlass.Caption);
                ParamByName('ssum').AsCurrency := StrToCurr(lbl_sicherheit.Caption);
                ParamByName('sksum').AsCurrency := StrToCurr(lbl_skonto.Caption);
                ParamByName('nsum').AsCurrency := StrToCurr(lbl_netto.Caption);
                ParamByName('bsum').AsCurrency := StrToCurr(lbl_brutto.Caption);
                try
                 ExecSQL;;
               except
                  ShowMessage('Speichern fehlgeschlagen');
                end;
              end;

Bernhard Geyer 14. Feb 2022 19:39

AW: Problem mit SQL.Add
 
Fehlt da nicht ein Komma nach jeder set-Zeile?

https://www.w3schools.com/sql/sql_update.asp

himitsu 14. Feb 2022 19:40

AW: Problem mit SQL.Add
 
Selbst Schuld, wenn du in deiner Fehlerbehandlung deinem sinnlosen Try-Except-Gestümpere grob fahrlässig die ursprüngliche Fehlermeldung vernichtest.


PS:
Zitat:

SQL-Code:
SQL.Add('Where Rechnr = + QuotedStr(ed_rechngd_rechnr.Text)+');

und die Kommas

Sinspin 15. Feb 2022 05:51

AW: Problem mit SQL.Add
 
Zitat:

Zitat von jmich (Beitrag 1502190)
Was mache ich falsch ?
Delphi-Quellcode:
  with LiteQuery_rechng do
              begin
                SQL.Add('Nachlassumme = :nasum');
                try
                 ExecSQL;;
               except
                  ShowMessage('Speichern fehlgeschlagen');
                end;
              end;

So zimelich alles.

Delphi-Quellcode:
with
Das hatten wir doch erst? Das ist eine Plage! Vergiss einfach das es existiert und arbeite ohne!

Delphi-Quellcode:
ShowMessage('Speichern fehlgeschlagen');
Genau! Nur wo?
Delphi-Quellcode:
try
//alles sql gezerre
except on E:Exception do
  ShowMessage('Speichern fehlgeschlagen. Fehler : '+E.Message);
end;
Wäre es so nicht etwa besser?

Delphi-Quellcode:
SQL.Add('Nachlassumme = :nasum');
Nach jedem Feld in der Zuweisungsliste kommt ein Komma (außer beim letzten natürlich)

Zitat:

Zitat von himitsu (Beitrag 1502193)
Try-Except-Gestümpere

:roll:Himitsu! Du hast zwar recht, aber das kann man auch ein klein wenig freundlicher sagen.

haentschman 15. Feb 2022 06:59

AW: Problem mit SQL.Add
 
Hallöle...8-)

...ich hatte mir geschworen, niemals mehr auf Beitrage die WITH enthalten zu antworten...:? Das WITH sagt...entweder Copy/Paste aus alten Beispielen oder "ich hab das immer so gemacht". Die Zeiten ändern sich...:?

Delphi-Quellcode:
...
SQL.Add('Where Rechnr = + QuotedStr(ed_rechngd_rechnr.Text)+');
...meinst du, daß das SQL(string) "QuotedStr" versteht? :wink:

besser für die Zeile:
Delphi-Quellcode:
...
SQL.Add('where Rechnr = ' + QuotedStr(ed_rechngd_rechnr.Text));
die richtige Zeile:
Delphi-Quellcode:
LiteQuery_rechng.SQL.Add('where Rechnr = :REN');
LiteQuery_rechng.SQL.ParamByName('REN').AsString := ed_rechngd_rechnr.Text;

PS: gegen die ADD Origien gibt es was von "mir" :wink: https://www.delphipraxis.net/190316-...e-creator.html

himitsu 15. Feb 2022 07:05

AW: Problem mit SQL.Add
 
Was soll man da denn noch sagen?

Ohne den Schwachsinn mit Try-Except, würde er bestimmt eine richtige Fehlermeldung bekommen, die ihm alle Fehler zeigt.



Selbst wenn die DB das QuoteStr verstehen würde, dann spätestens das im QuoteStr nicht mehr, bzw. die + davor und dahinter auch nicht.

Aber vorher wäre erstmal beim zweiten = gemeckert wurden, wegen der fehlenden Komata.

rokli 15. Feb 2022 08:52

AW: Problem mit SQL.Add
 
Moin,

Du könntest das auch so schreiben:

Delphi-Quellcode:
   qry1.SQL.Text   :=   'UPDATE Rechnung SET ' +
               '   MWSteuer = :mw ' +
               '   ,Nachlassumme = :nasum ' +
               '   ,Sicherheitsumme = :ssum ' +
               '   ,Skontosumme = :sksum ' +
               '   ,Nettosumme = :nsum ' +
               '   ,Bruttogesamt = :bsum ' +
               'WHERE ' +
               '   Rechnr = :ed_rechngd_rechnr ';
und dann kommt das füllen der Parameter.

Das fehlende Komma ist natürlich das erste Problem, mehrere Felder mit SET ändern bedarf einem Komma vor jedem Feld bzw. nach jedem Inhalt.
Und dann kannst Du die Rechnr natürlich auch per Parameter übergeben.

jmich 15. Feb 2022 17:40

AW: Problem mit SQL.Add
 
Als erstes mal vielen Dank.

Die Lösung beim Betrag von Haentschman hatte ich schon auch
probiert, aber funhtionierte eben nicht.
Das mit den fehlenden Kommas hatte ich auch schon erkannt.
Das mit der Fehlerexcept wurde mir von einen im Forum als Lösung unterbreitet.

Die Lösung von rokli war für mich die beste und diese klappt auch super.
Sie ist sehr übersichtlich.
Nochmals vielen Dank besonders an rokli, der auch nett die Lösung rübergebtacht hat.

Jmich

himitsu 15. Feb 2022 17:52

AW: Problem mit SQL.Add
 
Try-Except macht nur Sinn, wenn man darin auch was Sinnvolles macht.

z.B. den originalen Fehler in ein Log schreiben,
oder ihn an die neue Fehlermeldung mit anzuhängen.

Oder eben, wenn man genau weiß welcher Fehler es ist und man ihn gezielt unterdrücken will, um es z.B. nochmal anders zu versuchen, oder Dergleichen.

Sharky 15. Feb 2022 18:58

AW: Problem mit SQL.Add
 
Zitat:

Zitat von himitsu (Beitrag 1502206)
Was soll man da denn noch sagen?

Ohne den Schwachsinn mit Try-Except,..

Schön zu sehen, dass sich Deine Arroganz auch nach mehreren Jahren nicht gelegt hat. :cry:
Persönliche Entwicklung im Fachgebiet -> Stetig steigend
Persönliche Entwicklung im Umgang mit Menschen -> Stetig fallend

hoika 15. Feb 2022 21:16

AW: Problem mit SQL.Add
 
Hallo,
sehe ich nicht so!

Es ist halt ein Problem, dass hier ankommen,
und die einfachsten Sachen ignorieren.

wenn ich try except benutzen, dann doch bitte richtig.

Jasocul 16. Feb 2022 06:41

AW: Problem mit SQL.Add
 
Fahrt mal ein bischen runter, Leute.

Als ich die Eingangsfrage gelesen hatte, dachte ich auch, dass da wesentliche Grundlagen nicht beachtet werden. OK, gedacht habe ich da was anderes, aber formulieren kann man es ja netter. :wink:
Dann habe ich genauer hingesehen:
- TE seit 2007 hier mit 15 Beiträgen
- D5
- Simple SQL-Fehler (und andere Grundlagenfehler)
Folglich wenig/keine Erfahrung, Gelegenheitsprogrammierer, o.ä.

Das kann man einfach mal berücksichtigen, wenn man antwortet und muss nicht mit dem Hammer drauf hauen. Auch wenn man diese Sachen ständig wiederholen muss. Der harte Kern der DP liest hier sicher täglich mit, aber die meisten kommen nur hierher, wenn sie ein Problem haben und wissen nicht, was man hier regelmäßig wiederholen muss.

Also nächstes mal einfach erstmal entspannt zurücklehnen und überlegen, was und wie man antwortet. Oder man hält einfach mal die Finger still. Auf die Grundlagen werden auch andere hinweisen.

rokli 16. Feb 2022 09:12

AW: Problem mit SQL.Add
 
Hi zusammen,

hat eigentlich jemand mal zum TRY - EXCEPT Block was inhaltlich gesagt?

Also ich mache das so

Delphi-Quellcode:
   try
      qry2.Open;
   except
      on E: Exception do begin
         ShowMessage(e.Message);
         ShowMessage(qry2.SQL.Text);
      end;
   end;
Das ist eine ganze einfach Variante, um überhaupt was zu sehen.

Wenn im SQL ein Fehler enthalten ist, wird durch den EXECPT das Programm in die Fehlerbehandlung geschickt. Durch den ersten SHOWMESSAGE die Fehlermeldung ansich gezeigt und der zweit SHOWMESSAGE zeigt mir den Inhalt der defekten SQL, damit ich mit der Fehleranalyse beginnen kann.

Und im wirklich Leben übergebe ich diese Daten an eine Prozedur, die mir diese Fehlermeldung (mit Programmnamen, Username, wann das gewesen ist, etc.) wiederum in eine DB schreibt. :cry: Da sollte dann natürlich kein Fehler drin passieren :wink:

Vielleich ist das ja noch eine kleine Anregung aus der geworfenen Fehlermeldung Nutzen zu ziehen ...

Beste Grüße

@Sinspin: Sorry - Du hattest das auch schon gezeigt! (Nachtrag)

BerndS 16. Feb 2022 10:31

AW: Problem mit SQL.Add
 
Da wurde schon drauf eingegangen.
Ich persönlich würde aber diese Variante bevorzugen und nur die Message ergänzen und die Anzeige der Exception der App überlassen oder zumindest nur einmal Showmessage aufrufen.

Delphi-Quellcode:
   try
     qry2.Open;
   except
      on E: Exception do
      begin
        E.Message := E.Message + #13 + qry2.SQL.Text;
        raise;
      end;
   end;

himitsu 16. Feb 2022 11:04

AW: Problem mit SQL.Add
 
Wenn "manueller" Zeilenumbruch, dann bitte #10 oder #13#10 oder sLineBreak, denn #13 wird manchmal garnicht als Zeilenumbruch von gewissen Komponenten/Programmen erkannt.

#13 aka CR heißt "vor zur ersten Spalte" (Carriage Return) und #10 aka LF heißt "in nächste Zeile" (Line Feed)
Somit ist Windows eigentlich der Einzige, der es richtig macht, genau so, wie die Drucker :angle:

Die Einzigen, die #13 hatten, war Apple und auch die haben das vor Jahren aufgegeben (sich die #10 von Linux geklaut).
Bleibt aktuell nur noch das kranke RichEdit im Windows, welches auch diesen Mist baut, wobei Delphi dort Eins drauf setzt und noch mehr Mist damit baut, weil es für die #13#10 daraus macht, aber das nur bei der Hälfte der APIs, womit die Indize von Chars im Text nicht mit SelStart/SelLength übereinstimmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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-2025 by Thomas Breitkreuz