PDA

View Full Version : Aus ILE Programm direkt in IFS schreiben



Seiten : [1] 2 3 4 5

Frankk
11-01-21, 07:09
Hallo,

ich möchte gerne direkt aus einem ILE-RPG Programm heraus im IFS eine Textdatei (xxx.txt) anlegen und befüllen. Diese Datei soll dann in einem Fremdsystem weiter verarbeitet werden.

Klar kann ich zunächst in eine physische Datei schreiben und diese dann mit CPYTOIMPF übertragen. Aber direkt diese Datei öffnen und befüllen...

RobertMack
11-01-21, 07:20
https://www.scottklement.com/rpg/ifs_ebook/ifs_ebook.pdf

mk
11-01-21, 07:33
Hi,

einfach ein CLOB File mit SQL schreiben.
Das ist einfacher als die unix api's zu verwenden

Ungefähr so
dcl-s aHtmlMailFile sqltype(clob_file) ; //
...
clob variable füllen
...

clob als IFS Datei anlegen
exec sql values(:clob) into : aHtmlMailFile ; //CLOB als IFS Datei schreiben

Fuerchau
11-01-21, 08:43
Dabei ist allerdings die Angabe einer CCSID beim CLOB_FILE erforderlich, sonst wird EBCDIC ausgegeben.
Bei Job-CCSID 65535 gibt es allerdings eine Fehlermeldung beim Konvertieren.

dcl-s aHtmlMailFile sqltype(clob_file) CCSID(1208); //

mk
11-01-21, 09:00
Sorry,

Hi,

einfach ein CLOB File mit SQL schreiben.
Das ist einfacher als die unix api's zu verwenden
Hier noch die Definition der CLOB Varaiblen:

dcl-s clob sqltype(CLOB:50000) ccsid(*utf8) ; // Hier muss die CCSID angegeben werden


Ungefähr so
dcl-s aHtmlMailFile sqltype(clob_file) ; //
...
clob variable füllen
...

clob als IFS Datei anlegen
exec sql values(:clob) into : aHtmlMailFile ; //CLOB als IFS Datei schreiben

B.Hauser
11-01-21, 09:28
Das ist ein Schritt zuviel!

In dem folgenden Beispiel werden 3 Texte (nacheinander) direkt in eine IFS-Datei geschrieben.
Der Trick ist, dass die File Operation LocClobFile_FO richtig gesetzt wird.
SQFOVR generiert eine neue IFS-Datei oder überschreibt eine vorhandene IFS-Datei
SQLFAPP generiert eine neue IFS-Datei, sofern nicht vorhanden. Sofern die IFS-Datei vorhanden ist, werden die Daten ans Ende der IFS-Datei angefügt.


DCL-S LocClobFile SQLTYPE(Clob_File) CCSID(1208);
DCL-S LocText Char(50);
DCL-S LocIndex Uns(3);
//---------------------------------------------------------------------------

Clear LocClobFile;

LocClobFile_Name = '/home/Dir1/Dir2/YourIFSFile.txt';
LocClobFile_NL = %Len(%Trim(LocClobFile_Name));
LocClobFile_FO = SQFOVR; //Create/Override existing IFS File

For LocIndex = 1 to 3;
Select;
When LocIndex = 1;
LocText = 'The important thing is not to stop questionning';
When LocIndex = 2;
LocText = 'Curiosity has its own reason for existence';
When LocIndex = 3;
LocText = 'Quote: Albert Einstein';
EndSl;

Exec SQL Set :LocClobFile = :LocText;
LocClobFile_FO = SQFAPP; //Add Data
EndFor;

Birgitta

Fuerchau
11-01-21, 09:44
Welcher Schritt war da zuviel?
Es wurden wie bei dir 2 Variablen (CLOB, CLOB_FILE) definiert und ein SQL ausgeführt.
Wenn _FO nicht angegeben wird, nimmt SQL einen Default an.

Was mich allerdings geärget hat ist, dass eine UCS2-Variable nicht direkt genommen werden kann (V7R3).
Ich musste diese mit einem DBCLOB redefinieren (Overlay).
Dann klappts auch mit UCS2 von/nach UTF8.

B.Hauser
11-01-21, 09:51
Ich habe KEINE CLOB-Variable nur eine CLOB-File!
Zuerst in eine Variable und dann ins IFS ist ein Schritt zuviel.

Birgitta

mk
11-01-21, 10:45
Hi,

ob nun eine Variable zuviel oder zuwenig ist wohl egal :-)

Wichtig ist: Bei dem CLOB ignoriert das System die CCSID bei der DCL-S LocClobFile SQLTYPE(Clob_File) CCSID(1208); Definition.

Die CCSID wird von der CLOB Variablen genommen. Deswegen die CLOB Variable mit UTF-8
Gruß
Michael

Fuerchau
11-01-21, 13:28
@Birgitta:
"Zuerst in eine Variable und dann ins IFS ist ein Schritt zuviel."
Und was ist das:
Exec SQL Set :LocClobFile = :LocText

Wir wollen ja schließlich keine Konstanten ausgeben.

MK hat statt LocText eben eine variable "clob" verwendet.

Und danke Michael, bzgl. der CCSID hast du Recht.