6.18.ユーザースペースを使ったAPIのテンプレートCLP |
ここに挙げるのは、CLPで、ユーザースペースを使ったAPIの雛形(テンプレート)です。これは、DSPFD *MBRLISTやDSPDBRのCLPのAPIを作っているときに、ほとんど、共通していることに気づいて、これを雛形にしようとしたものです。DSPDBRから、MBRLISTを作ったときに、考えました。結構、便利だと思います。 基本的に、赤い文字の部分を修正して、あとは、そのままです。 解説のないオリジナルソースはこちらです。 下の赤い文字がポイントです。修正して、使ってください。PGM (&OBJNAM &LIBNAM) /* NORMAL SET OF FIELDS */ ここで、ユーザースペース名を設定します。xxxxxxの代わりに好きな名前をどうぞ。ライブラリーはQTEMPがいいでしょう。 /*01234567890123456789*/ DCL &USRSPC *CHAR 20 'XXXXXX QTEMP ' ここから下の&ERRDTAまでは、もう固定で扱ってください。 DCL &SIZE *CHAR 4 /* SIZE OF USERSPACE */ DCL &HDRDTA *CHAR 24 /* HEADER OF USER SPACE */ DCL &RTVSTRB *CHAR 4 /* RETRIEVE START IN USRSPC */ DCL &RTVLENB *CHAR 4 /* RETRIEVE LENGTH OF EACH ITEMS */ DCL &LSTCNT *DEC (9 0) /* COUNTER OF ITEMS IN USRSPC */ DCL &WRKCNT *DEC (9 0) /* WORK FIELD OF COUNTER */ DCL &ERR_BYT *CHAR 4 /* ERROR STRUCTURE */ DCL &ERR_AVA *CHAR 4 /* ERROR STRUCTURE */ DCL &ERR_ID *CHAR 7 /* ERROR STRUCTURE */ DCL &ERR_RSV *CHAR 1 /* ERROR STRUCTURE */ DCL &ERR_MSG *CHAR 100 /* ERROR STRUCTURE */ DCL &ERRDTA *CHAR 116 /* ERROR STRUCTURE */ /* OPTIONAL SET OF FIELDS */ ここから下は、使用するAPIによって、異なります。 DCL &OBJNAM *CHAR 10 /* OBJECT NAME */ DCL &LIBNAM *CHAR 10 /* OBJECT LIBRARY */ DCL &OBJLIB *CHAR 20 /* OBJ + LIB */ この変数の長さは、使用するAPIにより違います。よく確かめてください。短すぎると、エラーになりますよ。 DCL &LSTHDR *CHAR 200 /* RETREIVED LIST DATA FM USRSPC */ DCL &LSTDTA *CHAR 100 /* RETREIVED LIST DATA FM USRSPC */ ここは、なにを取り出したいのか。その項目を洗い出して、定義します。 DCL &FILTXT *CHAR 50 /* OPTIONAL FIELD */ DCL &MBRNAME *CHAR 10 /* OPTIONAL FIELD */ DCL &MBR *CHAR 10 '*ALL' /* OPTION FOR API */ /*--------------------------------------*/ /* INITIAL ROUTINE */ /*--------------------------------------*/ ここで、オブジェクト名+ライブラリー名を作成。ところで、この順番に注意。 CHGVAR &OBJLIB (&OBJNAM || &LIBNAM) /*--------------------------------------*/ /* CREATE USER SPACE */ /*--------------------------------------*/ ユーザースペースの作成です。初期値設定で、&usrspcにはすでに、値が入っています。 CHGVAR %BIN(&SIZE) 1024 CHKOBJ %SST(&USRSPC 11 10)/%SST(&USRSPC 1 10) *USRSPC MONMSG CPF9801 *N + CALL QUSCRTUS (&USRSPC 'WRK ' &SIZE ' ' '*ALL' ' ') /*--------------------------------------*/ /* MAKE AN ERROR STRUCTURE */ /*--------------------------------------*/ CHGVAR %BIN(&ERR_BYT) 116 /* TOTAL LENGTH OF ERRDTA */ CHGVAR %BIN(&ERR_AVA) 0 CHGVAR &ERRDTA (&ERR_BYT||&ERR_AVA||&ERR_ID||&ERR_RSV||&ERR_MSG) /****************************************/ /* SPREAD DATA BY API : OPTIONAL !!!! */ /****************************************/ ここは、使いたいAPIで置き換えます。ここでは、メンバーリストを作成しています。勿論、パラメータはそのAPIにより異なります。 CALL QUSLMBR (&USRSPC 'MBRL0100' &OBJLIB &MBR '0' &ERRDTA) エラーがある場合の処理。サンプルです。ところで、エラーはQCPFMSGでいいのかな? IF (%BIN(&ERRDTA 5 4) *NE 0) DO CHGVAR &ERR_BYT %SST(&ERRDTA 1 4) CHGVAR &ERR_AVA %SST(&ERRDTA 5 4) CHGVAR &ERR_ID %SST(&ERRDTA 9 7) CHGVAR &ERR_MSG %SST(&ERRDTA 17 100) /* YOU CAN CODE ERROR MESSAGE ROUTINE LIKE BELOW. */ SNDPGMMSG MSGID(&ERR_ID) MSGF(QCPFMSG) + MSGDTA(&ERR_MSG) MSGTYPE(*ESCAPE) MONMSG CPF0000 GOTO \END ENDDO /*--------------------------------------*/ /* RETRIEVE HEADER FROM USER SPACE(a) */ /*--------------------------------------*/ ここで、「総称見出し」のデータを取り出します。 CHGVAR %BIN(&RTVSTRB) 117 /* OFFSET OF HEADER */ CHGVAR %BIN(&RTVLENB) 24 /* LENGTH OF HDRDTA */ CALL QUSRTVUS (&USRSPC &RTVSTRB &RTVLENB &HDRDTA) CHGVAR &LSTCNT %BIN(&HDRDTA 17 4) /* COUNT OF ITEMS IN LIST */ ここはもし、リスト明細が無かったら終了です。メッセージくらい出してもいいかも。 IF (&LSTCNT = 0 ) DO /* NO ITEM ROUTINE ; SNDMSG OR SOMETHING LIKE THAT IYW. */ GOTO \END /* AS YOU LIKE */ ENDDO /*--------------------------------------*/ /* RETRIEVE HEADER OF LIST DATA (b) */ /*--------------------------------------*/ ここは、「見出しセクション」(総称見出しではない)のデータを取り出します。APIによっては、無いものもあります。そのときはここはスキップしてください。 CHGVAR %BIN(&RTVSTRB) (%BIN(&HDRDTA 1 4) + 1) /* OFFSET */ CHGVAR &RTVLENB %SST(&HDRDTA 5 4) CALL QUSRTVUS (&USRSPC &RTVSTRB &RTVLENB &LSTHDR) /***************************************/ /* (1) USE HEADER OF LIST DATA */ /***************************************/ こんな感じで、見出しセクションのデータを利用します。 CHGVAR &FILTXT %SST(&LSTHDR 31 50) SNDPGMMSG MSG(&FILTXT) /*--------------------------------------*/ /* PREPARATION OF RETRIEVE LIST DATA */ /*--------------------------------------*/ 「リストセクション」のデータを取り出す準備です。リストデータの先頭位置と、その各項目の長さを取り出しています。 CHGVAR &WRKCNT 0 CHGVAR %BIN(&RTVSTRB) (%BIN(&HDRDTA 9 4) + 1) /* LIST OFFSET */ CHGVAR &RTVLENB %SST(&HDRDTA 21 4) /* ITEM LENGTH */ /*--------------------------------------*/ /* RETRIEVE LIST DATA (c) */ /*--------------------------------------*/ ここからが、「リストセクション」のデータを取り出す部分です。 \RTVUSP: CHGVAR &WRKCNT (&WRKCNT + 1) CALL QUSRTVUS (&USRSPC &RTVSTRB &RTVLENB &LSTDTA) /***************************************/ /* (2) USE ITEM DATA FROM &LSTDATA */ /***************************************/ ここで、取り出した、リストセクションのデータを、フィールドに分解して、利用できます。(RPGならば、データ構造にセットする部分です。)%SSTの桁位置は、マニュアルを参照して、指定してください。 CHGVAR &MBRNAME %SST(&LSTDTA 1 10) SNDPGMMSG MSG(&MBRNAME) /*--------------------------------------*/ /* PREPARATION FOR NEXT LIST ITEM */ /*--------------------------------------*/ もし、カウントが全リストの数と同じになったら、終了。そうでなければ、次のリストの読みとり位置を設定して、リストの取り出しへ戻ります。 IF (&LSTCNT = &WRKCNT) GOTO \END CHGVAR %BIN(&RTVSTRB) (%BIN(&RTVSTRB) + %BIN(&RTVLENB)) GOTO \RTVUSP もし、QTEMPに作成されたユーザースペースならば、削除してします。別に削除しなくても問題ないです。 \END: IF (%SST(&USRSPC 11 10)='QTEMP') DO DLTUSRSPC %SST(&USRSPC 11 10)/%SST(&USRSPC 1 10) ENDDO RETURN ENDPGM ソース上の(a)で、総称見出しを取り出し、(b)で見出しセクションを取り出し、(c)でリストセクションを取り出しています。 ※上図の各数値は、サンプルのものですので、ソースの内容とは関係ありません。
|
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||