PDA

View Full Version : Java Programm aus ILE RPG aufrufen



Seiten : [1] 2

PGMR
01-02-05, 16:06
Hallo,

ich habe folgendes Problem:

Habe ein ILE RPG Programm geschrieben, welches einen Java XML Parser mit dem Dateipfad als Parameter aufruft.
Das Java Programm liest das XML Dokument in ein Array ein und soll es dem ILE RPG Programm zurückliefern, damit ich den Inhalt weiterverarbeiten kann.
Mein Problem daran ist wie definiere ich den Prototypen für das Java Programm(wegen Array) und wie ist dann der Aufruf?
Habe schon verzweifelt in Dokus gesucht aber nichts gefunden.

Könnte mir jemand weiterhelfen?? oder ein Beispiel Posten??

Vielen Dank

BenderD
04-02-05, 16:34
Hallo,

sowas mache ich zwar nicht, Java aus RPG über JNI aufrufen und rate auch davon ab, aber das mit dem Array, das wird wohl nix werden, das müsste ja in dem RPG dann dynamisch deklariert und verwaltet werden und ob das geht, das bezweifel ich eher.
Das müsste man wohl über eine Objekt Deklaration und weiter Aufrufe machen; aber was soll das ganze eigentlich? Damit bist du doch genauso weit wie vorher und das zerlegen in Zeilen kriegt man eher in RPG hin, als das analysieren des XML. Was hast du denn wirklich vor?

mfg

Dieter Bender


Hallo,

ich habe folgendes Problem:

Habe ein ILE RPG Programm geschrieben, welches einen Java XML Parser mit dem Dateipfad als Parameter aufruft.
Das Java Programm liest das XML Dokument in ein Array ein und soll es dem ILE RPG Programm zurückliefern, damit ich den Inhalt weiterverarbeiten kann.
Mein Problem daran ist wie definiere ich den Prototypen für das Java Programm(wegen Array) und wie ist dann der Aufruf?
Habe schon verzweifelt in Dokus gesucht aber nichts gefunden.

Könnte mir jemand weiterhelfen?? oder ein Beispiel Posten??

Vielen Dank

PGMR
07-02-05, 08:56
Hallo,

sowas mache ich zwar nicht, Java aus RPG über JNI aufrufen und rate auch davon ab, aber das mit dem Array, das wird wohl nix werden, das müsste ja in dem RPG dann dynamisch deklariert und verwaltet werden und ob das geht, das bezweifel ich eher.
Das müsste man wohl über eine Objekt Deklaration und weiter Aufrufe machen; aber was soll das ganze eigentlich? Damit bist du doch genauso weit wie vorher und das zerlegen in Zeilen kriegt man eher in RPG hin, als das analysieren des XML. Was hast du denn wirklich vor?

mfg

Dieter Bender



Hallo,

eigentlich habe ich nichts weiter vor als ne XML Datei aus dem IFS einzulesen.
Problem ist das in der ankommende XML-Datei- die Tags so gestaltet sind, dass die alle in einer Zeile stehen und für CPYTOSTMF die Zeile zu lang ist.
Hättest du noch ne andere Idee?

BenderD
07-02-05, 10:06
Hallo,


Hallo,

eigentlich habe ich nichts weiter vor als ne XML Datei aus dem IFS einzulesen.
Problem ist das in der ankommende XML-Datei- die Tags so gestaltet sind, dass die alle in einer Zeile stehen und für CPYTOSTMF die Zeile zu lang ist.
Hättest du noch ne andere Idee?

nein, mehrere:
- was hältst du von CPYFRMSTMF ENDLINFMT(*FIXED)
- oder von lesen des Streamfiles mit C-Apis aus RPG (dazu gabs letztes Jahr Artikel von mir im Midrange Magazin und gibt es Service Programme auf meiner Open Source Seite und bei Thomas auf der tools400 ebenso)
- wie wärs mit dem XML Parser API (siehe ebenfalls bei Thomas Raddatz)
- ...
allerdings würde ich auch mal drüber nachdenken, was passiert, wenn das XML irgendwo Schrott ist!!!

mfg

Dieter Bender

sim
09-02-05, 11:09
Hallo PGMR,

kann Hr. Bender nur zustimmen.
versuchs mal mit den C-APIs, funktioniert wunderbar.

Bei uns läuft in bestimmten Bereichen der Datenaustausch
auch per XML Dateien. Das einlesen bzw ausgeben ist
mit den C APIs kein Problem.

Und schon ist die Mietze am fliegen.
(ups, war ja ein Spruch von nem JAVA Dozenten)

PGMR
10-02-05, 08:33
Hallo PGMR,

kann Hr. Bender nur zustimmen.
versuchs mal mit den C-APIs, funktioniert wunderbar.

Bei uns läuft in bestimmten Bereichen der Datenaustausch
auch per XML Dateien. Das einlesen bzw ausgeben ist
mit den C APIs kein Problem.

Und schon ist die Mietze am fliegen.
(ups, war ja ein Spruch von nem JAVA Dozenten)




Mit den C APIs habe ich es auch schon probiert, hat auch funktioniert bin leider nach längerem Experimentieren daran gescheitert, das sie Umlaute nicht umgesetzt werden(auch wenn ich CCSID angebe.

Ich werde mich mal mit den Service Programmen von tools400 beschäftigen...

BenderD
10-02-05, 09:16
Hi,

poste mal deine Parameter vom open, irgendwas machst du da verkehrt

Dieter Bender


Mit den C APIs habe ich es auch schon probiert, hat auch funktioniert bin leider nach längerem Experimentieren daran gescheitert, das sie Umlaute nicht umgesetzt werden(auch wenn ich CCSID angebe.

Ich werde mich mal mit den Service Programmen von tools400 beschäftigen...

PGMR
10-02-05, 09:24
Hi,

poste mal deine Parameter vom open, irgendwas machst du da verkehrt

Dieter Bender


p readFile b export

d readFile pi 256 dim(9999)
d pFileName 100a

* //Work Variables
d BytesRead s 10i 0 inz(1)
d File s 100
d FileOpen s 10i 0
d DataRead s 32767a
d Data s 32767a
d Eor s 2a inz(X'0D25')
d PosStart s 5 0 inz(1)
d PosEnd s 5 0 inz(1)
d PosDiff s 5 0

d ayReadResult s 256 dim(9999)
d ayReadI s 5 0 inz(0)

d ofl s 10i 0
d mode s 10u 0
d codep s 10u 0

* //Open File! If error, FileOpen return '-1'
c eval File = %trim(pFileName) + x'00'
c eval ofl=O_RDONLY+O_TEXTDATA
c eval mode = S_IRUSR
c eval codep = 273
c eval FileOpen = open(%add
(File:openflags
c :mode:codepage)
c eval FileOpen = open(%addr(File):ofl)

* //Bei Fehler leeres Array zurückliefern
c if FileOpen < 0
c eval ayReadI = (ayReadI + 1)
c eval ayReadResult(ayReadI) = *blank
c return ayReadResult(ayReadI)
c endif

c dow BytesRead > 0

* //Read file and save in buffer DataRead
c eval BytesRead = read(FileOpen
c : %addr(DataRead)
c : %size(DataRead))
c if BytesRead > 0

* //Read from first blank till second blank and save the diff in Array
c dou PosEnd = *zero
c if %scan(Eor:DataRead:PosStart) = PosStart
c eval PosStart = (PosStart + 1)
c endif
c eval PosEnd = %scan(Eor:DataRead:PosStart)
c if PosEnd <= 0
c leave
c endif
c eval ayReadI = (ayReadI + 1)
c eval PosDiff = (PosEnd - PosStart)
c eval ayReadResult(ayReadI) = %subst

(DataRead
c : PosStart: PosDiff)
c eval PosStart = PosEnd
c enddo
c endif

c enddo

* //Close the File
c callp close(FileOpen)

c return ayReadResult

preadFile e

Kannst du den Fehler erkennen??

sim
10-02-05, 09:52
Mit den C APIs habe ich es auch schon probiert, hat auch funktioniert bin leider nach längerem Experimentieren daran gescheitert, das sie Umlaute nicht umgesetzt werden(auch wenn ich CCSID angebe.

Ich werde mich mal mit den Service Programmen von tools400 beschäftigen...


Hallo PGMR,

hier hab ich mal ein kleines Beispiel wie du die Umsetzung machen kannst. Wie gesagt, wir machen auch XML Ein und Ausgabe und es funktioniert ohne Probleme.

// Von EBCEDIC nach ANSI (Windows) umwandeln
// ohne Euro Zeichen
...
...
when zeichensatz = 'EbAn';
UmgesetzteDaten =
qdcxlate (anzBytes : daten : 'Q273A05A5U' : 'QUSRSYS' );

// Euro Zeichen umsetzen
daten = %xlate(x'C7':x'80':daten);
...
...


sim

BenderD
10-02-05, 10:29
Hallo,




* //Open File! If error, FileOpen return '-1'
c eval File = %trim(pFileName) + x'00'
c eval ofl=O_RDONLY+O_TEXTDATA
c eval mode = S_IRUSR
c eval codep = 273
c eval FileOpen = open(%add
(File:openflags
c :mode:codepage)
c eval FileOpen = open(%addr(File):ofl)

Kannst du den Fehler erkennen??

der erste open sollte klappen, der zweite geht wohl in den Wind, weil das File schon open ist (denke ich mir), wenn die CCSID der Datei korrekt ist, dann wird ohne Angabe geöffnet, was bei Textdata automatisch konvertiert.
Mit anderen Worten: prüfe ob der Inhalt der Konstanten O_RDONLY und O_TXTDATA richtig ist und lass den ersten open weg.

mfg

Dieter Bender