AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Stored procedure aufruf

Stored procedure aufruf

Ein Thema von Luciano · begonnen am 4. Jun 2005 · letzter Beitrag vom 5. Jun 2005
Antwort Antwort
Luciano

Registriert seit: 17. Dez 2003
Ort: Großostheim
126 Beiträge
 
Turbo Delphi für Win32
 
#1

Stored procedure aufruf

  Alt 4. Jun 2005, 15:58
Datenbank: MSDE • Zugriff über: ADO
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

Danke
Mike Santangelo
Wie kann ich den wissen was ich denke, wenn ich nicht höre was ich sage!
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#2

Re: Stored procedure aufruf

  Alt 4. Jun 2005, 18:49
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;
Gruß

Albi
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Stored procedure aufruf

  Alt 4. Jun 2005, 20:01
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Luciano

Registriert seit: 17. Dez 2003
Ort: Großostheim
126 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Stored procedure aufruf

  Alt 5. Jun 2005, 00:06
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
Mike Santangelo
Wie kann ich den wissen was ich denke, wenn ich nicht höre was ich sage!
  Mit Zitat antworten Zitat
Luciano

Registriert seit: 17. Dez 2003
Ort: Großostheim
126 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Stored procedure aufruf

  Alt 5. Jun 2005, 00:24
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 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
Mike Santangelo
Wie kann ich den wissen was ich denke, wenn ich nicht höre was ich sage!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:48 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