Anmelden

View Full Version : CLOB in das IFS schreiben



Seiten : 1 [2] 3

Robi
18-05-20, 15:12
Notepad++ zeigt unten rechts die codierung an, was steht da?

mk
18-05-20, 15:16
Hi,
Dos\Windows ANSI

Fuerchau
18-05-20, 15:51
Windows/Notepad++ kann die Kodierung vopn EBCDIC 273 gar nicht erkennen.
Ich hatte ein ähnliches Problem auf V6R1, dass die CCSID 1252 bei CLOB_FILE nicht unterstützt wurde und die Ausgabe daher wieder in 273 (JOb CCSID) erfolgte.
Ich hatte geglaubt, dass dies per V7R3 nicht mehr passiert.

Nun ist es wohl leider so, dass bei der Ausgabe ins IFS die Daten erst mittels iconv() in 1252 umgewandelt werden müssen oder per "QSH touch" eine leere IFS-Datei mit Codepage 1252 erstellt werden muss.
Ich hatte mich da für iconv() bzw. das passende API entschieden, dann klappte es.

manuel.marcos
18-05-20, 16:28
Wie Fuerchau schon schreibt, kann das an deinem Release hängen?
Bei mir unter 7.3 hat die Datei per wrklnk die ccsid 1208 und im notepad++ steht auch utf-8.

camouflage
18-05-20, 17:41
Ist bei mir auch so, 7.4

Fuerchau
18-05-20, 19:11
Es gibt da einen Unterschied ob 1252 (Windows-ANSI) oder 1208 (UTF8).
Ich denke UTF8 wird native unterstützt, ANSI aber nicht.
In meinem Test war die Programmvariable vom Typ "C", also CCSID = 1200.
Bei der Ausgabe wurde die IFS-Datei mit Code 1200 erstellt, was in Notepad++ auch korrekt mit 2-Byte-Codes dargestellt wird.
Ist das Quellfeld aber vpm Typ "A", also Char, wird die Job-CCSID verwendet.

Um also 1252 zu erstellen, ist iconv() erforderlich.

Für die HTML-Erstellung ist allerding UTF8 ebenso erlaubt, wenn die Codierung auch angegeben ist:
https://www.w3.org/International/questions/qa-html-encoding-declarations.de
<code><meta charset="utf-8"/></code>

Rainer Ross
18-05-20, 19:47
ich habe es auf meiner 7.3 Maschine mit Systemwert QCCSID 1141 und Job-CCSID 1141 wie folgt nachgebaut und es funktioniert einwandfrei. Die CCSID der Datei im IFS ist 1208 und auch Notepad++ zeigt UTF8 an.


ctl-opt dftactgrp(*no) main(main);
//------------------------------------------------------------------//
// //
// Test - Write CLOB to IFS //
// //
//----------------- //
// R.Ross 05.2020 * //
//------------------------------------------------------------------//
// SQL-Options //
//------------------------------------------------------------------//

exec sql set option datfmt=*iso, timfmt=*iso, commit=*none,
decmpt=*period, closqlcsr=*endactgrp;

//------------------------------------------------------------------//
// Main //
//------------------------------------------------------------------//
dcl-proc Main;

dcl-s LocClob SQLType(CLOB:10000) ccsid(*utf8);
dcl-s LocFile sqltype(CLOB_FILE);

exec sql
set :LocClob = '<p>Test</p>';

LocFile_name = '/home/export/html/test.html';
LocFile_nl = %len(%trim(LocFile_name));
LocFile_fo = SQFOVR;

exec sql
set :LocFile = :LocClob;

end-proc;
//------------------------------------------------------------------//

Fuerchau
18-05-20, 20:49
Versuche es doch mal mit 1252 (bitte).

Fuerchau
19-05-20, 08:14
So, hier nun meine funktionierende V6R1-Quelle mit CCSID 1252:



d FBType ds template qualified
d FB1 10i 0
d FB2 10i 0
d FB3 10i 0

d ConvertAPI pr extpgm('CDRCVRT')
d CCSID1 10i 0 const
d ST1 10i 0 const
d S1 1 options(*varsize)
d L1 10i 0 const
d CCSID2 10i 0 const
d ST2 10i 0 const
d GCCASN 10i 0 const
d L2 10i 0 const
d S2 1 options(*varsize)
d L3 10i 0
d L4 10i 0
d FB likeds(FBType)

d StrDS ds
d FileString SQLTYPE(DBCLOB:8000000) ccsid(1200)
d FileData c len(8000000) overlay(FileString)
d varying(4)
d FileBytes a len(16000000) overlay(StrDS:5)

d OutDummy s 10I 0 inz
d OutLen s 10I 0 inz

d OutFB ds likeds(FBType)

d IfsString s 32700a varying(2)
d oPos s 10u 0

d OutDS ds static
d OutSize 10I 0
d OutData a len(8000000)
d OutString a len(8000000) varying(4)
d overlay(OutDS)

// Umwandlen in Win1252-Codepage
ConvertAPI(1200 //CCSID1
:0 //ST1
:FileBytes //S1
:%len(FileData) * 2 //L1
:819 //CCSID2
:0 //ST2
:0 //GCCASN
:OutSize //L2
:OutData //S2
:OutLen //L3
:OutDummy //L4
:OutFB //FB
);

%len(OutString) = OutLen;
for oPos = 1 to OutLen by %size(IfsString);
IfsString = %subst(OutString:oPos);
exec sql values(:IfsString) into :IFS_File;
IFS_File.FILENAME_FO = SQFAPP; // Datei anhängen
endfor;


Damit wird zwar eine IFS-Datei mit 819 erstellt, das ist aber von 1252 nicht weit entfernt.
Auf V7 sollte das auch mit 1252 funktionieren.

mk
19-05-20, 08:32
Hallo an alle,

manches mal verläuft man sich im Wald :-)

Der beeinflussende Faktor ist die Definition dec CLOB Feldes.


dcl-s clob sqltype(CLOB:10000) ccsid(1252) ;
dcl-s clob sqltype(CLOB:10000) ccsid(*utf8) ;
dcl-s clob sqltype(CLOB:10000) ccsid(*utf16) ;


Damit legt das System mit dem

exec sql values(:clob) into : aHtmlMailFile ;
genau die Datei im IFS an.

Keine Definition bedeutet eben Job CCSID. Das ist eben 273

Danke an alle und gut das es dieses Forum gibt.
Gruß
Michael