CICS 환경에서의 제어 전송

CICS® 환경에서의 전송은 다음과 같은 방법을 통해 지원됩니다.
  • transfer to program 문이 CICS XCTL 명령으로 구현됩니다.
  • transfer to transaction 문이 다음 명령 중 하나로 구현됩니다.
    • genReturnImmediate 빌드 디스크립터 옵션이 NO로 설정된 경우 CICS START 명령
    • genReturnImmediate 빌드 디스크립터 옵션이 YES로 설정된 경우 CICS RETURN IMMEDIATE 명령
    genReturnImmediate를 YES로 설정하는 것은 z/OS®용 CICS 시스템에서만 지원됨
  • 연관된 양식 및 returning 절이 있는 show 문이 CICS RETURN TRANSID 명령으로 구현됩니다.

transfer to program

transfer to program 문은 선택적 레코드를 지정할 수 있습니다. transfer to program 문은 동일한 CICS 트랜잭션을 계속합니다. 다음 절에는 transfer to program 문이 CICS 환경에서 작동하는 방식에 대한 더 자세한 설명이 제공되어 있습니다.

transfer to program을 사용한 EGL 프로그램에서 EGL 프로그램으로의 전송

EGL 프로그램은 CICS XCTL 명령을 사용하여 대상 프로그램으로 제어를 즉시 전송합니다. 레코드는 지정된 경우 COMMAREA에서 전달됩니다. 다음 중 한 가지 상황이 발생하면 transfer to program 문에서 CICS SYNCPOINT가 발생합니다.
  • synchOnPgmTransfer 빌드 디스크립터 옵션을 YES로 설정했으며 PSB가 스케줄되어 있습니다.
  • 소스 프로그램의 synchOnPgmTransfer 빌드 디스크립터 옵션을 NO로 설정하였고, 소스 프로그램에서 PSB를 스케줄했으며 두 프로그램에서 PSB 레코드에 대해 서로 다른 기본 PSB 이름이 지정되었습니다.
이러한 경우가 아니면 CICS SYNCPOINT가 발생하지 않습니다. 다음 예제는 프로그램 제어를 전송하기 위해 EGL이 생성하는 명령을 보여줍니다.
EXEC CICS XCTL('progname') COMMAREA(record)
                          LENGTH(length of record)

transfer to program을 사용한 EGL 프로그램에서 비EGL 프로그램으로의 전송

EGL 프로그램은 transfer to program 명령문에 지정된 프로그램 이름에 대해 CICS XCTL을 실행하여 대상 비EGL 프로그램으로 제어를 즉시 전송합니다. 레코드는 지정된 경우 COMMAREA에서 전달됩니다. PSB가 스케줄되어 있으면 transfer to program 문에서 CICS SYNCPOINT가 발생합니다.

EGL 프로그램에서 비EGL 프로그램으로의 transfer to program은 한 EGL 프로그램에서 다른 EGL 프로그램으로의 전송과 같은 방식으로 구현됩니다. transfer to program 문에 isExternal = YES를 지정하거나 생성 시에 사용된 연계 옵션 파트에 있는 transferToProgram 요소에 fromPgm, toPgmlinkType = EXTERNALLYDEFINED를 지정해야 합니다. isExternal 특성 또는 EXTERNALLYDEFINED 링크 유형은 Rational® COBOL Runtime for zSeries에서 할당한 모든 자원이 해제됨을 나타냅니다. 비EGL 프로그램은 COMMAREA에서 데이터를 수신합니다.

CICS XCTL을 사용한 비EGL 프로그램에서 EGL 프로그램으로의 전송

소스 프로그램은 CICS XCTL 명령을 실행하여 대상 EGL 프로그램으로 전송합니다. 레코드가 전달될 수 있으며 이 레코드는 EGL 프로그램의 inputRecord 특성에서 식별하는 레코드를 초기화하는 데 사용됩니다.

소스 프로그램은 기본 프로그램으로 정의되어야 하며 여기서 유일한 필수 매개변수는 대상 프로그램 이름입니다. 이 매개변수는 유효한 EGL 프로그램 이름을 가리켜야 합니다.
EXEC CICS XCTL ('progname') COMMAREA(record)
                           LENGTH (length of record) 

대상 프로그램이 세그먼트된 경우에는 대상 프로그램이 converse 문을 실행하기 전에 CICS TRANSACTION 항목에 있는 대상 프로그램과 연관된 트랜잭션 코드로 sysVar.transactionID를 설정하는지 확인하십시오. 이와 같이 설정하지 않는 경우에는 터미널로부터 입력이 수신되면 sysVar.transactionID의 기본값(현재 트랜잭션 코드)으로 인해 대상 EGL 프로그램 대신 비EGL 프로그램이 다시 시작됩니다.

다음 작업 중 하나를 수행하면 sysVar.transactionID를 적절한 트랜잭션 코드로 설정할 수 있습니다.
  • 트랜잭션 코드를 restartTransactionID 빌드 디스크립터 옵션으로 지정합니다.
  • 트랜잭션 코드를 프로그램 내에서 첫 번째 converse 문이 나오기 전의 sysVar.transactionID로 이동합니다.

transfer to transaction

transfer to transaction 문은 선택적 레코드를 지정할 수 있습니다. 이 transfer to transaction 문은 새 CICS 트랜잭션을 호출하도록 합니다. 전송 프로세스의 일부로서 복구 가능한 자원이 커미트됩니다. 새 트랜잭션은 첫 번째 트랜잭션이 종료되는 즉시 스케줄됩니다. 다음 절에는 transfer to transaction 문이 CICS 환경에서 작동하는 방식에 대한 더 자세한 설명이 제공되어 있습니다.

transfer to transaction을 사용한 EGL 프로그램에서 EGL 프로그램으로의 전송

다음 절에는 genReturnImmediate 빌드 디스크립터 옵션에 지정하는 값에 따른 transfer to transaction 문의 차이점이 설명되어 있습니다.

genReturnImmediate="NO"인 transfer to transaction

genReturnImmediate 빌드 디스크립터 옵션을 NO로 설정하면 소스 프로그램은 대상 트랜잭션에 대해 EXEC CICS START 명령을 실행합니다. transfer to transaction 문에 레코드가 지정된 경우 이 레코드는 EXEC CICS START 명령에서 FROM 데이터로서 전달됩니다. 그렇지 않은 경우에는 FROM 및 LENGTH 매개변수가 사용되지 않습니다.

다음 예제는 transfer to transaction 문에 레코드가 지정된 경우 EGL이 생성하는 START 명령의 형식을 보여줍니다.
EXEC CICS START TRANSID('transid') FROM(record) 
                                 LENGTH(length of record) 
                                 TERMID(current-terminal) 
transfer to transaction이 기본 텍스트 UI 프로그램에서 실행된 경우 EGL은 항상 CICS START 명령의 TERMID 옵션을 포함합니다. 이 트랜잭션은 터미널이 CICS TCT에서 TRANSCEIVE 상태가 아닌 한 호출되지 않습니다.

START 명령은 4자 이하의 CICS 트랜잭션 ID를 참조합니다. 터미널이 현재 TRANSACTION 상태가 아닌 경우 CICS는 소스 프로그램과 같은 터미널에서 새 CICS 트랜잭션을 시작합니다.

시작된 트랜잭션은 기본 텍스트 UI 프로그램으로 정의된 비EGL 프로그램 또는 EGL 프로그램을 시작할 수 있습니다. 새 트랜잭션이 시작되면 transfer to transaction 문을 실행 중이던 프로그램이 종료됩니다.

genReturnImmediate="YES"인 transfer to transaction

genReturnImmediate 빌드 디스크립터 옵션을 YES로 설정하면 소스 프로그램은 대상 프로그램에 대해 EXEC CICS RETURN IMMEDIATE 명령을 실행합니다. 레코드가 지정된 경우 이 레코드는 COMMAREA의 11번째 바이트부터 n번째 바이트까지의 범위에서 전달됩니다. 처음 10바이트는 2진 0이며 이는 transfer to transaction 문이 레코드를 전달함을 표시합니다. 다음 예제는 transfer to transaction 문에 레코드가 지정된 경우 EGL이 생성하는 EXEC CICS RETURN IMMEDIATE 명령을 보여줍니다.
EXEC CICS RETURN TRANSID('transid') COMMAREA(name of COMMAREA)
                                 LENGTH(length of COMMAREA)
                                 IMMEDIATE

transfer to transaction을 사용한 EGL 프로그램에서 비EGL 프로그램으로의 전송

EGL 프로그램에서 비EGL 프로그램으로의 transfer to transaction 문은 genReturnImmediate 빌드 디스크립터 옵션에 따라 구현됩니다. transfer to transaction 문에 isExternal = YES를 지정하거나 생성 시에 사용된 연계 옵션 파트에 있는 transferToTransaction 요소에 toPgmexternallyDefined = YES를 지정해야 합니다. isExternal 또는 externallyDefined 옵션을 사용하여 이 전송이 비EGL 프로그램으로의 전송임을 문서화할 수 있습니다. transfer to transaction은 새 CICS 트랜잭션을 시작하므로 transfer 명령문의 결과로 CICS SYNCPOINT가 발생합니다.

genReturnImmediate 빌드 디스크립터 옵션이 NO로 설정된 경우 transfer to transaction 문은 EXEC CICS START 명령으로서 구현됩니다. transfer to transaction 문을 사용할 때 전달되는 레코드는 CICS 임시 스토리지에 삽입됩니다. 비EGL 대상 프로그램은 자체 데이터 영역에서 이 레코드를 검색해야 합니다. CICS는 또한 검색된 데이터의 길이를 프로그램에 전달합니다. 전달된 레코드가 없는 경우에는 이 길이가 0입니다. 다음 CICS 명령은 전달된 레코드를 검색합니다.
EXEC CICS RETRIEVE INTO(myWorkingStorageArea)
                 LENGTH(workLength)
RETRIEVE 명령을 실행하기 전에 myWorkingStorageArea의 길이를 workLength에 삽입했는지 확인하십시오.

genReturnImmediate 빌드 디스크립터 옵션이 YES로 설정된 경우에는 transfer to transaction 문이 EXEC CICS RETURN IMMEDIATE로서 구현됩니다. 대상 프로그램이 수신하는 COMMAREA의 처음 10바이트는 2진 0입니다. transfer to transaction 문에 레코드가 지정된 경우 이 레코드는 COMMAREA의 11번째 바이트에서부터 찾을 수 있습니다.

CICS START를 사용한 비EGL 프로그램에서 EGL 프로그램으로의 전송

프로그램은 EGL 프로그램과 연관된 CICS 트랜잭션 ID에 대해 CICS START 명령을 실행할 수 있습니다. 기본 텍스트 UI 프로그램이 시작되는 경우에는 CICS START 명령의 TERMID 옵션에 터미널이 지정되어야 합니다. 이 트랜잭션은 터미널이 CICS TCT에서 TRANSCEIVE 상태가 아닌 한 호출되지 않습니다. 레코드는 START 명령의 FROM 옵션을 사용하여 전달될 수 있습니다. 레코드가 전달되는 경우 이 레코드는 EGL 프로그램의 inputRecord 특성에서 식별하는 레코드를 초기화하는 데 사용됩니다. 대상 EGL 프로그램은 inputForm 특성에 프로그램이 로드되면 자동으로 표시되는 양식을 지정할 수 있습니다.

아래 예제는 EGL 프로그램에 레코드를 전달할 때 사용할 수 있는 START 명령의 형식을 보여줍니다.
EXEC CICS START TRANSID('transid') FROM(record)
                                 LENGTH(length of record)
                                 TERMID(current-terminal)
소스 프로그램이 EXEC CICS START 명령을 사용하는 경우에는 대상 프로그램을 생성할 때 genReturnImmediate 빌드 디스크립터 옵션을 YES 또는 NO로 설정할 수 있습니다.

CICSRETURN IMMEDIATE를 사용한 비EGL 프로그램에서 EGL 프로그램으로의 전송

genReturnImmediate 빌드 디스크립터 옵션이 YES로 설정되어 EGL 프로그램이 생성된 경우 소스(비EGL) 프로그램은 CICS 트랜잭션에 대해 CICS RETURN IMMEDIATE 명령을 실행할 수 있습니다. 레코드는 COMMAREA에서 전달될 수 있으며 11번째 바이트에서부터 시작해야 합니다. 처음 10바이트는 2진 0입니다. 레코드가 전달되는 경우 이 레코드는 EGL 프로그램의 inputRecord 특성에서 식별하는 레코드를 초기화하는 데 사용됩니다. 대상 EGL 프로그램은 inputForm 특성에 프로그램이 로드되면 자동으로 표시되는 양식을 지정할 수 있습니다.

다음 예제는 EGL 프로그램에 레코드를 전달할 때의 CICS RETURN IMMEDIATE 형식을 보여줍니다.
EXEC CICS RETURN TRANSID('transid')
                 COMMAREA(10 bytes of low-values + record)
                 LENGTH(10 + length of record)
                 IMMEDIATE 
EGL 프로그램으로의 전송에 CICS RETURN IMMEDIATE를 사용하는 경우에는 시작될 EGL 프로그램을 생성할 때 genReturnImmediate 빌드 디스크립터 옵션을 YES로 설정해야 합니다.

show를 사용한 전송

제어의 전송에 양식 이름을 지정하려는 경우에는 show 문을 사용해야 합니다. returning 절을 포함하는 show 문에 양식 이름을 지정하면 소스 프로그램은 이 양식을 표시하고 CICS로 돌아갑니다. CICS RETURN 명령은 프로그램 사용자가 화면에 응답하면 show 문에 있는 대상 트랜잭션 ID를 스케줄할 다음 트랜잭션으로 지정합니다. 대상 트랜잭션은 EGL 프로그램과 연관되어야 합니다. 대상 프로그램에는 inputForm 특성에 지정된 양식이 있어야 하며 이 양식은 show 문에 지정된 양식과 동일해야 합니다. 대상 트랜잭션은 사용자가 이벤트 키를 누른 후 제어를 수신합니다.

show 문에 레코드가 지정되어 있는 경우 대상 트랜잭션은 COMMAREA에서 이 레코드를 수신하며 이는 대상 프로그램의 inputRecord 특성에서 지정하는 레코드를 초기화하는 데 사용됩니다.

show 문을 사용하여 비EGL 프로그램으로 전송할 수는 없습니다.

비동기 태스크 사용

EGL 시스템 함수 vgLib.startTransaction()을 사용하여 비동기 트랜잭션을 시작할 수 있습니다. 비동기 트랜잭션을 위해 시작되는 프로그램은 EGL 또는 비EGL로 작성할 수 있습니다. EGL 프로그램을 비동기로 시작하기 위해 비EGL 프로그램을 작성할 수도 있습니다. 다음 절에는 이를 위한 방법이 설명되어 있습니다.

EGL 프로그램에서의 비동기 태스크 시작

EGL 프로그램은 CICS START 명령을 생성하는 vgLib.startTransaction() 문으로 비동기 태스크를 시작합니다. 예를 들면, vgLib.startTransaction() 함수는 다음과 같이 사용할 수 있습니다.
vgLib.startTransaction(requestRecord, prID, termID);

기본 동작은 같은 CICS 리젼에 있는 프로그램을 시작하는 것입니다. 그러나 vgLib.startTransaction() 시스템 함수를 호출하는 프로그램을 생성할 때 사용되는 연계 옵션 파트의 asynchLink 요소를 정의하여 다른 리젼을 지정할 수도 있습니다. 대상 트랜잭션이 원격 시스템에서 시작되는 경우에는 prIDtermID 매개변수가 무시됩니다.

requestRecord의 형식은 다음과 같아야 합니다.
  • 레코드의 1 - 2번째 바이트는 레코드의 데이터 부분의 길이에 10을 더한 길이로 설정되는 SMALLINT 필드여야 합니다.
  • 3 - 6번째 바이트는 CICS 트랜잭션 ID를 포함해야 합니다.
  • 7 - 10번째 바이트는 공백이어야 합니다.
  • requestRecord의 데이터 부분은 11번째 바이트부터 시작됩니다. CICS START 명령의 FROM 옵션에는 레코드의 실제 데이터 부분만 전달됩니다. 시작된 트랜잭션이 EGL 프로그램과 연관되어 있는 경우 이 EGL 프로그램은 requestRecord의 데이터 부분을 inputRecord 특성에 지정된 레코드에 수신합니다.
termID 매개변수에 따라, EGL은 CICS START 명령을 연관된 디바이스를 사용하거나 사용하지 않고 실행합니다.
  • termID가 지정되지 않은 경우 EGL은 현재 터미널을 대상 트랜잭션과 연관시킵니다. 구체적으로 말하면, EGL은 현재 터미널 ID를 CICS START 명령의 TERMID에 지정합니다.
  • termID가 지정되었으며 그 값이 2진 0이 아닌 경우 EGL은 지정된 디바이스(터미널 또는 프린터)를 대상 트랜잭션과 연관시킵니다. 구체적으로 말하면, EGL은 termID의 값을 CICS START 명령의 TERMID 옵션에 지정하되 RTERMID 옵션은 포함시키지 않습니다. termID 값이 현재 트랜잭션과 연관된 CICS 터미널 ID인 경우에는 결과를 예상할 수 없습니다. 현재 트랜잭션을 종료하고 현재 터미널에서 새 트랜잭션을 시작하려면 vgLib.startTransaction() 시스템 함수가 아니라 transfer to transaction 또는 show 문을 사용하십시오.
  • termID 매개변수의 값이 2진 0인 경우 EGL은 대상 트랜잭션을 터미널과 연관시키지 않습니다. 구체적으로 말하면, EGL은 prID 매개변수의 값을 CICS START 명령의 RTERMID 옵션에 지정하되 TERMID 옵션을 포함시키지 않습니다. 또한, 시작되는 EGL 프로그램을 생성할 때 빌드 디스크립터 옵션 printDestination을 TERMINALID로 설정한 경우 prID 매개변수는 대상 트랜잭션의 converseVar.printerAssociation 시스템 변수를 초기화하는 데 사용된 프린터 ID입니다. termID CHAR 필드를 2진 0으로 설정하려면, 다음 예제와 같이 4바이트의 2진 0에 대한 16진 리터럴을 포함하는 지정 명령문을 사용하십시오.
    myCHAR = x"00000000";
  • 대상 트랜잭션에는 CICS TRANSACTION 항목이 있어야 합니다.
  • 시작된 트랜잭션의 첫 번째 프로그램이 비EGL 프로그램인 경우 이 프로그램은 전달된 작업 영역 및 터미널 정보를 가져오기 위해 CICS RETRIEVE를 실행해야 합니다. 자세한 정보는 비EGL 프로그램에서 시작된 태스크의 데이터 검색를 참조하십시오.

비EGL 프로그램으로부터 비동기로 EGL 프로그램 시작하기

비EGL 프로그램으로부터 EGL 프로그램과 연관된 비동기 트랜잭션을 시작하려면 CICS START 명령을 다음과 같이 실행하십시오.
EXEC CICS START ('transid') FROM(workRecord) LENGTH(length of workRecord)
                TERMID(destTermid)
                RTERMID(asyncPrintDest)

시작되는 EGL 프로그램은 기본 프로그램이어야 합니다. 이 프로그램은 workRecord를 사용하여 EGL 프로그램의 inputRecord 특성이 지정하는 레코드를 초기화합니다.

비동기 태스크를 시작할 때 RTERMID 및 TERMID 옵션에는 다음과 같은 의미가 있습니다.
  • 연관된 CICS 터미널 ID 없이 비동기 태스크를 시작하려는 경우에는 START 명령에서 TERMID 키워드를 생략하십시오.
  • 연관된 터미널 ID를 사용하여 태스크를 시작하려는 경우에는 TERMID 옵션에 유효한 CICS 터미널 ID를 지정해야 합니다. 현재 트랜잭션과 연관된 터미널 ID를 지정하는 경우에는 결과를 예상할 수 없습니다.
  • RTERMID 옵션의 값은 시작되는 EGL 프로그램의 인쇄 대상이어야 합니다. 시작되는 EGL 프로그램을 생성할 때 빌드 디스크립터 옵션 printDestination을 TERMINALID로 설정한 경우 RTERMID 값은 시작되는 프로그램의 converseVar.printerAssociation을 초기화하는 데 사용됩니다.

비EGL 프로그램에서 시작된 태스크의 데이터 검색

vgLib.startTransaction() 시스템 함수를 사용하여 시작된 비EGL 프로그램에서는 전달된 레코드를 검색하는 데 사용되는 CICS RETRIEVE 명령에 항상 RTERMID(값이 모두 0인 경우에도)를 포함시켜야 합니다.

프로그램은 다음 작업을 수행하여 전달된 데이터를 수신할 수 있습니다.
EXEC CICS RETRIEVE INTO (workRecord) LENGTH(length of workRecord)
                         RTERMID(userRtermid) 
비EGL 프로그램이 vgLib.startTransaction()으로 인해 시작된 경우 CICS RETRIEVE 명령의 옵션에는 다음과 같은 의미가 있습니다.
  • workRecordvgLib.startTransaction() 시스템 함수에서 사용한 requestRecord의 데이터 부분과 일치하도록 정의되어야 합니다(11번째 바이트부터 requestRecord의 끝까지).
  • workRecord의 길이를 LENGTH에 삽입해야 합니다.
  • RTERMID 옵션이 4바이트의 2진 0을 포함하는 경우에는 이를 무시해야 합니다. RTERMID 옵션이 4바이트의 2진 0이 아닌 경우 이 옵션은 vgLib.startTransaction() 함수를 위해 지정된 프린터(prID 매개변수)를 포함합니다.