Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stored procedure aufruf (https://www.delphipraxis.net/46990-stored-procedure-aufruf.html)

Luciano 4. Jun 2005 14:58

Datenbank: MSDE • Zugriff über: ADO

Stored procedure aufruf
 
:thumb: Hi,

ich habe das Problem mit dieser stored procedure
SQL-Code:
CREATE PROCEDURE berechne @MONAT int, @JAHR int
AS
SELECT * FROM TANKSTELLE
        WHERE MONTH(DATUM) = @MONAT
          AND YEAR(DATUM) = @JAHR
return
ich kann dies so aufrufen
Code:
DM1.ADOStoredProc1.Parameters.ParamValues['@Monat'] := StrToInt('4');
DM1.ADOStoredProc1.Parameters.ParamValues['@JAHR'] := StrToInt('2005');
DM1.ADOStoredProc1.open;
aber wenn ich es so probiere geht es nicht(ADOQuerry)
Code:
DM1.Q_Berechne.Close;
DM1.Q_Berechne.SQL.Clear;
DM1.Q_Berechne.SQL.Add('SELECT * FROM BERECHNE(4, 2005)');
DM1.Q_Berechne.Open;
Da ich damit noch nie gearbeitet habe(mit stored procedures) will ich eigentlich dahin das die Procedure so aussieht.
SQL-Code:
CREATE PROCEDURE berechne @MONAT int, @JAHR int, @GELD float output
AS
SELECT @GELD = SUM(PREIS)
      FROM TANKSTELLE
     WHERE MONTH(DATUM) = @MONAT
       AND YEAR(DATUM) = @JAHR
return
Zur Anzeige des Ergebnisses sollte das dann doch so aussehen, oder?
Code:
DM1.ADOStoredProc1.Parameters.ParamValues['@Monat'] := StrToInt('4');
DM1.ADOStoredProc1.Parameters.ParamValues['@JAHR'] := StrToInt('2005');
DM1.ADOStoredProc1.open;
Label4.Caption := FloatToStr(DM1.ADOStoredProc1.Parameters.ParamValues['@GELD']);
Ich bekomme aber volgende Meldung das der CommandText keine Ergebnismenge zurückgibt
Ich bin für alle Hilfe offen :thumb:

Danke

Albi 4. Jun 2005 17:49

Re: Stored procedure aufruf
 
Hallo,

Das kann nichts werden, Du must an eine SP Parameter übergeben. Bei Interbase/Firebird würde deine Abfrage so aussehen.

SQL-Code:
With Query1 Do
begin
  Close;
  SQL.Clear;
  SQL.ADD('Select * From Bereche(:Monat,:Jahr)';
  Params[0].value:= '4';
  Params[1].value:= '2005';
  Open
end;

alzaimar 4. Jun 2005 19:01

Re: Stored procedure aufruf
 
Doch, das kann was werden. Weil er auf die MSDE zugreifen will, und nicht auf Firebird. Es ist soweit alles korrekt. Versuchs mal mit ExecProc. Weiterhin brauchst du keine StrToInt Umwandlung. Die Schweinebacke von MSDE kriegen wir schon zum Laufen.

Weiterhin bringst du etwas durcheinander: Prozeduren, Funktionen und Views. Was Du machen willst (Select * from <Procedure> geht mit der MSDE so nicht. Wenn Du sowas machen willst, benutzt Du eine VIEW.

Also: Stored Procedures können Ergebnismengen zurückliefern, oder Parameter. So, wie Du es gemacht hast, ist es vollkommen richtig. Dein 'CREATE PROZEDURE' ist korrekt, und eigentlich sollte der Aufruf mit 'TADOStoredProc' auch korrekt sein. Jedenfalls fast. Du solltest ExecProc nehmen, statt Open.
Warum? Die Stored Procedure liefert ja einen Parameter zurück, und keine Ergebnismenge (z.B. eine Tabelle). Deshalb meckert ADO. Open erwartet IMMER eine Tabelle als Resultat (die darf auch leer sein). ExecProc nicht.

Luciano 4. Jun 2005 23:06

Re: Stored procedure aufruf
 
Danke! Das hat mir schon geholfen aber ein Problem habe ich immer noch, das richtig Ergebnis habe ich noch nicht, als Fehlermeldung bekommen ich jetzt
"Variante des Typ(Null) konnet nicht in Typ(String) konvertiert werden"
So wie sich das liest ist das bestimmt nur eine Kleinigkeit. Input/Output-Richtung der ADOStoredProc1 sind richtig definiert, genauso wie die Datentypen (float/double/integer)

Das Ergebnis sollte dann genauso aussehen wie ich es hier mache, nur wollte ich die Arbeit die MSDE machen lassen.

Delphi-Quellcode:
  with DM1.Q_Berechne do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT SUM(PREIS) AS KOSTEN,  ');
      SQL.Add('      SUM(LITER) AS SPRIT    ');
      SQL.Add('      FROM TANKSTELLE        ');
      SQL.Add(' WHERE MONTH(DATUM) = :v_Monat ');
      SQL.Add('  AND YEAR(DATUM) = :v_Jahr  ');
      Prepared := True;
      Parameters.ParamByName('v_Monat').Value := ComboBox1.Text;
      Parameters.ParamByName('v_Jahr').Value := ComboBox2.Text;
      Open;
    end;
  Label3.Caption := FloatToStrF(DM1.Q_Berechne.FieldByName('SPRIT').Value, ffFixed, 10, 2)+' L';
  Label4.Caption := FloatToStrF(DM1.Q_Berechne.FieldByName('KOSTEN').Value, ffCurrency, 10, 2);
Greets

Luciano

Luciano 4. Jun 2005 23:24

Re: Stored procedure aufruf
 
Hi...
Mein Problem hat sich erledig, nachdem sich Delphi aufgehängt hatte und vorher nur noch Müll von sich gegeben hat läuft das ganze jetzt. Vollständigkeitshalber hier alles zum nachlesen wie es funktioniert!

Die stored procedure
SQL-Code:
CREATE PROCEDURE berechne @MONAT int, @JAHR int, @GELD float OUTPUT
AS
SELECT @GELD = SUM(PREIS)
      FROM TANKSTELLE
     WHERE MONTH(DATUM) = @MONAT
       AND YEAR(DATUM) = @JAHR
return
Delphi, Über die Comboboxen :wink: wähle ich mir Datum und Jahr aus
Delphi-Quellcode:
procedure TFrmAnzeige.Button3Click(Sender: TObject);
begin
  with DM1.ADOStoredProc1 do
    begin
      Parameters.ParamValues['@Monat'] := ComboBox1.Text;
      Parameters.ParamValues['@JAHR'] := ComboBox2.Text;
      ExecProc;
      Label3.Caption := FloatToStrF(Parameters.ParamValues['@SPRIT'], ffFixed, 10, 2)+' L';
      Label4.Caption := FloatToStrF(Parameters.ParamValues['@GELD'], ffCurrency, 10, 2);
    end;
end;
[edit]Dummheitsfehler entfert[/edit]

Greets

Luciano


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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