[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jun 2004
    Beiträge
    46
    Danke für die Tipps....

    ich habe nun folgenes Problem:

    Code:
     
    ....
    ServiceProgramCall sPGMCall=
    new ServiceProgramCall(system, "QSYS/BASOBJSTD/SPE01S", parameterList);
    
    sPGMCall.setProcedureName("SPE01N02");
    ...
    Wenn ich das Programm ausführe bekomme ich folgende Fehlermeldung:
    Code:
     
    
    com.ibm.as400.access.IllegalPathNameException: QSYS/BASOBJSTD/SPE01S: Object not in QSYS file system.
    
    at com.ibm.as400.access.QSYSObjectPathName.parse(QSYSObjectPathName.java:879)

    Serviceprogramm . . . . . . . . . . . . : SPE01S
    Bibliothek . . . . . . . . . . . . . . : BASOBJSTD
    Eigner . . . . . . . . . . . . . . . . . : BASPGMR
    Serviceprogrammattribut . . . . . . . . : RPGLE
    Detail . . . . . . . . . . . . . . . . . : *BASIC



    Wo liegt mein Problem??

    Danke Euch!

    Vicky

  2. #2
    Registriert seit
    Dec 2002
    Beiträge
    301
    Der Pfadname ist falsch. Versuch den mal.
    QSYS.LIB/BASOBJSTD.LIB/SPE01S.SRVPGM
    Frank Hildebrandt

  3. #3
    Registriert seit
    Jun 2004
    Beiträge
    46
    super danke für den Tip:

    Code:
    /QSYS.LIB/BASOBJSTD.LIB/SPE01S.SRVPGM
    Hab noch ne Frage :-) Beim Ausführen bekomme ich ne fehlermeldung (Dezimalfehler). Gibts ne Möglichkeit dass man etwas mehr an Infos bekommt??

    Code:
    System.out.println(messageList[i].getText());

  4. #4
    Registriert seit
    Dec 2002
    Beiträge
    301
    Dann hast Du die auszutauschenden Parameter nicht richtig konvertiert. Unter dem folgenden Link befindet sich die Rubrik
    "Data conversion and description". Da wird alles erklärt.

    http://publib.boulder.ibm.com/infoce...hh/spgcall.htm
    Frank Hildebrandt

  5. #5
    Registriert seit
    Jun 2004
    Beiträge
    46
    hab was neues!!!

    Code:
    Zeiger für angegebene Position nicht gesetzt.
    Wie komme ich an mehr Infos und etwas detaillierte Fehlermeldung

  6. #6
    Registriert seit
    Dec 2002
    Beiträge
    301
    Noch mehr Infos? Die Meldungen, die Du bis jetzt gepostet hast deuten klar auf Probleme bei der Übergabe der Parameter hin. Ich schlage vor, Du postest den Teil aus Deinem Java Programm, der für den Aufruf des Serviceprogramms zuständig ist, inklusive der Aufbereitung der Parameter und zusätzlich noch die Beschreibung der Prozedurenschnittstelle der Prozedur des Serviceprogramms, welche Du aufrufst. Dann kann man sicher mehr sagen.
    Frank Hildebrandt

  7. #7
    Registriert seit
    Jun 2004
    Beiträge
    46
    In RPG wird das Service-Programm folgendermassen aufgerufen:

    Code:
    SPE01N01(RC:SRDNR:SRNR)
    RC=Rückcode (0 wenn alles OK is, 1 Fehler)
    SRDNR und SRNR sind gepackte Zahlen

    Code:
    AS400Bin4 bin4Converter = new AS400Bin4();
    
            
            ProgramParameter[] parameterList=new ProgramParameter[3];
            parameterList[0]=new ProgramParameter(bin4Converter.toBytes(0));
            parameterList[1]=new ProgramParameter(bin4Converter.toBytes(400));
            parameterList[2]=new ProgramParameter(bin4Converter.toBytes(10002575));
            AS400 system=new AS400("xxx");
            system.setUserId("xxx");
            system.setPassword("xxx");
            ServiceProgramCall sPGMCall=new ServiceProgramCall(system, "/QSYS.LIB/BASOBJSTD.LIB/SPE01S.SRVPGM", parameterList);
            sPGMCall.setProcedureName("SPE01N01");
                
            
                if (sPGMCall.run() != true){
                    AS400Message[] messageList = sPGMCall.getMessageList();
                    for (int i = 0; i < messageList.length; ++i){    
                        System.out.println(messageList[i].getText());
                    }
                }
    Was ich noch nicht ganz verstehe ist folg:
    Code:
    sPGMCall.setReturnValueFormat(ServiceProgramCall.RETURN_INTEGER);
    Es gibt nur Integer und void. Wie ist es wenn ich eine Zeichenkette, einen Datumswert oder eine Dezimalzahl zurückbekomemn soll??

    LG
    Vicky

  8. #8
    Registriert seit
    Dec 2002
    Beiträge
    301
    Ich gehe jetzt mal von folgender Annahme aus. Die Prozedur SPE01N01 hat drei Parameter mit folgenden Formaten. RC, Gepackt mit 1 Stelle und 0 Kommastellen. SRDNR, Gepackt mit 3 Stellen und 0 Kommastellen. SRNR, Gepackt mit 8 Stellen und 0 Kommastellen. Dann musst Du zur Konvertierung die Klasse AS400PackedDecimal und nicht AS400Bin4 verwenden. AS400Bin4 würdest Du brauchen, wenn Du im RPG einen Parameter mit 10I 0 deklarierst. Wenn die Vor- und Nachkommastellen, die ich angenommen habe nicht richtig sind, dann musst Du die Werte in den ersten drei Statements weiter unten anpassen. Tausche die folgenden Statements in Deinem Programm aus.

    PHP-Code:
    AS400PackedDecimal Converter1 = new AS400PackedDecimal(10);
    AS400PackedDecimal Converter2 = new AS400PackedDecimal(30);
    AS400PackedDecimal Converter3 = new AS400PackedDecimal(80);
            
    ProgramParameter[] parameterList=new ProgramParameter[3];
    parameterList[0]=new ProgramParameter(Converter1.toBytes(0));
    parameterList[1]=new ProgramParameter(Converter2.toBytes(400));
    parameterList[2]=new ProgramParameter(Converter3.toBytes(10002575)); 
    Die Methode setReturnValueFormat benötigtst Du zur Beschreibung des Rückgabewertes der Prozedur, der von dieser mit "RETURN" zurückgegeben wird. Der Prototyp zu einer solchen Prozedur sähe in RPG folgendermaßen aus.

    PHP-Code:
    dSndErrMsg        PR            10I 0 
    In diesem Beispiel würde die Prozedur SdnErrMsg einen 10stelligen ganzzahligen numerischen Wert zurückgeben. Nur wenn die Prozedur ein "Integer - In RPG 10I 0" zurückgibt musst Du die Methode setReturnValueFormat mit RETURN_INTEGER aufrufen. Hat die Prozedur keinen Rückgabewert, dann musst Du die Methode setReturnValueFormat mit NO_RETURN_VALUE aufrufen. Hat der Rückgabewert ein anderes Format, dann kannst Du diese Klassen zum Aufruf von Serviceprogrammen nicht nutzen und musst Dich mit PCML beschäftigen. Wenn Du den zurückgegebenen Wert zu RC verarbeiten willst, dann musst einen anderen Konstruktor zur Klasse "ProgramParameter" verwenden. Mit den entsprechenden Methoden in der Klasse läßt sich dann der Wert ermitteln. Aber das steht alles in der
    Dokumentation. Den Link hast Du ja.
    Frank Hildebrandt

  9. #9
    Registriert seit
    Jun 2004
    Beiträge
    46
    Hallo Frank,

    erstmal vielen Dank für die detaillierte Erläuterung!!!

    Da unsere Serviceprogramme nicht nur Integer zurückgeben, habe ich mich in die PCML-Sache eingelesen. Was ich immer noch nicht verstehe ist folgendes:
    Code:
     
     
    
    <program name="name" [ entrypoint="entry-point-name" ] [ path="path-name" ] [ parseorder="name-list" ] > [ returnvalue="{ void | integer }" ]</program>
    Es sieht so aus, als ob mit PCML ebenfalls nur eine Zahl oder void als Ergebnis zurückkommen kann. Ich dachte, mit PCML kann jeder Datentyp als returnvalue angegeben werden Verstehe ich hier etwas falsch???

    LG
    Vicky

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Genau das ist das Problem.
    Ich denke das kommt noch aus der Nicht-Klassen-Welt, als es noch keine Return-Werte ausser Void/Int gab.

    Du musst halt Return-Werte als zusätzliche Parameter by Reference deklarieren.
    Falls die Service-Programme auch von woanders verwendet werden musst du wiederum Wrapper-Funktionen erstellen, die den Return-Wert eben als Parameter erwarten und zurückgeben.
    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

  11. #11
    Registriert seit
    Dec 2002
    Beiträge
    301
    Sorry, da war ich auf dem falschen Dampfer. Auch PCML kann als Rückgabetyp nur Integer verarbeiten. Da bleibt Dir nichts anderes übrig als bei Prozeduren mit anderen Rückgabewerten als Integer ein kleines Programm zu schreiben (z.B. in RPG), welches von Deinem Java Programm aufgerufen wird. Und dieses Programm wiederrum ruft dann das Service-Programm auf. Das Programm zwischen Java-Programm und Service-Programm muss dann halt die Parameter umsetzen.
    Frank Hildebrandt

Similar Threads

  1. ILE RPG aus Stored Procdure aufrufen
    By pfpk0997 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 15-11-06, 09:40
  2. Rpg to java
    By Badener in forum NEWSboard Java
    Antworten: 5
    Letzter Beitrag: 13-07-06, 17:09
  3. Aufruf von Java Methode aus RPG
    By codierknecht in forum NEWSboard Java
    Antworten: 7
    Letzter Beitrag: 23-03-05, 08:31
  4. Java Programm aus ILE RPG aufrufen
    By PGMR in forum NEWSboard Java
    Antworten: 10
    Letzter Beitrag: 10-02-05, 10:33
  5. 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
  •