2011-01-19 12 views
0

私は自宅で少しのコードを作成しています。これは、エラーを見つけて特定することが入力ファイルであると考えられます。私はちょうど正しいことを得たが、2つの小さな誤りが私に当たっている。しかし、これは大きな問題です。私は最初の5列が数値であると考えているのでエラーとして "3077.B22"を識別するコードを作成する必要がありますが、私の現在のコードはそれを渡しています。それは他のすべてのものに当てはまるので、私はそれが小数点としてピリオドを見ていると信じなければならない。ここで私はこの部分に懸念を持っています。期間は数値としてカウントされます(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. 

私の2番目の問題は、別のフィールドに*がアルファベットとして表示されているのと同様の原因です。ここで はそれと段落です:

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

これを覚えておいてください。企業としては、MicrosoftはCOBOLよりも新しいものです。また、現在のコンパイラはOSはもちろんのこと、コンパイルできないという理由から、MSの初めからMSプラットフォームでコードを実行しているインストールはありません。コアシステム(多くの銀行がそうするように)で5000万を使うつもりなら...プラットフォームを選ぶのに数分を要します。 –

答えて

4

の例外に が セットパートのNum-有効でない:

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 

なぜ 'YES' とFIELD-ERROR-SWITCHセットではないでしょうか? COBOLは 範囲テスト(ここでのキャストルールは複雑ですので、私は に入るつもりはありません)を適用する前に 00001と99999をPIC Xの同等物にキャストします。実際のテストCOBOLは、ここで を行い、次のとほぼ同等です:これらの条件を、文字列をテストしていることを考えると

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

あなたがFIELD-ERROR-SWITCH設定迂回することを意味し、 真です。 COBOLで 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 XまたはPIC 9と宣言されている場合、期間/プラス/マイナスはNUMERICではありません。基本項目がPIC S9(5) PACKED-DECIMALと宣言されていた場合、先行サインはNUMERICテストに合格します。 COBOL NUMERICクラスのテストには、完全に理解するための少しの研究が必要です。

大きなヒント:数値であると想定されるものが、数値として宣言された基本項目に という名前で格納されていることを確認します。私はP-N-NUM-1P-N-NUM-2PIC 9を使って宣言しようとします。未検証データをPART-NUMBER-CHECKに移動します。デフォルトでは がPIC Xであるため、エラーは発生せず、次に IF NUMERICテストを使用して基本数値データ項目を検証します。数値データがあることがわかったら、範囲テスト(00001 THRU 99999、 より大きい/小さい)があなたを迷惑にならないようにします。

なぜ「*」がコードの2番目のビットを覗き見ていますか?アルファベット以外の文字にはエラー番号を設定しません。 は数値のみです。あなたのNUMERIC試験をNOT ALPHABETIC試験に合格するのはなぜですか?

これが役立つかどうかを確認してください。

+0

それでした。完璧。どうもありがとうございました。私は何かが数値かどうかをチェックし、何かがアルファベットでないかどうかをチェックするのに違いがあることを覚えておく必要があります。どうもありがとう。 – Kimmy1235

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)。

計算パートのNum =機能NUMVAL(パートのNum-入力)次の宣言を考えると、真 エンド計算

+1

私は 'COMPUTE'に' EXCEPTION'というフレーズがあるとは思わない。たぶん、ON SIZE ERRORを考えていたかもしれませんが、これは検証としてはあまり役に立たないでしょう – NealB

関連する問題