Thema: Delphi ADO Daten übergabe

Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: ADO Daten übergabe

  Alt 20. Jul 2005, 22:20
Da gibt es mehrere Varianten. Zwei davon möchte ich ich kurz anschneiden.

Die Erste Variante kannst du nutzen ohne Änderunegn an der DB zu machen:

Rufe die Funktion wie folgt auf:

Delphi-Quellcode:
  MwSTValue:=GetMWSt('SELECT MwST FROM Position WHERE PosNr=1313' );
  case MwStValue of
    -1: ShowMessage('Die Abfrage liefert keine Rückgabemenge');
    -2: ShowMessage('Die Abfrage liefert mehr als einen Datensatz');
    -3: ShowMessage('Die Abfrage einen ungültigen Wert für MwSt');
  end;

  if MwStValue<0 then exit;

  ...
  ...
Die AdoQuery liefert also nur eine Spalte mit dem Namen MwST zurück ...
Daher kannst du die function wie folgt umbauen

Delphi-Quellcode:
function TSQLService.GetMWSt(SQLString:String): Double;
  var t:Variant;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.text(SQLString);
  ADOQuery1.Open;
  
  // Rückgabe der Query rrüfen
   
  case AdoQuery1.RecordCount of
    1: t:=AdoQuery1.FieldValues['MwSt'] ; // Nimm den Wert aus dem Feld
    0: t:=-1 ; // SELECT verweist auf keinen Datensatz, "Kennung -1"
    2..999999999999999: t:=-2 // SELECT verweist nicht eindeutig auf einen Datensatz "Kennung -2"
  end;

  AdoQuery1.close;

  // Inhalt von "t" prüfen

  if VarType(t) <>VarNULL
  begin
    if not TryStrToFloat(t) then t:=-3 ; // -3 = Kennung für ungültigen Wert
  end
  else begin
    t:=-3;
  end;

  result:=t;

end;
-----------------------------------------------------------------------------------------

Variante 2 halte ich für wesenflich besser, weil fest codierter SQL Code fast immer ein Klotz am Bein ist.
Ausserdem möhlt man sich das Projekt unnötig mit Komponenten voll und eine SP kann man auch mal schmell beim Kunden umstricken, falls dieser mal wieder Sonderwünsche hat ...


Baue die auf dem SQL-Server eine SP
z.B.

SQL-Code:
CREATE PROCEDURE dbo.GetPositionMwSt
  @PosNr INT = NULL,
  @MwSt DECIMAL = NULL OUTPUT;
AS
BEGIN

  IF @PosNr IS NULL
  BEGIN
    SET @MwSt = -1 -- Kennung für "kein Datensatz"
    RAISERROR('Die SP muss mit einer Positionsnummer aufgerufen werden !',16,1,'SQL')
  END
  ELSE BEGIN
    SELECT @MwSt = MwSt From Positionen WHERE PosNr = @PosNr
    IF @MwSt IS NULL SET @MwST = -3 -- Kennung für "ungültiger Wert"
    IF @@RECORDCOUNT = 0 SET @MwST = -1 -- Kennung für "kein Datensatz"
    IF @@RECORDCOUNT > 1 SET @MwST = -2 -- Kennung für "zu viele Datensätze"
  END

END;
In Delphi würde ich das dann so aufrufen

Delphi-Quellcode:
function TSQLService.GetMWSt(PosNr:Integer): Double;
  var SP:TAdoStoredProc;
begin
  SP:=TAdoStoredProc.create(self);
  SP.Connection:=Datamodule1.AdoConnection1; // Hier deine AdoConn
  try
    SP.Procedurename:='GetPositionMwSt';
    SP.Parameters.refresh;
    SP.Parameters[1].Value:=PosNr;
    SP.ExecProc;

    Result:=SP:Parameters[2].Value;

  finally
    FreeAndNil(SP);
  end;

Hoffe es hilft,

Schöne Grüße,
Jens

  Mit Zitat antworten Zitat