-
Hmm vielleicht habe ich mich auch etwas unglücklich ausgedrückt. Nochmal etwas ausführlicher:
Ich habe hier ein ILE RPG/Java Beispielprogramm vor mir liegen. In dem ILE Programm wird nun die Java POI API verwendet um eine Excel Datei als Ausgabedatei aufzubauen, welche dann auf das IFS gespeichert werden soll.
Java (JDK 1.3 und 1.4) ist bereits auf unserer I5 installiert.
Wie sehe ich nun, ob die POI Bibliotheken/Klassen schon installiert sind und wenn nein wie kann ich diese auf die I5 installieren/kopieren ... ?
[EDIT]Oh hier sind ja gerade noch ein paar Antworten reingekommen ... mal schauen, ob cih dieser post erledigt hat ...[/EDIT]
-
 Zitat von User23
Wie sehe ich nun, ob die POI Bibliotheken/Klassen schon installiert sind und wenn nein wie kann ich diese auf die I5 installieren/kopieren ... ?
Wie gesagt, die Datei liegt wenn überhaupt (was ich aber nicht glaube) im IFS. Das kann man mit dem OpNavigator suchen oder auch in der QSH.
Generische Suchen von der Root weg, sind etwas problematisch, da auch die QSYS dabei ist, was dann sehr langsam wird.
Externe Zusätze legt IBM (ich hab aber nur V5R2) normalerweise unter:
/QIBM/ProdData/Java400/ext
/QBIM/UserData/Java400/ext
ab. Quick&Dirty könnte man dort die Java-POI dazukopieren. Gehört aber nicht dorthin, ist dann automatisch im Classpath.
Sauberer ist es ein eignes Verzeichnis dafür zu haben. Dann man die jar allerdings im Classpath unterbringen.
Da es bei mir schnell gehen muss, habe ich mit Direktaufrufen auf RPG keine Erfahrungen. Falls sich dort der Classpath nicht angeben läßt, muss man das mit xxxENVAR CLASSPATH erledigen (ADD, CHG..).
Wie schon oft im Forum erwähnt: Die Variante RPG direkt auf Java ist die langsamste und verbraucht am meisten Resourcen (jedes mal eine JVM aufmachen und compilieren).
Um dass Startverhalten ein wenig zu optimieren, kann man mit CRTJVAPGM eine vorkompilierte Version erstellen lassen (je höher der Level desto schneller).
Robert P.
-
Hallo zusammen,
vielen dank für die hilfreichen tips.
ich hatte jetzt endlich etwas zeit zum probieren.
Java 1.4.2 ist auf unserer I5 installiert.
Die 3 Archive
- poi.jar
- poi-contrib.jar
- poi-scratchpad.jar
habe ich nach /QIBM/UserData/java400/ext/ kopiert.
In den Umgebungsvariablen habe ich
die /QIBM/UserData/java400/ext/poi.jar hinzugefügt ...
Bei folgendem Testprogramm:
Code:
/title Anwenderdatei in Excel erstellen
*
H dftactgrp(*no)
*
FZR9T00 if e Disk
*
DCount S 5 0 Inz(0)
DC S 5 0 Inz(0)
DIFSFile S 1024 Inz('/QDLS/DURESP/TEST.XLS')
DSn S 10I 0 Inz(0)
DTableName S 1024 Inz('Anwender')
DvalueAlf S 1024
DvalueNUM S 8F
DvalueShort S 5I 0
Dcol S 5I 0
Dwidth S 5I 0
*
*
* OBJECT Variables *******************************************************
*
* // String.
*
Dstring S O CLASS(*JAVA
D :'java.lang.String')
*
* // String with fileName.
* // Short.
*
Dshort S O CLASS(*JAVA
D :'java.lang.Short')
* // Column.
*
Dcolumn S O CLASS(*JAVA
D :'java.lang.Short')
* // ColumnWidth.
*
DcolumnWidth S O CLASS(*JAVA
D :'java.lang.Short')
*
Dfilename S O CLASS(*JAVA
D :'java.lang.String')
*
* // FileOutputStream.
*
DoutFile S O CLASS(*JAVA
D :'java.io.FileOutputStream')
*
* // Workbook.
*
Dwb S O CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFWorkbook')
*
* // Sheet.
*
Ds S O CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFSheet')
*
* // Row.
*
Drow S O CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFRow')
*
* // Cell.
*
Dcell S O CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFCell')
*
* CONSTRUCTOR Methods. ***************************************************
*
* // String CONSTRUCTOR
* // new String(byte b[])
*
DcreateString PR O EXTPROC(*JAVA
D :'java.lang.String'
D :*CONSTRUCTOR)
D CLASS(*JAVA
D :'java.lang.String')
Dparm 1024
*
* // Short CONSTRUCTOR
* // new Short(byte b[])
*
DcreateShort PR O EXTPROC(*JAVA
D :'java.lang.Short'
D :*CONSTRUCTOR)
D CLASS(*JAVA
D :'java.lang.Short')
Dparm 5I 0 value
*
* // FileOutputStream CONSTRUCTOR
* // new FileOutputStream(String file)
*
DcreateFile PR O EXTPROC(*JAVA
D :'java.io.FileOutputStream'
D :*CONSTRUCTOR)
D CLASS(*JAVA
D :'java.io.FileOutputStream')
Dparm O CLASS(*JAVA
D :'java.lang.String')
*
* // WorkBook CONSTRUCTOR
*
DcreateWB PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFWorkbook'
D :*CONSTRUCTOR)
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFWorkbook')
*
* // write(java.io.OutputStream)
*
DwriteWB PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFWorkbook'
D :'write')
Dparm O CLASS(*JAVA
D :'java.io.OutputStream')
*
* METHODS ****************************************************************
*
* // java.lang.trim()
*
DtrimString PR O EXTPROC(*JAVA
D :'java.lang.String'
D :'trim')
D CLASS(*JAVA
D :'java.lang.String')
*
* // shortValue()
*
DshortValue PR O EXTPROC(*JAVA
D :'java.lang.Short'
D :'shortValue')
D CLASS(*JAVA
D :'java.lang.Short')
Dparm O CLASS(*JAVA
D :'java.lang.Short')
*
* // WorkBook.createSheet()
*
DcreateSheet PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFWorkbook'
D :'createSheet')
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFSheet')
Dparm O CLASS(*JAVA
D :'java.lang.String')
*
* // Sheet.createRow()
*
DcreateRow PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFSheet'
D :'createRow')
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
* .HSSFSheet')
D .HSSFRow')
Dparm 5I 0 value
*
* // Sheet.setColumnWidth()
*
DsetColumnWidth PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFSheet'
D :'setColumnWidth')
Dparm1 5I 0 value
Dparm2 5I 0 value
*
* // Row.setHeight()
*
DsetHeight PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFRow'
D :'setHeight')
Dparm 5I 0 value
*
* // Row.createCell()
*
DcreateCell PR O EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFRow'
D :'createCell')
D CLASS(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFCell')
Dparm1 5I 0 value
*
* // Cell.setCellType(int)
*
DsetCellType PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFCell'
D :'setCellType')
Dparm1 10I 0 value
*
* // Cell.setCellValue(String)
*
DsetCellValStr PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFCell'
D :'setCellValue')
Dparm O CLASS(*JAVA
D :'java.lang.String')
*
* // Cell.setCellValue(double)
*
DsetCellValD PR EXTPROC(*JAVA
D :'org.apache.poi.hssf.usermodel-
D .HSSFCell'
D :'setCellValue')
Dparm 8F value
*
/Free
//
Count = 0;
//
// Create a Workbook.
//
wb = createWB();
//
// setSheetName.
//
valueALF = Tablename;
string = createString(valueALF);
string = trimString(String);
//
// Create a Worksheet.
//
s = createSheet(wb:string);
//
// Set Column Width, 1/256 of a character width.
//
col = 0;
width = 3840;
setColumnWidth(s:col:width);
col = 1;
width = 1024;
setColumnWidth(s:col:width);
col = 2;
width = 8192;
setColumnWidth(s:col:width);
col = 3;
width = 5120;
setColumnWidth(s:col:width);
col = 4;
width = 15360;
setColumnWidth(s:col:width);
//
// Run through book records.
//
Read ZR9T00;
Dow not %eof(ZR9T00);
Exsr DBRec2Excel;
Read ZR9T00;
Enddo;
//
// Create String filename.
//
IFSFile = %trim(IFSFile);
filename = createString(IFSFile);
//
// Trim filename (50A).
//
filename = trimString(filename);
//
// Create FileOutputStream.
//
outFile = createFile(filename);
//
// Write Workbook to output file.
//
writeWB(wb:outFile);
//
// End of program.
//
*inlr = *on;
//
/End-Free
*
*
*
**************************************************************************
*
/Free
//
Begsr DBRec2Excel;
//
// Create a row.
//
row = createRow(s:Count);
//
c = 0;
//
// FIN.
//
cell = createCell(row:c);
setCellType(cell:1);
valueALF = Z9TFIN;
string = createString(valueALF);
string = trimString(String);
setCellValStr(cell:string);
c = c+1;
//
// Z9T004.
//
cell = createCell(row:c);
setCellType(cell:1);
valueALF = Z9T004;
string = createString(valueALF);
string = trimString(String);
setCellValStr(cell:string);
c = c+1;
//
// Z9T004.
//
cell = createCell(row:c);
setCellType(cell:1);
valueALF = Z9T004;
string = createString(valueALF);
string = trimString(String);
setCellValStr(cell:string);
c = c+1;
//
// Z9T004.
//
cell = createCell(row:c);
setCellType(cell:1);
valueALF = Z9T004;
string = createString(valueALF);
string = trimString(String);
setCellValStr(cell:string);
c = c+1;
//
// Z9T004.
//
cell = createCell(row:c);
setCellType(cell:1);
valueALF = Z9T004;
string = createString(valueALF);
string = trimString(String);
setCellValStr(cell:string);
c = c+1;
//
// Count record number.
//
Count = Count +1;
//
Endsr;
//
/End-Free
Das Umwandeln im PDM lief fehlerfrei.
Beim Aufruf bekomme ich aber folgende Fehlermeldung:
Code:
Nachricht . . . : Java-Ausnahme beim Aufrufen der Java-Methode empfangen (C
G D F).
Ursache . . . . : RPG-Prozedur YGXLS in Programm xxxxxxxx/YGXLS hat
Java-Ausnahme "java.lang.NoSuchMethodError: createRow" empfangen, als die
Methode "createRow" mit Kennung
"(S)Lorg.apache.poi.hssf.usermodel.HSSFSheet;" in Klasse
"org.apache.poi.hssf.usermodel.HSSFSheet" aufgerufen wurde.
Fehlerbeseitigung: Mit Hilfe des Benutzers, der für die Programmpflege
verantwortlich ist, die Fehlerursache bestimmen.
Auswahlmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . :
D -- Einen RPG-formatierten Speicherauszug erstellen.
S -- Einen Systemspeicherauszug erstellen.
G -- Die Verarbeitung bei *GETIN fortsetzen.
C -- Abbruch.
F -- Einen vollständig formatierten Speicherauszug erstellen.
Technische Beschreibung . . . . . . . : Gibt die Ausnahme an, dass die
Java-Klasse nicht gefunden wurde, sicherstellen, dass sich die Klasse für
die Methode in dem Klassenpfad befindet. Gibt die Ausnahme an, dass die
Java-Methode nicht gefunden wurde, den Methodennamen und die Kennung
überprüfen. Ist die Kennung nicht korrekt, den RPG-Prototyp für die Methode
ändern oder die Java-Methode ändern, damit die Rückgabeart und die
Parameterarten übereinstimmen. Die Kennungen für alle Methoden in der Klasse
XYZ können mit dem Befehl QSH CMD('javap -s XYZ') bestimmt werden.
Kann mir hier jemand weiterhelfen?
Habe ich die POI API nicht richtig eingebunden, oder stimmt hier was mit der Java Syntax nicht?
Mich wundert vorallem diese Zeile hier in der Fehlermeldung:
(S)Lorg.apache.poi.hssf.usermodel.HSSFSheet;
Wird hier irgendwas nicht richtig umgesetzt wegen dem (S)L ?!
Danke im voraus
-
Ich denke das die Kennung in dem Fall nichts mit dem Problem zu tun hat.
Wegen der Möglichkeit des "Überladens", ist die Fehlermeldung "java.lang.NoSuchMethodError: createRow" mit Vorsicht zu genießen.
Das heißt jetzt nicht unbedingt, dass die Methode createRow nicht gefunden wird, sondern das createRow für die verwendeten Parameter nicht gefunden wird.
Theoretisch könnte es
createRow()
createRow(int)
createRow(String) ....
geben.
Je nach Parameter würde die entsprechende Methode ausgewählt.
Laut Poi-API gibt es nur createRow(int).
Ich hab zwar nur wenig Erfahrung mit RPG und gar keine mit der RPG-Java-JNI, ich denke, dass du Count mit 10I0 definieren musst.
5I 0 wird für Short verwendet
10I 0 für int
createRow benötigt int!!
Leider ist die Java-Fehlermeldung "beschnitten". Normalerweise lautet die Fehlermeldung etwa so:
java.lang.NoSuchMethodError: ...createRow(java.lang.Short)
Damit schaut man dann in die POI-API und sieht dann ob das Short passt.
Grüße
Robert P. (der einen reinen Javadienst vorziehen würde...)
-
@RobertPic:
Danke. Das mit dem Überladen war der richtige Ansatz. Ich habe die Variable und den Parameter auf 10I geändert. Er bleibt jetzt zumindest nicht mehr an dieser Stelle stehen ...
Jetzt kommt allerdings die Meldung:
Code:
Nachricht . . . : Java-Ausnahme beim Aufrufen der Java-Methode empfangen (C
G D F).
Ursache . . . . : RPG-Prozedur YGXLS in Programm xxxxxx/YGXLS hat
Java-Ausnahme "java.io.FileNotFoundException: Funktion nicht zulÀssig.
/QDLS/DURESP/TEST.XL" empfangen, als die Methode "<init>" mit Kennung
"(Ljava.lang.String;)V" in Klasse "java.io.FileOutputStream" aufgerufen
wurde.
Fehlerbeseitigung: Mit Hilfe des Benutzers, der für die Programmpflege
verantwortlich ist, die Fehlerursache bestimmen.
Auswahlmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . :
D -- Einen RPG-formatierten Speicherauszug erstellen.
S -- Einen Systemspeicherauszug erstellen.
G -- Die Verarbeitung bei *GETIN fortsetzen.
C -- Abbruch.
F -- Einen vollständig formatierten Speicherauszug erstellen.
Technische Beschreibung . . . . . . . : Gibt die Ausnahme an, dass die
Java-Klasse nicht gefunden wurde, sicherstellen, dass sich die Klasse für
die Methode in dem Klassenpfad befindet. Gibt die Ausnahme an, dass die
Java-Methode nicht gefunden wurde, den Methodennamen und die Kennung
überprüfen. Ist die Kennung nicht korrekt, den RPG-Prototyp für die Methode
ändern oder die Java-Methode ändern, damit die Rückgabeart und die
Parameterarten übereinstimmen. Die Kennungen für alle Methoden in der Klasse
XYZ können mit dem Befehl QSH CMD('javap -s XYZ') bestimmt werden.
Der erste Gedanke war natürlich, dass das Feld für den Dateinamen zu kurz ist, weil er TEST.XL statt TEST.XLS schreibt. Aber auch ein kürzerer Dateiname bringt eine ähnlich Meldung. Weiss hier nochmal jmd. Rat?
Danke im Voraus.
-
Dazu muss ich etwas raten:
Java-Ausnahme:"java.io.FileNotException: Funktion nicht zulässig..."
...und das noch bei einer Ausgabeoperation.
Meine Klasse "JGlaskugel" hätte anzubieten:
- Verzeichnis nicht gefunden (File muss bei Output nicht vorhanden sein!!!)
- keine Berechtigung zur Fileanlage in diesem Verzeichnis
- Java mag das QDLS nicht (ich auch nicht )
- POI will vielleicht anhängen (eher unwahrscheinlich)
Zur Einschränkung:
Test mit fixen Dateinamen außerhalb der QDLS, Berechtigungen im Verzeichnis prüfen
Robert P.
Nachtrag: Versuch aus dem Job (ev. Spoolfile) noch irgendwo die orginale Javafehlermeldung zu finden, die "beschnittene" ist mir etwas unsicher.
Normalerweise wird ein FileNotFound im Format:
Filename (Fehlermeldung) ausgegeben
noch eine Variante:
- der Dateiname hat führende Leerzeichen oder heißt "Funktion nicht ....."
-
Danke für den Tip.
Hatte wirklich mit den Berechtigungen im QDLS zu tun.
Die .XLS Datei wird jetzt an einem anderen Ort generiert.
Jetzt komme ich aber schon wieder zu einem Problem.
Ich hätte gerne folgenden Ablauf in einem CL:
Erstelle Datei
Kopiere die Datei ins QDLS
Öffne sie via STRPCCMD
Problem bei der Sache ist, dass die Datei gesperrt ist, wenn das Programm über einen Call aufgerufen wird. Erst wenn ich mich komplett aus der Sitzung abmelde ist diese wieder frei.
Wenn ich im CL das Programm mit submitjob aufrufe weiss das CL ja nicht, wann das Programm beendet ist und er versucht das kopieren zu früh.
Gibt es hier eine Lösung?
Gibt es einen Befehl der alle Datei/Ojektsperren aufhebt?
[edit]
Habe gerade im Forum etwas gesucht und werde mal CHKIN testen ...
[/edit]
danke im Voraus ...
-
Also ich habe jetzt ein wenig getest, allerdings ohne erfolg:
ich habe 2 varianten getestet:
1. rufe ich am ende des progammes ein CL auf.
2. Ein CL, dass erst das PGM aufruft und dann den rest abarbeitet.
Bei beiden Varianten bekomme ich dann stets die Meldung, dass die Datei noch im Zugriff wäre ...
Code:
PGM
CALL PGM(YGXLS)
MONMSG MSGID(CPF0000)
CHKIN OBJ('/XLTEST/ZR9T00.XLS')
MONMSG MSGID(CPF0000)
STRPCO
MONMSG MSGID(CPF0000)
STRPCCMD PCCMD('NET USE L: \\xx.xx.xx.xx\XLTEST PASSWORT +
/USER:USERNAME') PAUSE(*YES)
MONMSG MSGID(CPF0000)
CHKIN OBJ('/XLTEST/ZR9T00.XLS')
MONMSG MSGID(CPF0000)
STRPCCMD PCCMD('L:\ZR9T00.XLS') PAUSE(*YES)
MONMSG MSGID(CPF0000)
ENDPGM
Das YGXLS Programm erstellt mir die ZR9T00.XLS in /XLTEST/
Das Verbinden des Netzwerklaufwerks funktioniert auch wunderbar. Aber die Datei bekomme ich nicht mit dem Befehl angezeigt ...
Warum bringt hier chkin nix? Habe ich hier einen Denkfehler?
Seltsamerweise kann ich die Datei aber über den Explorer im Excel öffnen ...
Kann mir hier jmd. weiterhelfen?
Danke im Voraus ...
-
Hello,
bin gerade nicht in der Materie drin... aber...
der MONMSG CPF000 lässt doch das CLP weiterlaufen, auch wenn der CHKIN ins Leere läuft?
k.
-
Ich denke das dein Problem zu 90% daran liegt, das du den FileOutputStream nicht mit close() zumachst.
Da die JVM in einem anderen Job läuft, hilft auch das CHKIN nicht.
Robert P.
-
das hört sich logisch an, wenn das noch nicht im beispielcode drin ist ... Blos wie binde ich das ganze denn nur ein ...
Ich teste gerade erfolglos einen Prototypen im Code einzubauen und diesen dann aufzurufen:
Code:
*
Dclose PR EXTPROC(*JAVA
D :'java.io.FileOutputStream'
D :'close')
*
...
writeWB(wb:outFile);
outFile.close();
Habe jetzt schon mehrere Versuche gemacht den Prototypen einzubinden ...
Die Methode java.io.FileOutputStream.close wird doch mit keinem Parameter aufgerufen und gibt (void) auch keinen zurück?
Wo liegt hier schon wieder mein Denkfehler?
Danke im Voraus ...
Similar Threads
-
By mk in forum NEWSboard Java
Antworten: 4
Letzter Beitrag: 11-12-06, 08:51
-
By Blaumeise in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 17-11-06, 12:19
-
By Blaumeise in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 24-05-06, 11:31
-
By Stoeberl in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 23-09-05, 08:49
-
By ralfmh in forum Archiv NEWSboard Events
Antworten: 1
Letzter Beitrag: 07-10-04, 11:17
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks