%CHECK 內建函數

check 內建函數 (%CHECK) 會傳回 基本字串 的第一個位置,其中包含未出現在 比較運算子字串中的字元。 如果基本字串中的所有字元也出現在比較運算子字串中,則函數會傳回 0。

%CHECK 內建函數可以在 CL 支援算術表示式的任何地方使用。 %CHECK 可以單獨使用,也可以作為更複雜的算術表示式的一部分。 例如, %CHECK 可用來與 IFWHEN 指令的 COND 參數中的數值 CL 變數比較。 如果相關指令物件定義具有 EXPR (*YES) 且 TYPE 為 *DEC、 *INT2、 *INT4、 *UINT2或 *UINT4的參數,則 %CHECK 也可以用來設定 CL 指令參數的值。

check 內建函數的格式為:
%CHECK(comparator-string base-string [starting-position])

比較運算子字串 必須是 CL 字元變數或字元文字。 基本字串 可以是 CL 字元變數或 *LDA。 當指定 *LDA 時,會對工作的本端資料區內容執行檢查功能。 起始位置 是選用的,預設為 1。 檢查從起始位置 (開始) 開始,並繼續向右,直到找到比較運算子字串中未包含的字元為止。 結果一律相對於來源字串中的第一個位元組,即使已指定起始位置也一樣。 如果指定起始位置,則必須是 CL 整數變數或具有零小數位數的 CL 十進位變數或具有零小數位數的數值文字。 起始位置不能是零或負數。 如果起始位置大於整個基本變數或區域資料區的長度,則會發生錯誤。 本端資料區的長度為 1024。

下列範例是關於 check 內建函數:

  • 請檢查是否有任何不是數字 (0-9) 的字元。 在這裡,比較運算子字串是包含字元數字 0 到 9 的字元文字。 If the CL variable &SN contains any characters that are not digits, a message is sent.
    PGM PARM(&SN) 
    DCL VAR(&SN) TYPE(*CHAR) LEN(10) 
    IF COND(%CHECK('0123456789' &SN) *NE 0) + 
       THEN(SNDPGMMSG ('INVALID CHARACTER FOUND!'))
  • 尋找第一個不是錢幣符號或星號的字元。 The characters in variable &PRICE are checked from left to right. Since the first character that is not a dollar sign or asterisk is the eighth character, the value 8 is assigned to CL variable &POS by the CHGVAR command.
    DCL VAR(&PRICE) TYPE(*CHAR) VALUE('$******5.27***      ') 
    DCL VAR(&COMP) TYPE(*CHAR) LEN(2) VALUE('$*’) 
    DCL VAR(&POS) TYPE(*UINT) LEN(2)  
    CHGVAR VAR(&POS) VALUE(%CHECK(&COMP &PRICE))
  • 檢查是否有任何字元不是數字,從字串中的特定位置開始。 The characters in CL variable &SN are checked starting with the fifth byte. If there are characters in bytes 5 through 10 of &SN that are not digits, a message is sent.
    PGM PARM(&SN) 
    DCL VAR(&SN) TYPE(*CHAR) LEN(10) 
    DCL VAR(&POS) TYPE(*UINT) LEN(2) VALUE(5) 
    IF COND(%CHECK('0123456789' &SN &POS) *NE 0) + 
       THEN(SNDPGMMSG ('INVALID CHARACTER FOUND!'))
  • 請檢查區域資料區 (*LDA) 中的字元。 The position of the leftmost byte in the local data area (LDA) that is not a character digit is assigned to CL variable &POS. 如果 LDA 的所有 1024 個字元都是字元數字。 a value of zero is assigned to variable &POS.
    DCL VAR(&POS) TYPE(*UINT) LEN(2) 
    CHGVAR VAR(&POS) VALUE(%CHECK('0123456789' *LDA))