fuer dummies: procedure aufrufen

09/03/2010 - 11:10 von Nicole Wagner | Report spam
Hallo User,

ich fuehle mich wie in der Gummizelle!
Ich kann keine Procedure aufrufen.


Die gewuenschte Funktion:

Alle Datensaetze stammen aus irgendeinem Monat, in irgendeinem Jahr.
Sehr oft stellt sich diese Aufgabe:
'Liefere mir jenen Datensatz einer Gruppe, der im "existierenden Monat
davor" liegt.'
Also z.B. habe ich den August 2008.
Die Suche koennte etwa ergeben: Juni 2008.

Ich dachte mir, ok, ich multipliziere die Jahre mit 12 und addiere das
Monat dazu. Die naechstkleinere Zahl muss der vorige Datensatz sein.


Sieht so aus:

CREATE PROCEDURE k_Laufzeit
returns (
laufzeit integer)
as
begin
select JAHR_AUS_NAME * 12 + MONATSKENNZAHL from tbk
into :laufzeit;
end;

Soweit, so gut.

woran ich scheitere, ist diese Prozedur auch einzusetzen.
Die Abfrage sieht ganz falsch aus und ist es auch lt.Compiler.
(Oder ist die select-Abfrage in der Procedur schon falsch?)


Es sollte so ungefaehr aussehen:

select max(k_Laufzeit) < Vergleichswert(k_Laufzeit),
tbk.name_, tbk.angabe1, tbk.angabe2,...
from tbk
where
( (Kriterium = 'mykriterium')
group by tbk.name_;


Unnoetig zu sagen, dass ich die Anzahl der Rechenoperationen klein
halten moechte.


Danke fuer Tipps!
Nicole
 

Lesen sie die antworten

#1 lothar.armbruester
09/03/2010 - 20:53 | Warnen spam
"Nicole Wagner" writes:

Hallo User,

ich fuehle mich wie in der Gummizelle!
Ich kann keine Procedure aufrufen.


Die gewuenschte Funktion:

Alle Datensaetze stammen aus irgendeinem Monat, in irgendeinem Jahr.
Sehr oft stellt sich diese Aufgabe:
'Liefere mir jenen Datensatz einer Gruppe, der im "existierenden Monat
davor" liegt.'
Also z.B. habe ich den August 2008.
Die Suche koennte etwa ergeben: Juni 2008.

Ich dachte mir, ok, ich multipliziere die Jahre mit 12 und addiere das
Monat dazu. Die naechstkleinere Zahl muss der vorige Datensatz sein.


Sieht so aus:

CREATE PROCEDURE k_Laufzeit
returns (
laufzeit integer)
as
begin
select JAHR_AUS_NAME * 12 + MONATSKENNZAHL from tbk
into :laufzeit;
end;

Soweit, so gut.

woran ich scheitere, ist diese Prozedur auch einzusetzen.
Die Abfrage sieht ganz falsch aus und ist es auch lt.Compiler.
(Oder ist die select-Abfrage in der Procedur schon falsch?)



Das Problem ist, dass die Funktion einen Wert zurückgibt, Du aber im
Select vermutlich mehrere Werte bekommst. Ich weiß jetzt nicht, wie
Firebird auf soetwas reagiert, aber Oracle gibt in so einem Fall eine
Fehlermeldung aus.

Es sollte so ungefaehr aussehen:

select max(k_Laufzeit) < Vergleichswert(k_Laufzeit),
tbk.name_, tbk.angabe1, tbk.angabe2,...
from tbk
where
( (Kriterium = 'mykriterium')
group by tbk.name_;





Ohne Firebird jetzt genau zu kennen vermute ich, dass ein Ausdruck wie

max(k_Laufzeit) < Vergleichswert(k_Laufzeit)

syntaktisch nicht korrekt ist. Einerseits vergleichst Du das Maximum,
also eine Aggregation mit einer anderen Funktion eines Wertes, was im
SQL eigentlich nur in der Having-Klausel möglich ist. Andererseits hast
Du einen booleschen Ausdruck in der Select-Liste, wobei ich nicht weiß, ob
Firebird das akzeptiert.

Unnoetig zu sagen, dass ich die Anzahl der Rechenoperationen klein
halten moechte.



Irgenwie verstehe ich die Anforderung nicht wirklich. Meinst Du, Du
möchtest alle Datensàtze einer Gruppe, die einen Monat vor dem maximalen
Monat dieser Gruppe liegen?
Oder ist der Monat fest und Du willst einfach die Datensàtze des Vormonats?

Danke fuer Tipps!
Nicole




HTH,
Lothar

Lothar Armbrüster |
Hauptstr. 26 |
65346 Eltville |

Ähnliche fragen