PDA

View Full Version : Daten mit CCSID 1208 in IFS Schreiben



hteufl
22-11-20, 13:30
Hallo an Alle!

Ich habe ein Problem Unicode Daten im IFS zu erstellen. Lt. der Bescheibung von Scott Klement soll die Konverierung automatisch geschehen, wenn eine IFS Datei mit CCSID 1208 neu erstellt, danach geschlossen mit schließlich dem Flag mit O_TEXTDATE neu geöffnet wird. Eine Konvertierung geschieht devinitiv aber meiner Meinung nach nicht 1208 codiert, da kein Zeichen lesbar ist.

Hier der Code der Dateierstellung:
fdpic = open(%trim(path) + %trim(IFSFilenamePic)
: flags : mode : 1208);
if fdpic < 0;
ErrMsg = %str(strerror(errno));
callp die('open(IFS File): ' + ErrMsg) ;
endif;

callp(e) close(fdpic);
if %error;
exsr *pssr;
endif;

// flags = o_textdata + o_wronly; // Umsetzungsfehler
flags = o_wronly + o_textdata + o_ccsid;

fdpic = open(%trim(path) + %trim(IFSFilenamePic)
: flags);
if fdpic < 0;
ErrMsg = %str(strerror(errno));
callp die('open(IFS File): ' + ErrMsg) ;
endif;

Das Ergebnis ist alles andere als erbaulich:
4c 4f c4 d6 c3 e3 e8 d7 c5 40 88 a3 94 93 6e 0d
25 4c 88 a3 94 93 6e 0d 25 4c 94 85 a3 81 40 83
88 81 99 a2 85 a3 7e 7f a4 a3 86 60 f8 7f 6e 0d
25 4c a2 83 99 89 97 a3 40 a3 a8 97 85 7e 7f a3
85 a7 a3 61 91 81 a5 81 a2 83 99 89 97 a3 7f 40
a2 99 83 7e 7f 4b 4b 61 91 a2 61 91 98 a4 85 99
a8 60 f3 4b f5 4b f1 4b 94 89 95 4b 91 a2 7f 6e
4c 61 a2 83 99 89 97 a3 6e 0d 25 4c a2 83 99 89
97 a3 40 a3 a8 97 85 7e 7f a3 85 a7 a3 61 91 81

%L¢ƒ™‰—£@£¨—…~£…§£a‘¥ ƒ™‰—£@¢™ƒ~KKa‘¢a‘˜¤…™¨` óKõKñK”‰•K‘¢nLa¢ƒ™‰—£n

Was habe ich beim Erstellen der Datei falsch gemacht?

Vielen Dank für Euro Hilfe im Voraus

Hermann

Fuerchau
22-11-20, 14:13
Nicht beim Erstellen der Datei sondern bei deiner Laufzeitumgebung.
Wie soll das System die Codewandlung in 1208 vornehmen, wenn dein Job auf CCSID(65535) steht?
Du könntest die Daten auch in ein Feld vom Typ C (Unicode) bereitstellen, was allerdings ebenso eine korrekte CCSID des Jobs voraussetzt.

Die Daten die du ausgibst sehen sehr nach EBCDIC aus, z.B. 0D 25 entspricht EBCDIC CRLF.

Bei der ganzen CCSID-Thematik wird leider immer wieder vergessen, dass ein Job eine CCSID haben muss, damit alles korrekt läuft.
Solange man aber die Systeme immer mit QCCSID 65535 betreibt stößt man letztlich auch immer wieder auf dieselben Probleme beim Im- und Export zu Drittsystemen.

Z.B. werden QZDA-Jobs immer auf eine CCSID geändert, da sonst SQL ständig Fehler produzieren würde.

RobertMack
23-11-20, 06:10
Moin,

probier's mal so:

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

Callp Close(Fd);
Fd = Open(%Trim(IfsLink):O_CCSID+O_WRONLY+O_TEXTDATA:0: 0);

hteufl
23-11-20, 06:19
Hallo Furchau!

Vielen Dank für deine Antwort! Auf unserer Power 9 ist der Systemwert QCCSID auf 1141 eingestellt! Somit läuft der Job mit der JOB CCSID 1141!

Sprachen-ID . . . . . . . . . . . . . . . . . . . : DEU
Landes- oder Regions-ID . . . . . . . . . . . . . : AT
ID des codierten Zeichensatzes (CCSID) . . . . . : 1141
Standard-ID des codierten Zeichensatzes . . . . . : 1141
Steuerung für Zeichen-ID . . . . . . . . . . . . : *DEVD


Danke
Hermann

hteufl
23-11-20, 06:33
Guten Morgen RobertMack!

Auch Dir vielen Dank für deine Antwort! Soll beim Erstellen der IFS Datei die korrekte CCSID angegeben werden (1208)? Ich habe Deinen Versuch nachgestellt und es funktioniert soweit auch, nur die CCSID der Datei und auch der Dateninhalt sind meiner Meinung nach CCSID 1252 und nicht CCSID 1208!
Notepad++ zeigt für die Codierung Windows ANSI CRLF an. Auch die Beispielumlaute sind lesbar und sollten meiner Meinung nach als Doppelbyte in 1208 dargestellt werden.

Beispiel:
<div class="normal">&sect;52/11b Ende einer Zonenbeschränkung 30<br>470x630/2 Typ 2<br></div>

Danke
Hermann

Fuerchau
23-11-20, 09:59
Wir haben hier auch schon mal diskutiert, dass dies inzwischen mit den SQL-Methoden <tt>SQLTYPE(CLOB_FILE) erheblich einfacher zu lösen ist.</tt>