-
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(5) inz(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
-
-
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
-
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
-
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.
-
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.
-
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
-
@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
-
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
-
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
-
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
-
Hallo Birgitta!
Das war es!
Jetzt macht er auch das, was ich will.
Vielen Dank für den Tipp
Gruß
Ronald
Similar Threads
-
By loisl in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 23-05-16, 15:23
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks