AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Procedure liefert null

Firebird Procedure liefert null

Ein Thema von Delix · begonnen am 3. Mai 2017 · letzter Beitrag vom 4. Mai 2017
Antwort Antwort
Seite 1 von 3  1 23   
Delix

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

Firebird Procedure liefert null

  Alt 3. Mai 2017, 10:19
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallo zusammen!

Ich habe eine Procedure mit einem numerischen Rückgabewert erstellt, welche mir einen Lagerwert per Stichtag liefern soll. Dabei habe ich folgendes Problem:

Die Procedure läuft intern korrekt ab, was ich über eine Tabelle protokolliert habe. Wenn ich die Datenmenge, die zu berechnen ist einschränke, Laufzeit ca. 2 Minuten, wird der korrekte Wert geliefert. Schränke ich die Daten nicht ein, Laufzeit ca. 8-10 Minuten, liefert die Procedure Null zurück. Lt. Internem Prtokoll ist aber alles korrekt bis zum Schluss berechnet worden.

Fehlermeldungen gibt es keine, auch nicht in firebird.log

Hat jemand eine Idee?

Schönen Gruß
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.963 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 10:40
Was für eine schöne Glaskugelfrage. Gibt es auch Code zu der Procedure? Wenn nicht, Null Code liefert zwangsläufig auch Null Ergebnis und Null Antworten auf Fragen.

Ernst:
Null Rückgaben kommen häufig dadurch zustande, dass ein Join ins Leere läuft. Wenn eine kleine Datenmenge zufällig durch die Einschränkung passende Joins findet, alles ok, wenn im Großen nicht die passenden Join Daten da sind, alles NULL.

Viel mehr kann man dazu glaub ich ohne Code nicht sagen.
Gruß, Jo
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
577 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 10:41
Zitat:
Procedure mit einem numerischen Rückgabewert erstellt,
procedure (ohne Rückgabe) oder function (mit Rückgabe)?

Poste das Teil doch bitte mal!

Ciao
Stefan
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
81 Beiträge
 
#4

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 11:57
eventuell hilft die Verwendung von
Code:
coalesce()
im SQL statement ..

https://firebirdsql.org/refdocs/lang...-coalesce.html
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.696 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 12:04
Oder in deinen Berechnungen fließt ein Datensatz mit Null-Wert ein, so dass auch das Ergebnis Null wird.
Ralph
  Mit Zitat antworten Zitat
Delix

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

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 12: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 12:34 Uhr)
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
181 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 12:51
Ist ne Ewigkeit her, dass ich mich mit SPs unter Firebird befasst habe, aber was mir auffällt, sind die fehlenden ':' im INTO-Teil der ersten SQL-Abfrage: INTO :ARTNR, :LGNR, BEREINH, ART_EKNETTO - fehlen die nicht vor BEREINH und ART_EKNETTO?
Udo Treichel
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.329 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 12:57
Die ":" fehlen bei den Variablen im Select.

Du prüfst zwei mal "BESTAND IS NULL" aber "LE_EK" wird nicht auf "NULL" geprüft.
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
104 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 13:06
Ich würde mal sagen, die Proc gibt nur NULL zurück, wenn
LE_EK = (SELECT LE_EK FROM P_GET_LEEK_STICHTAG(:ARTNR, :LGNR, ATUM));
NULL ergibt.

Kann es sein, dass die Werte der Proc vom Client nicht abgerufen werden?
Wie wird die Proc im Programm aufgerufen.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.963 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 13:41
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.
Ja, das mag so sein, dass Du es protokolliert hast, aber nur für einen Fall (meinetwegen auch mehr) und Du hast bereits mehrere Antworten, wie es zu der Null kommen kann.
Am ehesten würde ich mal auf die Antwort von Jumpy tippen.
In SQL ist es idR so:
1+2+NULL=NULL

NULL steht für undefiniert, definierte Werte verrechnet oder verglichen mit undefinierten Werten ergibt immer undefiniert.
Woher kommt die NULL? Entweder eines der Felder enthält Null oder wie ich beschrieben habe führt ein Join ins Leere und "produziert" NULL Werte, die in der Berechnung alles mitreißen.
Gruß, Jo
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 13:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf