× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Help! 

I had no luck posting this on the RPG400 mailing list, so here goes: 

I've been tinkering (fumbling blindly would be more accurate) around with 
calling Java methods from 
RPG to generate / update Excel spreadsheets (using the classes provided by 
the Jakarta Poi APIs - 
http://jakarta.apache.org/poi/hssf/index.html). I did a search of the news 
group and it seems some 
people have been using this stuff with a greater degree of success than 
me, but couldn't find 
anything that would solve my problem directly.

I've managed to write a couple of proof-of-concept programs (hence the 
shoddy code below) that will 
run in batch and interactive mode to create spreadsheets from scratch and 
write them out to the 
IFS (which are then emailed out to users). 
Creating xls from scratch seems to work just fine. 
I'm having a problem when I try to open up an existing spreadsheet for 
updating inside a batch job 
( I only need to change the contents of particular cells & re-save the 
file).

I can call my program interactively with no problems at all and get an 
updated spreadsheet at the end 
of it that is persisted to the IFS, but if I try to run it is a batch job 
with a SBMJOB I get the error 
message:

***** 
Message . . . . :   Java exception received when calling Java method.  
Cause . . . . . :   RPG procedure JAVAXLS8 in program DHWORKLIB/JAVAXLS8  
 received Java exception "java.io.IOException:" when calling method 
"<init>" 
 with signature "(Ljava.io.InputStream;)V" in class  
 "org.apache.poi.poifs.filesystem.POIFSFileSystem". Recovery  . . . :  
 Contact the person responsible for program maintenance to determine the  
 cause of the problem. Technical description . . . . . . . . :   If the  
 exception indicates that the Java class was not found, ensure the class 
for 
 the method is in the class path. If the exception indicates that the Java 
 
 method was not found, check the method name and signature. If the 
signature 
 is not correct, change the RPG prototype for the method, or change the 
Java 
 method, so that the return type and parameter types match. You can 
determine 
 the signatures for all the methods in class XYZ using command QSH 
CMD('javap 
 -s XYZ').  
***** 

Not much help to the uninitiated .... 

Here's some code snippets / prototypes from the program in question: 


0008.00 D jInStream       S               O   CLASS(*JAVA:             
0009.00 D                                     'java.io.InputStream')   
0020.00  * // openHandle = openFile( fileName)                           
0021.00 D openFile        PR              O   EXTPROC(*JAVA:             
0022.00 D                                     'java.io.FileInputStream': 
0023.00 D                                     *CONSTRUCTOR)               
0024.00 D fileName                        O   CLASS(*JAVA:               
0025.00 D                                     'java.lang.String')         



0021.00  * // createPOIFSFileSystemForInput( java.io.InputStrean)      
0022.00  * // Creates a POI FileSystem object from a java input stream,   
0023.00  * // required for reading exising xls files.      
0024.00 D createPOIFSFileSystemForInput...     
0025.00 D                 PR              O   EXTPROC(*JAVA:     
0026.00 D 'org.apache.poi.poifs.filesystem- 
0027.00 D                                     .POIFSFileSystem':     
0028.00 D                                     *CONSTRUCTOR)      
0032.00 D  inputStream                    O   CLASS(*JAVA:     
0033.00 D                                     'java.io.InputStream')     


---> 
Main code begins here: 

0015.00 D Recursive       S               N                           
0016.00 D JNIEnv_P        S               *                           
0017.00 D capacity        S             10I 0 INZ(10000)               
0018.00 D rowPos          S              5  0                         
0019.00 D rowPosSave      S              5  0                         
0020.00 D cellPos         S              5  0                         
0021.00 D IFSFile         S           1024    VARYING                 
0022.00 D                                     INZ('/tmp/tstSales.xls') 
0023.00 D wrkChar         S           1024    VARYING                 
0024.00 D wrkDouble       S                   LIKE( jDouble)           
... 
0032.00 
*--------------------------------------------------------------------* 
0033.00  * Object variables    * 
0034.00 
*--------------------------------------------------------------------* 
0035.00 D wrkString       S                   LIKE( jString)     
0036.00 D trimmedString   S                   LIKE( jString)     
0037.00 D filename        S                   LIKE( jString)     
0038.00 D inFile          S                   LIKE( jInStream)     
0039.00 D outFile         S                   LIKE( jOutStream)      
0040.00 D fs              S                   LIKE( poiFileSystem)     
0041.00 D wb              S                   LIKE( poiWorkbook)     
0042.00 D sheet1          S                   LIKE( poiSheet)      
0043.00 D row             S                   LIKE( poiRow)      
... 
0104.00   Monitor;                                                       
0105.00                                                                 
0106.00    // Set the classpath                                         
0107.00    cmdString = 'ADDENVVAR ENVVAR(CLASSPATH) VALUE(' + x'7D' +   
0108.00                cCLASSPATH + x'7D' + ') REPLACE(*YES)';           
0109.00    RunCmd( %TRIMR( cmdString) );                                 
0110.00                                                                 
0111.00                                                                 
0112.00    // Get pointer to JNI Environment                             
0113.00    JNIEnv_P = getJNIEnv('-Djava.version=1.3;');                 
0114.00    If JNIEnv_P = *NULL;                                         
0115.00       *INLR = *ON;                                               
0118.00      
0119.00    // Create a new local reference frame so we can clear all the   
 
0120.00    // java objects in one go     
0121.00      
0122.00    beginObjGroup( JNIEnv_P: capacity);     
0123.00      
0124.00    // Open the file      
0125.00    wrkString = createString( %trim(IFSFile));      
0126.00    // Trim filename (50A).     
0127.00    filename = trimString( wrkString);      
0128.00    // Create FileInputStream.      
0129.00    inFile = openFile( filename);     
0130.00    fsBytes = fsBytesAvail( inFile);      
0131.00    // Load the file into the POI filesystem      
0132.00    fs = createPOIFSFileSystemForInput( inFile);      


The error here at statement 0132.00. A batch job doesn't seem to have any 
problems coping with 
calling other Java methods, including those within the poi.jar (though I 
haven't tested exhaustively 
to find any others that don't work). I've tried setting the CLASSPATH 
manually and using CPYENVVAR(*YES) when doing the 
SBMJOB, plus I've tried setting the CLASSPATH inline (as I've left the 
code here) and it makes no difference

0133.00    // Close the input stream (no longer needed)      
0134.00    fsClose( inFile);     
0135.00                                                           
0136.00    // Load the workbook                                   
0137.00    wb = openWorkbook( fs);                               
0138.00                                                           
0139.00    // Retrieve the sheet                                 
0140.00    sheet1 = getSheetAt( wb: 0);                           
0141.00    // Retreive the Sales row                             
0142.00    row = getRow( sheet1: 6);                             
0143.00                                                           
0144.00    // Change sales for Q1 + 500                           
0145.00    cell = getCell( row: 1);                               
0146.00    wrkDouble = getNumericCellValue( cell) + %Float( 500); 
0147.00    setCellValue_double( cell: wrkDouble); 
..... 
0166.00                                       
0167.00    // Output workbook to file         
0168.00    outFile = createFile( filename);   
0169.00    writeWorkbook( wb: outFile);       
0170.00                                       
0171.00    // Exit on error                   
0172.00   On-Error;                           
0173.00     Exsr *PSSR;                       
0174.00     Return;                           
0175.00   EndMon;                             
... 
0179.00    Exsr Cleanup;     
0180.00    Return;           
0181.00                     
0182.00  /End-Free           


0186.00    // *********************************************************** 
0187.00    Begsr *PSSR;                                                   
0188.00    // *********************************************************** 
0189.00       If Not Recursive;                                           
0190.00          Recursive = *ON;                                         
0191.00          Dump;                                                     
0192.00          Exsr CleanUp;                                             
0193.00       EndIf;                                                       
0194.00                                                                   
0195.00       Return;                                                     
0196.00                                                                   
0197.00    Endsr;                                                         
0198.00                                                                   
0199.00    // *********************************************************** 
0200.00    Begsr Cleanup;                                                 
0201.00    // *********************************************************** 
0202.00                                                                   
0203.00       *INLR = *ON;                                                 
0204.00       // Free up all Java objects still in use                     
0205.00       If JNIEnv_P <> *NULL;                                       
0206.00         CallP(e) endObjGroup( JNIEnv_P);                           
0207.00       EndIf;                                                       
0208.00                                                                   
0209.00    Endsr;                                                         
0210.00                                                                   
0211.00  /End-Free                                                         


Is there some issue with using a FileInputStream in a batch job or 
something?? 
Are there any behavioural differences between running Java in batch and 
interactively? 
Or am I just trying to do something that can't be done??
I'm afraid I don't have any Java coding experience at all, just what I've 
picked out from the 
V5R2 RPG manual and cobling bits together written by others & would 
welcome any input at all..
Perhaps I shouldn't be mucking around with this stuff, but you can't blame 
a guy for trying, eh? 
I'm on V5R2 of the O/S and using JDK 1.3 if that helps any ? 

Sorry if this isn't enough info to be going on yet, I just wanted to get 
my 
problem "out there" as it's giving me a real headache. 

Many thanks, 

David 

COMPUTACENTER (UK) LTD

The contents of this e-mail are intended for the named addressee only.
It contains information which may be confidential and which may also be 
privileged. 
Unless you are the named addressee (or authorised to receive
for the addressee) you may not copy or use it, or disclose it to anyone
else. If you received it in error please notify us immediately and then
destroy it. 

Computacenter information is available from http://www.computacenter.com

This footnote also confirms that this email message has been swept for the 
presence of computer viruses.

***************************************************************************************************************************


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.