SpoolライターVer5.0

23. 在宅ワークのためのPDF出力

テレワークのためのSpoolライターVer5.0の需要が今、急速に高まっています。
弊社でもWeb会議のご要望が増えています。

そのために印刷出力をPDF化して印刷を要求したユーザーに戻す例を
ご紹介します。
まず始めにPDF出力の方法と原理を理解するためのサンプルです。

                           商品マスター一覧表  (PGM106)                
                                                                       
  選択項目を入力して,実行キーを押してください。                       
                                                                       
  品種コード  . . . . . . . . . .                  から                
                                    9999           まで                
  商品コード  . . . . . . . . . .                  から , リストは F4  
                                    9999999999     まで                
  出力  . . . . . . . . . . . . .   *PDF          *PRINT, *PDF         
                                                                       
                                                                             
                                                                         終り
 F3= 終了    F4=プロンプト   F5= 最新表示    F12= 取り消し                      
 F13= この画面の使用法                    F24= キーの続き                    

[解説]

印刷結果をPDFにしてリダイレクトするサンプルです。
入力画面はコマンドでできています。
コマンドと実行CLPのソースを紹介します。

[コマンド:PGM106]

ソースはこちらから

0001.00              CMD        PROMPT(' 商品マスター一覧表 ')                   
0002.00              PARM       KWD(HNSFROM) TYPE(*CHAR) LEN(4) CHOICE(*PGM) +   
0003.00                           CHOICEPGM(QTROBJ/PGM106P) +                    
0004.00                           PROMPT(' 品種コード ')                         
0005.00              PARM       KWD(HNSEND) TYPE(*CHAR) LEN(4) DFT(9999) +       
0006.00                           CHOICE(*PGM) CHOICEPGM(QTROBJ/PGM106P)         
0007.00              PARM       KWD(SHFROM) TYPE(*CHAR) LEN(10) CHOICE(*PGM) +   
0008.00                           CHOICEPGM(QTROBJ/PGM106PE) +                   
0009.00                           PROMPT(' 商品コード ')                         
0010.00              PARM       KWD(SHEND) TYPE(*CHAR) LEN(10) +                 
0011.00                           DFT(9999999999) CHOICE(*PGM) +                 
0012.00                           CHOICEPGM(QTROBJ/PGM106P)                      
0013.00              PARM       KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) +      
0014.00                           DFT(*PDF) VALUES(*PRINT *PDF) +                
0015.00                           PROMPT(' 出力 ')  


                              

[CLP: PGM106CL]

ソースはこちらから

0001.00              PGM        PARM(&HNSFROM &HNSEND &SHFROM &SHEND &OUTPUT)     
0002.00 /*-------------------------------------------------------------------*/   
0003.00 /*   PGM106CL :   商品マスター一覧表                                 */   
0004.00 /*                                                                   */   
0005.00 /*   この CLP:PGM106CL はコマンド PGM106 から呼び出されて            */   
0006.00 /*   実行されます。                                                  */   
0007.00 /*                                                                   */   
0008.00 /*   この適用業務は 5250 環境 / AUTOWEB 環境のどちらでも             */   
0009.00 /*   実行することができます。                                        */   
0010.00 /*                                                                   */   
0011.00 /*   5250 環境で実行した場合は印刷出力イメージは OUTQ に保管され     */   
0012.00 /*   ますが AUTOWEB 環境で実行した場合や PDF が指定された場合は      */   
0013.00 /*   PDF がブラウザ上に表示されます。                                */   
0014.00 /*   ブラアザへの表示は SPOOL ライターの HTTP サーバーによって       */   
0015.00 /*   リダイレクトされて表示されます。                                */   
0016.00 /*                                                                   */   
0017.00 /*   [ 注 ] PDF 変換には SPOOL ライターが導入されている必要が        */   
0018.00 /*          あります。                                               */   
0019.00 /*-------------------------------------------------------------------*/   
0020.00              DCL        VAR(&HNSFROM) TYPE(*CHAR) LEN(4)                  
0021.00              DCL        VAR(&HNSEND) TYPE(*CHAR) LEN(4)                   
0022.00              DCL        VAR(&SHFROM) TYPE(*CHAR) LEN(10)                  
0023.00              DCL        VAR(&SHEND) TYPE(*CHAR) LEN(10)                   
0024.00              DCL        VAR(&SHEND) TYPE(*CHAR) LEN(10)                   
0025.00              DCL        VAR(&OUTPUT) TYPE(*CHAR) LEN(8)                   
0026.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                    
0027.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                    
0028.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                    
0029.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                 
0030.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                 
0031.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                     
0032.00              DCL        VAR(&TOMSGQ) TYPE(*CHAR) LEN(10)                  
0033.00       /*( PDF 出力に必要な変数 )*/                                        
0034.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                     
0035.00              DCL        VAR(&OPT) TYPE(*CHAR) LEN(4) VALUE(X'00000002')   
0036.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                      
0037.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)                    
0038.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                     
0039.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)                   
0040.00              DCL        VAR(&PDF_FILE) TYPE(*CHAR) LEN(48)                
0041.00              DCL        VAR(&PCCMD) TYPE(*CHAR) LEN(123)                  
0042.00              DCL        VAR(&IPADDR) TYPE(*CHAR) LEN(15)                  
0043.00       /*( IFS の削除に必要な変数 )*/                                      
0044.00              DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)                     
0045.00              DCL        VAR(&TIME) TYPE(*CHAR) LEN(6)                     
0046.00              DCL        VAR(&HH) TYPE(*DEC) LEN(2 0)                      
0047.00              DCL        VAR(&HHC) TYPE(*CHAR) LEN(2)                      
0048.00              DCL        VAR(&MM) TYPE(*DEC) LEN(2 0)               
0049.00              DCL        VAR(&MMC) TYPE(*CHAR) LEN(2)               
0050.00              DCL        VAR(&SS) TYPE(*DEC) LEN(2 0)               
0051.00              DCL        VAR(&SSC) TYPE(*CHAR) LEN(2)               
0052.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))    
0053.00                                                                    
0054.00              RTVJOBA    JOB(&JOB) TYPE(&TYPE)                      
0055.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */
0056.00              CHGVAR     VAR(&TOMSGQ) VALUE('*SYSOPR   ')           
0057.00              ENDDO      /*  バッチ  */                             
0058.00              ELSE       CMD(DO) /*  対話式  */                     
0059.00              CHGVAR     VAR(&TOMSGQ) VALUE('*TOPGMQ   ')           
0060.00              ENDDO      /*  対話式  */                             
0061.00                                                                    
0062.00              RTVSYSVAL  SYSVAL(QDATE) RTNVAR(&DATE)                
0063.00              RTVSYSVAL  SYSVAL(QTIME) RTNVAR(&TIME)                
0064.00              CHGJOB     STSMSG(*NORMAL)                            
0065.00                                                                    
0066.00              IF         COND(%SWITCH(XXXXXXX0)) THEN(DO)           
0067.00     /*( 作業進行中メッセージの表示 )*/                             
0068.00              SNDPGMMSG  MSGID(CPF9800) MSGF(QSYS/QCPFMSG) +        
0069.00                           MSGDTA(' 商品一覧表を印刷中。 ') +       
0070.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)            
0071.00              ENDDO                                                 
0072.00 /*-------------------------------------------------------------*/          
0073.00 /*( 1 )  印刷プログラム PGM106 を呼び出して実行する            */          
0074.00 /*-------------------------------------------------------------*/          
0075.00              IF         COND(&OUTPUT *EQ '*PDF    ') THEN(DO)              
0076.00              OVRPRTF    FILE(QPRINT) HOLD(*YES) SECURE(*YES) +             
0077.00                           OVRSCOPE(*JOB)                                   
0078.00              ENDDO                                                         
0079.00              OVRDBF     FILE(SHOHINL1) TOFILE(QTRFIL/SHOHINL1) +           
0080.00                           SECURE(*YES) OVRSCOPE(*JOB)                      
0081.00              CALL       PGM(QTROBJ/PGM106) PARM(&HNSFROM &HNSEND +         
0082.00                           &SHFROM &SHEND)                                  
0083.00              DLTOVR     FILE(SHOHINL1) LVL(*JOB)                           
0084.00 /*-------------------------------------------------------------------*/    
0085.00 /*   *PDF が要求された場合 PDF に変換して                            */    
0086.00 /*   さらに PDF を WEB 表示する                                      */    
0087.00 /*-------------------------------------------------------------------*/    
0088.00              IF         COND(&OUTPUT *EQ '*PDF      ') THEN(DO)            
0089.00 /*-------------------------------------------------------------*/          
0090.00 /*( 2 )  QPRTJOB の JOB 番号を検索する                         */          
0091.00 /*-------------------------------------------------------------*/          
0092.00              RTVJOBA    JOB(&JOB) USER(&USER) NBR(&JOBNBR)                 
0093.00              CALL       PGM(SPOOLWTR/PRTJOBNO) PARM(&USER &JOBNBR)         
0094.00 /*-------------------------------------------------------------*/          
0095.00 /*( 3 )  SPOOL ライターによって PDF に変換して IFS に保管する  */          
0096.00 /*-------------------------------------------------------------*/       
0097.00              CHGVAR     VAR(&PDF_FILE) VALUE('PDF' *CAT &JOBNBR +       
0098.00                           *TCAT '.PDF')                                 
0099.00              /*------------------------------------------------*/       
0100.00              /*   印刷 PDF の場合は PDF を表示しないで         */       
0101.00              /*   そのまま印刷する                             */       
0102.00              /*------------------------------------------------*/       
0103.00              IF         COND(&OUTPUT *EQ '*PRINT  ') THEN(DO)           
0104.00              SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(&JOBNBR/&USER/&JOB) +    
0105.00                           SPLNO(*LAST) OUTPUT(*PDF) OPTION(*PRINT) +    
0106.00                           TOSTMF(&PDF_FILE) +                           
0107.00                           TODIR('/SPOOLWTR/TEMP')                       
0108.00              ENDDO                                                      
0109.00              /*------------------------------------------------*/       
0110.00              /*   表示 PDF の場合は IFS に保管した PDF を      */       
0111.00              /*   PC オーガナイザーで表示する。                */       
0112.00              /*------------------------------------------------*/       
0113.00              ELSE       CMD(DO)                                         
0114.00              SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(&JOBNBR/&USER/&JOB) +    
0115.00                           SPLNO(*LAST) OUTPUT(*PDF) OPTION(*IFS) +      
0116.00                           TOSTMF(&PDF_FILE) +                           
0117.00                           TODIR('/SPOOLWTR/TEMP')                       
0118.00              ENDDO                                                      
0119.00              DLTSPLF    FILE(QPRINT) JOB(&JOBNBR/&USER/&JOB) +          
0120.00                           SPLNBR(*LAST)                                 
0121.00 /*-------------------------------------------------------------*/       
0122.00 /*( 4 ) IFS に保存されている PDF を表示する                    */       
0123.00 /*-------------------------------------------------------------*/       
0124.00              /* GETIPADDR  IBM iの IP アドレスの取得  */           
0125.00              /* エラーがあれば E に 'E' が入る */                       
0126.00              CHGVAR     VAR(&DEV) VALUE(&JOB)                           
0127.00              CALL       PGM(SPOOLWTR/GETIPADDR) PARM(&DEV &IPADDR +     
0128.00                           &MSG &ERR &OPT)                               
0129.00              IF         COND(&ERR *EQ 'E') THEN(DO)                     
0130.00              GOTO       SNDMSG                                          
0131.00              ENDDO                                                      
0132.00              CHGVAR     VAR(&PCCMD) VALUE('START HTTP://' *CAT +        
0133.00                           &IPADDR *TCAT ':3007/SPOOLWTR/TEMP/' *CAT +   
0134.00                           &PDF_FILE)                                    
0135.00              /**************************************************/       
0136.00              /*  PDF 印刷出力の場合は *PRINT を付加しておくと  */       
0137.00              /*  VT5250 が印刷 PDF であると判断する            */       
0138.00              /**************************************************/       
0139.00              IF         COND(&OUTPUT *EQ '*PRINT  ') THEN(DO)           
0140.00              CHGVAR     VAR(&PCCMD) VALUE(&PCCMD *TCAT ' *PRINT')       
0141.00              ENDDO                                                      
0142.00              STRPCO     PCTA(*NO)                                       
0143.00              MONMSG     MSGID(IWS4010)                                  
0144.00              STRPCCMD   PCCMD(&PCCMD) PAUSE(*NO)                            
0145.00 /*-------------------------------------------------------------*/           
0146.00 /*( 5 ) 10 分後に PDF を削除するように SBMJOB する             */           
0147.00 /*-------------------------------------------------------------*/           
0148.00              CHGVAR     VAR(&HH) VALUE(%SST(&TIME 1 2))                     
0149.00              CHGVAR     VAR(&MM) VALUE(%SST(&TIME 3 2))                     
0150.00              CHGVAR     VAR(&SS) VALUE(%SST(&TIME 5 2))                     
0151.00              CHGVAR     VAR(&MM) VALUE(&MM + 10)                            
0152.00              IF         COND(&MM >= 60) THEN(DO)                            
0153.00              CHGVAR     VAR(&HH) VALUE(&HH + 1)                             
0154.00              CHGVAR     VAR(&MM) VALUE(1)                                   
0155.00              ENDDO                                                          
0156.00              CHGVAR     VAR(&HHC) VALUE(&HH)                                
0157.00              CHGVAR     VAR(&MMC) VALUE(&MM)                                
0158.00              CHGVAR     VAR(&SSC) VALUE(&SS)                                
0159.00              CHGVAR     VAR(&TIME) VALUE(&HHC *CAT &MMC *CAT &SSC)          
0160.00              SBMJOB     CMD(RMVLNK OBJLNK(&PDF_FILE)) JOB(DLTPDF) +         
0161.00                           SCDDATE(&DATE) SCDTIME(&TIME) MSGQ(*NONE)         
0162.00              ENDDO                                                          
0163.00 /*-------------------------------------------------------------------*/     
0164.00 /*  5250 エミュレータで実行されている場合は完了メッセージを出力して  */     
0165.00 /*   終了する。                                                      */     
0166.00 /*-------------------------------------------------------------------*/     
0167.00              ELSE       CMD(DO)                                             
0168.00              SNDPGMMSG  MSG(' 商品マスター一覧表を出力しました。 ') +     
0169.00                           MSGTYPE(*DIAG)                                  
0170.00              ENDDO                                                        
0171.00              RETURN                                                       
0172.00                                                                           
0173.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +               
0174.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +     
0175.00                           MSGFLIB(&MSGFLIB)                               
0176.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                     
0177.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +       
0178.00                           TOMSGQ(&TOMSGQ) MSGTYPE(*ESCAPE)                
0179.00              ENDDO                                                        
0180.00              ELSE       CMD(DO)                                           
0181.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +              
0182.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOMSGQ) +               
0183.00                           MSGTYPE(*ESCAPE)                                
0184.00              ENDDO                                                        
0185.00              ENDPGM                                                       

[解説]

PDF出力の場合は最初にスプールをHOLD=*YESで凍結してプリンタに出力されないようにします。

0075.00              IF         COND(&OUTPUT *EQ '*PDF    ') THEN(DO)              
0076.00              OVRPRTF    FILE(QPRINT) HOLD(*YES) SECURE(*YES) +             
0077.00                           OVRSCOPE(*JOB)                                   
0078.00              ENDDO 

次に印刷スプールが出力されたらSpoolライターVer5.0のCVTSPLFでPDFに変換します。

0109.00              /*------------------------------------------------*/       
0110.00              /*   表示 PDF の場合は IFS に保管した PDF を      */       
0111.00              /*   PC オーガナイザーで表示する。                */       
0112.00              /*------------------------------------------------*/       
0113.00              ELSE       CMD(DO)                                         
0114.00              SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(&JOBNBR/&USER/&JOB) +    
0115.00                           SPLNO(*LAST) OUTPUT(*PDF) OPTION(*IFS) +      
0116.00                           TOSTMF(&PDF_FILE) +                           
0117.00                           TODIR('/SPOOLWTR/TEMP')                       
0118.00              ENDDO   

変換が終わったスプールは削除します。

0119.00              DLTSPLF    FILE(QPRINT) JOB(&JOBNBR/&USER/&JOB) +          
0120.00                           SPLNBR(*LAST)

IFSに保管されたPDFを表示します。

0121.00 /*-------------------------------------------------------------*/       
0122.00 /*( 4 ) IFS に保存されている PDF を表示する                    */       
0123.00 /*-------------------------------------------------------------*/       
0124.00              /* GETIPADDR  IBM iの IP アドレスの取得  */           
0125.00              /* エラーがあれば E に 'E' が入る */                       
0126.00              CHGVAR     VAR(&DEV) VALUE(&JOB)                           
0127.00              CALL       PGM(SPOOLWTR/GETIPADDR) PARM(&DEV &IPADDR +     
0128.00                           &MSG &ERR &OPT)                               
0129.00              IF         COND(&ERR *EQ 'E') THEN(DO)                     
0130.00              GOTO       SNDMSG                                          
0131.00              ENDDO                                                      
0132.00              CHGVAR     VAR(&PCCMD) VALUE('START HTTP://' *CAT +        
0133.00                           &IPADDR *TCAT ':3007/SPOOLWTR/TEMP/' *CAT +   
0134.00                           &PDF_FILE)

10分後にはIFSのPDFが自動的に削除されるように指示しておきます。

0145.00 /*-------------------------------------------------------------*/           
0146.00 /*( 5 ) 10 分後に PDF を削除するように SBMJOB する             */           
0147.00 /*-------------------------------------------------------------*/           
0148.00              CHGVAR     VAR(&HH) VALUE(%SST(&TIME 1 2))                     
0149.00              CHGVAR     VAR(&MM) VALUE(%SST(&TIME 3 2))                     
0150.00              CHGVAR     VAR(&SS) VALUE(%SST(&TIME 5 2))                     
0151.00              CHGVAR     VAR(&MM) VALUE(&MM + 10)                            
0152.00              IF         COND(&MM >= 60) THEN(DO)                            
0153.00              CHGVAR     VAR(&HH) VALUE(&HH + 1)                             
0154.00              CHGVAR     VAR(&MM) VALUE(1)                                   
0155.00              ENDDO                                                          
0156.00              CHGVAR     VAR(&HHC) VALUE(&HH)                                
0157.00              CHGVAR     VAR(&MMC) VALUE(&MM)                                
0158.00              CHGVAR     VAR(&SSC) VALUE(&SS)                                
0159.00              CHGVAR     VAR(&TIME) VALUE(&HHC *CAT &MMC *CAT &SSC)          
0160.00              SBMJOB     CMD(RMVLNK OBJLNK(&PDF_FILE)) JOB(DLTPDF) +         
0161.00                           SCDDATE(&DATE) SCDTIME(&TIME) MSGQ(*NONE)         
0162.00              ENDDO   


                                      

… この方法は個別の業務でPDF化して表示する方法として開発されました。
しかしテレワークのために個々の適用業務を修正するのは面倒です。
次回はたった一行でできる在宅ワークの方法をご紹介しましょう。