PDA

View Full Version : Mittels Java-Toolbox auf MessageFiles zugreifen



Seiten : [1] 2

opeker
10-03-05, 11:59
Hallo !

Ich brauche in einer Java-Klasse Nachrichten aus verschiedenen MessageFiles. Dazu verwende ich die Java-Toolbox (com.ibm.as400.access.MessageFile und com.ibm.as400.access.AS400Message.getText).

Nun habe ich das Problem, das wir unsere MSGF mit CCSID 65535 erstellt haben und die Texte pro MSGF in unterschiedlichen CCSID's gespeicht sind. Das funktioniert auf der iSeries ganz gut, macht jedoch in Java bei manchen CCSID's Probleme. Bei CCSID 1025 bekomme ich nur Sonderzeichen zurück. In Java habe ich bisher jedoch keine Möglkichkeit gefunden die richtige CCSID anzugeben oder zumindest ein Byte-Array zurückzubekommen, das dann umgewandelt werden kann.

Hat vielleicht irgend jemand eine Idee wie ich dieses Problem lösen kann?

mfg, Opeker

Fuerchau
10-03-05, 12:02
Wie immer:
Die Daten sollten die CCSID haben die sie repräsentieren, also CHGMSGF ... CCSID(nnn).

opeker
10-03-05, 12:55
Wie immer:
Die Daten sollten die CCSID haben die sie repräsentieren, also CHGMSGF ... CCSID(nnn).
Vielen Dank für die Antwort. Ich habe damit jedoch zwei Probleme. Das größte ist sicherlich, das auf der iSeries alle Bildschirm- und Druckausgaben mit diesen Einstellungen richtig funktionieren und der Umstellungsaufwand wahrscheinlich etwas größer ist als ein CHGMSGF. Das zweite Problem ist, das bei einer Umstellung der CCSID die Text auch nicht in Kyrillisch angezeigt werden, sondern irgendwie ins Latin übersetzt werden (z.Bsp statt Обозначение wird Oboznacenie angezeigt).

Ich bräuchte daher wahrscheinlich eine Lösung (Konvertierung) in Java.

mfg, Opeker

Fuerchau
10-03-05, 13:13
Da Java doch Unicode unterstützt, versuche doch die Nachrichten in UNICODE (CCSID 13488) zu konvertieren, dann dürfte es keine Verluste geben.

opeker
10-03-05, 15:09
Da Java doch Unicode unterstützt, versuche doch die Nachrichten in UNICODE (CCSID 13488) zu konvertieren, dann dürfte es keine Verluste geben.
Das war auch meine Idee. Ich habe jedoch in der Java-Toolbox keine Möglichkeit gefunden bei MessageFile oder AS400Message etwas zu konvertieren. Ich weiss daher nicht wie ich die Nachrichten konvertieren kann.

lg,

BenderD
10-03-05, 23:33
Hallo,

ich verstehe als interessierter Laie (der noch nie ein AS400 Object erstellt hat) die Frage noch nicht ganz: das AS400 Object hat eine CCSID, Java verwendet UniCode und ich gehe davon aus, dass da passend konvertiert wird. Was treibst du genau und was funktioniert nicht?

mfg

Dieter Bender


Hallo !

Ich brauche in einer Java-Klasse Nachrichten aus verschiedenen MessageFiles. Dazu verwende ich die Java-Toolbox (com.ibm.as400.access.MessageFile und com.ibm.as400.access.AS400Message.getText).

Nun habe ich das Problem, das wir unsere MSGF mit CCSID 65535 erstellt haben und die Texte pro MSGF in unterschiedlichen CCSID's gespeicht sind. Das funktioniert auf der iSeries ganz gut, macht jedoch in Java bei manchen CCSID's Probleme. Bei CCSID 1025 bekomme ich nur Sonderzeichen zurück. In Java habe ich bisher jedoch keine Möglkichkeit gefunden die richtige CCSID anzugeben oder zumindest ein Byte-Array zurückzubekommen, das dann umgewandelt werden kann.

Hat vielleicht irgend jemand eine Idee wie ich dieses Problem lösen kann?

mfg, Opeker

opeker
11-03-05, 07:02
Hallo,

ich verstehe als interessierter Laie (der noch nie ein AS400 Object erstellt hat) die Frage noch nicht ganz: das AS400 Object hat eine CCSID, Java verwendet UniCode und ich gehe davon aus, dass da passend konvertiert wird. Was treibst du genau und was funktioniert nicht?

mfg

Dieter Bender
Guten Morgen !

Mittels dieser Java-Objekte kann ich auf Daten der iSeries zugreifen. In diesem Falle auf Objekte der Art *MSGF. Dabei habe ich allerdings das Problem, dass die iSeries-Objekte in SingleByte gespeichert sind und Java mit Unicode arbeitet. Daher wird irgendwo (leider falsch) umgesetzt. In diesem Fall bin ich zwar schlauer als die Automatik, da ich die richtigen CCSID's kenne, aber es hilft mir nichts, weil ich nicht weiß wo ich in diese Automatik eingreifen kann. Ein Byte-Array könnte ich zwar richtig konvertieren, aber aus diesen Java-Objekten bekomme ich keine zurück.

lg,

Peter Opeker

BenderD
11-03-05, 08:31
Hallo,

ich gehe davon aus, dass ein Message File eine CCSID hat, die Connection (sprich: das AS400 Objekt) hat ebenfalls eine und beim holen findet dann eine (gegebenen Falls doppelte) Umsetzung statt. Von der CCSID der Message File über die CCSID des AS400 Objektes zu Unicode und wenn du hier alles richtig einstellst sollte das Ergebnis stimmen, oder die Toolbox hat einen Bug, oder in deinem Message File steht Schrott.
Was das Byte Array angeht: diese Frage kann doch nicht ernst gemeint sein???. die getText() des MessageFiles liefert dir einen String zurück und selbiger hat wie jeder String eine Methode getBytes() die dir ein Byte Array zurück liefert. Allerdings käme kein Java Programmierer auf die RPG Idee irgendwelche Bit Frickeleien in einem Byte Array vorzunehmen, um einen Work around für einen Bug oder Schrottdaten zu drechseln.

mfg

Dieter Bender


Guten Morgen !

Mittels dieser Java-Objekte kann ich auf Daten der iSeries zugreifen. In diesem Falle auf Objekte der Art *MSGF. Dabei habe ich allerdings das Problem, dass die iSeries-Objekte in SingleByte gespeichert sind und Java mit Unicode arbeitet. Daher wird irgendwo (leider falsch) umgesetzt. In diesem Fall bin ich zwar schlauer als die Automatik, da ich die richtigen CCSID's kenne, aber es hilft mir nichts, weil ich nicht weiß wo ich in diese Automatik eingreifen kann. Ein Byte-Array könnte ich zwar richtig konvertieren, aber aus diesen Java-Objekten bekomme ich keine zurück.

lg,

Peter Opeker

Fuerchau
11-03-05, 09:22
Das Problem liegt wohl eher in der Jobumgebung. Auch der Java-Job läuft unter einer CCSID !
Beim Zugriff auf die Nachricht wird also VOR Java der Inhalt in die JobCCSID konvertiert und dann an Java übergeben (die Toolbox muss schliesslich intern den RTVMSG bzw. das API aufrufen).
Dadurch erhalten die gelesenen Daten die CCSID des Jobs und werden dann natürlich "falsch" in Unicode übersetzt.
Prüfe mal, in wie weit beim Lesen der Job kurzfristig in die CCSID der Nachricht geändert werden kann. Eine Änderung auf 65535 bringt nichts, da dann eine Standardzuordnung zum Unicode (wahrscheinlich CCSID 037) angenommen wird.
Wie du die CCSID der Nachricht in Java abfragen kannst weiß ich nicht.
Ggf. musst du ein Programm (CLP/RPGLE) schreiben, dass über Java aufgerufen wird und den Zugriff auf die Nachricht selbst übernimmt.

opeker
11-03-05, 09:27
Hallo,

ich gehe davon aus, dass ein Message File eine CCSID hat, die Connection (sprich: das AS400 Objekt) hat ebenfalls eine und beim holen findet dann eine (gegebenen Falls doppelte) Umsetzung statt. Von der CCSID der Message File über die CCSID des AS400 Objektes zu Unicode und wenn du hier alles richtig einstellst sollte das Ergebnis stimmen, oder die Toolbox hat einen Bug, oder in deinem Message File steht Schrott.
Was das Byte Array angeht: diese Frage kann doch nicht ernst gemeint sein???. die getText() des MessageFiles liefert dir einen String zurück und selbiger hat wie jeder String eine Methode getBytes() die dir ein Byte Array zurück liefert. Allerdings käme kein Java Programmierer auf die RPG Idee irgendwelche Bit Frickeleien in einem Byte Array vorzunehmen, um einen Work around für einen Bug oder Schrottdaten zu drechseln.

mfg


Dieter Bender
Ich habe wie oben schon beschrieben das Problem das der MSGF mit CCSID 65535 und die Texte darin in den Spracheigenen CCSID's gespeichert sind. Also z.Bsp. 37, 870 oder 1025. Das ist leider auf die Schnelle nicht zu ändern da auf der iSeries sämtliche Ausgaben korrekt dargestellt werden und diese Lösung international auf meherern System zur Anwendung kommt. Ich brauche nun in der Java-Welt die gleichen Texte, habe dabei das Problem das 1025-Texte nur als Sonderzeichen in Java ankommen.

Klar kann ich aus einem String ein Byte-Array machen, doch da ist die falsche Umsetzung bereits passiert und es hilft mir nichts mehr. Ich bräuchte einen Einstieg eine Ebene tiefer.

mfg