2012-01-26 9 views
4

私は大学の私の第二四半期にだと「高度なCOBOL」を取って、私たちはただ、異なるデータのためのいくつかの検証手順でコーディングする私たちを必要と割り当てを受けました。私は小さな検証手続きを除いてすべてを行っています。大文字のCOBOLデータ検証?

8バイト長である「PART-NUMBER」と呼ばれるフィールドがあります。最初の5列は数字でなければなりません。 6番目の列は大文字で、最後の2つの列は01-68または78-99の範囲内になければなりません。私が持っている唯一の問題は、第六列が首都であることを検証する方法を考え出すことです。 ワーキングストレージから:ここで

は、私が使用していたコードである300-VALIDATE-PART-NUMBERから

01 DETAIL-LINE.           
05 PART-NUMBER.          
    10 PART-FIRST-FIVE-DL  PIC X(5).   
    10 PART-LETTER-DL   PIC X.    
     88 CAPITAL-LETTER  VALUE 'A' THRU 'Z'. 
    10 PART-LAST-TWO-DL   PIC XX. 

EVALUATE PART-LETTER-DL ALPHABETIC    
    WHEN TRUE EVALUATE CAPITAL-LETTER    
     WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH 
     MOVE 'PART NUMBER' TO FIELD-NAME    
     MOVE PART-NO-IN TO FIELD-VALUE    
     MOVE 'YES' TO PART-NO-ERROR     
    END-EVALUATE          
    WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH  
    MOVE 'PART NUMBER' TO FIELD-NAME     
    MOVE PART-NO-IN TO FIELD-VALUE     
    MOVE 'YES' TO PART-NO-ERROR      
END-EVALUATE 

私はおそらくでこれをやっていないよ知っています非常に効率的な方法ですが、今のところ私はそれを働かせる必要があります。私は本からのデータ検証に関する章全体を読んだが、これは最後のエラー(プログラムは明日に予定されている)なので、先生は利用できない。私はこれで得ることができるどんな助けにも大いに感謝します。私は大文字を検証する方法について本当に迷っています。私が使用している方法は、部品番号の6番目の列にAまたはZ以外のものがあれば、エラーを報告するようになりました。

+0

誰か昨年は同じ問題を抱えていたが、限り、あなたが行ったようにそれをしなかった - [データの検証(COBOL)](http://stackoverflow.com/questions/4719008/data-validation-cobol) - しかし答えはいいです。 – sarnold

+0

ええ、私は質問を投稿する前にそれを実際に見つけましたが、私はそれを全く理解しませんでした。これまでのところ私が教えてきたことを超えていると思う。 – Shane

答えて

4

私はあなたのコードと根本的に間違って何も表示されません。私はそれを ドライバプログラムに入れ、コンパイルして実行しました。期待通りの結果が得られました。PART-NUMBERの6番目の文字が大文字でなかった場合、エラーが報告されたのは でした。

あなたのCOBOLのコーディングスタイルは、(ちょうど 異なる、間違っていない)私は見慣れていたものとは非常に異なっています。それ以外の場合は エラーが(ELSE部分)が報告され、

IF PART-LETTER-DL IS ALPHABETIC AND 
     CAPITAL-LETTER 
     CONTINUE 
    ELSE 
     MOVE 'PART NUMBER' TO FIELD-NAME    
     MOVE PART-NO-IN TO FIELD-VALUE    
     MOVE 'YES' TO PART-NO-ERROR 
    END-IF 

IFは、あなたの編集の基準の両方を適用し、両方のパスが(CONTINUE)場合は、何もしません:

ほとんどのベテランCOBOLプログラマは次のようにコーディングします。上記のコードは、コード のコードと実質的に同じですが、ではなくIFを使用します。

私はALPHABETICと大文字の の両方について、88レベルの範囲(THRU)を使用してテストするための完全なマークを与えます。多くのプログラマは88レベルのみを使用し、 は 'A' THRU 'Z'がアルファベット文字のみをカバーするという暗黙の前提を設定しています - これは一部の環境(特にEBCDIC文字セット)では間違った です。

P.S.キミが持っていたのと同じ先生がいなくてはならないことが皆さんに分かります!あなたが心配する必要があります

1

ことの一つは、「『Z』スルー値 『A』」です。これはASCIIマシンでのみ動作します。

あなたが実際に値 'A'、 'B'、 'C​​'、... 'Z' をコーディングした場合。すべてのプラットフォームで動作します。EBCDICについては

+0

質問に表示されるコードは、すべてのプラットフォームで正しく動作します。 私は考えることができます。同じ値の範囲内に大文字と小文字が混在した文字セット がセットされた場合にのみ失敗します。 これは、ASCII、EBCDIC、またはUnicode文字セットでは発生しませんので、私は というアプローチを使用しました。 Z '値の範囲 『を介して「非アルファベット文字は 内で発生するため、' ALPHABETIC' テストがEBCDICに失敗することなくZ''』THRUしかし、'「A」。 – NealB

+0

"A"から "Z"までは、非文字を有効にすることができます... EBCDICで。 –

+0

...アルファベットではありません - 2つのテストを一緒にするとこの問題は解決します – NealB

0

、ALPHABETICテストをドロップすると、ちょうど88を使用します。個々の文字を指定

88 CAPITAL-LETTER  VALUE 'A' THRU 'I' 
           'J' THRU 'R' 
           'S' THRU 'Z'. 

は動作しますが、26の比較を生成します!上記は3つを生成する。 ALPHABETICプラス 'A' THRU 'Z'は2つしかありませんが、スペースはアルファベットで、THRUにはX'C1 'からX'E9'の範囲にある印刷できない数字が含まれています。あなたはALPHABETIC-UPPER条件をテストすることができ、大文字の場合は

1

IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER 
... 
END-IF. 

ALPHABETIC-LOWERがあまりにも使用されるが、そうあなただけの資本が必要な場合はスペースが必要であり、テスト、ALPHABETICを考えられるSPACEを思い出すことができます手紙。

関連する問題