PDA

View Full Version : Kyrillisch drucken



angelone
21-09-12, 17:36
Hallo zusammen,
ich verzweifel langsam mit meinen blöden russischen Ausdrucken hier.
Die Lösung ist sicher einfach.
Ich komm nur nicht drauf.


Ich habe ein RPG Programm, das einen Lieferschein druckt.
Neben den normalen Sachen, die man dort so drauf hat soll auch ein Feld mit der russischen Artikelbezeichnung gedruckt werden.


Diese Bezeichnung habe ich in einer Datei mit ein paar CHAR Feldern und einem GRAPHIC Feld in dem die kyrillischen Daten stehen.


CREATE TABLE LIB123.DAZ63P (
AZFIRM CHAR(3) CCSID 273 NOT NULL DEFAULT '' ,
AZNILA CHAR(2) CCSID 273 NOT NULL DEFAULT '' ,
AZARTN CHAR(30) CCSID 273 NOT NULL DEFAULT '' ,
AZZTN1 CHAR(15) CCSID 273 NOT NULL DEFAULT '' ,
AZZTN2 CHAR(15) CCSID 273 NOT NULL DEFAULT '' ,
AZBZRU GRAPHIC(200) CCSID 13488 NOT NULL DEFAULT '' )
RCDFMT DAZ63F1;

Ich hab die Daten dort per JDBC SQL reingeschrieben und die sind dort auch tatsächlich angekommen.
Per SQL von meinem Rechner und per System i Navigator kann ich sie sehen.
Per strsql im 5250 gehts nicht, der Emulator kann kein Unicode vermute ich mal.


Mein Testsystem hier ist auf V5R4 mit QCCSID 65535.
Meine Job-CCSID ist 273.

Mein Drucker ist als Remote-Outq über *IP angebunden und es handelt sich um einen Kyocera FS2020D mit PCL6.
TRANSFORM(*NO) und MFRTYPMDL(*HPII)
Ein *PRT Device gibts dazu nicht.


Jetzt hab ich ein Printerfile mit dem Positionsformat hier:


A R D632102
A SPACEB(002)
A ZPPOSI 3S 0O 2
A SPACEB(001)
A ZPARTN 15A O +2
A ZPBEZ1 30G O +1CCSID(1200 *CONVERT 15)
A ZPZTEU 11A O +1
A ZPHELA 3A O +1
A ZPMENG 8S O +7
A ZPNGEW 8S 2O 85
A ZPTGEW 8S 2O 97
A ZPLTNO 10A O +4
A ZPPANO 10A O +2
A ZPBEZ2 30A O 23
A SPACEB(001)
A ZPZTRU 11A O +1

Das ist meine Positionszeile und in ZPBEZ1 sollte die russische Bezeichnung aus meiner Datei (AZBZRU) oben stehen.


Im Programm fülle ich diese Zeile so:


c clear d632102
c z-add znposi zpposi
c eval ZPARTN=%trim(azartn)
c eval ZPBEZ1=%char(azbzru)
c eval ZPBEZ2=%trim(tzbez2)
c eval ZPZTEU=%trim(tzztnr)
c eval ZPHELA=*blanks
c eval ZPMENG=0
c eval ZPNGEW=0
c eval ZPTGEW=0
c eval ZPLTNO=*blanks
c eval ZPPANO=*blanks
c eval ZPZTRU=%trim(azztn2)
c write d632102



Auf dem Ausdruck ist dann alles drauf, nur die kyrillischen Zeichen wurden durch Bindestriche ersetzt.
Die Anzahl der Striche stimmt, Leerzeichen sind auch da, nur ists halt nicht kyrillisch (siehe http://bit.ly/QI5XLE).


Jetzt frag ich mich, was zu tun ist und worans liegt.
Liegts am Programm, am Printerfile, an der Druckerdefinition oder am Drucker selber?
Hat wer eine Idee?

Fuerchau
21-09-12, 17:55
Leider ist es nicht so, wie du dir das vorgestellt hast.
Man kann in einer PRTF keine gemischten Zeichendaten ausgeben.

Der Zeichensatz wird durch die CHRID der PRTF bestimmt (CRTPRTF, OVRPRTF).
So lange man da nichts tut, gilt der Standard *DEV, also der Drucker entscheidet.

Möchtest du also kyrillisch drucken, kann das nur mit der gesamten PRTF gehen, nicht für einzelne Felder.

Die etwas schwierigere Variante ist Hosttransform mit AFPDS und dem Schlüsselwort FONTNAME.
Hier kann ein TrueType-Font gewählt werden (der vorher installiert werden muss), der wiederum auch Unicodefähig sein muss.
Dann wird dieser Font als Bitmap an den Drucker gesendet.
Soweit die Theorie, ausprobiert habe ich das noch nicht.
FONTNAME (Font name) keyword in printer files (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/rzakd/rzakdmstfontname.htm)


Die CHRID für kyrillisch müsste 960 880 sein.

System i basic printing: CHRID values supported (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/rzalu/rzalurefchrid.htm?resultof=%22%63%68%72%69%64%22%2 0)

angelone
25-09-12, 17:07
Hallo Baldur,
danke für die Tipps.
Aber irgendwie krieg ichs nicht hin.

Ich habe versucht das *SCS Printerfile per CHGPRTF umzustellen auf CHRID(960 880) und CHRID(1150 1025).

Mein Feld ZPBEZ1 im Printerfile ist 30A und ich fülle es mit

eval ZPBEZ1=%char(azbzru)

AZBZRU ist wie oben schon geschrieben 200G mit CCSID 13488.

Wenn ich mir im Debugger das Feld ZPBEZ1 nach meinem eval oben angucke, sieht es so aus:


> EVAL ZPBEZ1 :x
00000 3F3F3F3F 3F3F3F3F 3F403F3F 3F3F3F3F - ......... ......
00010 40404040 40404040 40404040 4040.... - ..


Das sieht für mich aus, als würde der %char nicht funktionieren.
Ich brauch den aber, ansonsten krieg ich die Graphic Daten ja nicht in das Alpha Feld.

Das Problem scheint mit der CCSID meines Jobs zusammenzuhängen.
%char scheint diese für die Konvertierung zu nutzen.

Standardmässig hab ich:
ID des codierten Zeichensatzes (CCSID) . . . . . : 65535
Standard-ID des codierten Zeichensatzes . . . . . : 273

Wenn ich jetzt ein CHGJOB CCSID(1025) oder 880 mache, sieht der %char schon ganz anders aus.



> EVAL ZPBEZ1 :x
00000 EDDBFABC EBFBDAEF CC40BECB CEEEEADE - Òû³¯ÔÛ¹Õ¦ ´ôóÓ²ú
00010 40404040 40404040 40404040 4040.... - ..


Ein einfaches Eval im Debugger sagt mir:


ZPBEZ1 = 'VOZDUSNIJ FIL'TR '


Was ist eigentlich haben will ist ein: "ВОЗДУШНЫЙ ФИЛЬТР" (Fängt mit nem kyrillischen "BO3" an und hört mit "bTP" auf, ich denk das Forum kriegts hin.)

Auf dem Drucker kommt dann folgendes raus: http://bit.ly/UDzjQy
Anzahl Zeichen stimmt, Zeichensatz irgendwie nicht.

Könnte das am TRANSFORM(*NO) USRDTATFM(*LIBL/TSPRWPR) MFRTYPMDL(*HP6) der OUTQ liegen?


===

*AFPDS hab ich auch versucht, das funktioniert aber noch weniger.
Haben wir hier noch nie genutzt, scheint aber sinnvoll zu sein.
Ich kann jetzt zwar PDF drucken, Barcodes und Overlays machen, aber mit FONTNAME funktionierts dann nicht.
Der Spool wird erstellt, geht kurz auf SND und dann in HLD.

Ich hatte die OUTQUEUE mit TRANSFORM(*YES) MFRTYPMDL(*HP6) eingerichtet.



* POSITIONEN
A R D632102
A SPACEB(002)
A ZPPOSI 3S 0O 2
A EDTCDE(Z)
A SPACEB(001)
A ZPARTN 15A O +2
A ZPBEZ1 40G O +1FONTNAME('Monotype Sans WT' +
A (*POINTSIZE 10.0)) +
A CCSID(13488 *NOCONVERT)
A ZPZTEU 11A O +1
A ZPHELA 3A O +1
A ZPMENG 8S O +7
A ZPNGEW 8S 2O 85
A ZPTGEW 8S 2O 97
A ZPLTNO 10A O +4
A ZPPANO 10A O +2
A ZPBEZ2 30A O 23
A SPACEB(001)
A ZPZTRU 11A O +1


Im Programm dann einfach:

eval ZPBEZ1=azbzru
Das Zielfeld ist ja jetzt auch Graphic.

Wenn ich mir den Spool angucke, sind da auch nicht anzeigbare Zeichen drin.
Drucken geht dann halt nicht.


Ich glaube, die *SCS Methode verspricht eher Erfolg.

Fuerchau
26-09-12, 08:00
Hier laufen verschiedene Sachen zusammen.

%CHAR wandelt natürlich falls möglich in die Job-CCSID um. Steht diese auf *HEX wird die Default-CCSID verwendet.

Fontname wird soweit ich nachgelesen habe nur mit AFPDS, Hosttransform bzw. IPDS-Druckern mit Rasterarchitektur oder PDF-Ausgabe unterstützt.
Die Fonts müssen aber korrekt installiert und vorhanden sein.
Bei der Umwandlung als *SCS werden dir ggf. Warnhinweise ausgegeben wenn Schlüsselworte ignoriert werden.
Klappt auf diesem Wege z.B. die PDF-Ausgabe und diese ist auch dann korrekt zu lesen, sollte es mit dem Drucker auch klappen.

Um mittels Unicode (CCSID 13488) ohne Fontname zu drucken ist *CONVERT erforderlich, da ja der Unicode in die Ziel-CCSID (CHRID) konvertiert werden muss.

Um also zur Laufzeit nicht noch andere Probleme zu bekommen (CCSID Kyrillisch ist nicht mit der CCSID der Datenbank kompatibel und beim Lesen/Open gibts CPF-Abbrüche), kann der Job also passend zur DB auf 273 stehen.
Die CHRID des Spools sollte dann auf Kyrillisch überschrieben werden.

Durch den Unicode werden die Daten korrekt durchgereicht.

Dass du im Debugger die kyrillischen Zeichen nicht lesen kannst ist ganz normal.
Wenn du dir dann aber den Inhalt mit Hex "eval Field:x" ansiehst kannst du den 2-Byte-Code prüfen.
Hierzu kannst du dir die "Zeichentabelle" aus Windows heranziehen. In der wählst du eine Unicode-Schrift aus (z.B. Arial).
In der erweiterten Ansicht kannst du den Zeichensatz für Kyrillisch auswählen.
Beim anclicken eines Zeichens wird dir in der Statuszeile der Hexcode "U+XXXX" angzeigt der mit deinen Zeichen im Programm übereinstimmen sollte.

Nun kommt es noch auf den Drucker an.
Ohne Hosttransform kann Fontname nicht funktionieren da der Font als Grafik gesendet wird (wie in Windows).
Über die CHRID wird eine ESC-Sequenz für die kyrillische Codepage gesendet.
Das heißt nun schlussendlich, dass der Drucker selber einen residenten Schriftsatz für kyrillisch haben muss!

Mittels Hosttransform und Fontname kannst du das ja auch mal ausprobieren.

angelone
26-09-12, 14:22
Danke für deine Tipps, aber ich geb auf.
Das hat keinen Sinn hier.

Falls irgendwer das am laufen hat und ein Howto postet, guck ichs mir gerne nochmal an.
Aber nach 1 Woche rumfrickeln hab ich keine Lust mehr auf das Thema.

Fuerchau
26-09-12, 14:48
Vielleicht ist das ja so, dass dein Drucker einfach kein kyrillisch kann.
Frag mal den Lieferanten.
Windows-Druck gilt hier nicht, da hier immer grafisch ausgegeben wird (TrueType).