如何讓報表管理自動化? -  · 報表至另一台印表機。 於 os/400 v5r4...

29
如何讓報表管理自動化? 報表管理通常是一般系統管理的工作, AS/400(iSeries) 系統已包含以使用者及使 用者自己的報表連結相關的印表機及輸出佇列(Outq -- Output Queue)的報表管 理技術,通常管理人員會允許使用者使用指令 WRKSPLF(Work with Spool Files) WRKOUTQ(Work with Output Queues) 截取報表資料,這些指令讓使用者管 理他們自己的報表,及若某使用者同時擁有 *SPLCTL 特殊權限時,該使用者 同時可以管理其他人的報表,然而使用這些指令仍然無法讓報表管理自動化。使 用者仍然需要從一個輸出佇列搬移報表至另一個輸出佇列或從一台印表機搬移 報表至另一台印表機。 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。 為什麼有人想要讓報表管理自動化?因為當報表很多時,如週報月報季報年報累 計一段時間後,就會有報表儲存的需求,因為報表本身於 AS/400(iSeries)系統上 並不是一個物件,於 OS V5R3 以前無法利用 SAVE 指令儲存,所以需要採用 某些技巧才將報表儲存起來,當然報表可以利用複製報表至資料庫檔案儲存在 AS/400(iSeries)或下載至 PC 上,但報表非常多時便無法一一用手動的方式來完 成,所以可以利用其他廠商所開發的報表管理軟體,所以仍需要額外的成本才能 完成報表管理自動化的工作,基於成本考量,我將教您如何達成報表管理自動化 的方式。其步驟如下: 1:取得哪些報表放置於輸出佇列中的詳細資料,即報表管理自動化的先決條件 是以輸出佇列(Outq)為管理單位。 2:使用指令 CPYSPLF 複製報表資料至資料庫檔案(PF -- Physical file)3: 若僅需儲存報表於 AS/400(iSeries)上,則定期備份步驟2所產生的資料庫 檔案(需要自行定義資料庫檔案名稱及其 member 成員名稱,方便於備份 及回複管理)。 若僅需儲存報表於 PC 上,則有三種方式: 一: 使用指令 CPYTOSTMF 複製步驟2所產生的資料庫檔案至 IFS

Upload: others

Post on 29-Oct-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

如何讓報表管理自動化?

報表管理通常是一般系統管理的工作,AS/400(iSeries) 系統已包含以使用者及使

用者自己的報表連結相關的印表機及輸出佇列(Outq -- Output Queue)的報表管

理技術,通常管理人員會允許使用者使用指令 WRKSPLF(Work with Spool Files) 及 WRKOUTQ(Work with Output Queues) 截取報表資料,這些指令讓使用者管

理他們自己的報表,及若某使用者同時擁有 *SPLCTL 特殊權限時,該使用者

同時可以管理其他人的報表,然而使用這些指令仍然無法讓報表管理自動化。使

用者仍然需要從一個輸出佇列搬移報表至另一個輸出佇列或從一台印表機搬移

報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所

有的報表備份至磁帶中,有需要時,再回復至系統中。 為什麼有人想要讓報表管理自動化?因為當報表很多時,如週報月報季報年報累

計一段時間後,就會有報表儲存的需求,因為報表本身於 AS/400(iSeries)系統上

並不是一個物件,於 OS V5R3 以前無法利用 SAVE 指令儲存,所以需要採用

某些技巧才將報表儲存起來,當然報表可以利用複製報表至資料庫檔案儲存在 AS/400(iSeries)或下載至 PC 上,但報表非常多時便無法一一用手動的方式來完

成,所以可以利用其他廠商所開發的報表管理軟體,所以仍需要額外的成本才能

完成報表管理自動化的工作,基於成本考量,我將教您如何達成報表管理自動化

的方式。其步驟如下: 1:取得哪些報表放置於輸出佇列中的詳細資料,即報表管理自動化的先決條件

是以輸出佇列(Outq)為管理單位。 2:使用指令 CPYSPLF 複製報表資料至資料庫檔案(PF -- Physical file)。 3:

a 若僅需儲存報表於 AS/400(iSeries)上,則定期備份步驟2所產生的資料庫

檔案(需要自行定義資料庫檔案名稱及其 member 成員名稱,方便於備份

及回複管理)。 b 若僅需儲存報表於 PC 上,則有三種方式:

一: 使用指令 CPYTOSTMF 複製步驟2所產生的資料庫檔案至 IFS

Page 2: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

的一般 PC 檔案即可使用 SAV/RST 指令備份/回複

二: 使用 FTP 方式將步驟2所產生的資料庫檔案傳送到 PC 的 FTP 伺服器

三: 於 AS/400(iSeries) 及 PC 端撰寫 Socket 程式,傳送步驟2所產

生的資料庫檔案至 PC。 在這裡我僅以方式一來做例子。 要如何將上述三個步驟組合自動處理而不用人工介入輸入指令呢? 這起始點是如何取得放置於輸出佇列中報表的詳細資料,您可以藉由系統所提供

用以連結輸出佇列(Outq)的資料佇列(DTAQ -- Data Queue)來取得放置於輸出佇

列(Outq)中報表的詳細資料,來完成第一個步驟,所以第一步是藉由下述指令新

增一個資料佇列(DTAQ -- Data Queue)於一個專屬的程式庫(Library)中,為了管 理方便定義資料佇列名稱與輸出佇列相同。例如輸出佇列(Outq)為 DAILYOUTQ, CRTDTAQ DTAQ(lib/DAILYOUTQ) MAXLEN(128) 然後新增一個輸出佇列(Outq),同時指定 DTAQ(Data Queue) 參數連結上述指令

所新增的資料佇列(DTAQ --Data Queue),指令如下, 若是新增 Outq 使用指令 CRTOUTQ OUTQ(lib/DAILYOUTQ) DTAQ(lib/DAILYOUTQ) 或 更改既有 Outq 使用指令 CHGOUTQ OUTQ(lib/DAILYOUTQ) DTAQ(lib/DAILYOUTQ) 當要取消連結指定 DTAQ(Data Queue)時,使用指令 CHGOUTQ OUTQ(lib/DAILYOUTQ) DTAQ(*NONE) 在上述例子中 "lib" 是您所希望放置輸出佇列 Outq(Output Queue)及 資料佇列

DTAQ(Data Queue) 物件的程 式庫(附註:Outq 及 Dtaq 可以放置於不同的程式庫)。 上述指令在輸出佇列 DAILYOUTQ 及資料佇列 DAILYOUTQ 間建立了一個連

結關係,所以當有報表放置於輸出佇列 DAILYOUTQ 時,同時會有一筆該報表

Page 3: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

的相關資料放置於資料佇列 DAILYOUTQ 中。 放置於資料佇列 AUTOSPLDTAQ 中資訊的長度有 128 位,包含如下資訊: 報表資訊放置於資料佇列 DTAQ(Data Queue)的資料格式 起始位置 長度 說明 1 CHAR(10) Function "*SPOOL" 表此筆記錄是報表相關資訊 11 CHAR(02) Record type "01" 表示已放置至輸出佇列的報表狀

態為 Ready 13 CHAR(26) Qualified job name 產生此報表的 Job 全名

CHAR(10) Job name CHAR(10) User name CHAR(6) Job number

39 CHAR(10) Spool file name 表示已放置至輸出佇列報表的報

表名稱 49 BINARY(4) Spool file number 表示已放置至輸出佇列報表的報

表序號 53 CHAR(20) Qualified output queue name 表示此報表所放置的輸

出佇列名稱全名 CHAR(10) Output queue name CHAR(10) Library of the output queue

73 CHAR(56) 56 bytes of filler 此 56 位保留不用

上述資訊可能用於指令 CPYSPLF 及 CPYTOSTMF。 要記住當有有一份新的報表放置於輸出佇列 Outq(Output Queue)中時,而且該報

表的狀態是 Ready(RDY),此時即有一筆報表紀錄放置於資料佇列 DTAQ(Data Queue)中,所以我們需要一個批次工作用以監控是否有新的報表資訊放置於資料

佇列 DTAQ(Data Queue) 中。 下列是用於處理這個程序的 CLP 程式片斷,底下是依照報表資訊放置於資料佇

列 DTAQ(Data Queue)的資料格式用於接收資料佇列 DTAQ(Data Queue)資料的

資料結構: ChgVar &Action ( %Sst( &Data 1 10 ) )

ChgVar &Job ( %Sst( &Data 13 10 ) )

ChgVar &User ( %Sst( &Data 23 10 ) )

Page 4: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

ChgVar &JobNbr ( %Sst( &Data 33 6 ) )

ChgVar &SplFName ( %Sst( &Data 39 10 ) )

ChgVar &SplFNbr ( %Bin( &Data 49 4 ) )

ChgVar &OutQName ( %Sst( &Data 53 10 ) )

ChgVar &OutQLib ( %Sst( &Data 63 10 ) )

這個資料結構包含從資料佇列 DTAQ(Data Queue) 所取得的資訊,job name,job user,job number,file name 及 file number 是重要的資訊,並提供給指令 CPYSPLF 使用。 下列是接收資料佇列 DTAQ(Data Queue) 報表資訊所使用的 CLP 運算: Call QRcvDtaQ +

( +

&OutQName +

&DtaQLib +

&DataLen +

&Data +

&Wait +

)

欄位 Wait 值為 -1,表示接收資料佇列 DTAQ(Data Queue) 報表資訊時,若資

料佇列 DTAQ(Data Queue)沒有報表資訊紀錄時,即一直等待至有資訊時才讀

取,等待時並不會耗用系統資源。如果程式還要執行除了處理資料佇列 DTAQ(Data Queue) 之外的其他工作時,Wait 值也可以設定一個以秒為單位的

值,以符合您的需求。 接著要進行第二個步驟,也就是寫一支處理報表的程式,要使用指令 CPYSPLF 複製報表資料至資料庫檔案。 這個工作類似大部分系統管理人員所要做的,有時候系統管理人員需要拷貝報表

資料給公司內部人員或廠商使用,或將儲存報表資料並拷貝至磁帶後,再將報表

及儲存報表的資料庫檔案刪除,才能釋放系統儲存空間,有需要使用時再回複

(restore)回系統。在這裡我想將報表分享給 PC 使用者,所以我將儲存報表的資

料庫檔案拷貝至 IFS 的一個目錄,並將該目錄分享出來,如同一般 PC 的網路

磁碟機,PC 使用者可以透過網路磁碟機,直接讀取報表。您可以使用 Client Access Operation Navigator 將在 IFS 下放置報表的目錄分享出來。 複製報表資料至資料庫檔案包含二個步驟,首先,新增一個資料庫檔案用以存放

Page 5: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

報表資料,接著,複製報表資料至資料庫檔案。我新增一個資料庫檔案於程式館 QTEMP 中,並將報表複製至 QTEMP/SPLF 中: ChkObj OBJ(Qtemp/Splf) ObjType(*File)

Monmsg CPF9801 Exec(Do)

CrtPf File(Qtemp/Splf) RcdLen(240) IgcDta(*Yes) +

Size(*NOMAX)

EndDo

ClrPfm File(Qtemp/Splf)

CpySplf File(&SplfName) +

ToFile(Qtemp/Splf) +

Job(&JobNbr/&User/&Job) +

SplNbr(&SplfNbr)

在步驟一及步驟二已完成了擷取報表相關資訊及複製報表資料至資料庫檔案,接

著步驟三要拷貝含有報表資料的資料庫檔案至 IFS 分享目錄的 stream file,所

謂的 stream file 是一個以位元(Byte)為單位的檔案,他是一個連續性的檔案,而

不是 AS/400(iSeries) 資料庫以欄位為基礎的紀錄格式(record format)檔案,

stream file 並沒有欄位,而是像 PC 的純文字格式的檔案,所以是由程式來決定

它的結構,stream file 使用於非資料庫結構的資料,如影像檔,聲音檔,最重要

的是文件檔。 使用指令 CPYTOSTMF(Copy to Stream File) 或 CPYTOIMPF(Copy to Import File),拷貝資

料庫檔案至 IFS 分享目錄的 stream file,其中 CPYTOIMPF 較適用於拷貝大量

資料,下列是執行範例: CPYTOSTMF

FROMMBR('/QSYS.LIB/QTEMP.LIB/CPY123456.FILE/CPY123456.MBR') TOSTMF('/spool/QSYSPRT-201134-0001.txt') STMFOPT(*REPLACE) STMFCODPAG(*PCASCII)

CPYTOSTMF

FROMMBR('/QSYS.LIB/QTEMP.LIB/CPY123456.FILE/CPY123456.MBR') TOSTMF('/spool/QSYSPRT-201134-0001.txt') STMFOPT(*REPLACE)

STMFCODPAG(950)

Page 6: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

CPYTOSTMF FROMMBR('/QSYS.LIB/QTEMP.LIB/CPY123456.FILE/CPY123456.MBR')

TOSTMF('/spool/QSYSPRT-201134-0001.txt') STMFOPT(*REPLACE) CVTDTA(*AUTO) DBFCCSID(*FILE) STMFCODPAG(950) 參數 CVTDTA(*AUTO) 及 DBFCCSID(*FILE) 是預設值可以不用設,在此僅列

出參考。或 CPYTOIMPF FROMFILE(QTEMP/CPY123456)

TOSTMF('/spool/QSYSPRT-201134-0001.txt') MBROPT(*REPLACE) STMFCODPAG(*PCASCII) RCDDLM(*CRLF) STRDLM(*NONE) CPYTOIMPF FROMFILE(QTEMP/CPY123456)

TOSTMF('/spool/QSYSPRT-201134-0001.txt') MBROPT(*REPLACE) STMFCODPAG(950) RCDDLM(*CRLF) STRDLM(*NONE) 上述 STMFCODPAG 指的是 PC 的字元頁碼,您可以特別指定 950 是中文 Big5 的字元頁碼,若使用 *PCASCII,則系統會自行依照相關系統資訊運算出

您的 PC 字元頁碼,這會花少許時間,不過使用者不會有延遲的感覺,我傾 像使用較明確的指定 PC 的字元頁碼,這樣較不會混淆。不過我於範例中使用 STMFCODPAG(*PCASCII)。

Page 7: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

當轉換中文時,系統會自動將中文控制碼 0E 及 0F 裁掉,所以資料會往左靠,

您將需要於轉換前作額外的處理,如將加一個空白於 0E 前及 0F 後,例如寫

一支 RPG 程式來處理(我已將此程序撰寫於 CVTSPLSTMF 指令處理程式

中,請參閱附註),下列詳細說明整個 0E 及 0F 的處理方式: 未處理 0E, 0F 時 位置 .123456789012

原來資料 .0 0

.E 中文 F123

轉換後的資料 .中文 123

====>資料會往左靠,

造成有中文的報表格式

位移 處理 0E, 0F 時 位置 .123456789012

原來資料 .0 0

.E 中文 F123

原來資料插入空白後 . E 中文 F 123

轉換後的資料 . 中文 123

<==== 於 0E 前插入

一個空白及 0F 後插入

一個空白

====>將中文控制碼 0E 及 0F 裁掉後,資料

與原來資料格式一樣,

所以中文的報表格式正

確 我在範例中使用 CPYSPLF 及 CPYTOSTMF 執行拷貝的動作, 下列是 CLP 範例: CpySplf File(&SplfName) + ToFile(Qtemp/Splf) +

Job(&JobNbr/&User/&Job) +

SplNbr(&SplfNbr)

/* HERE YOU CAN RETRIEVE SPOOLED FILE ATTRIBUTES. */

ChgVar %BIN(&RECLEN) 3000

ChgVar &JobQual (&Job *Cat &User *Cat &JOBNBR)

ChgVar %BIN(&SplFNbrBin) &SplfNbr

Page 8: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

ChgVar &SplFNbrC &SplfNbr

CALL QUSRSPLA (&RECEIVER &RECLEN +

'SPLA0100' &JOBQUAL ' ' ' ' &SPLFName +

&SplfNbrBin)

ChgVar &OpnDat %SST(&RECEIVER 204 6)

ChgVar &OpnTim %SST(&RECEIVER 210 6)

ChgVar &DT (&OpnDat *CAT &OpnTim)

ChgVar &IfsFile (&Job *TCAT '_' *CAT +

&User *TCAT '_' *CAT &JobNbr *TCAT '_' *CAT +

&SPLFNBRC *CAT '_' *CAT +

&DT *CAT '_' *CAT &SPLFNAME *TCAT '.txt')

CHGVAR &Path ('/spool/' *CAT &IfsFile)

CPYTOSTMF FROMMBR('/qsys.lib/qtemp.lib/splf.file/splf.mbr') +

TOSTMF(&Path) +

STMFOPT(*REPLACE) +

STMFCODPAG(*PCASCII) 上述程式碼中參數 FROMMBR 指定 CPYSPLF 指令所輸出的資料庫檔案名

稱,FROMMBR 參數所指定的格式不同於 AS/400(iSeries)的傳統檔案格式,我

雖指定 AS/400(iSeries) 的傳統檔案,但使用 IFS 的檔案結構格式,檔名以 "/QSYS.LIB" 開頭表示指定 AS/400(iSeries) 的傳統檔案,接著下一層是 "/QTEMP.LIB",且也需要指定檔案成員名稱。一個於 AS/400(iSeries)的傳統

(QSYS)檔案中的物件均需要以 ".LIB",".FILE",".MBR" 結尾,這是

CPYTOSTMF 指令及其他相關 IFS 整合性檔案系統的指令所必須的,就如同 PC 或 Unix 的目錄架構。 這個 TOSTMF(To Stream File) 參數是由一個目錄(在這個例子中是指定 "/home/user",但您也可以自行指定)及最後加上以 Job_User_JobNbr_SplNbr_OpendateOpenTime_SplfName.txt 格式組成 Ifs 檔案名

稱。 這個 STMFCODPAG(Stream File Code Page) 有多個參數值,其中二個重要的參

Page 9: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

數值 *PCASCII 及 *STDASCII,STDASCII 參數值是使用於 IBM PC 所使用

的字元編碼,一般是使用 *PCASCII,所指的是一般 Windows 應用軟體所使用

的格式,而 STMFOPT (File Options) 參數是所拷貝的資料是要加入檔尾或覆蓋

原有資料的選項,執行 CPYTOSTMF 指令,拷貝資料庫檔案的報表內容至 IFS 的目錄中。 接著我們需要將存放報表的 IFS 目錄分享出來,所以要設定一個 AS/400 NetServer 的目錄分享,AS/400 NetServer 提供分享 IFS 目錄的功能,來讓

Windows PC 當成網路磁碟機,新增目錄分享只要執行一次,AS/400 會保留目

錄分享直到刪除該目錄的分享設定,此刪除動作並不會刪除該分享目錄的資料而

僅刪除該目錄的分享設定。 設定 AS/400 NetServer 目錄分享,可以藉由 Operations Navigator 或 APIs 完

成,有許多的 AS/400 NetServerAPI 可供使用: 1. V5R2 已提供所有 NetServer API 工具於程式庫 QUSRTOOL 中

http://www-1.ibm.com/servers/eserver/iseries/netserver/qusrtool.htm,請參照該網

頁內容安裝該 GO NETS Command Screen Tool ),此工具包含所有 Netserver 的 5250 終端模式操作介面。

NETS NETS Menu

Select one of the following:

1. Start iSeries NetServer

2. End iSeries NetServer

3. Add File Share

4. Change File Share

5. Add Print Share

6. Change Print Share

7. Display Share

8. Remove Share

9. Change Attributes

10. Display Attributes

11. Work with Shares

12. Work with NetServer Users

13. Display NetServer Information

14. Send NetServer Message

Selection or command

===>

Page 10: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

2. 利用 iSeries Access 安裝 Navigator,利用 Navigator 管理介面管理

Netserver,參照 Configuration through iSeries Navigator http://www-03.ibm.com/servers/eserver/iseries/netserver/wnn-tcpip.html 在這篇文章中,我們提到從拷貝報表資料至資料庫檔案,再從資料庫檔案拷貝至 IFS 的分享目錄中,並設定目錄分享,讓 Windows 使用者可以可以從網路磁碟

機存取資料,藉由這些步驟,您能自行整合從 AS/400 的報表至 Windows PC 的

文字檔,並將此流程自動化。 附註: 詳細資訊請參照 OS/400 Printer Device Programming V4R4 http://publib.boulder.ibm.com/cgi-bin/bookmgr/books/qb3auj03/COVER Printer Device Programming V5R3 http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/books/sc415713.pdf AS/400(iSeries) NetServer http://www-03.ibm.com/servers/eserver/iseries/netserver/ http://www-03.ibm.com/servers/eserver/iseries/netserver/fastpath.html Netserver API 使用範例: http://www-03.ibm.com/servers/eserver/iseries/netserver/apiminiguide.html iSeries Access http://www-03.ibm.com/servers/eserver/iseries/access/ Vengoal AS/400 日誌 2007-11-05 如何將報表轉為 Text 或 Html 格式 ? (Command:CVTSPLSTMF) http://blog.xuite.net/vengoal/as400 您可以直接 CVTSPLSTMF 指令於 CLP CPYSPL2IFS 中,取代 CPYSPLF and CPYTOSTMF 指令,CVTSPLSTMF 已經處理中文位移的問題。

Page 11: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

原始碼: 在此我僅給您一個間單的 Outq 監控的範例 MONOUTQ Command 範例, 包含一支 command source : MONOUTQ,二支 CLP MONOUTQC 及 CPYSPL2IFS 及 新增目錄分享 ADDSHARE 指令。 ===============================================================================

Monitor Output Queue (MONOUTQ)

Type choices, press Enter.

Output queue . . . . . . . . . . OUTQ

Library . . . . . . . . . . . *LIBL

Process outq entry program . . . PRCPGM

Library . . . . . . . . . . . *LIBL

Delete file after process . . . DLTSPLF *NO

===============================================================================

參數說明: Outq :監控的 outq PrcPgm :處理報表的資料佇列訊息程式 DltSplf:處理完後,是否刪除該報表 使用範例: CRTDTAQ DTAQ(QGPL/DEMOOUTQ) MAXLEN(128) CRTOUTQ OUTQ(QGPL/DEMOOUTQ) DTAQ(QGPL/DEMOOUTQ) 或 CRTDTAQ DTAQ(QGPL/OUTQ1) MAXLEN(128) CHGOUTQ OUTQ(QGPL/OUTQ1) DTAQ(QGPL/OUTQ1) 此範例中 DTAQ 名稱須與 OUTQ 名稱一樣且位在同一個 Library,便於控管。 使用指令啟動監控 Outq 機制, SBMJOB CMD(MONOUTQ OUTQ(QGPL/DEMOOUTQ)

PRCPGM(QGPL/CPYSPL2IFS) DLTSPLF(*NO)) JOB(DEMOOUTQ)

使用指令 ENDJOB 或 WRKACTJOB 選項 4 即可停止 job DEMOOUT,終止

監控 Outq。

Page 12: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

使用 Command CHGSPLFA 將報表更改參數 Dev(*OUTQ) Outq(QGPL/DEMOOUTQ) 即可將報表複製至 IFS 目錄 /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

Page 13: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

選項 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

QPADEV000J_VENGOAL_089599_0005_071030114800_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

MONOUTQ command CPP source: Usage: CRTCL PGM(lib/MonOutqC) SrcFile(lib/qclsrc) SrcMbr(MonOutqC) /* =============================================================== */

/* = Program....... MonOutqC CPP = */

/* = Source type... CLP = */

/* = Description... Monitor output queue = */

/* = --------------------------------------------------------- = */

/* = Parameters = */

/* = = */

/* = &OutqName Input Monitor Outq Name = */

/* = &PrcPgmName Input Process Splf Entry program = */

/* = &DltSplf Input Delete Splf after processing = */

/* = &DtaqLib Input Data queue library = */

/* = = */

/* =============================================================== */

/* = Date : 2007/09/17 = */

/* = Author: Vengoal Chang = */

/* =============================================================== */

Page 14: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

Pgm ( +

&OutqNameQ +

&PrcPgmName +

&DltSplf +

&DtaqLib +

)

/* =============================================================== */

/* = Variable declarations = */

/* =============================================================== */

Dcl &OutqNameQ *Char ( 20 )

Dcl &PrcPgmName *Char ( 20 )

Dcl &DltSplf *Char ( 4 )

Dcl &DtaqLib *Char ( 10 )

Dcl &Data *Char ( 128 )

Dcl &DataLen *Dec ( 5 0 )

Dcl &Wait *Dec ( 5 0 ) ( -1 )

Dcl &EndSts *Char ( 1 )

Dcl &RcvVar *Char ( 600 )

Dcl &RcvVarLen *Char ( 4 ) ( X'00000258' )

Dcl &Format *Char ( 8 ) ( 'JOBI0700' )

Dcl &QualJob *Char ( 26 ) ( '*' )

Dcl &IntJobID *Char ( 16 )

Dcl &PrdLib *Char ( 10 )

Dcl &Offset *Dec ( 4 0 )

Dcl &Nbr4 *Dec ( 4 0 )

Dcl &Action *Char ( 10 )

Dcl &Job *Char ( 10 )

Dcl &User *Char ( 10 )

Dcl &JobNbr *Char ( 6 )

Dcl &SplFName *Char ( 10 )

Dcl &SplFNbr *Dec ( 4 0 )

Dcl &OutQName *Char ( 10 )

Dcl &OutQLib *Char ( 10 )

Dcl &PgmName *Char ( 10 )

Dcl &PgmLib *Char ( 10 )

Dcl &MsgID *Char ( 7 )

Page 15: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

Dcl &MsgDta *Char ( 100 )

Dcl &MsgF *Char ( 10 )

Dcl &MsgFLib *Char ( 10 )

/* =============================================================== */

/* = Global error monitor = */

/* =============================================================== */

MonMsg ( CPF0000 MCH0000 ) Exec( +

GoTo Error )

ChgVar &OutQName ( %Sst( &OutqNameQ 1 10 ) )

ChgVar &OutQLib ( %Sst( &OutqNameQ 11 10 ) )

ChgVar &PgmName ( %Sst( &PrcPgmName 1 10 ) )

ChgVar &PgmLib ( %Sst( &PrcPgmName 11 10 ) )

/* =============================================================== */

/* = Verify output queue monitor data queue existence = */

/* =============================================================== */

RtvObjD Obj( &OutQLib/&OutQName ) +

ObjType( *OutQ ) +

RtnLib( &OutQLib )

MonMsg ( CPF9801 ) Exec( +

Do )

SndPgmMsg MsgID( CPF9898 ) +

MsgF( QSys/QCPFMsg ) +

MsgDta( 'Output queue' +

*BCat +

&OutQName +

*BCat +

'does not exist in library' +

*BCat +

&OutqLib +

) +

MsgType( *Escape )

EndDo

Page 16: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

ChkObj Obj( &DtaqLib/&OutQName ) +

ObjType( *DtaQ )

MonMsg ( CPF9801 ) Exec( +

Do )

SndPgmMsg MsgID( CPF9898 ) +

MsgF( QSys/QCPFMsg ) +

MsgDta( 'Data queue' +

*BCat +

&OutQName +

*BCat +

'does not exist in library' +

*BCat +

&DtaqLib +

*TCat '.' *Bcat +

'Use command:' *Bcat +

'CrtDtaQ DtaQ(' *Tcat +

&DtaqLib *Tcat '/' *CAT +

&OutQName *Tcat ')' *Bcat +

'MaxLen(128) Force(*Yes) SenderID( *No )' +

*BCAT +

'for store outq splf entry information.' +

) +

MsgType( *Escape )

EndDo

RtvObjD Obj( &PgmLib/&PgmName ) +

ObjType( *Pgm ) +

RtnLib( &PgmLib )

MonMsg ( CPF9801 ) Exec( +

Do )

SndPgmMsg MsgID( CPF9898 ) +

MsgF( QSys/QCPFMsg ) +

MsgDta( 'Program' +

*BCat +

&PgmName +

*BCat +

'does not exist in library' +

Page 17: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

*BCat +

&PgmLib +

) +

MsgType( *Escape )

EndDo

ChgOutQ OutQ( &OutQLib/&OutQName ) +

DtaQ( &DtaqLib/&OutQName)

/* =============================================================== */

/* = Allocate output queue monitor data queue = */

/* =============================================================== */

AlcObj Obj( ( &DtaqLib/&OutQName *DtaQ *Excl ) ) +

Wait( 1 )

MonMsg ( CPF1002 ) Exec( +

SndPgmMsg MsgID( CPF9898 ) +

MsgF( QSys/QCPFMsg ) +

MsgDta( 'Output queue monitor' +

*BCat +

&OutQName +

*BCat +

'is already active' ) +

MsgType( *Escape ) )

/* =============================================================== */

/* = Wait for a data queue entry = */

/* =============================================================== */

Loop01:

Call QRcvDtaQ +

( +

&OutQName +

&DtaQLib +

&DataLen +

&Data +

Page 18: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

&Wait +

)

/* =============================================================== */

/* = Perform requested action = */

/* =============================================================== */

If ( &DataLen *GT 0 ) +

Do

ChgVar &Action ( %Sst( &Data 1 10 ) )

/* --------------------------------------------------------------- */

/* - Spooled file arrived on output queue - */

/* --------------------------------------------------------------- */

If ( &Action *Eq '*SPOOL' ) +

Do

ChgVar &Job ( %Sst( &Data 13 10 ) )

ChgVar &User ( %Sst( &Data 23 10 ) )

ChgVar &JobNbr ( %Sst( &Data 33 6 ) )

ChgVar &SplFName ( %Sst( &Data 39 10 ) )

ChgVar &SplFNbr ( %Bin( &Data 49 4 ) )

ChgVar &OutQName ( %Sst( &Data 53 10 ) )

ChgVar &OutQLib ( %Sst( &Data 63 10 ) )

Call &PgmLib/&PgmName +

( +

&Job +

&User +

&JobNbr +

&SplFName +

&SplFNbr +

&OutQName +

&OutQLib +

&DltSplf +

)

EndDo

/* --------------------------------------------------------------- */

/* - Request to end output queue monitor received - */

Page 19: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

/* --------------------------------------------------------------- */

If ( &Action *Eq '*ENDMON' ) +

Goto End

EndDo

Else Do

/* ----------------------------------------------------------------- */

/* Time out (Check if the job must end) */

/* ----------------------------------------------------------------- */

RtvJobA EndSts(&EndSts)

If (&EndSts *EQ '1') (GoTo End)

Else (GoTo Loop01)

EndDo

GoTo Loop01

End:

Return

/* =============================================================== */

/* = Error handler = */

/* =============================================================== */

Error:

RcvMsg MsgType( *Excp ) +

MsgDta( &MsgDta ) +

MsgID( &MsgID ) +

MsgF( &MsgF ) +

MsgFLib( &MsgFLib )

MonMsg ( CPF0000 MCH0000 )

SndPgmMsg MsgID( &MsgID ) +

MsgF( &MsgFLib/&MsgF ) +

MsgDta( &MsgDta ) +

Page 20: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

MsgType( *Escape )

MonMsg ( CPF0000 MCH0000 )

/* =============================================================== */

/* = End of program = */

/* =============================================================== */

EndPgm

MONOUTQ command source Usage : CrtCmd Cmd(lib/MonOutq) Pgm(lib/MonOutqC) /* =============================================================== */

/* = Command....... MonOutQ = */

/* = Source type... CMD = */

/* = Description... Monitor Output Queue = */

/* = = */

/* = CPP........... MonOutQ = */

/* = = */

/* =============================================================== */

/* = Date : 2007/09/17 = */

/* = Author: Vengoal Chang = */

/* =============================================================== */

Cmd Prompt( 'Monitor Output Queue' )

Parm Kwd( OutQ ) +

Type( QualOutQ ) +

Min( 1 ) +

Prompt( 'Output queue' )

Parm Kwd( PrcPgm ) +

Type( QualOutQ ) +

Min( 1 ) +

Prompt( 'Process outq entry program' )

Parm Kwd( DltSplf) +

Type( *Char ) +

Page 21: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

Len( 4 ) +

Rstd( *Yes ) +

Dft( *NO ) +

Values(*YES *NO) +

Prompt( 'Delete file after process ' )

Parm Kwd( DtaqLib ) +

Type( *name ) +

Constant( OutqMon ) +

QualOutQ: Qual Type( *Name ) +

Len( 10 )

Qual Type( *Name ) +

Len( 10 ) +

Dft( *LibL ) +

SpcVal( ( *LibL ) +

( *CurLib ) ) +

Prompt( 'Library' )

PrcPgm :處理報表的資料佇列訊息程式範例 CPYSPL2IFS CLP: Usage: CRTCLPGM PGM(lib/CPYSPL2IFS) SrcFile(lib/qclsrc) SrcMbr(CPYSPL2IFS) (此範例並未處理 0E,0F 控制碼位移的問題,處理 0E,0F 請參照 CVTSPLSTMF command) /* =============================================================== */

/* = Program....... CPYSPL2IFS = */

/* = Source type... CLP = */

/* = Description... Monitor output queue processor to = */

/* = copy spooled file to DB and = */

/* = send notification message to user = */

/* = = */

/* = This program just for demo MONOUTQ could = */

/* = run by any splf processing purpose. = */

/* = = */

/* = For example, convert to Text, PDF, HTML, = */

/* = PDF and mail or FTP the document = */

Page 22: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

/* = = */

/* = --------------------------------------------------------- = */

/* = Parameters = */

/* = = */

/* = &Job Input Spooled file job name = */

/* = &User Input Spooled file user = */

/* = &JobNbr Input Spooled file job number = */

/* = &SplFName Input Spooled file name = */

/* = &SplFNbr Input Spooled file number = */

/* = &OutQName Input Spooled file OutQ name = */

/* = &OutQLib Input Spooled file OutQ library = */

/* = &DltSplf Input Spooled file deleted or not = */

/* = = */

/* =============================================================== */

Pgm +

( +

&Job +

&User +

&JobNbr +

&SplFName +

&SplFNbr +

&OutQName +

&OutQLib +

&DltSplf +

)

/* =============================================================== */

/* = Variable declarations = */

/* =============================================================== */

Dcl &Job *Char ( 10 )

Dcl &User *Char ( 10 )

Dcl &JobNbr *Char ( 6 )

Dcl &SplFName *Char ( 10 )

Dcl &SplFNbr *Dec ( 4 0 )

Dcl &SplFNbrBin *Char ( 4 )

Dcl &SplFNbrC *Char ( 4 )

Dcl &OutQName *Char ( 10 )

Dcl &OutQLib *Char ( 10 )

Page 23: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

Dcl &DltSplf *Char ( 4 )

Dcl &IFSFILE *Char ( 80 )

Dcl &PATH *Char ( 300 )

Dcl &DT *Char ( 12 )

Dcl &DATFMT *Char ( 3 )

Dcl &Date *Char ( 6 )

Dcl &Time *Char ( 6 )

Dcl &JobQual *Char (26)

Dcl &Receiver *Char (3000)

Dcl &RecLen *Char (4)

Dcl &OpnDat *Char (6)

Dcl &OpnTim *Char (6)

Dcl &Ok *Char (1)

/* =============================================================== */

/* = Copy spooled file to DB and do any other function you need = */

/* = For example, Convert SplF to PDF, send splf text, FTP etc. = */

/* =============================================================== */

ChkObj OBJ(Qtemp/Splf) ObjType(*File)

Monmsg CPF9801 Exec(Do)

CrtPf File(Qtemp/Splf) RcdLen(240) IgcDta(*Yes) +

Size(*NOMAX)

EndDo

ClrPfm File(Qtemp/Splf)

CpySplf File(&SplfName) +

ToFile(Qtemp/Splf) +

Job(&JobNbr/&User/&Job) +

SplNbr(&SplfNbr)

/* HERE YOU CAN RETRIEVE SPOOLED FILE ATTRIBUTES. */

ChgVar %BIN(&RECLEN) 3000

ChgVar &JobQual (&Job *Cat &User *Cat &JOBNBR)

ChgVar %BIN(&SplFNbrBin) &SplfNbr

ChgVar &SplFNbrC &SplfNbr

Page 24: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

CALL QUSRSPLA (&RECEIVER &RECLEN +

'SPLA0100' &JOBQUAL ' ' ' ' &SPLFName +

&SplfNbrBin)

ChgVar &OpnDat %SST(&RECEIVER 204 6)

ChgVar &OpnTim %SST(&RECEIVER 210 6)

ChgVar &DT (&OpnDat *CAT &OpnTim)

ChgVar &IfsFile (&Job *TCAT '_' *CAT +

&User *TCAT '_' *CAT &JobNbr *TCAT '_' *CAT +

&SPLFNBRC *CAT '_' *CAT +

&DT *CAT '_' *CAT &SPLFNAME *TCAT '.txt')

MD '/spool'

MONMSG CPF0000

CHGVAR &Path ('/spool/' *CAT &IfsFile)

CHGVAR &OK '1'

CPYTOSTMF FROMMBR('/qsys.lib/qtemp.lib/splf.file/splf.mbr') +

TOSTMF(&Path) +

STMFOPT(*REPLACE) +

STMFCODPAG(*PCASCII)

MONMSG CPF0000 EXEC(DO)

CHGVAR &OK '0'

ENDDO

/* =============================================================== */

/* = Send notification message = */

/* =============================================================== */

If (&OK *EQ '1') Do

If (&DltSplf *EQ '*YES') +

DltSplf File(&Splfname) +

Job(&JobNbr/&User/&Job) +

SplNbr(&SplfNbr) +

Page 25: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

SndUsrMsg Msg( 'Spooled file' +

*BCat +

&SplFName +

*BCat +

'in output queue' +

*BCat +

&OutQLib +

*TCat +

'/' +

*TCat +

&OutQName +

*BCat +

'copy to' *BCAT &path *TCAT '.') +

MsgType( *Info ) +

ToUsr( &User )

EndDo

Else +

SndUsrMsg Msg( 'Spooled file' +

*BCat +

&SplFName +

*BCat +

'in output queue' +

*BCat +

&OutQLib +

*TCat +

'/' +

*TCat +

&OutQName +

*BCat +

'copy to' *BCAT &path *TCAT 'failed') +

MsgType( *Info ) +

ToUsr( &User )

Return

/* =============================================================== */

/* = End of program = */

/* =============================================================== */

Page 26: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

EndPgm

新增 OS/400 的目錄分享指令範例 使用範例: 分享 OS/400 CD Drive 給 Windows 使用者 ADDSHARE SHARENAME(AS400CD) PATHNAME('/QOPT') TEXTDESC('AS400 CD DRIVER') 分享上述範例轉換後的 報表給 Windows 使用者 ADDSHARE SHARENAME(spool) PATHNAME('/spool') TEXTDESC('Spooled file') 於 windows 端執行 \\as400-ip (as400-ip 表 AS/400 主機的 IP 位址),輸入 AS/400 使用者及密碼,檔案管理員中會看到 spool 的目錄。 -----------------------------------------------------------------------

CMD Creation

CRTCMD CMD(yourlib/ADDSHARE) PGM(yourlib/ADDSHARE) +

SRCFILE(yourlib/yourPFSourceFile) SRCMBR(ADDSHARECM)

-----------------------------------------------------------------------

ADDSHARECM.CMD Source

CMD

PARM KWD(SHARENAME) TYPE(*CHAR) LEN(12) +

CHOICE('New Share Name (MAX:12 chars)') +

PMTCTL(*PMTRQS) PROMPT('Share Name')

PARM KWD(PATHNAME) TYPE(*CHAR) LEN(20) +

CHOICE('First char must be slash U/U') +

PMTCTL(*PMTRQS) PROMPT('Share Path') /* +

'First char must be slash U/U' */

PARM KWD(TEXTDESC) TYPE(*CHAR) LEN(50) +

CHOICE('Share Comment') PMTCTL(*PMTRQS) +

PROMPT('Share comment') /* 'Share comment' */

PARM KWD(PERMS) TYPE(*CHAR) LEN(4) RTNVAL(*NO) +

Page 27: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

RSTD(*YES) DFT(1) VALUES(1 2) +

CHOICE('Permissions (1: R/O, 2:R/W)') +

PMTCTL(*PMTRQS) PROMPT('Permissons') /* +

'1: READ/ONLY 2:READ/WRITE' */

PARM KWD(MAXUSERS) TYPE(*CHAR) LEN(4) RSTD(*NO) +

DFT(-1) RANGE(-1 255) CHOICE('Max users +

(-1 to 255,-1:NOMAX)') PMTCTL(*PMTRQS) +

PROMPT('Max users')

-----------------------------------------------------------------------

ADDSHARE.CLP Source

/*****************************************************************/

/* */

/* ADD WINDOWS SHARE FOR AS/400 */

/* 21.02.2002 MAB13 */

/*****************************************************************/

PGM PARM(&SHARENAME &PATHNAME &TEXTDESC &PERMS &MAXUSERS)

DCL VAR(&SHARENAME ) TYPE(*CHAR) LEN(12)

DCL VAR(&PATHNAME ) TYPE(*CHAR) LEN(20)

DCL VAR(&PATHNAMEL) TYPE(*CHAR) LEN(4)

DCL VAR(&CCSPATHN) TYPE(*CHAR) LEN(4)

DCL VAR(&TEXTDESC) TYPE(*CHAR) LEN(50)

DCL VAR(&PERMS) TYPE(*CHAR) LEN(4)

DCL VAR(&PERMSP) TYPE(*CHAR) LEN(4)

DCL VAR(&MAXUSERS) TYPE(*CHAR) LEN(4)

DCL VAR(&MAXUSERSP) TYPE(*CHAR) LEN(4)

DCL VAR(&ERRORCODE) TYPE(*CHAR) LEN(255)

DCL &LENGTH *DEC LEN(2) VALUE(20)

DCL &LENGTHC *CHAR LEN(4)

CHGVAR VAR(%BIN(&CCSPATHN)) VALUE(0)

CHGVAR VAR(%BIN(&MAXUSERSP)) VALUE(&MAXUSERS)

Page 28: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

CHGVAR VAR(%BIN(&PERMSP)) VALUE(&PERMS)

LOOP:

IF (%SUBSTRING(&PATHNAME &LENGTH 1) *EQ ' ') (DO)

CHGVAR VAR(&LENGTH) VALUE(&LENGTH - 1)

IF (&LENGTH *EQ 0) GOTO CMDLBL(EXIT)

GOTO CMDLBL(LOOP)

ENDDO

CHGVAR VAR(&LENGTHC) VALUE(&LENGTH)

CHGVAR VAR(%BIN(&PATHNAMEL)) VALUE(&LENGTHC)

CALL PGM(QZLSADFS) +

PARM(&SHARENAME +

&PATHNAME +

&PATHNAMEL +

&CCSPATHN +

&TEXTDESC +

&PERMSP +

&MAXUSERS +

&ERRORCODE)

IF (&ERRORCODE *NE '*') +

SNDPGMMSG MSG('ERROR CODE:' *CAT &ERRORCODE)

ELSE SNDPGMMSG MSG('SHARED RESOURCES SUCCESSFULY ADDED')

EXIT:

ENDPGM

-----------------------------------------------------------------------

Add File Server Share (QZLSADFS) API Parameters Required Parameter Group: 1 Share name Input CHAR(12) 2 Path name Input CHAR(*) 3 Length of path name Input BINARY(4)

Page 29: 如何讓報表管理自動化? -  · 報表至另一台印表機。 於 OS/400 V5R4 以後,系統開始支援報表備份,系統是將所指定的 Outq 中所 有的報表備份至磁帶中,有需要時,再回復至系統中。

4 CCSID encoding of path name Input BINARY(4) 5 Text description Input CHAR(50) 6 Permissions Input BINARY(4) 7 Maximum users Input BINARY(4) 8 Error code I/O CHAR(*) ----------------------------------------------------------------------- API Error Messages CPF3C1E E Required parameter &1 omitted. CPF3C36 E Number of parameters, &1, entered for this API was not valid. CPF3CF1 E Error code parameter not valid. CPF3CF2 E Error(s) occurred during running of &1 API. CPFA0D4 E File system error occurred. CPFB682 E API &1 failed with reason code &2. CPFB683 E Data conversion failed for API &1. CPFB684 E User does not have the correct authority for API &1. CPFB68A E Error occurred while working with shared resource &2. CPFB68B E Character is not valid for value &3. CPFB68D E Length specified in parameter &2 for API &1 not valid. CPFB693 E Data conversion failed for &5 API. CPIB685 E Error occurred on AS/400 Support for Windows Network Neighborhood (AS/400 NetServer) request.