[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    851

    Post SQL UDF mit RPGLE Programm

    Hallo zusammen,

    ich suche schon länger, habe aber auch im Inet nicht so das Richtige gefunden.

    Was ich machen möchte:
    Eine UDF die mir Kosten für einen Artikel zurückgibt.

    Folgendes vorhandenes Serviceprogramm
    PHP-Code:
    PGet_HangTag_Cst  B                   export             
    DGet_HangTag_Cst  PI             7s 2                    
    dSaison                               like
    (stssea) const 
    dSaisonYear                           like(styear) const 
    dDivision                             like(stdiv)  const 
    dStyle                                like(ststyl) const 
    dToCurrency                      3    const              

    .....


    C                   RETURN    Ht_Cost_All
    PGet_HangTag_Cst  E 
    Dafür habe ich folgende UDF erstellt
    PHP-Code:
    create function mk/htcost                            
      
    (Saison char () , Saisonyear dec (40),         
       
    Division dec20), Style   char(6),             
       
    Currency char(3) )                             
    returns dec(72)                                    
    language rpgle                                       
     deterministic                                       
       no sql                                            
       returns null on null input                        
       no external action allow parallel                 
       simple call                                       
       external name 
    'TSTLIBEDC/BY100SR(Get_HangTag_Cst)' 
    Der Aufruf erfolgt folgendermassen:
    PHP-Code:
    select stsseastyearstdivststyl,                         
           
    htcost(stsseastyearstdivststyl 'EUR'  ) as cost
    from tstdtaedc
    /stmastp                                        
    where styear
    =2008 
    Folgende Fragen:
    1.
    Wie kann man eine Konstante- und Variable definieren
    ( wie hier im Beispiel Konstante EUR )
    mit VARCHAR in der Function funktioniert es auch nicht

    2. Wie bekommt man das Ergebnis aus dem Return Ht_Cost_All
    zurück


    Z.Zt. bin ich irgendwie ein bischen Ratlos
    Gruß
    Michael

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hi,
    was genau ist denn das Problem? Lässt es sich nicht kompelieren, oder aufrufen? Gibt es eine Fehlermeldung? ...
    Ich hab mir angewöhnt grundsätzlich immer VARCHAR zu verwenden, da mit CHAR der Aufruf oft nicht funktioniert (keine Ahnung warum).

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    851
    HI Andreas,

    also erstens muss ich klären wie man eine Konstante
    über die UDF an das Serviceprogramm übergeben kann.

    Wenn ich statt der Konstante eine Variable übergebe
    wird zwar die Prozedur im Serviceprogramm aufgerufen
    aber mit Fehler beendet:
    PHP-Code:
    Nachrichten-ID . . . . :   MCH3601       Bewertung  . . . . . . :   40      
    Nachrichtenart 
    . . . . :   Abbruch                                          
    Sendedatum 
    . . . . . . :   16.06.10      Sendezeit  . . . . . . :   16:34:36
                                                                                
    Nachricht 
    . . . :   Zeiger für angegebene Position nicht gesetzt.           
    Ursache  . . . . :  Es wurde ein Zeigerentweder direkt oder als ein       
      Basiszeiger verwendet
    für den keine Adresse festgelegt worden war
    PHP-Code:
    Nachrichten-ID . . . . :   CPF503E       Bewertung  . . . . . . :   30       
    Nachrichtenart 
    . . . . :   Hinweis                                           
    Sendedatum 
    . . . . . . :   16.06.10      Sendezeit  . . . . . . :   16:34:36 
                                                                                 
    Nachricht 
    . . . :   Fehler bei benutzerdefinierter Funktion in Teildatei     
      STMASTP
    .                                                                   
    Ursache  . . . . :  Beim Aufrufen der benutzerdefinierten Funktion HTCOST in 
      Bibliothek MK ist ein Fehler aufgetreten
    Der Fehler trat beim Aufrufen des
      zugeordneten externen Programms oder Serviceprogramms BY100SR in Bibliothek
      TSTLIBEDC
    Programmeingangspunkt bzwexternem Namen Get_HangTag_Cst,      
      
    spezieller Name HTCOSTaufDer Fehler trat bei Teildatei STMASTP Datei   
      STMASTP in Bibliothek TSTDTAEDC auf
    Der Fehlercode ist 2. Fehlercodes und 
      ihre Bedeutung
    :                                                            
        
    -- Das externe Programm oder Serviceprogramm hat SQLSTATE 00000        
      zurückgegeben
    . Die vom Programm zurückgegebene Textnachricht ist:  .       
       
    -- Das externe Programm ist vor seiner Beendigung fehlgeschlagen.      
       
    -- Bei der Datenbank trat ein Zeitüberschreitungsfehler beim Warten auf
     
    die Rückkehr zum Hauptprogramm aufDer von der Datenbank verwendete       
     Zeitüberschreitungswert betrug 0 Minuten und 30 Sekunden
    .                  
       
    -- Das externe Programm ist nicht mehr vorhanden oder wurde nicht      
     gefunden
    .                                                                  
       
    -- Bei einem der Eingabeparameter der Funktion ist ein                 
     Datenabgleichungsfehler aufgetreten
    .                                       
       
    6 bis 20 -- Die vorangegangenen Nachrichten im Jobprotokoll beachten.    
       
    Für ein externes Programm ist der angezeigte Programmeingangspunkt *N.   
    ehlerbeseitigung:  Bei Fehlercodes 1 und 2 die Fehlerursache anhand von     
     SQLSTATE oder einer zuvor aufgelisteten Nachricht feststellen
    .             
       
    Bei Fehlercode 3 entweder den Zeitüberschreitungswert mit Hilfe der       
     QAQQINI
    -Dateieinstellung erhöhen oder feststellenweshalb das externe      
     Programm oder das Serviceprogramm nicht innerhalb  der zugeordneten Zeit    
     zurückgekehrt ist
    .                                                          
       
    Bei Fehlercode 4 sicherstellendass das Programm oder Serviceprogramm für
     
    die Dauer der Abfrage vorhanden ist.                                        
       
    Bei Fehlercode 5 die Ursache für den Datenabgleichungsfehler bestimmen.   
       
    Bei Fehlercode 6 bis 22 die vorangegangenen Nachrichten im Jobprotokoll   
     beachten
    .                                                                   
       
    Weitere Informationen über benutzerdefinierte Funktionen enthält das Thema
     
    "DB2 UDB for iSeries SQL Programming" im Information Center unter           
     http
    ://www.ibm.com/eserver/iseries/infocenter. 
    Also stimmt etwas mit der Übergabe der Parameter noch nicht.

    Im Debugger kommen bis auf die Currency alle Werte an.

    Gruß
    Michael

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.716
    Das Problem ist, dass die Prozedur nicht richtig definiert ist.
    Im Gegensatz zu ILERPG ruft SQL die Prozedur mit allen Feldern als Parameter auf, auch den Returnwert als letzten.
    Einen Funktions-Returnwert kennt SQL nicht.

    Du musst also auch den Returnwert als Übergabeparameter verwenden.
    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

  5. #5
    Registriert seit
    Jan 2001
    Beiträge
    851
    Hi Baldur,

    aber wo ?

    Am Anfang
    oder am Ende der Definition.

    Irgendwie ist es nicht meine Woche


    Gruß
    Michael

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.932
    Um eine Konstante als CHAR zu übergeben musst Du sie beim Aufruf einfach casten:

    Code:
    Select ... 
            htcost(stssea, styear, stdiv, ststyl , Cast('EUR' as Char(3))
    .....
    Beim Registrieren sollte der Funktions-Name im External Name in Groß-Schrift angegeben werden.
    Weiterhin ändere ALLOW PARALELL in DISALLOW PARALELL und gib außerdem noch FENCED an. Beides sollte verhindern, dass die Funktion in einem anderen Thread läuft.

    @Baldur:
    Das war vielleicht früher so und ist noch so, wenn man RPG Programme als UDF registrieren will. Eine RPG-Funktion kann so wie sie ist registriert werden und bei Parameter Style GENERAL (oder SIMPLE CALL) werden nur die in RPG definierten Parameter übergeben (allerdings alle, auch für die optionalen Paramter werden Null-Pointer übergeben).

    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

  7. #7
    Registriert seit
    Jan 2001
    Beiträge
    851
    Hallo,

    entschuldigung für die späte Rückinfo. Hatte aber erst heute
    wieder Gelegenheit mich damit zu beschäftigen.

    Und hier die Lösung:
    PHP-Code:
    CREATE FUNCTION MK/HTCOST  (                       
     
    SAISON CHAR(1) ,                                  
     
    AYEAR  DECIMAL(40) ,                            
     
    DIVISION DECIMAL(20) ,                          
     
    STYLE CHAR(6) ,                                   
     
    CURRENCY CHAR(3) )                                
     
    RETURNS NUMERIC(72CAST FROM NUMERIC(72)     
     
    LANGUAGE RPGLE                                    
     SPECIFIC MK
    /HTCOST                                
     NOT DETERMINISTIC                                 
     NO SQL                                            
     CALLED ON NULL INPUT                              
     DISALLOW PARALLEL                                 
     EXTERNAL NAME 
    'TSTLIBEDC/BY100SR(Get_HangTag_Cst)'
     
    PARAMETER STYLE DB2SQL 
    Der OpsNav eignet sich sehr gut zur Anlage.

    Vielen Dank an alle
    Gruß
    Michael

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  3. SQL im Programm
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 19-10-06, 09:12
  4. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  5. SQL UDF Prob mit leeren Feldern
    By HACHIMAN in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-06, 09:48

Berechtigungen

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