Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird mehrere where-Bedingungen (https://www.delphipraxis.net/208900-firebird-mehrere-where-bedingungen.html)

harfes 27. Sep 2021 11:06

Datenbank: Firebird • Version: 3.07 • Zugriff über: Delphi

Firebird mehrere where-Bedingungen
 
Ich versuche in eine (Firebird-)Tabelle Daten zurückzuschreiben, dazu nutze ich in Delphi (mit den Devart-Komponenten IBDAC):

with DM1.DataModule1.IBCVATNQuery do
begin
SQL.Clear;
SQL.Add('update VATN set ');
SQL.Add('RECHNUNG = :RECHNUNG, RENR = : RENR ');
SQL.Add('where TEILNEHMERID = :OLD_TEILNEHMERID and VATNID = :OLD_VATNID');
Params[0].Value := 'T';
Params[1].Value := NewID;
Params[2].Value := TNVAID;
Params[3].Value := ReErstVAID;
ExecSQL;
Close;
end;

Da bekomme ich aber immer "Argument ausserhalb des Bereichs"???? Ich habe schon versucht, um die where-Klausel Klammern zu setzen, aber das war's wohl auch nicht...die Werte in den Parametern sind ok.

Weiss jemand Rat?

Hartmut

braunbaer 27. Sep 2021 11:08

AW: Firebird mehrere where-Bedingungen
 
Da ist dir ein Leerschlag dazwischen gekommen (RENR = : RENR)
Zitat:

Zitat von harfes (Beitrag 1495436)
SQL.Add('RECHNUNG = :RECHNUNG, RENR = : RENR ');


harfes 27. Sep 2021 11:37

AW: Firebird mehrere where-Bedingungen
 
Danke braunbaer!!! Grrrr, manchmal sieht man einfach den Wald vor lauter Bäumen nicht...

Hartmut

haentschman 27. Sep 2021 12:06

AW: Firebird mehrere where-Bedingungen
 
Hallöle...:P
Zitat:

manchmal sieht man einfach den Wald vor lauter Bäumen nicht...
..das hättest du bestimmt im Debugger gesehen (SQL.Text) ...ach nein, der Debugger zeigt das durch das WITH nichts an. :roll:

Besser:
Delphi-Quellcode:
var
  Query: TIBQuery;
begin
  Query := DM1.DataModule1.IBCVATNQuery;
 
  Query.SQL.Text := 'update VATN set ';
  Query.SQL.Add('RECHNUNG = :RECHNUNG, RENR = :RENR ');
  Query.SQL.Add('where TEILNEHMERID = :OLD_TEILNEHMERID and VATNID = :OLD_VATNID');
  Query.ParamsByName('RECHNUNG').AsString := 'T';
  Query.ParamsByName('RENR').AsInteger := NewID;
  Query.ParamsByName('OLD_TEILNEHMERID').AsInteger := TNVAID;
  Query.ParamsByName('OLD_VATNID').AsInteger := ReErstVAID;
  Query.ExecSQL;
end;
Unterschied:
1. Der Debugger zeigt Werte an
2. AsXXXX kein cast nötig durch richtige Typen

harfes 27. Sep 2021 12:38

AW: Firebird mehrere where-Bedingungen
 
Hallo haentschman,

ich nutze gerne die von mir verwendete Schreibweise, da für mich übersichtlicher (oder auch Gewohnheit...) - was mich aber erstaunt: dann zeigt mir der Debugger Fehler innerhalb des SQL an? Wenn dem so ist, dann ist mir das neu. Werde ich mal testen...

Hartmut

haentschman 27. Sep 2021 13:10

AW: Firebird mehrere where-Bedingungen
 
Zitat:

dann zeigt mir der Debugger Fehler innerhalb des SQL
Der Debugger zeigt dir den SQL.Text oder den Parameterinhalt an wenn du mit der Maus darübergehst. Logische SQL Fehler kann der gar nicht wissen...:wink:

himitsu 27. Sep 2021 14:02

AW: Firebird mehrere where-Bedingungen
 
Zitat:

Delphi-Quellcode:
var
  Query: TIBQuery;
begin
  ...
  Query := DM1.DataModule1.IBCVATNQuery;
  Query.SQL.Text := 'update VATN set ';
  ...

Geht ja jetzt auch so, als Ersatz für ein WITH:
Delphi-Quellcode:
begin
  ...
  var Q := DM1.DataModule1.IBCVATNQuery;
  Q.SQL.Text := 'update VATN set ';
  Q.SQL.Add('RECHNUNG = :RECHNUNG, RENR = :RENR ');
  ...
bzw.
Delphi-Quellcode:
  var Q := DM1.DataModule1.IBCVATNQuery;
  Q.SQL.Text :=
      'update VATN '#10
    + 'set RECHNUNG = :RECHNUNG, RENR = :RENR '#10
    + 'where TEILNEHMERID = :OLD_TEILNEHMERID and VATNID = :OLD_VATNID';
  Q.ParamsByName('RECHNUNG').AsString := 'T';
  Q.ParamsByName('RENR').AsInteger := NewID;
  Q.ParamsByName('OLD_TEILNEHMERID').AsInteger := TNVAID;
  Q.ParamsByName('OLD_VATNID').AsInteger := ReErstVAID;
  Q.ExecSQL;

haentschman 30. Sep 2021 07:55

AW: Firebird mehrere where-Bedingungen
 
Hallöle...8-)

Um die Add oder die + #13 + Orgien zu entsorgen, kann man auch folgendes machen... https://www.delphipraxis.net/49505-s...einbinden.html

Frickler 30. Sep 2021 08:47

AW: Firebird mehrere where-Bedingungen
 
Und obwohl das
Delphi-Quellcode:
var Q := DM1.DataModule1.IBCVATNQuery; begin
  Q.SQL.Text :=
      'update VATN '#10
    + 'set RECHNUNG = :RECHNUNG, RENR = :RENR '#10
    + 'where TEILNEHMERID = :OLD_TEILNEHMERID and VATNID = :OLD_VATNID';
  [...]
  Q.ExecSQL;
end;
optisch besser aussieht, ist das
Delphi-Quellcode:
begin var Q := DM1.DataModule1.IBCVATNQuery;
  Q.SQL.Text :=
      'update VATN '#10
    + 'set RECHNUNG = :RECHNUNG, RENR = :RENR '#10
    + 'where TEILNEHMERID = :OLD_TEILNEHMERID and VATNID = :OLD_VATNID';
  [...]
  Q.ExecSQL;
end;
programmiertechnisch besser, denn es hält die Variable lokal zur Benutzung im Block.

Ich habe jetzt kein Delphi 10.4, aber ich nehme mal stark an, das "var" im begin-end Block ist auch nur in diesen Block gültig, oder nicht?

MyRealName 30. Sep 2021 10:45

AW: Firebird mehrere where-Bedingungen
 
Zitat:

Zitat von himitsu (Beitrag 1495448)
Zitat:

Delphi-Quellcode:
var
  Query: TIBQuery;
begin
  ...
  Query := DM1.DataModule1.IBCVATNQuery;
  Query.SQL.Text := 'update VATN set ';
  ...


Sollte da nicht auch ein absolute gehen ?

Code:
var Query: TIBQuery absolute DM1.DataModule1.IBCVATNQuery;
Oder geht das nur bei Übergabe-Parametern ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Seite 1 von 2  1 2      

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