如何將報表轉為 Text 或 Html 格式 ? (Command:CVTSPLSTMF)
此指令是將報表轉換為 Text 或 Html 格式,並可以轉換中文而且可將報表對齊,不過報表
中文控制碼(0E0F)要前後配對完整才可以,並將之存放在 IFS 目錄中,所以使用前須先建立
一個目錄,例如使用指令 MD '/spool' 建立一 spool 的目錄,使用 WRKLNK '/spool' ,並
選用 5 ,即可檢視該目錄內容:
===============================================================================
Work with Object Links
Directory . . . . : /
Type options, press Enter.
2=Edit 3=Copy 4=Remove 5=Display 7=Rename 8=Display attributes
11=Change current directory ...
Opt Object link
5 spool
Bottom
Parameters or command
===>
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F12=Cancel F17=Position to
F22=Display entire field F23=More options
===============================================================================
Work with Object Links
Directory . . . . : /spool
Type options, press Enter.
2=Edit 3=Copy 4=Remove 5=Display 7=Rename 8=Display attributes
11=Change current directory ...
Opt Object link
Bottom
Parameters or command
===>
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F12=Cancel F17=Position to
F22=Display entire field F23=More options
===============================================================================
使用CVTSPLSTMF 指令範例:
利用 AS/400 列印螢幕功能(HOST print),列印一份報表 QSYSPRT,在使用下列指令將
QSYSPRT 報表複製至目錄 /spool 中:
Convert Spool to Stream File (CVTSPLSTMF)
Type choices, press Enter.
From spooled file name . . . . . > QSYSPRT Name
To stream file name . . . . . . > QSYSPRT.TXT
To directory . . . . . . . . . . > '/spool'
Job name . . . . . . . . . . . . * Name, *
User . . . . . . . . . . . . . Name
Number . . . . . . . . . . . . 000000-999999
Spooled file number . . . . . . > *LAST 1-9999, *LAST, *ONLY
Stream file format . . . . . . . *TEXT *TEXT, *HTML
Stream file option . . . . . . . > *REPLACE *NONE, *REPLACE, *ADD
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to use this display F24=More keys
==============================================================================
此時使用 WRKLNK '/spool' ,按執行鍵,並使用選項 5,會得到下列畫面,使用選項 5,
可以檢視報表資料:
Work with Object Links
Directory . . . . : /spool
Type options, press Enter.
2=Edit 3=Copy 4=Remove 5=Display 7=Rename 8=Display attributes
11=Change current directory ...
Opt Object link
QSYSPRT.TXT
Bottom
Parameters or command
===>
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F12=Cancel F17=Position to
F22=Display entire field F23=More options
==============================================================================
當轉換為一般文字檔後,可以使用 FTP 方式或 AS/400 NetServer 方式將目錄分享出來,
PC 端即可取得報表資料了。
有關 As/400(iSeries) NetServer 詳細資料請參照
http://www-1.ibm.com/servers/eserver/iseries/netserver/
File : QRPGLESRC
Member: CVTSPLSTMR
Type : RPGLE
Usage : CRTBNDRPG CVTSPLSTMR
******************************************************************
* *
* PROGRAM NAME: CVTSPLSTMR called by CVTSPLSTMC *
* *
* AUTHOR : Vengoal Chang *
* *
* DATE WRITTEN: March 2006 *
* *
* DESCRIPTION : Converts spooled file data in work file *
* CvtSplWrk2 to HTML or TEXT format to work file *
* CvtSplWrk1. *
* *
* FUNCTIONS : Adds basic HTML headings and footings and a *
* title. *
* *
* Copyright 2006 (c) Vengoal Chang. *
* All rights reserved. *
* *
******************************************************************
H DFTACTGRP(*NO) Debug
FCvtSplWrk2IF F 382 DISK
FCvtSplWrk1UF A F 378 DISK
* Standard HTML header lines
D aaHeader S 80A DIM(2) CTDATA PERRCD(1)
* Standard HTML footer line
D aaFooter S 80A DIM(1) CTDATA PERRCD(1)
* Input spooled file data including control characters
D InputData DS
D saSkipLine 3A
D ssSkipLine 3S 0 OVERLAY(saSkipLine:1)
D saSpceLine 1A
D ssSpceLine 1S 0 OVERLAY(saSpceLine:1)
D saInput 378A
* Output HTML-format data
D OutputData DS
D saOutput 378A
* Program parameters - title and page length in lines
D paToFmt S 5A
D paTitle S 50A
D piPageLen S 10I 0
* Line counter variable
D wiLine S 10I 0
* Procedure prototypes
D HTMLHeader PR
D HTMLFooter PR
D Convert PR
D Merge PR LIKE(saOutput)
D iaOutput LIKE(saOutput)
D iaInput LIKE(saInput)
D SpceLines PR
D isSpceLine LIKE(ssSpceLine)
D SkipLines PR
D isSkipLine LIKE(ssSkipLine)
D ParseInput PR
**********************************************************************
* Program parameters
C *ENTRY PLIST
C PARM paToFmt
C PARM paTitle
C PARM piPageLen
* Output HTML header lines
C If paToFmt = '*HTML'
C CALLP HTMLHeader
C EndIf
* Convert spool file lines to HTML or Text
C EVAL wiLine = 1
C READ CvtSplWrk2 InputData LR
C DOW *INLR = *OFF
C CALLP ParseInput
C CALLP Convert
C READ CvtSplWrk2 InputData LR
C ENDDO
* Output HTML footer lines
C If paToFmt = '*HTML'
C CALLP HTMLFooter
C EndIf
C RETURN
**********************************************************************
* Procedure to create HTML header lines *
**********************************************************************
P HTMLHeader B
D HTMLHeader PI
C EVAL saOutput = aaHeader(1)
C WRITE CvtSplWrk1 OutputData
C IF paTitle <> '*NONE'
C EVAL saOutput = '< TITLE>'
C + %trim(paTitle)
C + ''
C WRITE CvtSplWrk1 OutputData
C ENDIF
C EVAL saOutput = aaHeader(2)
C WRITE CvtSplWrk1 OutputData
P HTMLHeader E
**********************************************************************
* Procedure to create HTML footer line *
**********************************************************************
P HTMLFooter B
D HTMLFooter PI
C EVAL saOutput = aaFooter(1)
C WRITE CvtSplWrk1 OutputData
P HTMLFooter E
**********************************************************************
* Procedure to convert spooled file data to HTML text *
**********************************************************************
P Convert B
D Convert PI
* If 'space' position is zero, 'overprint' previous line
C IF saSpceLine = '0'
C *HIVAL SETGT CvtSplWrk1
C READP CvtSplWrk1 OutputData 99
C EVAL saOutput = Merge(saOutput:saInput)
C UPDATE CvtSplWrk1 OutputData
C ELSE
* Skip to a line if specified
C IF saSkipLine <> *BLANKS
C CALLP SkipLines(ssSkipLine)
C ENDIF
* Space a number of lines if specified
C IF saSpceLine <> *BLANKS
C CALLP SpceLines(ssSpceLine)
C ENDIF
* 'Print' line
C EVAL saOutput = saInput
C WRITE CvtSplWrk1 OutputData
C EVAL wiLine = wiLine + 1
C ENDIF
C RETURN
P Convert E
**********************************************************************
* Procedure to merge two overlaid lines of text *
**********************************************************************
P Merge B
D Merge PI LIKE(saOutput)
D iaOutput LIKE(saOutput)
D iaInput LIKE(saInput)
D laOutput S LIKE(saOutput)
D i S 5I 0
C EVAL i = 1
C DOW i <= %size(iaInput )
C and i <= %size(iaOutput)
C and i <= %size(laOutput)
C IF %subst(iaInput:i:1) = *BLANK
C EVAL %subst(laOutput:i:1) = %subst(iaOutput:i:1)
C ELSE
C EVAL %subst(laOutput:i:1) = %subst(iaInput :i:1)
C ENDIF
C EVAL i = i + 1
C ENDDO
C RETURN laOutput
P Merge E
**********************************************************************
* Procedure to skip to a given line number *
**********************************************************************
P SkipLines B
D SkipLines PI
D isSkipLine LIKE(ssSkipLine)
C EVAL saOutput = *BLANKS
C IF wiLine > isSkipLine
C DOW wiLine <= piPageLen
C WRITE CvtSplWrk1 OutputData
C EVAL wiLine = wiLine + 1
C ENDDO
C If paToFmt = '*HTML'
C EVAL saOutput = '< hr>'
C WRITE CvtSplWrk1 OutputData
C EndIf
C EVAL saOutput = *BLANKS
C EVAL wiLine = 1
C EndIf
C DOW wiLine < isSkipLine
C WRITE CvtSplWrk1 OutputData
C EVAL wiLine = wiLine + 1
C ENDDO
C RETURN
P SkipLines E
**********************************************************************
* Procedure to space a number of lines *
**********************************************************************
P SpceLines B
D SpceLines PI
D isSpceLine LIKE(ssSpceLine)
D liCount S 5I 0
C* EVAL wiLine = wiLine + 1
C EVAL saOutput = *BLANKS
C DOW liCount < isSpceLine - 1
C WRITE CvtSplWrk1 OutputData
C EVAL wiLine = wiLine + 1
C EVAL liCount = liCount + 1
C ENDDO
C RETURN
P SpceLines E
**********************************************************************
P ParseInput B
D ParseInput PI
D Input S 2048
D InpLen S 5I 0
D DATA S 2048
D X0E C X'0E'
D X0F C X'0F'
C z-add 1 i 5 0
C z-add 1 J 5 0
C Clear Data
C Eval Input = InputData
C Eval InpLen= %len(%trimr(InputData))
C 1 Do InpLen
C If %SUBST(Input : i : 1) = X0E
C Eval %SubSt(Data : j : 1) = ' '
C Eval J = J + 1
C Eval %SubSt(Data : j : 1)
C = %SubSt(Input : i : 1)
C Else
C If %SUBST(Input : i : 1) = X0F
C Eval %SubSt(Data : j : 1)
C = %SubSt(Input : i : 1)
C Eval J = J + 1
C Eval %SubSt(Data : j : 1) = ' '
C Else
C Eval %SubSt(Data : j : 1)
C = %SubSt(Input : i : 1)
C EndIf
C EndIf
C Eval i = i + 1
C Eval j = j + 1
C If i > InpLen
C Leave
C EndIf
C EndDo
C Eval InputData = Data
C Eval InpLen = j -1
C
C RETURN
P ParseInput E
**
< html>< head>
< body>< pre>
**
< hr>
File : QCLSRC
Member: CVTSPLSTMC
Type : CLP
Usage : CRTCLPGM CVTSPLSTMC
/*****************************************************************/
/* */
/* COMMAND: CVTSPLSTM CPP */
/* */
/* PROGRAM NAME: CVTSPLSTMC */
/* */
/* VERSION : 1.1 */
/* */
/* AUTHOR : Vengoal Chang */
/* */
/* DATE WRITTEN: March 2006 */
/* */
/* DESCRIPTION : Convert Spooled File to Stream File */
/* command processing program. */
/* */
/* FUNCTIONS : Converts an AS/400 spooled file to a stream */
/* file in one of two formats: */
/* */
/* 1. Plain ASCII text */
/* 2. HTML */
/* */
/* Copyright 2006 (c) Vengoal Chang. */
/* All rights reserved. */
/* */
/*****************************************************************/
PGM (&FromFile +
&ToStmf +
&ToDir +
&QualJob +
&SplId +
&ToFmt +
&StmfOpt +
&StmfCodPag +
&Title )
DCL &FromFile *CHAR 10
DCL &ToFile *CHAR 10
DCL &ToStmf *CHAR 64
DCL &ToDir *CHAR 256
DCL &QualJob *CHAR 26
DCL &IntJob *CHAR 16
DCL &IntSplID *CHAR 16
DCL &Job *CHAR 10
DCL &User *CHAR 10
DCL &JobNbr *CHAR 6
DCL &SplID *DEC (4 0)
DCL &HexSplID *CHAR 4
DCL &ToFmt *CHAR 5
DCL &StmfOpt *CHAR 8
DCL &StmfCodPag *DEC (5 0)
DCL &CodePage *CHAR 8
DCL &Title *CHAR 50
DCL &SplInfo *CHAR 2000
DCL &InfoLen *CHAR 4
DCL &PageLen *CHAR 4
DCL &SplNbr *CHAR 5
DCL &Path *CHAR 1024
DCL &Rpyle *LGL
DCL &RpyleSeq *DEC (4 0)
DCL &InqMsgRpy *CHAR 10
DCL &CtlChar *CHAR 7 '*NONE'
DCL &MsgID *CHAR 7
DCL &Msgf *CHAR 10
DCL &MsgfLib *CHAR 10
DCL &MsgDta *CHAR 100
DCL &MsgKey *CHAR 4
DCL &Msg *CHAR 100
DCL &Sev *DEC (2 0)
DCL &ErrorFlag *LGL 1
/* Global message monitor to trap any unmonitored errors */
MONMSG (CPF9999 CPF0000 MCH0000) EXEC(GOTO ERROR)
/* (A) Extract job name from qualified Job name */
CHGVAR &Job %sst(&QualJob 1 10)
CHGVAR &User %sst(&QualJob 11 10)
CHGVAR &JobNbr %sst(&QualJob 21 6)
/* (B) Convert special value * to current job details */
IF (&Job *eq '*') DO
RTVJOBA JOB(&Job) USER(&User) NBR(&JobNbr)
ENDDO
/* (C) Set up spooled file number from special values */
CHGVAR &SplNbr &SplID
IF (&SplID *EQ -2) DO
CHGVAR &SplNbr '*LAST'
ENDDO
IF (&SplID *EQ -3) DO
CHGVAR &SplNbr '*ONLY'
ENDDO
/* (D) Create first work file */
DLTF QTEMP/CVTSPLWRK1
MONMSG CPF2105
CRTPF FILE(QTEMP/CVTSPLWRK1) RCDLEN(378) +
IGCDTA(*YES) SIZE(1000000 10000 10)
CHGVAR &ToFile 'CVTSPLWRK1'
/* (E) Create second work file if not converting to plain text */
DLTF QTEMP/CVTSPLWRK2
MONMSG CPF2105
CRTPF FILE(QTEMP/CVTSPLWRK2) RCDLEN(382) +
IGCDTA(*YES) SIZE(1000000 10000 10)
CHGVAR &ToFile 'CVTSPLWRK2'
/* (F) Set Job to use reply list entries */
RTVJOBA InqMsgRpy(&InqMsgRpy)
CHGJOB InqMsgRpy(*SYSRPYL)
/* (G) Add reply list entry for CPYSPLF message */
CHGVAR &RpyleSeq 9999
ADDRPYLE: ADDRPYLE &RpyleSeq MSGID(CPA3311) RPY('G')
MONMSG CPF2555 EXEC(DO)
CHGVAR &RpyleSeq (&RpyleSeq -1)
IF (&RpyleSeq *GT 0) (GOTO ADDRPYLE)
ENDDO
MONMSG CPF0000 EXEC(GOTO START)
CHGVAR &Rpyle '1'
START: IF (&ToFmt *NE '*TEXT') DO
/* (I) Set up Title if a special value */
IF (&Title *EQ '*STMFILE') DO
CHGVAR &Title &ToStmf
ENDDO
IF (&Title *EQ '*NONE') DO
CHGVAR &Title ' '
ENDDO
ENDDO
/* (H) We need control characters for TEXT or HTML conversion */
CHGVAR &CtlChar '*PRTCTL'
/* (J) Copy spooled file into work file */
CPYSPLF &FromFile +
QTEMP/&ToFile +
JOB(&JobNbr/&User/&Job) +
SPLNBR(&SplNbr) +
MBROPT(*REPLACE) +
CTLCHAR(&CtlChar)
/* (K) Call API to get spooled file info */
CHGVAR %bin(&HexSplID) &SplID
IF (&SplNbr *EQ '*ONLY') (CHGVAR %bin(&HexSplID) 0)
IF (&SplNbr *EQ '*LAST') (CHGVAR %bin(&HexSplID) -1)
CHGVAR %bin(&InfoLen) 2000
CALL PGM(QUSRSPLA) PARM(&SplInfo +
&InfoLen +
'SPLA0100' +
&QualJob +
&IntJob +
&IntSplID +
&FromFile +
&HexSplID )
CHGVAR &PageLen %sst(&SplInfo 425 4)
/* (L) Convert spooled file data to HTML OR TEXT format */
OVRDBF CvtSplWrk1 QTEMP/CVTSPLWRK1 OVRSCOPE(*JOB)
OVRDBF CvtSplWrk2 QTEMP/CVTSPLWRK2 OVRSCOPE(*JOB)
CALL CVTSPLSTMR PARM(&ToFmt &Title &PageLen)
/* (N) Set codepage of stream file to be created */
CHGVAR &CodePage &StmfCodPag
IF (&StmfCodPag *EQ -1) (CHGVAR &CodePage *PCASCII)
IF (&StmfCodPag *EQ -2) (CHGVAR &CodePage *STMF)
/* (O) Convert spooled file data in work file to stream file */
CHGVAR &Path (&ToDir *TCAT '/' *CAT &ToStmf)
CPYTOSTMF FROMMBR('/qsys.lib/qtemp.lib/CVTSPLWRK1.fil+
e/CVTSPLWRK1.mbr') +
TOSTMF(&Path) +
STMFOPT(&StmfOpt) +
STMFCODPAG(&CodePage)
/* (P) Send completion message */
SNDPGMMSG MSGID(CPF9898) +
MSGF(QCPFMSG) +
MSGDTA('Spooled file' *BCAT &FromFile *BCAT +
'copied to stream file' *BCAT &ToStmf) +
MSGTYPE(*COMP)
/* (Q) Delete work file(s) */
DLTOVR CvtSplWrk1 LVL(*JOB)
MONMSG CPF0000
DLTOVR CvtSplWrk2 LVL(*JOB)
MONMSG CPF0000
DLTF QTEMP/CVTSPLWRK1
MONMSG CPF2105
DLTF QTEMP/CVTSPLWRK2
MONMSG CPF2105
/* (R) Remove reply list entry and reset job attribute if changed */
IF (&Rpyle *EQ '1') DO
RMVRPYLE &RpyleSeq
ENDDO
CHGJOB INQMSGRPY(&InqMsgRpy)
/* Finish */
RETURN
/* */
/* Error Handling logic */
/* */
ERROR:
/* */
/* If looping in the error handling routine, end in error */
/* */
IF (&ErrorFlag) DO
SNDPGMMSG MSGID(CPF9999) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
MONMSG CPF0000
GOTO ENDPGM
ENDDO
/* */
/* Set flag to prevent looping */
/* */
CHGVAR &ErrorFlag '1'
/* Re-send any diagnostic messages sent to this program */
ERROR1: RCVMSG MSGTYPE(*DIAG) +
RMV(*NO) +
KEYVAR(&MsgKey) +
MSG(&Msg) +
MSGDTA(&MsgDta) +
MSGID(&MsgID) +
MSGF(&Msgf) +
SNDMSGFLIB(&MsgFLib)
IF (&MsgKey *EQ ' ') (GOTO ERROR2)
RMVMSG MSGKEY(&MsgKey)
SNDPGMMSG MSGID(&MsgID) +
MSGF(&MsgfLib/&Msgf) +
MSGDTA(&MsgDta) +
MSGTYPE(*DIAG)
GOTO CMDLBL(ERROR1)
/* Re-send any escape messages sent to this program */
ERROR2: IF (&Rpyle *EQ '1') DO
RMVRPYLE &RpyleSeq
MONMSG CPF0000
ENDDO
CHGJOB INQMSGRPY(&InqMsgRpy)
MONMSG CPF0000
RCVMSG MSGTYPE(*EXCP) +
RMV(*NO) +
MSG(&Msg) +
MSGDTA(&MsgDta) +
MSGID(&MsgID) +
SEV(&Sev) +
MSGF(&Msgf) +
SNDMSGFLIB(&MsgFLib)
IF (&Sev *gt 00) THEN(DO)
SNDPGMMSG MSGID(&MsgID) +
MSGF(&MsgfLib/&Msgf) +
MSGDTA(&MsgDta) +
MSGTYPE(*ESCAPE)
ENDDO
ELSE DO
SNDPGMMSG MSGID(CPF9897) +
MSGF(QCPFMSG) +
MSGDTA(&Msg) +
MSGTYPE(*ESCAPE)
ENDDO
ENDPGM: ENDPGM
File : QCMDSRC
Member: CVTSPLSTMF
Type : CMD
Usage : CRTCMD CMD(lib/CVTSPLSTMF) PGM(lib/CVTSPLSTMC)
/*****************************************************************/
/* */
/* COMMAND NAME: CVTSPLSTMF */
/* */
/* AUTHOR : Vengoal Chang */
/* */
/* DATE WRITTEN: March 2006 */
/* */
/* DESCRIPTION : Convert Spooled File to Stream File command */
/* */
/* FUNCTIONS : Converts an AS/400 spooled file to a stream */
/* file in one of three formats: */
/* */
/* 1. Plain ASCII text */
/* 2. HTML */
/* */
/*****************************************************************/
CMD PROMPT('Convert Spool to Stream File')
PARM KWD(FROMFILE) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT('From spooled file name')
PARM KWD(TOSTMF) TYPE(*NAME) LEN(64) MIN(1) +
PROMPT('To stream file name')
PARM KWD(TODIR) TYPE(*PNAME) LEN(256) MIN(1) +
PROMPT('To directory')
PARM KWD(JOB) TYPE(JOB) DFT(*) SNGVAL((*)) +
PROMPT('Job name')
JOB: QUAL TYPE(*NAME) LEN(10) MIN(1)
QUAL TYPE(*NAME) LEN(10) MIN(1) PROMPT('User')
QUAL TYPE(*CHAR) LEN(6) RANGE(000000 999999) +
MIN(1) PROMPT('Number')
PARM KWD(SPLNBR) TYPE(*DEC) LEN(4) DFT(*ONLY) +
RANGE(1 9999) SPCVAL((*LAST -2) (*ONLY +
-3)) PROMPT('Spooled file number')
PARM KWD(TOFMT) TYPE(*CHAR) LEN(5) RSTD(*YES) +
DFT(*TEXT) VALUES(*TEXT *HTML) +
PROMPT('Stream file format')
PARM KWD(STMFOPT) TYPE(*CHAR) LEN(8) RSTD(*YES) +
DFT(*NONE) VALUES(*NONE *REPLACE *ADD) +
PROMPT('Stream file option')
PARM KWD(STMFCODPAG) TYPE(*DEC) LEN(5 0) +
DFT(*PCASCII) RANGE(1 32767) +
SPCVAL((*PCASCII -1) (*STMF -2)) +
PMTCTL(*PMTRQS) PROMPT('Stream file code +
page')
PARM KWD(TITLE) TYPE(*CHAR) LEN(50) RSTD(*NO) +
DFT(*NONE) SPCVAL((*NONE) (*STMFILE)) +
PMTCTL(HTML) PROMPT('Title for HTML')
HTML: PMTCTL CTL(TOFMT) COND((*EQ *HTML)) +
NBRTRUE(*EQ 1)
沒有留言:
張貼留言