[NEWSboard IBMi Forum]

Thema: SQL UDF

Hybrid View

  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Anzeiger-Variable meint meist, dass ein NULL-Wert irgendwo verwendet oder verglichen wird. Geprüft werden NULL-Werte i.d.R. über Anzeiger-Variablen.

    Wo berechnest Du eigentlich Preis2?
    Soweit ich das sehen kann nirgends. Preis2 wird mit einem NULL-Wert inititalisiert und anschließend wird dieser NULL-Wert mit 0 verglichen (IF Preis2 > 0) und das funktioniert nicht.

    1. Initialisiere alle deklarierte Variablen
    2. Anstatt das numerische Tagesdatum in den Cursorn zu berechnen würde ich eine separate variable definieren und nur einmalig initialisieren.
    3. Anstatt der Cursor mit For-Schleifen würde ich ein einfaches SELECT ... INTO verwenden.
    4. Sicherheitshalber würde ich den Preis über COALESCE in einen Default-Wert (z.B. 0) konvertieren.

    Etwa so:
    Code:
    CREATE FUNCTION rptrade/artpreis3 ( ARTIKELNR dec(10),                                    
                                         Kundennr  dec(10)  )                                   
            RETURNS CHAR(10) 
            LANGUAGE SQL 
            READS SQL DATA 
    BEGIN              
       DECLARE RETURNVAL CHAR ( 10 ) NOT NULL DEFAULT '0,00' ; 
       DECLARE preis1  dec ( 10, 0 ) NOT NULL Default 0;                             
       DECLARE Preis2  dec ( 10, 0 ) Not NULL Default 0;   
       Declare DateNum Dec( 8, 0 )  Not NULL Default 0;
    
       Set DateNum = Dec(VarChar_Format(Current_Timestamp, 'YYYYMMDD'), 8, 0);
    
       Select Coalesce(SOEIPR, 0) into Preis1
         From RPTRADE/ArtPreis1
         Where        SOID2 = ARTIKELNR                    
               and (   sodnbi  = 99999999                   
                    or sodnbi >= DateNum)            
         order by sodnbi desc 
      fetch first row only;
    
       Select Coalesce(SOEIPR, 0) into Preis2
         From RPTRADE/ArtPreis2
         where      SOID4 = ARTIKELNR                   
               and  soid1 = kundennr                    
               and (   sodnbi = 99999999                  
                    or sodnbi >= DateNum)           
               order by sodnbi desc 
       fetch first row only;           
                                             
      if Preis2 > 0 then set preis1 = Preis2; 
      end if ;  
      SET RETURNVAL = cast(preis1 as char(10));  
      RETURN LTRIM(RETURNVAL) ;                  
    END
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  2. #2
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Soviel zum Thema Copy & Paste. Beim 2. Select sollte natürlich Preis2 den Wert erhalten

    Ich werde morgen versuchen Deine Vorschläge umzusetzen, erstmal Danke für Deine Hinweise

    GG

  3. #3
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Hallo Birgitta,
    danke für Deine Hilfe, beim testen bekomme ich jetzt die Meldung

    Nachrichten-ID . . . . : SQL0171 Bewertung . . . . . . : 30
    Nachrichtenart . . . . : Diagnose
    Sendedatum . . . . . . : 16.08.14 Sendezeit . . . . . . : 08:01:5

    Nachricht . . . : Argument 2 der Funktion VARCHAR_FORMAT ungültig.
    Ursache . . . . : Datenart, Länge oder Wert des Arguments 2 der Funktion
    VARCHAR_FORMAT ist ungültig.

    Das müßte sich ja jetzt auf dieses Statement beziehen.
    Wo kann ich die richtige Syntax nachschauen?

    Set DateNum = Dec(VarChar_Format(Current_Timestamp, 'YYYYMMDD')
    8, 0);

    GG

    Ich habe jetzt nochmal hier im Forum geschaut und h´gehofft das ich das ,8,0 weglassen könnte, das funktioniert aber leider nicht

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Unter welchem Release arbeitest Du?
    Kannst Du den VarChar_Format-Befehl interaktiv (z.B. mit STRSQL) ausführen?
    In älteren Releasen ist die VarChar_Format-Funktion vielleicht noch nicht vorhanden.
    Etwa so:
    Code:
    select Dec(VarChar_Format(Current_Timestamp, 'YYYYMMDD'), 8, 0)  
    From sysibm/sysdummy1
    Sofern die Ausführung nicht möglich ist, musst Du das numerische Tagesdatum anderweitig ermittelt, evtl. auch so wie in Deinem ersten Beispiel, nur halt im SET-Statement.
    Etwa so:
    Code:
    Set DateNum = Dec(Year(Current_Date) * 10000 + Month(Current_Date) * 100 + Day(Current_Date), 8, 0);
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Hallo Birgitta,
    ich habe das einzig wahre OS

    V5R4

    vermutlich noch für 2 Jahre. TöTö TöTö TöTö Tschingbumm.
    Also das 1. Statement funktioniert dort nicht.
    Das 2. läuft wie angenommen
    GG

  6. #6
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Heavy standing on the wire....

    gelöst, falsche Parameterreihenfolge

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Dann bist du ja schon mal weiter als ich.
    Ich schlage mich noch auf unabsehbare Zeit mit V5R2 und da noch nicht mal mit den letzten PTF's herum da keiner die Kiste mehr wartet.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •