Anmelden

View Full Version : Aus ILE Programm direkt in IFS schreiben



Seiten : 1 2 3 [4] 5

BenderD
27-01-21, 10:28
nö, dann wird nicht konvertiert (RTFM).

Frankk
27-01-21, 10:34
Genau!!! Dann wird nicht konvertiert!!

habe das "Programm" umgeschrieben:

Flags = O_WRONLY + O_CREAT + O_APPEND + O_CCSID +O_TEXTDATA;
Mode = S_IRWXU + S_IRWXG + S_IRWXO;
Fd = Open(%Trim(txt_file):Flags:Mode:1252);

Danach 3 Zeilen geschrieben:

eval line1 = *blanks
eval line = 'äüöß 1. Zeile'
eval line1 = line + crlf
callp write(fd: %addr(line1): %size(line1))

...


Ergebnis:

ÀÐj¡@@@@ñK@é…‰“…@@@@@@@@@@@@@@
%JZà¡@@@@òK@é…‰“…@@@@@@@@@@@@@@
%JZà¡„„„@óK@é…‰“…@@@@@@@@@@@@@@
%

Fuerchau
27-01-21, 12:28
Dann probier mal noch bitte folgendes:

When the O_TEXT_CREAT flag and its prerequisite flags are not set, the specified or derived CCSID is the CCSID in which data is to be returned (when reading from a file), or the CCSID in which data is being supplied (when writing to a file).

Mit der Interpretation, dass dies Binary-Mode ist.

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/open.htm#HDRIFSCCSD

Frankk
27-01-21, 12:41
Du meinst das O_TEXT_CREAT flag einfach weglassen?

Fuerchau
27-01-21, 14:05
Nein, hinzufügen. Das ist nicht zu verwechseln mit O_TEXTDATA.
Es ist halt immer etwas schwierig, die englische Doku zu verstehen.
Es ist schon seltsam, dass bei der O_CREAT für die Textumwandlung O_TEXT_CREAT erforderlich ist wobei bei bestehenden Dateien O_TEXTDATA bereits ausreicht.

Frankk
27-01-21, 15:16
Klar! Wer lesen kann....

Hatte den Wert verwechselt!!!


Flags = O_WRONLY + O_CREAT + O_APPEND + O_CCSID +O_TEXTDATA +
O_TEXT_CREAT;
Mode = S_IRWXU + S_IRWXG + S_IRWXO;
Fd = Open(%Trim(txt_file):Flags:Mode:1252);



Fd liefert mir den Wert -1 (= Fehler)!

Verstehe nicht warum.

Im Code gibt es zwar den Hinweis:

Note: O_TEXT_CREAT requires all of the following flags to work:
O_CREAT+O_TEXTDATA+(O_CODEPAGE or O_CCSID)

Alle Werte sind ja angegeben (Außer O_CCSID) aber es heißt ja: OR

holgerscherer
27-01-21, 15:50
Alle Werte sind ja angegeben (Außer O_CCSID) aber es heißt ja: OR

Bei mathematischen Flags sollte man das "OR" eher als "plus" sehen, nicht als das (meist implizierte) "exklusiv-oder". Da kommt man schon mal durcheinander ;-)

Fuerchau
27-01-21, 16:03
Beachte im obigen Link den 5. Parameter "text file creation conversion ID".

Laut Beschreibung wäre das die CCSID die dein Programm benötigt. Was ich allerdings für blödsinn halte, wenn ich die erst aus dem Job lesen muss.
Allerdings könnte ich da dann auch z.B. 1200 für die Unicodefelder direkt angeben.

In den Beispielen findet man dann allerdings wieder beide Versionen:
1. Beispiel: Open => Close => Open => Write => Close
2. Beispiel: Open => write => CLose.

Beim 2. Beispiel wäre interessant, was bei CCSID 0 im 5. Parameter passiert, Fehler oder Job-CCSID?

Frankk
28-01-21, 07:11
Habe folgendes zu diesem Thema nochmals ausprobiert:

Flags = O_WRONLY + O_CREAT + O_APPEND + O_CCSID +O_TEXTDA
O_CODEPAGE + O_TEXT_CREAT;
Mode = S_IRWXU + S_IRWXG + S_IRWXO;
Fd = Open(%Trim(txt_file):Flags:Mode:1252);

Ergebnis: Fehler (Fd= -1)

auch

Flags = O_WRONLY + O_CREAT + O_APPEND + O_CCSID +O_TEXTDATA +
O_TEXT_CREAT;
Mode = S_IRWXU + S_IRWXG + S_IRWXO;
Fd = Open(%Trim(txt_file):Flags:Mode:0);

lieferte nur einen Fehler (Fd= -1)

Gebe ich eine 2. CCSID an (wie im Beispielcode in dem Link):
Flags = O_WRONLY + O_CREAT + O_APPEND + O_CCSID +O_TEXTDATA +
O_TEXT_CREAT;
Mode = S_IRWXU + S_IRWXG + S_IRWXO;
Fd = Open(%Trim(txt_file):Flags:Mode:1252:1252);

Bekomme ich einen Umwandlungsfehler mit dem Hinweis:
RNF5407 20 1 Mehr Parameter im Prototypaufruf übergeben als zulässig.

Im Beispiel werden ja auch die beiden Parameter mit übergeben:

unsigned int file_ccsid = 819;
unsigned int open_ccsid = 37;

/************************************************** */
/* First create the file with the CCSID 819, and */
/* open it such that the data is converted */
/* between the the open CCSID of 37 and the */
/* file's CCSID of 819 when writing data to it. */
/************************************************** */

if ((fd=open(name,oflag1,mode,file_ccsid,open_ccsid)) < 0)

Fuerchau
28-01-21, 09:48
Du musst natürlich einen eigenen Prototyp definieren, der 5 Parameter erlaubt.
Die 2. CCSID muss dann auch eine DB-unterstützte CCSID wie 273, 1141, 1200 sein.