[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2006
    Beiträge
    15

    UDF nicht verwendbar

    Hallo

    ich habe das Problem, dass eine von mir definierte UDF in der Verwendung nicht funktioniert. Dies sowohl bei einer SQL-UDF wie auch bei einer Externen UDF. Die UDF ist Scalar, und soll aus einer Allgemeinen Tabelle unserer Anwendung den Übersetzungstext eines Tabellenwertes zurückgeben.

    Hier die SQL-Anweisung für die Funktionsregistrierung:

    Create Function cmxtblobj/S_TBLREAD
    (FIR CHAR(3), SAR CHAR(3), RKEY CHAR(10))
    Returns CHAR(64)
    LANGUAGE SQL
    READS SQL DATA
    NO EXTERNAL ACTION
    DETERMINISTIc
    Begin
    Declare inhalt char(64);
    Set inhalt =(select tblinh from tbl01p where tblanw = 'CMX' and
    tblfir = fir and tblsar = sar and tblspr = ' ' and tblkey = rkey);
    Return inhalt;

    In dieser Anweisung will ich Beispielsweise die UDF verwenden:

    SELECT asabtei, S_TBLREAD((asfirma), ('ABT'), (ASABTEI)) FROM
    cartalgp

    Ich bekomme dann immer den Fehler SQL0204-S_TBLREAD der Art *N in *LIBL nicht gefunden.

    Eine Analoge RPG-Prozedur, (als SRVPGM mit korr. Exportsignatur) und als ext. Funktion registriert führt zum gleichen Ergebnis.

    Vielleicht habt ihr ja einen Tip
    Vielen Dank

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo Peder,

    das Problem ist der zweite Parameter, den Du als Ausdruck ('ABT') über gibst.

    SQL interpretiert Ausdrücke als Datentyp VARCHAR(). Dein Parameter ist jedoch als CHAR() definiert. VARCHAR() und CHAR() sind für SQL unterschiedliche Datentypen.

    SQL UDFs können überladen werden können, d.h. in der gleichen Bibliothek kann eine UDF mit dem gleichen Namen, jedoch unterschiedlichen Parametern (Anzahl und/oder Datentyp, jedoch unabhängig von Längenangaben) vorhanden sein. In Deinem Beispiel wird nach einer Funktion mit Namen S_TBLREAD gesucht, deren zweiter Parameter vom Typ VARCHAR() ist. Diese Funktion exisitiert jedoch nicht, wie die SQL-Nachricht mitteilt.

    Um dieses Problem zu umgehen, muss der Ausdruck ('ABT') in den Datentyp CHAR() konvertiert (neuhochdeutsch gecasted) werden.
    PHP-Code:
    SELECT asabtei
           
    S_TBLREAD(asfirma
                     
    Cast('ABT' as Char(3)), 
                     
    ASABTEI
       
    FROM cartalgp 
    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Dec 2006
    Beiträge
    15
    Hallo Birgitta

    viele Dank für deine schnelle Antwort. Die UDF funktioniert jetzt. Ich habe den Parameter als VARCHAR definiert, da der Cast in der Anwendung etwas umständlich ist.

    Peder

  4. #4
    Registriert seit
    Dec 2006
    Beiträge
    15
    Hallo

    eine Frage habe ich noch zum gleichen Thema. Die gleiche Funktion als Externe UDF scheitert auch bei der Übergabe des 2. Parameters. Im Debug, sehe ich, dass die Parameter 1 und 3 korrekt sind, der 2. enthält einen falschen Wert.

    Hier die Definition der Funktion:
    Create Function cmxtblobj/S_R_TBL
    (FIR CHAR(3), SAR VARCHAR(3), RKEY CHAR(10))
    Returns CHAR(64)
    Language RPGLE
    Specific S_R_TBL
    Not Deterministic
    No SQL
    DisAllow Parallel
    External Name 'CMXTBLOBJ/TBLPROT(S_R_TBL)'
    Parameter Style SQL

    und hier die Defintion der Paramter in der Prozedur:

    d s_r_tbl pr like($t2inh)
    d pr$fir like($t2fir)
    d pr$infa like($t2sar)
    d pr$key like($t2key)
    **
    p s_r_tbl b export
    d s_r_tbl pi like($t2inh)
    d pr$fir like($t2fir)
    d pr$infa like($t2sar)
    d pr$key like($t2key)
    d pr$out s like($t2inh)


    Die Like's verweisen alle auf entsprechende Char-Felder.

    Vielen Dank
    Peder

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo Peder,

    anstatt die Funktion zu ändern hättes Du eine weitere Funktion generieren können, die auf der ersten Funktion basiert und nur mit abweichenden Parametern definiert ist. (Sourced Function)

    Bei sourced Function wird nichts anderes gemacht, als die Parameter gecasted und anschließend die Basis-Funktion aufgerufen.

    Damit wird die Funktion überladen und kann sowohl mit CHAR als auch VARCHAR-Datentyp für den 2. Parameter aufgerufen werden.

    PHP-Code:
    Create Function cmxtblobj/S_TBLREAD 
          
    (FIR CHAR(3), SAR VARCHAR(3), RKEY CHAR(10)) 
           
    Returns CHAR(64
           
    Specific cmxtblobj/S_TBLREAD1
           Source Specific cmxtblobj
    /S_TBLREAD
    Das Problem mit der externen Funktion liegt darin, dass VARCHAR empfangen wird, RPG jedoch CHAR erwartet. Ich denke auch hier kann eine Sourced Function weiterhelfen.

    Birgitta
    Birgitta Hauser

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

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. udf ohne ergebniss
    By ILEMax in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 18-09-06, 13:39
  3. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  4. SQL UDF Prob mit leeren Feldern
    By HACHIMAN in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-06, 09:48
  5. libl ändern in UDF
    By waro in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-05-05, 18:02

Berechtigungen

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