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