JSMDIRECT プログラムは、LANSA ファンクションを内部でのみ実行できます。LANSA プログラムの呼び出し時に 3GL プログラムを実行する必要がある、もしくはさらなる柔軟性が必要な場合、JSMLSAEXT プログラムを作成する必要があります。

この終了プログラムのソース・コードは、JSM ライブラリの QCLSRC に保管されます。

/ *JSM LANSA/RPG 終了プログラム */
 
PGM PARM(&SERVICE &SERVERHOST &HOST &PORT &REMOTEUSER &REMOTEADDR +
         &PROCESS &FUNCTION &PARTITION &LANGUAGE &PROGRAM &RDMLX +
         &CONTINUE &MESSAGE)
 
DCL VAR(&SERVICE)    TYPE(*CHAR) LEN(30)
DCL VAR(&SERVERHOST) TYPE(*CHAR) LEN(80)
DCL VAR(&HOST)       TYPE(*CHAR) LEN(80)
DCL VAR(&PORT)       TYPE(*CHAR) LEN(5)
DCL VAR(&REMOTEUSER) TYPE(*CHAR) LEN(30)
DCL VAR(&REMOTEADDR) TYPE(*CHAR) LEN(45)
 
DCL VAR(&REQUEST)    TYPE(*CHAR) LEN(10) VALUE(RUN)
DCL VAR(&PROCESS)    TYPE(*CHAR) LEN(10)
DCL VAR(&FUNCTION)   TYPE(*CHAR) LEN(10)
DCL VAR(&PARTITION)  TYPE(*CHAR) LEN(3)
DCL VAR(&LANGUAGE)   TYPE(*CHAR) LEN(4)
DCL VAR(&PROGRAM)    TYPE(*CHAR) LEN(32)
DCL VAR(&RDMLX)      TYPE(*CHAR) LEN(1)
DCL VAR(&CONTINUE)   TYPE(*CHAR) LEN(1)
DCL VAR(&MESSAGE)    TYPE(*CHAR) LEN(256)
 
DCL VAR(&PARM01)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM02)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM03)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM04)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM05)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM06)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM07)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM08)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM09)     TYPE(*CHAR) LEN(256)
DCL VAR(&PARM10)     TYPE(*CHAR) LEN(256)
 
DCL VAR(&TASKID)     TYPE(*CHAR) LEN(8)
DCL VAR(&PCTYPE)     TYPE(*CHAR) LEN(1) VALUE(N)
DCL VAR(&DEVELOPER)  TYPE(*CHAR) LEN(1) VALUE(N)
DCL VAR(&ALLOWMSGS)  TYPE(*CHAR) LEN(1) VALUE(N)
DCL VAR(&PCNAME)     TYPE(*CHAR) LEN(10)
DCL VAR(&DATESRC)    TYPE(*CHAR) LEN(1) VALUE(S)
DCL VAR(&BDEBUG)     TYPE(*CHAR) LEN(1) VALUE(N)
DCL VAR(&BDEBUGDEV)  TYPE(*CHAR) LEN(10)
DCL VAR(&BDEBUGMSG)  TYPE(*CHAR) LEN(10)
DCL VAR(&XRUNADPRM)  TYPE(*CHAR) LEN(512)
 
DCL VAR(&CTIME)      TYPE(*CHAR) LEN(6)
DCL VAR(&JOBMSG)     TYPE(*CHAR) LEN(100)
DCL VAR(&MSGID)      TYPE(*CHAR) LEN(7)
DCL VAR(&MSGKEY)     TYPE(*CHAR) LEN(4)
 
MONMSG MSGID(CPF0000)
 
/* CONTINUE のデフォルト値は 'Y' /
/* CHGVAR VAR(&CONTINUE) VALUE('N') */
/* CHGVAR VAR(&MESSAGE)  VALUE('I do not know you') */
/* GOTO END */
 
/* CALLSUBR SUBR(LOGSTR) */
 
IF COND(&PROGRAM *NE ' ') THEN(DO)
  /*  RPG 呼び出し */
  CALL &PROGRAM
  GOTO END
ENDDO
 
IF COND(&RDMLX *EQ 'Y') THEN(DO)
  /* RDMLX 実行要求を変更 */
  CHGVAR VAR(&REQUEST) VALUE(X_RUN)
ENDDO
 
IF COND(&PROCESS *NE ' ' *AND &FUNCTION *NE ' ') THEN(DO)
 
  IF COND(&REQUEST *EQ 'RUN') THEN(DO)
    /* LANSA V10 または V11 の呼び出し */
    CALL PGM(LANSA) PARM(&REQUEST &PROCESS &FUNCTION +
                         &PARM01 &PARM02 &PARM03 &PARM04 &PARM05 +
                         &PARM06 &PARM07 &PARM08 &PARM09 &PARM10 +
                         &PARTITION &LANGUAGE &TASKID &PCTYPE +
                         &DEVELOPER &ALLOWMSGS &PCNAME &DATESRC +
                         &BDEBUG &BDEBUGDEV &BDEBUGMSG)
    MONMSG MSGID(DCM0000) EXEC(DO)
      SNDPGMMSG MSG('LANSA RDML has ended abnormally')
    ENDDO
    GOTO END
  ENDDO
 
  IF COND(&REQUEST *EQ 'X_RUN') THEN(DO)
    /*  LANSA V11 呼び出し - RDMLX */
    CALL PGM(LANSA) PARM(&REQUEST &PROCESS &FUNCTION +
                         &PARM01 &PARM02 &PARM03 &PARM04 &PARM05 +
                         &PARM06 &PARM07 &PARM08 &PARM09 &PARM10 +
                         &PARTITION &LANGUAGE &TASKID &PCTYPE +
                         &DEVELOPER &ALLOWMSGS &PCNAME &DATESRC +
                         &BDEBUG &BDEBUGDEV &BDEBUGMSG &XRUNADPRM)
    MONMSG MSGID(DCM0000) EXEC(DO)
      SNDPGMMSG MSG('LANSA RDMLX has ended abnormally')
    ENDDO
    GOTO END
  ENDDO
 
ENDDO
 
SNDPGMMSG MSG('No program or function specified for execution')
 
END:
 
/* LANSA は終了オプションが有効時、ライブラリ・リストを置換  */
/* CALLSUBR SUBR(RMVMSG) */
/* LANSA は終了オプションが無効時、リソースを再利用 */
RCLRSC
/* CALLSUBR SUBR(LOGEND) */
 
/* =================================================================== */
/* サブルーチン                                                         */
/* =================================================================== */
 
SUBR SUBR(LOGSTR)
  /* 開始時間 */
  RTVSYSVAL SYSVAL(QTIME) RTNVAR(&CTIME)
  CHGVAR VAR(&JOBMSG) VALUE('JSMLSAEXT START' *BCAT &CTIME)
  SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&JOBMSG)
  SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&FUNCTION)
  /* ジョブ情報のリセット */
  CALL PGM(LOGJOBINFO) PARM('*YES      ')
ENDSUBR
 
SUBR SUBR(LOGEND)
  /* ジョブ情報のログ */
  CALL PGM(LOGJOBINFO) PARM('*NO       ')
  /* 終了時間 */
  RTVSYSVAL SYSVAL(QTIME) RTNVAR(&CTIME)
  CHGVAR VAR(&JOBMSG) VALUE('JSMLSAEXT END' *BCAT &CTIME)
  SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&JOBMSG)
ENDSUBR
 
SUBR SUBR(RMVMSG)
  /* LANSA は終了オプションが有効時、ライブラリ・リストを置換           */
  /* LANSA の CPC2101 ライブラリ・リスト変更メッセージ                 */
  /* http://www-01.ibm.com/support/docview.wss?uid=nas8N1016727     */
  /* MSGKEY は 4 バイト符号なしのインクリメント整数                    */
  /* 各ジョブのプログラム・メッセージ数に制限があり、                 */
  /* 4,294,967,293 に達すると、OS がジョブを終了                  */
  CHGVAR VAR(&MSGID) VALUE(' ')
  SNDPGMMSG MSG('TEXT') TOPGMQ(*SAME) KEYVAR(&MSGKEY)
  RMVMSG MSGKEY(&MSGKEY)
  CHGVAR %BIN(&MSGKEY 1 4)  (%BIN(&MSGKEY 1 4) - 1)
  RCVMSG PGMQ(*SAME (*)) MSGKEY(&MSGKEY) RMV(*NO) MSGID(&MSGID)
  IF COND(&MSGID *EQ 'CPC2101') THEN(DO)
    /* CPC2101 ライブラリ・リスト変更 */
    RCVMSG PGMQ(*SAME (*)) MSGKEY(&MSGKEY) RMV(*YES) MSGID(&MSGID)
  ENDDO
ENDSUBR
 
ENDPGM