[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    425

    udf ohne ergebniss

    Guten Tag,
    Wir können neuerdings in userer ERPSoftware jede x-beliebige Datei in einem Subfile anzeigen.(PF/LF/VIEW) Daher beschäftige ich mich mit SQL.
    Nach eineigen erfolgreichen versuchen mit View's möchte ich nun mal eine UDF versuchen.
    diese:
    create function pnesu31
    (iProd varchar(14),
    iFM1 dec(11, 3),
    iFM2 dec(11, 3),
    iFM3 dec(11, 3),
    iFM4 dec(11, 3),
    iLort varchar(3))
    returns dec(11,3)
    language sql modifies sql data begin declare summe dec(11, 3);
    return (select sum(nemge0) from mne where nephas = '3' and
    nestat = '1' and
    neprod = iProd and
    nemge1 = iFM1 and
    nemge2 = iFM2 and
    nemge3 = iFM3 and
    nemge4 = iFM4 and
    nelort = iLort) ;
    end


    Die Function wird erstellt.

    ein select PNESU31('xxx', 1, 2, 3, 4, 'AAL') from lib/MNE gibt nur '-' zurück

    ein select sum(nemge0) from ... (wie die Funktion bringt die echten Zahlen

    Was ist falsch ?

    danke
    Max

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

    bekommst Du eigentlich keine Meldung, dass die Funktion nicht in der Bibliothek vorhanden ist?

    Versuche die numerischen Werte (also 1,2,3,4 auf Decimal zu casten). Werden numerische Ausdrücke übergeben, werden sie als integer Werte interpretiert. Da Funktionen überladen werden könnnen, d.h. eine Funktion mit dem gleichen Namen, jedoch anderen Parametern kann mehrfach in der gleichen Bibliothek vorhanden sein, wird eine Funktion die Dezimal-Felder erwartet nicht gefunden.

    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

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    425
    Nein bekomme ich nicht,

    hatte vorher die alpha werte in der funktion als CHAR def.

    da mußte ich casten.
    hab hir im forum den grund gefunden und
    jetzt gehts, aber egal ob ich 1, 2, 3, 4 oder cast(1 dec(11, 3)),... angebe,
    das ergebnis ist ein -

    noch ne idee
    Max

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Deine Funktion soll einen Dezimalwert zurückgeben, allerdings gibst du ein Recordset zurück !!

    Mach einen "Select into" und gib eine Variable zurück.
    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
    Sep 2005
    Beiträge
    425
    Wie das ?
    weder ein
    ... return SUMME as (select sum(nemge0) into SUMME where ...


    noch ein
    ... return summe (select into summe sum(nemge0)

    geht
    also hab ich was falsch verstanden!
    Bitte nochmal helfen
    max

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    425
    oh, sorry, dadrüber ist ja noch ein return

    den hab ich jetzt auch auf summe geändert und bekomme ein
    SUMME der Art *SQLUDT in *LIBL nicht gefunden.

    Max

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    declare summe ...
    set summe = (select ...);
    return summe;
    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

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    425
    geht so nicht.

    Die Funktion konnte ich nun wieder erstellen, aber das ergebniss ist das gleiche, nur '-'
    mit und ohne cast der numm werte

  9. #9
    Registriert seit
    Sep 2005
    Beiträge
    425
    so nun binn ich eine idee weiter,
    in der Funktion beziehe ich mich ja auf eine Datei. Diese ist anscheinend fest verdrahtet mit der zu CREATE Zeit gefundenen LIB.

    wenn ich im CREATE die Lib angebe, auf die ich auch später den select mache, bekomme ich ein ergebniss.
    allerdings bekomme ich in n zeilen den (richtigen) Wert, statt nur genau ein Wert.

    Un das mit den festen LIB's ist ein K.O Kriterium. kann ich das umgehen ?

    Max

  10. #10
    Registriert seit
    Sep 2005
    Beiträge
    425
    Das mit den vielen zeilen ist nun auch klar, ich müßte die where Bed. in dem select wiederholen.
    Dann macht allerdings die Funktion so keinen Sinn.
    Hmm, muß ich wohl weiter VIEW's machen

    Könnte ich im SQLRPGLE Pgm sagen
    /EXEC-SQL
    +set :summe =PNESU31('xxx' 1, 2, 3, 4, 'xxx')
    /end-exec

    und dann mit Summe weiterarbeiten ?
    das müste doch gehen!

    nur die feste Lib stört.
    Max

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    set option sqlpath=*libl <= Verwendet später *LIBL.

    ein "select sum(...) from ..." kann nicht mehr als 1 Wert liefern wenn ohne Group-By gearbeitet wird.

    Verwendest du eine Funktion in einem Select, wird diese natürlich pro Zeile aufgerufen. Die Parameter der Funktion sollten also aus den Zeilenfeldern stammen.

    Dein RPG-Aufruf wäre auch korrekt.
    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

  12. #12
    Registriert seit
    Sep 2005
    Beiträge
    425
    set option sqlpath = *libl geht nicht
    (ich wieß nicht wie und wo)

    habe beim versuchen einen 'set path' angeboten bekommen, geht aber auch nicht,
    hier nochmal das CREATE, aus neugier wieder um deinen SELECT INTO Vorschlag bereinigt. Funktion wurde erstellt

    create function pnesu31 (iProd varchar(14),
    iFM1 dec(11, 3),
    iFM2 dec(11, 3),
    iFM3 dec(11, 3),
    iFM4 dec(11, 3),
    iLort varchar(3))
    returns dec(11, 3)
    language sql modifies sql data begin declare summe dec(11, 3);
    return (select
    sum(nemge0) from mne__39 where nephas = '3' and nestat =
    '1' and neprod = iProd and nemge1 = iFM1
    and nemge2 = iFM2
    and nemge3 = iFM3
    and nemge4 = iFM4
    and nelort = iLort);
    set path=*libl; end

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. UDF nicht verwendbar
    By Peder in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 06-12-06, 08:15
  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
  •