2010-12-15 3 views
2

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와 온라인 예제가 가장 도움이되지 않았습니다.

답변

2

확인. 이것은 우리가 이것을 일찍 점검하지 않았다고 바보입니다. 그러나 문제는 우리 Strings/chars의 경우입니다. 우리의 iSeries는 입력 할 때 대문자로 된 글자를 꽤 많이 다루지 만, jt400.jar을 사용하고 있기 때문에 자바 어플리케이션의 소문자를 읽고 그 바이트 eqivalents를 iSeries에 보내고 그렇게하지 않았습니다. RPG 프로그램에서 DB 읽기에 일치합니다. 우리의 iSeries 녀석은이 프로그램을 "어퍼"로 변경하여 문제를 해결했습니다. 우리는 iSeries에서 자동으로 "위"로되는 대부분의 작업을 수행 했으므로 이제는 문제가 없다고 가정했습니다. 우리가 틀렸다고 생각해.