PDA

View Full Version : *.CL Routine von Applet aus aufrufen



Seiten : [1] 2

burton007
06-09-05, 14:47
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

Fuerchau
06-09-05, 15:22
Am besten nutzt du einfach SQL, da auf der AS/400 jedes Programm per "CALL MYLIB.MYPGM [ (P1, P2, ...) ]" aus SQL aufrufbar ist.

Nili
07-09-05, 09:25
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".

BenderD
11-09-05, 09:14
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


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

burton007
30-09-05, 09:23
weißt du wie die genaue syntax der parameterübergabe lautet??
wie gebe ich eine genaue anzahl von leerstellen an?
vielen dank

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

Fuerchau
30-09-05, 09:51
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.

Nili
30-09-05, 11:44
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) {
}

burton007
30-09-05, 11:45
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

burton007
30-09-05, 12:12
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

Nili
30-09-05, 12:59
Hi!


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().