예제 IMS 프로그램 코드
EGL 프로그램의 해당 발췌는IMS™ 터미널, 메시지 큐, 연속 파일과의 상호작용을 표시합니다.
메시지 큐와 연관된 연속 파일에 대한 출력 예제
- 양식을 사용하여 터미널에서 입력을 요청합니다.
- 응답을 읽습니다.
- 사용자 입력 기반의 정보로 연속 레코드를 업데이트합니다.
- 나중의 일괄처리 처리를 위해 다른 트랜잭션으로 직렬 레코드를 출력합니다.
- IMS 트랜잭션 코드 MYTRXCD1은 MYTRXCD1으로 이름 지정된 PSB와 연관됩니다.
- IMS 트랜잭션 코드는 NEXTTRX MYTRXCD2로 이름 지정된 PSB와 연관됩니다.
// PSB 정의
Record addToQueue type PSBRecord { defaultPSBName="MYTRXCD1" }
// IMS에서 CBLTDLI에 필요한 세 개의 PCB
iopcb IO_PCBRecord { @PCB { pcbType = TP } };
elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
// 기타 데이터베이스 PCB
...
end
Record myTransactionPart type serialRecord
{ fileName="MYMSGQUE" }
...
end
program addtrans type textUIProgram
{ alias = "MYTRXCD1", // IMS는 pgm이 PSB 이름과 일치하도록 요구함
segmented = yes,
@DLI { psb = "mypsb" }}
use MYFORMS; // MYFORMS는 FORM1이 포함된 formGroup임
// 변수 선언
myTransaction myTransactionPart; // 메시지 큐의 연속 레코드
mypsb addToQueue; // psb
function main()
...
converse FORM1;
// 처리가 필요한 모든 사항 수행
move FORM1 to myTransaction byName;
add myTransaction;
...
endend
<ResourceAssociations name="IMS_RESOURCE_ASSOCIATION">
<association fileName="MYMSGQUE">
<imsvs>
<smsgq systemName="NEXTTRX" pcbName="elaalt"/>
</imsvs>
</association>
<association fileName="MYINQUE">
<imsvs>
<smsgq systemName="NEXTTRX" pcbName="iopcb"/>
</imsvs>
</association>
</ResourceAssociations>
addtrans는 textUI 프로그램이므로 EGL은 IMS 환경에 대한 인터페이스에 제어 로직을 생성합니다. IMS 프로그램은 큐가 빌 때까지 입력 메시지 큐를 읽습니다. 따라서 EGL은 프로그램이 현재 사용자에 응답하거나(converse 또는 show 문 사용) 응답 책임을 전송한 후(transfer to transaction 문 사용) 프로그램이 루프를 실행하여 큐에서 다음 입력 메시지를 읽도록 프로그램에 로직을 생성합니다. 개요는 IMS에서 터미널과 상호작용의 내용을 참조하십시오. 자세한 정보는 이 주제의 "다중 사용자 및 메시지 큐"를 참조하십시오.
IMS 일괄 처리의 예제
또한 프로그램 addtrans가 메시지 큐에 쓰는 메시지를 처리하는 프로그램을 작성할 수 있습니다. 이 프로그램은 연속 파일에서 레코드를 가져오고 연속 파일과 I/O PCB를 연관시키는 기본 프로그램이어야 합니다.
// PSB 정의
Record getFromQueue type PSBRecord { defaultPSBName="MYTRXCD2" }
// IMS에서 CBLTDLI에 필요한 세 개의 PCB
iopcb IO_PCBRecord { @PCB { pcbType = TP } }
elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
// 기타 데이터베이스 PCB
end
program gettrans type basicProgram
{ alias = "MYTRXCD2"
@DLI { psb = "mypsb" }}
// 변수 선언
myTransaction myTransactionPart // 메시지 큐의 연속 레코드
{fileName="MYINQUE"};
mypsb getFromQueue; // psb
function main()
while (myTransaction not endOfFile)
get next myTransaction;
// 처리가 필요한 모든 사항 수행
end endend
IMS/VS 또는 IMS BMP 환경에 대한 프로그램을 생성하는 경우 연속 파일을 메시지 큐와 연관시키는 자원 연관 파트 및 사용할 PCB의 이름을 지정해야 합니다. 이 경우 이전 섹션의 ResourceAssociations 파트에서 표시된 대로 입력에 I/O PCB가 사용됩니다. systemName 특성은 선택사항입니다. 프로그램은 IMS 시스템 정의를 기반으로 프로그램을 시작한 트랜잭션과 연관된 메시지 큐를 읽습니다. EGL은 입력 메시지의 IMS 트랜잭션 ID를 기반으로 sysVar.transactionID를 설정합니다.
다중 사용자 및 메시지 큐
- IMS는 트랜잭션 코드 MYTRXCD1과 연관된 PSB를 스케줄합니다. 해당 PSB에 MYTRXCD1이라는 이름이 지정됩니다(필수적인 것은 아닙니다). 그러나 PSB와 연관된 프로그램은 IMS의 PSB와 동일한 이름이어야 합니다. 그러므로 IMS는 프로그램 MYTRXCD1(EGL에 addtrans로 알려짐)을 로드합니다.
- 프로그램 MYTRXCD1의 EGL 생성 제어 로직은 프로그램이 최초로 USER1에 대해 호출되었음을 판별하여 맨 위에서 처리를 시작합니다.
- 결과적으로 프로그램이 converse 문에
도달하고 다음 조치를 수행합니다.
- 프로그램이 사용하는 모든 레코드 및 양식에 대한 데이터를 저장합니다.
- 프로그램에서 converse 문이 발생한 위치에 관한 정보를 저장합니다.
- 지정된 양식으로 ISRT 명령을 수행합니다.
- EGL이 추가한 로직에 따라 프로그램은 처음으로 루프백하여 메시지 큐에서 대기하는 USER2를 찾습니다. 프로그램은 USER2에 USER1의 경우와 같은 단계를 수행하여 converse 문에 도달하고 양식을 전송한 후 루프백하여 메시지 큐를 다시 확인합니다.
- 여기에서 프로그램이 converse 문에 대한 USER1의 응답을 찾을 수 있습니다.
EGL 생성 제어 로직은 이 응답이 USER1 처리의
연속임을 판별하고 다음을 수행합니다.
- USER1의 데이터를 복원합니다(converse 문의 위치 포함).
- 여러 시스템 변수를 새로 고칩니다.
- FORM1이 요청한 유효성 검증 확인을 실행합니다.
- 입력 오류가 없다는 가정 하에 converse 문 다음에 오는 명령문에서 처리를 재개합니다.
- 결과적으로 프로그램은 다른 converse 문에 도달하고 모든 데이터를 저장한 후 USER1에 응답을 전송합니다. 그런 다음 프로그램이 루프백하여 메시지 큐를 다시 확인합니다.
- USER2가 점심 식사를 하러 가고 트랜잭션 코드 MYTRXCD1과 연관된 메시지 큐에 아무것도 없다고 가정합니다. 프로그램 MYTRXCD1이 종료됩니다.
- 이후, USER1이 가장 최근의 콘솔 메시지에 응답하게 되면 IMS는 다시 트랜잭션 코드 MYTRXCD1과 연관된 큐에 메시지를 갖게되고 프로그램 MYTRXCD1을 다시 시작합니다. EGL 생성 제어 로직은 이 응답이 USER1 처리의 연속임을 판별하고 모든 데이터를 복원한 후 처리를 계속합니다.