最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

6.18.ユーザースペースを使ったAPIのテンプレートCLP

[ Previous ] [ HOME ] [ Upper ] [ Next ]


ここに挙げるのは、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  

api_usrspc.gif (44899 バイト)

ソース上の(a)で、総称見出しを取り出し、(b)で見出しセクションを取り出し、(c)でリストセクションを取り出しています。

※上図の各数値は、サンプルのものですので、ソースの内容とは関係ありません。

 


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送