![]() |
Datenbank: MSDE • Zugriff über: ADO
Stored procedure aufruf
:thumb: Hi,
ich habe das Problem mit dieser stored procedure
SQL-Code:
ich kann dies so aufrufen
CREATE PROCEDURE berechne @MONAT int, @JAHR int
AS SELECT * FROM TANKSTELLE WHERE MONTH(DATUM) = @MONAT AND YEAR(DATUM) = @JAHR return
Code:
aber wenn ich es so probiere geht es nicht(ADOQuerry)
DM1.ADOStoredProc1.Parameters.ParamValues['@Monat'] := StrToInt('4');
DM1.ADOStoredProc1.Parameters.ParamValues['@JAHR'] := StrToInt('2005'); DM1.ADOStoredProc1.open;
Code:
Da ich damit noch nie gearbeitet habe(mit stored procedures) will ich eigentlich dahin das die Procedure so aussieht.
DM1.Q_Berechne.Close;
DM1.Q_Berechne.SQL.Clear; DM1.Q_Berechne.SQL.Add('SELECT * FROM BERECHNE(4, 2005)'); DM1.Q_Berechne.Open;
SQL-Code:
Zur Anzeige des Ergebnisses sollte das dann doch so aussehen, oder?
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
Code:
Ich bekomme aber volgende Meldung das der CommandText keine Ergebnismenge zurückgibt
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 bin für alle Hilfe offen :thumb: Danke |
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; |
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. |
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:
Greets
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); Luciano |
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:
Delphi, Über die Comboboxen :wink: wähle ich mir Datum und Jahr aus
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-Quellcode:
[edit]Dummheitsfehler entfert[/edit]
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; Greets Luciano |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 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