此小錦囊資料僅供您參考使用, 請您於使用前測試再測試
如何於 SQL 中指定 Physical file mult-member ?.....(2000/03/03)
有二種方式 :
1. 使用 call procedure 方式, 呼叫系統程式 QCMDEXC , 並使用 OVRDBF 指令,call Qcmdexc( 'OVRDBF FILE(QTXTSRC) TOFILE(XXXXXX/QTXTSRC) MBR(TNT0001051) OVRSCOPE(*JOB)',000000074.00000)2.使用 SQL command : Create AliasCreate Alias CODE/COST97 for CODE/QTXTSRC(COST97)
一個好用的資料庫維護工具, 可直接維護單筆資料, 也可以使用 Hexadecimal(十六進位)模式進行資料為護, 此工具不支援中文, 但有 Source 可自行修改劃面 DDS 屬性為 "O" type,及修改程式有關該劃面欄位部份即可支援中文, 好用ㄡ.....(2000/02/09)
來自 http://www.midrangecomputing.com/mc/code99.cfm
的資料庫維護工具 WRKDBF: All Work and No Pay
想讓你的程式 source 或 註解 於編輯時加上色彩嗎 ? 如果使用 IBM Client Access 連線程式就可以直接於 SEU 中隨意設定顏色, 可整行或片段指定顏色.....(2000/01/31)
1. 利用 Client Access 的 Keyboard setup 即可設定, 將 as400color.txt 存至你的硬碟並更名為 as400color.kmp,
2. 在 Client Access 中選 menu bar "Assist" -> "Keyboard setup" -> "User defined" -> 指定鍵盤設定檔 as400color.kmp -> 確定.即完成設定. 可使用 W(白),R(紅),Y(黃),P(紫),G(綠),B(藍) 字母 + CTRL(正常) 或 ALT(反白) 鍵組合, 例如在 SEU 中 設定為插入(insert)模式, 使用 CTRL + "W" , 其後面的字會變白色, 若 ALT + "W", 其後面的字會變白色且反白, 其餘 R, Y, P, G, B 亦是
亦可下載 RPG Alive 2000 試用版 30 天, 須與 Client Access 搭配使用.
於 RPG 中如何將字元轉為數字 ? ..(2000/01/28)
IDS001 DS I 1 2 X2 I B 1 20B2 C MOVE X'A0' X1 1 C Z-ADD*ZERO B2 C MOVE X1 X2在這例子中 X1 = 16 進位 'A0' , 相當於 10 進位 160, 利用資料結構 DS001 定義同一位置, 但不同屬性(一為文字 X2, 一為二進位數字 B2 ), 將 X1 搬至 X2 右側, 即可得 B2 = 160. 這個技巧在做字元轉換時很好用, RPG 並不提供字元值直接加減(但 C 語言可以),所以須透過轉換, 希望未來 RPGIV 能提供 BIF 函數 %Hex 用於直接取用字元值.
教你簡化報表儲存的指令, 系統沒有提供指令,但有現成系統程式可用, USER 自己DIY,簡單ㄡ..(2000/01/12)
Step 1.
CRTPF FILE(SPLFTEST) RCDLEN(4083) MAXMBRS(*NOMAX) TEXT('SAVE SPOOLED FILE FOR GETSPLF & PUTSPLF USED')Step2. Create GETSPLF 指令,(儲存報表資料於檔案(SPLFTEST)中)
將 Command source copy to AS/400 , CRTCMD CMD(GETSPLF) PGM(QSPGETF)GETSPLF: CMD PROMPT('Get Spooled File') PARM KWD(FILE) TYPE(*NAME) LEN(10) RTNVAL(*NO) + RSTD(*NO) MIN(1) MAX(1) FILE(*IN) + FULL(*NO) EXPR(*YES) PASSATR(*NO) + PROMPT('Spooled file') PARM KWD(TOFILE) TYPE(Q1) RTNVAL(*NO) MIN(1) + MAX(1) FILE(*OUT) PROMPT('To data base file') PARM KWD(JOB) TYPE(Q2) RTNVAL(*NO) DFT(*) + SNGVAL((*)) MIN(0) MAX(1) FILE(*NO) + PROMPT('Job name') PARM KWD(SPLNBR) TYPE(*INT2) RTNVAL(*NO) + RSTD(*NO) DFT(*ONLY) RANGE(1 1999) + SPCVAL((*ONLY 0) (*LAST -1)) EXPR(*YES) + VARY(*NO) PASSATR(*NO) PROMPT('Spooled + file number') PARM KWD(TOMBR) TYPE(*NAME) LEN(10) RTNVAL(*NO) + RSTD(*NO) DFT(*FIRST) SPCVAL((*FIRST)) + MIN(0) MAX(1) FILE(*NO) FULL(*NO) + EXPR(*YES) VARY(*NO) PASSATR(*NO) + PROMPT('To member') Q1: QUAL TYPE(*NAME) LEN(10) RSTD(*NO) MIN(1) + FULL(*NO) EXPR(*YES) VARY(*NO) PASSATR(*NO) QUAL TYPE(*NAME) LEN(10) RSTD(*NO) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB *CURLIB)) MIN(0) + FULL(*NO) EXPR(*YES) VARY(*NO) + PASSATR(*NO) PROMPT('Library') Q2: QUAL TYPE(*NAME) LEN(10) RSTD(*NO) MIN(1) + FULL(*NO) EXPR(*YES) VARY(*NO) PASSATR(*NO) QUAL TYPE(*NAME) LEN(10) RSTD(*NO) MIN(0) + FULL(*NO) EXPR(*YES) VARY(*NO) + PASSATR(*NO) PROMPT('User') QUAL TYPE(*CHAR) LEN(6) RSTD(*NO) RANGE(000000 + 999999) MIN(0) FULL(*YES) EXPR(*YES) + PASSATR(*NO) PROMPT('Number')Step3. Create PUTSPLF 指令,重新列印已儲存之報表
將 Command source copy to AS/400 ,CRTCMD CMD(PUTSPLF) PGM(QSPPUTF) PUTSPLF: CMD PROMPT('Put Spooled File') PARM KWD(FROMFILE) TYPE(Q1) MIN(1) MAX(1) + FILE(*IN) PROMPT('From data base file') PARM KWD(OUTQ) TYPE(Q1) MIN(1) MAX(1) FILE(*NO) + PROMPT('Output queue') PARM KWD(FROMMBR) TYPE(*NAME) LEN(10) DFT(*FIRST) + SPCVAL((*FIRST)) MIN(0) MAX(1) FILE(*NO) + FULL(*NO) EXPR(*YES) VARY(*NO) + PASSATR(*NO) PROMPT('From member') Q1: QUAL TYPE(*NAME) LEN(10) RSTD(*NO) MIN(1) + FULL(*NO) EXPR(*YES) VARY(*NO) PASSATR(*NO) QUAL TYPE(*NAME) LEN(10) RSTD(*NO) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB *CURLIB)) MIN(0) + FULL(*NO) EXPR(*YES) VARY(*NO) + PASSATR(*NO) PROMPT('Library')
V3R7 以後 RPGIV 有內建函數 %EDITC 用來處理數字轉成文字輸出格式, 此內建函數 %EDITC與報表數字輸出格式 DDS 定義相同, 但 V3R2 無此內建函數, 可透過 Edit Code API 來達到內建函數 %EDITC 用來處理數字轉成文字輸出格式的功能. 數字轉成文字格式輸出樣本 Summary of Edit Codes ......(1999/11/24)
Convert Edit Code (QECCVTEC) API ---
轉換指定之 Edit Code 為輸出樣本 利用Edit Code 輸出樣本產生格式化數字轉成文字輸出數字格式轉換程式範例 -- EDTCODR
參數如下:C EDTCODR plist C parm SrcVar 欲轉換之數字性文字 C parm SrcVarCls '*ZONED' C parm EdtCode 數字格式 C parm CurId 金錢符號 C parm SrcVarPrc 數字性文字位數 C parm SrcDecPos 小數點位數 C parm RcvVar 格式化數字輸出測試數字格式轉換程式範例 -- EDTCDETSTR
將二範例程式上傳至 AS/400 & Compiled EDTCODR, EDTCDETSTR, 執行 EDTCDETSTR.
如何利用 TCP/IP FTP 從 AS/400 下載中文資料或從 PC 上傳中文資料至 AS/400 ?......(1999/10/25)
利用 TCP/IP FTP 作資料傳輸非常方便, 以下是範例:
PC FTP to AS/400 to get DBCS data to PC
Client Server
PC -----> AS/400 於 PC DOS 命令列下 FTP command
FTP xxx.xxx.xxx.xxx
User : user
Password: password
>quote type c 950
>get library/file c:\temp\file.txt
============================================================
AS/400 FTP to PC server to put DBCS data to PC server
Server Client
PC Server -----> AS/400 於 AS/400 命令列下 FTP command
FTP 'xxx.xxx.xxx.xxx'
User : user
Password: password
> Ltype c 950
FTP client TYPE changed. Server TYPE not changed.
Data type is C. CCSID value is 950.
> put library/file file.txt
200 PORT command successful.
150 Opening ASCII mode data connection for file.txt.
226 Transfer complete.
工具 : PRTRCDINF (Print record information) 列印檔案欄位格式 ......(1999/10/07)
1. Copy PRTRCDINF to QCMDSRC
2. Copy RCDINFC1P to QCLSRC
3. Copy RCDINFR1P to QRPGSRC
4. Copy RCDINFP1 to QDDSSRC
5. Compile RCDINFP1, RCDINFR1P, RCDINFC1P
6. CRTCMD CMD(PRTRCDINF) PGM(RCDINFC1)
如何從 AS/400 啟動 PC windows 應用軟體或 從 PC 啟動 AS/400 應用軟體? ......(1999/09/17)
Windows 95,98, NT 上需有 REXECD (remote executing)Daemon 程式, 用於接收外界指令, 在 AS/400 使用指令 RUMRMTCMD ,只定 PC 應用軟體完整路徑, 例如:
"C:\Program Files\Microsoft Office\Office\EXCEL.EXE"RUNRMTCMD +
CMD('C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\EXCEL.EXE') +
RMTLOCNAME('145.59.1.78' *IP) +
RMTUSER(user) RMTPWD(userpassword)同樣的, 也可以從 PC 啟動 AS/400 程式, PC 上有 REXEC.EXE 程式, 在 AS/400 上需啟動 Remote exection server: STRTCPSVR SERVER(*REXEC)
REXEC xxx.xxx.xxx.xxx -l QSYSOPR +
WRKACTJOB>C:\data\actjob.txt
xxx.xxx.xxx.xxx : AS/400 IP address; -l is 小寫 L , for username
PC
動作
AS/400
REXECD
<------AS/400 傳送 PC command to daemon program
RUNRMTCMD
REXEC
PC 傳送 AS/400 command to AS/400 REXEC Server------>
STRTCPSVR *REXEC
REXECD utility
可從 http:\\www.denocomp.com\download.htm 下載
清除報表工具 CLNUSRSPL (Cleanup User Spooled Files), 可指定多個使用者的報表於某日前之報表刪除或集中歸檔, 指令範例 : ......(1999/09/08)
CLNUSRSPL USRID(AA BB) OPTION(*INCLUDE) DELETEDATE(072499) ACTION(*DELETE)
清除使用者 AA 及 BB 於 1999 年 7 月 24 日(含24 日) 以前的所有報表CLNUSRSPL USRID(AA BB) OPTION(*OMIT) DELETEDATE(072499) ACTION(*DELETE)
除使用者 AA 及 BB 報表不清除, 清除整個系統其他使用者於 1999 年 7 月 24 日(含24 日) 以前的所有報表CLNUSRSPL USRID(AA BB) OPTION(*INCLUDE) DELETEDATE(072499) ACTION(*ARCHIVE) + ARCHIVE(OUTQ)
若指定 ACTION(*ARCHIVE) 及 ARCHIVE(OUTQ), 則將報表歸檔至 OUTQ
OPNQRYF 之篩選條件內建函數 %WLDCRD, 可以使用 (Field *EQ %WLDCRD("*#*") 挑選 Field 中含有字元 "#" 的資料, 但若要挑Field 中不含有字元 "#" 的資料(Field *NE %WLDCRD("*#*"), 系統卻回應 %WLDCRD 參數錯誤,要如何解決 ?......(1999/08/05)
%WLDCRD 內建函數僅應用於 *EQ 運算子,而無法使用於 *NE,所以須使用 *NOT 做邏輯運算
挑選 Field 中含有字元 "#" 的資料 *EQ :
OPNQRYF File(FileA) QRYSLT('Field *EQ %WLDCRD("*#*")')挑Field 中不含有字元 "#" 的資料 *NE:
OPNQRYF File(FileA) QRYSLT('*NOT (Field *EQ %WLDCRD("*#*"))')
要如何於 RPG/400 中計算某日為星期幾 ?......(1999/06/02)
RPG/400 並不支援日期函數, 但可使用 ILE RPG/400 中 ILE CEE API CEEDAYS, CEEDYWK 來計算
Convert Date to Lilian Format (CEEDAYS) API
將文字型態日期轉換為流水日數(以1582/10/15為基準日即 1, 1582/10/16 為 2....,依此累計至 9999/12/31)
文字型態日期格式可為 MM/DD/YY, MMDDYY,MM/DD/YYYY, MMDDYYYY等.Calculate Day of Week from Lilian Date (CEEDYWK) API
以 CEEDAYS 傳回之流水日數為參數, 計算星期幾,
若傳回 1-> 星期日, 2->星期一,..., 7->星期六此範例以系統日測試, 你可使用任何介於1582/10/15-- 999/12/31之日期測試 : H*Debug(*yes) D DateMDY S D datfmt(*mdy) D DateAlpha S 8 Inz * D ds D TimeDate 14 0 D Time60 6 0 overlay(TimeDate: 1) D Date80 8 0 overlay(TimeDate: 7) * D Days S 10I 0 D DayofweekN S 10I 0 D datefmt S 8 inz('MM/DD/YY') * * Feedback code data structure for CEE API D fc DS D sev 5I 0 D msgno 5I 0 D flags 1 D facid 3 D isi 10I 0 * *----------------------------------------------------* * Get the current time * *----------------------------------------------------* C Time TimeDate * C *usa Move Date80 DateMDY C Movel DateMDY DateAlpha C DateAlpha DSPLY * C CallB(D) 'CEEDAYS' C parm DateAlpha C parm datefmt C parm Days C parm fc C* dump C Days DSPLY * C Movel Date80 inputdate 8 C inputdate DSPLY C CallB(D) 'CEEDAYS' C parm inputdate C parm 'MMDDYYYY' datefmt C parm Days C Days DSPLY * C *MDY Move DateMDY Date6n 6 0 C Date6n DSPLY * C Move Date6n Date6c 6 C Date6c DSPLY C CallB(D) 'CEEDAYS' C parm Date6c C parm 'MMDDYY' datefmt C parm Days C Days DSPLY * C CallB 'CEEDYWK' C parm Days C parm DayOfweekN * C 'DayOfWeek' DSPLY C DayOfweekN DSPLY * For the day of week, 1 indicates Sunday, 2 indicates Monday, .. * 7 indicates Saturday. C Eval *InLR = *On
要如何於 SQL/400 同一資料檔(table)中找重覆 (Duplicated record) 的資料 ?......(1999/05/17)
SELECT ALL * FROM file T01 WHERE 1 < (SELECT count(*) FROM file T02 WHERE T01.field = T02.field AND T01.field2 = T02.field2) ORDER BY T01.field asc, T01.field2 asc上述語法會傳回二欄位相同的重覆 (Duplicated record) 資料
System Request 的選項可以修改嗎 ? 例如選項 3 DSPJOB, 可改為 WRKJOB 嗎 ?......(1999/04/30)
System Request 畫面是無法修改, 但是選項執行的指令在有條件下是可以修改的
System Request 選項的指令是放在訊息檔,可輸入指令 WRKMSGD CPX2313 , 按執行鍵
CPX2313 訊息如下:
First-level message text . . . . 'ENDRQS DSPJOB DSPMSG SNDMSG
SIGNOFF DSPMSG DSCJOB DSPWSUSR ENDRDBRQS '
於畫面上輸入 2 於 CPX2313 前之OPT欄位 , 修改指令 DSPJOB 為 WRKJOB.要修改必須字數不得多於原指令字數,且指令起始位置要一致,
例如 WRKJOB 的 W, 要與 DSPJOB 的 D 同一位置
如何傳參數至 Query/400 ? ......(1999/04/28)
於 Query/400 篩選資料畫面,設定接收參數(冒號開頭代表參數), The Select Records Panel Select Records Type comparisons, press Enter. Specify OR to start each new group. Tests: EQ, NE, LE, GE, LT, GT, RANGE, LIST, LIKE, IS, ISNOT... AND/OR Field Test Value (Field, Number, 'Characters', or ...) GLCOMP EQ :COMPANY AND GLBRAN EQ :BRANCH AND GLACC EQ :ACCOUNT ----------------------------------------------------------------------- 參數名稱有大小寫之分, 且須符合定義於 STRQMQRY 指令中的參數, 而且參數定義必須在其他非參數篩選條件之前, 例如 : GLBRAN EQ :BRANCH AND GLCOMP EQ 100 ----------------------------------------------------------------------- 設定第一項後,按 Enter 執行鍵, 出現如下畫面: Specifying a Dummy Dependent Value Qualifier ----------------------------------------------------------------------- Specify Dependent Value Qualifiers Type choices, press Enter. Qualifier type ....... 1 1=Query 2=File Query or File ....... DUMMY Name, F4 for list of files Library .......... *libl Name, #LIBL, F4 for list For choice 2=File: file member ........ Name, *First, F4 for list ----------------------------------------------------------------------- 要執行此種 QUERY, 不能使用 RUNQRY 指令, 而須使用 Start Query Management Query (STRQMQRY) 指令如下: STRQMQRY QMQRY(library/qry-name) ALWQRYDFN(*YES) + QMFORM(*QMQRY) SETVAR((COMPANY 1) (BRANCH 1) (ACCOUNT 12000)) ALWQRYDFN 參數設定為 *YES, 允許 Query Management 執行 query definition(*QRYDFN) 物件, 而非 query management (*QMQRY) 物件. 你能指定參數及其參數值於指令 STRQMQRY 中如上述指令, 或不指定參數及其參數值於指令 STRQMQRY 中, 而由 Query Management 顯示輸入參數值畫面來設定參數值 當參數為字元型態時要注意使用單引號或三個單引號 A. 由 Query Management 顯示輸入參數值畫面來設定參數值時, 使用單引號 STRQMQRY QMQRY(TESTQRYVAR) ALWQRYDFN(*YES) Type a value for variable "FROM" and press Enter. '19990401' Type a value for variable "TO" and press Enter. '19990430' B.指定參數及其參數值於指令 STRQMQRY 中, 使用三個單引號 STRQMQRY QMQRY(TESTQRYVAR) ALWQRYDFN(*YES) + SETVAR((FROM '''19990401''') (TO '''19990430''')) 當參數為數字型態時 A. 由 Query Management 顯示輸入參數值畫面來設定參數值時, 不使用單引號 STRQMQRY QMQRY(TESTQRYVAR) ALWQRYDFN(*YES) Type a value for variable "FROM" and press Enter. 19990401 Type a value for variable "TO" and press Enter. 19990430 B.指定參數及其參數值於指令 STRQMQRY 中, 單引號可有可無 STRQMQRY QMQRY(TESTQRYVAR) ALWQRYDFN(*YES) + SETVAR((FROM '19990401') (TO '19990430')) 或 STRQMQRY QMQRY(TESTQRYVAR) ALWQRYDFN(*YES) + SETVAR((FROM 19990401) (TO 19990430))
應用軟體系統中使用多個 PF 及 LF, 但是常有 PF 及 LF
資料庫資料不一致的情況發生, 要如何處理 ?
......(1999/04/24)
PF 及 LF 中參數 FRCRATIO 定義該系統暫存區儲存幾筆資料筆數時, 才將暫存區資料寫入檔案 ; 系統預設值是 *NONE, 當系統暫存區滿時, 系統自行將暫存區資料寫入檔案,
這在系統負載尖峰時, 由於系統暫存區很快就滿了, 系統更新暫存區的頻率就會提高, 資料庫資料不一致的情況就較不會發生;
但是系統負載較低時, 由於系統暫存區尚未填滿, 資料庫資料不一致的情況就較會發生, 除非將檔案參數 FRCRATIO 定義暫存區儲存幾筆資料筆數,當筆數累計至此參數值時, 系統即將暫存區資料寫入檔案, 至於參數 FRC 值筆數數目需自行調配產生,
若希望有任何修改立即更新檔案, 可將 FRCRATIO 參數值設為 1, 但這會增加系統負載, 需小心設定. CHFPF FILE(filename) FRCRATIO(1)
修改參數 FRCRATIO 後, 使用到此檔案的相關程式均需重新 Compiled, 該參數值才會生效.
當執行命令 CMPPFM 比對 Source 時, 會有執行錯誤訊息 ? ......(1999/04/24)
若 Source file 的參數 IGCDATA 是 *YES(即 Source file 允許輸入中文資料)時, 而系統報表檔 QUEPRT 參數 IGCDATA 是 *NO時, 由於參數屬性不一致才有錯誤訊息, 將系統報表檔 QUEPRT參數 IGCDATA 改為 *YES 即可.
CHGPRTF QUEPRT IGCDATA(*YES)
因有某些應用軟體會使用 QTEMP 儲存暫時性資料, 為便於做系統維護 , 要如何在同一台 AS/400 系統上由一工作站傳送命令至另一遠端工作站由遠端使用者確認執行 ?......(1999/04/22)
事先設定遠端工作站訊息序列之中斷訊息處理程式, 一旦接收到含有命令的中斷訊息, 便將命令顯示在畫面上 , 由遠端使用者確認執行
CHGMSGQ MSGQ(workstation) PGM(Break-message-program)中斷訊息處理程式(Break-message-program)接收系統傳來的三個參數 : PGM ( + &MSGQ /* MESSAGE QUEUE NAME */ + &MSGQLIB /* MESSAGE QUEUE LIBRARY NAME */ + &MSGKEY /* MESSAGE KEY */ + ) DCL &MSGKEY *CHAR 4 DCL &MSGQ *CHAR 10 DCL &MSGQLIB *CHAR 10 DCL &MSG *CHAR 512 DCL &RCVMSGTYPE *CHAR 2 DCL &SENDER *CHAR 80 . . ./* 截取訊息 */ RCVMSG MSGQ( &MSGQLIB/&MSGQ ) + MSGKEY( &MSGKEY ) + MSG( &MSG ) + SENDER( &SENDER ) + RTNTYPE( &RCVMSGTYPE ) . . ENDPGM可將命令利用傳遞中斷訊息至遠端工作站訊息序列,
SNDBRKMSG MSG(Command) WRKSTN(workstation)
AS/400 訊息回覆分那幾類 ? 且回覆順序為何 ?......(1999/04/09)
訊息回覆的種類是設定於工作環境設定檔(JOBD)參數 INQMSGRPY,該 JOBD 並被指定於使用者設定檔中, 用以設定使用者如何回覆訊息的方式
參數 INQMSGRPY 值有 :
*RQD : 顯示所有訊息交由使用者回覆(系統預設值)
*DFT : 由系統依各訊息預設回覆值直接回覆
*SYSRPYL : 由系統自動回覆值序列中尋找符合之訊息編號回覆值, 若找到則依設定值自動回覆, 否則顯示訊息交由使用者回覆. 可使用 WRKRPYLE 設定自己喜好的自動回覆值
欲使用 AS/400 Folder 時, Windows 系統回應拒絕存取訊息, 要如何解決 ?......(1999/04/09)
由於 Folder 檔案系統屬於 DOS 檔案系統, 所以Client 端不論使用 Windows 3.1, 95, 98(即使 95,98 支援長檔名) 均必須使用 DOS 檔案系統的命名規則,即檔名 8 位 + 附屬檔名 3 位. ==> abcdefgh.txt
下 command WRKFLR , AS/400 系統若顯示 CPF4A86 "Internal system objects are damaged." Folder function 無法正常運作 ==> 下 command RCLDLO DLO(*INT) 或 AS/400 重新開機,系統會自動修復
資料庫中若有不正常數字資料常常導致執行程式當掉, 要如何找出不正常數字資料 ?......(1999/03/29)
利用 SQL/400 HEX 十六進位碼函數和 TRANSLATE 函數即可找出不正常數字資料
測試 Packed 型態不正常數字資料
SELECT RRN(file-name), Field1, HEX(Field1) FROM file-name
WHERE
(
TRANSLATE(HEX(Field1), '##########@@@@@@', '0123456789ABCDEF') NOT LIKE '%@'
OR
TRANSLATE(HEX(Field1), '##########@@@@@@', '0123456789ABCDEF') LIKE '%@%@'
)測試 Zoned 型態 (7,0) 不正常數字資料
例如 Field2 值為 123 ==> 十六進位碼 F0 F0 F0 F0 F1 F2 F3
Field2 值為 -123 ==> 十六進位碼 F0 F0 F0 F0 F1 F2 D3
SELECT RRN(file-name), Field2, HEX(Field2) FROM file-name
WHERE
(
TRANSLATE(HEX(Field2), '##########@@@@@@', '0123456789ABCDEF')
NOT LIKE '_#_#_#_#_#_#@#'
)
要如何於 SQL/400 中取代某欄位之子字串 ?......(1999/03/29)
例如 field1 為 文字型態, 長度 10 位, 欲將前二位值為 'YY' ,以 'XX' 取代
Update filename Set field1= Concat('XX', Substr(field1,3,10)) Where substr(field1, 1, 2) = 'YY'
OR
Update filename Set field1= 'XX' Concat Substr(field1,3,10) Where substr(field1, 1, 2) = 'YY'
要如何於 SQL/400 中顯示 十六 進位碼 ?......(1999/03/29)
Select field1, HEX(field1) form file-name
利用 HEX 函數, 即可顯示 十六 進位碼
要如何於 SQL/400 中利用 RRN(指寫入檔案的次序) 處理資料 ?......(1999/03/29)
Select RRN(file-name), field1,field2 from file-name
(顯示檔案資料次序)Select RRN(file-name), field1,field2 from file-name Where RRN(file-name) > 10000
(篩選 RRN > 1000 之資料)Update file-name Set field1 = value Where RRN(file-name) > 10000
(更新 RRN > 1000 之 field1 資料)
要如何於 SQL/400 中計算二日期間的天數 ?......(1999/01/05)
使用 DATE Function ,其傳回值格式為 yyyymmdd 共 8 位的數字
SELECT digits(DATE('02/01/96') - DATE('01/01/95')) FROM .... 傳回值為 '00010100'; 其間天數為一年一個月使用 DAYS Function ,其傳回值格式為 共 10 位的數字
SELECT digits(DAYS('01/01/96') - DAYS('01/01/95')) FROM .... 傳回值為 '0000000365'; 其間天數 365 天- 欲做如上測試時請先產生一暫存檔 sqltempf ; 指定一數字欄位長度 8 位整數, 並新增一筆資料於暫存檔 sqltempf; 即可以 sqltempf 取代上述 FROM 後之 '. . . .' ; 於 SQL/400 執行上述運算式, 可得到上述結果
要如何於 RPG IV 中呼叫 CL 指令 ? ......(1999/01/04)
宣告 QCMDEXEC API
D RunCLCmd PR EXTPGM('QCMDEXEC') D CmdStr 512 CONST OPTIONS(*VARSIZE) D CmdLen 15 5 CONST將指令組成字串參數 WrkStr, 再使用 CALLP 呼叫 CL 指令
C CALLP(E) RunCLCmd(%TRIM(WrkStr) : + C %LEN(%TRIM(WrkStr))
要如何於 CL 程式中檢查是否潤年 ? ......(1999/01/04)
於 CL 程式中使用數學運算太麻煩了, 告訴你一個更容易的方法, 指令 CVTDAT 已經知道那一年是潤年, 只要將 "0229" 與二位數字年合併成 'mmddyy' 的格式, 當成指令 CVTDAT 的 DATE 參數值, 如果指令 CVTDAT 傳回錯誤訊息 "CPF0555 日期錯誤或日期格式錯誤" , 那表示此二位數字年非潤年, 如果無傳回錯誤訊息, 此二位數字年即潤年.
PGM (&YEAR) DCL &YEAR *CHAR 2 DCL &MDY *CHAR 6 CHGVAR (&MDY) ('0229' *cat &YEAR) CVTDAT DATE(&MDY) TOVAR(&MDY) FROMFMT(*MDY) TOFMT(*MDY) TOSEP(*NONE) MONMSG CPF0555 EXEC(DO) SNDMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('YEAR' *BCAT &YEAR *BCAT 'is not leap year') + MSGTYPE(*COMP) RETURN ENDDO SNDMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('YEAR' *BCAT &YEAR *BCAT 'is leap year') + MSGTYPE(*COMP) ENDPGM
你時常使用 Query/400 產生報表嗎 ? Query/400 所產生的報表均以 " * * * END OF REPORT * * *" 結尾, 如果你不喜歡這個訊息, Query/400 使用訊息檔 QQRYMSG 的訊息代碼 QRX1905 當成 Query/400 所產生的報表結尾訊息, 你能修改或移除訊息內容.......(1998/12/31)
- CRTMSGF 建立一新訊息檔
- ADDMSGD 將訊息代碼 QRX1905 及輸入報表結尾訊息於參數 MSG 存入新訊息檔, 若不希望有報表結尾訊息出現於報表上, 指定 ' ' 於參數 MSG.
- 在執行 query 前下 OVRMSGF(Override message file) 指令, 指定使用前項新訊息檔
- 在執行 query 後下 DLTOVR(Delete Override) 指令, 回覆使用系統預設訊息檔
在您安裝 Client Access 於用戶端的 PC 後, 使用者便能利用 Windows 95/98/NT 的網路芳鄰內的 "AS/400 Network" 開啟 AS/400 的 QSYS.LIB 檔案系統, 如同 PC 的網路磁碟機, 使用者可看到,搬移,刪除所有 AS/400 的檔案, 使用者可將AS/400 的檔案搬移至 Windows 的資源回收桶, 而 AS/400 並不支援 Windows 資源回收桶的還原功能, 這是很危險的, 有方法可以防止嗎 ? ......(1998/12/24)
所以為了防止此種情事發生, 唯一的方式是不讓使用者利用網路芳鄰存取AS/400 的 QSYS.LIB 檔案系統, Client Access Host Service 是利用 "QPWFSERVER" 授權清單, 授權那些使用者可透過 Windows 的網路芳鄰存取AS/400 的 QSYS.LIB 檔案系統, 此授權清單的系統預設值是 *PUBLIC(*USE), 你只要利用指令 EDTAUTL QPWFSERVER , 按執行鍵將出現如下畫面, 將 User *PUBLIC 的授權由 *USE 改為 *EXCLUDE 即可限制一般使用者透過 Windows 的網路芳鄰存取AS/400 的 QSYS.LIB 檔案系統, 但此方式並無法管制有 *ALLOBJ 特殊權限的使用者.
Edit Authorization List Object . . . . . . . : QPWFSERVER Owner . . . . . . . : QSYS Library . . . . . : QSYS Primary group . . . : *NONE Type changes to current authorities, press Enter. Object List User Authority Mgt QSYS *ALL X *PUBLIC *USE /* 將 User *PUBLIC 的授權由 *USE 改為 *EXCLUDE */ Bottom F3=Exit F5=Refresh F6=Add new users F11=Display detail object authorities F12=Cancel F24=More keys
每次開機後均須手動下指令 STRTCP , STRHOSTSVR 以啟動 TCP/IP 及 CLient Access host service, 有無其他方法可設定開機後自動啟動 TCP/IP 及 CLient Access host service ? ......(1998/12/23)
- DSPSYSVAL QSTRUPPGM 找系統啟動後的執行程式
- RTVCLSRC 將上述系統啟動後的執行程式返解譯回原始程式
- 將下列指令加入該原始程式的後段
SYS/STRTCP /* 啟動 TCP/IP */
MONMSG MSGID(CPF0000)
SYS/DLYJOB 300 /* 等待 啟動 TCP/IP 動作完成 */
MONMSG MSGID(CPF0000)
SYS/STRHOSTSVR SERVER(*ALL) /* 啟動 Client Access Host Server */
MONMSG MSGID(CPF0000)- Compiled 修改後的啟動程式取代舊的啟動程式; 下次開機後, 就不必再下指令啟動 TCP/IP 及 HOST server.
- 於 V4R2 後 STRTCP 已會自動將 Client Access Host Server 啟動, 便不須要於系統啟動後的執行程式加入指令 SYS/STRHOSTSVR SERVER(*ALL)
於 CLP 中所宣告的檔案僅能從頭到尾讀一次, 要如何於 CLP 中重讀檔案 ? ......(1998/12/21)
於 CLP 中使用 TFRCTL 指令;例如程式名稱為 TESTC
/*********************************************************************/ /* TESTC: 測試 TFRCTL 指令. */ /*********************************************************************/ PGM ( &last_read ) DCL &last_read *CHAR 1 DCLF testpf /* 宣告你要使用的檔案 */ LOOP: RCVF /* 讀取檔案資料 */ MONMSG cpf0864 EXEC( GOTO end_loop ) /* 處理所讀取的資料 */ SNDPGMMSG MSGID( cpf9898 ) + MSGF( qcpfmsg ) + MSGDTA( &testpf ) + MSGTYPE( *STATUS ) + TOPGMQ( *EXT ) DLYJOB 1 GOTO loop END_LOOP: /* 由 last_read 參數值 -- 'Y' 不重覆讀 ; 否則重覆讀; 用以防止程式進入無窮迴圈 */ IF ( &last_read *EQ 'Y' ) DO GOTO end_pgm ENDDO ELSE DO CHGVAR &last_read 'Y' TFRCTL TESTC ( &last_read ) /* TFRCTL 重新執行 TESTC 程式 */ ENDDO END_PGM: /* End-of-program processing goes here */ ENDPGM
要如何開放某些指令給使用者於指令行(command line)使用, 但又需限制使用者僅能使用被開放的指令 ?......(1998/12/15)
- 設定使用者設定檔(User profile) 之參數 LMTCPB(*YES) 限制使用者不得使用指令行
- CLP 範例如 1998/12/07 之FSTMNUCMD 工具開放某些指令給使用者使用, 但使用者無法使用指令行
- 若要用指令行(command line),又要限制開放幾個指令, 範例如下
/* =============================================================== */ /* = 說明... REQUEST PROCESSOR = */ /* =============================================================== */ PGM DCL &MSG *CHAR ( 3000 ) DCL &MSGID *CHAR ( 7 ) DCL &MSGDTA *CHAR ( 100 ) DCL &MSGF *CHAR ( 10 ) DCL &MSGFLIB *CHAR ( 10 ) DCL &KEYVAR *CHAR ( 4 ) DCL &RTNTYPE *CHAR ( 2 ) DCL &REJECT *LGL DCL &ERRORSW *LGL MONMSG ( CPF0000 MCH0000 ) EXEC( GOTO ERROR) /* --------------------------------------------------------------- */ /* - 顯示指令行畫面 (QCMD) - */ /* --------------------------------------------------------------- */ RECEIVE: CHGVAR ( &ERRORSW ) ( '0' ) RCVMSG PGMQ( *EXT ) + MSGTYPE( *RQS ) + RMV( *NO ) + KEYVAR( &KEYVAR ) + MSG( &MSG ) + RTNTYPE( &RTNTYPE ) MONMSG ( CPF2415 ) EXEC( RETURN) /* 使用者按 F3 or F12, 退出程式 */ /* --------------------------------------------------------------- */ /* - 使用者按 F4 鍵, 顯示指令參數畫面 - */ /* --------------------------------------------------------------- */ IF ( &RTNTYPE *EQ '10' ) + + CHGVAR &MSG ( '?' *CAT &MSG ) CALL QCMDCHK ( &MSG 3000 ) MONMSG ( CPF6801 ) EXEC( GOTO RECEIVE ) /* --------------------------------------------------------------- */ /* - 將指令參數 由小寫轉大寫 - */ /* --------------------------------------------------------------- */ RMVMSG PGMQ( *EXT ) + MSGKEY( &KEYVAR ) + CLEAR( *BYKEY ) SNDPGMMSG MSG( &MSG ) + TOPGMQ( *EXT ) + MSGTYPE( *RQS ) RCVMSG PGMQ( *EXT ) + MSGTYPE( *RQS ) + RMV( *NO ) /* --------------------------------------------------------------------- */ /* - 插入你自己撰寫的使用者指令授權程式並傳回該使用者是否可執行輸入指令- */ /* --------------------------------------------------------------------- */ CALL YOURPGM ( &MSG &REJECT ) IF ( &REJECT ) GOTO RECEIVE /* --------------------------------------------------------------- */ /* - 執行指令 - */ /* --------------------------------------------------------------- */ CALL QCMDEXC + ( &MSG 3000 ) GOTO RECEIVE /* --------------------------------------------------------------- */ /* - ERROR HANDLER - */ /* --------------------------------------------------------------- */ ERROR: IF ( &ERRORSW ) + + SNDPGMMSG MSGID( CPF9897 ) + MSGF( QCPFMSG ) + MSGDTA( 'AN UNEXPECTED ERROR OCCURED. SEE JOB LOG.' ) + MSGTYPE( *ESCAPE ) CHGVAR &ERRORSW ( '1' ) RCVMSG MSGTYPE( *EXCP ) + MSGDTA( &MSGDTA ) + MSGID( &MSGID ) + MSGF( &MSGF ) + MSGFLIB( &MSGFLIB ) SNDPGMMSG MSGID( &MSGID) + MSGF( &MSGFLIB/&MSGF ) + MSGDTA( &MSGDTA ) + TOPGMQ( *SAME ) + MSGTYPE( *DIAG ) GOTO RECEIVE /* --------------------------------------------------------------- */ /* - END OF PROGRAM - */ /* --------------------------------------------------------------- */ ENDPGM
如果你想知道 AS/400 最近一次的開機過程,
過程中有執行那些步驟及各步驟的執行時間, 你能執行程式
Call QSYS/QWCCRTEC . 執行程式後會產生一份報表檔
QPSRVDMP , 報表上會列出 AS/400 控制面板上在開機時所出現的參考碼(source
panel code), 及其執行時間. ......(1998/12/08)
欲知各參考碼(source panel code)意義, 請參考 AS/400 Service Functions manual
(SY44-5902), 此書是隨 AS/400 硬體到貨.
由於使用者正使用主畫面, 該使用者便鎖住該畫面物件, 程式人員便無法 compile 加入新選項的主畫面以取代舊主畫面 , 除了所有使用者退至SignOn 畫面, 再 compile 主畫面外, 有無其他方式不管使用者是否正在使用主畫面, 而可以隨時修改畫面 ?.....(1998/12/07)
下載 Fast Menu Command (FSTMNUCMD) Utility
讓你可隨時加畫面選項, 不再受限於使用者; 最多 20 個選項; 亦可於 CLP 中使用
1. Compiled 畫面 DDS : FSTMNUCMDD; CRTDSPF FILE(FSTMNUCMDD)
2. Compiled 指令處理程式: FSTMNUCMDC; CRTCLPGM PGM(FSTMNUCMDC)
3. Compiled 指令原始檔 : FSTMNUCMD; CRTCMD CMD(FSTMNUCMD) PGM(FSTMNUCMDC)
4. 範例Fast Menu Command (FSTMNUCMD) Type choices, press Enter. Menu Heading 'Text' . . . . . . > '1234567890' Option Description 'Text' . . . > 'Work with system status' + for more values > 'Work with active job' Command to run . . . . . . . . . > 'WRKSYSSTS' + for more values > 'WRKACTJOB' Bottom F3=Exit F4=Prompt F5=Refresh F12=Cancel F13=How to use this display F24=More keys
RTVSYSVAL 指令僅可傳回 2 位數的年(如 97,98) , 要如何於 CLP 中取得 4 位數的年(如 1998)? .....(1998/11/30)
使用 System API QWCCVTDT
PGM DCL &TODAY *DEC (8 0) /* TODAYS-DATE */ DCL &TODAYA *CHAR (8) /* TODAYS-DATE */ DCL &TIME *DEC (6 0) /* CURRENT-TIME */ DCL &TIMEA *CHAR (6) /* CURRENT-TIME */ DCL &NEWDTE17 *CHAR (17) /* STRING CONATAINING DATE &TIME */ /*傳回格式 YYYYMMDDHHMMSSXXX XXX MEANS MINISEC*/ CALL PGM(QWCCVTDT) PARM('*CURRENT ' ' ' + '*YYMD ' &NEWDTE17 X'00000000') CHGVAR VAR(&TODAY) VALUE(%SST(&NEWDTE17 1 8)) /*數字年月日 YYYYMMDD */ CHGVAR VAR(&TODAYA) VALUE(%SST(&NEWDTE17 1 8)) /*文字 YYYYMMDD */ CHGVAR VAR(&TIME) VALUE(%SST(&NEWDTE17 9 6)) /*數字時分秒 HHMMSS */ CHGVAR VAR(&TIMEA) VALUE(%SST(&NEWDTE17 9 6)) /*文字 HHMMSS */ SNDPGMMSG MSG(&TODAYA *BCAT &TIMEA) MSGTYPE(*COMP) ENDPFM
如何於 RPG 程式中解決 Record locked 所引起執行程式中斷的問題 ? .............(1998/11/28)
- 使用 OPcode(CHAIN,UPDATE) 的 Error Indicator;
- 使用 RPG File spec.中的參數 INFDS(File_information);
且於Definition spec. 中定義 *Status code ("01128" : Record already locked.)- 使用 RPG File spec.中指定參數 INFSR(File_Exeption/Error Subroutine)或於程式中加 *PSSR 子程序;
Definition spec. 中定義 PSDS (Program Status Data Structure) position 209 to 213 status code("01128" : Record already locked.); 程式不正常中斷時, 系統會更新 PSDS , 並將控制權交給指定於 INFSR 的子程序 , 藉以解決程式中斷的問題 ; 例如若遇到 Record locked 時便可傳送訊息給鎖住Record 的使用者請其 Released Record 或通知系統操作員處理;
以下是程式片段僅供參考:FFile_name UF A E K Disk InfSr( *PSSR ) . D PSDS SDS D Excp_data 91 170 /* Exception Data 錯誤訊息*/ D File_info 209 243 D Status_cde 209 213 /*Status code of last file used 最後使用檔案的狀態碼*/ . C*-------------------------------------------------------------------* C* *PSSR: Error Subroutine for the procedure. * C*-------------------------------------------------------------------* C *PSSR BEGSR C IF Status_Cde = "01128" C* 撰寫處理 Record locked 的程序....... .例如傳送訊息給鎖住 Record 的工作站或系統操作員 C* 視程序 設定傳回值 C* MOVE "*GETIN" ReturnPt *繼續讀取 Record * C* MOVE "*CANCL" ReturnPt *中斷程式執行* C* MOVE " " ReturnPt *將控制權交由 ILE RPG/400 預設處理錯誤的程序 C ELSE C* 撰寫處理其他錯誤的程序....... . C ENDIF C ENDSR ReturnPt C* 須指定傳回值於 OPcode ENDSR 的第二個參數欲知更詳細資料請參考
ILE RPG/400 Programmer's Guide Chapter 11. Handling Exceptions (有範例)
ILE RPG/400 Refference Chapter 5. Exception/Error Data Structures and Subroutines (INFDS 及 INFSR 資料結構定義)
如何檢核 CL 指令語法(Command Syntax)符合 AS/400 的指令格式 ? .............(1998/11/25)
依不同狀況有下列二種方法 :
於 CLP 中使用System API Check Command Syntax (QCMDCHK) API
參數 1:指令字串 Command string I/O;CHAR(*)
參數 2:指令長度 Length of command string INPUT;PACKED(15,5)
例如於 CLP 中
PGM
DCL &CMD *CHAR 512
DCL &ERRMSG *CHAR 512
MONMSG CPF0000 EXEC(GOTO ERROR)
CHGVAR &CMD 'WRKSYSSTS'
/* 亦可輸入 "?WRKSYSSTS" 檢查語法時系統會自動顯示指令參數畫面*/
/*問號開頭會使系統顯示指令參數畫面 */
Call QCMDCHK (&CMD 512) /* 檢查語法 */
Call QCMDEXC (&CMD 512) /* 執行指令 */
RETURN
ERROR:
RCVMSG MSGTYPE( *EXCP ) MSG( &ERRMSG )
CHGVAR &ERRMSG ( 'ERROR:' > &ERRMSG )
SNDPGMMSG MSG(&ERRMSG) MSGTYPE(*INFO)
ENDPGM於 Command 中參數型態指定 *CMDSTR ,系統會自動檢核該指令語法,但無法列出指令參數畫面輔助供使用者,亦即使用者須自行輸入所有參數;
例如 "WRKCFGSTS *CTL CTLNAME";
且指令不得以問號開頭("?WRKSYSSTS"),問號開頭會使系統顯示指令參數畫面;
例如於 CMD 原始檔中宣告
/* CRTCMD CMD(RUNCMD) PGM(RUNCMDC) */
CMD PROMPT('Command To Run')
PARM KWD(CMD) TYPE(*CMDSTR) LEN(512) MIN(1) PROMPT('Command to run:')
/* Processing PGM of RUNCMD command ; CRTCLPGM PGM(RUNCMDC) */
PGM (&CMD)
DCL &CMD *CHAR 512
DCL &ERRMSG *CHAR 512
MONMSG CPF0000 EXEC(GOTO ERROR)
Call QCMDEXC (&CMD 512) /* 執行指令 */
RETURN
ERROR:
RCVMSG MSGTYPE( *EXCP ) MSG( &ERRMSG )
CHGVAR &ERRMSG ( 'ERROR:' > &ERRMSG )
SNDPGMMSG MSG(&ERRMSG) MSGTYPE(*INFO)
ENDPGM
如何指定 Interactive Job 於特定的子系統中執行 , 如將 DSP0101開頭的數個工作站指定於 QPGMR 子系統中 ? .............(1998/11/22)
於子系統定義(Subsystem Descriiption)中指定該工作站名稱(Workstation Name Entry)
於指令輸入 ADDWSE 指令
, 按 PF4 輸入工作站名稱 "DSP0101*" 及 Subsystem Description name "QPGMR", 按 執行鍵
ADDWSE SBSD(QPGMR) WRKSTN(DSP0101*)
於程式中針對指定的工作站使用 TFRJOB 指令 , 能將 Interactive Job 從一子系統轉至另一子系統
TFRJOB JOBQ(job_queue)
如何於 SQL 中將文字轉成數字 ? .............(1998/11/18)
1. 將文字轉成數字 ==> DECIMAL(string_field);(V4R2 以後才有此功能)
有資料如下 :*...+....1....+....2....+....3....+....4.... MAXWELL/SMART 000034932NOTOWN GA SELECT DECIMAL(SUBSTR(Data,20,9)) FROM IMPORT ==> 傳回值 34932.2. 將數字轉成文字 ==> DIGITS(number_field) ; 此功能僅傳回數字 , 並不包含正負號及小數點
有資料如下 : CILUMNX 是四位整數二位小數且值為 -6.28
DIGITS(COLUMNX) ===> 傳回值 '000628'
有些使用者同時於多台工作站 SignOn進入系統, 要送訊息給使用者 , 但無法確知其真正正在使用之工作站, 系統有傳送中止畫面訊息指令 SNDBRKMSG , 傳送中止畫面訊息至指定工作站 ; 但無法滿足上述狀況 , 有無其他工具傳送中止畫面訊息至同時使用多台工作站的使用者 ? .............(1998/11/11)
要傳送訊息至 "以相同的 USER ID 同時使用多台工作站的使用者" , 亦即以此USER ID SignOn進入系統的所有工作站多將收到訊息 , 不管使用者正在使用那一台工作站; 試試底下指令 , 能滿足此需求
CALL QEZSNDMG ==> 畫面如下 :
能指定訊息型態中止畫面或要求使用者回覆訊息 ; 輸入訊息 ; 按 F10 傳送Send a Message Type information below, then press F10 to send. Message needs reply . . . . . . N Y=Yes, N=No Interrupt user . . . . . . . . . N Y=Yes, N=No Message text . . . . . . . . . . Send to . . . . . . . . . . . . Name, F4 for list More... F1=Help F3=Exit F10=Send F12=Cancel
如何取得由 Telnet 方式進入系統的 Client 端 IP address ?.............(1998/11/04)
利用 System API QDCRDEVD 取得 IP address ; 使用此範例程式時需輸入工作站名稱當參數 ,
如 CALL RTVDEVIPC PARM('QPADEV0001') ; CL 程式範例如下PGM (&DEVICENAME) /******************************/ /* PARAMETERS */ /******************************/ DCL &DEVICENAME *CHAR 10 DCL &IPADDRESS *CHAR 15 /******************************/ /* PARAMETERS FOR QDCRDEVD */ /******************************/ DCL &RECEIVER *CHAR 892 DCL &RCVRLENGTH *CHAR 4 DCL &FORMATNAME *CHAR 8 'DEVD0600' /* THE FORMAT FOR DISPLAY DEVICES */ DCL &ERRORCODE *CHAR 4 X'00000000' /* USE NORMAL ERROR HANDLING */ /******************************/ /* SET LENGTH OF RECEIVER */ /******************************/ CHGVAR %BIN(&RCVRLENGTH) 892 /******************************/ /* GET DEVICE INFO */ /******************************/ CALL PGM(QDCRDEVD) PARM(&RECEIVER &RCVRLENGTH + &FORMATNAME &DEVICENAME &ERRORCODE) CHGVAR &IPADDRESS %SST(&RECEIVER 878 15) SNDPGMMSG MSG(&DEVICENAME *BCAT ' IP address is ' + *cat &ipaddress ) MSGTYPE(*COMP) ENDPGM
利用系統應用程式介面 System API 的報表儲存及重新印表工具.............(1998/10/28)
Spooled file tools command : RTVSPLF & SPLRTVSPLF
Command Processing Program : RTVSPLC & SPLRTVSPLFC
有那些系統應用程式介面 System API 可供利用於儲存報表與重新列印報表 ? ............(1998/10/24)
要利用 System API 處理報表須使用二種 System API :
Spooled file API (報表系統應用程式介面 System API ) OS/400 Print APIs Chapter 3. Spooled File APIs
QUSRSPLA : Retrive Spooled File Attribute API 取得報表屬性如報表寬度, 份數等
QSPOPNSP : Open Spooled File API 開啟報表檔
QSPGETSP : Get Spooled File Data API 讀取報表資料儲存至 User Space 物件 "Format of the User Space" in topic 3.5.3
QSPCLOSP : Close Spooled File API 關畢報表檔
QSPCRTSP : Create Spooled File API 建立報表檔
QSPPUTSP : Put Spooled File Data API 從 User Space 物件讀取報表資料寫入報表檔
User Space API (使用者系統應用程式介面 System API) OS/400 Object APIs Chapter 4. User Space APIs
利用 User Space API 可建立屬性 *USRSPC 的物件自行運用(如存放報表資料及屬性) ; 故可將報表資料儲存至 User Space 物件 , 並保存於系統中, 於須要時重新列印報表QUSCRTUS : Create User Space API 建立 User Space 物件
QUSCHGUS : Change User Space API 修改 User Space 資料
QUSRTVUS : Retrive User Space API 讀取 User Space 資料
找 AS/400 Command 總是輸入 GO CMDXXX (XXX表示 Command 的前 3 位 , 如 WRK, STR, CRT 開頭的 Command) , 如此可能蠻廢時的 , 有一簡單的方式通知你 , 於命令列輸入 STR* , WRK* , CRT* , STRTCP* , A* 等 ,系統即會列出相關字開頭的 Command , 真的很方便 , 試了就知道 ............(1998/10/17)
當 STRPASTHR(Start PassThrough) 至另一台 AS/400 時 , 使用者常常未注意 Sign On 畫面系統名稱 , 而從 A 系統 passthrough 至 B 系統 , 再由 B 系統 passthrough 至 A 系統 , 形成迴圈 , 造成操作錯誤及降低效率 , 要如何防止這種情形發生 ? ............(1998/10/17)
當使用者從 A 系統 passthrough 至 B 系統 , Sign On 進入 B 系統執行完畢後 , 於結束應用軟體Sign off 時 , 將 Command SIGNOFF 改成 SIGNOFF ENDCNN(*YES) , 其效能與 ENDPASTHR 相同, 即退出 B 系統並自動回至 A 系統 ; 反之亦然 ; 如此可讓使用者回歸原系統控制 , 不會有迴圈發生
若不想改程式又想勞永逸 , 可將 A 與 B 系統的 Command SIGNOFF 更改參數預設值從
ENDCNN(*NO) 改為 ENDCNN(*YES) ; 可同時兼顧 正常的 Sign off 及 End Pasthrough 功能;
CHGCMDDFT CMD(QSYS/SIGNOFF) NEWDFT('ENDCNN(*YES)')
於通信線路設定時 , 通訊介面參數 V.24 與 V.35 有何差異 ? ............(1998/10/16)
差異在於 線路頻寬速度
V.24 ==> 2400bps <--> 19200 bps
V.35 ==> 2400bps <--> 128Kbps
如何同時將一份報表同時印至數台印表機 ? ............(1998/10/06)
基本上印一份報表至數台印表機 ,必需輪流印 , 而無法同時印一份報表至數台印表機 , 要達到上述要求有下述四種方法可以採用 :
1. 於程式中將相同的報表資料輸出至多個報表檔 , 於報表檔中或使用 CHGSPLFA 指定印表機
2. 使用 CPYSPLF 將報表備份至資料實體檔 (Physical File) , 再使用 RSTSPLF 再印一份(參考 1998/09/29 之小錦囊), 並使用 CHGSPLFA 指定印表機
3. 使用 QUSRTOOL 中之工具 DUPSPLF , 複製一份報表 , 並使用 CHGSPLFA 指定印表機
4. 建立一使用者並指定輸出印表機於 User Profile 參數 PRTDEV 中 , 於 WRKDIRE (Work with Directory Entries) 中建立一 該使用者目錄入口 , 並使用 SNDNETSPLF 命令於參數 TOUSRID 指定該使用者目錄入口位址 , 系統會自動複製一份報表 , 並將報表印至User Profile 參數 PRTDEV 中指定輸出印表機
系統備份無法儲存報表檔 , 要如何儲存報表檔並在需要時可重新列印 ? ............(1998/09/29)
1. 建立一個長度 202 的資料實體檔 (Physical File) 存放報表 (Spooled File) 資料
CRTPF FILE(library/spool_db) RCDLEN(202) + IGCDTA(*YES) MAXMBRS(*NOMAX)library/spool_db
: 請指定自己的 Library/File2.執行 CPYSPLF 命令將報表(Spooled File) 資料備份至資料實體檔 (Physical File)中, 並指定參數 CTLCHAR 如下:
CPYSPLF FILE(spool_file) TOFILE(library/db_file) JOB(job number/user/job name)+ TOMBR(spool_member) MBROPT(*REPLACE) CTLCHAR(*PRTCTL)3. 將報表(Spooled File) 資料備份至資料實體檔 (Physical File)後, 即可將此資料實體檔 (Physical File) 備份至磁帶中保存.
4. 執行 RSTSPLF 命令指定存放報表(Spooled File) 資料之實體檔 (Physical File)及欲重新列印報表資料成員(Member)輸入如下 :
RSTSPLF FRMFILE(library/spool_db) FRMMBR(spool_member)執行 RSTSPLF 命令後, 會產生報表檔名稱為 "存放報表資料實體檔名稱" 及 USERDATA 為 spool_member 之報表 :
例如 : RSTSPLF FRMFILE(QGPL/SPLFDB) FRMMBR(QSYSPRT)
會產生報表檔名稱為 : SPLFDB 及 屬性 USERDATA 為 QSYSPRT 之報表檔5. 將下列原始檔上傳至 AS/400
6. 建立 CRTPF FILE(INPUT) RCDLEN(202) +
IGCDTA(*YES) MAXMBRS(*NOMAX) 供 Compiled 報表重印程式 RSTSPLFR 使用.7. Compile 報表重印程式 RSTSPLFR , Compile 完成後可將前項建立之 INPUT 檔案刪除 ,
再 Compile 命令處理程式原始檔 Processing Program source RSTSPLFC,
再 下 CRTCMD CMD(RSTSPLF) PGM(RSTSPLFC) , Compile 命令 Command Source8. 此工具由於系統指令 CPYSPLF 僅能拷貝文字資料 ,無法拷貝Printer file DDS 中特殊格式屬性(如字元放大 , 格線 , 條碼等) , 故僅適用於正常報表. 若使用此系統指令 CPYSPLF拷貝含有特殊格式屬性的報表 , 系統會顯示此系統指令不支援特殊格式屬性錯誤訊息, 若回 "I" , 系統僅拷貝文字資料, 而遺失特殊格式屬性. 若要儲存有特殊格式屬性的報表 , 需要使用系統應用程式介面 System API , 此工具足以適用於一般性報表.
如何將報表檔 (Spooled File) 轉成網頁 (Web Page) 資料 ? ............(1998/09/15)
1. 建立一個長度 240 的原始檔 (Source Physical File) 存放網頁 (Web Page) 資料
CRTSRCPF File(WEBSAMP/HTMLDOC) RCDLEN(240) IGCDATA(*YES)
WEBSAMP/HTMLDOC : 亦可指定自己的 Library/File ; 只要執行命令時將 Library 加入 Library List 中即可
2. 於原始檔 WEBSAMP/HTMLDOC (Source Physical File 亦可指定自己的 Library/File)中 , 新增一個名稱為 "HTMTAG" 的文字成員(Text type Member) , 並輸入資料如下 :
第一行 : <HTML>
第二行 : <PRE>
第三行 : </PRE>
第四行 : </HTML>
3. 將下列原始檔上傳至 AS/400
- 命令原始檔 Command Source : CVTSPLWEB
- 命令處理程式原始檔 Processing Program source : CVTSPLWEBC
4. 先 Compile 命令處理程式原始檔 Processing Program source ,
再 下 CRTCMD CMD(CVTSPLWEB) PGM(CVTSPLWEBC) ,
Compile 命令 Command Source5. 執行命令前先將第一項所建立存放網頁 (Web Page) 資料原始檔所在之 Library 加入 Library List 中