COBOLのACCEPT文にはユーザー入力を受け取る用途とシステム情報(日付・時刻・環境変数)を取得する用途の2つがあります。対話的なコンソール入力だけでなく、バッチ処理のJCL SYSINからパラメータを受け取るパターンも実務では頻繁に使われます。
この記事ではACCEPT文のFROM句の全オプション・入力バリデーション付きの再入力ループ・メニュー選択・Y/N確認プロンプト・SYSINによるバッチパラメータ受け取りまで解説します。日付・時刻の取得(ACCEPT FROM DATE/TIME/DAY)の詳細は日付・時刻の扱い方完全ガイドを参照してください。
- ACCEPT文の完全な構文とFROM句の全オプション
- FROM CONSOLEによる対話的な入力と入力バリデーション
- FROM SYSINによるバッチパラメータの受け取り(z/OS)
- FROM ENVIRONMENT(環境変数の取得)
- バリデーション付き再入力ループ・メニュー選択・Y/N確認プロンプトの実践パターン
- バッチ処理でACCEPTを使う際の注意点
ACCEPT文の2つの用途と構文
ACCEPT文は「入力を受け取る」という1つの命令ですが、用途が2系統あります。
| 用途 | 内容 | 例 |
|---|---|---|
| ユーザー入力 | キーボード・SYSINから文字・数値を受け取る | ACCEPT WS-VAR FROM CONSOLEACCEPT WS-VAR FROM SYSIN |
| システム情報取得 | 日付・時刻・曜日・環境変数をOSから取得する | ACCEPT WS-DATE FROM DATE YYYYMMDDACCEPT WS-VAR FROM ENVIRONMENT 'ENV_NAME' |
ACCEPT データ名
[FROM {CONSOLE
| SYSIN
| DATE [YYYYMMDD]
| TIME
| DAY [YYYYDDD]
| DAY-OF-WEEK
| ENVIRONMENT データ名またはリテラル
| デバイス名}]
[END-ACCEPT].
| FROM句 | 動作 |
|---|---|
| FROM CONSOLE | キーボード(標準入力)から1行入力を受け取る。ENTERキーで確定 |
| FROM SYSIN | IBM z/OSでJCLのDD SYSINから1レコードを読み込む。バッチパラメータに使う |
| FROM 省略 | 環境のデフォルト(通常はCONSOLEまたはSYSIN)。コンパイラ依存 |
| FROM DATE [YYYYMMDD] | 現在日付を取得。YYYYMMDD指定で8桁。省略で6桁(2桁年) |
| FROM TIME | 現在時刻をHHMMSSCC(8桁)で取得 |
| FROM DAY [YYYYDDD] | ユリウス通日(年間通算日数)を取得 |
| FROM DAY-OF-WEEK | 曜日を1〜7の数字で取得(1=月曜〜7=日曜) |
| FROM ENVIRONMENT リテラル | 環境変数の値を取得(GnuCOBOLなど対応環境) |
FROM CONSOLEによるユーザー入力
最も基本的な使い方です。プログラムがACCEPT文に達するとENTERキーが押されるまで待機し、入力された値をデータ名に格納します。
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(30).
01 WS-EMP-NO PIC 9(6).
01 WS-AMOUNT PIC 9(9)V99.
PROCEDURE DIVISION.
*--- 文字列の入力 ---
DISPLAY '氏名を入力してください: ' WITH NO ADVANCING
ACCEPT WS-NAME FROM CONSOLE
DISPLAY 'こんにちは、' WS-NAME ' さん'
*--- 数値の入力 ---
DISPLAY '社員番号(6桁)を入力: ' WITH NO ADVANCING
ACCEPT WS-EMP-NO FROM CONSOLE
DISPLAY '社員番号: ' WS-EMP-NO
*--- FROM省略(CONSOLE相当) ---
DISPLAY '金額を入力: ' WITH NO ADVANCING
ACCEPT WS-AMOUNT *> FROM省略でデフォルト入力元から受け取る
STOP RUN.
ACCEPTで入力した文字数がPICの桁数より短い場合、PIC X変数は右側がスペースで埋まります。PIC 9変数は左側がゼロで埋まります。入力が桁数より長い場合は、超過した部分が切り捨てられます(エラーにはならない)。例えば
PIC X(10)に20文字入力すると最初の10文字だけが格納されます。入力バリデーション
ユーザーが入力した値が正しい形式かどうかを確認する処理は必須です。数値チェック・空白チェック・範囲チェックを組み合わせて実装します。
WORKING-STORAGE SECTION.
01 WS-INPUT-STR PIC X(8). *> 文字として受け取る(数値チェック前)
01 WS-DATE-NUM PIC 9(8). *> 検証後に格納する数値
01 WS-VALID-FLAG PIC X(1).
88 INPUT-VALID VALUE 'Y'.
88 INPUT-INVALID VALUE 'N'.
PROCEDURE DIVISION.
PERFORM WITH TEST BEFORE
UNTIL INPUT-VALID
*--- 入力受け取り ---
DISPLAY '処理日付を入力 (YYYYMMDD): '
WITH NO ADVANCING
ACCEPT WS-INPUT-STR FROM CONSOLE
*--- バリデーション ---
MOVE 'N' TO WS-VALID-FLAG
*--- ① 空白チェック ---
IF WS-INPUT-STR = SPACES
DISPLAY '入力が空白です。再入力してください'
CONTINUE
END-IF
*--- ② 数値チェック ---
IF WS-INPUT-STR NOT NUMERIC
DISPLAY '数値以外が含まれています。再入力してください'
CONTINUE
END-IF
MOVE WS-INPUT-STR TO WS-DATE-NUM
*--- ③ 日付として有効かチェック ---
IF FUNCTION TEST-DATE-YYYYMMDD(WS-DATE-NUM) NOT = 0
DISPLAY '無効な日付です。再入力してください'
CONTINUE
END-IF
MOVE 'Y' TO WS-VALID-FLAG
END-PERFORM
DISPLAY '入力日付: ' WS-DATE-NUM
STOP RUN.
PIC 9(8)の変数に直接ACCEPTして非数値文字(アルファベットなど)が入力されると、実行時エラーまたは不定動作になります。ユーザー入力は一度PIC X(文字型)で受け取り、NUMERICチェック後に数値変数にMOVEするのが安全なパターンです。バリデーション付き再入力ループ
入力エラー時に再入力を求めるループパターンです。PERFORM UNTIL で「正しい入力が得られるまで繰り返す」構造を作ります。
WORKING-STORAGE SECTION.
01 WS-INPUT-RAW PIC X(10).
01 WS-EMP-NO PIC 9(6).
01 WS-RETRY-COUNT PIC 9(2) VALUE 0.
01 WS-MAX-RETRY PIC 9(2) VALUE 3.
01 WS-INPUT-OK PIC X(1).
88 GOT-VALID-INPUT VALUE 'Y'.
PROCEDURE DIVISION.
MOVE 'N' TO WS-INPUT-OK
MOVE 0 TO WS-RETRY-COUNT
PERFORM UNTIL GOT-VALID-INPUT
ADD 1 TO WS-RETRY-COUNT
*--- リトライ回数の上限チェック ---
IF WS-RETRY-COUNT > WS-MAX-RETRY
DISPLAY '入力エラーが続いたため処理を中断します'
MOVE 8 TO RETURN-CODE
GOBACK
END-IF
DISPLAY '社員番号(6桁の数字): '
WITH NO ADVANCING
ACCEPT WS-INPUT-RAW FROM CONSOLE
*--- バリデーション ---
EVALUATE TRUE
WHEN WS-INPUT-RAW = SPACES
DISPLAY '入力が空白です'
WHEN WS-INPUT-RAW NOT NUMERIC
DISPLAY '数値のみ入力してください'
WHEN FUNCTION LENGTH(
FUNCTION TRIM(WS-INPUT-RAW)) > 6
DISPLAY '6桁以内で入力してください'
WHEN OTHER
MOVE WS-INPUT-RAW TO WS-EMP-NO
MOVE 'Y' TO WS-INPUT-OK
END-EVALUATE
END-PERFORM
DISPLAY '受け付けた社員番号: ' WS-EMP-NO
STOP RUN.
メニュー選択の実装
複数の処理から1つを選ぶメニュー画面はACCEPT文の典型的な活用例です。EVALUATE文と組み合わせて実装します。
WORKING-STORAGE SECTION.
01 WS-MENU-SEL PIC X(1).
88 SEL-INQUIRY VALUE '1'.
88 SEL-UPDATE VALUE '2'.
88 SEL-REPORT VALUE '3'.
88 SEL-EXIT VALUE '0'.
PROCEDURE DIVISION.
PERFORM UNTIL SEL-EXIT
DISPLAY ' '
DISPLAY '=============================='
DISPLAY ' 給与管理システム メインメニュー'
DISPLAY '=============================='
DISPLAY ' 1. 給与照会'
DISPLAY ' 2. 給与更新'
DISPLAY ' 3. 帳票出力'
DISPLAY ' 0. 終了'
DISPLAY '------------------------------'
DISPLAY '選択してください (0-3): '
WITH NO ADVANCING
ACCEPT WS-MENU-SEL FROM CONSOLE
EVALUATE TRUE
WHEN SEL-INQUIRY
PERFORM SALARY-INQUIRY
WHEN SEL-UPDATE
PERFORM SALARY-UPDATE
WHEN SEL-REPORT
PERFORM SALARY-REPORT
WHEN SEL-EXIT
DISPLAY '終了します'
WHEN OTHER
DISPLAY '無効な選択です。0〜3を入力してください'
END-EVALUATE
END-PERFORM
STOP RUN.
Y/N確認プロンプト
処理の実行前に確認を求めるパターンです。誤操作の防止に有効で、特に更新・削除処理の前に使います。
WORKING-STORAGE SECTION.
01 WS-CONFIRM PIC X(1).
88 CONFIRMED-YES VALUE 'Y' 'y'.
88 CONFIRMED-NO VALUE 'N' 'n'.
PROCEDURE DIVISION.
DISPLAY '==============================='
DISPLAY ' 2026年3月分 給与データを削除します'
DISPLAY ' 対象件数: 1,250件'
DISPLAY '==============================='
DISPLAY '本当に実行しますか? (Y/N): '
WITH NO ADVANCING
*--- 入力値が Y か N になるまで繰り返す ---
PERFORM UNTIL CONFIRMED-YES OR CONFIRMED-NO
ACCEPT WS-CONFIRM FROM CONSOLE
IF NOT (CONFIRMED-YES OR CONFIRMED-NO)
DISPLAY 'YまたはNを入力してください: '
WITH NO ADVANCING
END-IF
END-PERFORM
IF CONFIRMED-YES
PERFORM DELETE-SALARY-DATA
DISPLAY '削除が完了しました'
ELSE
DISPLAY '処理をキャンセルしました'
END-IF
STOP RUN.
FROM SYSINによるバッチパラメータの受け取り
IBM z/OSのバッチ処理では、JCLのDD SYSINにパラメータを記述し、プログラム内でACCEPT FROM SYSINで読み込むパターンが広く使われます。処理対象日付・部門コード・実行モードなどをJCLから渡せます。
//STEP01 EXEC PGM=PAYROLL //STEPLIB DD DSN=MY.LOAD.LIB,DISP=SHR //SYSOUT DD SYSOUT=* //SYSIN DD * 20260331 A001 PROD /* * * SYSINレコードのフォーマット: * 桁1- 8: 処理対象日付(YYYYMMDD) * 桁9 : スペース * 桁10-13: 部門コード(4桁) * 桁14 : スペース * 桁15-18: 実行モード(TEST/PROD)
WORKING-STORAGE SECTION.
* SYSINレコードはPIC X(80)など固定長で受け取る
01 WS-SYSIN-REC PIC X(80).
* パラメータ分解用
01 WS-PARAMS.
05 WS-PROC-DATE PIC 9(8). *> 処理対象日付
05 FILLER PIC X(1). *> スペース
05 WS-DEPT-CODE PIC X(4). *> 部門コード
05 FILLER PIC X(1). *> スペース
05 WS-EXEC-MODE PIC X(4). *> 実行モード
88 TEST-MODE VALUE 'TEST'.
88 PROD-MODE VALUE 'PROD'.
05 FILLER PIC X(62). *> 残り(未使用)
PROCEDURE DIVISION.
*--- SYSINから1レコード読み込む ---
ACCEPT WS-SYSIN-REC FROM SYSIN
*--- レコードをパラメータ構造にMOVE ---
MOVE WS-SYSIN-REC TO WS-PARAMS
*--- バリデーション ---
IF FUNCTION TEST-DATE-YYYYMMDD(WS-PROC-DATE) NOT = 0
DISPLAY 'ERROR: 処理日付が不正です: ' WS-PROC-DATE
MOVE 8 TO RETURN-CODE
GOBACK
END-IF
IF WS-DEPT-CODE = SPACES
DISPLAY 'ERROR: 部門コードが空白です'
MOVE 8 TO RETURN-CODE
GOBACK
END-IF
IF NOT (TEST-MODE OR PROD-MODE)
DISPLAY 'ERROR: 実行モードはTESTかPRODを指定してください'
MOVE 8 TO RETURN-CODE
GOBACK
END-IF
*--- パラメータ確認表示 ---
DISPLAY '処理対象日付: ' WS-PROC-DATE
DISPLAY '部門コード : ' WS-DEPT-CODE
IF TEST-MODE
DISPLAY '実行モード : テストモード(更新なし)'
ELSE
DISPLAY '実行モード : 本番モード'
END-IF
*--- メイン処理へ ---
PERFORM MAIN-PROCESS
STOP RUN.
JCLのSYSINに複数のパラメータレコードを書く場合は、
ACCEPTをループ内で複数回呼び出します。ファイルの終端(EOF)はACCEPTが空白を返すか、行数をカウントして判定します。複雑な複数レコード入力には、SYSINをSEQUENTIAL FILEとして定義してREAD文で読む方が確実です。FROM ENVIRONMENTで環境変数を取得する
GnuCOBOLなど一部の実装ではACCEPT WS-VAR FROM ENVIRONMENT '変数名'でOSの環境変数を取得できます。設定ファイルの代わりに環境変数でパラメータを渡すパターンに使います。
WORKING-STORAGE SECTION.
01 WS-DB-HOST PIC X(40).
01 WS-DB-PORT PIC X(5).
01 WS-LOG-LEVEL PIC X(5).
01 WS-ENV-CHECK PIC X(40).
PROCEDURE DIVISION.
*--- 環境変数を取得 ---
ACCEPT WS-DB-HOST FROM ENVIRONMENT 'DB_HOST'
ACCEPT WS-DB-PORT FROM ENVIRONMENT 'DB_PORT'
ACCEPT WS-LOG-LEVEL FROM ENVIRONMENT 'LOG_LEVEL'
*--- 取得できたか確認(未設定ならスペース)---
IF WS-DB-HOST = SPACES
DISPLAY 'WARNING: DB_HOST未設定。デフォルト使用'
MOVE 'localhost' TO WS-DB-HOST
END-IF
IF WS-DB-PORT = SPACES
MOVE '5432' TO WS-DB-PORT
END-IF
DISPLAY 'DB接続先: ' WS-DB-HOST ':' WS-DB-PORT
DISPLAY 'ログレベル: ' WS-LOG-LEVEL
STOP RUN.
| FROM句 | 動作 | 備考 |
|---|---|---|
| FROM ENVIRONMENT ‘変数名’ | OSの環境変数を取得。未設定ならスペースが入る | GnuCOBOL・Micro Focus対応。IBM z/OSでは通常使用しない |
| FROM DATE YYYYMMDD | 現在日付を8桁で取得 | 詳細は日付・時刻ガイド参照 |
| FROM DAY-OF-WEEK | 曜日を1〜7で取得(1=月曜〜7=日曜) | 週次バッチの実行曜日チェックに使う |
FROM DAY-OF-WEEKで曜日を取得する
日付関数では取得しにくい「今日は何曜日か」を直接取得できます。週次バッチ処理の実行曜日チェックに便利です。
* 戻り値: 1=月曜 2=火曜 3=水曜 4=木曜 5=金曜 6=土曜 7=日曜
WORKING-STORAGE SECTION.
01 WS-DOW PIC 9(1).
88 MONDAY VALUE 1.
88 TUESDAY VALUE 2.
88 WEDNESDAY VALUE 3.
88 THURSDAY VALUE 4.
88 FRIDAY VALUE 5.
88 SATURDAY VALUE 6.
88 SUNDAY VALUE 7.
88 WEEKDAY VALUE 1 THRU 5.
88 WEEKEND VALUE 6 7.
PROCEDURE DIVISION.
ACCEPT WS-DOW FROM DAY-OF-WEEK
EVALUATE TRUE
WHEN MONDAY DISPLAY '月曜日'
WHEN TUESDAY DISPLAY '火曜日'
WHEN WEDNESDAY DISPLAY '水曜日'
WHEN THURSDAY DISPLAY '木曜日'
WHEN FRIDAY DISPLAY '金曜日'
WHEN SATURDAY DISPLAY '土曜日(休業日)'
WHEN SUNDAY DISPLAY '日曜日(休業日)'
END-EVALUATE
*--- 週末実行チェック ---
IF WEEKEND
DISPLAY '警告: 休日に実行されています'
DISPLAY '月〜金の実行を推奨します'
END-IF
*--- 月曜のみ実行する週次処理 ---
IF MONDAY
PERFORM WEEKLY-REPORT-PROCESS
END-IF
STOP RUN.
実践: 対話的なバッチ実行確認画面
処理対象の確認・パラメータ入力・実行確認をまとめた、実務で使える対話的な入力処理の完全なパターンです。
WORKING-STORAGE SECTION.
01 WS-PROC-DATE PIC 9(8).
01 WS-DEPT-CODE PIC X(4).
01 WS-INPUT-WORK PIC X(8).
01 WS-CONFIRM PIC X(1).
88 YES-EXEC VALUE 'Y' 'y'.
88 NO-EXEC VALUE 'N' 'n'.
01 WS-INPUT-VALID PIC X(1).
88 IS-VALID VALUE 'Y'.
PROCEDURE DIVISION.
*--- ヘッダー表示 ---
DISPLAY '======================================='
DISPLAY ' 月次給与計算バッチ 実行パラメータ設定'
DISPLAY '======================================='
DISPLAY ' '
*--- 処理対象日付の入力(バリデーション付き)---
MOVE 'N' TO WS-INPUT-VALID
PERFORM UNTIL IS-VALID
DISPLAY '処理対象年月日 (YYYYMMDD): '
WITH NO ADVANCING
ACCEPT WS-INPUT-WORK FROM CONSOLE
IF WS-INPUT-WORK = SPACES
DISPLAY ' NG: 入力が空白です'
ELSE IF WS-INPUT-WORK NOT NUMERIC
DISPLAY ' NG: 数値で入力してください'
ELSE IF FUNCTION TEST-DATE-YYYYMMDD(
FUNCTION NUMVAL(WS-INPUT-WORK)) NOT = 0
DISPLAY ' NG: 無効な日付です'
ELSE
MOVE FUNCTION NUMVAL(WS-INPUT-WORK)
TO WS-PROC-DATE
MOVE 'Y' TO WS-INPUT-VALID
END-IF
END-PERFORM
*--- 部門コードの入力 ---
MOVE 'N' TO WS-INPUT-VALID
PERFORM UNTIL IS-VALID
DISPLAY '部門コード (4桁 or ALL): '
WITH NO ADVANCING
ACCEPT WS-DEPT-CODE FROM CONSOLE
IF WS-DEPT-CODE = SPACES
DISPLAY ' NG: 入力が空白です'
ELSE
MOVE 'Y' TO WS-INPUT-VALID
END-IF
END-PERFORM
*--- 確認表示 ---
DISPLAY ' '
DISPLAY '---------------------------------------'
DISPLAY ' 入力内容の確認'
DISPLAY '---------------------------------------'
DISPLAY ' 処理対象日付 : ' WS-PROC-DATE
DISPLAY ' 部門コード : ' WS-DEPT-CODE
DISPLAY '---------------------------------------'
DISPLAY ' '
*--- 最終確認 ---
PERFORM UNTIL YES-EXEC OR NO-EXEC
DISPLAY '上記の内容で処理を実行しますか? (Y/N): '
WITH NO ADVANCING
ACCEPT WS-CONFIRM FROM CONSOLE
IF NOT (YES-EXEC OR NO-EXEC)
DISPLAY 'YまたはNを入力してください'
END-IF
END-PERFORM
IF YES-EXEC
DISPLAY ' '
DISPLAY '処理を開始します...'
PERFORM EXECUTE-BATCH
ELSE
DISPLAY '処理をキャンセルしました'
END-IF
STOP RUN.
よくある落とし穴と対策
バッチ処理でACCEPT FROM CONSOLEを使うとジョブが止まる
z/OSのバッチジョブでACCEPT FROM CONSOLEを使うと、誰もキーボード入力できないのでジョブが無期限に待機状態になります。夜間バッチが翌朝まで止まっていた、というトラブルの典型例です。
z/OSのバッチ環境ではACCEPT FROM SYSINでJCLからパラメータを受け取ります。対話的な確認が必要な処理は、JCLのパラメータで実行可否を制御する設計にします。開発・テスト環境では動いても本番バッチでは絶対に使ってはいけないパターンです。
PIC 9変数に非数値入力するとエラーになる
ACCEPT WS-NUM FROM CONSOLEでPIC 9(6)の変数に「ABC」のような非数値を入力すると、実行時エラーまたは0格納など不定動作になります。
対策: ユーザーから数値を受け取るときは一度PIC Xで受け取り、NUMERICチェック後に数値変数にMOVEします。
入力値の末尾スペースが検索・比較に影響する
PIC X(10)に「ABC」と入力すると'ABC '(7スペース埋め)が格納されます。IF WS-CODE = 'ABC'の比較はCOBOLがスペースパディングして比較するため一致しますが、他言語との連携やファイル書き出しでは末尾スペースが問題になることがあります。
対策: FUNCTION TRIM(WS-INPUT)でスペースを除去してから使うか、STRINGでDELIMITED BY SPACEで組み立てます。
ACCEPT FROM SYSINをCONSOLEと取り違える
GnuCOBOLのLinux環境ではACCEPTのデフォルトが標準入力(stdin)になりますが、z/OS環境ではSYSINのDD文と結びついています。同じコードが環境によって動作が異なる場合があります。
対策: FROM句を明示的に書きます。z/OSならFROM SYSIN、対話環境ならFROM CONSOLEと明記することで意図が伝わりやすくなります。
ACCEPT後に入力値をそのまま使いエラーになる
ユーザー入力は「正しい値が入力されるとは限らない」前提で設計します。入力後のバリデーションを省いてそのままSQL・ファイル処理・数値演算に使うと、予期しないエラーや誤処理の原因になります。
対策: ACCEPTの直後には必ずバリデーション処理を入れます。型チェック・空白チェック・範囲チェックの3つを習慣的に実装します。
よくある質問
まとめ
ACCEPT文の使い方をFROM句の種類で整理します。
| FROM句 | ポイント |
|---|---|
| FROM CONSOLE | 対話的なキーボード入力。テスト・ユーティリティ向き。バッチ本番では使わない |
| FROM SYSIN | z/OSバッチのJCLパラメータ受け取り。本番バッチの標準パターン |
| FROM DATE YYYYMMDD | 現在日付を8桁で取得(→2071参照) |
| FROM TIME | 現在時刻をHHMMSSCCで取得(→2071参照) |
| FROM DAY-OF-WEEK | 曜日を1〜7で取得。週次処理の制御に使う |
| FROM ENVIRONMENT | OS環境変数を取得(GnuCOBOL等の拡張機能) |
ユーザー入力はPIC Xで受け取ってからバリデーション→数値変数にMOVEの順序が安全です。ACCEPTと組み合わせるDISPLAY文のWITH NO ADVANCINGの詳細はDISPLAY文完全ガイドを参照してください。IF文を使ったバリデーションロジックについてはIF文完全ガイドもあわせてご覧ください。