Das ist einzige Platz in dem ein potentiell nicht initialisierter Wert zugewiesen wird.
IF (LE_EK <= 0 ) THEN
LE_EK = ART_EKNETTO;
Wäre LE_EK = NULL bspw. dann gilt die Bedingung nicht.
Soviel verbleibt nicht, als dass eine NULL zurückkäme.
Auf Businessebene ist der Satz nicht 'gültig' oder 'leer'. Testdatensätze, Fehlersätze oder wie auch immer. Zumal die ohne DATUMs Einschränkung offensichtlich zurückkommen und/oder insbesondere dann...
Auf ART_EKNETTO wird vermutlich einfach nicht hingeschreiben zuvor. NULL wird zugewiesen und das Logging liefert keine Ergebnis. So in etwas stelle ich mir das vor, rein auf Verdacht.
Zum Log
VALUE || NULL -> NULL
Code:
SET TERM ^ ;
CREATE 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;
ARTNR = NULL;
LGNR = NULL;
BEREINH = NULL;
ART_EKNETTO = 0;
-- BESTAND = (SELECT BESTAND from P_GETBEST_ATDATE(:ArtNr, :LGNR, '*', '*', :DATUM));
BESTAND = NULL;
BEST_OHNE_RECHNUNG = NULL;
IF ( BESTAND is NULL ) THEN
BESTAND = 0;
IF (BEST_OHNE_RECHNUNG IS NULL) THEN
BEST_OHNE_RECHNUNG = 0;
LE_EK = 0;
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 */
SUSPEND;
END^
SET TERM ; ^
GRANT EXECUTE
ON PROCEDURE P_GETLAGERWERT TO SYSDBA;
Hallo,
Leerzeile?
aber mal weiter
Zitat:
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.
Mach mal vorm Suspend ein LGWERT=21.0;
Und dahinter noch einen Protokolleintrag.
Kommt jetzt immer noch NULL raus als Ergebnis und steht die 21.0 im Log?