您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 如何让报表管理自动化
如何讓報表管理自動化?報表管理通常是一般系統管理的工作,AS/400(iSeries)系統已包含以使用者及使用者自己的報表連結相關的印表機及輸出佇列(Outq--OutputQueue)的報表管理技術,通常管理人員會允許使用者使用指令WRKSPLF(WorkwithSpoolFiles)及WRKOUTQ(WorkwithOutputQueues)截取報表資料,這些指令讓使用者管理他們自己的報表,及若某使用者同時擁有*SPLCTL特殊權限時,該使用者同時可以管理其他人的報表,然而使用這些指令仍然無法讓報表管理自動化。使用者仍然需要從一個輸出佇列搬移報表至另一個輸出佇列或從一台印表機搬移報表至另一台印表機。於OS/400V5R4以後,系統開始支援報表備份,系統是將所指定的Outq中所有的報表備份至磁帶中,有需要時,再回復至系統中。為什麼有人想要讓報表管理自動化?因為當報表很多時,如週報月報季報年報累計一段時間後,就會有報表儲存的需求,因為報表本身於AS/400(iSeries)系統上並不是一個物件,於OSV5R3以前無法利用SAVE指令儲存,所以需要採用某些技巧才將報表儲存起來,當然報表可以利用複製報表至資料庫檔案儲存在AS/400(iSeries)或下載至PC上,但報表非常多時便無法一一用手動的方式來完成,所以可以利用其他廠商所開發的報表管理軟體,所以仍需要額外的成本才能完成報表管理自動化的工作,基於成本考量,我將教您如何達成報表管理自動化的方式。其步驟如下:1:取得哪些報表放置於輸出佇列中的詳細資料,即報表管理自動化的先決條件是以輸出佇列(Outq)為管理單位。2:使用指令CPYSPLF複製報表資料至資料庫檔案(PF--Physicalfile)。3:a若僅需儲存報表於AS/400(iSeries)上,則定期備份步驟2所產生的資料庫檔案(需要自行定義資料庫檔案名稱及其member成員名稱,方便於備份及回複管理)。b若僅需儲存報表於PC上,則有三種方式:一:使用指令CPYTOSTMF複製步驟2所產生的資料庫檔案至IFS的一般PC檔案即可使用SAV/RST指令備份/回複二:使用FTP方式將步驟2所產生的資料庫檔案傳送到PC的FTP伺服器三:於AS/400(iSeries)及PC端撰寫Socket程式,傳送步驟2所產生的資料庫檔案至PC。在這裡我僅以方式一來做例子。要如何將上述三個步驟組合自動處理而不用人工介入輸入指令呢?這起始點是如何取得放置於輸出佇列中報表的詳細資料,您可以藉由系統所提供用以連結輸出佇列(Outq)的資料佇列(DTAQ--DataQueue)來取得放置於輸出佇列(Outq)中報表的詳細資料,來完成第一個步驟,所以第一步是藉由下述指令新增一個資料佇列(DTAQ--DataQueue)於一個專屬的程式庫(Library)中,為了管理方便定義資料佇列名稱與輸出佇列相同。例如輸出佇列(Outq)為DAILYOUTQ,CRTDTAQDTAQ(lib/DAILYOUTQ)MAXLEN(128)然後新增一個輸出佇列(Outq),同時指定DTAQ(DataQueue)參數連結上述指令所新增的資料佇列(DTAQ--DataQueue),指令如下,若是新增Outq使用指令CRTOUTQOUTQ(lib/DAILYOUTQ)DTAQ(lib/DAILYOUTQ)或更改既有Outq使用指令CHGOUTQOUTQ(lib/DAILYOUTQ)DTAQ(lib/DAILYOUTQ)當要取消連結指定DTAQ(DataQueue)時,使用指令CHGOUTQOUTQ(lib/DAILYOUTQ)DTAQ(*NONE)在上述例子中lib是您所希望放置輸出佇列Outq(OutputQueue)及資料佇列DTAQ(DataQueue)物件的程式庫(附註:Outq及Dtaq可以放置於不同的程式庫)。上述指令在輸出佇列DAILYOUTQ及資料佇列DAILYOUTQ間建立了一個連結關係,所以當有報表放置於輸出佇列DAILYOUTQ時,同時會有一筆該報表的相關資料放置於資料佇列DAILYOUTQ中。放置於資料佇列AUTOSPLDTAQ中資訊的長度有128位,包含如下資訊:報表資訊放置於資料佇列DTAQ(DataQueue)的資料格式起始位置長度說明1CHAR(10)Function*SPOOL表此筆記錄是報表相關資訊11CHAR(02)Recordtype01表示已放置至輸出佇列的報表狀態為Ready13CHAR(26)Qualifiedjobname產生此報表的Job全名CHAR(10)JobnameCHAR(10)UsernameCHAR(6)Jobnumber39CHAR(10)Spoolfilename表示已放置至輸出佇列報表的報表名稱49BINARY(4)Spoolfilenumber表示已放置至輸出佇列報表的報表序號53CHAR(20)Qualifiedoutputqueuename表示此報表所放置的輸出佇列名稱全名CHAR(10)OutputqueuenameCHAR(10)Libraryoftheoutputqueue73CHAR(56)56bytesoffiller此56位保留不用上述資訊可能用於指令CPYSPLF及CPYTOSTMF。要記住當有有一份新的報表放置於輸出佇列Outq(OutputQueue)中時,而且該報表的狀態是Ready(RDY),此時即有一筆報表紀錄放置於資料佇列DTAQ(DataQueue)中,所以我們需要一個批次工作用以監控是否有新的報表資訊放置於資料佇列DTAQ(DataQueue)中。下列是用於處理這個程序的CLP程式片斷,底下是依照報表資訊放置於資料佇列DTAQ(DataQueue)的資料格式用於接收資料佇列DTAQ(DataQueue)資料的資料結構:ChgVar&Action(%Sst(&Data110))ChgVar&Job(%Sst(&Data1310))ChgVar&User(%Sst(&Data2310))ChgVar&JobNbr(%Sst(&Data336))ChgVar&SplFName(%Sst(&Data3910))ChgVar&SplFNbr(%Bin(&Data494))ChgVar&OutQName(%Sst(&Data5310))ChgVar&OutQLib(%Sst(&Data6310))這個資料結構包含從資料佇列DTAQ(DataQueue)所取得的資訊,jobname,jobuser,jobnumber,filename及filenumber是重要的資訊,並提供給指令CPYSPLF使用。下列是接收資料佇列DTAQ(DataQueue)報表資訊所使用的CLP運算:CallQRcvDtaQ+(+&OutQName+&DtaQLib+&DataLen+&Data+&Wait+)欄位Wait值為-1,表示接收資料佇列DTAQ(DataQueue)報表資訊時,若資料佇列DTAQ(DataQueue)沒有報表資訊紀錄時,即一直等待至有資訊時才讀取,等待時並不會耗用系統資源。如果程式還要執行除了處理資料佇列DTAQ(DataQueue)之外的其他工作時,Wait值也可以設定一個以秒為單位的值,以符合您的需求。接著要進行第二個步驟,也就是寫一支處理報表的程式,要使用指令CPYSPLF複製報表資料至資料庫檔案。這個工作類似大部分系統管理人員所要做的,有時候系統管理人員需要拷貝報表資料給公司內部人員或廠商使用,或將儲存報表資料並拷貝至磁帶後,再將報表及儲存報表的資料庫檔案刪除,才能釋放系統儲存空間,有需要使用時再回複(restore)回系統。在這裡我想將報表分享給PC使用者,所以我將儲存報表的資料庫檔案拷貝至IFS的一個目錄,並將該目錄分享出來,如同一般PC的網路磁碟機,PC使用者可以透過網路磁碟機,直接讀取報表。您可以使用ClientAccessOperationNavigator將在IFS下放置報表的目錄分享出來。複製報表資料至資料庫檔案包含二個步驟,首先,新增一個資料庫檔案用以存放報表資料,接著,複製報表資料至資料庫檔案。我新增一個資料庫檔案於程式館QTEMP中,並將報表複製至QTEMP/SPLF中:ChkObjOBJ(Qtemp/Splf)ObjType(*File)MonmsgCPF9801Exec(Do)CrtPfFile(Qtemp/Splf)RcdLen(240)IgcDta(*Yes)+Size(*NOMAX)EndDoClrPfmFile(Qtemp/Splf)CpySplfFile(&SplfName)+ToFile(Qtemp/Splf)+Job(&JobNbr/&User/&Job)+SplNbr(&SplfNbr)在步驟一及步驟二已完成了擷取報表相關資訊及複製報表資料至資料庫檔案,接著步驟三要拷貝含有報表資料的資料庫檔案至IFS分享目錄的streamfile,所謂的streamfile是一個以位元(Byte)為單位的檔案,他是一個連續性的檔案,而不是AS/400(iSeries)資料庫以欄位為基礎的紀錄格式(recordformat)檔案,streamfile並沒有欄位,而是像PC的純文字格式的檔案,所以是由程式來決定它的結構,streamfile使用於非資料庫結構的資料,如影像檔,聲音檔,最重要的是文件檔。使用指令CPYTOSTMF(CopytoStreamFile)或CPYTOIMPF(CopytoImportFile),拷貝資料庫檔案至IFS分享目錄的streamfile,其中CPYTOIMPF較適用於拷貝大量資料,下列是執行範例:CPYTOSTMFFROMMBR('/QSYS.LIB/QTEMP.LIB/CPY123456.FILE/CPY123456.MBR')TOSTMF('/spool/QSYSPRT-201134-0001.txt')STMFOPT(*REPLACE)STMFCODPAG(*PCASCII)CPYTOSTMFFROMMBR('/QSYS.LIB/QTEMP.LIB/CPY123456.FILE/CPY123456.MBR')TOSTMF('/spool/QSYSPRT-201134-0001.txt')STMFOPT(*REPLACE)STMFCODPAG(950)CPYTOSTMFFROMMBR('/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)是預設值可以不用設,在此僅列出參考。或CPYTOIMPFFROMFILE(QTEMP/CPY123456)TOSTMF('/spool/QSYSPRT-201134-0001.txt')MBROPT(*REPLACE)STMFCODPAG(*PCASCII)RCDDLM(*CRLF)STRDLM(*NONE)CPYTOIMPFFROMFILE(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)。當轉換中文時,系統會自動將中文控制碼0E及0F裁掉,所以資料會往左靠,您將需要於轉換
本文标题:如何让报表管理自动化
链接地址:https://www.777doc.com/doc-17430 .html