Einzelnen Beitrag anzeigen

ioster

Registriert seit: 15. Aug 2008
84 Beiträge
 
Delphi 10.3 Rio
 
#1

FireDAC: Verhalten von Params

  Alt 29. Jan 2021, 12:10
Datenbank: MS SQL Server • Version: 2008 • Zugriff über: FireDAC
Moin,

ich habe ein Verständnisproblem mit der Art und Weise, wie eine FDQuery die Übergabe von Parametern abwickelt. Hintergrund ist im Augenblick eine Druckroutine, die von einer Stammverwaltung als auch aus einem Beleg aufgerufen werden kann.

Probleme treten nun auf, wenn man den Druck nacheinander über Kreuz aufruft. Dann ist der Parameter, der für die Eingrenzung des Stammdatensatzes benötigt wird, nämlich schon gefüllt und ein neuer Wert wird ignoriert.

Bevor ich den Druck anstoße, schließe ich jedoch die Abfrage und setze den kompletten Abfrageinhalt mit CLEAR zurück. Anschließend wird die Abfrage neu aufgebaut. Parameter übergebe ich mit Parambyname, sofern der Wert nicht aus einer referenzierenden Datenquelle geholt werden soll. In dem Fall reicht die Definition eines Params mit ":" im SQL-Statement.

Jetzt wundere ich mich aber über die Verwaltung der Parameterwerte, denn es macht einen Unterschied, ob ich den Wert über Parambyname übergebe oder im SQL-Statement als Wert mit versenke.

Normalerweise würde ich es so formulieren:
Delphi-Quellcode:
  with Druckmodul.QrMaschine Do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM MASCHINEN M');
      SQL.Add('WHERE (M.MaschinenNr = :Maschinennr)');
      Parambyname('Maschinennr').AsString := ParamRef;
      Open;
    end;
Dabei wird ParamRef als Wert an die Parameter an die Prozedur übergeben und der Wert entspricht auch dem gewünschten Datensatz.

Wenn ich aber vorab z.B. Maschine 1234 über die Stammdatenverwaltung aufgerufen habe und anschließend aus dem Beleg Maschine 3676 ausgegeben haben möchte, bekomme ich 1234 ausgegeben, obwohl ParamRef 3676 als Wert enthält.

Es ist etwas anderes, wenn ich den Wert so in das Statement einbeziehe:
Delphi-Quellcode:
  with Druckmodul.QrMaschine Do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM MASCHINEN M');
      SQL.Add('WHERE (M.MaschinenNr = ' + QuotedStr(ParamRef) + ')');
      Open;
    end;
Ich weiß wirklich nicht, was ich davon halten soll. Jeder hat seinen Programmierstil irgendwann gefunden, um mit wenig Aufwand sein Ziel erreichen zu können und trotzdem einen lesbaren Quellcode zu haben. Mein Geschmack ist das Einflechten des Wertes in das SQL-Statement nicht. Vor allem muss auch jedes Mal bei einem String ein QuotedStr oder AnsiQuotedStr um den Ausdruck gesetzt werden.

Kann mir einer verraten, warum das so ist und wie man das Problem lösen kann?

Viele Grüße
Ingo
  Mit Zitat antworten Zitat