[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    833

    Rückgabewert vom RPG Programm

    Hallo zusammen,

    vielleicht kann mir jemand auf die Sprünge helfen.
    Das RPG Programm A_TESTR hat 3 Entry Parameter.
    Parameter1 +2 sind Input Parameter und Parameter 3
    ist der Outputparameter.

    RPG A_TESTR

    h

    c *entry Plist
    c Parm in_text1 10
    c Parm in_text2 10
    c Parm Out_text3 20

    c eval Out_Text3 = In_text1 +
    c In_Text2


    c seton lr




    Das Javaprogramm solle jetzt die Werte erhalten.
    Leider bekomme ich immer die Fehlermeldung

    Program /QSYS.LIB/MK.LIB/A_TESTR.PGM did not run!java.lang.NullPointerException: serverValue


    da die Werte in parameterList auf null stehen.



    Hat jemand eine Idee woran das liegen kann ?


    Gruss
    Michael


    ProgramCall program = new ProgramCall(system);
    try
    {
    // Initialize the name of the program to run.
    String programName = "/QSYS.LIB/MK.LIB/A_TESTR.PGM";
    // Set up the 3 parameters.
    ProgramParameter parameterList = new ProgramParameter[3];


    // First parameter is to input a name.
    AS400Text In_parm1 = new AS400Text(10,system);
    parameterList[0] = new ProgramParameter(In_parm1.toBytes("Ich bin"));

    // Second parmeter is to get the answer, up to 50 bytes long.
    AS400Text In_parm2 = new AS400Text(10,system );
    parameterList[1] = new ProgramParameter(In_parm2.toBytes(" föl"));

    // Third parmeter is to input a quantity and return a value up to 30 bytes long.
    AS400Text Out_text3 = new AS400Text(20,system);
    parameterList[2] = new ProgramParameter(Out_text3.toBytes(""));

    // Set the program name and parameter list.
    program.setProgram(programName, parameterList);

    // Run the program.
    if (program.run() != true)
    { System.out.println("Program failed!");
    AS400Message messagelist = program.getMessageList();
    for (int i = 0; i < messagelist.length; ++i)
    {System.out.println(messagelist[i]); }
    }else{
    AS400Text text = new AS400Text(50,system);
    System.out.println(text.toObject(parameterList[0].getOutputData()));
    System.out.println(text.toObject(parameterList[1].getOutputData()));
    System.out.println(text.toObject(parameterList[2].getOutputData()));
    }
    }
    catch (Exception e)
    { System.out.println("Program " + program.getProgram() + " did not run!" + e ); }

    system.disconnectAllServices();

    }
    }

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun, sowit ich mich erinnere erstellt

    new ProgramParameter[3];

    4 Parameter !
    Nähmlich von 0 - 3.
    Da Paramter 3, also der 4. nicht besetzt ist, willst du einen NULL-Pointer übergeben. Dein Programm will aber nur 3 Parameter (DSPPMG).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hallo Baldur,

    bei ProgramParameter parameterList = new ProgramParameter[3];

    werden auch nur 3 Elemente angelegt.

    Angesprechen kann man dann die Elemente
    mit 0,1,2.

    Also das kann es nicht sein

    Gruss
    Michael

  4. #4
    Registriert seit
    Aug 2004
    Beiträge
    923
    Hello,

    evtl. case-sensitive?

    k.

  5. #5
    Registriert seit
    Sep 2002
    Beiträge
    47

    Moin!

    Parameter sind falsch. Bei Return darfst Du keine Parameter mitgeben. NullPointer kommt durch Parm Abfrage auf getOutputData() die nicht vorhanden sind bei Parm 1+2.

    Bitte nächstes mal funktionierendes Code-Beispiel einfügen!

    Code:
    public class Test2 {
    
    	public static void main(String[] args) {
    
    		AS400 system = new AS400("xx.x.x.x", "xx", "xx");
    
    		ProgramCall program = new ProgramCall(system);
    		try {
    
    			String programName = "/QSYS.LIB/xxxx.LIB/TEST.PGM";
    
    			ProgramParameter[] parameterList = new ProgramParameter[3];
    
    			AS400Text In_parm1 = new AS400Text(10, system);
    			parameterList[0] = new ProgramParameter(In_parm1.toBytes("Ich bin"));
    
    			AS400Text In_parm2 = new AS400Text(10, system);
    			parameterList[1] = new ProgramParameter(In_parm2.toBytes(" gut!"));
    
    			// Keine Par, mitgeben!!!
    			parameterList[2] = new ProgramParameter(20);
    
    			program.setProgram(programName, parameterList);
    
    			// Run the program.
    			if (!program.run()) {
    				
    				System.out.println("Program failed!");
    				AS400Message[] messagelist = program.getMessageList();
    				for (int i = 0; i < messagelist.length; ++i) {
    					System.out.println(messagelist[i]);
    				}
    
    			} else {
    				AS400Text text = new AS400Text(20, system);
    				System.out.println(text.toObject(parameterList[2].getOutputData()));
    			}
    
    		} catch (Exception e) {
    			System.out.println("Program " + program.getProgram()+ " did not run!" + e);
    
    		} finally {
    			system.disconnectAllServices();
    		}
    
    	}
    }
    Ciao
    Nili

  6. #6
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hallo Nili,

    das gibts doch garnicht. Auf sowas wäre ich nie gekommen.

    Es funktioniert. Vielen Dank

    Gruss
    Michael

  7. #7
    Registriert seit
    Feb 2011
    Beiträge
    25
    Hallo zusammen,

    ich bin über die Forensuche auf dieses Thema aufmerksam geworden, da ich im Moment an einem ähnlichen Problem knoble.

    Ich rufe ebenfals ein Programm auf, mit 3 Übergabe Parametern, 2 davon als Input und einer davon als Outpu (Call by Reference)

    Wenn ich allerdings auf den output Parameter zugreifen will, bekomme ich immer nur einen Leerstring (im debugger wird mir in dem array(in jedem einzelnen Feld) immer die Zahl 64 angezeigt).

    Wenn ich das RPG Programm mit den gleichen Parametern "so" aufrufe bekomme ich die richtige Zeichenfolge (1111...) zurück.

    Hier mal mein Quelltext, der allerdings fast gleich zu dem oben ist:

    Code:
    public class Test2 {
          public static void main(String[] args) {
              AS400 system = new AS400("xx.x.x.x");
              ProgramCall program = new ProgramCall(system);
             try {
                  String programName = "/QSYS.LIB/xxxx.LIB/TEST.PGM";
                  ProgramParameter[] parameterList = new ProgramParameter[3];
                  AS400Text In_parm1 = new AS400Text(10);
                 parameterList[0] = new ProgramParameter(In_parm1.toBytes("Ich bin"));
                  AS400Text In_parm2 = new AS400Text(10);
                 parameterList[1] = new ProgramParameter(In_parm2.toBytes(" gut!"));
                  // Keine Par, mitgeben!!!
                 parameterList[2] = new ProgramParameter(ProgramParameter.PASS_BY_REFERENCE,20);
                  program.setProgram(programName, parameterList);
                  // Run the program.
                 if (!program.run()) {
                     System.out.println("Program failed!");
                     AS400Message[] messagelist = program.getMessageList();
                     for (int i = 0; i < messagelist.length; ++i) { 
                        System.out.println(messagelist[i]);
                     }
                 } else {
                     AS400Text text = new AS400Text(20);
                     System.out.println(text.toObject(parameterList[2].getOutputData()));
                 }
              } catch (Exception e) {
                 System.out.println("Program " + program.getProgram()+ " did not run!" + e);
              } finally {
                 system.disconnectAllServices();
             }
          }
     }
    Kann mir jemand Helfen, bzw einen Tipp geben an was es liegen kann ?

    Danke für eure Hilfe.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... Programm über SQL als stored Procedure aufrufen ist stabiler und einfacher als dieser Spielzeugkram der Dollschachtel

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2011
    Beiträge
    25
    Mh ja wir sind atm auch am überlegen uns eine art Wrapper um unser RPG programm zu bauen was die funktionalität des Java-Programms abbildet.

    Was mir aufgefallen ist, das in dem Beispiel hier von einem Remote Rechner auf die AS400 zugegriffen wird, mein Programm allerdings direkt auf der AS400 läuft.

    Ich werde demnächst nochmal Probieren ob ich durch die Trace funktion genauere Ergebnisse bekomme.

    Ansonsten wenn jemand eine idee hat, ich bin über jeden Tipp glücklich

Similar Threads

  1. MI Source aus einem RPG Programm erstellen
    By ExAzubi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 13-07-06, 10:51
  2. Programm schreiben in RPG
    By santoshs in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 05-04-05, 07:06
  3. Java Programm aus ILE RPG aufrufen
    By PGMR in forum NEWSboard Java
    Antworten: 10
    Letzter Beitrag: 10-02-05, 10:33
  4. Java Programm aus ILE RPG aufrufen
    By PGMR in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 02-02-05, 13:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •