-
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(1, 0);
AS400PackedDecimal Converter2 = new AS400PackedDecimal(3, 0);
AS400PackedDecimal Converter3 = new AS400PackedDecimal(8, 0);
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
-
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
-
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.
-
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
-
Hallo,
von dem Spielzeugkram Toolbox (ausßer JDBC) und PCML würde ich die Finger lassen, das kann nicht viel und funktioniert oft nicht.
Aus Java Sicht gibt es dafür das JNI (Java native Interface), da wird eine Methode in Java als native deklariert und dann ein dazu passende ILE Procedure aufgerufen; mit C ist das durchaus gängig (so ist die JVM größtenteils implementiert) - mit RPG würde ich das nicht machen, da die RPG Runtime nicht Threadsafe ist (ja ich weiß, THREAD *serialize...)
bleibt der SQL Weg über die Deklaration der RPG Procedure als SQL Function und Aufruf über SQL, der technisch der von mir empfohlene ist.
Aus Design Sicht rate ich dringend dazu wilden Mix zwischen RPG und Java zu vermeiden und das auf klar abgegrenzte Schnittstellen (und vorhandene Komponenten zu beschränken.
mfg
Dieter Bender
Zitat von Vicky-B
Hallo zusammen,
gibt es eine Möglichkeit aus Java ServiceProgramme bzw. Module aufzurufen??
Danke
LG
Vicky
-
Bitte um Hilfe
Hallo zusammen:
Ich habe diesen Artikel hier genau verfolgt und versuchte nun, eine RPG Procedure von einem Java Pgm aufzurufen , habe aber große Probleme mit der Parameterübergabe:
Ich schicke 4 numerische Parameter mit Werten in das Serviceprogramm und möchte dafür eine Objektbezeichnung alphanumerisch 28 Stellen zurückbekommen.
1. Procedure
getObjektBez B Export
getObjektBez PI
p#firma 2 0 value
p#obj 7 0 value
p#objA 1 0 value
p#objG 1 0 value
p#obbzg 28
ListObstdp Chain(N) OBSTDP
If not %found(Obstdp)
eval p#obbzg = *blanks
Else
eval p#obbzg = %trim(Obbzg)
Endif
getObjektBez E
2. Java Aufruf
public String sucheObjektAdresse() ...
AS400PackedDecimal converter1 = new AS400PackedDecimal(2, 0);
AS400PackedDecimal converter2 = new AS400PackedDecimal(7, 0);
AS400PackedDecimal converter3 = new AS400PackedDecimal(1, 0);
AS400PackedDecimal converter4 = new AS400PackedDecimal(1, 0);
AS400Text obBzg = new AS400Text(28);
ProgramParameter parameterList=new ProgramParameter[5];
parameterList[0]=new ProgramParameter(converter1.toBytes((Integer.parse Int(oFirma.getText()))));
parameterList[1]=new ProgramParameter(converter2.toBytes(Integer.parseI nt(oObjekt.getText())));
parameterList[2]=new ProgramParameter(converter3.toBytes(Integer.parseI nt(oObjektArt.getText())));
parameterList[3]=new ProgramParameter(converter4.toBytes(Integer.parseI nt(oObjektGeshh.getText())));
auch so habe ich es probiert:
parameterList[0]=new ProgramParameter(converter1.toBytes(01)); parameterList[1]=new ProgramParameter(converter2.toBytes(0002215));
usw.
System.out.println(parameterList.toString());
das steht: [Lcom.ibm.as400.access.ProgramParameter;@842e74
und auch im Debug werden keine Werte in den Feldern angezeigt (parameterList)
AS400 system=new AS400("xxx");
system.setUserId("xxx");
system.setPassword("xxx");
ServiceProgramCall sPGMCall=new ServiceProgramCall(system, "/QSYS.LIB/STAMOBJ.LIB/S_TESTDP.SRVPGM", parameterList);
sPGMCall.setProcedureName("GETOBJEKTBEZ");
if (sPGMCall.run() != true){
AS400Message messageList = sPGMCall.getMessageList();
for (int i = 0; i < messageList.length; ++i){
System.out.println(messageList[i].getText());
}
}
Es kommt die Fehlermeldung: locals variables are unavailable
1. Frage: Was mache ich da falsch ?
2. Frage: Was muss ich angeben im Java Code, dass mir der 5. Parameter richtig mitgeschickt (obBzg) wird bzw. wie lese ich den zurückgeschickten Parameter wieder aus ?
Vielen Dank für die HIlfe
mfg
boonkelz
Similar Threads
-
By pfpk0997 in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 15-11-06, 09:40
-
By Badener in forum NEWSboard Java
Antworten: 5
Letzter Beitrag: 13-07-06, 17:09
-
By codierknecht in forum NEWSboard Java
Antworten: 7
Letzter Beitrag: 23-03-05, 08:31
-
By PGMR in forum NEWSboard Java
Antworten: 10
Letzter Beitrag: 10-02-05, 10:33
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks