2011-01-19 65 views
0

我正在處理一些家中的代碼,假設查找並識別錯誤是輸入文件。我明白了,但兩個小錯誤正在打擊我。但主要問題是這樣的。我必須製作一個標識「3077.B22」爲錯誤的代碼,因爲前5列是假設爲數字的,但我當前的代碼正在讓它通過。它擊中所有其他東西,所以我不得不相信它將小時看作小數點。這是我對這部分的關注。週期計數爲數字(COBOL)

01 PART-NUMBER-CHECK. 
     05 P-N-NUM-1    PIC X(5). 
     05 P-N-LETTER    PIC X. 
     05 P-N-NUM-2    PIC XX. 

    300-VALIDATE-PART-NUMBER. 
     MOVE 'NO' TO FIELD-ERROR-SWITCH 
     MOVE PART-NUMBER TO PART-NUMBER-CHECK 
     EVALUATE P-N-NUM-1 
      WHEN 00001 THRU 99999 CONTINUE 

      WHEN OTHER    MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-EVALUATE 
     IF P-N-LETTER IS NUMERIC 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-IF 
     IF P-N-LETTER IS ALPHABETIC-LOWER 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-IF 
     IF P-N-NUM-2 IS ALPHABETIC 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-IF 
     IF (P-N-NUM-2 > 00 AND < 69) 
      OR (P-N-NUM-2 >77 AND < 100) 
       CONTINUE 
     ELSE 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-IF 
     IF FIELD-ERROR-SWITCH = 'YES' 
      MOVE 'YES' TO RECORD-ERROR-SWITCH 
      MOVE 'Part Number' TO FIELD-NAME 
      MOVE PART-NUMBER TO FIELD-VALUE 
      PERFORM 400-WRITE-DETAIL-LINE 
     END-IF. 

我的第二個問題是類似的,因爲它在另一個字段中看到*爲字母。 這裏是款到:

340-VALIDATE-INITIAL. 
     MOVE 'NO' TO FIELD-ERROR-SWITCH 
     INSPECT INITIALS 
      TALLYING I-CHECK FOR ALL SPACES 
     IF I-CHECK > 0 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
      MOVE 0 TO I-CHECK 
     END-IF 
     IF INITIALS IS NUMERIC 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
     END-IF 
     IF FIELD-ERROR-SWITCH = 'YES' 
      MOVE 'YES' TO RECORD-ERROR-SWITCH 
      MOVE 'Initials' TO FIELD-NAME 
      MOVE INITIALS TO FIELD-VALUE 
      PERFORM 400-WRITE-DETAIL-LINE 
     END-IF. 

請幫幫忙,我只要我克服在路上這個小凸起來完成。

+0

請記住:微軟作爲一個比COBOL更新的企業。從MS開始,目前沒有安裝MS平臺的代碼,只是因爲它們目前的編譯器無法編譯它,更不用說它們的操作系統了。如果你打算在覈心繫統上花費5000萬美元(就像很多銀行一樣)......請給自己幾分鐘時間來選擇一個平臺。 – 2011-01-19 06:02:25

回答

4

考慮以下聲明:

01 PART-NUMBER-CHECK. 
    05 P-N-NUM-1    PIC X(5). 
    05 P-N-LETTER    PIC X. 
    05 P-N-NUM-2    PIC XX. 

和類似:

MOVE 'NO' TO FIELD-ERROR-SWITCH 
    MOVE '3077.B22' TO PART-NUMBER-CHECK 
    EVALUATE P-N-NUM-1 
     WHEN 00001 THRU 99999 CONTINUE 
     WHEN OTHER    MOVE 'YES' TO FIELD-ERROR-SWITCH 
    END-EVALUATE 

爲什麼不是FIELD-ERROR-SWITCH設定爲 'YES'? COBOL將 00001和99999投入其PIC X當量,然後應用 範圍測試(這裏的投射規則相當複雜,所以我不打算 進入)。實際測試COBOL執行這裏 大致等同於以下內容:

IF '00001' <= '3077.' AND '99999' >= '3077.' 

鑑於這些字符串測試條件爲真 ,這意味着你繞過設置FIELD-ERROR-SWITCH。在COBOL中使用 a THRU範圍測試非常有用,但需要謹慎。當您知道您有有效數據開頭或正在進行單個字符 比較時,僅使用 THRU。例如

05 TEST-CHAR PIC X. 
    88 IS-DIGIT  VALUE '0' THRU '9'. 
    88 IS-LOWER-LETTER VALUE 'a' THRU 'i', 
          'j' THRU 'r', 
          's' THRU 'z'. 
    88 IS-UPPER-LETTER VALUE 'A' THRU 'I', 
          'J' THRU 'R', 
          'S' THRU 'Z'. 
    88 IS-SPACE  VALUE SPACE. 

那麼這樣的代碼:

MOVE SOME-CHAR TO TEST-CHAR 
EVALUATE TRUE 
    WHEN IS-DIGIT 
     DISPLAY 'IS A DIGIT' 
    WHEN IS-LOWER-LETTER OR IS-UPPER-LETTER 
     DISPLAY 'IS ALPHA' 
    WHEN IS-SPACE 
     DISPLAY 'IS A SPACE' 
    WHEN OTHER 
     DISPLAY 'IS A SOMETHING ELSE' 
END-EVALUATE 

幾乎是防彈。 爲什麼我將字母範圍分成不同的組?查看EBCDIC 排序順序,您會發現一些非字母字符在'i'和'j'之間潛入 ,然後再次在'r'和's'之間!哦,我喜歡EBCDIC!

如何解決您的問題?一些簡單的:

IF P-N-NUM-1 IS NUMERIC 
    IF P-N-NUM-1 = ZERO 
     MOVE 'YES' TO FIELD-ERROR-SWITCH 
    END-IF 
ELSE  
    MOVE 'YES' TO FIELD-ERROR-SWITCH 
END-IF 

會做的伎倆。 NUMERIC測試可確保P-N-NUM-1僅由數字組成 。 ZERO測試確保它不是零。在這種情況下NUMERIC測試中排除負數 。當正在測試的 項目被聲明爲PIC XPIC 9時,期間/加號/減號不是NUMERIC。如果基本項目被宣佈爲PIC S9(5) PACKED-DECIMAL,那麼前導符號將通過NUMERIC測試。 COBOL NUMERIC類測試需要一點研究才能完全理解。

大提示:確保應該爲數字的東西在聲明爲數字的基本項中存儲 。我會嘗試使用PIC 9來聲明P-N-NUM-1P-N-NUM-2。將未驗證的數據移入PART-NUMBER-CHECK,默認情況下 爲PIC X,因此不會出現錯誤,然後使用 IF NUMERIC測試驗證基本數字數據項。一旦你知道你有數字數據,那麼你的範圍測試(例如00001 THRU 99999, 大於/小於)不會使你誤入歧途 - 就像這裏發生的那樣。

爲什麼'*'偷偷摸摸地通過你的第二位代碼?您從來不會在非字母字符上設置錯誤, 僅限於數字。爲什麼不試試將NUMERIC測試翻成NOT ALPHABETIC測試?

看看是否有幫助!

+0

就是這樣。完善。非常感謝你。我將不得不記住檢查是否有數字,並檢查是否有字母不符。非常感謝。 – Kimmy1235 2011-01-20 01:43:35

0

,因爲我寫我的最後一個COBOL,我不手邊有一個編譯器,所以我們期待在代碼中的一些sintax檢查,但你會得到的想法很長一段時間......

01 PART-NUMBER-CHECK. 
    05 P-N-NUM-1    . 
     07 p-x-occ occurs 5  pic X. 
    05 P-N-NUM-1-N redefines P-N-NUM-1.   . 
     07 p-n-occ occurs 5  pic 9. 
    05 P-N-LETTER    PIC X. 
    05 P-N-NUM-2    PIC XX. 

01 FIELD-ERROR-SWITCH pic x(3). 
    88 no-error value 'NO'. 

300-VALIDATE-PART-NUMBER. 
    MOVE 'NO' TO FIELD-ERROR-SWITCH 
    MOVE PART-NUMBER TO PART-NUMBER-CHECK. 
    perform validate-p-n-occurs varying I from 1 to 5. 
    if no-error 
     IF (P-N-LETTER IS NUMERIC or P-N-LETTER IS ALPHABETIC-LOWER or 
      P-N-NUM-2 IS ALPHABETIC) 
     MOVE 'YES' TO FIELD-ERROR-SWITCH 
     ELSE  
      IF (P-N-NUM-2 < 0) OR (P-N-NUM-20 > 68 AND < 79) OR (P-N-NUM-2 >99) 
      MOVE 'YES' TO FIELD-ERROR-SWITCH 
      END-IF 
     END-IF 
    END-IF 

    IF FIELD-ERROR-SWITCH = 'YES' 
     MOVE 'YES' TO RECORD-ERROR-SWITCH 
     MOVE 'Part Number' TO FIELD-NAME 
     MOVE PART-NUMBER TO FIELD-VALUE 
     PERFORM 400-WRITE-DETAIL-LINE 
    END-IF. 

validate-p-n-occurs. 
    IF p-x-occ(I) is not NUMERIC or (p-n-occ(I) < 0 or > 10) 
     MOVE 'YES' TO FIELD-ERROR-SWITCH 
    END-IF.  
1

你在正確的軌道上,但你的編譯器是否支持NumVal函數?你可以這樣做:

01 Part-Num 9(5).9(2)。

計算部分,民=功能NumVal(部分-NUM-輸入) 上異常 設置部分-NUM-不-有效到真正 最終計算

+1

我不認爲`COMPUTE`有一個`ON EXCEPTION`短語。也許你正在考慮「ON SIZE ERROR」,這不會有太大的用處,那就是驗證 – NealB 2013-01-18 19:42:14