Einzelnen Beitrag anzeigen

Delix

Registriert seit: 4. Mai 2004
Ort: Lippstadt
56 Beiträge
 
#6

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 11:20
Hallo,

mit den bisherigen Antworten kann ich leider wenig anfangen, da eine meiner Aussagen nicht berücksichtigt wird:

Die Procedure läuft intern absolut korrekt ab. Das habe ich aus der Procedure heraus protokolliert. Die Rückgabe-Variable ist bis zum Schluss absolut korrekt berechnet! Da fallen joins's oder Nullwerte wohl aus.

hier die Procedure:


SQL-Code:
ALTER PROCEDURE P_GETLAGERWERT ( DATUM DATE )
RETURNS ( LGWERT NUMERIC(12,2) )
AS
DECLARE ARTNR VARCHAR(50);
DECLARE BEREINH NUMERIC (10,3);
DECLARE LGNR INTEGER;
DECLARE LE_EK NUMERIC (12,4);
DECLARE ART_EKNETTO NUMERIC (12,4);
DECLARE BESTAND NUMERIC (11,3);
DECLARE BER_BESTAND NUMERIC (11,3);
DECLARE BEST_OHNE_RECHNUNG NUMERIC (11,3);
DECLARE ART_WERT NUMERIC (12,3);

BEGIN

  LGWERT = 0;
 
  DELETE FROM DBPROC WHERE PROCNAME = 'P_GETLAGERWERT';
 
  for Select AL.Artnr, AL.LgNr, AR.BEREINH, AR.EKNETTO from Artl al
    LEFT JOIN ARTIKEL ar ON al.ARTNR = ar.ARTNR
    LEFT JOIN LAG ON LAG.LGNR = AL.LGNR
      Where (cast( al.LgNr as Integer) >0 ) and ( ar.artgrp <= 59 )
       AND ar.Aktiv='J'
       AND ar.Bestfrg ='J'
       AND LAG.BESTSUM = 'J'
       AND AL.BEST>0
    Group by al.Artnr, al.LgNr, Ar.BEREINH, AR.EKNETTO
    ORDER BY AL.LGNR, AL.ARTNR
    INTO :ARTNR, :LGNR, BEREINH, ART_EKNETTO
    DO
    BEGIN
      BESTAND = (SELECT BESTAND from P_GETBEST_ATDATE(:ArtNr, :LGNR, '*', '*', :DATUM));
      BEST_OHNE_RECHNUNG = (Select MENGE from P_ELPO_OHNE_RECHNG (:ARTNR, :LGNR, :DATUM));

      IF ( BESTAND is NULL ) THEN
        BESTAND = 0;
       
      IF (BEST_OHNE_RECHNUNG IS NULL) THEN
          BEST_OHNE_RECHNUNG = 0;

      LE_EK = (SELECT LE_EK FROM P_GET_LEEK_STICHTAG(:ARTNR, :LGNR, :DATUM));
      IF (LE_EK <= 0 ) THEN
        LE_EK = ART_EKNETTO;
       
      IF ((BEREINH IS NULL) OR (BEREINH = 0)) THEN
        BEREINH = 1;
   
      IF (BESTAND IS NULL) THEN
        BESTAND=0;
   
      BER_BESTAND = BESTAND - BEST_OHNE_RECHNUNG;
      IF ( BER_BESTAND < 0 ) THEN
        BER_BESTAND = 0;
         
      ART_WERT = ( BER_BESTAND * LE_EK / BEREINH);
       
      LGWERT = LGWERT + ART_WERT;

      /* Protokoll */
      INSERT INTO DBPROC(PROCNAME, ZEIT, WERT) VALUES ('P_GETLAGERWERT','NOW',
        :LGNR||';'||:ARTNR||';'||:BESTAND||';'||:BEST_OHNE_RECHNUNG||';'||:LE_EK||';'||:ART_WERT||';'||:LGWERT);
   
    END
 SUSPEND;
  
END
Wenn ich im Select die Datenmenge weiter beschränke, wird ein Wert zurückgegeben, so wie der Select jetzt steht ergibt er null. Im Protokoll ist in allen Fällen alles richtig und vollständig.

Schönen Gruß

Geändert von mkinzler ( 3. Mai 2017 um 11:34 Uhr)
  Mit Zitat antworten Zitat