AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Procedure liefert null
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Procedure liefert null

Ein Thema von Delix · begonnen am 3. Mai 2017 · letzter Beitrag vom 4. Mai 2017
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 15:42
Ich hab meine Weisheit von hier.
Zitat:
If the procedure is called from a EXECUTE PROCEDURE statement, then SUSPEND has the same effect as EXIT. This usage is legal, but not recommended.
Dann ist da wohl in der Zwischenzeit die Toleranz größer geworden?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
129 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 16:08
Ich hab meine Weisheit von hier.
Zitat:
If the procedure is called from a EXECUTE PROCEDURE statement, then SUSPEND has the same effect as EXIT. This usage is legal, but not recommended.
Dann ist da wohl in der Zwischenzeit die Toleranz größer geworden?
Deshalb wäre es wichtig zu wissen, wie der Aufruf der Proc erfolgt.

Wenn die mit SELECT * FROM PROC aufgerufen wird, ist SUSPEND nötig. Und da die Proc einen Rückgabewert hat, lässt ein aktueller Firebird keine Proc ohne Suspend mehr zu.
Björn Reimer
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 16:58
Hallo,

1.
INSERT INTO DBPROC(PROCNAME, ZEIT, WERT) VALUES ('P_GETLAGERWERT','NOW',
:LGNR||';'||:ARTNR||';'||:BESTAND||';'||:BEST_OHNE _RECHNUNG||';'||:LE_EK||';'||:ART_WERT||';'||:LGWE RT);

Kannst du das Ändern erweitern mit

if LGWERT is NULL

INSERT INTO DBPROC(PROCNAME, ZEIT, WERT) VALUES ('P_GETLAGERWERT','NOW',
:LGNR||';'||:ARTNR||';'||:BESTAND||';'||:BEST_OHNE _RECHNUNG||';'||:LE_EK||';'||:ART_WERT||';'||"NULL ")
else
das Original


Und du hast definitiv in DBProc als letzten Wert einen gültigen Wert drin?

2,
Was mich noch stutzig macht sind Deine verschiedenen Numeric(x,y)-Variablen,
probier mal komplett Double Precision.
Ab einem bestimmten Numeric(x,y) arbeitet Firebird automatisch mit Integer weiter ...

3.
es wird NULL oder 0 zurückgegeben?
Woher weisst du das?
Hast du die Query (Select * From Proc(xxx)) mal in IBExpert laufen lassen?
Heiko

Geändert von hoika ( 3. Mai 2017 um 19:01 Uhr)
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
561 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 17:46
Eine Leerzeile vermutlich.

  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Firebird Procedure liefert null

  Alt 3. Mai 2017, 19:04
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?
Heiko
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
561 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Firebird Procedure liefert null

  Alt 4. Mai 2017, 11:27
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?

Geändert von MichaelT ( 4. Mai 2017 um 11:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Firebird Procedure liefert null

  Alt 4. Mai 2017, 12:40
Ich bin sicher nicht der Firebird-Spezi, aber was passiert eigentlich hier
Code:
(cast( al.LgNr as Integer) >0 )
wenn LgNr nicht als Integer ge-castet werden kann?

Kann es sein, dass dann für alle funktionierenden Datensätze ein Protokoll geschrieben wird, aber im Fehlerfall die SP im ungültigen Zustand abbricht und dann einen Null-Wert liefert?
Das Protokoll hätte dann zwar Daten, aber ob die vollständig sind, ist nicht geklärt, oder?


Folgendes ist mir auch noch aufgefallen:
INTO :ARTNR, :LGNR, BEREINH, ART_EKNETTO Dort fehlen Doppelpunkte. Wurde zwar irgendwo schon geschrieben, aber ich habe keine Antwort darauf gesehen.

Die Folge könnte sein, das ART_EKNETTO Null ist.
In dem Fall wäre hierdurch
SQL-Code:
LE_EK = (SELECT LE_EK FROM P_GET_LEEK_STICHTAG(:ARTNR, :LGNR, :DATUM));
       IF (LE_EK <= 0 ) THEN
         LE_EK = ART_EKNETTO;
LE_EK auch Null, sobald LE_EK <= 0 ist.
Das muss aber wohl jemand mit genaueren Firebird-Kenntnissen klären.
Peter

Geändert von Jasocul ( 4. Mai 2017 um 12:50 Uhr)
  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 21:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz