AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ADO Daten übergabe

Ein Thema von ledoerr · begonnen am 20. Jul 2005 · letzter Beitrag vom 21. Jul 2005
 
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
 


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:43 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