Hy!
Ich habe folgendes Problem. Ich habe mehrere Abfragen geschrieben die ich für eine Umsatzliste brauche, diese sind nach Lieferant bzw. Artikel sortiert. Diese Scripte werden dann zu einer ganzen Liste zusammengeführt. Jetzt habe ich aber folgendes Problem: Ich brauche eine Funktion oder Ähnliches. Es geht darum das der zuständige Sachbearbeiter den Monat in ein Programm eingibt für den er die Umsatzliste braucht und die Funktion soll die richtige Liste(also nach Monat) ausgeben. Wenn er den Monat 11 eingibt soll also die Umsatzliste für den November ausgegeben werden. Ich hoffe ihr könnt mir helfen! Danke schonmal im Voraus!
Hier ist noch eine meiner Abfragen:
select a.arnr, a.arbe, b.lief, b.me11 as VK_Menge_Nov, b.vk11 as Umsatz_Nov, c.effb as Lagerbestand, b.meges as VK_Menge_Jahr, b.vkges as Umsatz_Jahr, b.gsart, c.lanr, b.jahr
from t051art a, t158arst b, t075lag c
where a.manr=1
AND a.manr=b.manr(+)
AND b.manr=c.manr(+)
AND a.arnr=b.arnr(+)
AND b.arnr=c.arnr(+)
AND b.lanr=c.lanr(+)
AND a.krnr=b.lief(+)
AND a.krnr(+)=‚84036‘
AND NOT b.lief(+)=‚72048‘
AND NOT b.lief(+)=‚72049‘
AND NOT b.gsart(+)=’ ’
AND b.jahr(+)=‚2006‘
order by a.arnr
verstehe ich dein Problem insoferne richtig, als es daher kommt, dass du deine Umsätze usw. in je einer Tabellenspalte für jedes Monat ablegst, und daher für verschiedene Monate verschiedene Queries benötigst?
Wenn ja, dann würde ich das Datenmodell entsprechend anpassen, dann ist der Wert, den der User eingibt einfach nur noch ein Parameter in der Where-Bedingung, und das sollte ja einfach sein.
Gruß
Martin
P.S.: Wenn ich tatsächlich recht habe, dann hast du mit hoher Wahrscheinlichkeit ein ziemlich grausames Datenmodell.
Hallo TheBeast!
Bei uns im Betrieb gab es bisher immer eine seperate Umsatzliste für jeden Monat, die per Hand bearbeitet wurde. Es gab mehrere Spalten, einmal die Umsätze der Artikel für den laufenden Monat und daneben dann noch die Umsätze für das Laufende Jahr. Und so sollte ich es eigentlich übernehmen, mein Ausbilder meinte das er es so haben will das der jeweilige Sachbearbeiter einfach nur den Monat in eine Maske(nicht PL/SQL) eingeben muß so das er dann wie gesagt die laufende Monats-Umsatzliste zurückbekommt.Ich solle es so anpassen das SQL die jeweiligen Eingaben des Sachbearbeiters auch richtig zurückgibt, das heisst Eingabe=11 = Umsatzliste November, Eingabe=12 = Umsatzliste Dezember. Sorry wenn ich es nicht besser erklären kann, ich bin auch leider kein SQL-Profi, nur ein kleiner Azubi
Ich gehe mal davon aus das du recht hast, ich habe jetzt um die 15 Scripte die ich dann noch alle zu einer Liste zusammenfügen muss :-/
Gruß
Oliver
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
FUNCTION sal\_ok (salary REAL, title VARCHAR2) RETURN BOOLEAN IS
min\_sal REAL;
max\_sal REAL;
BEGIN
SELECT losal, hisal INTO min\_sal, max\_sal FROM sals
WHERE job = title;
RETURN (salary \>= min\_sal) AND (salary
Die Doku:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/08\_subs.htm#657
Variante b
Auf Grund eines verkorksten Datenmodells brauchst du 15 verschiedene Selectstatements, je nachdem welcher Monat eingegeben wird (da wir nur 12 Monate haben vermutlich nicht passend, aber seis drum)
Antwort 1
Du baust für jedes der Selectstatements eine Funktion und wählst per if then else die passende aus.
Doku:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/04\_struc.htm#514
Antwort 2
Je nachdem wie unterschiedlich deine statements sind, kannst du sie dir vielleicht auch dynamisch zusammenbauen:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems18.htm#33889
Variante c
Du kennst den ganzen Kram den ich bisher geschrieben hab, fühlst dich leicht verarscht und willst eigentlich wissen wie du das Ergebnis deines Selects zurückgeben kannst.
Entweder per Ref Cursor
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems13.htm#33512
oder in Collections
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems8.htm#33101
Ich merke gerade .. du hast Oracle 8 .. müsste dort eigentlich alles sehr ähnlich sein, aber du solltest die Begriffe sicherheitshalber in der passenden Doku Version noch man nachschlagen.
Jens
wenn ich Dich richtig verstanden hab´, ist das hier sowas was Du haben willst:
CREATE OR REPLACE
FUNCTION f_umsatz(
p_datum IN DATE DEFAULT SYSDATE
)
RETURN VARCHAR2 IS
v_return VARCHAR2(4000):=’’;
CURSOR cur_ums IS
SELECT a.arnr
,a.arbe
,b.lief
,b.me11 as VK_Menge_monat
,b.vk11 as Umsatz_monat
,c.effb as Lagerbestand
,b.meges as VK_Menge
,b.vkges as Umsatz
,b.gsart
,c.lanr
,b.jahr
FROM t051art a
,t158arst b
,t075lag c
WHERE a.manr=1
AND a.manr=b.manr(+)
AND b.manr=c.manr(+)
AND a.arnr=b.arnr(+)
AND b.arnr=c.arnr(+)
AND b.lanr=c.lanr(+)
AND a.krnr=b.lief(+)
AND a.krnr(+)=‚84036‘
AND NOT b.lief(+)=‚72048‘
AND NOT b.lief(+)=‚72049‘
AND NOT b.gsart(+)=’ ’
AND b.jahr(+)= TO_CHAR(p_datum,‚yyyy‘)
ORDER BY a.arnr;
rec_ums cur_ums%ROWTYPE;
BEGIN
FOR rec_ums IN cur_ums LOOP
v_return :=(rec_ums.arnr||’;’||
rec_ums.arbe||’;’||
rec_ums.lief||’;’||
rec_ums.VK_Menge_monat||’;’||
rec_ums.Umsatz_monat||’;’||
rec_ums.Lagerbestand||’;’||
rec_ums.VK_Menge||’;’||
rec_ums.Umsatz||’;’||
rec_ums.gsart||’;’||
rec_ums.lanr||’;’||
rec_ums.jahr||’;’);
END LOOP;
RETURN v_return ;
EXCEPTION
WHEN OTHERS THEN
RETURN SQLCODE||’ Fehler aufgetreten! '||SQLERRM ;
END;
/