[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    18

    *.CL Routine von Applet aus aufrufen

    hallo!
    ich habe vor mittels eines java-applets
    eine *.cl routine auf einer as400 aufzurufen

    was bringt mir hierbei das java native interface,
    ist das notwendig??
    welche befehle gibt es um einen derartigen aufruf zu machen?

    danke schon mal im voraus,

    mfg burton007

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.329
    Am besten nutzt du einfach SQL, da auf der AS/400 jedes Programm per "CALL MYLIB.MYPGM [ (P1, P2, ...) ]" aus SQL aufrufbar ist.
    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
    Sep 2002
    Beiträge
    47
    Hi!

    Geht alles mit JTOpen. Einfach mal Doku runterladen und lesen.
    Gibt spez. Klassen womit man PGMs, SRVPGMs, CMDs usw. mit aufrufen kann. Such mal nach "com.ibm.as400.access.ProgramCall".
    Ciao
    Nili

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.298
    Hallo,

    Applets laufen auf dem Client, sprich Browser, innerhalb einer Sandbox, aus der sie keine Verbindung zu einem Rechner aufmachen dürfen, von dem sie nicht selber geladen wurden. Von daher gesehen geht das nicht so ohne weiteres.
    - Der JDBC Weg würde ein komplettes laden des Applets und des Treibers von der AS400 erfordern, das wäre nicht sehr flott. (dazu gab es mal einen Artikel von mir im Midrange Magazin - oder war das Client Server?)
    - mit fast denselben Problemen behaftet wäre REXEC
    - mit Signierung des Applets ginge das auch, das überschreitet allerdings die Möglichkeiten des Forums, das darzustellen.
    - man könnte auch noch die Java Security im Browser abschalten, was man besser lässt.

    - mit JNI hat das alles nix zu tun, das regelt den wechselseitigen Aufruf zwischen Java und C Funtionalitäten innerhalb eines Prozesses.

    mfg

    Dieter Bender

    Zitat Zitat von burton007
    hallo!
    ich habe vor mittels eines java-applets
    eine *.cl routine auf einer as400 aufzurufen

    was bringt mir hierbei das java native interface,
    ist das notwendig??
    welche befehle gibt es um einen derartigen aufruf zu machen?

    danke schon mal im voraus,

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

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    18
    weißt du wie die genaue syntax der parameterübergabe lautet??
    wie gebe ich eine genaue anzahl von leerstellen an?
    vielen dank

    >
    Zitat Zitat von Fuerchau
    Am besten nutzt du einfach SQL, da auf der AS/400 jedes Programm >per "CALL MYLIB.MYPGM [ (P1, P2, ...) ]" aus SQL aufrufbar ist.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.329
    Zeichenketten werden in einfachen Hochkommata übergeben, Ziffern im GENAUEN Format, das vom Programm erwartet wird:

    ('xxxxxxxxxx' 00000123.12)

    das Entspricht für CL *CHAR(10) sowie *DEC(10, 2)

    Damit übergibst du auch die Anzahl Lehrstellen korrekt.
    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

  7. #7
    Registriert seit
    Sep 2002
    Beiträge
    47
    weißt du wie die genaue syntax der parameterübergabe lautet??
    wie gebe ich eine genaue anzahl von leerstellen an?
    vielen dank

    >[/QUOTE]

    Hi!

    Simples Beispiel:

    // Programm definieren
    ProgramCall xxxcall = new ProgramCall(myi5);

    QSYSObjectPathName pgmName = new QSYSObjectPathName("%LIBL%", "XXXPGM", "PGM");

    // ParameterListe definieren Beispiel 7 Stück
    ProgramParameter parmlist = new ProgramParameter[7];

    // Parameter 1 füllen
    parmlist[0] = new ProgramParameter( new AS400Text(10).toBytes("Hallo") );

    // Parameter 2 füllen
    parmlist[1] = new ProgramParameter( new AS400Text(10).toBytes("Du") );

    // Parameter 3
    parmlist[2] = new ProgramParameter( new AS400Text(17).toBytes("xxxxxxx"));

    // Parameter 4 Returnparm
    parmlist[3] = new ProgramParameter( 10);

    // Parameter 5 Returnparm
    parmlist[4] = new ProgramParameter( 10);

    // Parameter 6 Returnparm
    parmlist[5] = new ProgramParameter( 10);

    //Parameter 7 Returnparm
    parmlist[6] = new ProgramParameter( 1024);

    // CALL absetzen
    try{
    xxxcall.setProgram(pgmName.getPath(), parmlist);
    xxxcall.run();


    // Return Parm auswerten ....
    // Empfangsparameter 4 entpacken
    byte data = parmlist[3].getOutputData();

    AS400Text key = new AS400Text(10);

    // Empfangsparameter 5 entpacken
    data = parmlist[4].getOutputData();

    .............

    } catch (Exception e) {
    }

    Ciao
    Nili

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    18
    vielen dank für die rasche antwort.
    leider funkt. noch nicht, parameter passen,aber beim aufruf

    QSYSObjectPathName path = new QSYSObjectPathName("SAPPGM","DRPBXC","PGM");
    ProgramCall pgm = new ProgramCall(as400,path.getPath(),parmList);
    System.out.println("test______1");
    try
    {
    //pgm.run(); // PROBLEM BEI PROGRAMMAUFRUF !!!!!!!
    if( pgm.run()== false )
    {
    System.out.println("test______2");
    .......

    test______1 wird noch ausgegeben zu test______2 kommt er nicht mehr!!



    mfg burton007

  9. #9
    Registriert seit
    Sep 2005
    Beiträge
    18
    AS400 as400 = new AS400("AS400", "HZI", "HZI"); //declare a new instance of as400

    try
    {

    ProgramParameter parmList = new ProgramParameter[6];

    parmList[0] = new ProgramParameter(new AS400Text(1).toBytes("x"));
    parmList[1] = new ProgramParameter(new AS400Text(6).toBytes("xxxxxx"));
    parmList[2] = new ProgramParameter(new AS400Text(5).toBytes("xxxxx"));
    parmList[3] = new ProgramParameter(new AS400Text(10).toBytes("05483"));
    parmList[4] = new ProgramParameter(new AS400Text(1).toBytes("y"));
    parmList[5] = new ProgramParameter(new AS400Text(45).toBytes(
    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "));

    QSYSObjectPathName path = new QSYSObjectPathName("SAPPGM","DRPBXC","PGM");

    ProgramCall pgm = new ProgramCall(as400,path.getPath(),parmList);
    System.out.println("test______1");
    try
    {
    // PROBLEM BEI PROGRAMMAUFRUF !!!!!!!

    pgm.run();
    System.out.println("test______2");
    AS400Message messageList = pgm.getMessageList();
    ......

    bin schon ziemlich ratlos, hab keine ahnung warum bei der zeile pgm.run()
    ein totaler programmabsturz stattfindet!

    mfg burton007

  10. #10
    Registriert seit
    Sep 2002
    Beiträge
    47
    Hi!

    Zitat Zitat von burton007
    AS400 as400 = new AS400("AS400", "HZI", "HZI"); //declare a new instance of as400

    ....

    // PROBLEM BEI PROGRAMMAUFRUF !!!!!!!

    pgm.run();
    System.out.println("test______2");
    AS400Message messageList = pgm.getMessageList();
    ......

    mfg burton007
    Bekommst Du in messageList was zurück?
    Wie sieht der Programmabbruch aus, Log wäre gut!
    Schon mal auf i5 nachgeschaut, ob JobLog Hinweise gibt.
    Meist ist es ein Bibliotheken Problem, das PGM A PGM B benötigt und nicht findet.
    Den Job auf der i5 kann man identifizieren mit .getServerJob().
    Ciao
    Nili

  11. #11
    Registriert seit
    Sep 2005
    Beiträge
    18
    Zitat Zitat von Nili
    Hi!



    Bekommst Du in messageList was zurück?
    Wie sieht der Programmabbruch aus, Log wäre gut!
    Schon mal auf i5 nachgeschaut, ob JobLog Hinweise gibt.
    Meist ist es ein Bibliotheken Problem, das PGM A PGM B benötigt und nicht findet.
    Den Job auf der i5 kann man identifizieren mit .getServerJob().
    hi!
    bekomme bei der massageList nichts zurück, weil (glaub ich) das programm schon
    vorher abstürzt, sonst würde ja System.out.println("test______2");
    schon eine ausgabe erzeugen.
    das nächste blöde ist, dass durch den abbruch auch kein log/hinweis im eclipse
    erscheint.
    du meinst, dass das PPGM A auf der i5 auch ein PGM B benötigen könnte??

    vielen dank für alles tips,

    mfg burton007

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

    Wink

    Hi!

    tu mir mal nen Gefallen und führ den Code bei Dir aus.
    Danach poste mal die Ausgabe von der Console.

    Code:
    import com.ibm.as400.access.AS400;
    import com.ibm.as400.access.AS400Message;
    import com.ibm.as400.access.AS400Text;
    import com.ibm.as400.access.ProgramCall;
    import com.ibm.as400.access.ProgramParameter;
    import com.ibm.as400.access.QSYSObjectPathName;
    
    /**
     * @author Nili
     */
    public class TestPGM {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		
    		// Hier Deine i5 und Anmeldung rein
    		AS400 as400 = new AS400("i5", "XX", "XX");
    
    		ProgramParameter[] parmList = new ProgramParameter[6];
    
    		parmList[0] = new ProgramParameter(new AS400Text(1).toBytes("x"));
    		parmList[1] = new ProgramParameter(new AS400Text(6).toBytes("xxxxxx"));
    		parmList[2] = new ProgramParameter(new AS400Text(5).toBytes("xxxxx"));
    		parmList[3] = new ProgramParameter(new AS400Text(10).toBytes("05483"));
    		parmList[4] = new ProgramParameter(new AS400Text(1).toBytes("y"));
    		parmList[5] = new ProgramParameter(new AS400Text(45).toBytes(
    							"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
    
    		QSYSObjectPathName path = new QSYSObjectPathName("SAPPGM","DRPBXC","PGM");
    
    		ProgramCall pgm = new ProgramCall(as400,path.getPath(),parmList);
    		System.out.println("test______1");
    
    		try {
    			pgm.run();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		System.out.println("test______2");
    		
    		AS400Message[] messageList = pgm.getMessageList(); 
    		for(int i=0; i<messageList.length; i++) {
    			System.out.println(messageList[i].getText());
    		}
    		
    	}
    }
    Ciao
    Nili

Similar Threads

  1. RPG aus Java aufrufen
    By Vicky-B in forum NEWSboard Java
    Antworten: 17
    Letzter Beitrag: 06-05-08, 11:05
  2. ILE RPG aus Stored Procdure aufrufen
    By pfpk0997 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 15-11-06, 09:40
  3. free AS400 Telnet Applet
    By cc in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 08-08-06, 23:11
  4. URL aufrufen
    By sarge in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 06-12-04, 08:40
  5. RPG-Procedur aus CL aufrufen
    By Peter Kosel in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-07-04, 08:17

Berechtigungen

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