Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO Daten übergabe (https://www.delphipraxis.net/50112-ado-daten-uebergabe.html)

ledoerr 20. Jul 2005 20:57

Datenbank: MSSQL Server • Zugriff über: gerne ADO

ADO Daten übergabe
 
Hallo zusammen

ich möchte gerne eine SOAP server-anwendung schreiben welche mir informationen aus einer SQL-tabelle geben soll.

die procedure sollten etwa so aussehen:

Delphi-Quellcode:
function TSQLService.GetMWSt(const SQLString: Double): (irgendeine Variable);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SQLString);
ADOQuery1.Open;

// Daten übergabe

end;
hat irgend jemand eine idee wie ich diese daten übergeben kann?

vielen danken im voraus

jensw_2000 20. Jul 2005 22:20

Re: ADO Daten übergabe
 
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

:hi:

ledoerr 21. Jul 2005 11:49

Re: ADO Daten übergabe
 
mh das ist nicht ganz das was ich brauchen.

Das resultat muss alle zeilen enthalten die ich abgefragt habe.

also ich gebe den SQL string an die Procedure und erhalte nachher eine Variable die ich als liste Darstellen kann.

danke aber für die Idee

jensw_2000 21. Jul 2005 11:56

Re: ADO Daten übergabe
 
Dann also eher Sowas ?

Delphi-Quellcode:
Function irgendwas():TStrings;
begin
 
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.text:='SELECT MWST FROM TABELLE1 WHERE...';
  ADOQuery1.Open;

  MeineListe.Clear;
  While not ADOQuery1.eof do
  begin
    MeineListe.add(ADOQuery1.fieldbyname('MWST').asstring;
    ADOQuery1.next;
  end;

  Result:=MeineListe;
end
;

ledoerr 21. Jul 2005 12:07

Re: ADO Daten übergabe
 
Jetzt nur noch unbekannt viele spalten weil die abfragen dynamisch sein können.

jensw_2000 21. Jul 2005 13:44

Re: ADO Daten übergabe
 
Dann kannst du das eventuell so machen (Kanns grade nicht testen ...)

myArray = mehrdimensionales DynArray, Eine TObjectlist oder was du gern verwendest

Delphi-Quellcode:
  While not ADOQuery1.eof do
  begin
    for i:=0 to AdoQuery1.fields.count.1 do
    begin
       MyArrAy[AdoQuery1.recno-1,i] := AdoQuery1.fields[i].asstring;
    end;
    ADOQuery1.next;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

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