com.ibm.as400.data.ProgramCallDocument
클래스를 사용하여 Java를 통해 iSeries의 RPG 프로그램과 인터페이스합니다. 우리의 WebSphere 응용 프로그램의 경우 대부분의 경우 RPG/Synon 프로그램에 CL을 사용하고 PCML을 사용하여 인터페이스했습니다. 우리는 또한 일반적으로 구조체를 input 출력으로 사용하지 않았습니다.jt400.jar을 사용하여 RPG 프로그램에서 구조의 배열 검색 API의
이번에 RPG 개발자 중 한 명이 RPG IV (Synon 제외)에서 프로그램을 작성하고이 프로그램과 인터페이스 할 수있는 PCML을 제공했습니다. 우리는 정규 문자열로 3 개의 inputoutput parms를 가지고있다. 별로 중요하지 않습니다. 우리는 전에 그것을했습니다. 이제 네 번째 parm은 count 100의 구조체이며 inputoutput입니다.
우리가 RPG 프로그램을 호출하려고 할 때 많은 것은 공백 톤 (즉, 16 진수 40)입니다. String parms가 정상적으로 돌아옵니다. 그러나 구조체는 그렇지 않습니다. 모든 indeces는 공백이다.
RPG 프로그래머가 유효성을 검사했을 때, 그는 자신의 프로그램이 실제로 구조체의 배열을 반환하는지 확인할 수 있습니다. 그는 또한 자신의 프로그램이 실제로 가치를 반환하고 있는지 확인하기 위해 신속하고 더러운 CL을 썼다. 그는 CL이 그것을 증명했다고 말했다.
그래서 지금 나는 엉망입니다. 나는 심지어 가치를 전달하고 그 차이가 있는지 확인하는 방법을 찾으려고 노력했습니다. 그러나 내가 무엇을 불행하게 할지라도 (필자가 parms리스트와 일치하지 않기 때문에), 나는 공백만을 돌려 준다. 갈 방향에 대한 아이디어가 있습니까? 우리가 newPcml.callProgram('program');
우리의 프로그램을 호출하고 우리가 볼 수있는 것과, 호출이 반환 한 후
//sys is our AS400 object and parameters is a HashMap.
ProgramCallDocument newPcml = new ProgramCallDocument(sys, pcmlfileName);
Iterator parametersKeysI = parameters.keySet().iterator();
StringBuffer loggingStatement = new StringBuffer();
while(parametersKeysI.hasNext()) {
String key = (String)parametersKeysI.next();
if("program.RETURNADDR".equalsIgnoreCase(key)) {
AS400Structure [] structure = (AS400Structure[]) parameters.get(key);
int [] indeces = new int[1];
indeces[0] = 0;
for(int i = 0; i < structure.length; i++) {
indeces[0] = i;
Object paramValue = structure[i];
loggingStatement.append(paramValue).append(", ");
newPcml.setValue(key, indeces, paramValue);
}
}
else {
Object paramValue = parameters.get(key);
loggingStatement.append(paramValue).append(", ");
//set the value
newPcml.setValue(key, paramValue);
}
}
과 : 여기
는 PCML 파일<pcml version="4.0">
<!-- RPG program: IL010S20 -->
<!-- created: 2010-07-13-11.28.53 -->
<!-- source: CPPGENL/QRPGLESRC(IL010S20) -->
<!-- 2208 -->
<struct name="ADDRINFO">
<data name="PREDIRECTION" type="char" length="2" usage="inherit" />
<data name="STREETNAME" type="char" length="30" usage="inherit" />
<data name="POSTDIRECTION" type="char" length="2" usage="inherit" />
<data name="STREETTYPE" type="char" length="4" usage="inherit" />
<data name="LOWADDRESS" type="char" length="11" usage="inherit" />
<data name="HIGHADDRESS" type="char" length="11" usage="inherit" />
<data name="ODDEVEN" type="char" length="1" usage="inherit" />
<data name="TERRID" type="char" length="2" usage="inherit" />
<data name="TAXCODE" type="char" length="5" usage="inherit" />
<data name="TERRNAME" type="char" length="30" usage="inherit" />
</struct>
<!-- 2226 -->
<program name="program" path="/QSYS.LIB/DEVOBJL.LIB/IL010S20.PGM">
<data name="STATE" type="char" length="2" usage="inputoutput" />
<data name="ZIP" type="char" length="5" usage="inputoutput" />
<data name="STREET" type="char" length="30" usage="inputoutput" />
<data name="RETURNADDR" type="struct" struct="ADDRINFO" count="100" usage="inputoutput" />
</program>
</pcml>
그리고 다음과 같이 ProgramCallDocument를로드하는 것입니다 참된. 그러나 struct를 읽으려고 할 때 아무 것도 없습니다. 심지어는 com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true);
을 사용하여 parms를 보았습니다. 그게 내가 아는 퍼즐입니다. 아무런 문제가없는 것처럼 보이지만 우리가 기대하는 바를 얻지 못하고 있습니다.
도움이나 방향에 대해 감사드립니다. 지금까지 Javadocs와 온라인 예제가 가장 도움이되지 않았습니다.