【COBOL】ACCEPT文完全ガイド|FROM CONSOLE・SYSIN・環境変数・再入力ループ・メニュー選択・バッチパラメータ

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 CONSOLE
ACCEPT WS-VAR FROM SYSIN
システム情報取得 日付・時刻・曜日・環境変数をOSから取得する ACCEPT WS-DATE FROM DATE YYYYMMDD
ACCEPT WS-VAR FROM ENVIRONMENT 'ENV_NAME'
ACCEPT文の完全な構文
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キーが押されるまで待機し、入力された値をデータ名に格納します。

FROM CONSOLEの基本
       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.
入力文字数とPICの長さの関係
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.
数値項目に直接ACCEPTすると非数値入力でエラーになる
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確認プロンプト

処理の実行前に確認を求めるパターンです。誤操作の防止に有効で、特に更新・削除処理の前に使います。

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から渡せます。

JCL側のSYSIN定義例
//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)
ACCEPT FROM SYSINでパラメータを読み込む
       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.
SYSINを複数行読み込む場合はPERFORMでループする
JCLのSYSINに複数のパラメータレコードを書く場合は、ACCEPTをループ内で複数回呼び出します。ファイルの終端(EOF)はACCEPTが空白を返すか、行数をカウントして判定します。複雑な複数レコード入力には、SYSINをSEQUENTIAL FILEとして定義してREAD文で読む方が確実です。

FROM ENVIRONMENTで環境変数を取得する

GnuCOBOLなど一部の実装ではACCEPT WS-VAR FROM ENVIRONMENT '変数名'でOSの環境変数を取得できます。設定ファイルの代わりに環境変数でパラメータを渡すパターンに使います。

FROM ENVIRONMENTの使い方(GnuCOBOL)
       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で曜日を取得する

日付関数では取得しにくい「今日は何曜日か」を直接取得できます。週次バッチ処理の実行曜日チェックに便利です。

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を使うと、誰もキーボード入力できないのでジョブが無期限に待機状態になります。夜間バッチが翌朝まで止まっていた、というトラブルの典型例です。

バッチ処理では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つを習慣的に実装します。

よくある質問

QACCEPTとREADの違いは何ですか?
AACCEPTはキーボード・SYSINなどの「入力デバイス」から1回だけ値を受け取る命令です。READはFILE SECTION(FD)に定義したファイルからレコードを1件ずつ読み込む命令です。大量のデータをファイルから読み込む場合はREADを使います。ACCEPTはパラメータ受け取り・ユーザー入力・システム情報取得の3用途に限定して使うのが一般的です。
QACCEPTでパスワード入力(入力文字を非表示)はできますか?
A標準COBOLのACCEPT文には入力非表示(エコーバック抑制)の機能はありません。Micro Focus COBOLなど一部の実装では画面制御機能(SCREEN SECTION)を使ってマスク入力を実現できます。z/OSのバッチ環境ではそもそも対話的なパスワード入力は行わず、セキュリティ資格情報はJCLのRACSF認証やキーワードパラメータで管理します。
QACCEPT文で複数行を一度に入力することはできますか?
Aできません。1回のACCEPT文で受け取れるのは1行(1レコード)のみです。複数行のパラメータを読み込みたい場合は、ACCEPTをループで複数回呼び出すか、SYSINをSEQUENTIAL FILEとしてFDに定義してREAD文でループ読みする方が柔軟です。
QACCEPT FROM SYSINでSYSINに何も書かなかったらどうなりますか?
ASYSINがDD文で定義されているが内容が空の場合、ACCEPTはスペースを返します。DD文ごとSYSINを省略した場合は実行時エラーになることがあります(環境依存)。バッチパラメータをSYSINで渡す設計では、SYSINが空の場合のデフォルト値を用意するか、空白チェックをしてエラー終了するようにします。
QACCEPT FROM ENVIRONMENTはすべてのCOBOLコンパイラで使えますか?
Aいいえ。FROM ENVIRONMENT(環境変数取得)はCOBOLの標準規格には含まれておらず、コンパイラ拡張機能です。GnuCOBOLとMicro Focus COBOLでは利用できますが、IBM z/OS COBOLでは通常使用しません。z/OSでは環境変数の代わりにJCLのDD文・SYSOPTSパラメータ・RACF変数などで設定値を渡します。移植性が必要な場合は使用を避け、SYSINパラメータで代替します。

まとめ

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文完全ガイドもあわせてご覧ください。