[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2009
    Beiträge
    7

    SQL Funktion liefert falsches Ergebnis

    Ich verwende folgende Funktion zur Ermittlung von Warengruppen:

    CREATE FUNCTION SWGWA.GetWagrString (
    PARFir Char(3), PARKdnr Char(8) )
    RETURNS VARCHAR(1024)
    LANGUAGE SQL
    NOT DETERMINISTIC
    READS SQL DATA
    CALLED ON NULL INPUT
    BEGIN
    DECLARE RETURNVAL VARCHAR ( 1024 ) NOT NULL DEFAULT ' ' ;
    FOR CSRC1 AS C1 CURSOR
    FOR SELECT wagr
    FROM SWKWS
    WHERE FIR = PARFir
    and KDNR = ParKdnr
    DO SET ReturnVal = ReturnVal CONCAT '\' CONCAT trim(CsrC1.wagr);
    END FOR ;
    RETURN LTRIM(ReturnVal) ;
    END;

    Der Testaufruf bringt aber einen leeren Rückgabewert:
    -- Test
    select distinct
    fir, kdnr, swgwa.GetWagrString(fir, kdnr) as Warengruppen
    from swgwa.swkds
    where fir='001' and kdnr='010446';;

    -- Ergebnis:
    Firma Kunde WARENGRUPPEN
    001 010446
    ******** Datenende ********

    Wenn ich die Werte direkt mit Select auswähle, bekomme ich aber ein richtiges Ergebnis:
    SELECT wagr FROM SWKWS WHERE FIR='001' and KDNR = '010446';;

    Wgr
    S
    SA
    W
    ******** Datenende ********


    Woran kann das liegen?

    Vielen Dank für eure Hilfe

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hi,

    werden bei der Übergabe der Parameter auch alle Stellen gefüllt ?

    evtl. ein Trim auf die Input Variablen machen
    PARFir , ParKdnr

    gruß
    Michael

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Probier mal folgendes:
    Code:
    DO SET ReturnVal = trim (ReturnVal) CONCAT '\' CONCAT trim(CsrC1.wagr);
    lg Andreas

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Warum so kompliziert?
    Du brauchst keinen Cursor:

    return (select ....);
    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
    Aug 2001
    Beiträge
    2.873
    Return SELECT gibt eine Tabelle zurück!
    Das heißt Äpfel mit Birnen zu vergleichen!

    Die Funktion jedoch verknüpft die einzelnen Warengruppen zu einem einzigen String und gibt diesen String zurück!

    Gibt es bei der Ausführung irgendwelche Fehlermeldungen im Joblog? Am besten Du führst vor Ausführung des SQL Statements zunächst einen STRDBG (ohne weitere Parameter-Übergabe) aus und schaust dann ins Joblog.

    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ich meine ja auch nicht die Tabelle sondern das ergebnis analog eines Singlesubselects:

    return (
    (select abc concat def from mytable where ...)
    )
    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

  7. #7
    Registriert seit
    Jun 2009
    Beiträge
    7

    erledigt

    Der Hinweis von mk mit dem Trim in der Funktion war die Lösung:

    ... WHERE FIR = trim(PARFir)
    and KDNR = trim(ParKdnr)
    ...

    Danke an euch alle

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dass der Trim von Erfolg gekrönt wird spricht gegen eine korrekte Parameterübergabe. Wenn diese ohne führende Leerzeichen erfolgt dann muss es auch ohne klappen da Leerzeichen am Ende nicht relevant sind.

    Aber ein scalarer Subselect wäre trotzdem einfacher.
    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

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Aber ein scalarer Subselect wäre trotzdem einfacher.
    Das musst Du mal erklären, wie Du mit einem skalaren Subselect die Warengruppen über mehrere (unbestimmt viele) Zeilen als String verknüpfen und dann ausgeben willst!

    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ja OK, das habe ich dann doch überlesen.
    Aber gabs da nicht was mit recursiver CTE in einem anderen Beitrag?
    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

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ja OK, das habe ich dann doch überlesen.
    Aber gabs da nicht was mit recursiver CTE in einem anderen Beitrag?
    Mit Recursiven CTEs geht so was und müsste etwa so aussehen:
    Code:
    with x   as (SELECT ROW_NUMBER() over(partition by FirNr, KndNr ORDER BY rrn(a)) Seq, 
                        a.*
                    FROM Table1 a),
         Rec (FirNr, KndNr, Wagr, Seq) 
             as (      select FirNr, KndNr, x.Wagr, Seq from x where Seq = 1
                 union all
                       select x.FirNr, x.KndNr concat ' ' concat Rec.WaGr,
                              Rec.Seq + 1
                          from x join Rec on     x.FirNr = Rec.FirNr 
                                             and x.KndNr = Rec.KndNr 
                                             and x.Seq   = Rec.seq + 1),
        y    as (select FirNr, KndNr, Max(Seq) Seq 
                    From Rec 
                    Group By FirNr, KndNr)
    select rec.FirNr, rec.KndNr, WaGr 
    from Rec join y Using (FirNr, KndNr, Seq )
    Ob das allerdings einfacher als die kleine UDF ist wage ich zu bezweifeln.

    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. SQL: NULL als Ergebnis bei vielen Nachkommastellen
    By Booley in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 30-03-12, 12:37
  2. SQL: Ausführungsverhalten einer Funktion in einem CASE-Statement
    By mwithake in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 04-08-09, 14:57
  3. Wirres SQL Ergebnis
    By lyrics in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-08-06, 12:10
  4. sql funktion
    By steven_r in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 01-06-06, 12:16
  5. Erstellen Trigger über SQL / Read Funktion
    By GHoffmann in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 07-07-05, 09:18

Tags for this Thread

Berechtigungen

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