AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Rekursion in StoredProcedure vermeiden,aber wie
Thema durchsuchen
Ansicht
Themen-Optionen

Rekursion in StoredProcedure vermeiden,aber wie

Ein Thema von Nightfly · begonnen am 31. Mär 2004 · letzter Beitrag vom 1. Apr 2004
Antwort Antwort
Nightfly

Registriert seit: 25. Mär 2004
Ort: Dresden
118 Beiträge
 
#1

Rekursion in StoredProcedure vermeiden,aber wie

  Alt 31. Mär 2004, 12:50
Hi

ich kömpfe immer noch mit meiner doch jetzt schon recht großen Prozedur. Leider ist meine bisher einzige lösung,das sie sich selbst rekursiv aufruft,aber das ist wohl tödlich (und verursacht die fehlermeldung "too many concurrent executions of the same request"
Die Prozedur berechnet Summenzeilen aus rechnungen. Das ist auch kein Problem. Bloß wenn aus diesen Summenzeilen wieder summen gebildet werden sollen, stoße ich an meine Grenzen. denn diese "2 generation summenzeilen" kann ich nicht aus den rechnungen berechen, sondern aus der "ersten generation" summenzeilen...

SQL-Code:
CREATE PROCEDURE SUMMIEREN (
    STELLE CHAR(9),
    JAHR INTEGER)
RETURNS (
    BEREICH INTEGER,
    BEZ CHAR(32),
    ALLES FLOAT,
    JAN FLOAT,
    FEB FLOAT,
    MAR FLOAT,
    APR FLOAT,
    MAI FLOAT,
    JUN FLOAT,
    JUL FLOAT,
    AUG FLOAT,
    SEP FLOAT,
    OKT FLOAT,
    NOV FLOAT,
    DEZ FLOAT)
AS
DECLARE VARIABLE SUBTRAHEND INTEGER;
DECLARE VARIABLE MINUEND INTEGER;
DECLARE VARIABLE ANZAHL INTEGER;
DECLARE VARIABLE DIF2 INTEGER;
DECLARE VARIABLE DIF1 INTEGER;
DECLARE VARIABLE ISINHAUPTKEYS INTEGER;
begin
  for select ID,BEZ from MAIN B where B.STELLE = :STELLE order by id
  into :BEREICH, :BEZ do
  begin
    select count(*) from vorgabe where ID = :bereich into :Anzahl;
    if (:ANZAHL = 1) then
    begin /* die direkten parents berechnen */
    select count(*) from hauptkeys where ID = :bereich into :ISINHAUPTKEYS;
    if (:ISINHAUPTKEYS = 1) then
      begin
      select sum(R_ANZ * R_EPREIS) from RECHNUNG R, MAIN M
      where (R.stelle = :Stelle) and (M.stelle = R.Stelle) and (R.bereich = M.ID) and (M.parent = :BEREICH) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=1)
      into :JAN;
      select sum(R_ANZ * R_EPREIS) from RECHNUNG R, MAIN M
      where (R.stelle = :Stelle) and (M.stelle = R.Stelle) and (R.bereich = M.ID) and (M.parent = :BEREICH) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=12)
      into :DEZ;
      suspend;
      end
    else
       begin /* "=" zeilen berechnen */
       select max (id) from hauptkeys where id < :bereich into :minuend;
       select parent from hauptkeys where id = :bereich into :subtrahend;
        select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :minuend) into dif1;
        select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :subtrahend) into dif2;
        JAN = :DIF1 -:DIF2;
       suspend;
       end
     end
    else
    begin
      select sum(R_ANZ * R_EPREIS) from RECHNUNG R
      where (R.bereich = :BEREICH) and (R.stelle = :Stelle) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=1)
      into :JAN;
      select sum(R_ANZ * R_EPREIS) from RECHNUNG R
      where (R.bereich = :BEREICH) and (R.stelle = :Stelle) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=12)
      into :DEZ;
      suspend;
    end
  end
end

Das Problem ist der rekursive Aufruf bei /* "=" zeilen berechnen */ Dieser wäre im Grunde nicht nötig, denn die dort geholten werte,die dif1 und dif2 zugewiesen werden, sind in der aktuellen instanz schon fertig berechnet und vorhanden,aber ich komm ja nicht mehr an die ran. oder doch?
Oder gibts ne elegantere Lösung?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Rekursion in StoredProcedure vermeiden,aber wie

  Alt 31. Mär 2004, 15:55
Hi,

von dem mal abgesehen, dass ich nicht kapiere was Du berechnen willst, solltest Du ganz "normal" innerhalb einer SP mit dem Variablenname auf eine Variable zugreifen können. Teil weise musst Du nen : vor den Namen setzen.

Wenn Deine fertigen Summen also in den Variablen "JAN" und "DEZ" stehen erhälst Du so die Differenz:

Differenz= :JAN - EZ;

nur hast Du an der Stelle eigentlich noch keien JAN bzw. DEZ, da es der else-Zweig einer if-Verzweigung ist und vor der IF zählst Du nur irgendwelche Datensätze...

Grüße
Lemmy
  Mit Zitat antworten Zitat
Nightfly

Registriert seit: 25. Mär 2004
Ort: Dresden
118 Beiträge
 
#3

Re: Rekursion in StoredProcedure vermeiden,aber wie

  Alt 31. Mär 2004, 16:30
wenn die for schleife einmal abgearbeitet ist,habe ich ein n-Tupel (die ganzen return werte) Wenn jetzt die for schleife 10 mal abgearbeitet ist,habe ich also schon 10 Datensätze,die die Prozedur ausgespuckt hat. AN DIESER STELLE NUN hätte ich aber gern den datensatz 2(also den den die Prozedur nach dem zweiten durchlauf der for schleife ausgegeben hat)

Intuitiv würde ich ihn über den befehl
select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :minuend) into dif1; holen,denn das feld bereich identifiziert diesen datensatz eindeutig. Aber wie gesagt,rufe ich damit ja die prozedur wieder auf,und das geht schief.

Meine frage ist im grunde: Gibt es sowas:

 select JAN from bereits_ermittelte_ergebnismenge where bereich = :minuend Ich hoffe ich konnte dir bissl klar machen was ich will.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Rekursion in StoredProcedure vermeiden,aber wie

  Alt 1. Apr 2004, 07:59
Guten Morgen,

ich glaube du hast einen Denkfehler (oder ich habe Dich falsch verstanden!): Der DO-Bereich einer For-Select SChleife wird bei jedem einzelnen Datensatz durchlaufen, wie bei Delphi eben (FOR i:=1 to 10 DO).

Was ich immer noch nicht ganz kapiert habe (liegt vielleicht an der Uhrzeit ) willst Du nur den 2. Datensatz der 10 haben, oder den 2. Datensatz an der 11. Stelle nochmal? Im ersten Fall kannst Du das einfach mit einer entsprechenden Select machen, mit der Du die StoredProcedure aufrufst (aus dem Client heraus).

Grüße
Lemmy
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:00 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