大学のトランザクション処理コースのソース コードを編集しています。COBOL/CICS を使用しており、プログラムはビデオ テープのレンタル システムです。変更点のリストがあり、1 つの項目で行き詰まっています (COBOL コースを受講してから 2010 年の秋学期以降なので、残念ながら私は必要以上に錆びています)。ユーザーが新しい顧客を追加できる「顧客管理」セクションがあります。新規顧客向けの項目の 1 つは郵便番号です。現状では、任意の入力を有効な入力として受け取りますが、特定の値だけでなく、数値 (方法は知っています) のみを受け入れるようにする必要があります。形式: '12345'、'123456789'、または '12345-6789' のいずれかであり、'12345' または '12345-6789' としてのみレコードに書き込む必要があります。「1234」など、その他すべて または 12345-6' はエラーになります。これらのフィールドが適切な形式であるかどうかを確認するにはどうすればよいですか?
4 に答える
有効なデータ形式が決まっているので簡単です。
05 nice-name-for-zip-code pic x(10).
05 filler redefines nice-name-for-zip-code.
10 simple-zip-first-part pic x(5).
10 simple-zip-last-part pic x(5).
88 simple-zip-last-part-valid value space.
05 filler redefines nice-name-for-zip-code.
10 complex-zip-first-part pic x(5).
10 complex-zip-separator pic x.
88 complex-zip-separator value "-".
10 complex-zip-last-part pic x(4).
05 filler redefines nice-name-for-zip-code.
10 long-zip-first-part pic x(9).
10 long-zip-last-part pic x.
88 long-zip-last-part-valid value space.
if ( simple-zip-first-part numeric )
and ( simple-zip-last-part-valid )
....
if ( complex-zip-first-part numeric )
and ( complex-zip-separator-valid )
and ( complex-zip-last-part numeric )
....
if ( long-zip-first-part numeric )
and ( long-zip-last-part-valid )
....
いずれかの IF が true の場合、有効な形式があります。それ以外の場合は無効です。
別の方法として、CICS BMS サポートにほとんどの検証と編集を任せることができます。これは、CICS で 3270 タイプの端末を使用していることを前提としています (おそらくそうです)。
郵便番号を BMS マップのグループ フィールドとして設定してみてください。これには、複数の部分を持つ単一の入力フィールドを作成する効果があります。
BMS マップの定義は次のようになります。
ZIP1 DFHMDF POS=(2,1),LENGTH=5,GRPNAME=ZIP,ATTRB=(UNPROT,NUM)
SEP DFHMDF POS=(2,6),LENGTH=1,GRPNAME=ZIP,ATTRB=(ASKIP,NORM),INITIAL='-'
ZIP2 DFHMDF POS=(2,7),LENGTH=5,GRPNAME=ZIP,ATTRB=(UNPROT,NUM),JUSTIFY=(LEFT,BLANK)
郵便番号は 2 行目の先頭に表示されます (POS=(2..))。郵便番号の最初の部分には 5 桁の入力フィールド (ZIP1) があり、その後にハードコードされた入力保護ダッシュ (SEP) が続き、最後の部分には左寄せの 5 桁の空白埋め入力フィールド (ZIP2) が続きます。郵便番号。
この時点から、BMS はユーザーに郵便番号の最初の部分に 5 桁を入力することを強制し、ダッシュに触れることはできず、オプションで入力フィールドの 2 番目の部分に 0 から 5 桁を入力できます。これらのフィールドはいずれも非数値データを受け入れません (入力保護されている SEP を除く)。
画面からデータを取得するときは、ZIP2 が数値かどうかをチェックして、入力された郵便番号が長いか短いかを判断するだけです。長い Zip の場合はすべてを保存し、短い場合は ZIP1 のみを保存します。
MOVE CORRを使用できます
01 TX-ZIPCODE PIC X(08) VALUE ' - '.
01 TX-ZIPCODE-R REDEFINES TX-ZIPCODE.
03 ZIPCODE-P1 PIC 9(04).
03 FILLER PIC X(01).
03 ZIPCODE-P2 PIC 9(03).
01 NUM-ZIPCODE PIC X(07).
01 NUM-ZIPCODE-R REDEFINES NUM-ZIPCODE.
03 ZIPCODE-P1 PIC 9(04).
03 ZIPCODE-P2 PIC 9(03).
MOVE CORR TX-ZIPCODE-R TO NUM-ZIPCODE-R.
IF NUM-ZIPCODE IS NOT NUMERIC
* ERRO
END-IF.
私があなたを助けてくれることを願っています!:)