[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hmm...

    Problem bleibt.

    Habe jetzt das RPG noch erweiter/geändert um
    PHP-Code:
    dcl-ds ds_return  qualified dim(10);    
      
    Wert1 char(10);                       
      
    Wert2 char(10);                       
      
    Wert3 char(10);                       
      
    Wert4 char(10);                       
      
    Wert5 char(10);                       

    end-ds;                                 
    dcl-s Anzahl_Saetze int(5inz(1); 
    PHP-Code:
      endmon;
      
    Status '02000';
      
    ds_return(1).Wert1 'BlaBla';
      
    ds_return(1).Wert2 'b hsh';
      
    ds_return(1).Wert3 '1111';
      
    ds_return(1).Wert4 'gfs41';
      
    ds_return(1).Wert5 'kdjdj';

      
    exec sql set result sets with return array :ds_return            
                                           
    for :Anzahl_Saetze rows;  
      return; 
    Gruß
    Ronald

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.254

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Exeterne User Defined Table Functions sind ein bisschen tricky, da diese über ein Callback Processing aufgerufen werden.
    Schau Dir mal den folgenden Artikel an. Da ist beschrieben, wie externe User Defined Table Functions codiert weren müssen.
    The Power of User Defined Table Functions

    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

  4. #4
    Registriert seit
    May 2002
    Beiträge
    1.121
    Den Artikel hatte ich auch schon mit am Wickel. Hatte ja mein Beispiel an Hand dem Artikel gebastelt. Nur dass mein RPG keine Datei ließt, sondern nur selber noch ein paar Programme aufruft, um meine Werte zu setzen..
    Habe immer noch den Stand. Parameter sind vor dem Return gefüllt, und das Select zeigt kein Ergebnis....

    Habe jetzt sogar mal die Feld-definiton von char auf varchar geändert... Hat nix gebracht
    Werde jetzt wohl für jeden Wert den ich brauch, eine eigene Function schreiben. Auch wenn ich dass vermeiden wollte.

    Gruß
    Ronald

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Birgitta hat da Recht, da die TABLE-Function nicht auf "set result sets" reagiert.
    Letzteres geht nur in Verbindung mit einem "CALL MYPROC (P1, …, Pn)" und einem Associate Result set:
    https://www.ibm.com/support/knowledg.../t0009168.html

    Per ODBC/JDBC geht das dann erheblich einfacher.

    Eine Table-Function muss, wie in Birgittas Beispiel, implementiert werden.
    Wichtig ist natürlich, dass die 3 Aufrufvarianten bedient werden (Open, Fetch, Close) und beachtet werden muss, dass alle Daten einer Table-Function abgerufen werden!
    Eine Where/Join-Klausel wird erst nach dem Ende der Bereitstellung des Resultsets ausgewertet.

    Hier ist also genau zu überlegen, ob eine solche Funktion Sinn macht, wenn das gesamte Ergebnis u.U. nicht gebraucht wird. Die Parameter sollten dann entsprechend gewählt werden, was allerdings die Verwendung als Join unmöglich macht. Als Lateral Table sollte es aber wiederum funktionieren.
    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Ich habe mir das etwas einfacher gemacht:

    Code:
    -- ERSTELLEN TABELLENFUNKTION ZUM DOWNLOAD DER ABWEICHENDEN NA-GRÜNDE    
    CREATE OR REPLACE FUNCTION BIUMO220.GETBDELNA                            
    (YYFIRM CHAR(1)                                                          
    ,YYWKNR CHAR(3)                                                          
    )                                                                        
    RETURNS TABLE (B1FIRM   CHAR(1)                                          
                  ,B1WKNR   CHAR(3)                                          
                  ,B1AGRF   DEC(11, 0)                                       
                  ,B1TXNR   CHAR(6)                                          
                  ,B1KOMP   CHAR(13)                                         
                  )                                                          
    LANGUAGE SQL                                                             
    MODIFIES SQL DATA                                                        
    BEGIN                                                                    
      CALL BIUMO220.FUEBDELNA(YYFIRM, YYWKNR);                               
      RETURN SELECT *                                                        
               FROM BDELNA                                                   
              WHERE B1FIRM = YYFIRM                                          
                AND B1WKNR = YYWKNR;                                         
    END;
    Die Tabelle wird von mir dann in dem CALL-Programm gefüllt.
    An Stelle einer statischen Tabelle kann man auch eine Tabelle in QTEMP verwenden um eine Parallelisierung zu ermöglichen. Hier war das nicht gefordert, da der Zugriff per ODBC erfolgt und alle Daten benötigt werden.
    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
    Aug 2001
    Beiträge
    2.877
    Eine (externe) UDTF wird mindestens 3x Aufgerufen:
    - OPEN Call
    - FETCH Call
    - CLOSE Call

    Diese 3 Schritte muss Du Programmieren.
    Wobei der FETCH call solange aufgeruen wird bis Du den Status 02000 setzt.
    Bei jedem FETCH call gibst Du einen Satz zurück. Dabei spielt es keine Rolle, ob Du den "Satz" aus einer Datenstruktur (die Du beim OPEN gefüllt hast) oder einer Tabelle/View, die du (satzweise) verarbeitest oder aus einem User Space (der z.B. durch ein LIST API) gefüllt wurde, liest.
    Habe ich nicht Beispiele zum Verarbeiten einer intern beschriebenen Tabelle bzw. eines List APIs in dem Artikel.

    ... und Du gibst KEIN Select zurück (das funktioniert nur bei SQL Funktionen!), sondern programmierst eine ganz normale Schleife aus der beim FETCH die Ausgabe-Felder gefüllt werden.

    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

  8. #8
    Registriert seit
    May 2002
    Beiträge
    1.121
    @Baldur
    Das werde ich mal ausprobieren. Der Gedanke gefällt mir.

    @Birgitta
    In meinem RPG-Programm habe ich gar keine Verarbeitung einer Datei.
    In den Proggi werden diverse Programme aufgerufen, welche dann meine Werte befüllen.

    Ich gebe euch dann Bescheid
    Danke erst einmal euch Beiden

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Ich sehe immer noch das Problem nicht!
    Die hast 2 Möglichkeiten:
    1. Du rufst Deine Programme beim OPEN auf und füllst eine (Array) Datenstruktur. Diese (Array)-Datenstruktur liest Du dann beim FETCH aus und gibst jeweils die Werte des gelesenen Indices aus.
    2. Deine Programme liefern jeweils einen Satz zurück, dann must Du die Programme beim Fetch aufrufen und die zurückgegebenen Werte ausgeben.

    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
    May 2002
    Beiträge
    1.121
    Liebe Birgitta,

    habe ich jetzt in meinen PGM so gemacht
    OpenCall = diverse Felder initialisieren
    FetchCall = meine Felder füllen und Status auf '0200' setzen
    ClosCall = Einfach nur ein Return

    Aufruf der Funktion und es kommen keine Daten an..
    :-(

    Habe es jetzt wie Baldur gemacht. Da bekomme ich meine Daten.
    Ist zwar ein Umweg, mit der Ausgabe in eine Zwischendatei, aber es geht erst einmal.

    Werde nich aber mit dem Thema noch einmal auseinander setzten.

    Schönen Abend noch
    Gruß Ronald

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Du darfst den Status nicht gleich beim ersten FETCH auf 02000 setzen. Setzt Dir ein Kennzeichen, dass der FETCH bereits ausgeführt wurde und setze dann wenn das Flag gesetzt wurde den Status.


    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

  12. #12
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hallo Birgitta!

    Das war es!
    Jetzt macht er auch das, was ich will.

    Vielen Dank für den Tipp
    Gruß
    Ronald

Similar Threads

  1. SQL - Create Tabel - Objektberechtigung *PUBLIC auf *CHANGE
    By loisl in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 23-05-16, 15:23
  2. create tabel ohne level check
    By DEVJO in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 29-09-15, 14:07

Berechtigungen

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