COBOL2002　ユーザーズガイド

解説・手引書

4010-1J-800

前書き

対象製品

P-2636-2354 COBOL2002 Net Developer 05-00（適用OS：Windows 10(x64)，Windows 11，Windows Server 2019，Windows Server 2022）

P-2436-5354 COBOL2002 Net Server Runtime 05-00（適用OS：Windows Server 2019，Windows Server 2022）

P-2636-3354 COBOL2002 Net Client Runtime 05-00（適用OS：Windows 10(x64)，Windows 11）

P-2436-6354 COBOL2002 Net Server Suite 05-00（適用OS：Windows Server 2019，Windows Server 2022）

P-2636-4354 COBOL2002 Net Client Suite 05-00（適用OS：Windows 10(x64)，Windows 11）

P-2936-2354 COBOL2002 Net Developer(64) 05-00（適用OS：Windows 10(x64)，Windows 11，Windows Server 2019，Windows Server 2022）

P-2936-5354 COBOL2002 Net Server Runtime(64) 05-00（適用OS：Windows Server 2019，Windows Server 2022）

P-2936-6354 COBOL2002 Net Server Suite(64) 05-00（適用OS：Windows Server 2019，Windows Server 2022）

P-2636-7354 COBOL2002 Developer Professional 05-00（適用OS：Windows 10(x64)，Windows 11，Windows Server 2019，Windows Server 2022）

P-2936-7354 COBOL2002 Developer Professional(64) 05-00（適用OS：Windows 10(x64)，Windows 11，Windows Server 2019，Windows Server 2022）

これらのプログラムプロダクトのほかにもこのマニュアルをご利用になれる場合があります。詳細は「リリースノート」でご確認ください。

COBOL2002は，COBOL2002規格（ISO/IEC 1989:2002）の主な機能に対応しています。COBOL85互換機能（コンパイラオプション）指定時，COBOL2002は，COBOL85規格（ISO85，ANSI85，JIS88，JIS92）の上位水準に準拠します。

輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。

なお、不明な場合は、弊社担当営業にお問い合わせください。

商標類

記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。

発行

2025年2月　4010-1J-800

著作権

All Rights Reserved. Copyright (C) 2025, Hitachi, Ltd.

(C) 2017 Microsoft

はじめに

このマニュアルは，次に示すプログラムプロダクトの機能と使用方法について説明したものです。

P-2636-2354 COBOL2002 Net Developer

P-2436-5354 COBOL2002 Net Server Runtime

P-2636-3354 COBOL2002 Net Client Runtime

P-2436-6354 COBOL2002 Net Server Suite

P-2636-4354 COBOL2002 Net Client Suite

P-2936-2354 COBOL2002 Net Developer(64)

P-2936-5354 COBOL2002 Net Server Runtime(64)

P-2936-6354 COBOL2002 Net Server Suite(64)

P-2636-7354 COBOL2002 Developer Professional

P-2936-7354 COBOL2002 Developer Professional(64)

対象読者

このマニュアルは，COBOL2002の機能を知りたい方，またはCOBOL2002の文法規則を機能から調べたい方を対象としています。また，COBOLの基本的な言語仕様と，Windowsの操作方法について理解していることを前提としています。

用語の定義

このマニュアルでの用語の定義を次に示します。

パス名とパスプレフィクス

パス名とパスプレフィクスは，次のとおりです。

絶対パス名

ドライブ名で始まるパス名。

　ドライブ名¥フォルダ名¥ … ¥ファイル名

相対パス名

カレントフォルダからの相対のパス名。

・カレントフォルダの1階層上位のフォルダを経由する場合

　..¥フォルダ名¥フォルダ名¥ … ¥ファイル名

・カレントフォルダ下のフォルダを経由する場合

　フォルダ名¥フォルダ名¥ … ¥ファイル名

絶対パスプレフィクス

ドライブ名で始まるパスプレフィクス。

相対パスプレフィクス

カレントフォルダからの相対のパスプレフィクス。

このマニュアルで使用する記号

このマニュアルで使用する記号を次に示します。

記号

意味

［　］キー

文字キーやF（ファンクション）キーを意味する。

［　］+［　］キー

＋の前のキーを押したまま，あとのキーを押すことを意味する。

｛　｝

この記号で囲まれている複数の項目のうちから一つを選択することを意味する。項目が縦に複数行にわたって記述されている場合は，そのうちの1行分を選択する。

｛　｝+

この記号で囲まれている複数の項目のうちから一つを選択することを意味する。同じ要素の繰り返し指定はできないが，異なる要素であれば，複数指定できる。例えば，｛A｜B｜C｝+と表記されている場合は，A・B・Cをすべて選択してもよい。

項目が縦に複数行にわたって記述されている場合は，そのうちの1行分を選択する。

〔　〕

この記号で囲まれている項目は省略してもよいことを意味する。

複数の項目が縦または横に並べて記述されている場合には，すべてを省略するか，記号｛　｝と同じく，どれか一つを選択する。

…

記述が省略されていることを意味する。

この記号の直前に示された項目を繰り返して複数個指定できる。

下線

括弧で囲まれた複数の項目のうち1項目に対して使用され，括弧内のすべてを省略したときにシステムがとる標準値を意味する。

｜

横に並べられた複数の項目に対して項目間の区切りを示し，「または」を意味する。

［　］

ウィンドウのメニューバーから選択するメニュー，コマンド，またはボタンを意味する。

プログラム構造表記法（PAD）と流れ図

このマニュアルでは，手続き的アルゴリズムの制御構造（主にプログラムの処理手続き）をPAD（Problem Analysis Diagram）または流れ図で示しています。

このマニュアルで使用するPADと流れ図の要素，およびそれぞれの要素の対応を，次のように定義します。

サポート機能一覧

規格

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

基本機能

○

○

順編成ファイル

○

○

相対編成ファイル

○

○

索引編成ファイル

○

○

整列併合

○

○

プログラム間連絡

○

○

組み込み関数

○

○

オブジェクト指向

○

○

共通例外処理

○

○

再帰呼び出し

○

○

利用者定義関数

○

○

局所場所節(LOCAL-STORAGE SECTION)

○

○

原始文操作

○

○

自由形式正書法

○

○

TYPEDEF句とSAME AS句

○

○

翻訳指令

○

○

区分化※

○

○

（凡例）

○：サポートしている

注※

覚え書きとしてサポートしている。

X/Open

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

テキスト編成ファイル

○

○

ファイル共用

（ファイルシェア）

順編成ファイル

○

○

相対編成ファイル

○

○

ISAMによる索引編成ファイル

○

○

テキスト編成ファイル

×

×

CSV編成ファイル

×

×

HiRDBによる索引編成ファイル

×

×

Btrieveによる索引編成ファイル

○

×

コマンド行および環境変数へのアクセス

○

○

画面節（SCREEN SECTION）による画面操作

○

○

C言語インタフェース

○

○

インターナショナリゼーション

−

−

（凡例）

○：サポートしている

×：サポートしていない

−：該当しない

拡張機能

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

日本語

○

○

ブール演算

○

○

アドレス操作

○

○

1バイト2進およびCOMP-X項目

○

○

浮動小数点項目

○

○

ISAMによる索引編成ファイル機能の拡張（合成キー，逆順読み）

○

○

CSV編成ファイル

○

○

HiRDBによる索引編成ファイル

○

○

Btrieveによる索引編成ファイル

○

×

リモートファイルアクセス

○

×

ラージファイル入出力

順編成ファイル

○

○

相対編成ファイル

×

×

ISAMによる索引編成ファイル

○

×

テキスト編成ファイル

○

○

CSV編成ファイル

○

○

HiRDBによる索引編成ファイル

×

×

Btrieveによる索引編成ファイル

×

×

COBOL入出力サービスルーチン

○

○

バイトストリーム入出力サービスルーチン

○

○

画面節（WINDOW SECTION）による画面操作

画面節（WINDOW SECTION）

○

○

JCPOPUPサービスルーチン

○

○

通信節による画面操作（XMAP3）

○

○

COPY文の接頭辞／接尾辞

○

○

プリンタへのアクセス

XMAP3による印刷

○

×

GDIモード印刷

○

○

ESC/Pモード印刷

○

○

ファイルのディスク書き込み保証

（書き込み時）

順編成ファイル

○

○

相対編成ファイル

○

○

ISAMによる索引編成ファイル

○

○

テキスト編成ファイル

×

×

CSV編成ファイル

×

×

HiRDBによる索引編成ファイル

×

×

Btrieveによる索引編成ファイル

×

×

ファイルのディスク書き込み保証

（クローズ時）

順編成ファイル

○

○

相対編成ファイル

○

○

ISAMによる索引編成ファイル

×

×

テキスト編成ファイル

×

×

CSV編成ファイル

○

○

HiRDBによる索引編成ファイル

×

×

Btrieveによる索引編成ファイル

×

×

報告書作成機能

○

○

MIOS7 COBOL85との互換機能

○

△

イベントログファイル／syslogファイル出力機能

○

○

データコミュニケーション機能

○

○

データベース操作機能（ODBCインタフェース）

○

○

XDMによるデータベースシミュレーション機能

構造型データベース（XDM/SD）

○

○

リレーショナルデータベース（XDM/RD）

○

○

OLE2オートメーション機能

クライアント機能

○

○

マルチスレッド環境

作成と実行

○

○

デバッグ

○

○

MSMQアクセス機能

○

○

エンディアン切り替え

○

○

Unicode機能

○

○

数字項目のけた拡張機能

×

○

動的長基本項目機能

○

○

定数長拡張機能

英数字定数長の拡張

○

○

Javaプログラム呼び出し機能

○

○

（凡例）

○：サポートしている

×：サポートしていない

△：サポートしている機能であるが，使える機能に一部制限がある

デバッグ機能

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

実行時デバッグ機能

○

○

テストデバッグ機能

GUIモード

○

○

バッチモード

○

○

カバレージ機能

GUIモード

○

○

バッチモード

○

○

（凡例）

○：サポートしている

連携機能

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

XML連携機能

○

○

Cosminexus連携機能

○

○

（凡例）

○：サポートしている

開発／実行環境

機能

製品種別

Windows(x86) COBOL2002

Windows(x64) COBOL2002

開発マネージャ

○

○

実行支援

○

○

ODBCレコード定義生成

○

○

ファイル／レコード定義

○

○

画面定義

○

○

COBOLエディタ

○

○

コマンドプロンプト

○

○

（凡例）

○：サポートしている

使用を推奨しない機能について

次の機能は，旧製品との互換を維持するために提供しています。前提となるソフトウェアは販売を終了しています。COBOL2002の新しい機能への移行を推奨します。

Btrieve（Pervasive.SQL）による索引編成ファイル

MIOS7 COBOL85との互換機能

［COBOL2002］下のメニューと，ウィンドウのタイトルバーの表記

Windows(x64) COBOL2002の場合，Windowsのプログラム一覧にある［COBOL2002］下のメニューと，ウィンドウのタイトルバーには，末尾に「64bit」が付きます。このマニュアルでは，Windows(x86) COBOL2002のメニューとタイトルバーの表記を使用します。Windows(x64) COBOL2002をご使用になる場合は，表記を読み替えてください。

Windows(x86) COBOL2002での表記

Windows(x64) COBOL2002での表記

COBOL2002

COBOL2002 64bit

COBOLエディタ for COBOL2002

COBOLエディタ for COBOL2002 64bit

COBOLコマンドプロンプト for COBOL2002

COBOLコマンドプロンプト for COBOL2002 64bit

ODBCレコード定義生成 for COBOL2002

ODBCレコード定義生成 for COBOL2002 64bit

カバレージ for COBOL2002

カバレージ for COBOL2002 64bit

テストデバッガ for COBOL2002

テストデバッガ for COBOL2002 64bit

ファイル・レコード定義 for COBOL2002

ファイル・レコード定義 for COBOL2002 64bit

画面定義 for COBOL2002

画面定義 for COBOL2002 64bit

開発マネージャ for COBOL2002

開発マネージャ for COBOL2002 64bit

実行支援 for COBOL2002

実行支援 for COBOL2002 64bit

コンパイラオプション，および環境変数について

このマニュアルには，Windows(x64) COBOL2002では使用できないコンパイラオプション，および環境変数についても記載しています。

使用できないコンパイラオプションについては「39.2.1　使用できないコンパイラオプション」を，実行時環境変数については「39.3.1　プログラムの実行環境の設定」の「(2)　実行時環境変数の一覧」をそれぞれ参照してください。

プログラム例について

このマニュアルのプログラム例は，断り書きがない場合はWindows(x86) COBOL2002用です。プログラム例をWindows(x64) COBOL2002で使用するには，プログラムの記述に変更が必要な場合がありますのでご注意ください。

また，このマニュアルのC言語のプログラム例をWindows(x64) COBOL2002でご使用になった場合，コンパイラによっては処理結果に相違が出ることがあります。

第1編　COBOL2002の概要

1　概要

電子計算機を利用する場合，電子計算機にさせたい作業内容をプログラミング言語で記述します。COBOL（COmmon Business Oriented Language（事務用共通言語））はプログラミング言語の一つです。

この章では，COBOL2002の概要について説明します。

1.1　COBOL2002の概要

1.1.1　COBOLの概要

COBOLは，事務処理用に最も使用されているプログラミング言語です。当初はビジネス向けプログラミング言語として開発されましたが，第1次規格（ANSI68，ISO72，JIS72），第2次規格（ANSI74，ISO78，JIS80），第3次規格（ISO85，ANSI85，JIS88，JIS92），第4次規格（ISO/IEC 1989:2002，JIS X3002:2011）と規格の改訂を重ね，現在ではビジネス向けだけでなく，汎用プログラミングにも広がっています。

ここでは，COBOLの特長，およびCOBOL2002の機能の概要について説明します。

なお，COBOLに関する公式の規格は，ISO（国際規格），ANSI（アメリカ規格），およびJIS（日本工業規格）で決められています。

1.1.2　COBOLの特長

COBOLの特長を次に示します。

大量データの高速処理ができるため，事務作業の効率化ができます。

事務作業で頻繁に使う帳票の作成やデータの表現方法が容易です。

簡単な英語でプログラムが書けるようになっていて，書き方も決まっているので，プログラムの見直しが容易です。

データとプログラムの手続きを分割して記述するので，まずデータが存在し，続いて処理方法を考えるという事務処理用プログラムの作成方法に対応しています。

1.1.3　COBOL2002の機能

(1)　COBOL2002で追加された機能

COBOL2002は，従来製品のCOBOL85との高い互換を保証しています。また，次に示す機能が追加されています。

オブジェクト指向機能

共通例外処理

翻訳指令

TYPEDEF句とSAME AS句

利用者定義関数

再帰呼び出し

局所場所節

自由形式のソース原文や登録集原文

(2)　COBOL2002のWebシステム連携機能

COBOL2002では，Webシステム構築に必要な次の連携機能を使用できます。これらの機能を使用することで，WebアプリケーションをCOBOLで開発できます。

XML連携機能

COBOLプログラムから，XMLデータをCOBOLのレコードとして入出力できます。COBOLのノウハウや既存COBOL資産を生かして，eビジネス向けのデータ交換用XMLデータを扱うアプリケーションを作成できます。

詳細については，マニュアル「COBOL2002　XML連携機能ガイド」を参照してください。

Cosminexus連携機能

日立アプリケーションサーバCosminexusのJavaアプリケーションから，COBOLプログラムをJavaBeansあるいはEJBとして呼び出せます。これによって，Webアプリケーションの基本機能となるビジネスロジック部分をCOBOLで作成できます。

詳細については，マニュアル「COBOL2002　Cosminexus連携機能ガイド」を参照してください。

1.1.4　COBOL2002の製品体系

COBOL2002では，次に示すプログラムプロダクトを用意しています。利用形態に合わせて適宜お選びください。

プログラムプロダクト名

開発環境

実行環境

システム運用※¹

COBOL2002 Net Developer

○

○

−

COBOL2002 Developer Professional※2

○

○

−

COBOL2002 Net Server Runtime

−

○

○

COBOL2002 Net Client Runtime

−

○

○

COBOL2002 Net Server Suite

○

○

○

COBOL2002 Net Client Suite

○

○

○

（凡例）

○：該当するプログラムプロダクトで使用できる

−：該当するプログラムプロダクトでは使用できない

注※1

実際の運用環境で，開発したシステムを稼働できるライセンスを含むかどうかを表します。

注※2

COBOL2002 Net DeveloperとCOBOL2002 Professional Tool Kitを同梱したプログラムプロダクトです。

(1)　COBOL2002 Net Developer

COBOL2002の機能を活用したアプリケーションプログラムの開発からテスト・デバッグまでを支援するためのプログラムプロダクトです。コンパイラをはじめとするさまざまな開発ツールや，アプリケーションプログラムの実行テストに必要な実行時ライブラリや実行環境支援などのツールも使用できます。

ただし，COBOL2002 Net Developerはシステム開発だけを目的としたプログラムプロダクトとなっています。したがって，システム開発とシステム運用の両方を実行するためには，COBOL2002 Net Server SuiteやCOBOL2002 Net Client Suiteを利用してください。

(2)　COBOL2002 Developer Professional

プログラム開発環境であるCOBOL2002 Net Developerと，プログラム開発を支援する機能であるCOBOL2002 Professional Tool Kitとを同梱したプログラムプロダクトです。

(3)　COBOL2002 Net Server Runtime

開発したCOBOLプログラムをサーバOS上で運用するため，実行環境を使用するためのプログラムプロダクトです。COBOLプログラムの実行に必要な実行時ライブラリや実行環境支援などのツールが使用できます。

COBOL2002 Net Developerで開発したアプリケーションプログラムを，サーバ側のシステム上で運用する場合，このプログラムプロダクトが必要です。

(4)　COBOL2002 Net Client Runtime（32bit版クライアントOS向けに提供）

開発したCOBOLプログラムをクライアントOS上で運用するため，実行環境を使用するためのプログラムプロダクトです。COBOLプログラムの実行に必要な実行時ライブラリや実行環境支援などのツールが使用できます。

COBOL2002 Net Developerで開発したアプリケーションプログラムを，クライアント側のシステム上で運用する場合，このプログラムプロダクトが必要です。

(5)　COBOL2002 Net Server Suite

COBOL2002 Net DeveloperとCOBOL2002 Net Server Runtimeを統合したプログラムプロダクトです。サーバOS上での，アプリケーションプログラムの開発から運用までを支援します。

(6)　COBOL2002 Net Client Suite（32bit版クライアントOS向けに提供）

COBOL2002 Net DeveloperとCOBOL2002 Net Client Runtimeを統合したプログラムプロダクトです。クライアントOS上での，アプリケーションプログラムの開発から運用までを支援します。

1.2　COBOL2002の構成

COBOL2002の構成を，次に示します。

図1‒1　COBOL2002の構成

1.3　COBOL2002が提供するコンポーネントの種類と関連性

COBOL2002では，コンパイラ・実行時ライブラリのほかにも，さまざまな周辺ツールを使用できます。ここでは，使用環境ごとに，使用できるコンポーネントを説明します。

1.3.1　開発環境について

COBOL2002を利用した開発環境で使用できるコンポーネントと，その機能の概要を次に示します。

表1‒1　開発環境のコンポーネント

コンポーネント

機能概要

コンパイラ

COBOLプログラムのコンパイル

開発マネージャ

COBOLプログラムの開発支援

COBOLエディタ

COBOLプログラムの編集

ODBCレコード定義生成

データベースのデータソースからCOBOLのレコード定義を生成

画面定義

COBOLプログラムで使用する画面の作成

ファイル／レコード定義

COBOLプログラムで使用するファイル仕様およびレコード仕様の設定

1.3.2　実行環境について

COBOL2002を利用した実行環境で使用できるコンポーネントと，その機能の概要を次に示します。

表1‒2　実行環境のコンポーネント

コンポーネント

機能概要

実行時ライブラリ

COBOLプログラムの実行

実行支援

COBOLプログラムの実行環境の設定

ISAM

索引ファイルの作成や保守

SORT

COBOLの整列併合機能の実行

表1‒3　障害調査支援のコンポーネント

コンポーネント

機能概要

COBOL2002情報抽出ツール

バイナリファイルからCOBOL2002の情報を抽出・表示

1.3.3　デバッグ環境について

COBOL2002を利用したデバッグ環境で使用できるコンポーネントと，その機能の概要を次に示します。

表1‒4　デバッグ環境のコンポーネント

コンポーネント

機能概要

テストデバッガ

COBOLプログラムのデバッグ

カバレージ

COBOLプログラムのテスト進捗状況管理の支援

1.3.4　マニュアルについて

COBOL2002で使用できるマニュアルの概要を次に示します。

表1‒5　マニュアルの種類

マニュアル名

概要

COBOL2002　ユーザーズガイド

COBOL2002の機能と使用方法について説明しています。

COBOL2002　操作ガイド

開発マネージャ，テストデバッガなど，COBOL2002で使用できる開発ツールの操作方法について説明しています。

COBOL2002　言語 標準仕様編

COBOL2002で使用する言語の文法のうち，規格仕様の部分について説明します。

COBOL2002　言語 拡張仕様編

COBOL2002で使用する言語の文法のうち，日立拡張仕様の部分について説明します。

COBOL2002　メッセージ

COBOL2002がコンパイル時，実行時などに出力するメッセージの一覧を記載しています。

索引順編成ファイル管理 ISAM

索引順編成ファイルの機能概要，ユティリティの操作，およびユティリティコマンドについて説明しています。

ソートマージ

ソートマージの機能概要，コマンド，およびエラーメッセージについて説明しています。※

注※

このプログラムプロダクトでは，ソートマージのコマンドは使用できません。ソートマージの機能は，COBOLの整列併合機能を利用して使用します。

2　COBOL2002の主な新機能

COBOL2002には，幾つかの機能が追加されています。

この章では，COBOL2002の主な新機能について説明します。

2.1　オブジェクト指向機能

COBOL2002では，オブジェクト指向機能をサポートしています。オブジェクト指向プログラミングを適用すると，次のことができます。

データと手続きのカプセル化

親クラスの性質を子クラスに引き継ぐ継承

一つの手続きで複数のクラスを扱うポリモルフィズム

詳細は，「20.　オブジェクト指向機能」を参照してください。

2.2　共通例外処理

COBOL2002では，従来の入出力機能に関する例外宣言手続きに加えて，データ例外やけたあふれなど，さまざまな例外に対する例外宣言手続きを記述できます。また，例外オブジェクトを使用した例外処理もできます。

詳細は，「21.　共通例外処理」を参照してください。

2.3　翻訳指令

翻訳指令とは，COBOLプログラムのコンパイル（翻訳）時に，特定の動作や解釈をするようにコンパイラへの指示を与える指令です。

2.3.1　規格の互換性をチェックする翻訳指令

規格の互換性をチェックする翻訳指令を次に示します。

(1)　FLAG-85指令

FLAG-85指令は，第3次規格COBOLと第4次規格COBOLとの間で互換性に欠けるおそれがある構文に対して，フラグを立てる選択種目を指定します。

FLAG-85指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.9　FLAG-85指令」を参照してください。

2.3.2　ソース原文の正書法を決定する翻訳指令

ソース原文の正書法を決定する翻訳指令を次に示します。

(1)　SOURCE FORMAT指令

SOURCE FORMAT指令は，後続するソースの正書法が，固定形式または自由形式のどちらであるかを指定します。

詳細は，「33.2.3　正書法」を参照してください。また，SOURCE FORMAT指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.14　SOURCE FORMAT指令」を参照してください。

2.3.3　条件翻訳に関連する翻訳指令

条件翻訳とは，ソースコード中に翻訳指令を記述すれば，コンパイル時に特定の行を有効にしたり，無効にしたりできる機能です。

条件翻訳に関する翻訳指令を次に示します。

(1)　DEFINE指令

DEFINE指令は，翻訳変数と呼ばれる記号名に対して特定の定数値を指定します。

詳細は，「33.3.3　条件翻訳の利用」を参照してください。また，DEFINE指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.7　DEFINE指令」を参照してください。

(2)　EVALUATE指令

EVALUATE指令は，多方向分岐を条件翻訳します。

詳細は，「33.3.3　条件翻訳の利用」を参照してください。また，EVALUATE指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.8　EVALUATE指令」を参照してください。

(3)　IF指令

IF指令は，単方向または双方向分岐の条件翻訳をします。

詳細は，「33.3.3　条件翻訳の利用」を参照してください。また，IF指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.10　IF指令」を参照してください。

2.3.4　コンパイルリストに関連する翻訳指令

コンパイルリストに関連する翻訳指令を次に示します。

コンパイルリストは，-SrcListオプションを指定した場合に出力されます。コンパイルリストの出力形式，および-SrcListオプションを指定したときの出力形式の違いについては，「付録E　コンパイルリスト」を参照してください。

(1)　LISTING指令

LISTING指令は，コンパイルリストにソースを出力するかどうかを指定します。詳細は，「付録E.1　リストの出力」の「(3)　コンパイルリストの出力に関連する翻訳指令」を参照してください。

また，LISTING指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.11　LISTING指令」を参照してください。

(2)　PAGE指令

PAGE指令は，コンパイルリストの改ページを指定します。PAGE指令のコンパイルリストでの効果は，固定形式正書法の改ページ標識「/」と同じです。

詳細は，「付録E.1　リストの出力」の「(3)　コンパイルリストの出力に関連する翻訳指令」を参照してください。また，PAGE指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.12　PAGE指令」を参照してください。

2.3.5　例外処理に関連する翻訳指令

例外処理に関連する翻訳指令を次に示します。

(1)　PROPAGATE指令

PROPAGATE指令は，呼び出し元のプログラムへ例外を伝播させるために使用します。

詳細は，「21.　共通例外処理」を参照してください。また，PROPAGATE指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.13　PROPAGATE指令」を参照してください。

(2)　TURN指令

TURN指令は，特定の例外に対してチェックするかどうかを指定します。

詳細は，「21.　共通例外処理」を参照してください。また，TURN指令の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.15　TURN指令」を参照してください。

2.4　TYPEDEF句とSAME AS句

COBOLでは，レベル番号，データ項目の名前，PICTURE句やUSAGE句などのデータ属性を指定して，データ項目の構造や形式を表現します。

TYPEDEF句は，データ構造のひな型となるデータ型を定義します。TYPEDEF句を使用して定義したデータ型をTYPE句によって参照することで，同じ構造のデータ項目を定義できます。

SAME AS句は，あるデータ名の記述項が，別のデータ記述項の指定と同じことを表し，同じ構造のデータ項目を定義します。

TYPEDEF句，SAME AS句の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.84　TYPEDEF句」および「COBOL2002　言語　標準仕様編」　「9.16.70　SAME AS句」を参照してください。

2.4.1　TYPEDEF句

TYPEDEF句を使用したデータ型の指定について説明します。

(1)　データ型の定義と参照

データ型は，TYPEDEF句を使用して定義します。型名を指定したTYPE句をデータ名に指定すれば，TYPEDEF句で定義した型を参照できます。

なお，TYPEDEF句で定義された型名を1か所で参照する場合，TYPE句指定によって暗黙的に展開されるデータ名は一意となりますが，TYPEDEF句で定義された型名を複数個所で参照する場合，TYPE句指定によって暗黙的に展開されるデータ名が一意とならない（同じデータ名が複数個所に存在する）ため，一意に参照するためにデータ名の修飾が必要です。

データ型の定義と参照の例を次に示します。

(2)　弱く型付けされた項目と強く型付けされた項目

データ型は，TYPEDEF句にSTRONG指定があるかどうかによって，次の二つに分類されます。

STRONG指定なし：弱く型付けされたデータ型

STRONG指定あり：強く型付けされたデータ型（集団項目のデータ型にだけ指定できます）

(a)　弱く型付けされた項目

弱く型付けされた項目とは，弱く型付けされたデータ型をTYPE句に指定することで定義されたデータ項目のことです。この項目は，指定された型名からそのデータ構造が決まること以外は，型付けされていない項目と同じように使用できます。

(b)　強く型付けされた項目

強く型付けされた項目とは，強く型付けされたデータ型をTYPE句に指定することで定義されたデータ項目のことです。この項目は，集団項目のデータ内容の妥当性を確保するための仕組みです。集団項目中の基本データ項目に格納する内容の整合性を損なうおそれがある操作は，すべて禁止されています。整合性を損なうおそれがある操作の手続き文を書いた場合，コンパイル時にエラーとなります。

（整合性を損なうおそれがある操作の例）

型の異なる集団項目からの転記

VALUE句による初期化

再命名，再定義された一意名を使ったデータ項目の更新

部分参照による値の更新

また，USAGE句にOBJECT REFERENCE指定のある項目を集団項目の従属項目として定義する場合は，STRONG指定のあるデータ型の中で定義しなければなりません。

このシステムでは，強く型付けされた項目同士の比較を許していません。強く型付けされた項目を比較する場合，強く型付けされた項目に従属するすべての基本項目同士を比較してください。

強く型付けされた項目の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「4.4.3(2)　強く型付けされた集団項目」，「COBOL2002　言語　標準仕様編」　「9.16.83　TYPE句」，および「COBOL2002　言語　標準仕様編」　「9.16.84　TYPEDEF句」を参照してください。

2.4.2　SAME AS句

SAME AS句は，あるデータ名のデータ構造を，ファイル節，作業場所節，局所場所節，または連絡節に定義された別のデータ記述項とまったく同じように定義することを示します。

SAME AS句の使用例を，次に示します。

（例1）

01レベルの記述項を参照する場合

（例2）

集団項目中の記述項を参照する場合

2.5　利用者定義関数

利用者定義関数とは，関数名段落（FUNCTION-ID）を指定すれば，ユーザが任意に作成できる関数です。

利用者定義関数は，関数を利用するプログラムの中から関数一意名によって参照（活性化）でき，関数定義の手続き部見出しのRETURNING指定で規定した一つの値を返します。また，常に再帰属性となるので，自分自身を呼び出せます。

利用者定義関数については，マニュアル「COBOL2002　言語　標準仕様編」　「5.3　利用者定義関数」および「COBOL2002　言語　標準仕様編」　「7.4　関数名段落（FUNCTION-ID）」を参照してください。

2.5.1　利用者定義関数の参照

利用者定義関数は，送り出し側の作用対象として，関数一意名によって参照（呼び出し）されます。関数一意名で参照される利用者定義関数は，リポジトリ段落に指定された関数定義となります。

利用者定義関数を使用する場合，該当する利用者定義関数に対応する関数指定子をリポジトリ段落で指定しておく必要があります。

利用者定義関数の参照については，マニュアル「COBOL2002　言語　標準仕様編」　「4.3.2(2)　関数一意名」を参照してください。また，リポジトリ段落に関する言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「8.2.7(1)　一般形式」を参照してください。

関数定義の概念を次に示します。

図2‒1　関数定義

上記の図では，関数一意名を使用して利用者定義関数を参照しています。

2.5.2　利用者定義関数の引数と返却項目

利用者定義関数の引数および返却項目について説明します。

(1)　引数

関数一意名で引数を指定した場合，関数定義に指定された仮引数の，BY REFERENCE／BY VALUE指定に従って引数を受け渡します。ただし，実引数によっては，BY CONTENTが仮定されることがあります。

仮引数に関する言語仕様についてはマニュアル「COBOL2002　言語　標準仕様編」　「10.1　手続き部の構成」を参照してください。実引数に関する言語仕様についてはマニュアル「COBOL2002　言語　標準仕様編」　「4.3.2(2)　関数一意名」を参照してください。また，BY REFERENCE／BY VALUE指定については，「17.1.1　引数の受け渡しの種類」を参照してください。

利用者定義関数の引数の扱いを次に示します。

表2‒1　利用者定義関数の引数の扱い

関数定義の仮引数の指定

実引数

実引数の扱い

BY REFERENCE

受け取り側作用対象として許可された，オブジェクトプロパティ／オブジェクト参照以外の項目

BY REFERENCE

定数，算術式，ブール式，オブジェクトプロパティ，オブジェクト参照，および受け取り側作用対象として許可されない項目

BY CONTENT

BY VALUE

−

BY VALUE

（凡例）

−：該当しない

引数は，コンパイル時に整合性チェックされます。

(2)　返却項目

返却項目の属性は，関数一意名に対応する関数定義のRETURNINGに指定された項目の属性で決まります。

(3)　利用者定義関数の注意事項

利用者定義関数の注意事項を，次に示します。

利用者定義関数に-Main,Systemまたは-Main,V3オプションを指定した場合，エラーにはなりませんが，-Mainオプションが指定されたプログラムとしてコンパイルはされません。

利用者定義関数には，ENTRY文を指定できません。

CBL，CLS，CLT，CLUで始まる関数名を指定した場合，動作は保証しません。

2.6　再帰呼び出し

再帰呼び出しとは，活性状態にあるプログラムを，直接的または間接的に呼び出すことです。COBOL2002では，RECURSIVE句が指定されたプログラム定義，利用者定義関数，およびメソッド定義を再帰呼び出しできます。

詳細は，「18.4　プログラム属性と呼び出し規約」を参照してください。

注意事項

再帰呼び出しでは，呼び出す処理単位ごとにスタック領域を使用するため，大量に再帰呼び出しをした場合，スタック領域が不足する場合があります。スタック領域が不足した場合，リンカの-STACKオプションでスタック領域を拡張する必要があります。リンカオプションの詳細については，「38.1.3　オプション」を参照してください。

2.7　局所場所節

局所場所節とは，プログラムの実行中だけ有効となるデータ領域項目を定義する個所です。局所場所節に定義したデータ項目は，プログラムが呼び出されたときに領域が確保され，プログラムの実行中だけ有効となります。また，以前呼び出されたときの状態は，保持されません。

詳細は，「4.1.3　局所場所節のデータ領域」を参照してください。

2.8　自由形式のソース原文や登録集原文

COBOL2002では，自由形式正書法に従って，自由形式のソース原文や登録集原文を作成できます。自由形式正書法では，ソース原文や登録集原文を，行中の任意の位置に記述できます。

詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「2.5　自由形式正書法」を参照してください。

第2編　COBOLプログラムの書き方

3　翻訳グループを構成する定義の種類

COBOL2002には，コンパイラの翻訳単位として翻訳グループという概念があります。翻訳グループは，一つ以上のソース単位の集合のことです。翻訳グループには，さまざまなソース単位を含めることができます。COBOL2002では，翻訳グループが1回のコンパイル単位となります。

この章では，翻訳グループについて説明します。

3.1　翻訳グループの概要と考え方

翻訳グループは，1個以上の翻訳単位から構成されます。翻訳単位は，次に示す定義のどれかに該当します。

最外側のプログラム定義

関数定義

クラス定義

インタフェース定義

各翻訳単位のコンパイルが成功すると，プログラム定義，関数定義，クラス定義などに対してオブジェクトファイル（.obj）が生成されます。実行単位は，オブジェクトファイルから生成された実行可能ファイルやDLLによって構成されます。

翻訳グループについては，マニュアル「COBOL2002　言語　標準仕様編」　「6.　翻訳グループの構造（Structured compilation group）」を参照してください。

COBOL2002では，翻訳グループが1回のコンパイルの入力単位となります。翻訳グループの構成概念を次に示します。

図3‒1　翻訳グループの構成

3.2　定義の種類

COBOL2002では，既存のプログラム定義のほかに，オブジェクト指向機能のためのクラス定義，および利用者定義関数のための関数定義があります。また，インタフェース定義のように，クラス定義とのインタフェースだけを表す定義があります。

各定義のコンパイル方法や生成されるオブジェクトファイルとの関係については，「33.　COBOLソースの作成とコンパイル」を参照してください。

3.2.1　プログラム定義

プログラム定義は，見出し部でプログラム名段落を指定して定義します。COBOL85で記述されたプログラムは，COBOL2002のプログラム定義に該当します。

プログラム名段落の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「7.8　プログラム名段落（PROGRAM-ID）」を参照してください。

プログラム定義には，最外側のプログラムと内側のプログラムがあります。

最外側のプログラム

ほかのプログラムに含まれないプログラムです。

最外側のプログラムでは，プログラム名段落に指定したプログラム名称が，オブジェクトファイル中に外部参照として出力されます。このため，ほかの翻訳単位のプログラム（COBOL言語以外を含む）から呼び出せます。

最外側のプログラムは，複数の内側のプログラムを含むことができます。

内側のプログラム

ほかのプログラムに含まれるプログラムです。

内側のプログラムは，そのプログラムを呼び出せる位置にある最外側のプログラム，または内側のプログラムから呼び出せます。また，プログラム名段落で指定したプログラム名称が，オブジェクトファイル中に外部参照として出力されないため，別の翻訳単位のプログラムからは呼び出せません。

内側のプログラムは，複数の内側のプログラム（入れ子のプログラム）を含むことができます。

一つの翻訳グループ中には，複数の最外側のプログラムを記述できます。この翻訳グループを翻訳する場合，スタックコンパイル（連続コンパイル）が実行されます。翻訳グループに複数の最外側のプログラムおよび内側のプログラムを記述した場合の翻訳単位の考え方を次に示します。

図3‒2　翻訳単位の考え方

内側のプログラム(1)，(2)

内側のプログラム(3)に直接含まれる内側のプログラムです。

内側のプログラム(3)，(4)

最外側のプログラム(5)に直接含まれる内側のプログラムです。

最外側のプログラム(5)，(6)

翻訳グループ（SAMPLE1.CBL）に含まれる最外側のプログラムです。

このプログラム定義では，一つの翻訳グループ（SAMPLE1.CBL）に二つの最外側のプログラム（最外側のプログラム(5)，(6)）が含まれているので，コンパイラを1回起動すると，1回のスタックコンパイルによって二つの翻訳単位がコンパイルされます。

3.2.2　関数定義

関数定義は，見出し部で関数名段落を指定して定義します。

関数名段落の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「7.4　関数名段落（FUNCTION-ID）」を参照してください。

利用者定義関数の基本的な規則や動作は，内側のプログラムを持たない最外側のプログラム定義と同じです。ただし，利用者定義関数には，RETURNING指定が必要です。また，常に再帰属性となるので，自分自身を呼び出すことができます。

利用者定義関数は，関数一意名を指定することで呼び出されます。

関数定義の例を次に示します。

図3‒3　関数定義

3.2.3　クラス定義

クラス定義は，見出し部でクラス名段落を指定して定義します。

クラス名段落の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「7.2　クラス名段落（CLASS-ID）」を参照してください。また，クラス定義の詳細については，「20.　オブジェクト指向機能」を参照してください。

クラス定義は，ファクトリ定義，インスタンス定義，およびそれらの各メソッド定義を含むことができます。

ファクトリ定義

クラス定義固有のファクトリオブジェクトの型を定義します。ファクトリ定義は，ファクトリデータ定義およびファクトリメソッド定義から構成されます。すべてのクラスにはファクトリオブジェクトが一つあり，ファクトリに固有なデータとメソッドを持ちます。ファクトリオブジェクトの主な用途は，オブジェクトインスタンスの生成，およびクラスに属するすべてのインスタンスに共通するデータの管理です。

ファクトリ名段落については，マニュアル「COBOL2002　言語　標準仕様編」　「7.3　ファクトリ段落（FACTORY）」を参照してください。

インスタンス定義

クラス定義固有のインスタンスオブジェクトの型を定義します。インスタンス定義は，インスタンスデータ定義およびインスタンスメソッド定義から構成されます。インスタンスオブジェクトとは，それ自身に固有なデータ項目やファイル結合子から構成されるプログラムで，そのクラス定義の中で定義されたメソッド群を共有します。インスタンス定義には，データの特性と，そのクラスに属する各インスタンスオブジェクトに関して呼び起こされるメソッド群を記述します。

オブジェクト段落については，マニュアル「COBOL2002　言語　標準仕様編」　「7.7　オブジェクト段落（OBJECT）」を参照してください。

メソッド定義

メソッド定義は，メソッドが定義されたクラスのインスタンスオブジェクトおよびファクトリオブジェクトに含まれるデータを操作する手続き文の集まりです。メソッドは，それぞれ固有のメソッド名を持ち，固有のデータ部や手続き部を持ちます。メソッドは，インスタンスオブジェクトまたはファクトリオブジェクトを参照する一意名とそのメソッド名を指定することで呼び起こされます。メソッドには引数や返却項目を指定できます。

メソッド名段落については，マニュアル「COBOL2002　言語　標準仕様編」　「7.6　メソッド名段落（METHOD-ID）」を参照してください。

クラス定義の例を次に示します。

図3‒4　クラス定義

3.2.4　インタフェース定義

インタフェース定義は，見出し部でインタフェース名段落を指定して定義します。インタフェース定義を使用することによって，特定のクラスに依存しないインタフェースを定義できます。

インタフェース名段落の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「7.5　インタフェース名段落（INTERFACE-ID）」を参照してください。インタフェースについては，マニュアル「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」のインタフェースの説明を参照してください。

また，インタフェース定義の詳細については，「20.　オブジェクト指向機能」を参照してください。

インタフェース定義には，メソッド原型定義を含めることができます。メソッド原型については，マニュアル「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」のメソッド原型の説明，およびマニュアル「COBOL2002　言語　標準仕様編」　「7.6　メソッド名段落（METHOD-ID）」を参照してください。

インタフェース定義の例を次に示します。

図3‒5　インタフェース定義

4　COBOLプログラムのデータ領域

この章では，COBOLプログラムで使用するデータ領域について説明します。

4.1　データ領域の種類

COBOLプログラムのデータ領域とは，データ部で記述された領域を指します。

COBOLプログラムで使用できるデータ領域を次に示します。

連絡節のデータ領域

作業場所節のデータ領域

局所場所節のデータ領域

ファイル節

報告書節

画面節（SCREEN SECTION）

画面節（WINDOW SECTION）

通信節

サブスキーマ節

ソース単位の定義によって記述できるデータ定義の種別を，次に示します。

表4‒1　ソース単位の定義によって記述できるデータ定義の種別

定義の種類

連絡節

作業場所節

局所場所節

ファイル節

画面節（SCREEN SECTION／WINDOW SECTION）

通信節

報告書節

サブスキーマ節

プログラム定義

○

○

○

○

○

○

メソッド定義

○

×

○

×

×

×

関数定義

○

○

○

○

○

×

ファクトリ定義

インスタンス定義

×

○

×

○

×

×

（凡例）

○：記述できる

×：記述できない

4.1.1　連絡節のデータ領域

連絡節のデータ領域には，仮引数や返却項目を記述します。

ソース要素の連絡節のデータ領域に記述された仮引数や返却項目は，要素が呼ばれるとき，呼ばれる側の要素，呼ぶ側の要素の両方から参照されます。指標名の場合，呼ばれる側の指標名と呼ぶ側の指標名は，別の指標名（領域）を参照します。

連絡節は，ソース要素が呼び出され，呼び出し先の要素の手続き部見出しにUSING／RETURNINGが指定されている場合だけ有効となります。

連絡節は，節の見出し，およびそれに続く77レベル記述項やレコード記述項から構成されます。

連絡節の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「9.6　連絡節（LINKAGE SECTION）」を参照してください。

連絡節の記述例を，次に示します。

図4‒1　連絡節の記述例

4.1.2　作業場所節のデータ領域

作業場所節のデータ領域には，ファイルの一部ではないレコード項目，およびその従属データ項目を記述します。

作業場所節中で記述されるデータは，静的データまたは初期化データです。

作業場所節は，節の見出し，およびそれに続く77レベル記述項やレコード記述項から構成されます。

作業場所節の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「9.4　作業場所節（WORKING-STORAGE SECTION）」を参照してください。また，静的データ，および初期化データの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.5.2　関数，メソッド，オブジェクトまたはプログラムの状態」および「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」を参照してください。

4.1.3　局所場所節のデータ領域

局所場所節のデータ領域には，自動データを記述します。

局所場所節は，プログラム定義，関数定義，メソッド定義などの再帰的に呼び出せるプログラムが呼び出されたときに，呼び出される単位ごとに確保されるデータを定義します。

局所場所節は，節の見出し，およびそれに続く77レベル記述項やレコード記述項から構成されます。

局所場所節の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「9.5　局所場所節（LOCAL-STORAGE SECTION）」を参照してください。

局所場所節の例を次に示します。

図4‒2　局所場所節の記述例

なお，自動データの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」を参照してください。

4.1.4　その他の節のデータ領域

その他の節に記述されるデータは，静的データまたは初期化データです。

それぞれの節の言語仕様については，次を参照してください。

節の種類

参照個所

ファイル節

「COBOL2002　言語　標準仕様編」　「9.3　ファイル節（FILE SECTION）」

報告書節

「COBOL2002　言語　標準仕様編」　「13.4　データ部（DATA DIVISION）（報告書作成機能）」

画面節（SCREEN SECTION）

「COBOL2002　言語　拡張仕様編」　「12.　画面節（SCREEN SECTION）による画面機能」

画面節（WINDOW SECTION）

「COBOL2002　言語　拡張仕様編」　「13.　画面節（WINDOW SECTION）による画面機能」

通信節

「COBOL2002　言語　拡張仕様編」　「11.　通信節による画面機能」

「COBOL2002　言語　拡張仕様編」　「8.　データコミュニケーション機能」

サブスキーマ節

「COBOL2002　言語　拡張仕様編」　「19.1.1　データ部（構造型データベース（XDM/SD）操作シミュレーション機能）」

また，静的データ，および初期化データの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」を参照してください。

4.2　データ属性の種類

COBOL2002では，データやファイルを共用できます。データやファイルを共用すると，複数プログラム間でのデータやファイルの共用が容易になります。

データやファイルを共用するには，その属性が大域属性（GLOBAL句）または外部属性（EXTERNAL句）である必要があります。

4.2.1　大域属性（GLOBAL句）

データ名およびファイル名は，大域名か局所名のどちらかに分類されます。

データ名やファイル名にGLOBAL句を指定すると大域名となります。指定しない場合は，局所名となります。

局所名を使用すると，名前に関連づけられている対象を，局所名が定義されているプログラム中だけから参照できます。

大域名を使用すると，名前に関連づけられている対象を，大域名が定義されているプログラム中，およびそのプログラムに含まれるプログラム中から参照できます。大域名は複数の含まれるプログラム間で参照できますが，同じ名前が定義されているプログラムを含むプログラム中からは参照できません。

大域名および局所名の有効範囲を次に示します。

図4‒3　大域名と局所名の有効範囲

データ名やファイル名は，大域名か局所名のどちらかに分類されます。また，定義されたプログラム中の指定によって，大域属性か局所属性かが決まる名前もあります。ファイル名，レコード名，データ名，および条件名が，それぞれ局所／大域の属性になる場合を次に示します。

ファイル名

ファイル名が定義されているファイル記述項※にGLOBAL句がある場合は大域名となります。大域名でない場合は局所名となります。

レコード名

レコード名が次のどちらかに該当する場合は大域名となります。大域名でない場合は局所名となります。

その名前が定義されているレコード記述項※にGLOBAL句がある

GLOBAL句があるファイル記述項※に関連している

データ名

データ名が次のどちらかに該当する場合は大域名となります。大域名でない場合は局所名となります。

その名前が定義されているデータ記述項※にGLOBAL句がある

GLOBAL句を持つほかのデータ記述項に従属している

条件名（データ記述項※で定義されているもの）

条件名が定義されているデータ記述項が，GLOBAL句があるほかの記述項に従属している場合は大域名となります。大域名でない場合は局所名となります。

注※

ファイル記述項，レコード記述項，およびデータ記述項では，GLOBAL句の指定が規則によって禁止される場合があります。

GLOBAL句については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.30　GLOBAL句」を参照してください。

4.2.2　外部属性（EXTERNAL句）

EXTERNAL句を指定したデータ名やファイル名は，外部属性を持ち，COBOL実行単位内で一つの領域を共用できます。

COBOL実行環境中では，次の範囲でEXTERNAL領域を指定できます。

ファイル数：255個まで

データ領域の数：32,767まで

ファイル数，またはデータ領域の数が上限を超えた場合は，実行時エラーとなります。

EXTERNAL句については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.25　EXTERNAL句」を参照してください。

(1)　共有可能属性と共有不可能属性

外部属性を持つデータ項目には，他言語と共有できるEXTERNAL領域（共有可能属性），および他言語と共有できないEXTERNAL領域（共有不可能属性）があります。

データ項目が次に示す条件のどれかに該当する場合，共有不可能属性のEXTERNAL領域となります。

EXTERNAL句が指定されたデータ項目のデータ名称が日本語である

EXTERNAL句が指定されたデータ項目に指標名が指定されている

EXTERNAL句が指定されたデータ項目にDYNAMICが指定されている

-MultiThreadオプションが指定されている

EXTERNAL句が指定されたファイル記述項中に定義されたデータ項目である

共有可能属性のEXTERNAL領域に対するCOBOLとC言語との共有については，「19.1.5　外部属性を持つデータ項目の共用」を参照してください。

共有可能属性と共有不可能属性では，データ項目の初期値が異なります。

(a)　共有可能属性の初期値

実行可能ファイルがCOBOLだけで構成されている場合

そのEXTERNAL領域はX'00'が保証されます。

COBOLとCOBOL以外の言語の実行可能ファイルが混在している場合

COBOL以外の言語で，共有する領域の初期値を設定しているかどうかによって異なります。

すべての外部変数が初期値なしで定義されている場合，そのEXTERNAL領域の初期値はX'00'が保証されます。

外部変数が初期値ありで定義されている場合，そのEXTERNAL領域は定義された初期値となります（同じ外部変数に初期値ありが複数定義されている場合はリンクエラーとなります）。

(b)　共有不可能属性の初期値

共有不可能属性のEXTERNAL領域の初期値は不定です。

ただし，環境変数CBLEXVALUEに「NULL」を指定することで，EXTERNAL領域の初期値をNULL（X'00'）に設定できます。環境変数CBLEXVALUEは，COBOLプログラムの実行によってCOBOLの実行環境中で初めて出現する共有不可能属性の各EXTERNAL領域に対して，一度だけ作用します。

環境変数CBLEXVALUEの指定方法を次に示します。

形式

CBLEXVALUE=NULL

規則

環境変数CBLEXVALUEは，作業場所節に定義されている共有不可能属性のデータ項目だけを初期化します。

初期値の指定に誤りがある場合，実行時エラーとなります。

(2)　EXTERNAL領域にVARIANTデータ項目を含む場合の注意事項

EXTERNAL領域にVARIANTデータ項目を含む場合，次の規則に従って初期値（X'00'）を設定しておく必要があります。

共有可能属性のとき

EXTERNAL領域に該当する外部変数は，他言語側で初期化なし，またはX'00'を初期値として持つ外部変数として定義します。

共有不可能属性のとき

環境変数CBLEXVALUEにNULLを指定します。

(3)　EXTERNAL属性チェック

EXTERNAL句を指定したデータ名やファイル名がある場合，プログラムの実行時に属性チェックをします。このとき，プログラム間で属性が一致していないと実行時エラーとなります。

EXTERNAL属性チェックのチェック項目を次に示します。

(a)　データ項目に対するチェック項目

レコード長

指標数

指標名称

指標の指定順序（データ項目を記述したときの指標定義の出現順序）

指標の最大繰り返し数

DYNAMIC指定の有無

(b)　ファイルに対するチェック項目

ファイル定義名

ASSIGN句の内容（外部装置名または定数の内容です。データ名の場合，データ名の内容はチェックの対象外となります。）

OPTIONAL指定の有無

ACCESS MODE句の指定（アクセス法）

ORGANIZATION句の指定（ファイル編成）

RESERVE句の指定の有無，整数値

BLOCK CONTAINS句の指定の有無，整数2

CODE SET句の有無

LABEL RECORDS句の指定の有無，指定内容

LINAGE句の指定（FOOTING，TOP，BOTTOM）の有無，整数指定時の整数値

レコード句のVARYING IN SIZE指定の有無

レコード長（最小，最大）

主レコードキー長，主レコードキー属性，相対位置

副レコードキーの数，副レコードキー長，副レコードキー属性，相対位置，DUPLICATES指定の有無

相対キー指定の有無，最大けた数

SYMBOLIC KEY句の有無，最大けた数

コンパイラオプション

次に示すコンパイラオプションの指定の有無

-StdVersion,1，-StdVersion,2，-Switch,EBCDIC，-Switch,EBCDIK，-XMAP,LinePrint，-IsamExtend，-IsamExtend,Zone，-IgnoreLCC，-CompatiM7，-Compati85,IoStatus，-Compati85,Linage，-NumCsv

WRITE文の制御文字の種別（ADVANCING／POSITIONING指定の有無，AFTER／BEFORE指定の混在）

レコード名称

ファイルに記述されたレコード数

各レコードの指定順序，各レコードのデータ項目属性（「4.2.2　外部属性（EXTERNAL句）」の「(3)　EXTERNAL属性チェック」−「(a)　データ項目に対するチェック項目」を参照）

レコード形式

LOCK MODE句の指定

APPLY FILE-SHARE句の有無

-IgnoreAPPLY,FILESHAREオプション指定時は，覚え書きとみなし，指定なしとして扱います。

DATA FORMAT句の指定の有無と指定内容

DECIMAL-POINT IS COMMA句の有無（-NumCsvオプション指定時のCSV編成ファイルだけが対象）

CHARACTER TYPE句の有無（WRITE文のFROM指定の一意名，またはその下位項目にCHARACTER TYPE句が指定されている場合も含む）

第3編　手続き文

5　手続き文

この章では，COBOLで使用する手続き文の仕様と使用例について説明します。

5.1　概要

ここでは，手続き文の概要について説明します。

5.1.1　基本的な内部操作手続き文

基本的な内部操作手続き文の分類を，次に示します。

表5‒1　基本的な内部操作手続き文の分類

分類

文

参照先

算術演算

ADD

COMPUTE

DIVIDE

MULTIPLY

SUBTRACT

5.2　算術演算機能

文字列操作

EXAMINE※1

INSPECT

STRING

TRANSFORM※1

UNSTRING

5.3　文字列操作文

条件分岐

EVALUATE

IF

5.4　条件分岐文

表操作

SEARCH

5.5　表操作

手続き分岐

ALTER※1

CONTINUE

EXIT※2

GO TO

PERFORM

5.6　手続き分岐

データ転記

INITIALIZE

MOVE

SET※2

5.7　データ転記文

オブジェクト指向

INVOKE※2

SET※2

20.　オブジェクト指向機能

例外

EXIT※2

GOBACK※2

RAISE

RESUME

SET

USE※2

21.　共通例外処理

入出力

CLOSE

COMMIT※2

DELETE

OPEN

READ

REWRITE

ROLLBACK※2

START

UNLOCK

USE※2

WRITE

6.　ファイル入出力機能

整列併合

MERGE

RELEASE

RETURN

SORT

11.　整列併合機能

少量入出力

ACCEPT※2

DISPLAY※2

STOP※2

10.　ACCEPT／DISPLAY／STOP文による入出力

報告書機能

GENERATE

INITIATE

SUPPRESS

TERMINATE

9.　報告書作成機能

プログラム間連絡

CALL

CANCEL

ENTRY

EXIT※2

GOBACK※2

STOP※2

16.　COBOLの実行単位

通信

COMMIT※2

DISABLE

ENABLE

RECEIVE

ROLLBACK※2

SEND

TRANSCEIVE

22.　データコミュニケーション機能

データベース操作

埋め込みSQL文

23.　データベース操作機能

画面

ACCEPT※2

DISPLAY※2

ERASE

REPLY

USE※2

WAIT

12.　画面入出力機能

OLE2オートメーション機能

INVOKE※2

SET※2

25.　OLE2オートメーション機能

その他

ENTER※1

−

（凡例）

−：廃要素のため，このマニュアルでは解説なし

注※1

廃要素です。

注※2

複数の機能で使用します。

5.1.2　条件式

条件式の評価の流れを，幾つかの場合に分けて説明します。

条件式の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「4.7.4　条件式（Conditional expressions）」を参照してください。

(1)　条件がすべてANDで連結されている場合

条件がすべてANDで連結されている条件式の評価の流れを次に示します。

図5‒1　条件1 AND 条件2 AND … 条件nの評価

この場合の条件式の例を次に示します。

（例）

IF A = 10 AND B = 20 AND C = 30
  THEN
    DISPLAY '--- THEN ---'
  ELSE
    DISPLAY '--- ELSE ---'
END-IF.

A=10かつB=20かつC=30のときだけTHENのDISPLAY文を実行します。一つでも条件が真とならない場合は，ELSEのDISPLAY文を実行します。

(2)　条件がすべてORで連結されている場合

条件がすべてORで連結されている条件式の評価の流れを次に示します。

図5‒2　条件1 OR 条件2 OR … 条件nの評価

この場合の条件式の例を次に示します。

（例）

IF A = 10 OR B = 20 OR C = 30
  THEN
    DISPLAY '--- THEN ---'
  ELSE
    DISPLAY '--- ELSE ---'
END-IF.

A=10，B=20，C=30のどれか一つでも条件が真ならばTHENのDISPLAY文を実行します。すべての条件が偽の場合にだけ，ELSEのDISPLAY文を実行します。

(3)　条件がORとANDで連結されている場合

条件がORとANDで連結されている条件式の評価の流れを次に示します。

図5‒3　条件1 OR 条件2 AND 条件3の評価

この場合の条件式の例を次に示します。

（例）

IF A = 10 OR B = 20 AND C = 30
  THEN
    DISPLAY '--- THEN ---'
  ELSE
    DISPLAY '--- ELSE ---'
END-IF.

A=10，またはB=20かつC=30のどちらか一つでも条件が真ならばTHENのDISPLAY文を実行します。すべての条件が偽の場合にだけ，ELSEのDISPLAY文を実行します。

(4)　条件が括弧で囲まれている場合

条件が括弧で囲まれている条件式の評価の流れを次に示します。

図5‒4　（条件1 OR NOT 条件2） AND 条件3 AND 条件4の評価

この場合の条件式の例を次に示します。

（例）

IF ( A = 10 OR NOT B = 20 ) AND C = 30 AND D = 40
  THEN
    DISPLAY '--- THEN ---'
  ELSE
    DISPLAY '--- ELSE ---'
END-IF.

括弧で囲まれている条件，C=30およびD=40がANDで連結されているので，これらの条件がすべて真ならば，条件式の真理値は真となります。どれか一つでも偽となれば，条件式の真理値は偽となります。

次に括弧内の条件について検証します。A=10とNOT B=20はORで連結されているので，どちらか一方の条件が真ならば，括弧内の条件は真となります。ここで，NOTは条件B=20の真理値を否定しているため，B=20が真ならばNOT B=20は偽，B=20が偽ならばNOT B=20は真となります。

5.1.3　中間結果の作成条件

コンパイラは，算術式の作用対象の演算順序などによって，一つ以上の中間結果を作成します。この中間結果は記憶装置の一部またはレジスタ上に作成され，算術演算の結果が出るまで保留されます（演算結果を連続して使用する場合，記憶装置内の同じ場所を使用することがあります）。

中間結果は次の場合に作成されます。

ADD文，SUBTRACT文，MULTIPLY文，DIVIDE文，およびCOMPUTE文

EVALUATE文，IF文，PERFORM文，およびSEARCH文中に算術式が含まれるとき

組み込み関数の引数，添字，部分参照中に算術式が含まれるとき

中間結果の作成例を次に示します。

（例）

COMPUTE A = B + (C / D) + ((E ** F) * G) - H

上記のCOMPUTE文は，次に示す連続した単一の演算操作に変換されます。

C / D      → IR1
E ** F     → IR2
IR2 * G    → IR3
B + IR1    → IR4
IR4 + IR3  → IR5
IR5 - H    → A

IRn（nは数字）は，コンパイラによって作成された中間結果の記憶場所を表します。

結果項目Aの精度は，作成される中間結果の整数部および小数部のけた数の影響を受けます。

なお，詳細は「5.2　算術演算機能」を参照してください。

5.1.4　CORRESPONDING指定

CORRESPONDING指定は，ADD文，SUBTRACT文，およびMOVE文で使用します。

CORRESPONDING指定については，マニュアル「COBOL2002　言語　標準仕様編」　「10.6.5　CORRESPONDING指定」を参照してください。

CORRESPONDING指定をすると，一つの文で集団項目中の幾つもの「対応する」項目間の加減算や転記ができます。

CORRESPONDINGを指定したMOVE文，ADD文，またはSUBTRACT文で，対応する項目が一つもない場合は，転記が行われません。

対応とは，D1とD2をそれぞれ集団項目の一意名とするときに，D1とD2から一つずつとったデータ項目の組が，次の条件を満たす場合を指します。

D1に従属するデータ項目とD2に従属するデータ項目にFILLER以外の同じデータ名があり，D1とD2の直前までの修飾語の名前の系列が同じである。

CORRESPONDING指定付きのMOVE文では，そのデータ項目の少なくとも一つは基本項目であり，結果的に行われる転記は転記の規則に従って正しいものである。

CORRESPONDING指定付きのADD文またはSUBTRACT文では，そのデータ項目の両方が基本数字データ項目である。

D1およびD2の記述は，レベル番号66，77，88，または用途が指標，オブジェクトを含んでいてはならない。

D1またはD2に従属するデータ項目が，REDEFINES句，RENAMES句，OCCURS句，または用途が指標，オブジェクトを含むとき，そのデータ項目は対応の対象とはならない。また，REDEFINES句，OCCURS句，または用途が指標，オブジェクトを含むデータ項目に従属するときも，対応の対象とはならない。D1およびD2は，どちらも部分参照されてはならない。

上記の条件を満足する各データ項目の名前は，暗黙の修飾語の結果，一意にならなければならない。

対応する項目の例を，次に示します。

（例1）

D1同士とF1同士は対応します。

H1は一方が基本項目で他方が集団項目ですが，MOVE文では，基本項目から集団項目への転記ができるので対応しています。ただし，ADD文およびSUBTRACT文では基本項目でなければならないので，対応しません。

B1，C1は集団項目なので対応しません。

E1は修飾語の系列が異なる（E1 OF C1 OF B1とE1 OF C1 OF H1）ので対応しません。

つまり，(A)は(B)と同じことになります。

（A）

MOVE CORRESPONDING X TO Z

（B）

MOVE D1 OF C1 OF B1 OF X TO D1 OF C1 OF B1 OF Z
MOVE F1 OF C1 OF B1 OF X TO F1 OF C1 OF B1 OF Z
MOVE H1 OF X             TO H1 OF Z

（例2）

A1とE1は対応します。

B1はOCCURS句を含む項目，C1，D1はOCCURS句を含む項目に従属する項目なので，対応しません。

F1はREDEFINES句を含む項目なので対応しません。

つまり，(A)は(B)と同じことになります。

（A）

MOVE CORRESPONDING Y TO Z

（B）

MOVE A1 OF Y TO A1 OF Z
MOVE E1 OF Y TO E1 OF Z

5.2　算術演算機能

ここでは，算術演算機能について説明します。

5.2.1　算術演算機能の特徴

算術文（詳細は「5.2.2　算術文」を参照）は，複数個の答えを持つことがあります。これらの文は，次のように書かれたものとして実行されます。

文の初期評価（添字などの評価）の一部であるすべてのデータ項目の参照を行い，これらのデータ項目に対して必要な計算や結合を行い，括弧の演算の結果を一時的な記憶場所に蓄える文（初期評価の一部である項目を表す規則は，個々の文によって異なる）

各単一の結果のデータ項目に，この一時的な記憶場所の値を転送したり，結び付けたりする一連の文（これらの文は，複数個の答が並べてあるのと同じ順序で，左から右に書かれているものとみなされる）

算術文の例を次に示します。なお，例中のtempは，任意の一時的な記憶場所を示します。

（例1）

(A)と(B)は同じことを表します。

(A)

ADD a b c TO c d(c) e

(B)

ADD a b c GIVING temp
ADD temp TO c
ADD temp TO d(c)
ADD temp TO e

（例2）

(A)と(B)は同じことを表します。

(A)

MULTIPLY a(i) BY i，a(i)

(B)

MOVE a(i) TO temp
MULTIPLY temp BY i
MULTIPLY temp BY a(i)

算術文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.2　ADD文」，「COBOL2002　言語　標準仕様編」　「10.8.8　COMPUTE文」，「COBOL2002　言語　標準仕様編」　「10.8.13　DIVIDE文」，「COBOL2002　言語　標準仕様編」　「10.8.29　MULTIPLY文」，および「COBOL2002　言語　標準仕様編」　「10.8.48　SUBTRACT文」を参照してください。

5.2.2　算術文

算術文には，COMPUTE文，ADD文，SUBTRACT文，MULTIPLY文，およびDIVIDE文があります。各文の説明を，次に示します。

なお，例中のtemp，quot，rem-tmp，およびremは，任意の一時的な記憶場所を示します。

(1)　COMPUTE文

COMPUTE文は，算術式の値を一つ以上のデータ項目に収めます。

COMPUTE文による演算の例を次に示します。なお，A〜Dは整数項目を表します。

（例）

COMPUTE A = B +  C.    ←BにCを加算し，その結果をAに収める
COMPUTE A = B -  C.    ←BからCを減算し，その結果をAに収める
COMPUTE A = B *  C.    ←BにCを乗算し，その結果をAに収める
COMPUTE A = B /  C.※   ←BをCで除算し，その結果をAに収める
COMPUTE A = B ** C.    ←BをC乗し，その結果をAに収める

注※

剰余を求めたい場合には，次のようなCOMPUTE文を組み合わせます。

COMPUTE A =  B / C          ←BをCで除算し，その商をAに収める
COMPUTE D =  B - C * A      ←商Aを使って剰余を求め，Dに収める

(2)　ADD文

ADD文は，幾つかの数字作用対象の和を一つ以上のデータ項目に収めます。

ADD文による演算の例を次に示します。

（例1）

ADD文は，続く注記行のCOMPUTE文と同じです。

       ADD A TO B
      *COMPUTE B = A + B
       ADD A B C TO D
      *COMPUTE D = A + B + C + D
       ADD A B TO C D
      *COMPUTE temp = A + B
      *COMPUTE C = temp + C
      *COMPUTE D = temp + D

（例2）

ADD文は，続く注記行のCOMPUTE文と同じです。

       ADD A B TO C GIVING D
      *COMPUTE D = A + B + C
       ADD A B GIVING C D ROUNDED
      *COMPUTE temp = A + B
      *COMPUTE C = temp
      *COMPUTE D ROUNDED = temp

（例3）

ADD文は，続く注記行の二つのCOMPUTE文を合わせたものと同じです。

       05 A.
         10 D1 PIC S9(6).
         10 D2 PIC S9(3)V9(2) USAGE COMP.
       05 B.
         10 D1 PIC S9(5)V9 USAGE COMP.
         10 D2 PIC 9(5)V9(5).
         ：
           ADD CORRESPONDING A TO B ROUNDED
      *    COMPUTE D1 OF B = D1 OF A + D1 OF B
      *    COMPUTE D2 OF B = D2 OF A + D2 OF B

(3)　SUBTRACT文

SUBTRACT文は，幾つかの数字作用対象の和を，一つ以上のデータ項目から減じ，その結果を一つ以上のデータ項目に収めます。

SUBTRACT文による演算の例を次に示します。

（例1）

SUBTRACT文は，続く注記行のCOMPUTE文と同じです。

       SUBTRACT A FROM B
      *COMPUTE B = B - A
       SUBTRACT A B C FROM D
      *COMPUTE D = D - (A + B + C)
       SUBTRACT A B FROM C D
      *COMPUTE temp = A + B
      *COMPUTE C = C - temp
      *COMPUTE D = D - temp

（例2）

SUBTRACT文は，続く注記行のCOMPUTE文と同じです。

       SUBTRACT A FROM B GIVING C
      *COMPUTE C = B - A
       SUBTRACT A B C FROM D GIVING E
      *COMPUTE E = D - (A + B + C)
       SUBTRACT A B FROM C GIVING D E ROUNDED
      *COMPUTE temp = C - (A + B)
      *COMPUTE D = temp
      *COMPUTE E ROUNDED = temp

（例3）

SUBTRACT文は，続く注記行の二つのCOMPUTE文を合わせたものと同じです。

       05 A.
        10 D1 PIC S9(6).
        10 D2 PIC S9(3)V9(2) USAGE COMP.
       05 B.
        10 D1 PIC S9(5)V9 USAGE COMP.
        10 D2 PIC 9(5)V9(5).
              :
           SUBTRACT CORRESPONDING A FROM B
      *COMPUTE D1 OF B = D1 OF B - D1 OF A
      *COMPUTE D2 OF B = D2 OF B - D2 OF A

(4)　MULTIPLY文

MULTIPLY文は，数字作用対象同士の積を計算し，その結果を一つ以上のデータ項目に収めます。

MULTIPLY文による演算の例を次に示します。

（例1）

MULTIPLY文は，続く四つのCOMPUTE文を合わせたものと同じです。

       MULTIPLY A BY B ROUNDED C D
      *COMPUTE temp = A
      *COMPUTE B ROUNDED = temp * B
      *COMPUTE C = temp * C
      *COMPUTE D = temp * D

（例2）

MULTIPLY文は，続く四つのCOMPUTE文を合わせたものと同じです。

       MULTIPLY A BY B GIVING C D ROUNDED E
      *COMPUTE temp = A * B
      *COMPUTE C = temp
      *COMPUTE D ROUNDED = temp
      *COMPUTE E = temp

(5)　DIVIDE文

DIVIDE文は，一つの作用対象をほかの数字作用対象で割り，その商と剰余を一つ以上のデータ項目に収めます。

DIVIDE文による演算の例を次に示します。

（例1）

DIVIDE文は，続く注記行のCOMPUTE文の組と同じです。

       DIVIDE A INTO B ROUNDED A C
      *COMPUTE temp = A
      *COMPUTE B ROUNDED = B / temp
      *COMPUTE A = A / temp
      *COMPUTE C = C / temp

（例2）

DIVIDE文は，続く注記行のCOMPUTE文と同じです。

       DIVIDE A INTO B GIVING C D ROUNDED
      *COMPUTE temp = B / A
      *COMPUTE C = temp
      *COMPUTE D ROUNDED = temp

（例3）

DIVIDE文は，続く注記行のCOMPUTE文と同じです。

       DIVIDE A BY B GIVING C D ROUNDED
      *COMPUTE temp = A / B
      *COMPUTE C = temp
      *COMPUTE D ROUNDED = temp

（例4）

DIVIDE文は，続く注記行のCOMPUTE文の組と同じです。

       DIVIDE A INTO B GIVING C ROUNDED REMAINDER D
      *COMPUTE quot = B / A
      *COMPUTE rem-tmp = quot.
      *COMPUTE rem = B - A * rem-tmp.
      *COMPUTE C ROUNDED = quot
      *COMPUTE D = rem

（例5）

DIVIDE文は，続く注記行のCOMPUTE文と同じです。

       DIVIDE A BY B GIVING C ROUNDED REMAINDER D
      *COMPUTE quot = A / B
      *COMPUTE rem = A - B * quot
      *COMPUTE C ROUNDED = quot
      *COMPUTE D = rem

5.2.3　有効けた数

算術文の有効けた数に関する共通事項を次に示します。

作用対象のデータ記述が同じである必要はありません。

計算の過程で，すべての必要な変数と小数点の位置が合わせられます。

作用対象の数字の最大けた数は18けたです。

また，作用対象の合成※の最大けた数も18けたです。

注※

作用対象の合成とは，指定された各作用対象を小数点で位置合わせし，重ね合わせてできる仮想のデータ項目です。

各作用対象のけた数の合計は，想定した位取りも含めて30けた以内です。

5.2.4　演算の中間結果

中間結果のけた数は，次の規則に従って確保されます。

演算の結果，上位けたや下位けたに切り捨てが発生しないけた数を確保します。

除算の場合，割り切れるとは限らないので，小数部のけた数は算術文中に現れる項目の最大のものとします。

除数のPICTURE句で，999PPVのように小数点の左側にPがある場合には，演算速度の効率を考慮して，Pのけた数を商の中間結果に加えて大きくします。

ここで確保されないけたに入る値は，切り捨てられます。

べき乗の場合（右辺（べき数）が一意名のとき），演算結果の上位けたや下位けたがどこまで大きくなるかわからないため，中間結果を30けたとして，小数部のけた数は算術式中に現れる項目の小数部の最大値とします。

ここで確保されないけたに入る値は，切り捨てられます。

中間結果の取れるけた数は，最大の30けたとし，これを超えた場合は補正をします。

このシステムで適用する中間結果の計算式を「表5‒2　中間結果のけた数（加減算）」および「表5‒3　中間結果のけた数（乗算，除算，べき乗）」に示します。ただし，作用対象に数字定数がある場合，中間結果はその計算結果の取れる最大値を格納できるけた数を確保します。

表5‒2　中間結果のけた数（加減算）

演算の種類

整数部のけた数

小数部のけた数

加減算が連続(a₁±a₂±...±an)していて，かつ整数けたが最大9けた以下の場合

Max(I₁,I₂,…,In) ＋ i※

MAX(Dn-1,Dn)

上記以外の場合

Max(In-1,In) ＋ 1

（凡例）

I₁：連続する加減算の最初の数の整数部のけた数

In-1：演算の左辺の整数部のけた数

Dn-1：演算の左辺の小数部のけた数

In：演算の右辺の整数部のけた数

Dn：演算の右辺の小数部のけた数

注※

iは，次に示す式を満足する整数を表します。

log₁₀(n) ≦ i ≦ log₁₀(n-1) + 1

iを加算することで，中間結果の整数部のけた数が9けたを超えた場合，整数部のけた数の算出方法が「上記以外の場合」に変わります。

表5‒3　中間結果のけた数（乗算，除算，べき乗）

演算の種類

整数部のけた数（I）

小数部のけた数（D）

乗算

I₁ + I₂

D₁ + D₂

除算

I₁ + D₂

MAX (D₁ - D₂,Dmax)

べき乗

右辺が整数の数字直定数（L≠0）のとき

I₁ × L

右辺が整数の数字直定数 (L＝0)のとき

1

右辺が上記以外のとき

30 - Dmax

右辺が整数の数字直定数（L≠0）のとき

D₁ × L

右辺が整数の数字直定数（L＝0）のとき

0

右辺が上記以外のとき

Dmax

（凡例）

I：中間結果の整数部のけた数

D：中間結果の小数部のけた数

I₁：演算の左辺の整数部のけた数

D₁：演算の左辺の小数部のけた数

I₂：演算の右辺の整数部のけた数

D₂：演算の右辺の小数部のけた数

Df：受け取り側作用対象の小数部のけた数

Dmax：算術式中のすべての作用対象と結果項目（ROUNDED指定ありの場合はDf + 1）の中で最大の小数部のけた数（算術式が条件式中に書かれたときは比較の作用対象を含む。また，べき数と除数の作用対象と浮動小数点数のものは除く。）

MAX(x,y)：xとyの最大数

L：整数の数字直定数の値

表5‒4　中間結果が30けたを超える場合の補正値

補正条件

最終的な整数部

最終的な小数部

Dの値

Iの値

D ≦ Dmax

(任意)

30 - D

D

D ＞ Dmax

I + Dmax ≦ 30

I

30 - I

I + Dmax ＞ 30

30 - Dmax

Dmax

注

表中のIとDは，「表5‒3　中間結果のけた数（乗算，除算，べき乗）」で計算された値です。

PICTURE句で整数部にPの指定がある場合，小数部のけた数は0として計算します。小数部にPの指定がある場合は，整数部は負として計算します。例えば，999PPVの整数部のけた数は5で，小数部のけた数は0です。また，中間結果のけた数（I + D）が30けたを超えた場合，「表5‒2　中間結果のけた数（加減算）」と「表5‒3　中間結果のけた数（乗算，除算，べき乗）」の値は，「表5‒4　中間結果が30けたを超える場合の補正値」のように補正されます。

演算の中間結果のけた数を求める例を次に示します。

（例）

       77 A PIC S9(3)V9(3).
       77 B PIC S9(4)V9(3).
       77 C PIC S9(3)V9(2).
       77 D PIC S9(7)V9(4).
           :
           COMPUTE D = C + (A / B).

上記のCOMPUTE文を実行すると，中間結果のけた数は次のようになります。

除算A/Bの中間結果のけた数

整数部：I=I₁+D₂=3+3=6（けた）

小数部：D=MAX(D₁-D₂,Dmax)=MAX(0,4)=4（けた）

加算C+(A/B)の中間結果のけた数

除算A/Bの中間結果のけた数は，上記の計算式から，I₂=6，D₂=4として計算します。

整数部：I=MAX(I₁,I₂)+1=MAX(3,6)+1=7（けた）

小数部：D=MAX(D₁,D₂)=MAX(2,4)=4（けた）

演算の中間結果についての注意事項

次の場合，浮動小数点演算となるため，中間結果のけた数の計算式は適用されません。

浮動小数点項目や浮動小数点数字定数が算術演算の対象に指定されている場合

被べき数（底）が浮動小数点項目であるか，またはべき数（指数）が整数でない場合

関数値のデータ属性が内部浮動小数点形式の組み込み関数の場合

浮動小数点項目，べき乗が含まれる算術式，または除算が含まれる算術式を引数に指定した組み込み関数の場合

中間結果が30けたを超えると，切り捨てが行われるため，正しい値が求まらないことがあります。そのため，中間結果が30けたを超える計算をしてはいけません。

中間結果の計算式は，COBOLの規格で規定されていないため，このシステムが独自に規定したものです。

5.3　文字列操作文

文字列操作文は，文字をつなぎ合わせたり，分解したり，置き換えたりします。

文字列操作文には，STRING文，UNSTRING文，およびINSPECT文があります。

5.3.1　STRING文

STRING文は，幾つかのデータ項目の内容の一部または全部をつなぎ合わせて，一つのデータ項目に移します。

STRING文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.47　STRING文」を参照してください。

STRING文の例を次に示します。

（例1）

受け取り開始位置を指定しない（POINTER指定のない）STRING文

三つのデータ項目AA，BB，CCのデータの一部または全部を取り出して，文字列を作成します。

データ項目AAにはコンマ（,），BBにはセミコロン（;），CCには空白（ ）がデータの区切り文字として入っていて，区切り文字までのデータを取り出して文字列を作成します。

このSTRING文を実行すると，次のようにデータを転記します。なお，文中のかたかなは，半角かたかな文字を表します。

AAのデータを，コンマ（,）の直前までMSG-01に転記します。

'12345'

英数字定数'ハ'を，1.に続けて転記します。

'12345ハ'

BBのデータを，セミコロン（;）の直前まで，2.に続けて転記します。

'12345ハ CHECK OK'

英数字定数'デス。'を，3.に続けて転記する。

'12345ハ CHECK OKデス。'

CCのデータを，空白（ ）の直前まで，4.に続けて転記します（CCのデータの区切り文字は空白で，セミコロンはデータの一部です）。

'12345ハ CHECK OKデス。 READY;'

MSG-01の残りの部分の内容は変更されません。

（例2）

受け取り開始位置を指定する（POINTER指定のある）STRING文

データ項目D1，D2，D3，D4のデータの一部または全部を取り出し，MSG-02の領域がいっぱいになるまで転記して文字列を作成します。

MSG-02がいっぱいかどうかの判定には，OVERFLOW指定を使用します。

送り出し側作用対象のデータ項目からは，先頭から最初の空白の直前までのデータを取り出します。

受け取り開始位置は，POINTER項目の初期値で指定します。

       77 D1     PIC X(10).
       77 D2     PIC X(10).
       77 D3     PIC X(10).
       77 D4     PIC X(10).
       77 PTR-1  PIC 9(5) USAGE COMP.
       77 MSG-02 PIC X(25).
                       ：
           MOVE 6     TO PTR-1.
           MOVE SPACE TO MSG-02.
           STRING D1 D2 D3 D4
             DELIMITED BY SPACE
             INTO MSG-02
             WITH POINTER PTR-1
             ON OVERFLOW
               DISPLAY  'OVERFLOW CONDITION;'
           END-STRING.

PTR-1の初期値が6の場合，このSTRING文を実行すると，次のようにデータを転記します。

D1のデータを，最初の空白の直前までMSG-02に転記します。

PTR-1の初期値は6なので，MSG-02の6文字目からデータを転記し，先頭の5文字の内容は変更しません。

'_____123,45'

D2のデータを続けて転記します。

D2のデータには空白がないので，右端の文字Jまですべて転記します。

'_____123,45ABCDEFGHIJ'

D3のデータを続けて転記します。

D3のデータを4文字転記すると受け取り側作用対象がいっぱいになるので，転記を終了して，OVERFLOW指定に書かれたDISPLAY文を実行します。D3の残りのデータとD4のデータは使用しません。

PTR-1には，転記した文字数が加えられています（この場合，MSG-02のサイズ+1=26が設定されています）。

5.3.2　UNSTRING文

UNSTRING文は，送り出し側作用対象の連続したデータを分解し，幾つかの受け取り側作用対象データ項目に移します。

UNSTRING文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.52　UNSTRING文」を参照してください。

UNSTRING文の使用例を次に示します。

（例1）

コンマで区切られている19文字のデータを分解して転記します。

       77 SEND-02 PIC X(19).
       77 RR-21   PIC X(8).
       77 RR-22   PIC X(8).
       77 RR-23   PIC X(8).
             :
           UNSTRING SEND-02 DELIMITED BY ','
                    INTO RR-21 RR-22 RR-23.

（例2）

100バイトのデータ項目中にコンマで区切られたデータが入っているときに，データ項目のデータを3個ずつ取り出して転記します。

すべてのデータを処理したかどうかの判定には，OVERFLOW指定を使用します。

送り出し側作用対象：

受け取り側作用対象

実行

結果

AAの値

BBの値

CCの値

CTRの値

OVERFLOW条件

1回目の実行

K01

K02

K03

3

成立する

2回目の実行

T1

N4

K05

3

成立する

：

：

：

：

：

　　：

n回目の実行

N1

M35

2

成立しない

       77 SEND-03 PIC X(100).
       77 AA      PIC X(5).
       77 BB      PIC X(5).
       77 CC      PIC X(5).
       77 SW-1    PIC 9(1) VALUE 0.
       77 PTR-1   PIC 9(3) VALUE 1.
       77 CTR     PIC 9(3) VALUE 0.
                       :
           PERFORM TEST AFTER UNTIL SW-1 NOT = 0
             MOVE SPACE TO AA BB CC
             MOVE 0     TO SW-1, CTR
             UNSTRING SEND-03
                DELIMITED BY ',' OR ALL SPACE
                INTO AA, BB, CC,
                WITH POINTER PTR-1
                TALLYING IN CTR
                NOT ON OVERFLOW MOVE 1 TO SW-1
             END-UNSTRING
              :
             AA, BB, CCを使った処理をする
              :
           END-PERFORM.
                :

注

データの個数はCTRに入っています。

5.3.3　INSPECT文

INSPECT文は，データ項目中の文字や文字列の出現回数を数えたり，それらをほかの文字列で置き換えたりします。

INSPECT文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.25　INSPECT文」を参照してください。

INSPECT文の例を次に示します。COUNT-nは，その文の実行の直前にゼロになっているものと仮定します。

（例1）

実行例

   INSPECT ITEM TALLYING
       COUNT-0 FOR ALL 'AB', ALL 'D'
       COUNT-1 FOR ALL 'BC'
       COUNT-2 FOR LEADING 'EF'
       COUNT-3 FOR LEADING 'B'
       COUNT-4 FOR CHARACTERS.

   INSPECT ITEM REPLACING
       ALL 'AB' BY 'XY', 'D' BY 'X'
       ALL 'BC' BY 'VW'
       LEADING 'EF' BY 'TU'
       LEADING 'B' BY 'S'
       FIRST 'G' BY 'R'
       FIRST 'G' BY 'P'
       CHARACTERS BY 'Z'.

実行結果

ITEMの初期値

COUNT-0

COUNT-1

COUNT-2

COUNT-3

COUNT-4

ITEMの終了値

EFABDBCGABCFGG

3

1

1

0

5

TUXYXVWRXYZZPZ

BABABC

2

0

0

1

1

SXYXYZ

BBBC

0

1

0

2

0

SSVW

（例2）

実行例

   INSPECT ITEM TALLYING
     COUNT-0 FOR CHARACTERS
     COUNT-1 FOR ALL 'A'.
   INSPECT ITEM REPLACING
     CHARACTERS BY 'Z'
     ALL 'A' BY 'X'.

実行結果

ITEMの初期値

COUNT-0

COUNT-1

ITEMの終了値

BBB

3

0

ZZZ

ABA

3

0

ZZZ

（例3）

実行例

    INSPECT ITEM TALLYING
      COUNT-0 FOR ALL 'AB' BEFORE 'BC'
      COUNT-1 FOR LEADING 'B' AFTER 'D'
      COUNT-2 FOR CHARACTERS AFTER 'A' BEFORE 'C'.
    INSPECT ITEM REPLACING
      ALL 'AB' BY 'XY' BEFORE 'BC'
      LEADING 'B' BY 'W' AFTER 'D'
      FIRST 'E' BY 'V' AFTER 'D'
      CHARACTERS BY 'Z' AFTER 'A' BEFORE 'C'.

実行結果

ITEMの初期値

COUNT-0

COUNT-1

COUNT-2

ITEMの終了値

BBEABDABABBCABEE

3

0

2

BBEXYZXYXYZCABVE

ADDDDC

0

0

4

AZZZZC

ADDDDA

0

0

5

AZZZZZ

CDDDDC

0

0

0

CDDDDC

BDBBBDB

0

3

0

BDWWWDB

（例4）

実行例

    INSPECT ITEM TALLYING
      COUNT-0 FOR ALL 'AB' AFTER 'BA' BEFORE 'BC'.
    INSPECT ITEM REPLACING
      ALL 'AB' BY 'XY' AFTER 'BA' BEFORE 'BC'.

実行結果

ITEMの初期値

COUNT-0

ITEMの最終値

ABABABABC

1

ABABXYABC

（例5）

実行例

   INSPECT ITEM CONVERTING
     'ABCD' TO 'XYZX' AFTER QUOTE BEFORE '#'.

上記のINSPECT文は，次のINSPECT文と同じです。

    INSPECT ITEM REPLACING
      ALL 'A' BY 'X' AFTER QUOTE BEFORE '#'
      ALL 'B' BY 'Y' AFTER QUOTE BEFORE '#'
      ALL 'C' BY 'Z' AFTER QUOTE BEFORE '#'
      ALL 'D' BY 'X' AFTER QUOTE BEFORE '#'.

実行結果

ITEMの初期値

ITEMの最終値

AC'AEBDFBCD#AB'D

AC'XEYXFYZX#AB'D

5.4　条件分岐文

条件分岐文には，EVALUATE文およびIF文があります。

5.4.1　EVALUATE文

EVALUATE文は，多枝分岐，多枝結合の構造を記述し，複数の条件を評価できます。プログラムが次に取る動作は，これらの評価の結果によって決まります。

EVALUATE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.18　EVALUATE文」を参照してください。

EVALUATE文の例を次に示します。

（例1）

各選択対象の組中の選択対象の数は，選択主体の数と等しくする必要があります。

              ：
    EVALUATE X ALSO Y ALSO Z
        WHEN 1 ALSO 2 ALSO ANY
          ADD A TO B
        WHEN 3 ALSO 4 ALSO 5
          ADD C TO B
        WHEN OTHER
          ADD B TO A
    END-EVALUATE.
              ：

（例2）

    EVALUATE A
      WHEN  1
      WHEN  3
      WHEN  5
           :
      WHEN 19
        MOVE 'ODD' TO B             *>1.
      WHEN  2
      WHEN  4
            :
      WHEN 20
        MOVE 'EVEN' TO B            *>2.
      WHEN OTHER
        MOVE 'OUT  OF  RANGE' TO B  *>3.
    END-EVALUATE.

整数項目Aの値が20以下の奇数のとき，1.のMOVE文が実行されます。

整数項目Aの値が20以下の偶数のとき，2.のMOVE文が実行されます。

整数項目Aの値が20を超えるとき，または0以下のとき，3.のMOVE文が実行されます。

5.4.2　IF文

IF文は，条件を評価し，真ならばTHENの処理を，偽ならばELSEの処理を実行します。

IF文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.23　IF文」を参照してください。

IF文の処理の流れを次に示します。

図5‒5　IF文の処理の流れ

IF文の例を次に示します。

（例1）

THEN節とELSE節の両方に手続きがある場合

実行例

処理の流れ

（例2）

THEN節だけに手続きがある場合（ELSE NEXT SENTENCEを省略したとき）

実行例

処理の流れ

C1に対する文1はa1で，文2は省略されています。

C2に対する文1はa2で，文2はa3です。

C3に対する文1はS2で，文2はS3です。

C4に対する文1はS5で，文2は省略されています。

省略されているELSE NEXT SENTENCEを補うと，例2の実行例は次のようになります。

実行例

5.5　表操作

表操作にはSEARCH文があります。

5.5.1　SEARCH文

SEARCH文は，指定した条件を満足する表要素を探し，対応する指標の値がその表要素を指すようにします。

SEARCH文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.41　SEARCH文」を参照してください。

WHEN指定がある場合の，SEARCH文の流れを次に示します。

図5‒6　SEARCH文の処理の流れ（WHEN指定が二つある場合）

流れ図

注※1

SEARCH文中に書かれたときだけ実行されます。

注※2

GO TO文のある無条件文の終了を必要としません。SEARCH文の終わりに制御が移ります。

SEARCH文の例を次に示します。

（例）

多次元の表引き操作とSEARCH文

SEARCH文で参照する表が2次元以上の場合，各OCCURS句にINDEXED BYで，指標名を付けておく必要があります。

SEARCH文が変更するのは，一意名1用の指標名の値，および（VARYING指定があれば）指標名1または一意名2だけです。

2次元以上の表全体を表引きするには，各次元にSEARCH文を何度か実行しなければなりません。

       01 TBL.
         05 A OCCURS 10
              ASCENDING K1 INDEXED BY IX.
           10 K1 PIC X(2).
           10 B OCCURS 5
                DESCENDING K2 INDEXED BY JX.
             20 K2 PIC 9(4).
             20 C  PIC X(20).

K1の値が 'AB 'で，K2の値が1950のときの表要素Cを求めるには，次のようにします。

           SEARCH ALL A AT END GO TO OWARI
                  WHEN K1(IX) = 'AB'
                       NEXT SENTENCE.

           SEARCH ALL B AT END GO TO OWARI
                  WHEN K2(IX，JX) = 1950
                       MOVE C(IX，JX) TO X
                       GO TO OWARI.

5.6　手続き分岐

手続き分岐文には，GO TO文，PERFORM文，およびCONTINUE文があります。

5.6.1　GO TO文

GO TO文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.21　GO TO文」を参照してください。

GO TO文の例を次に示します。

（例1）

           MOVE A TO B
           GO TO P           *>1.
           ADD C TO D        *>2.
               ：
       P.
               ：

1.のGO TO文を実行すると，制御はPに移ります。

2.のADD文は実行されません。

（例2）

       01 DATA-1 PIC 9(9).
                 ：
            GO TO P1 P2 P3
               DEPENDING DATA-1.
                 ：
        P1.
                 ：
        P2.
                 ：

DATA-1の値が2のとき，GO TO文を実行すると，2番目に指定した手続き名（P2）に制御が移ります。

5.6.2　PERFORM文

PERFORM（実行）文は，幾つかの手続きに明示的に制御を移し，指定した手続きの実行が終わると，暗黙的に制御を戻します。また，PERFORM文は，そのPERFORM文の範囲に含まれる一つ以上の文の実行を制御するためにも使用されます。

PERFORM文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.31　PERFORM文」を参照してください。

(1)　基本的なPERFORM文の実行例

(a)　ある条件を満たすまで処理を繰り返す場合（PERFORM UNTIL条件）

処理の流れ

実行例

       PERFORM UNTIL フラグ = '1'     *>1.
         READ 入力ファイル
           AT END MOVE '1' TO フラグ  *>2.
         END-READ
         IF  フラグ = '0'
           COMPUTE A = A + 1          *>3.
         END-IF
       END-PERFORM.

ファイル終了フラグが'1'になるまで（ファイル入力が終了するまで），1.〜3.の処理を繰り返します。

入力ファイルからレコードを入力します。ファイル終了条件が成立すると，ファイル終了フラグに'1'をセットします。

ファイル終了条件が成立しない場合は，Aに1を加算します。

(b)　指定した回数だけ処理を繰り返す場合（PERFORM 回数 TIMES）

処理の流れ

実行例

       PERFORM 10 TIMES      *>1.
         COMPUTE I = I + 10  *>2.
         DISPLAY I           *>3.
       END-PERFORM.

2.と3.を10回繰り返します。

Iに10を加算した結果をIに入れます。

Iを出力します。

Iが初期設定で0になっている場合，出力結果は，10から始まって10飛びの数です。

(c)　手続きを呼び出す場合（そとPERFORM）

処理の流れ

実行例

       主処理.
           OPEN INPUT 入力ファイル
                OUTPUT 出力ファイル.
           PERFORM 入力処理.                   *>1.
           PERFORM UNTIL 終了フラグ = '1'      *>2.
             PERFORM 出力処理                  *>3.
             PERFORM 入力処理                  *>4.
           END-PERFORM.
           CLOSE 入力ファイル
                 出力ファイル.
           STOP RUN.
       入力処理.
           READ 入力ファイル
                AT END MOVE '1' TO 終了フラグ  *>5.
           END-READ.
       出力処理.
           MOVE 入力レコード TO 出力レコード.  *>6.
           WRITE 出力レコード.

入力処理を呼び出します。

うちPERFORMで3.，4.をファイル終了条件が成立するまで繰り返します。

出力処理を呼び出します。

入力処理を呼び出します。

入力処理を実行します。

出力処理を実行します。

(d)　条件を満たす前にPERFORM文を終了する場合

実行例

           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
               ：
             PERFORM VARYING J FROM 1 BY 1 UNTIL J > 10
               ：
               IF A(J) = 0
                 EXIT PERFORM  …1.
               END-IF
             END-PERFORM  …2.
               ：
           END-PERFORM.

1.のEXIT PERFORM文を実行すると，2.のEND-PERFORMの次の文に制御が移ります。

(2)　VARYING指定のあるPERFORM文の実行例

(a)　PERFORM文にTEST BEFORE指定があり，VARYING指定中の条件が一つの場合（一つの一意名を変化させる場合）

処理の流れ

形式

           PERFORM WITH TEST BEFORE VARYING
                   一意名2 FROM ｛一意名3｜定数1｝
                           BY   ｛一意名4｜定数2｝
                           UNTIL  条件1
             無条件文1
                 ：
           END-PERFORM.

一意名2のデータ項目の内容を定数1，またはPERFORM文の開始時の一意名3のデータ項目の現在値に等しくします。

条件1を検査します。

条件1を満たしていれば，制御はPERFORM文の終わりに移ります。

条件1を満たしていなければ，3.に進みます。

指定された文の組（無条件文1）を1回実行します。

一意名2のデータ項目の値に，定数2または一意名4のデータ項目の増加分または減少分を加え，2.に戻ります。

PERFORM文の実行を開始するとき，すでに条件1が満たされていれば，制御はPERFORM文の終わりに移ります。

PERFORM文にTEST BEFORE指定もTEST AFTER指定も書かない場合は，TEST BEFORE指定を書いたものとみなされます。

(b)　PERFORM文にTEST BEFORE指定があり，VARYING指定中の条件が二つの場合（二つの一意名のデータ項目を変化させる場合）

処理の流れ

形式

           PERFORM WITH TEST BEFORE VARYING
                   一意名2 FROM ｛一意名3｜定数1｝
                           BY   ｛一意名4｜定数2｝
                           UNTIL 条件1
             AFTER 一意名5 FROM ｛一意名6｜定数3｝
                           BY   ｛一意名7｜定数4｝
                           UNTIL  条件2
             無条件文1
                ：
           END-PERFORM

一意名2のデータ項目の内容を，定数1または一意名3のデータ項目の現在値に等しくします。

一意名5のデータ項目の内容を，定数3または一意名6のデータ項目の現在値に等しくします。

条件1を検査します。

条件1を満たしていれば，制御はPERFORM文の終わりに移ります。

条件1を満たしていなければ，4.に進みます。

条件2を検査します。

条件2を満たしていれば，一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加え，2.に戻ります。

条件2を満たしていなければ，5.に進みます。

指定された文の組（無条件文1）を1回実行します。

一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加えて，4.に戻ります。

PERFORM文の実行が終わったとき，一意名5のデータ項目には，定数3または一意名6のデータ項目の現在値が入っています。一意名2のデータ項目には，増加分や減少分によって最後に変更された値が入っています。

PERFORM文の実行を始めたときに条件1が満足されていると，一意名2のデータ項目には，定数1または一意名3のデータ項目の現在値が入っています。

PERFORM文にTEST BEFORE指定もTEST AFTER指定も書かない場合は，TEST BEFORE指定を書いたものとみなされます。

(c)　PERFORM文にTEST AFTER指定があり，VARYING指定中の条件が一つの場合（一つの一意名を変化させる場合）

処理の流れ

形式

       PERFORM WITH TEST AFTER
               VARYING 一意名2
               FROM ｛一意名3｜定数1｝
               BY ｛一意名4｜定数2｝UNTIL 条件1
         無条件文1
             ：
       END-PERFORM.

一意名2のデータ項目の内容を，定数1またはPERFORM文開始時の一意名3のデータ項目の現在値に等しくします。

指定された文の組（無条件文1）を1回実行します。

条件1を検査します。

条件1を満たしていれば，制御はPERFORM文の終わりに移ります。

条件1を満たしていなければ，4.に進みます。

一意名2のデータ項目の値に定数2または一意名4のデータ項目の値の増加分または減少分を加え，2.に戻ります。

(d)　PERFORM文にTEST AFTER指定があり，VARYING指定中の条件が二つの場合（二つの一意名のデータ項目を変化させる場合）

処理の流れ

形式

       PERFORM WITH TEST AFTER
               VARYING 一意名2 FROM 一意名3
               BY 一意名4 UNTIL 条件1
               AFTER 一意名5 FROM 一意名6
               BY 一意名7 UNTIL 条件2
         無条件文1
             ：
       END-PERFORM.

一意名2のデータ項目の内容を，定数1または一意名3のデータ項目の現在値に等しくします。

一意名5のデータ項目の内容を，定数3または一意名6のデータ項目の現在値に等しくします。

指定された文の組（無条件文1）を1回実行します。

条件2を検査します。

条件2を満たしていれば，5.に進みます。

条件2を満たしていなければ，一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加え，3.に戻ります。

条件1を検査します。

条件1を満たしていれば，制御はPERFORM文の終わりに移ります。

条件1を満たしていなければ，6.に進みます。

一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加えて2.に戻ります。

PERFORM文の実行が完全に終わったあと，AFTER指定またはVARYING指定によって変更される各データ項目には，指定された文の組が最後に実行されたときと同じ値が入っています。

PERFORM文の指定された文の組の実行中に，次の項目を変更した場合，その変更が評価されてPERFORM文の実行に影響を与えます。

VARYING指定の一意名2のデータ項目

BY指定の一意名4のデータ項目

AFTER指定の一意名5のデータ項目

FROM指定の一意名3のデータ項目

二つの一意名のデータ項目を変化させるとき，一意名5の繰り返し（FROM，BY，UNTIL）が完全に1回終わるたびに，一意名2のデータ項目の内容が変更されます。三つ以上の一意名のデータ項目を変化させるときの機構も，一意名が二つのときと同じで，AFTER指定のデータ項目の繰り返しが完全に終わるたびに，先行するAFTER指定のデータ項目が変更されます。

(3)　PERFORM文の実行範囲

PERFORM文の実行範囲にほかのPERFORM文がある場合，含まれているPERFORM文の実行範囲は，初めのPERFORM文の論理的な実行範囲の内側に完全に含まれているか，または完全に外側である必要があります。PERFORM文の実行範囲内で始められたほかのPERFORM文の制御は，前者のPERFORM文の出口を通ることはできません。また，実行中の2個以上のPERFORM文は，共通の出口を持つこともできません。

PERFORM文の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.31　PERFORM文」を参照してください。

PERFORM文の実行範囲の例を次に示します。

（例1）

正しい例（完全に内側に含まれている）

（例2）

正しい例（完全に外側にある）

（例3）

正しい例（同時に実行されていない）

（例4）

誤った例（後者のPERFORM文の制御が，前者のPERFORM文の出口を通っている）

（例5）

正しい例（同時に実行されていない）

5.6.3　CONTINUE文

CONTINUE文は，条件文や無条件文などに使用し，実行文が存在しないことを示します。CONTINUE文は，実行に影響を与えません。

CONTINUE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.9　CONTINUE文」を参照してください。

CONTINUE文の例を次に示します。

（例）

           IF 条件1 THEN
             無条件文1
           ELSE
             CONTINUE  *>ELSE側の処理は何もないことを示す
           END-IF.

5.7　データ転記文

データ転記文には，INITIALIZE文，MOVE文，およびSET文があります。

5.7.1　INITIALIZE文

INITIALIZE文は，特定の型のデータ領域に，あらかじめ決められた値を設定します。例えば，数字データにはゼロを，英数字データには空白を設定できます。

INITIALIZE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.24　INITIALIZE文」を参照してください。

INITIALIZE文の例を次に示します。

（例1）

       01 DATAX .
         05 A      PIC A(5).
         05 B      PIC X(5).
         05 C      PIC 9999.
         05 D      PIC S9(5).
         05 E      REDEFINES D PIC X(5).
         05 F      PIC S9(3)V9(2).
         05 G      PIC 9(4)PP.
         05 H      PIC X(4)0(3)9.
         05 I      PIC A(5)BA(5).
         05 J      PIC **,**9.
         05 K      PIC 99/99.
         05 L      PIC 9(4).9(2).
         05 M      PIC +¥9(5).
         05 N      PIC ¥9(5)-.
         05 O      PIC ¥**,***CR.
         05 P      PIC ¥**,***DB.
         05 Q      PIC ZZZ.99.
         05 R      PIC ***.99.
         05 S      PIC ¥¥¥,¥¥9+.
         05 T      PIC S9(3) USAGE PACKED-DECIMAL.
         05 U      PIC S9(3) USAGE COMP OCCURS 10 TIMES.
         05 V      PIC 1(3).
         05 W      PIC 1(3) USAGE BIT.
         05 X      PIC XAX.
         05 Y      PIC N(3).
         05 Z      PIC N(2)BN(1).
         05 FILLER PIC X.

項目

INITIALIZE DATAX

INITIALIZE DATAX REPLACING ALPHABETIC DATA BY 'A'

INITIALIZE DATAX REPLACING ALPHANUMERIC

DATA BY 'A1'

INITIALIZE DATAX REPLACING NUMERIC DATA BY 1

INITIALIZE DATAX REPLACING ALPHANUMERIC-EDITED

DATA BY 'A'

A

△△△△△

A△△△△

設定しない

設定しない

設定しない

B

△△△△△

設定しない

A1△△△

〃

〃

C

符号なし外部10進の「0000」

〃

設定しない

符号なし外部10進の「0001」

〃

D

符号付き外部10進の「00000」

〃

〃

符号付き外部10進の「00001」

〃

E

設定しない

〃

〃

設定しない

〃

F

符号なし外部10進の「00000」

〃

〃

符号なし外部10進の「00100」

〃

G

符号なし外部10進の「0000」

〃

〃

符号なし外部10進の「0000」

〃

H

△△△△000

〃

〃

〃

A△△△000△

I

△△△△△△△△△△△

〃

〃

〃

A△△△△△△△△△△

J

*****0

〃

〃

〃

設定しない

K

00/00

〃

〃

〃

〃

L

0000.00

〃

〃

〃

〃

M

+¥00000

〃

〃

〃

〃

N

¥00000△

〃

〃

〃

〃

O

*********

〃

〃

〃

〃

P

*********

〃

〃

〃

〃

Q

△△△.00

〃

〃

〃

〃

R

***.00

〃

〃

〃

〃

S

△△△△△¥0+

〃

〃

〃

〃

T

符号付き内部10進の「000」

〃

〃

符号付き内部10進の「001」

〃

U

各要素に2進形式の値000

〃

〃

各要素に2進形式の値001

〃

V

000

〃

〃

設定しない

〃

W

内部ブール形式の0

〃

〃

〃

〃

X

△△△

〃

A1△

〃

〃

Y

▲▲▲

〃

設定しない

〃

〃

Z

▲▲▲▲

〃

〃

〃

〃

FILLER※

設定しない

〃

〃

〃

〃

項目

INITIALIZE DATAX REPLACING NUMERIC

-EDITED DATA BY 4

INITIALIZE DATAX REPLACING NATIONAL

DATA BY N'花'

INITIALIZE DATAX REPLACING NATIONAL-EDITED DATA BY N'花'

A

設定しない

設定しない

設定しない

B

〃

〃

〃

C

〃

〃

〃

D

〃

〃

〃

E

〃

〃

〃

F

〃

〃

〃

G

〃

〃

〃

H

〃

〃

〃

I

〃

〃

〃

J

*****4

〃

〃

K

00/04

〃

〃

L

0004.00

〃

〃

M

+¥00004

〃

〃

N

¥00004△

〃

〃

O

¥*****4△△

〃

〃

P

¥*****4△△

〃

〃

Q

△△4.00

〃

〃

R

**4.00

〃

〃

S

△△△△△¥4+

〃

〃

T

設定しない

〃

〃

U

〃

〃

〃

V

〃

〃

〃

W

〃

〃

〃

X

〃

〃

〃

Y

〃

花▲▲

〃

Z

〃

設定しない

花▲▲▲

FILLER※

〃

〃

設定しない

（凡例）

△：半角の空白を示す

▲：全角の空白を示す

注※

FILLER句については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.22　記述項名句」を参照してください。

（例2）

オブジェクト参照を使用したINITIALIZE文の例

       01 DATAY USAGE OBJECT REFERENCE.
       01 DATAZ USAGE OBJECT REFERENCE.
                ：
           INITIALIZE DATAY REPLACING OBJECT-REFERENCE
                            DATA BY DATAZ.
                ：

この場合，次の文を実行した結果と同じになります。

           SET DATAY TO DATAZ.

5.7.2　MOVE文

MOVE文は，編集規則に従って，データを一つ以上のデータ領域に移します。

MOVE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.28　MOVE文」を参照してください。

MOVE文の例を次に示します。

（例1）

一つまたは複数のデータを転記する場合

                   ：
       01 A PIC X(3).
       01 B PIC X(3).
       01 C PIC X(3).
       01 D PIC X(3).
       01 E PIC X(3).
                   ：
           MOVE A TO B.      *>1.
           MOVE A TO C D E.  *>2.
                   ：

データを項目Aから項目Bに転記します。

データを項目Aから項目C，D，Eに転記します。

（例2）

MOVE文の送り出し側作用対象に添字が付いている場合

添字はデータを先頭の受け取り側作用対象に移す直前に1回だけ評価されます。

下記の例では，(A)は(B)と同じです。

(A)

MOVE a(b) TO b c(b).

(B)

MOVE a(b) TO temp.
MOVE temp TO b.
MOVE temp TO c(b).

tempは，このシステムが用意した中間結果の項目を示します。

5.7.3　SET文

SET文は，次の手段を提供します。

表要素に関連する指標を設定して，表操作の参照点を確立する

外部スイッチの状態を変更する

条件変数の値を変更する

オブジェクト参照を設定する

画面項目に関連する属性を変更する

最新例外状態をクリアする

OLEプロパティを取得・設定する

OLEオブジェクトを参照したり，バリアントデータを設定したりする

SET文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.43　SET文」，マニュアル「COBOL2002　言語　拡張仕様編」　「13.5.8　SET文（WINDOW SECTION）」，およびマニュアル「COBOL2002　言語　拡張仕様編」　「18.3.2　SET文（OLE2オートメーションインタフェース機能）」を参照してください。

(1)　表要素に関連する指標を設定するSET文

表要素に関連する指標を設定して，表操作の参照点を確立するSET文の例を次に示します。

（例1）

指標名から指標名に転記する場合

       05 A PIC X(5) OCCURS 10 INDEXED BY K.
       05 B PIC 9(8) OCCURS 10 INDEXED BY J.

指標名Kには，表の6番目の要素を参照するときの値，5×6=30が入っています。ここで次のSET文を実行すると，Kの値30を出現番号6に換算して(30/5=6)，Bの出現番号6に対応する値8×6=48をJに設定します。

       SET J TO K.

（例2）

指標データ項目から指標名に転記する場合

       05 A PIC PP999 OCCURS 15 INDEXED BY K.
       05 B USAGE INDEX.

Bの値が30のとき，次のSET文を実行すると，Bの値を出現番号に対応して換算しないで，そのままKに設定します。

       SET K TO B.

（例3）

整数項目または整数から指標名に転記する場合

       05 A PIC X(5) OCCURS 30 INDEXED BY K.
       05 B PIC 9(2) VALUE 11.

ここで次のSET文のどちらかを実行すると，Bの値11または整数11を出現番号とみなし，それに対応する値5×11=55をKに設定します。

       SET K TO B

または

       SET K TO 11

（例4）

       05 A PIC X(5) OCCURS 12 INDEXED BY K.
       05 B USAGE INDEX.
       05 C USAGE INDEX.

Kには，Aの出現番号7に対応する値5×7=35が入っています。ここで次のSET文を実行すると，Kの値を変換しないで，35をそのままBに設定します。

       SET B TO K

そのあとで次のSET文を実行すると，Bの値を変換しないで，35をそのままCに設定します。

       SET C TO B

（例5）

       05 A PIC 9(3) OCCURS 20 INDEXED BY K.
       05 B PIC 9(8).

Kには，Aの出現番号12に対応する値3×12=36が入っています。ここで次のSET文を実行すると，Kの値を出現番号12に変換(36/3)してBに12を設定します。

       SET B TO K

（例6）

       05 A PIC X(7) OCCURS 30 INDEXED BY K.
       05 B PIC A(3) OCCURS 30 INDEXED BY J.
       05 C PIC 9(2) VALUE 3.

Kには出現番号6に対応する値7×6=42が入っています。Jには出現番号25に対応する値3×25=75が入っています。

ここで，次のSET文を実行すると，Kには出現番号6+3=9に対応する値7×9=63が入ります。

       SET K UP BY C

そのあとで次のSET文を実行すると，Kには出現番号9-1=8に対応する値7×8=56が入ります。

       SET K DOWN BY 1

また，次のSET文を実行すると，Jには出現番号25-3=22に対応する値3×22=66が入ります。

       SET J DOWN BY C

そのあとで次のSET文を実行すると，Jには出現番号22+8=30に対応する値3×30=90が入ります。

       SET J UP BY 8

(2)　外部スイッチの状態を変更するSET文

外部スイッチの状態を変更するSET文の例を次に示します。

（例）

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       UPSI-0 IS SW0
              ON  STATUS IS ONIND0
              OFF STATUS IS OFFIND0.
            ：
       PROCEDURE DIVISION.
            ：
           IF OFFIND0 THEN
             SET SW0 TO ON
           END-IF.

外部スイッチの状態を変更するSET文の詳細は，「16.2.4　外部スイッチ」を参照してください。

(3)　条件変数の値を変更するSET文

条件変数の値を変更するSET文の例を次に示します。

（例）

       03 OF-WEEK PIC X(3).
       88 HOLIDAY VALUE 'SUN'.  *>1.
       88 WEEKDAY VALUE 'MON' 'TUE' 'WED'
                        'THU' 'FRI' 'SAT'.  *>1.

OF-WEEKに対する条件名

ここで次のSET文を実行すると，OF-WEEKには'SUN'が設定されます。

       SET HOLIDAY TO TRUE

また，次のSET文を実行すると，OF-WEEKにはWEEKDAYに指定された最初の定数である'MON'が設定されます。

       SET WEEKDAY TO TRUE

複数の条件名を書いたときは，そのSET文中に指定したのと同じ順序で，各条件名に対して別々のSET文を書いたのと同じ結果となります。条件名に添字が付いている場合は，繰り返すたびに一つずつ順番に評価します。

(4)　オブジェクト参照を設定するSET文

「20.2.7　オブジェクト指向による適合」を参照してください。

(5)　最新例外状態をクリアするSET文

「21.7.3　最新例外状態のクリア」を参照してください。

(6)　OLEプロパティを取得・設定するSET文

「25.2.2　OLEメソッドとOLEプロパティの操作」を参照してください。

(7)　OLEオブジェクトを参照したり，バリアントデータを設定したりするSET文

「25.2.3　OLEメソッドが返すOLEオブジェクトを利用した参照」および「25.2.5　VARIANT値とCOBOLデータのやり取り」を参照してください。

第4編　入出力機能

6　ファイル入出力機能

COBOL2002の入出力処理では，順編成ファイル，相対編成ファイル，索引編成ファイル，テキスト編成ファイル，CSV編成ファイル，およびHiRDBによる索引編成ファイルが使用できます。この章では，これらのファイルに入出力するためのアクセス方法について説明します。

6.1　ファイル入出力機能の種類と概要

6.1.1　使用できるファイル編成

このシステムで使用できるファイル編成を次に示します。

表6‒1　COBOL2002で使用できるファイル編成

ORGANIZATION句の指定

ファイル編成

ファイル形式

ファイル管理

システム

使用できるファイル

SEQUENTIAL

順編成ファイル（固定長）

バイナリデータの集合

−

COBOL85またはCOBOL2002で作成した順編成固定長ファイル

ほかのアプリケーションで作成したレコード長の整数倍の長さを持つバイナリファイル

順編成ファイル（可変長）

COBOL2002が独自に定める形式のファイル

COBOL2002独自のファイル管理システム

COBOL85またはCOBOL2002で作成した順編成可変長ファイル※1

RELATIVE

相対編成ファイル

COBOL2002が独自に定める形式のファイル

COBOL2002独自のファイル管理システム

COBOL85またはCOBOL2002で作成した相対編成ファイル

INDEXED

ISAMによる索引編成ファイル

ファイル管理システムに依存する

索引順編成ファイル管理

COBOL85またはCOBOL2002で作成した索引編成ファイル※2

ISAMユティリティで作成した索引編成ファイル

Btrieveによる索引編成ファイル※3

BtrieveまたはPervasive.SQL

COBOL85またはCOBOL2002で作成したBtrieveファイル

Btrieveファイルマネージャ，またはPervasive.SQLのユティリティで作成したファイル

LINE SEQUENTIAL

テキスト編成ファイル

テキスト形式

−

COBOL85またはCOBOL2002で作成したテキスト編成ファイル

エディタなどで作成したテキストファイル

CSV

CSV編成ファイル

表計算プログラム用CSV形式

−

COBOL85またはCOBOL2002で作成したCSV編成ファイル

Excelなどの表計算プログラムで作成したCSVファイル

RDB

HiRDBによる索引編成ファイル

ファイル管理システムに依存する

HiRDB

HiRDBユティリティで作成したファイル

（凡例）

−：該当しない

注※1

ただし，行制御ありで作成したファイルは使用できません。

注※2

既存の索引編成ファイルに対してOPEN OUTPUTを実行した場合，標準は追加書きとなります。詳細は，「6.6.1　ファイルの作成と割り当て方法」の「(5)　索引編成ファイルに対するOPENモード」を参照してください。

注※3

Windows(x86) COBOL2002で有効です。

6.1.2　使用できるファイル形式

このシステムのファイル入出力処理で扱えるファイル形式は，それぞれのファイル編成で使用するファイル管理システムに依存します。ファイル編成とファイル管理システムの対応については，「表6‒1　COBOL2002で使用できるファイル編成」を参照してください。

SELECT句のASSIGN句で，装置名にMTやLPを指定しても意味を持ちません。

物理ファイル名に次の名称は使用できません。

TAPE

TAPE:

COBOL2002が使用するファイル名やプログラム名に，COM1やLPT1などのシステムが予約しているデバイス名は使用できません。

ファイルサイズが2GB以上のファイル（ラージファイル）への入出力の詳細は，「6.11　ラージファイル入出力機能」を参照してください。

ラージファイル入出力機能を使用できるファイル編成は，次のとおりです。

順編成ファイル

テキスト編成ファイル

CSV編成ファイル

ISAMによる索引順編成ファイル

6.2　ファイル割り当ての共通規則

COBOLプログラムからファイルにアクセスするには，環境部のファイル管理記述項で，SELECT句で指定したCOBOLのファイル名に対して，ASSIGN句を使って物理ファイル名（OSのファイルシステム上での実体ファイル名）を割り当てる必要があります。SELECT句，ASSIGN句の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「8.3.4　ファイル管理記述項」を参照してください。

SELECT句で指定したファイル名に対して，物理ファイル名を割り当てる方法には，次の3種類があります。

定数指定

SELECT句のファイル名に対して，ASSIGN句で「C:¥DIR¥FILE1.FIL」のように物理ファイル名を直接指定する方法です。

環境変数指定

SELECT句のファイル名に対してASSIGN句で「SYS001」のような外部装置名を指定しておき，実行時に環境変数を使って外部装置名に対応する物理ファイル名を割り当てる方法です。

データ名指定

SELECT句のファイル名に対してASSIGN句でCOBOLのデータ名を指定しておき，データ名に物理ファイル名を転記して，指定する方法です。

また，「環境変数指定」では，環境変数を指定しないでCOBOLプログラムを実行した場合，実行中に物理ファイルを割り当てられます。これを「物理ファイルの動的割り当て」と呼びます。

ここでは，物理ファイル割り当て時の共通規則，それぞれの割り当て方法，およびプログラムとファイルとの関係について順に説明します。

6.2.1　定数指定

定数指定は，SELECT句で指定したファイル名に対し，ASSIGN句で物理ファイルを直接割り当てる方法です。

形式

SELECT 〔OPTIONAL〕 ファイル名 ASSIGN TO '物理ファイル名'

構文規則

物理ファイル名は，引用符（'）で囲んで指定します。

物理ファイル名は，ドライブ名からの絶対パス名を指定します。このファイル名は，ファイルシステムの規則に従って指定する必要があります。

フォルダ名，ファイル名にNULL文字（X'00'）を含んではなりません。NULL文字を含んだフォルダ名やファイル名を指定した場合，NULL文字の直前までの文字列が有効となり，以降の文字列は無視されます。

一般規則

次の場合，定数で指定した物理ファイルがなければ，指定した名称の物理ファイルが作成されます。

（物理ファイルが作成される場合）

ファイルをOUTPUTモードで開いたとき

SELECT句のOPTIONAL指定のあるファイルをI-OまたはEXTENDモードで開いたとき

このとき，SELECT句にOPTIONAL指定がある場合は，入出力状態に05が設定されます。

ファイルが作成される場所は，定数に指定した物理ファイル名の絶対パスに従います。ただし，指定した物理ファイル名中のフォルダ名に相当するフォルダがないと，物理ファイルは作成されません。

定数によって指定されるファイル名が有効となるかどうかは，ファイルシステムに依存します。

ドライブ名を省略した場合，およびファイル名が絶対パス名でない場合は，OSの環境設定に従います。

CUIモードのときにファイルを標準入力（stdin）から読み込んだり，標準出力（stdout）または標準エラー出力（stderr）へ書き出したりしたい場合は，定数にstdin，stdout，またはstderrを指定します。ただし，索引編成ファイル，相対編成ファイル，順編成の行制御のない可変長ファイルには，stdin，stdout，およびstderrを指定できません。また，順編成の可変長ファイルには，stdinを指定できません。指定した場合，実行時にエラーとなります。

CUIモードのときに標準入出力ファイルを扱う場合，COBOLはすでに開かれているものとして処理します。

GUIモードの場合で，定数にstdin，stdout，またはstderrを指定したとき，これらは物理ファイル名とみなされます。

標準入力（stdin），標準出力（stdout），および標準エラー出力（stderr）を指定する場合は，英小文字で指定してください。「STDIN」のように英大文字で指定した場合，物理ファイル名として扱われます。

入出力状態の値とファイル自動生成規則（定数指定の場合）

定数指定でファイルを割り当てた場合，ファイル入出力時の入出力状態の値，および物理ファイルが自動作成されるかどうかは，次の規則に従います。

OPENモード

OPTIONAL指定の有無

物理ファイルの状態

すでに存在する

存在しない

INPUT

なし

FS=00

FS=35

あり

FS=00

FS=05

自動作成されない

I-O

なし

FS=00

FS=35

あり

FS=00

FS=05

自動作成される※1

OUTPUT

なし

FS=00

再作成する※2

FS=00

自動作成される※1

EXTEND

なし

FS=00

FS=35

あり

FS=00

FS=05

自動作成される※1

（凡例）

FS=nn：FILE STATUS句を指定したときに，入出力状態にnnが設定されることを示す

注※1

自動作成される物理ファイル名は，SELECT句で指定した定数の名称となります。

注※2

再作成とは，ファイル中にデータレコードがない状態にすることです。

COBOLプログラムの記述例

プログラム内で使用するファイル名"FILE-1"を，Cドライブの"DIR"フォルダに格納されている"FILE1.FIL"ファイルに割り当てる例を，次に示します。

       SELECT FILE-1 ASSIGN TO 'C:¥DIR¥FILE1.FIL'

6.2.2　環境変数指定

環境変数指定は，指定したファイル名に対し，ASSIGN句で外部装置名（処理系作成者語）を割り当てる方法です。外部装置名に対応する物理ファイル名は，外部装置名に対応する環境変数を使用して指定します。

COBOLプログラムでの外部装置名の記述と，環境変数の指定形式を次に示します。

形式（COBOLプログラム）

SELECT 〔OPTIONAL〕 ファイル名 ASSIGN TO 外部装置名

形式（環境変数）

CBL_外部装置名=物理ファイル

構文規則

ASSIGN句で指定した外部装置名に対応する環境変数は，外部装置名の先頭にCBL_を付けたものとなります。この環境変数に，外部装置名と対応づけたい物理ファイル名を指定します。

外部装置名に「-」が含まれる場合，環境変数名では「_」に置き換えます。

物理ファイル名は，ドライブ名からの絶対パス名を指定します。このファイル名は，ファイルシステムの規則に従って指定する必要があります。

フォルダ名，ファイル名にNULL文字（X'00'）を含んではなりません。NULL文字を含んだフォルダ名やファイル名を指定した場合，NULL文字の直前までの文字列が有効となり，以降の文字列は無視されます。

一般規則

次の場合，環境変数で指定した物理ファイルがなければ，指定した名称の物理ファイルが作成されます。

（物理ファイルが作成される場合）

ファイルをOUTPUTモードで開いたとき

SELECT句のOPTIONAL指定のあるファイルをI-OまたはEXTENDモードで開いたとき

このとき，SELECT句にOPTIONAL指定がある場合は，入出力状態に05が設定されます。

ファイルが作成される場所は，環境変数に指定した物理ファイル名の絶対パスに従います。ただし，指定した物理ファイル名中のフォルダ名に相当するフォルダがないと，物理ファイルは作成されません。

外部装置名にSYSIN，SYSOUT，SYSPUNCHを割り当てた場合，次に示す文があると同一ファイルへの割り当てになります。このとき，結果は保証しませんので注意してください。

・SYSIN指定のACCEPT文

・SYSOUT／SYSPUNCH指定のDISPLAY文

環境変数によって指定されるファイル名が有効となるかどうかは，ファイルシステムに依存します。

ドライブ名を省略した場合，およびファイル名が絶対パス名でない場合は，OSの環境設定に従います。

CUIモードのときにファイルを標準入力（stdin）から読み込んだり，標準出力（stdout）または標準エラー出力（stderr）へ書き出したりしたい場合は，環境変数にstdin，stdout，またはstderrを指定します。ただし，索引編成ファイル，相対編成ファイル，順編成の行制御のない可変長ファイルには，stdin，stdout，およびstderrを指定できません。また，順編成の可変長ファイルには，stdinを指定できません。指定した場合，実行時にエラーとなります。

CUIモードのときに標準入出力ファイルを扱う場合，COBOLはすでに開かれているものとして処理します。

GUIモードの場合で，環境変数にstdin，stdout，またはstderrを指定したとき，これらは物理ファイル名とみなされます。

環境変数CBL_外部装置名は，OPEN文を実行するごとに環境変数の値が参照されます。

標準入力（stdin），標準出力（stdout），および標準エラー出力（stderr）を指定する場合は，英小文字で指定してください。「STDIN」のように英大文字で指定した場合，物理ファイル名として扱われます。

環境変数に物理ファイル名を割り当てていない場合は，次のようになります。

（CUIモードの場合）

作成するファイルの名称が不明のためエラーとなります。

（GUIモードの場合）

動的割り当て画面が表示されます。詳細は，「6.2.4　実行時の動的割り当て（GUIモードの場合だけ）」を参照してください。

入出力状態の値とファイル自動生成規則（環境変数指定の場合）

環境変数指定でファイルを割り当てた場合，ファイル入出力時の入出力状態の値，および物理ファイルが自動作成されるかどうかは，次の規則に従います。

OPENモード

OPTIONAL指定の有無

環境変数指定あり

環境変数指定なし

物理ファイルの状態

すでに存在する

存在しない

INPUT

なし

FS=00

FS=35

FS=90

あり

FS=00

FS=05

自動作成されない

FS=05

自動作成されない

I-O

なし

FS=00

FS=35

FS=90

あり

FS=00

FS=05

自動作成される※1

FS=90

OUTPUT

なし

FS=00

再作成される※2

FS=00

自動作成される※1

FS=90

EXTEND

なし

FS=00

FS=35

FS=90

あり

FS=00

FS=05

自動作成される※1

FS=90

（凡例）

FS=nn：FILE STATUS句を指定したときに，入出力状態にnnが設定されることを示す

注

環境変数の値にファイル名を指定していない場合は，環境変数名なしとみなされます。

注※1

自動作成される物理ファイル名は，環境変数で指定した名称となります。

注※2

再作成とは，ファイル中にデータレコードがない状態にすることです。

COBOLプログラムの記述例

プログラム内で使用するファイル名"FILE-1"を外部装置名SYS-01に割り当てる例を，次に示します。

       SELECT FILE-1 ASSIGN TO SYS-01

外部装置名SYS-01に対応する環境変数「CBL_SYS_01」に，物理ファイル名"C:¥DIR¥FILE1.FIL"を指定する例を，次に示します。

CBL_SYS_01=C:¥DIR¥FILE1.FIL

6.2.3　データ名指定

データ名指定は，SELECT句で指定したファイル名にASSIGN句でデータ名を割り当て，このデータ名に物理ファイル名を転記して，物理ファイルを割り当てる方法です。

データ名指定で物理ファイルを割り当てる場合のCOBOLプログラムの記述形式を次に示します。

形式（COBOLプログラム）

SELECT 〔OPTIONAL〕 ファイル名 ASSIGN TO データ名

構文規則

データ名に指定する物理ファイル名は，ドライブ名からの絶対パス名を指定します。このファイル名は，ファイルシステムの規則に従って指定する必要があります。

フォルダ名，ファイル名にNULL文字（X'00'）を含んではなりません。NULL文字を含んだフォルダ名やファイル名を指定した場合，NULL文字の直前までの文字列が有効となり，以降の文字列は無視されます。

一般規則

次の場合，データ名で指定した物理ファイルがなければ，指定した名称の物理ファイルが作成されます。

（物理ファイルが作成される場合）

ファイルをOUTPUTモードで開いたとき

SELECT句のOPTIONAL指定のあるファイルをI-OまたはEXTENDモードで開いたとき

このとき，SELECT句にOPTIONAL指定がある場合は，入出力状態に05が設定されます。

ファイルが作成される場所は，データ名に指定した物理ファイル名の絶対パスに従います。ただし，指定した物理ファイル名中のフォルダ名に相当するフォルダがないと，物理ファイルは作成されません。

データ名の値によって指定されるファイル名が有効となるかどうかは，ファイルシステムに依存します。

ドライブ名を省略した場合，およびファイル名が絶対パス名でない場合は，OSの環境設定に従います。

物理ファイル名は，ファイルを開く前に設定する必要があります。また，ファイルを閉じる前に物理ファイル名を変更した場合，動作は保証しません。

CUIモードのときにファイルを標準入力（stdin）から読み込んだり，標準出力（stdout）または標準エラー出力（stderr）へ書き出したりしたい場合は，データ名にstdin，stdout，またはstderrを指定します。ただし，索引編成ファイル，相対編成ファイル，順編成の行制御のない可変長ファイルには，stdin，stdout，およびstderrを指定できません。また，順編成の可変長ファイルには，stdinを指定できません。指定した場合，実行時にエラーとなります。

標準入出力ファイルを扱う場合，COBOLはすでに開かれているものとして処理します。

GUIモードの場合で，データ名にstdin，stdout，またはstderrを指定したとき，これらは物理ファイル名とみなされます。

標準入力（stdin），標準出力（stdout），および標準エラー出力（stderr）を指定する場合は，英小文字で指定してください。「STDIN」のように英大文字で指定した場合，物理ファイル名として扱われます。

入出力状態の値とファイル自動生成規則

定数指定の場合と同じです。詳細は，「6.2.1　定数指定」の「入出力状態の値とファイル自動生成規則（定数指定の場合）」を参照してください。

COBOLプログラムの記述例

プログラム内で使用するファイル名"FILE-1"を，Cドライブの"DIR"フォルダに格納されている"FILE1.FIL"ファイルに，データ名指定で割り当てる例を，次に示します。

           :
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT FILE-1 ASSIGN TO FILE-NAME.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 FILE-NAME PIC X(60).
           :
       PROCEDURE DIVISION.
           MOVE 'C:¥DIR¥FILE1.FIL' TO FILE-NAME.
           :

6.2.4　実行時の動的割り当て（GUIモードの場合だけ）

ASSIGN句で処理系作成者語（外部装置名）を指定した場合，通常は環境変数で物理ファイルを割り当てますが，割り当てられていないファイルに対してOPEN文実行時に動的に物理ファイルを割り当てることもできます。

また，書式印刷機能を使用する場合，同様に環境変数で割り当てられていない印刷サービス名称をOPEN文実行時に割り当てることもできます。書式印刷機能の詳細は，「8.6　XMAP3による印刷（Windows(x86) COBOL2002で有効）」を参照してください。

(1)　物理ファイルの割り当て画面の説明

OPEN文実行時，環境変数が設定されていない場合に出力される物理ファイルの割り当て画面を次に示します。

物理ファイルに出力する場合

ダイアログボックスの上段のボタンを選び，物理ファイル名をドライブ名からの絶対パス名で入力して［OK］ボタンを選びます。

書式印刷機能を使用してプリンタへ出力する場合

ダイアログボックスの下段のボタンを選び，印刷サービス名を入力して［OK］ボタンを選びます。

上記のどちらの場合も，［キャンセル］ボタンを選ぶと，外部装置への割り当てがないものとしてOPEN文が実行されます。

(2)　規則

COBOLプログラムでのファイル定義やコンパイラオプションの指定の有無によって，物理ファイル名または印刷サービス名のボタンが次のように無効になることがあります。

表6‒2　COBOLプログラムとボタンの有効・無効との関係

COBOLプログラムの指定

選択ボタンの有効／無効

ファイル編成

-XMAP,LinePrintオプションの指定

APPLY FORMS-OVERLAY句の指定

CBL_xxx

(物理ファイル名)

CBLX_xxx

(印刷サービス名)

順編成

指定なし

−

○

×

指定あり

指定なし

○

○

指定あり

×

○

HiRDBによる索引編成ファイル

−

−

○

×

上記以外

−

−

○

×

（凡例）

○：有効

×：無効

−：指定とは無関係

また，物理ファイル名の選択ボタンが無効の場合，印刷サービス名の選択ボタンが選ばれている場合，またはファイル編成がHiRDBによる索引編成ファイルの場合，［参照］ボタンも無効となります。

6.3　入出力エラー処理

COBOL2002では，ファイルの入出力処理中にエラーが発生した場合，プログラムを終了させる方法とプログラムを続行してエラーの回復を処理する方法があります。

一般には，エラーメッセージを参照してエラーの原因を追及し，プログラムを修正して再実行します。これ以外の方法として，FILE STATUS句とUSE手続きを使用し，エラーの回復処理をプログラム中に設定しておくという方法があります。

FILE STATUS句については，マニュアル「COBOL2002　言語　標準仕様編」　「8.3.4(7)　FILE STATUS句」を，USE手続きについては，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.53　USE文」を，それぞれ参照してください。

ここでは，FILE STATUS句とUSE手続きを使用した入出力エラー処理について説明します。

なお，COBOL2002では，共通例外処理を使って入出力エラー処理もできます。詳細は，「21.　共通例外処理」を参照してください。

6.3.1　入出力エラー処理の概要

入出力エラー発生時，USE手続きと入出力手続き文の無条件文との関係を，次に示します。

表6‒3　入出力エラー発生時の制御の流れ

条件

AT END指定※1

INVALID KEY指定※1

入出力エラー

その他のエラー

あり

なし

あり

なし

USE手続き

あり

AT END指定の手続き

USE処理※2

INVALID KEY指定の手続き

USE処理※2

USE処理※2

USE処理※2

なし

AT END指定の手続き

※3

INVALID KEY指定の手続き

※3

※3

※3

注※1

NOT AT END，NOT INVALID KEY指定の場合は，入出力文が正常終了したときだけ，NOT AT END，NOT INVALID KEYで指定した手続きに制御が渡ります。

注※2

USE手続き処理後，エラーの発生した入出力文の次の文に制御が渡ります。FILE STATUS句があれば，入出力状態の値が設定されます。

注※3

FILE STATUS句があれば次の文に制御が渡ります。

FILE STATUS句がなければ，次のように動作します。

共通例外処理の致命的例外の場合

プログラムの実行が，中止されます。

共通例外処理の非致命的例外の場合

プログラムの実行が，継続されます。

詳細は，「21.9.2　従来形式の例外処理と共通例外処理の関係」の「(3)　FILE STATUS句の指定と共通例外処理での異常終了」を参照してください。

共通例外処理の致命的例外，非致命的例外については，マニュアル「COBOL2002　言語　標準仕様編」　「10.5.11　条件操作」を参照してください。

6.3.2　入出力状態の値

FILE STATUS句を指定しておくと，入出力文でエラーが発生した場合，FILE STATUS句で指定したデータ項目に入出力状態の値が設定されます。入出力状態の値と意味については，「付録H　入出力状態の値」およびマニュアル「COBOL2002　言語　標準仕様編」　「5.1.12　入出力状態」を参照してください。

6.3.3　USE手続き

(1)　USE ERROR手続きでの処理

COBOLプログラムでUSE ERRORの手続き処理を使用したコーディング例を，次に示します。

図6‒1　USE ERROR手続き処理のコーディング例

(2)　USE GLOBAL ERROR手続きでの処理

COBOLプログラムでUSE GLOBAL ERRORの手続き処理を使用したコーディング例を，次に示します。

図6‒2　USE GLOBAL ERROR手続き処理のコーディング例

6.3.4　ファイル入出力文でのエラー情報出力機能

FILE STATUS句を指定した場合に，入出力文でエラーが発生したとき，FILE STATUS句で指定したデータ項目に入出力状態の値が設定され，実行時メッセージは出力されません。通常は入出力状態の値と実行中プログラムの処理内容によってエラー要因を特定できますが，入出力状態値90はエラー要因の数が多いため，その特定が困難です。この場合，エラー要因特定のため，FILE STATUS句の指定を取り消してプログラムを再実行し，実行時メッセージを出力する必要があります。

ファイル入出力文でエラー情報を出力する設定をしておくと，入出力文で入出力状態値90のエラーが発生した場合に，FILE STATUS句の指定があっても実行時メッセージを出力できます。これによって，実行時メッセージでエラー要因を特定できます。

ファイル入出力文でエラー情報を出力する場合は，実行時環境変数CBLIOMESSAGEにSTATUS90を指定します。

形式

CBLIOMESSAGE=STATUS90

規則

この環境変数にSTATUS90を指定した場合に，FILE STATUS句を指定したファイルの入出力文で入出力状態の値が90となるエラーが発生したとき，入出力状態の値を設定したあと，実行時メッセージを出力して処理を続行します。

出力する実行時メッセージは，FILE STATUS句を指定しなかった場合に出力される実行時メッセージと同じメッセージです。ただし，メッセージレベルはI（お知らせ）となります※。

この環境変数の指定がない，またはSTATUS90以外の値を指定した場合は，この機能は無効になります。

この環境変数の指定によって実行時メッセージの出力以外，COBOLプログラムの動作が変わることはありません。

この環境変数の指定は，FILE STATUS句を指定したすべてのファイルの入出力文に有効となります。ただし，例外として，テストデバッガ実行時にファイルシミュレーション機能の対象となるファイルに対しては，この機能は無効になります。

FILE STATUS句の指定がないファイルの動作は，この環境変数を指定しても変わりません。

注※

プログラム実行後に実行時メッセージが出力されているときは，メッセージレベルがIであれば処理が続行されていると判定できます。

注意事項

COBOL入出力サービスルーチンおよびバイトストリーム入出力サービスルーチンは，この機能の対象となりません。

6.3.5　ファイル属性の整合性チェック

既存の物理ファイルを開く際に，ファイル属性情報とプログラムの指定に矛盾※があるかをチェックします。矛盾がある場合は物理ファイルを開けないため，ファイル属性情報とプログラムの指定を一致させておく必要があります。

注※

ファイル編成によっては，物理ファイルを作成したプログラムに記述されたファイル管理記述項とファイル記述項の内容の一部の情報が，ファイル属性情報として物理ファイル内に格納されています。このファイル属性情報と，物理ファイルを開くプログラムに記述されたファイル管理記述項およびファイル記述項の指定の矛盾をチェックします。

(1)　整合性チェックの内容

順編成ファイル（可変長レコード形式）および相対編成ファイルの場合は，ファイル属性情報のファイル形式とレコード長をチェックします。

ISAMによる索引編成ファイルの場合は，ファイル属性情報のファイル形式，最大レコード長，最小レコード長，キー個数，主レコードキー，副レコードキー，およびデータ形式（DATA FORMAT句の指定）※をチェックします。

注※

データ形式（DATA FORMAT句の指定）は，物理ファイル内に格納されないため，指定したシステムのエンディアン形式と矛盾していないかチェックします。そのため，ファイルを新規に作成する場合でも，矛盾があると判断された場合は，ファイル作成に失敗します。

Btrieveによる索引編成ファイルの場合は，ファイル属性情報のファイル形式，最小レコード長，キー個数，主レコードキー，および副レコードキーをチェックします。

6.4　順編成ファイル

6.4.1　ファイルの作成と割り当て方法

順編成ファイルの作成方法と割り当て方法について説明します。

順編成ファイルについては，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.7(1)　順編成」を参照してください。

(1)　固定長ファイルの作成方法

次の方法で作成できます。

COBOL2002の入出力機能

Windowsのメモ帳などのエディタ

Cプログラムなど，他言語プログラムでのファイル作成

(2)　可変長ファイルの作成方法

COBOL2002の入出力機能によって作成できます。

他言語のプログラムで可変長の順編成ファイルを作成したい場合は，COBOL入出力サービスルーチンを使用します。COBOL入出力サービスルーチンの詳細は，「13.　COBOL入出力サービスルーチン」を参照してください。

(3)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

物理ファイル名には，OSのファイルシステム上で有効となるファイル名を指定してください。

順編成ファイルを使用する場合は，ORGANIZATION句にSEQUENTIALを指定します。

6.4.2　順編成ファイルの行制御

順編成ファイルでは，ADVANCING指定のWRITE文を実行した場合，指定に従って行制御をします。LINAGE句の指定があるとき，PAGE指定は論理ページの最初の行に位置づくまで行送りします。なお，行制御して出力された順編成ファイルは，順編成ファイルとしては読み込むことができません。

出力例を次に示します。出力例のX'0A'は改行，X'0D'は復帰，X'0C'は改ページを示します。

WRITE REC AFTER ADVANCING 3を実行した場合

WRITE REC AFTER ADVANCING PAGEを実行した場合

LINAGE句の指定がない場合

LINAGE句の指定がある場合

WRITE REC BEFORE ADVANCING 3を実行した場合

6.5　相対編成ファイル

6.5.1　ファイルの作成と割り当て方法

相対編成ファイルの作成方法と割り当て方法について説明します。

相対編成ファイルについては，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.7(2)　相対編成」を参照してください。

(1)　ファイルの作成方法

固定長ファイル／可変長ファイル共に，COBOL2002の入出力機能によって作成できます。

他言語のプログラムで相対編成ファイルを作成したい場合は，COBOL入出力サービスルーチンを使用します。COBOL入出力サービスルーチンの詳細は，「13.　COBOL入出力サービスルーチン」を参照してください。

(2)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

物理ファイル名には，OSのファイルシステム上で有効となるファイル名を指定してください。

相対編成ファイルを使用する場合は，ORGANIZATION句にRELATIVEを指定します。

6.6　ISAMによる索引編成ファイル

ISAMによる索引編成ファイルの作成方法と割り当て方法について説明します。

索引編成ファイルについては，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.7(3)　索引編成」，およびマニュアル「索引順編成ファイル管理 ISAM」を参照してください。

なお，このシステムでは，索引編成ファイルの操作や保守をするために，ISAMユティリティを使用できます。ISAMユティリティの詳細については，マニュアル「索引順編成ファイル管理 ISAM」を参照してください。

6.6.1　ファイルの作成と割り当て方法

索引編成ファイルの作成方法と割り当て方法について説明します。

(1)　固定長ファイルの作成方法

COBOL2002の入出力機能，またはISAMユティリティによって作成できます。

(2)　可変長ファイルの作成方法

COBOL2002の入出力機能，またはISAMユティリティによって作成できます。

(3)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

ただし，次の点に注意してください。

ISAMによる索引編成ファイルでは，拡張子の異なる複数の物理ファイルが一つの索引編成ファイルを構成しています。そのため，物理ファイル名は，拡張子を付けないで指定してください。物理ファイル名に拡張子を付けて指定した場合，動作は保証しません。

索引編成ファイルを使用する場合は，ORGANIZATION句にINDEXEDを指定します。

ネットワークに接続してあるドライブからファイルを割り当てる場合，ISAMユティリティのオプション情報設定で，ネットワークドライブ情報を「使用する」と設定する必要があります。ただし，この場合ファイルの整合性は保証しません。詳細はマニュアル「索引順編成ファイル管理ISAM」を参照してください。

(4)　生成される物理ファイル

索引編成ファイルには，2GB未満までアクセス可能なノーマルファイル形式と，2GB以上のアクセスが可能なラージファイル形式の2種類があります。ただし，ラージファイル形式の索引編成ファイルは，Windows(x86) COBOL2002だけで有効です。

索引編成ファイルによって生成される物理ファイルを，次に示します。

ISAMのファイル種別

ファイル拡張子

説明

キー定義ファイル

.kdf

（ノーマルファイル形式）

.kdl

（ラージファイル形式）

データファイルとキーファイルとの対応を表すデータを格納しています。

キーファイル

主キーファイル

.k01

（ノーマルファイル形式）

.l01

（ラージファイル形式）

主レコードキーでレコードを検索するために必要な情報を保持しています。主レコードキー以外のキーでレコードを検索するには，副キーファイルを使用します。

副キーファイル

.k02〜.k99

（ノーマルファイル形式）

.l02〜.l99

（ラージファイル形式）

主レコードキーとは別のキーでレコードを検索するために必要な情報を保持しています。副レコードキーは，1個の索引編成ファイルに対して複数指定できます。

データファイル

.drf

（ノーマルファイル形式）

.drl

（ラージファイル形式）

実際にレコードを格納しているファイルです。格納するレコード形式は，固定長レコードでも可変長レコードでもかまいません。

(5)　索引編成ファイルに対するOPENモード

索引編成ファイルに対してOUTPUTモードのOPEN文を実行する場合，環境変数CBLISAMDL，およびCBLD_ファイル名の指定によって，動作が異なります。環境変数の指定によるOPEN文の動作の違いを，次に示します。

CBLISAMDL

CBLD_ファイル名

ISAMDL

NOISAMDL

指定なし

YES

作成

追加書き

作成

NOまたは指定なし

作成

追加書き

追加書き

（凡例）

作成：一度ファイルを削除した後，新規作成して出力する

追加書き：存在するファイルに対して，追加で出力する

(6)　プログラムとファイル割り当ての関係

定数指定，環境変数指定，データ名指定のそれぞれについて，プログラムと物理ファイルとの関係を索引編成ファイルの例で示します。

(a)　定数指定のASSIGN句の場合

(b)　環境変数指定のASSIGN句の場合

(c)　データ名指定のASSIGN句の場合

6.6.2　ファイル編成とレコード形式

ISAMによる索引編成ファイルでは，固定長と可変長のレコード形式が使用できます。

6.6.3　リモートファイルアクセス機能（Windows(x86) COBOL2002で有効）

接続されているほかのWindowsやUNIX上にある，ISAMを使用する索引編成ファイルにアクセスできます。これを，リモートファイルアクセス機能といいます。

(1)　リモートファイルのアクセス方法

他マシン上のISAMファイルにアクセスする方法を説明します。

物理ファイルの割り当て時，次のように他ホスト名を指定すると，他マシン上のISAMを使用する索引編成ファイルを割り当てられます。

形式

ホスト名:〔ドライブ名:〕ファイル名

構文規則

ドライブ名は，Windows上にあるISAMを使用する索引編成ファイルにアクセスする場合に指定が必要です。

ホスト名を指定しなかった場合は，ローカルファイルとしてアクセスします。

一般規則

WindowsとUNIXの間で2進データ，内部浮動小数点データなどのバイナリデータをアクセスした場合，動作は保証しません。

ラージファイル形式の索引編成ファイルは，リモートファイルアクセス機能を使用できません。

指定例

（例1）UNIX上の索引編成ファイルの場合

UNIXHOST:/users/isamfile

（例2）Windows上の索引編成ファイルの場合

PCHOST:C:¥users¥isamfile

(2)　データ形式とデータ操作

リモートファイルにアクセスする場合，ファイル定義のデータ形式と物理ファイルのデータ形式の組み合わせによって，データの操作が異なります。

データ形式の組み合わせと，リモートファイルアクセス機能でのデータ操作の関係を次に示します。

ファイル記述項

DATA FORMAT句の指定

物理ファイル

標準数値形式

反復数値形式

STANDARD（標準数値形式）

数値データを変換する

属性不一致で実行時エラーとなる

REVERSE（反復数値形式）

属性不一致で実行時エラーとなる

数値データを変換しない

指定なし

数値データを変換しない

数値データを変換しない

6.7　テキスト編成ファイル

ここでは，テキスト編成ファイルについて説明します。

テキスト編成ファイルについては，マニュアル「COBOL2002　言語　拡張仕様編」　「2.1　テキスト編成」を参照してください。

6.7.1　ファイルの作成と割り当て方法

テキスト編成ファイルの作成方法と割り当て方法について説明します。

(1)　ファイルの作成方法

テキスト編成ファイルは，次の方法で作成できます。

COBOLの入出力機能

Windowsのメモ帳などのエディタ

Cプログラムなど，他言語プログラムでのファイル作成

(2)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

物理ファイル名には，OSのファイルシステム上で有効となるファイル名を指定してください。

テキスト編成ファイルを使用する場合は，ORGANIZATION句にLINE SEQUENTIALを指定します。

6.7.2　テキスト編成ファイルのファイル編成とレコード形式

テキスト編成ファイルは，固定長と可変長のレコード形式が使用できます。ただし，実際にアクセスする物理ファイル形式は，固定長／可変長による違いはありません。そのため，テキスト編成ファイルであれば，固定長／可変長のどちらでもアクセスできます。

(1)　ファイル形式

テキスト編成ファイルは，テキストファイルの各行（表示できる文字で構成されたテキスト行）を1レコードとして，改行文字をレコードの区切り文字とした可変長形式のファイルです。

テキスト編成ファイルの形式を次に示します。

(2)　レコード形式

テキスト編成ファイルの各レコードは，レコード本体に改行文字が付けられた形式で構成されています。

テキスト編成ファイルのレコード形式を次に示します。

改行文字は，一般的にエディタなどで入力するとき［Enter］キーを押して入力する文字です。

次にWindowsとUNIXの改行文字の相違を示します。WindowsとUNIXの間でテキスト編成ファイルを移行するときは注意してください。

Windowsの改行文字

Windowsでの改行文字は，復帰文字（X'0D'）+改行文字（X'0A'）の2バイトで構成されています。COBOL2002のテキスト編成ファイルでは，この2バイトで構成された文字を改行文字と認識します。

ただし，テキスト編成ファイルのREAD文については，X'0A'だけでも改行文字と認識します。

UNIXの改行文字

UNIXでの改行文字は，改行文字（X'0A'）だけの1バイトで構成されています。COBOL2002のテキスト編成ファイルでは，この1バイトで構成された文字を改行文字と認識します。

6.7.3　入出力手続き文と動作

テキスト編成ファイルに対する入出力手続き文について説明します。なお，次に説明する規則以外については，順編成ファイルの場合と同じです。

(1)　READ文

(a)　READ文でのテキスト編成ファイル固有の規則

物理ファイル上にあるレコードの区切り文字（改行文字）は，COBOLプログラムのレコード領域に格納されません。

テキスト行がレコード長より短いときは，改行文字までの文字列が入力され，残りの部分には空白（X'20'）が埋められます。改行文字はすべて切り捨てられます。

テキスト行がレコード長より長いときは，ファイルの開くモードによって次のように動作が異なります。

（I-Oモード以外で開いている場合）

レコード長で区切られた複数レコードとして入力されます。このとき，FILE STATUS句を指定していると，入出力状態には04が返されます。

（I-Oモードで開いている場合）

READ文はエラーとなります。このとき，FILE STATUS句を指定していると，入出力状態には30が返されます。

タブ文字（X'09'）はそのままデータとして入力され，空白には置き換えられません。

ファイルの終わりが改行文字でないときは，ファイルの終わりに改行文字があるとみなされます。

レコード中にNULL（X'00'）が含まれる場合，NULL（X'00'）がデータとして入力されます。また，NULL（X'00'）以降もデータとして入力されます。

ファイル定義が可変長の場合，レコード記述項の最大長分の固定長として読み込まれます。このとき，レコード長には，ファイルから実際に読み込んだ長さが設定されます。

また，I-Oモード以外でファイルを開き，かつレコード記述項の長さが最大レコード長より短い場合，最大レコード長で確保されたレコード領域に最大レコード長で読み込まれます。このとき，DEPENDING ON指定のデータ名には，レコード記述項で定義したレコード長より大きい値が設定される場合があります。

このため，入出力状態が00の場合は改行文字の直前までの長さが，入出力状態が04の場合は最大レコード長が，それぞれDEPENDING ON指定のデータ名に設定されます。どちらの場合でも，COBOLプログラムから参照できるのは，レコード記述項で定義した長さ分の領域だけです。

(2)　WRITE文

(a)　WRITE文でのテキスト編成ファイル固有の規則

レコード領域の最後が半角空白文字（X'20'）以外のときは，改行文字を付けて出力されます。

レコード領域の最後が半角空白文字（X'20'）のときは，末尾の半角空白文字（終端から半角空白文字以外の文字が出現するまでの部分）が切り捨てられ，改行文字を付けて出力されます。出力レコードの末尾の空白文字列を出力したい場合は，「6.7.5　レコード末尾の空白文字を出力する機能」を参照してください。

(3)　REWRITE文

(a)　REWRITE文でのテキスト編成ファイル固有の規則

REWRITE文を実行する直前の入出力文はREAD文で，このREAD文が成功していなければなりません。

REWRITE文は，読み込んだテキスト行の長さと更新用レコードの長さが等しい場合だけ，テキスト行が書き換えられます。それ以外の場合，REWRITE文はエラーとなり，FILE STATUS句を指定していると，入出力状態に44が返されます。なお，更新用レコードの長さとは，後続の半角空白文字を削除した長さを指します。更新するレコードの長さにレコード末尾の半角空白文字も含めたい場合は，「6.7.5　レコード末尾の空白文字を出力する機能」を参照してください。

REWRITE文では，テキスト行のうち改行文字，またはファイルの終わり（EOF）の直前までを書き換えます。

6.7.4　規則

テキスト編成ファイルは，印字できる文字や制御コード（改行文字，復帰文字，タブ文字など）で構成されている必要があります。

テキスト編成ファイル中にEOFコード（X'1A'）が含まれる場合，その位置がファイルの終端とみなされます。

出力先の物理ファイルに標準出力（stdout）または標準エラー出力（stderr）を指定し，そのファイルをリダイレクションした場合，動作は保証しません。

WRITE文を実行して文字を書き出す場合，X'20'未満の制御コードについてもそのまま書き出されます。

可変長ファイルに対してREWRITE文を実行する場合，次のどの方法でFD項を定義しても結果は同じになります。

01レベルを複数回記述する場合

         FD T-FILE.
         01 T-REC1 PIC X(10).
         01 T-REC2 PIC X(30).

VARYING句で可変長を定義する場合

         FD T-FILE RECORD VARYING IN SIZE FROM 1 TO 30
                          DEPENDING ON L-REC.
         01 T-REC PIC X(30).

OCCURS句で可変長を定義する場合

         FD T-FILE.
         01 T-REC.
           02 T-RECD PIC X OCCURS 30 TIMES DEPENDING ON L-REC.

Unicode機能を使用している場合，テキスト編成ファイルはUTF-8で記述されているものとして扱ってください。Unicode機能については，「28.　Unicode機能」を参照してください。

6.7.5　レコード末尾の空白文字を出力する機能

レコード末尾の空白文字を出力する設定をしておくと，テキスト編成ファイルに対するWRITE文，およびREWRITE文でレコード末尾に半角空白文字（X'20'）があった場合に，半角空白文字を削除しないで，そのままファイルに書き出せます。

レコード末尾の空白文字を出力する機能を使用するには，実行時環境変数CBLD_ファイル名にTEXTWRITESPACEを指定するか，実行時環境変数CBLTEXTWRITESPACEにYESを指定してください。

(1)　ファイル単位に指定する方法

形式

CBLD_ファイル名={ TEXTWRITESPACE | NOTEXTWRITESPACE }

機能

環境変数CBLD_ファイル名にTEXTWRITESPACEを指定すると，実行単位中の任意のテキスト編成ファイルに対して，WRITE文およびREWRITE文でレコード末尾の連続する半角空白文字をファイルに書き出します。

環境変数CBLD_ファイル名にNOTEXTWRITESPACEを指定すると，この機能は無効になります。

(2)　実行単位中のすべてのファイルに指定する方法

形式

CBLTEXTWRITESPACE=YES

機能

環境変数CBLTEXTWRITESPACEにYESを指定した場合は，実行単位中のすべてのテキスト編成ファイルに対するWRITE文およびREWRITE文でレコード末尾からの連続する半角空白文字をファイルに書き出します。

環境変数CBLTEXTWRITESPACEにYESの指定がないか，またはYES以外を指定した場合は，この機能は無効になります。

(3)　規則

この機能を使用した場合，WRITE文やREWRITE文で書き出すレコードの長さは次のようになります。

固定長形式の場合：ファイル節に定義したレコード長

可変長形式の場合：WRITE文やREWRITE文実行時に指定されたレコード長

ファイル単位に指定する方法と実行単位中のすべてのファイルに指定する方法を併用した場合，ファイル単位に指定する方法での指定が優先されます。次に指定の組み合わせによる機能の有効・無効状態を示します。

表6‒4　環境変数CBLTEXTWRITESPACEと環境変数CBLD_ファイル名の指定の組み合わせ

CBLTEXTWRITESPACE

CBLD_ファイル名

TEXTWRITESPACE

NOTEXTWRITESPACE

指定なし

YES

有効

無効

有効

環境変数指定なし

または

YES以外

有効

無効

無効

(4)　注意事項

WRITE文のADVANCING指定，またはPOSITIONING指定で書き出された改行文字に対しては，この機能を使用しても改行文字の前に半角空白文字は出力されません。半角空白文字を含んで改行文字を書き出したいときは，ADVANCING指定やPOSITIONING指定がないWRITE文で半角空白文字だけのレコードを書き出してください。

この機能が有効な場合，READ文で読み込んだ固定長形式のレコードを，REWRITE文を実行してレコード領域長より短いレコードに更新しようとしたときは，読み込んだレコード長と更新するレコード長が不一致となり，REWRITE文が失敗します。レコード領域長より短いレコードに対してREWRITE文を実行するときは，可変長形式のファイルで定義して，読み込んだレコード長と変わらないようにしてください。

（例）

入力レコード

'AAAAA'

固定長形式のファイル／レコード定義

FD FILE-1.
01 FILE-1-REC   PIC X(10).

可変長形式のファイル／レコード定義

FD FILE-2 RECORD IS VARYING IN SIZE FROM 1 TO 10 CHARACTERS
                    DEPENDING ON REC-LEN.
01 FILE-2-REC   PIC X(10).

表6‒5　レコード定義より短いレコードに対するREWRITE文の動作

内容と結果

機能の有効・無効状態

有効

無効

固定長形式

可変長形式

固定長形式

可変長形式

READ文実行後のレコード領域の内容

'AAAAA△△△△△'

'AAAAA'※

'AAAAA△△△△△'

'AAAAA'※

REWRITE文でレコードを'aaaaa'に更新するときの結果

半角空白を含む10バイトを更新しようとしてKCCC3521R-Sエラーとなる。

'aaaaa'に更新される。

レコード末尾の半角空白は削除され，'aaaaa'で更新される（入力レコード長と等しくなる）。

（凡例）

△：半角空白

注※

REC-LEN項目には入力レコード長が格納される。

(5)　使用例

環境変数CBLTEXTWRITESPACEと環境変数CBLD_ファイル名の指定を組み合わせて使用する場合の例を次に示します。

環境変数の指定

CBLTEXTWRITESPACE=YES
CBLD_FILE_2=NOTEXTWRITESPACE

プログラム例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-1 ASSIGN TO SYS100
                         ORGANIZATION IS LINE SEQUENTIAL.
           SELECT FILE-2 ASSIGN TO SYS200
                         ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD FILE-1.
       01 FILE-1-REC      PIC X(10).
       FD FILE-2.
       01 FILE-2-REC      PIC X(10).
       PROCEDURE DIVISION.
           OPEN OUTPUT FILE-1 FILE-2.
      * レコード領域の後ろ5バイトは半角空白となる
           MOVE '12345' TO FILE-1-REC FILE-2-REC.
      * FILE-1は，CBLTEXTWRITESPACE=YESによって機能が有効なため，レ
      * コード末尾の半角空白は削除されない。
           WRITE FILE-1-REC.
      * FILE-2は，CBLD_FILE_2=NOTEXTWRITESPACEによって機能が無効なた
      * め，レコード末尾の半角空白は削除される。
           WRITE FILE-2-REC.
            :

実行結果

FILE1の内容：12345△△△△△改行

FILE2の内容：12345改行

（凡例）

△：半角空白文字

改行：改行文字

6.8　CSV編成ファイル（表計算プログラムファイル）

CSV（Comma Separated Value）編成ファイルは，表計算プログラムファイルともいい，表のデータを1行ごとに，列をコンマで区切って出力したファイルです。ここでは，CSV編成ファイルの入出力処理について説明します。

CSV編成ファイルについては，マニュアル「COBOL2002　言語　拡張仕様編」　「17.　CSVファイル入出力機能」を参照してください。

なお，ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス方法については，「付録D.1　ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス」を参照してください。

6.8.1　ファイルの作成と割り当て方法

CSV編成ファイルの作成方法と割り当て方法について説明します。

(1)　ファイルの作成方法

CSV編成ファイルは，次の方法で作成できます。

COBOLの入出力機能

Windowsのメモ帳などのエディタ

Cプログラムなど，他言語プログラムでのファイル作成

表計算プログラムでのファイル作成

(2)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

物理ファイル名には，OSのファイルシステム上で有効となるファイル名を指定してください。

CSV編成ファイルを使用する場合は，ORGANIZATION句にCSVを指定します。

6.8.2　CSV編成ファイルのファイル編成とレコード形式

CSV編成ファイルでは，テキスト編成ファイルと同じように，1行（改行文字までの文字列）を1レコードとみなします。さらに，おのおののレコードは，コンマ（,）によって複数のデータ項目に区切られた形式になっています。コンマによって区切られたデータ項目をセルと呼びます。CSV編成ファイルでは，このセル単位でデータを入出力できます。

なお，COBOLでCSV編成ファイルを扱う場合は，次の形式に従った，固定長のレコード形式だけが使用できます。

(1)　ファイル形式

CSV編成ファイルは，CSVファイルの各行を1レコードとして，改行文字をレコードの区切り文字とした可変長形式のファイルです。

CSV編成ファイルの形式を次に示します。

(2)　レコード形式

CSV編成ファイルの各レコードは，レコード本体に改行文字が付けられた形式で構成されています。改行文字は，一般的にエディタなどで入力するとき［Enter］キーを押して入力する文字です。改行文字の詳細については，「6.7.2　テキスト編成ファイルのファイル編成とレコード形式」を参照してください。

さらに，おのおののレコードは，コンマを区切り文字とした「セル」と呼ばれるデータ項目単位に分割されています。

CSV編成ファイルのデータ入出力は，レコード単位で実行しますが，レコード中の各セルの内容は，入力レコード領域に定義した基本項目ごとに処理できます。

CSV編成ファイルのレコード形式を次に示します。

なお，コンマ（,）の替わりにタブ文字（X'09'）を区切り文字として使えます。詳細は，「6.8.9　セルデータをタブ文字区切りで入出力する機能」を参照してください。

6.8.3　入出力手続き文と動作

CSV編成ファイルに対する入出力手続き文について説明します。なお，CSV編成ファイルでは，OPEN文，READ文，WRITE文，CLOSE文だけが手続き文として使用できます。これ以外の手続き文は，使用できません。また，次に記載されている以外の規則については，順編成ファイルの場合と同じです。

(1)　OPEN文

CSV編成ファイルは，INPUT，OUTPUT，EXTENDモードで開けます。

(2)　READ文

CSV編成ファイルから読み込まれた1行中に含まれる各セルの情報は，レコード定義の基本項目に1対1で対応して格納されます。このとき，レコード中に含まれるセルの個数がレコード定義の基本項目数より多い場合，対応する基本項目がないセルの情報は無視されます。逆に，レコード中に含まれるセルの個数がレコード定義の基本項目数より少ない場合，対応するセルがない基本項目の値は変更されません。

セルの情報が基本項目に格納されるときは，英数字項目の転記の規則に従います。

入力したレコードにダブルコーテーション（"）が含まれない場合，コンマ（,）または改行文字を区切り文字として，データが入力されます。

入力したレコードにダブルコーテーション（"）が含まれる場合，次の規則に従ってデータが入力されます。

（コンマの直後がダブルコーテーションの場合）

次に現れるダブルコーテーションの直前までが，セルの情報として扱われます。ダブルコーテーションが出現する前にコンマがあっても，セルの区切り文字とはみなしません。

この場合，セルの情報にダブルコーテーションが含まれる場合でも，区切り文字とみなされるので注意が必要です。

（コンマの直後がダブルコーテーションでない場合）

データ中に含まれるダブルコーテーションは，文字データとして扱われます。

入力したレコード中の，一つのセルの文字列長が入力領域より長い場合，入力領域の長さ分の文字列が読み込まれ，残りの部分は切り捨てられます。このとき，FILE STATUS句を指定していると，入出力状態に04が返されます。

INTO指定がある場合は，INTO指定のレコード構造に従ってデータが入力されます。INTO指定がない場合は，ファイル記述項に定義したレコードの構造に従ってデータが入力されます

READ文の実行が失敗した場合，レコード領域の内容が不定となります。

(3)　WRITE文

WRITE文を実行すると，レコード領域中の基本項目単位をセルの情報として，おのおののセルがダブルコーテーション（"）で囲まれ，レコードの終端に改行文字が付いた形式で出力されます。各セルの情報をダブルコーテーションで囲まないで出力したい場合は，「6.8.6　セルデータをダブルコーテーションで囲まないで出力する機能」の説明を参照してください。

出力レコードの基本項目に含まれる右端の半角空白文字は出力されません。また，出力する基本項目のデータがすべて半角空白文字の場合，対応するセルの情報には，連続したダブルコーテーション（""）だけが出力されます。

出力レコードの基本項目のデータの最後にある空白も出力したい場合は，「6.8.8　データの後の空白文字を出力する機能」を参照してください。

FROM指定がある場合は，FROM指定のレコード構造に従ってデータが出力されます。FROM指定がない場合は，ファイル記述項に定義されたレコードの構造に従ってデータが出力されます。

6.8.4　注意事項

CSV編成ファイルに対して，ファイル共用は使用できません。

READ文でセル情報を基本項目単位に格納する場合，レコード定義中にJUSTIFIED RIGHT句を指定しても，無効となります。

一つのCSV編成ファイルに対して，AFTER ADVANCING指定したWRITE文とBEFORE ADVANCING指定したWRITE文を同時に使用すると，レコードは正しく出力されません。

Unicode機能を使用している場合，CSV編成ファイルはUTF-8で記述されているものとして扱ってください。Unicode機能については，「28.　Unicode機能」を参照してください。

6.8.5　セルデータを数値として入出力する機能

(1)　セルデータを数値として入出力する機能の概要

-NumCsvオプションを指定すると，外部10進項目，外部浮動小数点数字項目で定義されているセルに対して，データを数値として入出力できます。

この機能は，表計算プログラムのようなCOBOLとは数値データの表現形式が異なるプログラムと，COBOLプログラムとの間で数値データをやり取りする場合に使用します。例えば，次のような場合は，-NumCsvオプションを指定することで，表計算プログラムとCOBOLプログラムとで数値データをやり取りできます。

（例1）

次のようなデータを，WRITE文でCSV編成ファイルに出力する場合

データ定義

データ項目に格納されている値

-NumCsvオプション

ファイルへの出力結果

99v99

1.23

なし

0123

あり

01.23

-NumCsvオプションを指定すると小数点が出力されるため，表計算プログラムで正しい数値として入力できます。

（例2）

次のようなデータを，READ文でCSV編成ファイルから入力する場合

データ定義

ファイルから入力した値

-NumCsvオプション

データ項目への格納結果

9(9)

123

なし

123△△△△△△

あり

000000123

（凡例）

△：半角空白文字

-NumCsvオプションを指定すると数字項目に変換されるため，COBOLプログラムで数値として扱えます。

(2)　データ変換の規則

-NumCsvオプションを指定した場合の，数字項目へのデータ変換規則を次に示します。

データ変換の一般規則

特殊名段落のDECIMAL-POINT IS COMMA句の指定は有効です。ただし，小数点としてコンマ（,）を使用する場合は，その数値データをダブルコーテーション（"）で囲む必要があります。ダブルコーテーションで囲まれていないコンマは，すべてセルの区切り文字とみなされます。

セルにデータを入出力するとき，次に示す文字が数値データとして有効です。

表6‒6　CSV編成ファイルに数値データとして有効な文字の種類

セルの属性

入力時に有効な文字

出力時に有効な文字

外部10進項目

0〜9，+，-

小数点

右端，または左端にある空白文字（X'20'）

0〜9，+，-

外部浮動小数点数字項目

0〜9，+，-，E，e

小数点

右端，または左端にある空白文字（X'20'）

符号位置にある空白文字（X'20'）※

0〜9，+，-，E，e

小数点

空符号位置にある空白文字（X'20'）※

注※

外部浮動小数点数字項目の指数部，仮数部の符号をマイナス（-）で定義した場合，符号位置にある空白文字（X'20'）は，有効な文字となります。

外部10進項目，外部浮動小数点数字項目で定義したセルに，次のようなデータを入力した場合，実行時エラーになります。

1. 「表6‒6　CSV編成ファイルに数値データとして有効な文字の種類」で示した「有効な文字」以外の文字が含まれるデータ

2. 小数点が複数あるデータ

3. 外部10進形式で，符号が複数ある，または符号の位置が不正なデータ

4. 外部浮動小数点数字項目で，浮動小数点数字定数として正しくないデータ

　（ただし，指数部，仮数部の符号をマイナス（-）で定義した場合，データ中で符号を示す位置が空白文字（X'20'）であってもよい）

入力時のデータ変換規則

外部10進項目，外部浮動小数点数字項目で定義したセルでは，入力できるデータの長さは512バイトまでです。データの長さが512バイトを超える場合，それ以降のデータは切り捨てられます。切り捨てが起きた場合，FILE STATUS句を指定していると，入出力状態に04が返されます。また，2バイト文字の1バイト目でデータが切り捨てられる場合，その2バイト文字全体が入力されません。

外部10進項目，外部浮動小数点数字項目で定義したセルに入力したデータの有効文字が22バイトを超える場合，それ以降のデータは切り捨てられます。切り捨てが起きた場合，FILE STATUS句を指定していると，入出力状態に04が返されます。

外部10進項目で定義したセルでは，小数点位置を合わせて入力されます。その際，必要に応じて数字の左側や右側にゼロを補ったり，あふれたけたを切り捨てたりします。詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「10.5.7　データ項目内でのデータのけた寄せ」を参照してください。

また，このようなけた寄せが発生した場合，FILE STATUS句を指定していると，入出力状態に04が返されます。

外部10進項目に符号の指定がある場合，SIGN句の指定に関係なく左端の符号だけが有効となります。

外部浮動小数点数字項目で定義したセルには，外部10進形式，外部浮動小数点数字形式のどちらの形式のデータも，入力できます。ただし，入力データの中に"E"または"e"が含まれている場合，外部浮動小数点数字形式のデータとみなされます。

外部10進項目，外部浮動小数点数字項目以外の属性を持つ項目には，通常の-NumCsvオプション指定なしの場合と同様にデータが入力されます。

外部10進項目，外部浮動小数点数字項目で定義したセルに，次のようなデータを入力した場合，ゼロを入力したものとして扱われます。

1.セル中に入力対象となるデータがない場合

2.すべて空白文字のデータの場合

入力データの右端，または左端にある空白は，読み込まれません。

出力時のデータ変換規則

外部10進項目，外部浮動小数点数字項目に想定小数点が指定されている場合，想定小数点位置に出力される文字はDECIMAL-POINT IS COMMA句の指定に従います。

外部浮動小数点数字項目に小数点が指定されている場合，小数点位置に出力される文字はDECIMAL-POINT IS COMMA句の指定に従います。

外部10進項目に符号の指定がある場合，SIGN句の指定に関係なく左端に符号が出力されます。ただし，符号がプラス（+）の場合は出力されません。

注意事項

READ文が失敗した場合，レコード領域は不定になります。

数字編集項目で定義したセルは，-NumCsvオプションを指定しても英数字項目属性でデータが入出力されます。

(3)　数値として入力するとき，不要な文字列を無視する機能

-NumCsvオプション指定時，セルデータ中に数値として無効な文字が含まれている場合，環境変数CBLCSVCHARにその文字を指定することで，文字を無視できます。この機能を使用すると，通貨記号などが付けられたデータを数値データとして読み込めます。

（例）

"¥123"，"¥456"，"¥789"というCSV編成ファイルのデータを，-NumCsvオプションを指定して読み込もうとした場合

環境変数CBLCSVCHARに¥を指定したとき

「123」「456」「789」という数値データとして読み込まれる。

環境変数CBLCSVCHARを指定しないとき

¥は数値データとして無効なので，実行時エラーになる。

形式

CBLCSVCHAR=文字列〔;文字列…〕

文字列

セルデータを数値として入力するとき，無視したい文字列を指定します。

規則

環境変数CBLCSVCHARに指定した文字列は，数値の左端，右端，途中のどこにあっても無視されます。

入力データが外部浮動小数点数字項目の場合，環境変数CBLCSVCHARの指定は無効になります。

環境変数CBLCSVCHARには，1バイト以上，512バイト以下の文字列を指定してください。この範囲を超える長さの文字列を指定した場合，実行時エラーとなります。

注意事項

-NumCsvオプションが指定されていない場合，環境変数CBLCSVCHARの指定は無効になります。

環境変数CBLCSVCHARに指定した文字列に含まれるセミコロン（;）は，すべて区切り文字とみなされます。無視する文字列としてセミコロンは指定できません。

環境変数CBLCSVCHARに，空白文字（X'20'）や数値データとして有効な文字を指定した場合，これらの文字列も無視されます。ただし，入力結果は保証しません。

6.8.6　セルデータをダブルコーテーションで囲まないで出力する機能

環境変数CBLD_ファイル名にNOCSVQUOTEを指定すると，CSV編成ファイルを出力するとき，セルデータをダブルコーテーションで囲まないで出力できます。セルデータがダブルコーテーションで囲まれている形式に対応していない表計算プログラムとデータをやり取りするような場合，指定します。

形式

CBLD_ファイル名=NOCSVQUOTE

注意事項

セルデータをダブルコーテーションで囲まない場合，セルデータ中に含まれているコンマも区切り文字とみなされます。

（例）

「12,345,678」と「9,999」という二つのセルデータを出力する場合

ダブルコーテーションで囲んだとき（CBLD_ファイル名=NOCSVQUOTE指定なし）

"12,345,678","9,999"

→「12,345,678」「9,999」という二つのセルデータとして扱われます。

ダブルコーテーションで囲まないとき（CBLD_ファイル名=NOCSVQUOTE指定あり）

12,345,678,9,999

→「12」「345」「678」「9」「999」という五つのセルデータとして扱われます。

6.8.7　入力時の未使用項目の初期化機能

(1)　入力時の未使用項目の初期化機能

CSV編成ファイルからREAD文で入力したセルの個数が，対応するプログラム中の基本項目の個数より少ない場合，環境変数CBLCSVINITにYESを指定すると，セルと対応しない基本項目を初期化できます。

形式

CBLCSVINIT=YES

規則

環境変数CBLCSVINITにYESを指定すると，CSV編成ファイルから入力したセルの個数が，対応するプログラム中の基本項目の個数より少ない場合，セルと対応しない基本項目を初期化します。

環境変数CBLCSVINITを指定しなかった場合や，YES以外を指定した場合は，セルと対応しない基本項目は，初期化されません。

CSV編成ファイルで使用できる項目は，ブール項目以外で，用途が表示用（DISPLAY）の項目です。

この機能は，-NumCsvオプションを使用した場合にも有効です。

この機能を使用した場合，セルと対応しない基本項目には次の初期値データが設定されます。

未使用基本項目の属性

初期値データ

英字項目

半角空白文字（X'20'）

英数字項目

英数字編集項目

数字編集項目

数字項目

外部10進形式

ゼロ（X'30'）※1

外部浮動小数点形式

日本語項目

全角空白文字（X'8140'）※2

日本語編集項目

注※1

初期値データは，数字項目にゼロを転記した結果となります。

注※2

Unicode機能を使用している場合，バイトオーダによって全角空白文字（X'0030'），または全角空白文字（X'3000'）を初期値データに設定します。Unicode機能については，「28.　Unicode機能」を参照してください。

注意事項

この機能を使用した場合，空白文字やゼロだけのセルデータを入力した項目と，初期化で空白文字やゼロが設定された項目の違いが判断できません。

この違いを判断する必要がある場合は，この機能を使用しないで，次に示すようなプログラムを作成する必要があります。

環境変数CBLCSVINITによって初期化されたかどうかを見分けるための処理

・セルと対応しない基本項目は，READ文の実行前にレコード領域をレコードとして存在しない値で初期化します。

・READ文実行後，レコードの内容を初期化した値と比較します。

この機能を使用して改行コードだけのレコードデータを入力した場合，ファイルに従属するすべての基本項目が未使用とみなされ，ファイルに従属するすべての基本項目が初期化されます。

この機能は，ACCEPT文を使用してCSVファイルを入力する場合には使用できません。

6.8.8　データの後の空白文字を出力する機能

環境変数CBLD_ファイル名にCSVWRITESPACEを指定すると，CSV編成ファイルに出力するレコードの基本項目のデータの最後に半角空白文字がある場合，その半角空白文字も出力できます。

形式

CBLD_ファイル名=CSVWRITESPACE

規則

出力レコードの基本項目のデータの最後に半角空白文字がある場合，その半角空白文字も出力します。

出力する基本項目のデータがすべて半角空白文字の場合，対応するセルの情報には，基本項目のサイズ分の半角空白文字を出力します。

プログラム例

 01 REC-1.
  02 CELL-1  PIC X(5).
  02 CELL-2  PIC X(5).
  02 CELL-3  PIC X(5).
        :
   MOVE 'ABC'     TO CELL-1.
   MOVE SPACE     TO CELL-2.
   MOVE '△△CDE' TO CELL-3.
   WRITE REC-1.

（凡例）

△：半角空白文字

データの後の半角空白文字を出力する機能を使用しない場合に出力されるレコードの結果（CBLD_ファイル名=CSVWRITESPACE指定なし）

"ABC","","△△CDE"

データの後の半角空白文字を出力する機能を使用した場合に出力されるレコードの結果（CBLD_ファイル名=CSVWRITESPACE指定あり）

"ABC△△","△△△△△","△△CDE"

6.8.9　セルデータをタブ文字区切りで入出力する機能

環境変数CBLD_ファイル名にCSVTABSEPARATEDを指定すると，セルデータがタブ文字（X'09'）で区切られた形式のファイルをCSV編成ファイルとして入出力することができます。CSVTABSEPARATEDは，セルデータがタブ文字で区切られた形式に対応した表計算プログラムとデータをやり取りするような場合に指定します。

形式

CBLD_ファイル名=CSVTABSEPARATED

規則

READ文，およびWRITE文の動作は，区切り文字がコンマ（,）ではなくタブ文字となること以外は同じです。

6.9　HiRDBによる索引編成ファイル

COBOL2002では，HiRDBで作成されたデータベースの内容を，索引編成ファイルの言語仕様でアクセスできます。ここでは，HiRDBによる索引編成ファイルの使用方法について説明します。

HiRDBによる索引編成ファイルについては，マニュアル「COBOL2002　言語　拡張仕様編」　「20.　HiRDBによる索引ファイル入出力機能」を参照してください。

6.9.1　プログラムの作成方法

HiRDBによる索引編成ファイルを使用するには，次の指定が必要です。

コンパイラ環境変数の指定

HiRDBによる索引編成ファイルを使用するプログラムのコンパイル時には，コンパイラ環境変数CBL_RDBSYSにHiRDBを指定する必要があります。指定形式を次に示します。

形式

CBL_RDBSYS=HiRDB※

注※

データベースシステム名には，HiRDBだけが指定できます。この環境変数の指定がない場合は，初期値としてHiRDBが仮定されます。

ORGANIZATION句の指定

HiRDBによる索引編成ファイルを使用する場合は，ORGANIZATION句にRDBを指定します。

6.9.2　ファイルの作成と割り当て方法

HiRDBによる索引編成ファイルを使用する場合，COBOL上で指定したファイルは，HiRDBの表に相当します。

HiRDBによる索引編成ファイルの作成方法と割り当て方法について説明します。

(1)　ファイルの作成方法

HiRDBによる索引編成ファイルは，次の方法で作成できます。

SQL文を利用してHiRDBにアクセスするユーザプログラム

HiRDBユティリティ

(2)　ファイルの割り当て方法

操作対象となる表の名称を，ASSIGN句で指定します。

形式

SELECT ファイル名 ASSIGN TO ｛定数｜外部装置名｜データ名｝

定数指定の場合

定数に，操作の対象となる表名を指定します。

環境変数指定の場合

外部装置名に対応する環境変数に，操作の対象となる表名を指定します。

次に指定方法を示します。

形式

CBL_外部装置名=表名

データ名指定の場合

データ名に，操作の対象となる表名を指定します。

表名の規則

操作対象に指定した表名は，HiRDBシステムで規定された表名の規則に従います。ただし，表名に引用符（"）が含まれていない場合，実行時に引用符が付けられた名称で処理されます。

表名の規則については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

6.9.3　ファイル編成とレコード形式

HiRDBによる索引編成ファイルは，HiRDBが定めるファイル形式で構成されています。

6.9.4　HiRDBの定義とCOBOLの定義の関連性

HiRDBによる索引編成ファイルを使用する場合，HiRDBでのスキーマ定義とCOBOLでの定義との関連性や，SQLデータ型とCOBOLデータ定義との関連性について，注意が必要です。HiRDBの定義とCOBOLの定義の関連性について説明します。

(1)　RDBの接続と切り離し

接続

COBOLの実行単位で，HiRDBによる索引編成ファイルに対する最初のOPEN文，または切り離し後のOPEN文でファイルをオープンするときに，HiRDBの環境変数PDUSERの設定に基づいてHiRDBと接続します。環境変数PDUSERの詳細については，「HiRDBのUAP開発ガイドマニュアル」を参照してください。

切り離し

COBOLの実行単位で，HiRDBによる索引編成ファイルに対するすべてのファイルを閉じたときに，HiRDBから切り離されます。

(2)　スキーマ定義とCOBOLプログラムとの関連

HiRDBによる索引編成ファイルを使用する場合は，はじめにデータベースを設計してからスキーマ定義を作成します。このスキーマ定義を基に，COBOLプログラムを作成します。

スキーマ定義とCOBOL原始プログラムとの関連を次に示します。

図6‒3　スキーマ定義とCOBOL原始プログラムとの関連

規則

表は，実表またはビュー表で定義します。

スキーマ定義の表名を，ASSIGN句の定数，外部装置名に関連づけられた環境変数，またはデータ名に設定します。

スキーマ定義の列名とCOBOLのレコードの項目名を一致させます。なお，-EquivRuleオプションを指定する場合，等価規則が適用されなくてもスキーマ定義の列名とCOBOLのレコードの項目名が一致するように，項目名を記述する必要があります。

スキーマ定義の列とCOBOLのレコード項目の属性は一致させなければなりません。一致していない場合，動作は保証しません。詳細は，「(3)　RDBの列のデータ型とCOBOLのデータ記述」を参照してください。

スキーマ定義の列とCOBOLのレコードのデータ配置を一致させます。データの配置がずれるような境界調整はしないでください。

スキーマ定義の長さとCOBOLのレコードの長さを一致させます。

主／副レコードキーに指定したCOBOLのデータ項目に対応する列は，インデクス定義を省略できます。ただし，重複キーを検知するには，インデクス定義時のCREATE INDEXで，UNIQUEを指定する必要があります。

CREATE SCHEMA，CREATE TABLE，表名，列名の規則の詳細については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

WRITE文で重複キーを検知する場合は，対応する列に対してユニークなインデクスを付けなくてはなりません。次にその例を示します。

1.単一列インデクスの場合（合成キー以外の場合）

REC01列の重複を検知する例

2.複数列インデクスの場合（合成キーの場合）

REC01，REC02を合わせた値で重複を検知する例

（インデクスを付けるときの注意事項）

WRITE文で重複キーを検知しない場合は，対応する列に対してユニークなインデクスを付けてはなりません。

WRITE文で書き出すレコード中のキーデータ項目に対応する列以外に，ユニークなインデクスを付けてはなりません。キー以外の項目にユニークなインデクスを付けた場合，WRITE文で正しくキー重複を検知できなくなります。例えば，レコード中のキーデータ項目に対応する列以外でキー重複を検知することがあります。

合成キーを使用する場合，CREATE INDEXで並べる列の順序と合成キーに指定する項目の順序は一致させなければなりません。この順序が一致していないときの動作は保証しません。

CREATE INDEXの詳細については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

(3)　RDBの列のデータ型とCOBOLのデータ記述

COBOLのレコードを定義するときは，RDBの列の属性に合わせて定義しなければなりません。

HiRDBの列のデータ型とCOBOLのデータ記述の対応を次に示します。なお，この表にないデータ型は，使用できません。

表6‒7　HiRDBの列のデータ型とCOBOLのデータ記述の対応

HiRDBの列のデータ型

COBOLのデータ記述

項目の記述

備考

SMALLINT

L1 基本項目名 PIC S9(4)
            USAGE COMP.

基本項目

INTEGER

L1 基本項目名 PIC S9(9)
            USAGE COMP.

基本項目

DECIMAL

〔(m〔,n〕)〕

L1 基本項目名
    PIC S9(m-n)〔V9(n)〕
   USAGE PACKED-DECIMAL.

基本項目

1≦m≦18,

Windows(x64) COBOL2002の場合で-MaxDigits38オプション指定時

1≦m≦38,

0≦n≦m

m＝nの場合はSV9(n)とする

n＝0の場合は〔V9(n)〕を省略する

SMALLFLT

L1 基本項目名
      USAGE COMP-1.

基本項目

FLOAT

L1 基本項目名
      USAGE COMP-2.

基本項目

CHAR〔(n)〕

L1 基本項目名  PIC X(n).

基本項目

1≦n≦30000

VARCHAR(n)

L2 集団項目名.
  L3 基本項目名1
      PIC S9(4)
          USAGE COMP.
  L3 基本項目名2
      PIC X(n).

二つの基本項目から構成される集団項目

基本項目1：文字長

基本項目2：文字列

1≦n≦32000

NCHAR〔(n)〕

L1 基本項目名  PIC N(n).

基本項目

1≦n≦15000

NVARCHAR(n)

L2 集団項目名.
  L3 基本項目名1
      PIC S9(4)
          USAGE COMP.
  L3 基本項目名2
      PIC N(n).

二つの基本項目から構成される集団項目

基本項目1：文字長

基本項目2：文字列

1≦n≦16000

DATE

L1 基本項目名 PIC X(4).

基本項目

4バイト'yyyymmdd'の形式

（例えば2002/7/11の場合，X'20020711'が格納される）

TIME

L1 基本項目名 PIC X(3).

基本項目

3バイト’hhmmss’の形式

（例えば11:25:43の場合，X'112543'が格納される）

INTERVAL YEAR TO DAY

L1 基本項目名 PIC S9(8)
   USAGE PACKED-DECIMAL.

基本項目

INTERVAL HOUR TO SECOND

L1 基本項目名 PIC S9(6)
   USAGE PACKED-DECIMAL.

基本項目

MCHAR［(n)］

L1 基本項目名 PIC X(n).

基本項目

1≦n≦30000

MVARCHAR(n)

L2 集団項目名.
  L3 基本項目名1
      PIC S9(4)
          USAGE COMP.
  L3 基本項目名2
      PIC X(n).

二つの基本項目から構成される集団項目

基本項目1：文字長

基本項目2：文字列

1≦n≦32000

BLOB

L2 集団項目名.
  L3 FILLER
      PIC S9(9)
          USAGE COMP.
  L3 基本項目名1
      PIC S9(9)
          USAGE COMP.
  L3 基本項目名2
      PIC X(n).

三つの基本項目名から構成される集団項目

基本項目1：データ長

基本項目2：バイナリデータ

1≦n≦65527

注1

L1，L2，およびL3はレベル番号を表しています。

L1：レベル番号01〜49

L2：レベル番号01〜48

L3：レベル番号02〜49（ただし，L3＞L2）

注2

SQLのデータ型については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点

HiRDBによる索引編成ファイルでは，HiRDBが持つ機能の一部を使用できます。また，ISAMによる索引編成ファイルと相違があります。

(1)　トランザクション管理機能

HiRDBによる索引編成ファイルのトランザクションは，最初のOPEN文でファイルをオープンしたときに開始され，すべてのファイルが閉じられたときに暗黙的にCOMMIT文を実行し，終了します。なお，COMMIT文およびROLLBACK文を明示的には実行できません。COMMIT文およびROLLBACK文を明示的に実行した場合，実行時エラーが表示され，処理は中断されます。

HiRDBによる索引編成ファイルでは，実行時環境変数CBL_RDBCOMMITを指定することで，HiRDBが持つトランザクション管理機能を制御できます。

(a)　環境変数CBL_RDBCOMMIT

COMMIT文およびROLLBACK文で，RDBアクセスのトランザクションを管理する場合，環境変数CBL_RDBCOMMITにMANUAL，AUTO，YESのどれかを指定します。環境変数CBL_RDBCOMMITの指定方法を次に示します。

形式

CBL_RDBCOMMIT=｛MANUAL｜AUTO｜YES｝

MANUALを指定した場合

明示的にCOMMIT文およびROLLBACK文を実行できます。

AUTOまたはYESを指定した場合

明示的にCLOSE文を実行した場合，および未クローズのファイルがクローズされた場合に，暗黙的にCOMMIT文が実行されます。

また，明示的にCOMMIT文およびROLLBACK文を実行できます。

それ以外の値を指定した場合，または環境変数CBL_RDBCOMMITを指定しなかった場合

明示的にCOMMIT文およびROLLBACK文を実行できません。

(b)　トランザクションの範囲

環境変数CBL_RDBCOMMITの値とトランザクションの範囲の関係を次に示します。なお，COMMIT文，ROLLBACK文の取り扱いの詳細については，「6.9.6　プログラムのコンパイルと実行」を参照してください。

図6‒4　環境変数CBL_RDBCOMMITの値とトランザクションの範囲

注※

HiRDBのトランザクション管理機能によって，HiRDBにアクセスを実行中プロセスが異常終了したことを検出してROLLBACKが発生します。

(2)　ISAMによる索引編成ファイルとの相違

HiRDBによる索引編成ファイルとISAMによる索引編成ファイルとの相違点について説明します。

(a)　レコードの検索基準

レコードの検索基準の相違を，次に示します。

表6‒8　索引編成ファイルでのレコードの検索基準の相違

レコードキーの項目

キー判定属性

ISAMの場合

RDBの場合

固定長集団項目

文字

文字

外部10進項目

文字

文字

内部10進項目

文字

数値

外部浮動小数点数字項目

文字

文字

数字編集項目

文字

文字

英字項目

文字

文字

日本語項目

文字

文字

2進項目（2バイト）

2バイト固定小数点

2バイト固定小数点

2進項目（4バイト）

4バイト固定小数点

4バイト固定小数点

内部浮動小数点数字項目（4バイト）

単精度浮動小数点

単精度浮動小数点

内部浮動小数点数字項目（8バイト）

倍精度浮動小数点

倍精度浮動小数点

(b)　入出力状態

HiRDBによる索引編成ファイルでは，ISAMによる索引編成ファイルと入出力状態に返される値が異なる場合があります。詳細は，「付録H　入出力状態の値」を参照してください。

(c)　機能の相違点

スキーマ定義と一致したレコード記述でのアクセスが前提のため，ファイル記述項に記述できるレコード記述項は一つだけです。

スキーマ定義に可変長（行長が可変長）がないため，レコード記述から計算した長さを最大長とする固定長で入出力されます。このため，次のような制限があります。

ファイル記述項のDEPENDING ON データ名指定のRECORD句は，データ名の内容に関係なく，常にレコード記述から計算した長さで入出力されます。

レコード記述中にDEPENDING ON指定のOCCURS句は，記述できません。

HiRDBによる索引編成ファイルでは，DATA FORMAT句を指定しても覚え書きとなります。

環境変数CBLD_ファイル名のISAMDL／NOISAMDLオプションは常にISAMDLとして扱われます。また，環境変数CBLISAMDLの値は，常にYESとして扱われます。このため，OPEN文の出力モードでファイルを開いた場合，ファイルは更新されないで新規作成となり，すべてのデータが削除されます。

ただし，OPEN文の出力モード，または拡張モードで開いたときに，ファイル実体（表）がない場合は，ファイル実体が作成されません。

なお，出力モードでファイルを開く場合，すでにファイル内にあるレコードを高速で削除する機能があります。詳細は，「(5)　その他の拡張機能」の「(a)　出力ファイルの高速オープン機能」を参照してください。

排他制御はRDBのスキーマ定義に従うため，COBOLのファイル共用は利用できません。また，RDBシステムへのアクセスに用いる，内部的に入出力文から変換されたSQL文には，排他オプションが付けられません。このため，排他モードは，内部的に発行するSQL文および実行環境によってRDBシステムの規定に従います。

ただし，HiRDBによる索引編成ファイルでは，固有のファイル共用を使用できます。詳細は，「(4)　HiRDBによる索引編成ファイル固有のファイル共用」を参照してください。

HiRDBによる索引編成ファイルを使用するプログラムと，SQLを使用するプログラムを，同じ実行環境中に混在できません。

HiRDBによる索引編成ファイルを使用するプログラムは，OpenTP1環境下で使用できません。

トランザクション管理機能を使用しないで複数のファイルを同時に開いた場合，すべてのファイルを閉じるまでファイルに対しての追加・変更は反映されません。このため，追加書きしたレコードは，すべてのファイルを閉じるまで入力できません。

複数の表を結合するビュー表に対して行の追加，更新，および削除はできません。

データ型が文字型（CHAR，VARCHAR，NCHAR，NVARCHAR，MCHAR，MVARCHAR）の列に対応させたデータ項目に，LOW-VALUEを使用できます。

レコードキーのデータが重複している場合，START文やREAD文で重複したレコードキー値に位置づけた状態でREAD文を実行すると，そのあとに読み込まれるレコードの順序が不定となります。

START文で次の指定を用いて位置づけた場合，そのあとに実行されるREAD文は，常にキーの降順呼び出しとなります。

LESS THAN

LESS THAN OR EQUAL TO

NOT GREATER THAN

<

=<

NOT >

LAST指定

レコードキーに指定した内部10進項目の照合順序は，文字属性の照合順序ではなく，数値の照合順序となります。

レコード中に次のデータが含まれる場合，入出力結果は保証しません。

レコード長が短い場合，または長い場合

読み込むレコード中にナル値が含まれる場合

書き出すレコード中に次のデータが含まれる場合

a.データ項目の文字列長，またはデータ長の値が1より小さい

b.DATEデータ型の列に対応させたデータ項目の値がLOW-VALUEである。

c.内部10進項目で定義したデータ項目の値が0で，かつ符号ビットが0である。

レコード中に保証されないデータが含まれるかどうかをチェックする機能があります。詳細は，「(5)　その他の拡張機能」の「(b)　データチェック機能」を参照してください。

データ型がBLOBの列に対応するレコードの項目は，キーにできません。

READ文，WRITE文，およびREWRITE文で重複キーを検知する場合，次の点に注意してください。

HiRDBによる索引編成ファイルの入出力では，ALTERNATE RECORD KEY句のDUPLICATES指定は覚え書きとなります。そのため，重複キーを検知するには，インデクス定義時のCREATE INDEXでUNIQUEを指定する必要があります。

CREATE INDEXの詳細は，「HiRDBのSQLリファレンスマニュアル」を参照してください。

重複キーを検知するとき，インデクス定義でのUNIQUE指定の有無によって，入出力状態値が次のように異なります。

手続き文

HiRDBによる索引編成ファイルの場合

ISAMによる索引編成ファイルの場合

インデクス定義あり

インデクス

定義なし

DUPLICATES

指定あり

DUPLICATES

指定なし

UNIQUE指定あり

UNIQUE指定なし

READ文

00

00

00

02

00

REWRITE文

22

00

00

02

22

WRITE文

22

00

00

02

22

合成キーを使用するときは，CREATE INDEXで並べる列の順序と，合成キーに指定する項目の順序が一致している必要があります。順序が一致していないと，動作は保証しません。

(d)　物理的制限事項の相違点

HiRDBによる索引編成ファイルの制限値を，次に示します。

キーに関する制限値

主レコードキーの最大長：255バイト

副レコードキーの最大長：255バイト

副レコードキーの最大定義個数：98個

合成キーを構成する最大項目数：8個

合成キーを構成する項目の合計最大長：255バイト

同一実行環境中でRDBアクセスする索引編成ファイルの数

同一実行環境中でRDBアクセスする索引編成ファイルの数は，最大63個です。

また，HiRDBのシステム定義のpd_max_access_tables（同時に使用する表の数）に，使用するファイル数以上の値を指定しておく必要があります。

レコード長

定義できるレコード長は，65,535バイト以内です。

ただし，CREATE TABLE定義にFIXの指定がある場合は，CREATE TABLE定義の<FIX指定のある表>の列の長さの合計式に従います。CREATE TABLE定義の詳細は，「HiRDBのSQLリファレンスマニュアル」のCREATE TABLE定義の説明を参照してください。

作成できる列の数

HiRDBの一つの表に作成できる列の数は，最大4,000です。

(3)　HiRDBサーバの設定での注意事項

(a)　環境変数PDSWAITTIMEの設定によるサーバの最大待ち時間の設定時の注意事項

HiRDBシステムでは，HiRDBによる索引編成ファイルを使用するクライアントからの要求に対する応答を返してから，次にクライアントから要求があるまでのHiRDBシステムの最大待ち時間を，環境変数PDSWAITTIMEに秒単位で指定できます。

次に，環境変数PDSWAITTIMEを設定する場合の注意事項を示します。

環境変数PDSWAITTIMEに指定した時間での監視は，トランザクション開始から終了までの間，行われます。トランザクションについては，「(1)　トランザクション管理機能」を参照してください。

実行中のHiRDBシステムでは，指定した時間内にクライアントから次の要求が来ない場合，COBOLプログラムに異常が発生したものとみなし，トランザクションをロールバックします。

環境変数PDSWAITTIMEに0を指定した場合，HiRDBシステムは，クライアント（COBOLプログラム）からの応答があるまで待ち続けます。

ブロック転送機能を使用する場合，HiRDBシステムからブロック転送されてきたレコードがなくなるまで，クライアント（COBOLプログラム）内で入力処理が行われます。このため，入力処理が終了するまで，クライアントからHiRDBシステムに要求しません。したがって，ブロック転送機能を使用する場合，環境変数PDSWAITTIMEにはブロック転送文の入力処理時間を含めた値を設定してください。

環境変数PDSWAITTIMEの詳細は，「HiRDBのUAP開発ガイドマニュアル」を参照してください。

(b)　環境変数PDDDLDEAPRPEXEの設定時の注意事項

COBOLプログラム実行中に，環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行しないでください。環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行した場合，先行トランザクションの前処理が無効となるため，COBOLの管理情報との不整合が発生し，予期しない実行時エラーが発生するおそれがあります。

環境変数PDDDLDEAPRPEXEの詳細は，「HiRDBのUAP開発ガイドマニュアル」を参照してください。

(c)　COBOLプログラムの異常終了時の対処

COBOLのプログラムが異常終了した場合，プロセスが待ち状態となります。待ち状態となったプロセスは，次の方法で終了させてください。

環境変数PDSWAITTIMEの設定によるトランザクションのロールバック

HiRDBサーバ側で，環境変数PDSWAITTIMEにサーバの最大待ち時間を設定しておき，トランザクションをロールバックさせる。

PDCANCELコマンドによる強制終了

PDCANCELコマンドを入力してプロセスを強制終了させる。

PDCANCELコマンドの詳細については，「HiRDBのコマンドリファレンスマニュアル」を参照してください。

(4)　HiRDBによる索引編成ファイル固有のファイル共用

HiRDBによる索引編成ファイルでは，ほかのファイル編成とは異なり，固有のファイル共用を使用できます。ここでは，HiRDBによる索引編成ファイル固有のファイル共用について説明します。

指定形式

CBLRDBILWAIT=YES

機能

環境変数CBLRDBILWAITにYESを指定すると，ファイルを入力モードで開いたとき，内部的に発行されるSELECT文に対して「WITHOUT LOCK WAIT」の排他オプションを付けられます。排他オプションの詳細については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

(5)　その他の拡張機能

HiRDBによる索引編成ファイルでは，次の拡張機能を使用できます。

(a)　出力ファイルの高速オープン機能

出力モードでファイルを開く場合，すでにファイル内にあるレコードを高速で削除したいときは，環境変数CBLD_ファイル名にRDBOPURGEを指定するか，または環境変数CBLRDBOPURGEにYESを指定してください。

指定形式（ファイル単位に指定する方法）

CBLD_ファイル名={ RDBOPURGE | NORDBOPURGE }

機能

RDBOPURGEを指定した場合，実行単位中の任意のファイルに対してOUTPUTモードでファイルを開いたときに，すべてのデータを削除するために内部的に発行するSQL文をPURGE TABLEで行います。このとき，暗黙的にCOMMIT文を実行して現行のトランザクションを終了させるので，ほかのファイルをOPENしているときなどは注意してください。

PURGE TABLEの詳細については，マニュアル「HiRDBのSQLリファレンスマニュアル」を参照してください。

NORDBOPURGEを指定した場合，この機能は無効になります。

指定形式（実行単位中のすべてのファイルに指定する方法）

CBLRDBOPURGE=YES

機能

CBLRDBOPURGE=YESを指定した場合，実行単位中のすべてのファイルに対してOUTPUTモードでファイルを開いたときに，すべてのデータを削除するために内部的に発行するSQL文をPURGE TABLEで行います。このとき，暗黙的にCOMMIT文を実行して現行のトランザクションを終了させるので，ほかのファイルをOPENしているときなどは注意してください。

PURGE TABLEの詳細については，マニュアル「HiRDBのSQLリファレンスマニュアル」を参照してください。

環境変数CBLRDBOPURGEにYESの指定がないか，またはYES以外を指定した場合は，この機能は無効になります。

規則

ファイル単位に指定する方法と実行単位中のすべてのファイルに指定する方法を併用した場合，ファイル単位に指定する方法が優先されます。次に指定の組み合わせによる動作を示します。

CBLRDBOPURGE

CBLD_ファイル名

RDBOPURGE

NORDBOPURGE

指定なし

YES

○

×

○

環境変数指定なし，またはYES以外

○

×

×

（凡例）

○：出力ファイルの高速オープン機能は有効

×：出力ファイルの高速オープン機能は無効

(b)　データチェック機能

入出力時，レコード中に保証されないデータが含まれているかどうかをチェックする場合は，環境変数CBLRDBDATAERRを指定します。

指定形式

CBLRDBDATAERR=YES

機能

環境変数CBLRDBDATAERRにYESを指定すると，レコード中に次のような保証されないデータが含まれていないかがチェックされ，含まれていた場合にはKCCC8353R-Sの入出力エラーが出力されます。

（入出力が保証されないデータ）

レコード長が短い場合，または長い場合

読み込むレコード中にナル値※が含まれる場合

書き出すレコード中に次のデータが含まれる場合

・データ項目の文字列長またはデータ長が1より小さい

・DATEデータ型の列に対応させたデータ項目の値がLOW-VALUEである

・内部10進データ項目で，値が0かつ符号ビットが0である

注※

ナル値については，「HiRDBのSQLリファレンスマニュアル」を参照してください。

(c)　内部発行されるSQL文で行値構成子を使用する機能

HiRDBによる索引編成ファイルを使用した入出力で，実行時環境変数CBLRDBROWVALCONSTRUCTORが指定されているとき，COBOL2002が内部で発行するSQLのSELECT文で行値構成子を使用します。行値構成子を使用すると，次の条件すべてに該当する場合に，性能の向上が見込めます。

主レコードキー，または副レコードキーに合成キーが指定されていて，合成キーを構成する項目の個数が多い。

合成キーを構成する項目がHiRDBでインデクス定義されている。

HiRDBのインデクス定義がメモリ上だけで処理されない（ディスクの実I/Oが発生する）。

START文，NEXT指定のREAD文を繰り返す，またはKEY指定のREAD文を繰り返す。

この機能を使用するには，COBOLプログラム実行時にアクセスするHiRDBのバージョンが行値構成子をサポートしていることが前提です。サポートしていない場合は，動作は保証しません。

指定形式

CBLRDBROWVALCONSTRUCTOR=YES

機能

環境変数CBLRDBROWVALCONSTRUCTORにYESを指定すると，複数のキーを使用して入出力する場合，実行時ライブラリが内部で発行するSQLのSELECT文に行値構成子が使用されます。

行値構成子が使用される条件

主レコードキーまたは副レコードキーに合成キーが指定されていて，合成キーを構成する項目の数が2個以上である。

1.のキーを指定したファイルに対して，次のどれかの文を実行した。

・START文。ただし，FIRST指定，LAST指定のSTART文は除く。

・KEY指定のREAD文。

・乱アクセスまたは動的アクセスのREWRITE文，DELETE文で直前の入出力文がREAD文でない場合。

行値構成子を使用することで実行結果が変わることはありません。

環境変数CBLRDBROWVALCONSTRUCTORにYES以外を指定した場合は，この機能は有効になりません。その場合，内部で発行するSQL文に行値構成子は使用されません。

6.9.6　プログラムのコンパイルと実行

HiRDBによる索引編成ファイルを使用するプログラムのコンパイル，および実行方法について説明します。

(1)　プログラムのコンパイル方法

HiRDBによる索引編成ファイルを使用するプログラムのコンパイル方法を，次に示します。

形式（COMMIT／ROLLBACK文をHiRDBによる索引編成ファイルに適用しない場合）

ccbl2002 ファイル名 …

形式（COMMIT／ROLLBACK文をHiRDBによる索引編成ファイルに適用する場合）

ccbl2002 -RDBTran ファイル名 …

注意事項

HiRDBによる索引編成ファイルを使用するプログラムのコンパイル時には，コンパイラ環境変数CBL_RDBSYSの指定も必要です。詳細は「6.9.1　プログラムの作成方法」を参照してください。

COMMIT／ROLLBACK文は，-RDBTranオプションの指定がある場合や，翻訳単位にHiRDBによる索引編成ファイルの入出力の指定がある場合はHiRDBによる索引編成ファイルに適用されます。ただし，DCシミュレーション機能と混在する場合はエラーとなります。それ以外はDCシミュレーション機能に適用されます。

-RDBTranオプションの指定と，プログラムの記述によるCOMMIT／ROLLBACK文の扱いを次に示します。

表6‒9　-RDBTranオプションの指定とCOMMIT／ROLLBACK文の扱い

プログラムの記述

通信節

ファイル管理記述項

HiRDBによる索引編成ファイル（RDB）あり

HiRDBによる索引編成ファイル（RDB）なし

オプションの指定

-RDBTran指定あり

データコミュニケーション機能なし

RDBに適用

RDBに適用

データコミュニケーション機能あり

Sレベルエラー

Sレベルエラー

-RDBTran指定なし

データコミュニケーション機能なし

RDBに適用

DCに適用

データコミュニケーション機能あり

Sレベルエラー

DCに適用

（凡例）

RDBに適用：HiRDBによる索引編成ファイルのCOMMIT／ROLLBACK文となる

DCに適用：DCシミュレーション機能のCOMMIT／ROLLBACK文となる

Ｓレベルエラー：コンパイル時に重大エラーとなる

(2)　プログラムの実行方法

HiRDBによる索引編成ファイルを使用するプログラムは，次の手順で実行してください。

HiRDBのサーバを起動する

HiRDBのクライアントの環境変数，またはHiRDB.iniで，PDHOST，PDUSER，PDNAMEPORTの値をサーバ環境に合わせて設定する

HiRDBによる索引編成ファイルを使用したCOBOLプログラムを実行する

6.9.7　プログラム作成時の留意点

HiRDBによる索引編成ファイルを使用するプログラムで，処理速度の速いプログラムを作成する場合の留意点を示します。

動的アクセス（DYNAMIC）を使用しない

理由

動的アクセスでKEY指定のREAD文を実行すると，該当レコードの読み込みと同時に以降のレコードの読み込み準備をするため，処理に時間が掛かります。

対策

KEY指定のREAD文で読み込んだレコードの次のレコードを読み込む必要がなければ，乱アクセス（RANDOM）でのKEY指定のREAD文を使用してください。乱アクセスでのKEY指定のREAD文を使用すると，以降のレコードの読み込み準備が不要なため，処理時間を短縮できます。

I-Oモードでファイルを開かない

理由

I-Oモードでファイルを開くと，更新を前提とするSQL文でRDBアクセスが行われるため，処理に時間が掛かります。

対策

DELETE文，REWRITE文，またはWRITE文でレコードを更新する必要がない場合は，INPUTモードでファイルを開いてください。更新を前提としないSQL文でRDBにアクセスできるので，処理時間を短縮できます。

START文を使用しない

理由

START文を使用すると，該当するキー条件に一致するデータを検索したあと，NEXT指定のREAD文でレコードを読み込めるように，以降のレコードの読み込み準備をするため，処理に時間が掛かります。

対策

START文およびNEXT指定のREAD文でのレコードの読み込みをKEY指定のREAD文で代替できる場合は，KEY指定のREAD文を使用してください。KEY指定のREAD文を使用すると，以降のレコードの読み込み準備が不要なため，処理時間を短縮できます。

キーに使用する項目（列）を一つにする

理由

複数のキーを使用して入出力をすると，それぞれのキーで関連づけをするため，OPEN文，START文実行後の最初のREAD文，およびKEY指定のREAD文の処理に時間が掛かります。

対策

使用するキーの数を減らしてください。データの関連づけに掛かる時間を短縮できます。

環境変数CBLD_ファイル名=RDBOPURGEまたは環境変数CBLRDBOPURGE=YESを指定する

理由

ファイルをOUTPUTモードでオープンする場合，ファイル中のすべてのデータが削除されます。このとき，多量のデータがあると，データの削除に時間が掛かります。

対策

ファイルをOUTPUTモードでオープンする場合は，環境変数CBLD_ファイル名=RDBOPURGEまたは環境変数CBLRDBOPURGEにYESを指定してください。データを削除するために内部的に発行するSQL文にPURGE TABLEを使用することで削除の時間を短縮することができます。

6.10　Btrieve（Pervasive.SQL）による索引編成ファイル（Windows(x86) COBOL2002で有効）

COBOL2002では，Pervasive.SQL，またはBtrieveで作成されたBtrieve形式のファイルを，索引編成ファイルの言語仕様でアクセスできます。ここでは，Btrieve（Pervasive.SQL）による索引編成ファイルの使用方法について説明します。

索引編成ファイルについては，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.7(3)　索引編成」を参照してください。

6.10.1　前提条件とプログラムの作成方法

(1)　前提条件

Btrieveファイルを使用するには，次の前提条件を満たしている必要があります。

Pervasive.SQL，Btrieveのサーバ／クライアント版，またはスタンドアロン版のどれかが組み込まれていて，動作していること

Pervasive.SQL，Btrieveアプリケーションがアクセスできる状態になっていること

(2)　プログラムの作成方法

Btrieve（Pervasive.SQL）による索引編成ファイルを使用するには，-IsamExtendオプションまたは-IsamExtend,Zoneオプションを指定してプログラムをコンパイルする必要があります。-IsamExtendオプションおよび-IsamExtend,Zoneオプションを指定しない場合は，ISAMによる索引編成ファイルを使用します。

6.10.2　ファイルの作成と割り当て方法

Btrieve（Pervasive.SQL）による索引編成ファイルの作成方法と割り当て方法について説明します。

(1)　ファイルの作成方法

Btrieve（Pervasive.SQL）による索引編成ファイルは，次の方法で作成できます。

COBOLの入出力機能

BtrieveでアクセスするCプログラムなどによるファイル作成

Btrieveユティリティ

(2)　ファイルの割り当て方法

「6.2　ファイル割り当ての共通規則」に従って，物理ファイル名を割り当ててください。

物理ファイル名には，OSのファイルシステム上で有効となるファイル名を指定してください。

6.10.3　ファイル編成とレコード形式

Btrieve（Pervasive.SQL）による索引編成ファイルでは，固定長と可変長のレコード形式が使用できます。なお，ファイルはPervasive.SQL，Btrieveが定めるファイル形式で構成されています。

通常，Btrieve（Pervasive.SQL）による索引編成ファイルはヘッダページ，インデクスページ，データページの3種類で構成されます。Btrieve（Pervasive.SQL）による索引編成ファイルの構成を次に示します。

図6‒5　Btrieve（Pervasive.SQL）による索引編成ファイルの構成

6.10.4　使用できる機能と制限事項

Btrieve（Pervasive.SQL）による索引編成ファイルで使用できる機能と，制限事項を次に示します。

(1)　使用できる機能

Btrieve（Pervasive.SQL）による索引編成ファイルでは，次の機能が使用できます。

(a)　入出力手続き文

OPEN文，CLOSE文，READ文，WRITE文，REWRITE文，DELETE文，START文，UNLOCK文が使用できます。

(b)　ファイル共用

ファイル排他，レコード施錠が使用できます。レコード施錠としては，自動単一レコード施錠，手動複数レコード施錠のどちらも使用できます。

(c)　合成キー

1〜8個の項目が指定できます。項目の合計は255バイト以下でなければなりません。

(d)　逆順読み

PREVIOUS指定のREAD文が指定されたとき，Btrieve（Pervasive.SQL）による索引編成ファイルの逆順読みができます。

(e)　キー属性

RECORD KEY句，またはALTERNATE RECORD KEY句のデータ名の項類が英数字項目以外のとき，次の規則に従って主レコードキーおよび副レコードキーの一致，不一致を判定します。

主レコードキーまたは

副レコードキーの項類

キーの判定属性

-IsamExtend指定

（Zoneサブオプションなし）

-IsamExtend,Zone指定

（Zoneサブオプションあり）

固定長集団項目

文字

文字

外部10進項目

文字

外部10進項目※

内部10進項目

文字

文字

外部浮動小数点数字項目

文字

文字

数字編集項目

文字

文字

英字編集項目

文字

文字

英字項目

文字

文字

日本語項目

文字

文字

2進項目（2バイト）

2バイト固定小数点

2バイト固定小数点

2進項目（4バイト）

4バイト固定小数点

4バイト固定小数点

内部浮動小数点数字項目（4バイト）

単精度浮動小数点

単精度浮動小数点

内部浮動小数点数字項目（8バイト）

倍精度浮動小数点

倍精度浮動小数点

注※

外部10進項目キーでBtrieve（Pervasive.SQL）による索引編成ファイルに対して入出力する場合，COBOLで定義された外部10進項目キーはBtrieveファイルで定義されたNumeric属性キーに相当します。ただし，符号付き外部10進項目に関するコード体系が異なるため，入出力時には「図6‒6　COBOL外部10進項目からBtrieveファイルのNumeric属性への変換テーブル」「図6‒7　BtrieveファイルのNumeric属性からCOBOL外部10進項目への変換テーブル」に示す変換テーブルに従って，自動的に最右端1バイトをコード変換します。

また，外部10進項目キーにSIGN LEADING指定，SIGN SEPARATE指定がある場合は，文字として扱われます。

図6‒6　COBOL外部10進項目からBtrieveファイルのNumeric属性への変換テーブル

図6‒7　BtrieveファイルのNumeric属性からCOBOL外部10進項目への変換テーブル

(2)　物理的制限事項

Btrieve（Pervasive.SQL）による索引編成ファイルの物理的制限事項を，次に示します。なお，詳細については，Pervasive.SQL，Btrieveのマニュアルを参照してください。

最大レコード長

固定長の場合：ページサイズ-8（ページ情報）

可変長の場合：65,535バイト

ただし，NetWare(R)サーバの場合，57,000バイトです。

Btrieve（Pervasive.SQL）による索引編成ファイルで使用するページサイズは，環境変数CBL_BTRPGSZで指定できます。指定できる値は，512〜4,096までのうちで512の倍数です。512の倍数でない場合は，512の倍数に切り上げられます。

(3)　機能的制限事項

Btrieve（Pervasive.SQL）による索引編成ファイルの機能的制限事項を，次に示します。

(a)　DATA FORMAT句

Btrieve（Pervasive.SQL）による索引編成ファイルでは，UNIXのデータにアクセスできません。このため，DATA FORMAT句を使用したプログラムに-IsamExtendオプションまたは-IsamExtend,Zoneオプションを指定してコンパイルすると，エラーになります。

(b)　セキュリティ

ファイル共用は使用できますが，Btrieve（Pervasive.SQL）のオーナ　ネームは使用できません。したがって，ファイルにアクセスする場合は，オーナと同等の権限が必要となります。

(c)　OUTPUTモードの追加書き

OUTPUTモード指定の場合，ファイルの追加書きはしません。常にファイルを再作成します。

(d)　重複キーの検出

副レコードキーの重複を許すようにした場合，キーが重複していても検出できません。

(4)　ISAMによる索引編成ファイルとの相違点

Btrieve（Pervasive.SQL）による索引編成ファイルとISAMによる索引編成ファイルとの相違点を，次に示します。

参照キーを更新した場合，後行のREAD文NEXT指定またはREAD文PREVIOUS指定は，更新されたキーで次のレコードを入力します。

順アクセスで入力したレコードを削除した場合，ファイル位置指示子が不定となり，後行のREAD文NEXT指定またはREAD文PREVIOUS指定が実行時エラーとなります。

ほかで使用中のファイルをOUTPUT指定のOPEN文で実行した場合，ファイル排他が検知できません。この場合，オープンエラーとなります。

ほかで施錠しているレコードに対して，施錠指定のないREAD文を実行した場合，施錠エラーが検知できません。

START文のKEY指定には，レコードキーとして指定したデータ名を指定してください。レコードキーとして指定していないデータ名を指定した場合，コンパイルエラーとなります。

START文で位置づけられたレコードを削除したり，レコードの参照キーを変更した場合，あとに続くREAD文NEXT指定やREAD文PREVIOUS指定の動作は保証しません。

6.11　ラージファイル入出力機能

ラージファイル入出力機能を使用すると，ファイルサイズが2GB以上のファイル（ラージファイル）に対する入出力ができます。

6.11.1　ラージファイル入出力機能の概要

次のファイルの場合，ファイルサイズが2GB以上のファイル（ラージファイル）であっても，COBOLプログラムから入出力できます。ラージファイルの入出力方法は，通常のファイル（ファイルサイズが2GB未満のファイル）と同じです。

ラージファイルで，入出力できるファイルサイズはファイルシステムに依存します。

(1)　使用できるファイルの種類

ファイル編成

ラージファイル入出力機能は，次のファイル編成で使用できます。

Windows(x86) COBOL2002の場合

順編成ファイル

テキスト編成ファイル

CSV編成ファイル

ISAMによる索引編成ファイル

なお，ISAMによる索引編成ファイルについては実行時環境変数の指定が必要です。詳細は，「6.11.2　ISAMによる索引編成ファイルでのラージファイル入出力機能（Windows(x86) COBOL2002で有効）」を参照してください。

ファイルサイズの詳細は，マニュアル「索引順編成ファイル管理ISAM」を参照してください。

Windows(x64) COBOL2002の場合

順編成ファイル

テキスト編成ファイル

CSV編成ファイル

ファイルシステム

ラージファイルを使用するためには，ファイルシステムの属性がラージファイルに対応している必要があります。ファイルシステム属性については，システムのマニュアルを参照してください。

また，作成できるファイルサイズについては，システム資源の制限が設定されている場合があります。

6.11.2　ISAMによる索引編成ファイルでのラージファイル入出力機能（Windows(x86) COBOL2002で有効）

ISAMによる索引編成ファイルでラージファイル入出力機能を使用するためには，実行時環境変数を指定します。

(1)　ファイル単位に指定する方法

形式

CBLD_ファイル名=｛ ISAMLARGE ｜ NOISAMLARGE ｝

ISAMLARGEを指定した場合，ISAMによる索引編成ファイルでラージファイル入出力を可能にします。NOISAMLARGEを指定した場合は，ノーマルファイル形式のISAMによる索引編成ファイルへの入出力となります。省略時は，NOISAMLARGEが仮定されます。

ISAMLARGE

ISAMによる索引編成ファイルに対して，ラージファイル形式のファイル入出力機能が有効になります。

NOISAMLARGE

ISAMによる索引編成ファイルに対して，ノーマルファイル形式のファイル入出力を行います。

(2)　実行単位中のすべてのファイルに指定する方法

形式

CBLISAMLARGE=YES

入出力するISAMによる索引編成ファイルに対して一括でラージファイル形式を指定する場合，この実行時環境変数にYESを指定します。この実行時環境変数にYES以外の値を指定した場合，この実行時環境変数は無効となります。

(3)　注意事項

ISAMによる索引編成ファイルでラージファイル入出力機能使用時の注意事項を次に示します。

すでに存在するISAMによる索引編成ファイルに対してINPUT指定，I-O指定，EXTEND指定でOPEN文を実行する場合，実行時環境変数CBLISAMLARGEまたは実行時環境変数CBLD_ファイル名のISAMLARGEオプションに指定したファイルの形式と異なるとき，ファイルが存在しないエラー（KCCC4618R-S）となります。

ノーマルファイル形式のファイルに対してラージファイル形式を指定したとき。

ラージファイル形式のファイルに対してノーマルファイル形式を指定したとき。

実行時環境変数CBLD_ファイル名にISAMLARGEとNOISAMLARGEを同時に指定した場合，あとから指定したオプションが有効となります。

実行時環境変数CBLD_ファイル名と実行時環境変数CBLISAMLARGEを同時に指定した場合は，CBLD_ファイル名が優先されます。

実行時環境変数CBLD_ファイル名および実行時環境変数CBLISAMLARGEの指定時に適用されるファイル形式を表6-10に示します。

表6‒10　実行時環境変数CBLD_ファイル名および実行時環境変数CBLISAMLARGEの指定時に適用されるファイル形式

実行時環境変数

CBLISAMLARGE

実行時環境変数CBLD_ファイル名

ISAMLARGE

NOISAMLARGE

指定なし

YES

ラージファイル形式

ノーマルファイル形式

ラージファイル形式

YES以外，または

指定なし

ラージファイル形式

ノーマルファイル形式

ノーマルファイル形式

ノーマルファイル形式の索引編成ファイルから，ラージファイル形式の索引編成ファイルに切り替えるには，マニュアル「索引順編成ファイル管理ISAM」の「ノーマルファイル形式からラージファイル形式への移行手順」を参照してください。

6.11.3　通常の入出力との互換性

ラージファイル入出力機能では，既存のファイルをラージファイルとして入出力することができます。ただし，ISAMによる索引編成ファイルのラージファイル入出力機能では，すでにノーマルファイル形式のファイルが存在する場合（拡張子が.kdf，.k01〜.k99，または.drfのファイル）はOPEN文でエラー（KCCC4618R-S）となります。

6.11.4　ラージファイル入出力機能でのファイルの共用

Windows(x86) COBOL2002の場合

次のファイルの場合，ラージファイルでもファイルサイズが2GB未満のファイルと同様にファイル共用を使用できます。

順編成ファイル

ISAMによる索引編成ファイル

Windows(x64) COBOL2002の場合

順編成ファイルの場合，ラージファイルでも通常のファイル（ファイルサイズが2GB未満のファイル）と同様にファイル共用を使用できます。

6.11.5　ラージファイル入出力機能の制限事項

相対編成ファイルの場合，COBOL入出力サービスルーチンを使用してラージファイルに対する入出力はできません。

ISAMによる索引編成ファイルでは，ラージファイル形式の索引編成ファイルをリモートアクセス機能で使用できません。

7　ファイル共用（ファイルシェア）

この章では，COBOLプログラムでのファイル共用の方法について説明します。

7.1　ファイル共用（ファイルシェア）の概要

ファイル共用（ファイルシェア）とは，マルチユーザ環境でユーザ間のファイルを共用する機能です。この機能を使用すると，データの更新時にレコードまたはファイル全体を，ほかのCOBOLプログラムと共用したり保護したりできます。また，マルチスレッド環境でのファイル共用（ファイルシェア）機能は，マルチスレッド対応COBOLプログラムに対応します。

表7‒1　ファイル共用を使用できるファイル編成

ファイル編成

ファイル共用

備考

ファイルレベル

レコードレベル

順ファイル

○

○

順ファイルの場合，ラージファイルであってもファイル共用を使用できる。

相対ファイル

○

○

ISAMによる索引編成ファイル

○

○

Btrieveによる索引編成ファイル※

○

○

詳細は「7.2.6　Btrieve（Pervasive.SQL）による索引編成ファイル（Windows(x86) COBOL2002で有効）」を参照。

テキストファイル

×

×

CSVファイル

×

×

HiRDBによる索引編成ファイル

HiRDBによる索引編成ファイル固有のファイル共用を使用できる。

詳細は「6.　ファイル入出力機能」を参照。

（凡例）

○：ファイル共用が使用できる

×：ファイル共用が使用できない

注※

Windows(x86) COBOL2002だけで使用できます。

7.2　ファイル共用の詳細

ファイル共用の詳細について説明します。

ファイル共用については，マニュアル「COBOL2002　言語　拡張仕様編」　「3.　ファイル共用機能」を参照してください。

7.2.1　ファイルレベルのファイル共用

ファイルは，常に次の活性状態か不活性状態のどちらかの状態にあります。

活性状態

ファイルが一つ以上の実行単位に対して開かれている状態

不活性状態

どの実行単位からも開かれていない状態

活性状態のファイルは，ほかの実行単位からOUTPUTモードで開けません。存在しないファイルは，OUTPUTモードで自動的に生成されますが，このファイルはほかのCOBOLプログラムとは共用できません。

活性状態のファイルのモードには，次に示す排他モードと共用モードの二つがあります。

(1)　排他モード

排他モードのファイルは，一つの実行単位に対してだけ開かれています。ほかの実行単位がこのファイルを使用しようとしても，ファイル施錠のエラーが返り，使用が拒否されます。

排他モードでは，ファイルが一つの実行単位に対して施錠され，その実行単位だけがファイルを使用できます。この実行単位がファイルを閉じるとファイルの施錠は解除されます。

(2)　共用モード

共用モードのファイルは，複数のプログラムから使用できます。各実行単位がファイルを使うとき，一つまたは複数のレコード単位に施錠すれば，データを保護できます。

次に，ファイルレベルのファイル共用の例を示します。

プログラムXが，排他モードでファイル'MASTER1'を開きます。

プログラムYが'MASTER1'を開こうとしますが，すでにプログラムXが排他モードで開いているため，OPEN文は失敗します。このとき，入出力状態には93が返されます。

7.2.2　レコードレベルのファイル共用

(1)　ファイルの開き方による相違

INPUTモードで開かれたファイルは共用できますが，ファイルのレコードは施錠できません。I-OまたはEXTENDモードで開かれたファイルは共用できます。

ファイルをEXTENDモードで開いている間に，ほかのファイル単位がINPUTまたはI-Oモードで同じファイルを開いた場合，完全な論理ファイル（EXTENDモードで追加したレコードを含めた論理ファイル）のレコードを読み込めます。しかし，EXTENDモードで開かれたほかの実行単位については，レコード施錠によってレコードの出力を防げません。

INPUTモードで開かれた共用ファイルは，ほかのファイル単位からのレコードの参照，更新を防げません。ファイルをEXTENDモードで開いている間に，ほかのファイル単位がINPUTまたはI-Oモードで開いてレコードを読み込もうとした場合，EXTENDモードで出力されたレコードについては，読み込みが保証されます。ただし，LOCK MODE句の指定のないINPUTモードの場合，読み込みは保証しません。

ほかのファイル単位がEXTENDモードで開かれた場合に，双方に追加されるレコードの内容については，マニュアル「COBOL2002　言語　拡張仕様編」　「3.　ファイル共用機能」を参照してください。

(2)　レコード施錠

単一のレコードを施錠する場合と複数のレコードを施錠する場合についてそれぞれ説明します。

(a)　単一レコード施錠

単一レコード施錠を指定した実行単位は，一つのファイル内に一つだけのレコード施錠を取得できます。

単一レコード施錠では，レコード施錠の解放をUNLOCK文で指定できます。また，新しいレコードを施錠すると，それまでのレコード施錠は自動的に解放されます。同じ実行単位でレコード施錠が解放される条件を次に示します。

START文以外の入出力文が成功したとき

ファイルを閉じたとき

START文ではレコード施錠は解放されません。また，レコード施錠の取得，解放に失敗したとき，レコード施錠の状態は保証しません。

次に，単一レコード施錠の例を示します。

プログラムXが，共用モードでファイル'MASTER1'を開きます。

READ文が実行されると，1番目のレコードが施錠されます。

次のREAD文が実行されると，1番目のレコードの施錠が解除され，2番目のレコードが施錠されます。

プログラムYが，共用モードでファイル'MASTER1'を開きます。

READ文が実行されると，1番目のレコードが施錠されます。

READ文が実行されますが，2番目のレコードはプログラムXによって施錠されているため，READ文は失敗します。

(b)　複数レコード施錠

複数レコード施錠を指定した実行単位は，一つのファイルに複数のレコード施錠を同時に取得できます。施錠されたレコードはほかの実行単位から使用できませんが，施錠されていないレコードは使用できます。

複数レコード施錠は，相対または索引ファイルにだけ使用できます。相対ファイルの場合，施錠できるレコード数に限りがあり，このレコード数は環境変数CBL_RECLOCKMAXで指定します。

形式

CBL_RECLOCKMAX=レコード数

「レコード数」には施錠したいレコード数を指定します。指定できる値は0〜999,999,999です。なお，指定した値に比例してメモリが消費されますので，実レコード数に見合った値を指定してください。

この環境変数を指定していない場合，および「0」を指定した場合は，「50」が仮定されます。

この環境変数に指定した値よりも多くのレコード施錠を要求した場合は実行時エラーとなります。

複数レコード施錠は，LOCK MODE句にMANUALを指定し，WITH LOCK指定のREAD文を実行するごとにレコード単位で取得できます。WITH LOCK指定のないREAD文を実行した場合，レコード施錠は取得されません。このときでも，取得済みのレコード施錠は解放されません。

同じ実行単位でレコード施錠が解放される条件は次のとおりです。

ファイルに対してUNLOCK文を実行したとき

ファイルを閉じたとき

レコード施錠の取得，解放に失敗したとき，レコード施錠の状態は保証しません。

また，COBOL入出力サービスルーチンで作成した相対ファイルでも，複数レコード施錠を使用できます。

7.2.3　ファイルの排他・共用の区別

ファイルの排他・共用の区別を次に示します。

表7‒2　ファイルの排他・共用の区別

OPENモード

INPUT

I-O

OUTPUT

EXTEND

WITH LOCK指定

あり

なし

あり

なし

あり

なし

あり

なし

LOCK MODE句の指定

なし

×

○

×

×

×

×

×

×

EXCLUSIVE

×

×

×

×

×

×

×

×

AUTOMATIC

×

○

×

○

×

×

×

○※

MANUAL

×

○

×

○

×

×

×

○※

（凡例）

○：共用

×：排他

注※

EXTENDモードで開かれ共用されているファイルに対して追加書きする場合は，複数のプログラムから実行しないようにしてください。詳細については，マニュアル「COBOL2002　言語　拡張仕様編」　「3.2.8　WRITE文（ファイル共用機能）」の説明を参照してください。

7.2.4　各実行単位の施錠形式

(1)　順編成ファイル，相対編成ファイル，ISAMによる索引編成ファイルの場合

順編成ファイル，相対編成ファイル，ISAMによる索引編成ファイルの場合の各実行単位の施錠形式を次に示します。

注※1

索引ファイルでは，ダーティリード機能，およびレコード占有解除待ち機能が使用できます。ダーティリード機能，およびレコード占有解除待ち機能については，マニュアル「索引順編成ファイル管理　ISAM」を参照してください。

注※2

索引ファイルでは，レコード占有解除待ち機能が使用できます。レコード占有解除待ち機能については，マニュアル「索引順編成ファイル管理　ISAM」を参照してください。

注※3

順ファイルでは，ASSIGN句にLOCK MODE MANUALの指定はできません。順ファイルを対象外とします。

(2)　Btrieve（Pervasive.SQL）による索引編成ファイルの場合

Btrieve（Pervasive.SQL）による索引編成ファイルの場合の各実行単位の施錠形式を次に示します。

7.2.5　ファイル共用を省略した場合の処理

LOCK MODE句を省略した場合，そのファイルは，LOCK MODE IS EXCLUSIVEが指定されたとみなされ，ファイルレベルのファイル共用が有効となります。ファイルレベルのファイル共用については，「7.2.1　ファイルレベルのファイル共用」を参照してください。

7.2.6　Btrieve（Pervasive.SQL）による索引編成ファイル（Windows(x86) COBOL2002で有効）

Btrieve（Pervasive.SQL）による索引編成ファイルでファイル共用を使用する場合の注意事項を，次に示します。

次の場合，ファイル排他またはレコード施錠の検知はしません。

先行プロセスで排他モードで開いているファイルを，後行プロセスで共用モードで開こうとした場合。

先行プロセスで施錠を掛けているレコードに，後行プロセスで施錠のないREAD文を実行した場合。

先行プロセスで排他モードで開かれているファイルに対し，後行プロセスでレコード施錠をした場合，ファイル施錠のエラーが返ります。この場合，ファイル位置指示子は保証します。

参照キーを更新した場合，あとに続くREAD文NEXT指定またはREAD文PREVIOUS指定は，更新されたキーで次のレコードを入力します。

順アクセスで入力したレコードを削除した場合，ファイル位置指示子が不定となり，あとに続くREAD文NEXT指定またはREAD文PREVIOUS指定は，実行時エラーとなります。

ほかで使用中のファイルに対し，OUTPUT指定のOPEN文を実行した場合，ファイル排他は検知できず，オープンエラーとなります。

7.2.7　ラージファイル入出力機能でのファイルの共用

ラージファイル入出力でのファイル共用に関しては，「6.11.4　ラージファイル入出力機能でのファイルの共用」を参照してください。

7.3　ファイル共用の注意事項

書き込み権限のないフォルダ下にある順編成ファイル，相対編成ファイルを複数の実行単位からINPUTモードで開く場合，ファイル共用機能を使用してもファイル施錠のエラーを検出できません。

ファイル施錠のエラーを検出したい場合は，フォルダに対して書き込み権限を付与するか，書き込み権限のあるフォルダにファイルを移動してください。

8　プリンタへのアクセス

COBOLプログラムでは，GDIモード印刷機能，ESC/Pモード印刷機能，またはXMAP3を使用してプリンタへ出力できます。この章では，プリンタへのアクセスについて説明します。

8.1　プリンタアクセスの種類と概要

8.1.1　印刷モード

COBOLプログラムからプリンタにアクセスするには，次の3種類の方法があります。

GDIモード印刷

GDIモード印刷は，Windows固有の印刷モードです。

GDIモード印刷では，出力先のプリンタ種別を意識しないでプリンタ出力できます。また，次のような印刷制御ができます。

CHARACTER TYPE句を指定して，行データの印刷を制御できます。これによって，行の途中で文字サイズや文字間隔を変えるなど，細かな印刷制御ができます。

プリンタや印刷するファイル単位に印刷書式を作成できます。印刷書式ごとに1ページ内の行数や文字フォントサイズを指定できます。

ESC/Pモード印刷

ESC/Pモード印刷は，プリンタ固有の印刷モードでプリンタに出力するモードです。CHARACTER TYPE句での行データの印刷制御はできませんが，エスケープシーケンス文字列という機能コードを使用することで，文字の打ち出し位置，文字間隔，行間隔などを細かく操作できます。このため，定型帳票への印刷などで，ほかの印刷モードで対処できない場合に有効です。

ただし，ESC/Pモード印刷を使用した場合，エスケープシーケンス文字列を意識した出力をする必要があるため，プログラムの移植性が損なわれることがあります。

XMAP3による印刷（Windows(x86) COBOL2002で有効）

XMAP3と連携してプリンタ出力する印刷モードです。書式オーバレイやCHARACTER TYPE句での行データ印刷制御など，XMAP3の機能を使用して印刷できます。

8.1.2　プリンタアクセスで使用できるファイル編成

プリンタアクセスで使用できるファイル編成は，順編成ファイルまたはテキスト編成ファイルです。ただし，印刷モードによっては，使用できるファイル編成に制限があります。

各印刷モードで使用できるファイル編成について，次に示します。

印刷モード

順編成ファイル

テキスト編成ファイル

GDIモード印刷

○

○

ESC/Pモード印刷

○

○

XMAP3による印刷

○

×

（凡例）

○：使用できる

×：使用できない

順編成については，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.7(1)　順編成」を，テキスト編成については，マニュアル「COBOL2002　言語　拡張仕様編」　「2.1　テキスト編成」を，それぞれ参照してください。

8.2　プリンタアクセスの共通規則

すべての印刷モードで共通な規則について，次に示します。

8.2.1　ファイル割り当て

プリンタ出力をするファイルは，環境部入出力節でORGANIZATION句に順編成またはテキスト編成のどちらかを指定します。

環境入出力節でファイル編成を指定したあと，定数指定，環境変数指定，データ名指定のどれかの方法で，ASSIGN句に出力先の物理ファイル名を割り当てます。

割り当てる物理ファイル名は，印刷モードごとに異なります。詳細は，「8.4　GDIモード印刷」，「8.5　ESC/Pモード印刷」，および「8.6　XMAP3による印刷（Windows(x86) COBOL2002で有効）」を参照してください。また，ファイル割り当ての詳細については，「6.2　ファイル割り当ての共通規則」を参照してください。

定数指定，環境変数指定，データ名指定の記述例を，それぞれ次に示します。

(1)　定数指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-1 ASSIGN TO '物理ファイル名'.
           :

(2)　環境変数指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-1 ASSIGN TO PRT.
           :

注

実行時に，次の環境変数が指定されているものとします。

CBL_PRT=物理ファイル名

(3)　データ名指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-2 ASSIGN TO FILE-NAME.
           :
       WORKING-STORAGE SECTION.
       01 FILE-NAME PIC X(40).
       PROCEDURE DIVISION.
           MOVE '物理ファイル名' TO FILE-NAME.
           :

8.2.2　入出力手続き文と動作

プリンタへ行データを出力するために使用する文を次に示します。

表8‒1　入出力手続き文と動作

使用する文

印刷モード

XMAP3による印刷

GDIモード印刷

ESC/Pモード印刷

OPEN文

プリンタ出力処理の準備をする。OUTPUTモードで実行する。

プリンタ出力処理の準備をする。OUTPUTモードで実行する。

プリンタ出力処理の準備をする。OUTPUTモードで実行する。

WRITE文

1行のデータを行制御してプリンタに書き出す。

印刷データを一時ファイルに蓄積する。

1行のデータを行制御をして印刷用ファイルに書き出す。

CLOSE文

プリンタ出力処理を終了する。

蓄積された一時ファイルの印刷データをプリンタに出力する。

プリンタ出力処理を終了する。

8.2.3　行制御出力

行制御出力とは，データ部のファイル記述項にLINAGE句を指定したり，WRITE文にADVANCING／POSITIONING指定またはCHARACTER TYPE句を指定したりして，行データを制御する出力処理のことです。行制御出力は，報告書作成機能を含みます。

CHARACTER TYPE句については，マニュアル「COBOL2002　言語　拡張仕様編」　「14.2.1(1)　CHARACTER TYPE句」を，WRITE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.55　WRITE文」を，それぞれ参照してください。

(1)　順編成ファイル，テキスト編成ファイルの行制御

順編成ファイル，テキスト編成ファイルに対して行制御が実行されるのは，次の場合です。

データ部のファイル記述項にLINAGE句を指定した場合。

WRITE文にADVANCING指定，POSITIONING指定をした場合。

8.2.4　実行時環境変数で行制御を操作する方法

環境変数CBLD_ファイル名に，次の環境変数を指定すると，WRITE文の行制御指定を操作できます。

SAMAADV／NOSAMAADV

SAMAADVは，ADVANCING指定を記述しないWRITE文で自動的にAFTER ADVANCING 1 LINEが仮定されます。NOSAMAADVは，仮定されません。標準値は，NOSAMAADVです。

SAMBADV／NOSAMBADV

SAMBADVは，ADVANCING指定を記述しないWRITE文で自動的にBEFORE ADVANCING 1 LINEが仮定されます。NOSAMBADVは，仮定しません。標準値はNOSAMBADVです。この機能は，MIOS7 COBOL85互換機能です。

SAMPADV／NOSAMPADV

SAMPADVは，OPEN文の実行後，最初に実行されるAFTER ADVANCING PAGE指定のWRITE文について行制御を有効にします。NOSAMPADVは，行制御を無効にします。省略時はSAMPADVが仮定されます。

このオプション設定時には，次の注意が必要です。

SAMPADVおよびNOSAMPADVは，順編成ファイル，テキスト編成ファイルの印刷機能，書式印刷機能，および報告書作成機能※に対して有効となります。

LINAGE句が指定されている場合，SAMPADVおよびNOSAMPADVの指定は無効となります。

注※

報告書作成機能のGENERATE文は，内部的にWRITE文を使用するため，このオプションが有効になります。

8.2.5　印刷文書名称

COBOL2002の印刷機能では，印刷出力結果を一度スプールに登録します。スプールに登録する際の印刷文書名称は，COBOL2002が独自に定めるデフォルトの印刷文書名称と，ユーザが指定した印刷文書名称の2種類があります。ここでは，それぞれの文書名称について説明します。

(1)　デフォルトの印刷文書名称

COBOL2002の印刷機能では，デフォルトの印刷文書名称として，次の規則に基づいて印刷文書名称を作成します。

形式

実行ファイル名△△△FNAM-ファイル名

実行ファイル名

印刷をする実行可能ファイルの名称です。絶対パスでの名称指定の場合でもパス名は表示されず，拡張子.exeが削除された実行可能ファイル名称が表示されます。

ファイル名

COBOLプログラム中のSELECT句で指定したファイル名称です。

△

1バイトの空白を示します。

表示される印刷文書名称の例を，次に示します。

（例）実行可能ファイル名：SAMPLE.exe

           :
       ENVIRONMENT DIVISION.
           :
       SELECT SAM-FILE ASSIGN TO SYS001
           :

表示される印刷文書名称

SAMPLE△△△FNAM-SAM-FILE

(2)　ユーザ指定の印刷文書名称

スプールに登録される印刷文書名称は，次のどちらかの方法で変更できます。

COBOLプログラム中に印刷文書名称を指定する方法

実行時環境変数で印刷文書名称を指定する方法

(a)　COBOLプログラム中に印刷文書名称を指定する方法（APPLY FORMS-NAME句）

環境部のAPPLY FORMS-NAME句に，スプールに登録する印刷文書名称を設定します。

APPLY FORMS-NAME句については，マニュアル「COBOL2002　言語　拡張仕様編」　「25.2.3(2)　APPLY FORMS-NAME句」を参照してください。

（例）

           :
       ENVIRONMENT DIVISION.
           :
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT A-FILE ASSIGN TO SYS000.
           :
       I-O-CONTROL.
       APPLY FORMS-NAME TO DOCNAME ON A-FILE.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 DOCNAME PIC X(9) VALUE 'FORMNAME1'.
           :

表示される印刷文書名称

FORMNAME1

(3)　実行時環境変数で印刷文書名称を指定する方法（環境変数CBLF_ファイル名）

実行時環境変数CBLF_ファイル名を使用して，スプールに登録される印刷文書名称を指定できます。

形式

CBLF_ファイル名=印刷文書名称

ファイル名

SELECT句で指定したファイル名と対応します。指定したファイル名の中にハイフン（-）があった場合は，下線（_）に置き換えた名称となります。

印刷文書名称

スプールに登録したい印刷文書名称を，任意の文字列で指定します。

(4)　注意事項

印刷文書名称の変更は，GDIモード印刷，およびESC/Pモード印刷の場合だけ適用されます。

システムが認識できない形式の印刷文書名称を指定した場合，印刷開始時にエラーとなります。

APPLY FORMS-NAME句と環境変数CBLF_ファイル名の両方を指定した場合，CBLF_ファイル名に指定した印刷文書名称が有効となります。

印刷文書名称には，1,024バイト以内の文字列を指定してください。また，印刷文書名称には英数字，または日本語の文字列を指定してください。ただし，印刷文書名称として指定できる長さと文字列は使用するプリンタによって異なります。

なお，印刷文書名称に指定された文字列の途中にNULL（X'00'）が含まれている場合，NULL以降の文字列は出力されません。

8.2.6　外字の有効化

Windowsでは，外字登録はサインインユーザごとに実行されます。しかし，Windowsサービスプログラムを実行するセッション0のように，Windowsへサインインしないでプログラムを実行する環境では，ユーザプロファイルが読み込まれないため外字が有効になりません。ただし，次のどちらかの場合，プログラムからWindows APIのEnableEUDC関数を発行することで外字を有効にできます。

プログラムにユーザプロファイルを読み込む機能がある。

プログラムを実行するユーザで，Windowsに一度でもサインインしている。

COBOL2002のGDIモード印刷およびESC/Pモード印刷では，OPEN文で内部的にEnableEUDC関数を発行するため，上記の環境でCOBOLプログラムを実行する場合，外字が有効になります。EnableEUDC関数の処理は，環境変数CBLEUDCFUNCの指定で変更できます。

環境変数CBLEUDCFUNCを指定すると，GDIモード印刷およびESC/Pモード印刷のOPEN文で内部的に発行するEnableEUDC関数の処理を変更できます。

形式

CBLEUDCFUNC={ ERRORSTOP | NOFUNC }

ERRORSTOP

EnableEUDC関数がエラーを返したときに重大エラーのメッセージを出力し，FILE STATUS句やUSE手続きがなければプログラムは終了します。FILE STATUS句の指定がある場合，入出力状態の値には90を設定します。

NOFUNC

EnableEUDC関数は呼び出しません。

環境変数CBLEUDCFUNCの指定がない場合，および指定値に誤りがある場合は，EnableEUDC関数がエラーを返したときに警告メッセージを出力して，プログラムを継続します。このとき，FILE STATUS句があってもメッセージを出力し，入出力状態の値は00になります。

注意事項

環境変数CBLEUDCFUNCの指定がない環境で警告メッセージが出力された場合，外字が正しく印刷されないことがあります。この警告メッセージが出力された場合，印刷結果を確認し，外字が正しく印刷されていないときはプログラムを再実行してください。

NOFUNCを指定する場合は，外字を使用していないこと，またはOPEN文でEnableEUDC関数を呼び出さなくても外字が有効な環境であることを確認してください。

8.3　入出力エラー処理

入出力エラーの詳細は，「6.3　入出力エラー処理」を参照してください。

8.4　GDIモード印刷

GDIモードは，Windows固有の印刷モードです。GDIモードを使用すると，出力先のデバイスを意識しないでプリンタ出力ができます。

GDIモード印刷では，順編成ファイル，テキスト編成ファイルで行制御出力する行データを，直接プリンタに出力できます。また，行データが印刷制御付きでも出力できます。

8.4.1　プリンタへの出力割り当て方法

GDIモード印刷を使用する場合は，環境部のファイル管理記述項でファイルを指定したあと，定数指定，環境変数指定，データ名指定のどれかの方法で，ASSIGN句に'PRINTER〔：印刷書式番号〕'という名称の物理ファイルを割り当てます。PRINTERは小文字でもかまいません。パス付きで指定する場合でも，最右側の¥の次がPRINTER〔：印刷書式番号〕であればかまいません。

印刷書式番号の意味については，「(2)　複数の印刷書式を使用したプリンタ出力機能」を参照してください。

(1)　ファイルの割り当て

定数指定，環境変数指定，データ名指定の記述例をそれぞれ次に示します。

定数指定

       ENVIRONMENT  DIVISION.
       INPUT-OUTPUT  SECTION.
       FILE-CONTROL.
       SELECT FILE-1 ASSIGN TO 'PRINTER'.
           :

環境変数指定

       ENVIRONMENT  DIVISION.
       INPUT-OUTPUT  SECTION.
       FILE-CONTROL.
       SELECT FILE-1 ASSIGN TO PRT.
           :

注

このとき，次の環境変数が指定されているものとします。

CBL_PRT=PRINTER

データ名指定

       ENVIRONMENT  DIVISION.
       INPUT-OUTPUT  SECTION.
       FILE-CONTROL.
       SELECT FILE-2 ASSIGN TO FILE-NAME.
           :
       WORKING-STORAGE  SECTION.
       01 FILE-NAME PIC X(40).
       PROCEDURE DIVISION.
           MOVE 'PRINTER' TO FILE-NAME.
           :

(2)　複数の印刷書式を使用したプリンタ出力機能

物理ファイルにプリンタを割り当てた場合，帳票の印刷書式（出力先，出力形式）をファイルごとに指定できます。複数の印刷書式を設定しておくことで，プログラム中で使用するファイルごとに異なる印刷書式で帳票を印刷できます。設定した印刷書式は印刷書式番号（1〜99）で識別します。

(a)　印刷書式の設定

各印刷書式番号に対応した印刷書式を設定するには，実行支援ウィンドウの［設定］メニューの［印刷書式］コマンドを使用します。詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

(b)　物理ファイルの割り当て方法

定数指定，環境変数指定，データ名指定のどの場合でも，物理ファイル名に次の指定をすることで，印刷書式番号に対応した印刷書式で帳票を出力できます。

PRINTER 〔:印刷書式番号〕

また，印刷書式にはデフォルトの印刷書式を設定しておくこともできます。この場合，単に"PRINTER"だけを指定すると，デフォルトの印刷書式で印刷されます。

(c)　物理ファイルの動的割り当て

ASSIGN句で処理系作成者語を指定した場合（環境変数指定の場合），GUIモードでのOPEN文実行時に，印刷書式を動的に設定できます。

OPEN文実行時に，該当するファイルに対して物理ファイルが割り当てられていない場合，物理ファイルの割り当て画面が表示されます（「6.2.4　実行時の動的割り当て（GUIモードの場合だけ）」を参照）。この画面に次のどれかの指定をして，［OK］ボタンを選びます。

PRINTER:印刷書式番号

指定した印刷書式番号に対応した印刷書式で印刷されます。

PRINTER:

印刷定義ダイアログボックスが表示されます。ここで，印刷書式を確認しながら印刷書式番号を指定できます。ダイアログボックスの形式などについては，マニュアル「COBOL2002　操作ガイド」の実行支援を使った実行環境の設定の説明を参照してください。

PRINTER

デフォルトの印刷書式で印刷されます。

(d)　使用例

物理ファイル名称の定数指定を使用して印刷書式番号を設定する例を，次に示します。

       ：
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT FILE-1 ASSIGN TO 'PRINTER:1'.
       ：

8.4.2　出力形態とレコード形式

GDIモード印刷では，出力するデータ項目にCHARACTER TYPE句を指定することで，印刷制御付きの行データを指定できます。CHARACTER TYPE句の書き方や規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「14.2.1　データ記述項（書式印刷機能）」を参照してください。

WRITE文とCHARACTER TYPE句との関係を次に示します。

(1)　WRITE文とレコード名の関係

(a)　WRITE レコード名の場合

レコード名にCHARACTER TYPE句がある場合だけ，行データを印刷制御します。

記述例

       FD A-FILE.
       01 A-REC.
         02 A-REC-1 PIC N(10) CHARACTER TYPE IS POINT-7 WIDE.
         02 A-REC-2 PIC N(10) CHARACTER TYPE IS POINT-9 FORMAT-7.
           :
       PROCEDURE DIVISION.
           :
           WRITE A-REC AFTER 1 LINE.
           :

(b)　WRITE レコード名 FROM 一意名の場合

一意名にCHARACTER TYPE句がある場合だけ，行データを印刷制御します。この場合，レコード名にCHARACTER TYPE句があっても，一意名のCHARACTER TYPE句の情報が有効となります。

記述例

       FD A-FILE.
       01 A-REC PIC N(80).
           :
       WORKING-STORAGE SECTION.
       01 DATA1.
         02 A-REC-1 PIC N(10) CHARACTER TYPE IS POINT-7 WIDE.
         02 A-REC-2 PIC N(10) CHARACTER TYPE IS POINT-9 FORMAT-7.
           :
       PROCEDURE DIVISION.
           :
           WRITE A-REC FROM DATA1 AFTER 1 LINE.
           :

(2)　CHARACTER TYPE句指定での印刷

(a)　POINT-l指定

POINT-lを書くと，文字サイズ（ポイント）を指定できます。lの値はポイント数を示します。

なお，Windows COBOL2002では，POINT-lを省略した場合のポイントは，実行支援の［字サイズ］で指定した値となります。

記述例

         ：
       01 A.
         02 A0 CHARACTER TYPE IS POINT-14.
           03 A1 PIC NN VALUE N'下期'.
           03 A2 PIC N(5) POINT-19
                        VALUE N'実用新案権'.
           03 A3 PIC NN VALUE N'一覧'.
         ：
       PROCEDURE DIVISION.
             ：
           WRITE A-REC FROM A AFTER 1 LINE.
             ：

印刷結果

(b)　FORMAT-n指定

FORMAT-nを書くと，書体を指定できます。書体は，あらかじめ実行支援の［書体］で設定しておく必要があります。

なお，Windows COBOL2002では，FORMAT-nを省略した場合の書体は，実行支援の［書体］のデフォルトで指定したフォントとなります。

記述例

         ：
       01 A.
         02 A0 CHARACTER TYPE IS FORMAT-2.
           03 A1 PIC NN VALUE N'下期'.
           03 A2 PIC N(5) FORMAT-1
                        VALUE N'実用新案権'.
           03 A3 PIC NN VALUE N'一覧'.
         ：
       PROCEDURE DIVISION.
             ：
           WRITE A-REC FROM A AFTER 1 LINE.
             ：

印刷結果

(c)　INTERVAL-i指定

INTERVAL-iを書くと，各文字間隔を指定できます。INTERVAL-iを省略した場合の文字間隔は，0ポイントとなります。

なお，Windows COBOL2002では，実行支援の［半角文字と全角文字の間隔を調整する］チェックボックスをチェックしない場合は，全角文字と半角文字の字間隔はi/2ポイントとなります。このチェックボックスをチェックした場合，全角文字の字間隔はiポイント，半角文字の字間隔はi/2ポイントとなります。

記述例

         ：
       01 A.
         02 A0 CHARACTER TYPE IS INTERVAL-0.
           03 A1 PIC NN VALUE N'下期'.
           03 A2 PIC N(5) INTERVAL-8
                        VALUE N'実用新案権'.
           03 A3 PIC NN VALUE N'一覧'.
         ：
       PROCEDURE DIVISION.
             ：
           WRITE A-REC FROM A AFTER 1 LINE.
             ：

印刷結果

(d)　WIDE指定

WIDEを書くと，横倍角を指定できます。

記述例

         ：
       01 A.
         02 A0.
           03 A1 PIC NN VALUE N'下期'.
           03 A2 PIC N(5) WIDE
                        VALUE N'実用新案権'.
           03 A3 PIC NN VALUE N'一覧'.
         ：
       PROCEDURE DIVISION.
             ：
           WRITE A-REC FROM A AFTER 1 LINE.
             ：

印刷結果

(e)　環境変数CBLGDIINTERVALを使用した出力例

環境変数CBLGDIINTERVALにYESを指定すると，CHARACTER TYPE IS INTERVAL句が出現しない間の項目に対して，実行支援の印刷書式に設定した字間隔を使用します。ただし，CHARACTER TYPE句の指定がまったくないレコードに対しては，環境変数CBLGDIINTERVALの指定と関係なく，実行支援の印刷書式に従った字間隔が使用されます。

環境変数CBLGDIINTERVALを使用した出力例を，次に示します。

レコード定義

       01 W1.
         02 A PIC X(5) VALUE ALL '#'.
         02 B PIC X(5) VALUE ALL 'B'.
         02 C PIC X(5) VALUE ALL 'C'.
       01 W2.
         02 D PIC X(5) VALUE ALL '@'.
         02 E PIC X(5) VALUE ALL 'E'
                       CHARACTER TYPE IS POINT-16.
         02 F PIC X(5) VALUE ALL 'F'.
       01 W3.
         02 G PIC X(5) VALUE ALL '&'.
         02 H PIC X(5) VALUE ALL 'H'
                       CHARACTER TYPE IS INTERVAL-24.
         02 I PIC X(5) VALUE ALL 'I'.

印刷結果（CBLGDIINTERVALにYESを指定した場合）

W1およびW2

実行支援の印刷書式の設定に従った字間隔※で出力される

W3

INTERVAL指定が出現するまでは，実行支援の印刷書式の設定に従った字間隔※で出力される

INTERVAL指定があるデータ項目は，INTERVAL指定で指定された字間隔で出力される

INTERVAL指定以降のデータ項目は，字間隔0で出力される

注※

実行支援の印刷書式の字間隔を10cpiに設定した場合

印刷結果（CBLGDIINTERVALにYES以外の値を指定した場合，またはCBLGDIINTERVALに値を指定しなかった場合）

W1

実行支援の印刷書式に従った字間隔※で出力される

W2

CHARACTER TYPE句の指定があり，かつ環境変数CBLGDIINTERVALにYESが指定されていないため，字間隔0で出力される

W3

INTERVAL指定がないデータ項目は，W2と同様に出力される

INTERVAL指定があるデータ項目は，INTERVAL指定で指定された字間隔で出力される

注※

実行支援の印刷書式の字間隔を10cpiに設定した場合

8.4.3　印刷書式の設定

印刷書式の設定には，実行支援を使用します。

実行支援の詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

8.4.4　外字の出力方法

GDIモード印刷を使用する場合，Windows上のMS-IMEなどのかな漢字変換システムの辞書に外字を登録すると，外字を印刷できます。

8.4.5　注意事項

プリンタをI-Oモードでオープンし，WRITE文を使用した場合の結果は保証しません。

行データの重ね打ちはできません。

WRITE文にADVANCING／POSITIONING指定がない場合，改行などの行制御はされません。

WRITE文にAFTER ADVANCING PAGE指定があっても，プリンタをオープンして最初に実行する場合は，印刷データがない状態のため，改ページは無視して印刷されます。

WRITE文のADVANCINGで指定された行送りの結果，印刷行の位置が実行支援などで設定された「1ページの印刷行数」を超えたとき，改ページをして，印刷行数を「1ページの印刷行数」で割った余りの位置まで行送りをします。このとき，行送りの行数が2ページを超えても，改ページは1回だけです。

例）

次の条件では，36LINESによる改ページは1ページです（3ページとはなりません）。

1.の印刷のあとで，その次のページの7行目に2.を印刷します。

［条件］

実行支援で，1ページの印刷行数を「10行」に指定する。

次に示すWRITE文を実行する。

WRITE PRINT-PAGE AFTER ADVANCING PAGE.　　　…1.

WRITE PRINT-AREA AFTER ADVANCING 36 LINES.　　…2.

WRITE文で書き出すレコードは，レコード定義にCHARACTER TYPE句を指定している場合，基本項目または集団項目の下位項目（基本項目）単位で出力します。そのため，RECORD句のVARYING指定の可変長レコードの場合，DEPENDING ONで指定するレコード長は基本項目の境界でなければなりません。レコード長が基本項目の境界でない場合，基本項目の相対位置がレコード長を超える基本項目は出力されません。

8.5　ESC/Pモード印刷

ESC/Pモードは，プリンタ固有の出力モードです。ESC/Pモードを使用すると，高速にプリンタ出力ができます。ただし，ESC/Pモード印刷を使用するには，プリンタがESC/Pモードをサポートしている必要があります。

ESC/Pモード印刷では，順編成ファイル，テキスト編成ファイルで機能コード（エスケープシーケンス）が入ったレコードを，直接プリンタに出力できます。機能コードは，文字の拡大や書体といったプリンタの各機能を制御するコードです。ただし，X'81'〜X'9F'，X'E0'〜X'FC'のコードを含む機能コードや外字は使用できません。

ESC/Pモード印刷では，CHARACTER TYPE句は有効となりません。ESC/Pモード印刷では，機能コードを設定して印刷制御を行ってください。

8.5.1　プリンタへの出力と割り当て方法

環境部の入出力節でファイル編成を指定したあと，定数指定，環境変数指定，データ名指定のどれかの方法で，物理ファイル名に'SYSPRT〔:ネットワークプリンタ名〕'を指定します。SYSPRTは小文字でもかまいません。パス付きで指定する場合でも，最右側の¥の次が'SYSPRT〔:ネットワークプリンタ名〕'であればかまいません。ネットワークプリンタ名の意味については，「(2)　ネットワークプリンタへの出力」を参照してください。

(1)　ファイルの割り当て

定数指定，環境変数指定，データ名指定の記述例をそれぞれ次に示します。

定数指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-1 ASSIGN TO 'SYSPRT'.
           :

環境変数指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-1 ASSIGN TO PRT.
           :

注

このとき，次の環境変数が指定されているものとします。

CBL_PRT=SYSPRT

データ名指定

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT FILE-2 ASSIGN TO FILE-NAME.
           :
       WORKING-STORAGE SECTION.
       01 FILE-NAME PIC X(40).
       PROCEDURE DIVISION.
           MOVE 'SYSPRT' TO FILE-NAME.
           :

(2)　ネットワークプリンタへの出力

ESC/Pモード印刷では，物理ファイル名に次の指定をすることで，ネットワークプリンタに出力できます。あらかじめ複数のネットワークプリンタを設定しておけば，一つのプログラム中で使用する複数のファイルを，別々のプリンタで印刷できます。

SYSPRT:ネットワークプリンタ名

（例）

SERVER1に接続されているPRINTER1というプリンタに出力する場合

SYSPRT:¥¥SERVER1¥PRINTER1

なお，この指定方法は，定数指定，環境変数指定，データ名指定のどれでも使用できます。

8.5.2　出力形態とレコード形式

ESC/Pモード印刷の場合，必要な機能コードを行データに設定して，プリンタへ出力します。

横倍角データを出力する場合のコーディング例を，次に示します。

記述例

         ：
       FD A-FILE.
       01 S-REC PIC X(50).
         ：
       01 A-WK.
         02 A0.
           03 A1       PIC NN   VALUE N'下期'.
           03 CNTL-CD1 PIC X(3) VALUE X'1B5701'. …1.
           03 A2       PIC N(5) VALUE N'実用新案権'.
           03 CNTL-CD2 PIC X(3) VALUE X'1B5700'. …2.
           03 A3       PIC NN   VALUE N'一覧'.
         ：
       PROCEDURE DIVISION.
              ：
           WRITE S-REC FROM A-WK AFTER ADVANCING 1.
              ：

横倍角開始の機能コード※

横倍角終了の機能コード※

注※

機能コードは，プリンタに依存します。ご利用のプリンタの機能コードは，プリンタのマニュアルでご確認ください。

印刷結果

(1)　注意事項

ESC/Pモードでプリンタへ出力する場合の注意事項を次に示します。

ESC/Pモードでは，機能コードのサポート範囲がプリンタごとに異なります。サポートする機能コードの詳細については，ご利用のプリンタのマニュアルを参照してください。

ESC/Pモードプリンタへ直接出力する場合，COBOLプログラムから出力された印刷データは，内部的に一時ファイルに格納され，CLOSE文の実行後に一時ファイルの内容がプリンタへ出力されます。このため，WRITE文が実行されてから実際に印刷されるまで，時間がかかる場合があります。

外部装置名に「CBL_PRT=¥¥host¥printer」のようなUNC形式は使用できません。

8.5.3　外字の出力方法

ESC/Pモード印刷では，Windows上で作成できるユーザ定義文字を外字として扱います。また，次に示すベンダ定義文字（ベンダが独自に追加した文字）も外字として印刷できます。

Windows特殊文字

NEC選定IBM拡張文字

IBM拡張文字

(1)　ユーザ定義文字の外字出力

ここでは，Windows上で作成した外字をESC/Pモード印刷機能でプリンタへ印刷する方法を説明します。

環境変数CBLP_ファイル名を設定すると，あらかじめプリンタに登録しなくても，Windows上で作成した外字を出力できます。なお，環境変数CBLP_ファイル名は，CLOSE文を実行するごとに環境変数の値が参照されます。

(a)　形式

CBLP_ファイル名=プリンタの外字コード〔,タイプフェイス名〕

ファイル名

SELECT句で指定したファイル名と対応させます。指定したファイル名の中にハイフン（-）があった場合には，下線（_）に置き換えた名称となります。

プリンタの外字コード

実行時に一時的に使用する，プリンタの外字領域のコードを指定します。プリンタの外字コードは，4けたの16進数で指定します。

タイプフェイス名

出力したい外字が登録されているフォントの，タイプフェイス名を指定します。指定を省略した場合は，「ＭＳ 明朝」が仮定されます。

(b)　出力の手順と例

Windows上での外字の作成・登録

Windowsの外字エディタなどを使って，外字を作成します。Windows上で作成した外字は，次のようなイメージで外字領域に登録されます。

（例）

タイプフェイス「ＭＳ Ｐゴシック」に関連づけて，コードX'F040'に「●」，コードX'F041'に「▲」という外字を登録した場合

図8‒1　Windows上で作成した外字の登録イメージ

作業領域にするプリンタの外字コードの決定

プリンタの外字領域の中で，一時的に外字を登録するコードを決めます。プリンタの外字領域と作業領域にする外字コードとの関係は，次のようになります。

（例）

プリンタの外字コードX'7721'を作業領域にする場合

図8‒2　プリンタの外字領域と作業領域にする外字コードとの関係

環境変数の設定

環境変数CBLP_ファイル名を使って，Windowsの外字コード，プリンタの外字コード，および出力ファイルを関連づけます。

（例）上記(a)(b)の例の設定で，FILE01を出力する場合

CBLP_FILE01=7721,ＭＳ△Ｐゴシック

注

△は半角空白文字を表します。

プログラムの実行

プログラムを実行すると，次のようなイメージで，Windows上で作成した外字がプリンタに出力されます。

図8‒3　作業用のプリンタ外字コードを使用した外字印刷の流れ

注意事項

ユーザ定義文字を外字として出力する場合の注意事項を，次に示します。

プリンタの外字コードに，出力先となるプリンタの外字領域コード以外を指定した場合，結果は保証しません。

プリンタの外字コードに4けたの16進数以外の値を指定した場合，エラーとなります。

Windowsで作成した外字は，関連づけられるタイプフェイスに登録してください。タイプフェイスに対して外字登録できないようなタイプフェイス名を指定した場合，外字の出力結果は保証しません。

タイプフェイス名に指定する文字列は，半角や全角の区別も含めて正しく指定してください。指定したタイプフェイス名が認識できなかった場合，エラーとなります。

タイプフェイス名を省略した場合，「ＭＳ 明朝」が仮定されます。ただし，「ＭＳ 明朝」のフォントがプログラムの実行する環境にない場合，エラーとなります。

あらかじめ，プリンタの外字領域に外字が登録されていて，その領域をプリンタの外字コードとして指定した場合，その登録内容は保証しません。

印刷時に，プリンタの仕様に合わせて外字のサイズが変更されます。そのため，外字のビット情報が一部欠落する場合があります。

(2)　ベンダ定義文字の外字出力

ここでは，ベンダ定義文字を外字として印刷する方法を説明します。

環境変数CBLPRTEXCHRを設定すると，あらかじめプリンタにベンダ定義文字を登録しなくても，ベンダ定義文字を出力できます。

形式

CBLPRTEXCHR=ベンダ定義文字種別〔:ベンダ定義文字種別…〕

ベンダ定義文字種別

外字として印刷するベンダ定義文字の種別を指定します。複数のベンダ定義文字種別を指定する場合は，コロン（:）で区切ります。

環境変数CBLPRTEXCHRに指定するベンダ定義文字の種別を次に示します。

表8‒2　環境変数CBLPRTEXCHRに指定するベンダ定義文字の種別

環境変数に指定する

文字列

種別

コード範囲

上位バイト

下位バイト

BND1

Windows特殊文字

（87）₁₆

（40）₁₆〜（FC）₁₆※

BND2

NEC選定IBM拡張文字

（ED）₁₆〜（EE）₁₆

（40）₁₆〜（FC）₁₆※

BND3

IBM拡張文字

（FA）₁₆〜（FC）₁₆

（40）₁₆〜（FC）₁₆※

注※　（7F）₁₆を除きます。

注意事項

環境変数CBLPRTEXCHRに上記以外の文字列を指定した場合，実行時エラーとなります。

環境変数CBLPRTEXCHRは，環境変数CBLP_ファイル名を指定しているときに有効となります。

環境変数CBLPRTEXCHRで指定したベンダ定義文字に対して，コード範囲中にある文字コードはすべて外字として印刷します。未定義の文字コードを外字として印刷した場合，印刷結果は保証しません。

外字としてベンダ定義文字を印刷した場合の印刷結果は，同じベンダ定義文字を通常の2バイト文字として印刷した印刷結果に比べて，文字の一部が欠けたり，曲線が滑らかにならなくなったりすることがあります。

8.5.4　ESC/Pモード印刷を利用したプリンタへの出力例

ESC/Pモード印刷機能を利用したプリンタへの出力例を説明します。はじめに，ご利用のプリンタでESC/Pモード（AXモード）が使用できるか確認してください。

(1)　プリンタの設定

印刷前のプリンタの設定手順を示します。

プリンタをESC/Pモードで動作させる。

Windowsのプリントマネージャで，ESC/Pモードのプリンタを使えるように設定する。

また，ESC/Pモードで詳細な帳票設計をする場合，プリンタの仕様をあらかじめ調べておく必要があります。詳細は，ご利用のプリンタのマニュアルを参照してください。

(2)　文字列の出力

文字列を出力する例題について説明します。

(a)　プリンタの仕様

この例題で想定するプリンタの仕様を次に示します。

表8‒3　プリンタの仕様

項目

値

フォント

ANK文字

全角漢字文字

半角漢字文字

Roman

明朝

明朝

文字幅

ANK文字

全角漢字文字

半角漢字文字

10CPI（Character Per Inch）

24ドット

12ドット

文字スペース量

ANK文字

全角漢字文字

半角漢字文字

左：0ドット，右：0ドット

左：0ドット，右：2ドット

左：0ドット，右：3ドット

(b)　プログラミング例

文字列'HITACHI'を出力するプログラム例を次に示します。

文字列を出力するプログラミング例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
      ***********************************************************
      *      文字列 'HITACHI'を出力する                         *
      ***********************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT S-F1 ASSIGN TO 'SYSPRT'
                   ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD S-F1.
       01 S-R1 PIC X(132).
       WORKING-STORAGE SECTION.
       01 T-HITACHI PIC X(7) VALUE 'HITACHI'.
       PROCEDURE DIVISION.
           OPEN OUTPUT S-F1.
      *
           MOVE T-HITACHI TO S-R1.
           WRITE S-R1 AFTER ADVANCING 1.
      *
           CLOSE S-F1.
           STOP RUN.

(3)　下線を設定した文字列の出力

(2)で説明したプログラム例に機能コードを設定することで，出力文字列に下線を設定できます。

(a)　プリンタの仕様

「表8‒3　プリンタの仕様」と同様の仕様です。

(b)　プログラミング例

文字列'HITACHI'に下線を設定して出力するプログラム例を次に示します。

印刷結果は'HITACHI'となります。

文字列に下線を設定して出力するプログラミング例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
      ***********************************************************
      *     文字列  'HITACHI'に下線を設定して出力する           *
      ***********************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT S-F1 ASSIGN TO 'SYSPRT'
                   ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD S-F1.
       01 S-R1         PIC X(132).
       WORKING-STORAGE SECTION.
       01 T-OUTDATA.
        02 T-SET-UNDER PIC X(3) VALUE X'1B2D01'.  …1.
        02 T-HITACHI   PIC X(7) VALUE 'HITACHI'.
        02 T-NON-UNDER PIC X(3) VALUE X'1B2D00'.  …2.
       PROCEDURE DIVISION.
           OPEN OUTPUT S-F1.
      *
           MOVE T-OUTDATA TO S-R1.
           WRITE S-R1 AFTER ADVANCING 1.
      *
           CLOSE S-F1.
           STOP RUN.

下線設定の機能コード

下線解除の機能コード

(4)　文字幅を整えた文字列の出力

ESC/Pモードで，全角文字と半角文字が混在する帳票を出力する場合，全角文字と半角文字の文字幅が1：1/2で出力されないことがあります。例えば，同じバイト数の行でも，長さが異なる印刷結果となることがあります。これは，利用するプリンタの印刷文字の幅の仕様によるものです。

印刷文字の幅を整えるには，プログラム中でESC/Pの機能コードを出力レコードに埋め込みます。なお，文字幅とESC/Pの機能コードについては，ご利用のプリンタのマニュアルを参照してください。

(a)　プリンタの仕様

この例題で想定するプリンタの仕様を次に示します。

項目

値

文字幅（180dpi）

ANK文字

18ドット（18/180インチ）

漢字全角文字

24ドット（24/180インチ）

漢字半角文字

12ドット（12/180インチ）

(b)　プログラミング例

漢字全角文字の文字幅とANK文字の文字幅の比率を1：1/2に調整します。データの出力後は文字幅を元に戻します。

プログラムで使用する引数を次に示します。

PUT-DATA：出力データ名

PUT-LEN：出力データ長

文字幅を調整するプログラム例を，次に示します。

文字幅を調整するプログラミング例

       WORKING-STORAGE SECTION.
       01 P          PIC 9(4).
       01 SI-CODE    PIC X(4) VALUE X'1C530606'. …1.
       01 EI-CODE    PIC X(4) VALUE X'1C530003'.
       01 ICODE-LEN  PIC 9    VALUE 4.
       LINKAGE SECTION.
       01 PUT-DATA   PIC X(80).
       01 PUT-LEN    PIC 9(04).
       PROCEDURE DIVISION USING PUT-DATA PUT-LEN.
           OPEN OUTPUT S-F1.
      *
       CODE-CONV SECTION.
      *
      * Pは，出力領域の転送先ポインタ
           MOVE 1         TO P.
           MOVE ALL SPACE TO S-R1.
      *
      * 漢字全角文字の文字幅を補正する
           MOVE SI-CODE TO S-R1(1:ICODE-LEN).
           ADD ICODE-LEN TO P.
      *
      * 出力データをそのまま転送
           MOVE PUT-DATA(1:PUT-LEN) TO S-R1(P:PUT-LEN).
           ADD PUT-LEN TO P.
      *
      * 漢字全角文字の文字幅を元に戻す
           MOVE EI-CODE TO S-R1(P:ICODE-LEN).
           WRITE S-R1 AFTER ADVANCING 1.

      *--- 終了処理 ---*
           CLOSE S-F1.
           EXIT PROGRAM.

漢字の全角文字スペース量

左スペース量：6ドット

右スペース量：6ドット

8.6　XMAP3による印刷（Windows(x86) COBOL2002で有効）

XMAP3を使用すると，書式と行データを重ね合わせる印刷（書式オーバレイ印刷）や，印刷制御付きの行データの印刷ができます。

XMAP3による印刷機能について説明します。

8.6.1　前提条件とプログラムの作成方法

XMAP3による印刷をするには，あらかじめ帳票の定義が必要です。帳票を定義するには，XMAP3を使用します。

XMAP3による印刷を使用するプログラムは，コンパイル時に-XMAP,LinePrintオプションの指定が必要です。

8.6.2　プリンタへの出力と割り当て方法

(1)　印刷サービス名称の指定

印刷サービス名称とは，XMAP3で使用する端末やプリンタの識別名称です。

COBOLプログラム実行時，印刷サービス名称は，SELECT句で指定したファイルのASSIGN句で指定した外部装置名に割り当てられます。印刷サービス名称は，環境変数CBLX_外部装置名で指定します。印刷サービス名称の指定方法を次に示します。

形式

SELECT ファイル名 ASSIGN TO 外部装置名

環境変数

CBLX_外部装置名=印刷サービス名称

注意事項

GUIモードの場合，環境変数で印刷サービス名称が割り当てられていなければ，OPEN文の実行時に表示される，物理ファイルの割り当て画面で印刷サービス名称を割り当てることもできます。物理ファイルの割り当て画面については，「6.2.4　実行時の動的割り当て（GUIモードの場合だけ）」を参照してください。

ASSIGN句で定数指定またはデータ名指定をした場合，または外部装置名を環境変数CBL_外部装置名で指定した場合，指定した文字列は，印刷サービス名称ではなく物理ファイル名として扱われるので注意してください。

ASSIGN句で指定した外部装置名に対して，印刷サービス名称の指定（CBLX_外部装置名）と物理ファイル名の指定（CBL_外部装置名）を同時に指定した場合，印刷サービス名称の指定（CBLX_外部装置名）が有効となります。これらの環境変数を同時に指定するときには，注意が必要です。

環境変数CBLX_外部装置名は，OPEN文を実行するごとに環境変数の値が参照されます。

(2)　プリンタ出力の識別

COBOLプログラムの記述，-XMAP,LinePrintオプションの指定の有無と，プリンタ，通常ファイルへの出力の識別を次に示します。

表8‒4　プリンタ，通常ファイルへの出力の識別

-XMAP,LinePrint

オプションの指定

COBOLプログラムでの

APPLY FORMS-OVERLAY句の指定

外部装置名（環境変数）

ASSIGN定数

または

ASSIGNデータ名

CBLX_xxx

（印刷サービス名）

CBL_xxx

（物理ファイル名）

プリンタ

ファイル

ファイル

あり

あり

○※1

×※2

×※3

なし

○※1

○

○

なし

−

×

○

○

（凡例）

○：出力できる

×：出力できない

−：指定しても意味を持たない（覚え書きとなる）

注※1

OUTPUT指定以外でOPEN文を実行すると，実行時エラーとなります。

注※2

実行時にエラーメッセージが出力されます。

注※3

コンパイル時にエラーメッセージが出力されます。

出力先がファイルの場合でも，物理ファイル名に'PRINTER'を指定すると，CHARACTER TYPE句を有効としてプリンタに出力できます。この場合，XMAP3を使用しないで，GDIモード印刷となります。「8.1　プリンタアクセスの種類と概要」を参照してください。

また，出力先がプリンタの場合，コンパイルリスト（情報リスト）のファイル情報の個所には，プリンタ出力であることが表示されます。情報リストについては，「付録E　コンパイルリスト」を参照してください。

8.6.3　出力形態とレコード形式

XMAP3による印刷で出力するレコード形式は，XMAP3に依存します。

8.6.4　入出力手続き文と動作

XMAP3による印刷をする場合，印刷用ファイルへデータを出力するために，手続き部で次の文を使用します。

OPEN文

印刷用ファイルを使用するための準備をします。OUTPUTモードで実行します。

WRITE文

レコードを印刷用ファイルに書き出します。明示的または間接的にADVANCING指定をします。間接的にとは，同一ファイルに対するほかのWRITE文にADVANCING指定がされている場合をいいます。

CLOSE文

ファイル処理を終了します。

印刷用ファイル中に残っている行データは，すべてプリンタに出力されます。

(1)　行データの印刷制御付きの指定

印刷制御付きの行データを出力するには，WRITE文で出力するデータ項目にCHARACTER TYPE句を指定します。CHARACTER TYPE句の書き方や規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「14.2.1　データ記述項（書式印刷機能）」を参照してください。

また，-XMAP,LinePrintオプションを指定したプログラムにPOINT-l，FORMAT-n，INTERVAL-iを指定した場合，各項目（l，n，i）に指定できる値の範囲と意味については，XMAP3での定義に従います。詳細は，マニュアル「画面・帳票サポートシステム XMAP3 プログラミングガイド 帳票編」またはマニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 プログラミングガイド」を参照してください。

8.6.5　書式オーバレイの出力方法

書式付きで印刷をするときには，書式オーバレイイメージ名称を指定します。これには，次の二つの方法があります。

(1)　プログラムによる書式オーバレイイメージの指定

プログラム中の入出力管理記述項（I-O-CONTROL.）に，APPLY FORMS-OVERLAY句を指定すると，書式オーバレイイメージを重ねて印刷できます。

APPLY FORMS-OVERLAY句については，マニュアル「COBOL2002　言語　拡張仕様編」　「14.1.1(1)　APPLY FORMS-OVERLAY句」を参照してください。

（例）

           :
       I-O-CONTROL.
           APPLY FORMS-OVERLAY TO FOV-NAME ON
           DAILY-FILE.
           :
       WORKING-STORAGE SECTION.
       77 FOV-NAME PIC X(8) VALUE 'FORMOVL1'.
           :

(2)　環境変数による書式オーバレイイメージの指定

プログラム中にAPPLY FORMS-OVERLAY句を指定しないときは，XMAP3の環境変数の指定によって，COBOLプログラムに関係なく書式オーバレイイメージを重ねて印刷できます。

プログラム中にAPPLY FORMS-OVERLAY句があるとき，XMAP3の環境変数によって書式名を有効にする場合は，書式名格納エリアに必ずNULLを格納してください。XMAP3の環境変数については，マニュアル「画面・帳票サポートシステム　XMAP3 開発・実行ガイド」またはマニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 実行ガイド」を参照してください。

8.6.6　XMAP3による印刷モードの注意事項

重ね打ちの制限

行データの重ね打ちはできません。

制御文字の取り扱い

制御文字は，次のように取り扱われます。

制御文字

プリンタ上での扱い

X'0A'（改行）

改行

X'0C'（改ページ）

改ページ

X'0D'（復帰）

印字されない

X'00'〜X'1F'，X'7F'

（ただしX'0A'，X'0C'，X'0D'は除く）

印字されない

可変長レコード形式を使用する場合の注意事項

WRITE文で書き出すレコードは，可変長レコード形式として定義していても，ファイルの先頭のヘッダレコード（128バイト）と各レコード先頭のレコード長領域（4バイト）が付加されません。

WRITE文で書き出すレコードは，レコード定義にCHARACTER TYPE句を指定している場合，基本項目または集団項目の下位項目（基本項目）単位で出力します。そのため，RECORD句のVARYING指定の可変長レコードの場合，DEPENDING ONで指定するレコード長は基本項目の境界でなければなりません。レコード長が基本項目の境界でない場合，基本項目の相対位置がレコード長を超える基本項目は出力されません。

リンクの指定

XMAP3による印刷モードを使用するCOBOLプログラムは，XMAP3の書式オーバレイ用のライブラリ（x3klib32.lib）をリンクする必要があります。ただし，ccbl2002コマンドでコンパイルと同時にリンクまで実行する場合，XMAP3ライブラリの指定は不要です。

書式オーバレイなしの行データだけの印刷はできません。行データだけを印刷するときでも，けい線や固定文字列などを何も指定していない空の書式を指定する必要があります。

WRITE文で書き出すレコードは，レコード定義にCHARACTER TYPE句を指定している場合，基本項目または集団項目の下位項目（基本項目）単位で出力します。そのため，RECORD句のVARYING指定の可変長レコードの場合，DEPENDING ONで指定するレコード長は基本項目の境界でなければなりません。レコード長が基本項目の境界でない場合，基本項目の相対位置がレコード長を超える基本項目は出力されません。

9　報告書作成機能

この章では，報告書作成機能を使った報告書の作成方法について説明します。

9.1　報告書作成機能の概要

一般に，事務計算で作成する報告書には，次のような幾つかの特徴があります。

報告書の一般的な特徴

報告書は，計算機のラインプリンタのミシン目ごとに区切られたページの集まりから成る。

報告書には，全体の表紙と裏表紙が付く。

各ページの上部や下部にはページの見出しが付く。

報告書の本文は，文章や図形で何か出来事を記述したものではなく，同じ形式のデータ（レコード）が縦に並んだものである。

データは，データ中の幾つかの項目（キーデータ項目，制御用データ項目）に従って，昇順または降順に順序正しく並んでいる。

制御用データ項目の値が変化すると制御の切れ目（コントロールブレーク）となり，小計，中計，大計などの報告実行を作成する。

このような形式と内容を持った報告書を，COBOLの通常の句や文を組み合わせて作成する場合，手間が掛かります。このためCOBOLには，通常の入出力機能とは別に，報告書作成機能が用意されています。

報告書作成機能は，定形的な報告書作成の手続きを，手続き部の文を組み合わせて指定するのではなく，データ部の記述項で指定します。

なお，このシステムでは，報告書作成機能（INITIATE／GENERATE／TERMINATE文）で作成した報告書は，AFTER ADVANCING指定のWRITE文で順ファイル（報告書ファイル）にレコードとして出力されます。

なお，報告書機能の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「13.　報告書作成機能」を参照してください。

9.2　ファイル割り当ての共通規則

報告書を出力するファイルは，環境部の入出力節で，ORGANIZATION句に順編成を指定します。

また，定数指定，環境変数指定，データ名指定のどれかの方法で，ASSIGN句に出力先の物理ファイル名を割り当てます。物理ファイル名の割り当て方法の詳細は，「6.2　ファイル割り当ての共通規則」を参照してください。

9.3　入出力エラー処理

9.3.1　USE手続き

手続きが通常の順序で実行されるのではなく，利用者が直接検出できない条件が発生したときに実行しなければならない手続きを，USE文で指定します。

USE文は，手続きの実行の条件を指定するための翻訳指示文です。そのため，USE文自身が実行されることはありません。

USE文で指定する手続きは，手続き部の宣言部分で指定します。手続き部の構成の規則については，マニュアル「COBOL2002　言語　標準仕様編」　「10.　手続き部（PROCEDURE DIVISION）」を参照してください。

報告書作成機能で使用するUSE文では，報告書作成手続きを指定するBEFORE REPORTING指定，およびAFTER STANDARD EXCEPTION PROCEDURE指定を使用できます。報告書作成機能を使用したプログラム中でのUSE文の指定例を，次に示します。

         ：
       01 FOOT1 TYPE IS CONTROL FOOTING SHITEN.
         02 LINE NUMBER PLUS 2.
         ：
       PROCEDURE DIVISION.
       DECLARATIVES.
       CNT SECTION.
           USE BEFORE REPORTING FOOT1.
       C.
         ADD 1 TO CNT-1.
       END DECLARATIVES.
         ：

このようにコーディングすると，FOOT1を印刷する前にADD 1 TO CNT-1が実行されます。

9.4　ファイルの作成と割り当て方法

報告書ファイルの作成と割り当て方法は，順編成ファイルの場合と同じです。詳細は，「6.4.1　ファイルの作成と割り当て方法」を参照してください。

9.5　ファイル編成とレコード形式

報告書ファイルのファイル編成とレコード形式は，順編成ファイルの場合と同じです。

9.6　報告書ファイルの出力

報告書作成機能で作成した報告書は，AFTER ADVANCING指定のWRITE文で順ファイル（報告書ファイル）にレコードとして出力されます。

報告書ファイルの出力形式は，レコード形式と報告書記述項でのCODE句の有無によって異なります。報告書ファイルの出力形式と出力例を次に示します。出力例のX'0A'は改行，X'0D'は復帰，X'0C'は改ページを示します。

固定長または可変長でCODE句の指定がない場合

順編成ファイルに対する，AFTER ADVANCING指定のWRITE文の形式で出力されます。

（例1）

WRITE REC AFTER ADVANCING 3で出力した場合

（例2）

WRITE REC AFTER ADVANCING PAGEで出力した場合

固定長でCODE句の指定がある場合

順編成ファイルに対する，AFTER ADVANCING指定のWRITE文の形式で出力されます。

利用者レコードの前後に付けられる制御コードについては，先頭の制御コード以外は，レコード長分の空白（CODE句で指定したコードが先頭に付けられる）と復帰コード，改行コードを付けた形式で出力されます。

ただし，-IgnoreLCCオプションの指定があるときは，レコード長から1を引いた分の空白と復帰コード，改行コードを付けた形式で出力されます。

（例1）

WRITE REC AFTER ADVANCING 3で出力した場合

（例2）

WRITE REC AFTER ADVANCING PAGEで出力した場合

可変長でCODE句の指定がある場合

順編成ファイルに対する，AFTER ADVANCING指定のWRITE文の形式で出力されます。

利用者レコードの前後に付けられる制御コードについては，先頭の制御コード以外は，CODE句で指定したコードを付けた形式で出力されます。

（例1）

WRITE REC AFTER ADVANCING 3で生成した場合

（例2）

WRITE REC AFTER ADVANCING PAGEで出力した場合

固定長でCODE句の指定がある場合と同じです。

9.7　報告書ファイルの入力

報告書ファイルを読んでレコードを入力するときの形式は，レコード形式と報告書記述項でCODE句を指定しているかどうかによって次のように異なります。

固定長でCODE句の指定がない場合

順編成固定長の形式では読めません。

固定長でCODE句の指定がある場合

順編成固定長で読むためには，利用者レコード長に制御コード分の2を加えた形式で読み込む必要があります。

ただし，-IgnoreLCCオプションの指定があるときは，先頭1バイトが出力されないため，レコード長に1を加えた形式で読み込みます。

（例）-IgnoreLCCオプション指定なしの場合

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT FILE1 ASSIGN SYS001.
       DATA DIVISION.
       FILE SECTION.
       FD FILE1.
       01 REC-1.
        02 R-DATA1 PIC X(1).             …1.
        02 R-DATA2 PIC X(1) or PIC X(2). …2.
        02 R-DATA3 PIC X(n).             …3.
        02 R-DATA4 PIC X(1).             …4.
       WORKING-STORAGE SECTION.
             ：
       PROCEDURE DIVISION.
             ：
           OPEN INPUT FILE1.
             ：
           READ FILE1.
             ：
           CLOSE FILE1.
           STOP RUN.

行制御コードX'0C'（改ページ）またはX'0A'（改行）

ファイル作成時にCODE句で指定した文字の長さ分（1バイトまたは2バイト）を確保する。

ファイル作成時にRD句で指定したレコード長（2.の長さは含まない）

行制御コードX'0D'（復帰）

可変長の場合

可変長の場合，CODE句の指定があるかどうかに関係なく可変長ファイルとして作成されないため，順編成可変長では読めません。また，順編成固定長でも読めません。

10　ACCEPT／DISPLAY／STOP文による入出力

この章では，ACCEPT文，DISPLAY文，およびSTOP文を使用した入出力機能について説明します。

10.1　ACCEPT／DISPLAY／STOP文による入出力の種類と概要

COBOL2002では，ACCEPT文，DISPLAY文，STOP文を使用して，次の入出力操作を実行できます。

少量入出力

標準入出力ファイル（stdin，stdout，stderr）やCOBOL2002の出力するコンソールウィンドウに対して，データを入出力できます。

詳細は，「10.2　少量入出力」を参照してください。

日付や時刻の取得

日付や時刻の情報を取得できます。

詳細は，「10.2.4　日付や時刻を取得するACCEPT文」を参照してください。

コマンド行へのアクセス

コマンド名称，コマンド行の引数の個数，および引数の値を取得できます。

詳細は，「10.3　コマンド行へのアクセス」を参照してください。

環境変数へのアクセス

環境変数の値を取得したり，環境変数を設定したりできます。

詳細は，「10.4　環境変数へのアクセス」を参照してください。

イベントログファイルへの出力

Windowsのイベントログサービスで使えるイベントログファイルに対して，データをイベントとして出力できます。

詳細は，「10.5　イベントログファイル出力機能」を参照してください。

なお，ACCEPT文，DISPLAY文，およびSTOP文の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.1　ACCEPT文」，「COBOL2002　言語　標準仕様編」　「10.8.12　DISPLAY文」，「COBOL2002　言語　標準仕様編」　「10.8.46　STOP文」をそれぞれ参照してください。

10.2　少量入出力

ここでは，ACCEPT文，DISPLAY文，およびSTOP文を使用して，標準入出力ファイルやCOBOL2002の出力するコンソールウィンドウにデータを入出力する方法について説明します。

10.2.1　入出力の対象とするファイルの割り当て方法

ACCEPT文およびDISPLAY文で入出力の対象とするファイルは，環境変数によって割り当てます。

(1)　ACCEPT文

ACCEPT文のFROM指定と，環境変数の値によって，データの入力元となるファイルが決まります。FROM指定，環境変数の値と，データの入力元との関係を，次に示します。

FROM句

の指定

環境変数の指定

データの入力元

GUIモードの場合

CUIモードの場合

SYSIN

　または

SYSIPT

CBL_SYSIN=stdin

ファイル名「stdin」

標準入力

CBL_SYSIN=stdout

ファイル名「stdout」

（エラーとなる）

CBL_SYSIN=stderr

ファイル名「stderr」

（エラーとなる）

CBL_SYSIN=syslog

ファイル名「syslog」

CBL_SYSINが上記以外の場合

環境変数CBL_SYSINで指定した名称のファイル

CBL_SYSINの指定がない場合

COBOL2002が出力するダイアログボックス

標準入力

CONSOLE

COBOL2002が出力するダイアログボックス

標準入力

SYSSTD

CBL_SYSSTD=stdin

ファイル名「stdin」

標準入力

CBL_SYSSTD=stdout

ファイル名「stdout」

（エラーとなる）

CBL_SYSSTD=stderr

ファイル名「stderr」

（エラーとなる）

CBL_SYSSTD=syslog

ファイル名「syslog」

CBL_SYSSTDが上記以外の場合

環境変数CBL_SYSSTDで指定した名称のファイル

CBL_SYSSTDの指定がない場合

COBOL2002が出力するダイアログボックス

標準入力

注

CUIモードのときに，標準入力（stdin）を指定する場合は，英小文字で指定してください。「STDIN」のように英大文字で指定した場合，物理ファイル名として扱われます。

(2)　DISPLAY文

DISPLAY文のUPON指定と，環境変数の値によって，データの出力先となるファイルが決まります。UPON指定，環境変数の値と，データの出力先との関係を，次に示します。

UPON句

の指定

環境変数の指定

データの出力先

GUIモードの場合

CUIモードの場合

SYSPUNCH

　または

SYSPCH

CBL_SYSPUNCH=stdin〔+〕

ファイル名「stdin」

（エラーとなる）

CBL_SYSPUNCH=stdout〔+〕

ファイル名「stdout」

標準出力※1

CBL_SYSPUNCH=stderr〔+〕

ファイル名「stderr」

標準エラー出力※1

CBL_SYSPUNCH=syslog〔+〕

ファイル名「syslog」※2

CBL_SYSPUNCH=上記以外のファイル名〔+〕

環境変数CBL_SYSPUNCHで指定した名称のファイル

CBL_SYSPUNCH指定なし

COBOL2002が出力するウィンドウ

標準出力

SYSOUT

　または

SYSLST

CBL_SYSOUT=stdin〔+〕

ファイル名「stdin」

（エラーとなる）

CBL_SYSOUT=stdout〔+〕

ファイル名「stdout」

標準出力※1

CBL_SYSOUT=stderr〔+〕

ファイル名「stderr」

標準エラー出力※1

CBL_SYSOUT=syslog〔+〕

ファイル名「syslog」※2

CBL_SYSOUT=上記以外のファイル名〔+〕

環境変数CBL_SYSOUTで指定した名称のファイル

CBL_SYSOUT指定なし

COBOL2002が出力するウィンドウ

標準出力

CONSOLE

COBOL2002が出力するウィンドウ

標準出力

注

CUIモードのときに，標準出力（stdout），標準エラー出力（stderr），およびイベントログファイル出力（syslog）を指定する場合は，英小文字で指定してください。「STDIN」のように英大文字で指定した場合，物理ファイル名として扱われます。

また，環境変数CBL_SYSPUNCH，CBL_SYSOUTの指定で，ファイル名の末尾に「+」を付けると，追加モードでデータを出力できます。

CBL_SYSPUNCH=ファイル名+

CBL_SYSOUT=ファイル名+

注※1

追加モードは無視されます。

注※2

イベントログファイル出力機能が有効な場合は，イベントログファイル出力になります。詳細は，「10.5　イベントログファイル出力機能」を参照してください。

10.2.2　CUIモード，GUIモードとの関係

ACCEPT文，DISPLAY文，およびSTOP文の入出力先の指定が特にない場合，CUI，GUIモードでは次のような指定になります。

GUIモード

COBOL2002が出力するダイアログボックス，またはコンソールウィンドウ

CUIモード

標準入出力（stdin，stdout）

10.2.3　外部からのデータを入力するACCEPT文

ACCEPT文で外部からのデータを入力する場合，次の2種類の方法で受け取り側作用対象にデータを設定できます。

標準転記

入力したデータをそのまま受け取り側作用対象に設定します。

数値へのデータ変換を伴う転記

受け取り側作用対象が数字項目の場合，入力された英数字データを数字データへ変換して，受け取り側作用対象に設定します。

(1)　標準転記によるACCEPT文

少量入出力に使用するACCEPT文について説明します。なお，ACCEPT文の言語仕様の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.1　ACCEPT文」を参照してください。

(a)　形式

ACCEPT 一意名
  〔FROM ｛SYSIN｜SYSIPT｜CONSOLE｜SYSSTD｜呼び名｝〕

(b)　一般規則

FROM指定を省略するとSYSINが仮定されます。

SYSIPTは，SYSINと同様とみなされます。

入出力の対象とするファイルの規則については，「10.2.1　入出力の対象とするファイルの割り当て方法」の「(1)　ACCEPT文」を参照してください。

環境変数CBL_SYSINまたは環境変数CBL_SYSSTDに値が指定されていない場合，またはCONSOLE指定がある場合の入力先は，次のような指定になります。

モードの種類

データの入力元

GUIモード

COBOL2002が出力するダイアログボックス

CUIモード

標準入力

標準エラー出力

一意名の領域には，入力データの最後の改行文字は格納されません。

入出力エラーが発生した場合は，エラーメッセージが出力され，処理が終了します。

(c)　SYSIN，SYSIPT，CONSOLEを指定した場合の規則

データ入力の単位

改行文字までが1回だけ入力されます。

転記規則

入力データが一意名の領域より長い場合，一意名の長さで区切られ，残りは切り捨てられます。

入力データが一意名の領域より短い場合，一意名の残りの領域には空白が埋められます。

入力データは一意名の領域の左端から順に転送されます。一意名が日本語項目なら日本語空白文字（シフトJISのときはX'8140'）が，日本語項目以外なら標準コードの空白文字（X'20'）が埋められます。日本語項目で入力が語境界（2バイトで1語）でなければエラーメッセージを出力して終了します。

(d)　SYSSTDを指定した場合の規則

データ入力の単位

1レコードは常に80バイトであり，改行文字がレコードの区切りとなります。1レコードが80バイトを超える場合は，先頭から80バイトが転送され，残りのデータは改行文字まで切り捨てられます。1レコードが80バイト未満の場合は，残った領域に空白文字が埋められたレコードとして扱われます。

転記規則

一意名の長さが80バイトの場合，データは一度だけ転送されます。

一意名の長さが80バイトより短い場合は，データは一度だけ転送され，残りは切り捨てられます。

一意名の長さが80バイトより長い場合は，一意名の長さを満たすまで80バイト単位で転送が繰り返されます。一意名の長さが80の倍数でないときは，80バイト単位での転送を繰り返したあと，最後に残った80バイト未満のデータ領域に入力データが格納されます。ただし，最後に残った80バイト未満のデータ領域に入りきらないデータがある場合，残ったバイト数から右側は，切り捨てられます。

入力データは一意名の領域の左端から順に転送されます。一意名が日本語項目なら日本語空白文字（シフトJISのときはX'8140'）が，日本語項目以外なら標準コードの空白文字（X'20'）が埋められます。日本語項目で入力が語境界（2バイトで1語）でなければエラーメッセージを出力して終了します。

(e)　ACCEPT文の表示形式（GUIモードの場合）

GUIモードでACCEPT文を実行した場合，COBOL2002が出力するダイアログボックスを次に示します。

ここで［Esc］キーを押すと，ダイアログボックスが閉じ，データを入力しないで［OK］ボタンを選んだ場合と同じ動きとなります。

なお，ダイアログボックスに入力した文字はコンソールウィンドウに出力されます。

(2)　数値へのデータ変換を伴うACCEPT文

-NumAcceptオプションが指定されている場合，ACCEPT文は数字項目，数字編集項目，外部浮動小数点数字項目，内部浮動小数点数字項目で定義されている受け取り側作用対象に対して，入力されたデータを受け取り側作用対象の属性に合わせたデータに変換して，設定します。

(a)　データ変換の規則

データ変換の規則を，次に示します。

表10‒1　-NumAcceptオプション指定時のACCEPT文の入力規則

一意名の項目

受け取り

領域長

入力できる文字

備考

符号なし数字項目

（Sなし）

Vなし

けた数

0〜9

Vあり

けた数+1

0〜9 .

数字はけた数以内

小数点位置を合わせる

符号あり数字項目

（Sあり）

Vなし

けた数+1

0〜9 + -

数字はけた数以内

Vあり

けた数+2

0〜9 + - .

数字はけた数以内

小数点位置を合わせる

数字編集項目

一意名長※

0〜9 + - CR DB

数字は有効数字長以内

小数点位置を合わせる

外部浮動小数点数字項目

V .なし

22

0〜9 E + -

数字は有効けた数以内

V .あり

22

0〜9 E + - .

内部浮動小数点数字項目

単精度

22

0〜9 E + - .

倍精度

22

0〜9 E + - .

注※

ただし，左端にPを書いた数字編集項目の場合，左端にVを想定するため一意名長+1となります。

(b)　転記規則

転記規則

入力データが一意名の領域より長い場合，「表10‒1　-NumAcceptオプション指定時のACCEPT文の入力規則」に示す受け取り領域長で区切られ，残りは切り捨てられます。

入力データが一意名の領域より短い場合，入力した長さだけが有効となり，一意名の残りの領域にはゼロが埋められます。

入力データは，一意名が数字項目の場合は小数点の位置に合わせて，数字編集項目の場合は編集文字に合わせて，外部浮動小数点数字項目，内部浮動小数点数字項目の場合は小数点位置，Eの位置に合わせて，それぞれ右詰めで転記されます。

(c)　入力データのチェック

次の規則に従って，入力データがチェックされます。

不当文字を入力した場合

各項目に「表10‒1　-NumAcceptオプション指定時のACCEPT文の入力規則」の入力できる文字以外の文字が入力された場合，不当文字とみなされます。入力データ中に使用できる文字と不当文字とが混在している場合，不当文字は，一意名へ転記されません。

符号，小数点，Eを複数入力した場合

左端から検索し，最初に出現したものを有効とします。それ以降に出現したものは不当文字として扱います。

すべて不当文字の文字列を入力するか，または何も入力しなかった場合

一意名にすべてゼロを設定します。

一意名が外部浮動小数点数字項目，内部浮動小数点数字項目の場合

入力形式は小数点を含む外部10進形式，外部浮動小数点数字形式のどちらでもかまいません。ただし，外部浮動小数点数字形式で入力した場合，指数部のけた数は2けたまで有効となります。

10.2.4　日付や時刻を取得するACCEPT文

ACCEPT文で，FROM指定にDATE，DAY，DAY-OF-WEEK，およびTIMEを指定すると，それぞれの指定に応じた日付／時刻の情報を取得できます。

(1)　ACCEPT文で取得できる日付／時刻のデータ

ACCEPT文で取得できる日付／時刻のデータを，次に示します。

FROM指定

内容

形式

DATE

yymmdd

yy：西暦年号の下2けた

mm：01〜12（月）

dd：01〜31（日）

符号のない6けたの数字項目

DAY

yyddd

yy：西暦年号の下2けた

ddd：001〜366（通年日）

符号のない5けたの数字項目

DAY-OF-WEEK

w

w：1〜7（曜日）

1：月曜日

2：火曜日

　　　：

7：日曜日

符号のない1けたの数字項目

TIME

hhmmsstt

hh：00〜23（時）

mm：00〜59（分）

ss：00〜59（秒）

tt：00〜99（1/100秒）

符号のない8けたの数字項目

(2)　ACCEPT文で取得する日付の変更

通常，ACCEPT文では，現在の日付を取得しますが，環境変数を指定すると任意の日付を取得できます。

ACCEPT文で取得する日付を変更する方法を，次に示します。

(a)　西暦日付の変更（CBLDATE）

COBOLプログラムが取得する西暦表記の年月日を変更するには，環境変数CBLDATEを指定します。

形式

CBLDATE=yyyymmdd

yyyy

西暦の年を4けたで指定します。

mm

月を2けたで指定します。

dd

日を2けたで指定します。

規則

環境変数CBLDATEを指定して取得する日付を変更できるのは，次の文および関数です。

環境変数CBLDATEでの日付指定が有効となるCOBOLの文／関数

　・ACCEPT文 DATE指定

　・CURRENT-DATE関数

　・MOVE文（日付と時刻用） CURRENT-DATE指定

この環境変数は，上記の文のどれかを初めて実行したときに指定されている値を有効とします。

西暦年yyyyのうち，DATE指定のACCEPT文とMOVE文のCURRENT-DATE指定では下2けたが使用され，CURRENT-DATE関数では4けたが使用されます。

上記以外の形式で値を指定した場合，実行時に警告のメッセージが出力されます。この場合，環境変数CBLDATEを指定していない場合と同じように，DATE指定のACCEPT文にはシステムの日付が返されます。

指定例

COBOLプログラムが取得する西暦日付を，2010年10月12日に変更する場合の指定例を，次に示します。

CBLDATE=20101012

(b)　通算日付の変更（CBLDAY）

COBOLプログラムのACCEPT文DAY指定が取得する西暦年，および通年日を変更するには，環境変数CBLDAYを指定します。

形式

CBLDAY=yyyyddd

yyyy

西暦の年を4けたで指定します。

ddd

通年日（その年が始まってからの通算の日付）を3けたで指定します。

規則

この環境変数を指定すると，初めてDAY指定のACCEPT文が実行されたとき，yyddd（yyは西暦の下2けた）の部分が取得されます。

上記以外の形式で値を指定した場合，実行時に警告のメッセージが出力されます。この場合，環境変数CBLDAYを指定していない場合と同じように，DAY指定のACCEPT文にはシステムの日付が返されます。

指定例

ACCEPT文DAY指定が取得する通算日付を，2010年の56日に変更する場合の指定例を，次に示します。

CBLDAY=2010056

10.2.5　DISPLAY文によるデータの出力

少量入出力に使用するDISPLAY文について説明します。なお，DISPLAY文の言語仕様の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.12　DISPLAY文」を参照してください。

(1)　形式

DISPLAY ｛一意名｜定数｝
  〔UPON ｛SYSPUNCH｜SYSOUT｜SYSLST｜SYSPCH｜CONSOLE｜呼び名｝〕
  〔WITH NO ADVANCING〕
  〔IN DATA DUMP〕

(2)　一般規則

UPON指定を省略するとSYSOUTが仮定されます。

SYSLSTは，SYSOUTと同様とみなされます。

入出力の対象とするファイルの規則については，「10.2.1　入出力の対象とするファイルの割り当て方法」の「(2)　DISPLAY文」を参照してください。

指定した一意名または定数全部が出力されたあと，改行文字が最後に出力されます。ただし，WITH NO ADVANCING指定がある場合は，最後の改行文字が出力されません。

IN DATA DUMP指定がある場合は，一意名の格納値はバイト単位に16進数に変換されて出力されます。一意名の格納値の表示形式については，「37.8　DISPLAY文による一意名の16進ダンプ表示」を参照してください。

入出力エラーが発生した場合は，エラーメッセージが出力されてから処理が終了します。

(3)　DISPLAY文の表示形式（GUIモードの場合）

GUIモードでDISPLAYを実行した場合，COBOL2002が出力するウィンドウ（コンソールウィンドウ）を次に示します。

コンソールウィンドウの規則

ウィンドウの表示サイズは，25行×80カラムで固定です。DISPLAY文で出力したデータが80バイトを超える場合は，折り返して表示されます。

コンソールウィンドウには，次のデータが出力されます。

コンソールウィンドウに出力されるデータの種類

出力先がファイルでない場合のDISPLAY文

COBOL2002が出力する実行時メッセージ

入力先の割り当てがファイルでない場合のACCEPT文で入力されたデータ

ウィンドウ内の文字のフォントは，実行支援ウィンドウの［設定］メニューの［画面環境］で表示される画面環境ダイアログボックスの［フォント］ボタンで変更できます。変更方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

ウィンドウの文字色と背景色は，Windowsのコントロールパネルで変更できます。

10.2.6　STOP文

少量入出力に使用するSTOP文について説明します。なお，STOP文の言語仕様の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.46　STOP文」を参照してください。

(1)　形式

STOP 定数1

(2)　一般規則

GUIモードの場合の規則

STOP 定数文が実行されると，実行が中断し，COBOL2002が出力するダイアログボックスに定数1が表示されます。次に，例を示します。

（STOP 定数文を使用したプログラムの例）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST1.
       PROCEDURE DIVISION.
           STOP '＊＊　ＳＴＯＰ定数　＊＊'
           EXIT PROGRAM.
       END PROGRAM TEST1.

（GUIモードで出力されるダイアログボックス）

このダイアログボックスの［OK］ボタンを選ぶと，プログラムが再実行されます。

CUIモードの場合の規則

STOP 定数文が実行されると，次の入力要求メッセージが標準エラー出力（stderr）に出力されます（「_」はカーソルを示します）。

（STOP 定数文の出力結果）

KCCC2003R-I
定数1
_

ただし，環境変数CBL_STOPNOADVにYESを指定した場合は，定数1だけが出力され，メッセージIDと定数1の直後の改行文字は出力されません。

形式

CBL_STOPNOADV=YES

（環境変数CBL_STOPNOADVにYESを指定した場合のSTOP 定数文の出力結果）

定数1_

10.3　コマンド行へのアクセス

ACCEPT文，DISPLAY文を使用して，コマンド行の情報へアクセスする方法について説明します。

コマンド行へのアクセスについては，マニュアル「COBOL2002　言語　拡張仕様編」　「10.　コマンド行のアクセス」を参照してください。

10.3.1　コマンド行へのアクセスの種類と概要

ACCEPT文，DISPLAY文を使用して，次のコマンド行の情報を取得できます。

コマンド行の引数の個数

コマンド名称，およびコマンド行の引数の値

コマンド行の情報を取得するには，次の2種類の方法があります。

コマンド行の情報を個別に取得する方法

機能名ARGUMENT-NUMBER，ARGUMENT-VALUEを使用して，コマンド行の引数の個数，コマンド名称，またはコマンド行の個々の引数の値を，一つずつ取得します。

詳細は，「10.3.2　引数を個別に取得する方法」を参照してください。

コマンド行の情報を一括して取得する方法

機能名COMMAND-LINEを使用して，コマンド行のすべての引数の値を，一括して取得します。

詳細は，「10.3.3　引数を一括して取得する方法」を参照してください。

10.3.2　引数を個別に取得する方法

機能名ARGUMENT-NUMBERおよびARGUMENT-VALUEを使うことで，コマンド行に指定された引数の個数を取得できます。また，コマンド名称や，複数の引数の個々の値を取得できます。

(1)　コマンド行の引数の個数を取得する

コマンド行の引数の個数を取得するには，ACCEPT文を使用します。

形式（引数の個数の取得）

ACCEPT 一意名1 FROM 呼び名1※
        〔END-ACCEPT〕

注※

呼び名1は，環境部の特殊名段落で，ARGUMENT-NUMBERに関連づけておく必要があります。

(2)　コマンド行のファイル名称，引数の値を取得する（順読み込み）

コマンド行のファイル名称および引数の値を，コマンド行の先頭から順番に読み出して取得するには，ACCEPT文を使用します。

形式（ファイル名称または引数の値の順読み出し）

ACCEPT 一意名2 FROM 呼び名2※
        〔ON EXCEPTION 無条件文1〕
        〔NOT ON EXCEPTION 無条件文2〕
        〔END-ACCEPT〕

注※

呼び名2は，環境部の特殊名段落でARGUMENT-VALUEに関連づけておく必要があります。

(3)　コマンド行のファイル名称，引数の値を取得する（乱読み込み）

コマンド行のファイル名称および引数の値を，コマンド行の任意の位置から読み出して取得するには，最初にDISPLAY文を使用して読み出す位置を指定し，次にACCEPT文を使用してファイル名称または引数の値を読み出します。

形式（読み出し位置の指定）

DISPLAY  ｛一意名3｜整数1｝  UPON 呼び名1※1
         〔END-DISPLAY〕

形式（指定位置からのファイル名称または引数の値の読み出し）

ACCEPT 一意名2 FROM 呼び名2※2
        〔ON EXCEPTION 無条件文1〕
        〔NOT ON EXCEPTION 無条件文2〕
        〔END-ACCEPT〕

注※1

呼び名1は，環境部の特殊名段落でARGUMENT-NUMBERに関連づけておく必要があります。

注※2

呼び名2は，環境部の特殊名段落でARGUMENT-VALUEに関連づけておく必要があります。

(4)　規則

(1)(2)(3)に共通する規則

コマンド行へのアクセスができるのは，-Main,Systemオプションを指定したCOBOL主プログラムと，主プログラムに-Main,Systemオプションを指定したCOBOLプログラムを持つCOBOLの副プログラムでだけです。

コマンド行へのアクセスを使用しているCOBOL主プログラムに-Main,V3オプションを指定した場合，コンパイルエラーとなります。また，COBOL副プログラムに，-Main,Systemオプションを指定したCOBOL主プログラム以外のプログラムを持つ場合，実行時にエラーメッセージが出力され異常終了します。

(1)の形式での規則

引数および引数の個数を取得するときの転記規則を次に示します。

転記規則

引数は，一意名の左端から順に転送されて転記されます。

引数が一意名の領域より長い場合，一意名の長さで区切られます。

引数が一意名の領域より短い場合，標準コードの空白文字（X'20'）が埋められます。

コマンド行に引数を指定していない場合，ACCEPT文で取得する引数の個数は0になります。

(2)の形式での規則

順読み込みで引数を取得するときに，実行単位で最初に取得する引数は，実行可能ファイル名の次に指定された第1引数になります。

順読み込みで引数を取得する場合，上位プログラムで引数を取得し，さらに下位プログラムで引数を取得するときは，上位プログラムで最後に取得した引数の次の引数になります。

(3)の形式での規則

乱読み込みで引数を取得する場合，引数の位置を指定するDISPLAY文と指定した位置の引数を取得するACCEPT文は，プログラム間にわたって指定できます。

一意名3の内容または整数1に0を指定し，ACCEPT文で引数を取得した場合，実行可能ファイル名を取得します。

コマンド行に指定した実行可能ファイル名を取得するときは，入力した文字列のまま取得されます。

(5)　プログラム例

コマンド行の引数および引数の個数を取得する方法を，プログラム例を使って説明します。

実行時のコマンド行指定

SAMPLE1.EXE AAA BBB CCC DDD EEE FFF

プログラム例1

コマンド行の引数および引数の個数を取得する例を示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ARGUMENT-NUMBER IS ARGNUM
       ARGUMENT-VALUE  IS ARGVAL
           :
       WORKING-STORAGE SECTION.
       01 ARGCNT  PIC 99.
       01 ARGDATA PIC X(10).
       PROCEDURE DIVISION.
           :
           ACCEPT ARGCNT FROM ARGNUM.   …1.
           :
           ACCEPT ARGDATA FROM ARGVAL   …2.
                  ON EXCEPTION 〜
                  NOT ON EXCEPTION 〜
           END-ACCEPT.
           :
           DISPLAY 3 UPON ARGNUM.       …3.
           ACCEPT ARGDATA FROM ARGVAL   …4.
                  ON EXCEPTION 〜
                  NOT ON EXCEPTION 〜
           END-ACCEPT.
           :

コマンド行に指定した引数の個数6を取得します。

コマンド行に指定した引数'AAA'を取得します。

コマンド行に指定した3番目の引数位置を設定します。

3.のDISPLAY文で指定した3番目の引数'CCC'を取得します。

プログラム例2

順読み込みで，引数の取得がプログラム間にわたるときに，コマンド行の引数および引数の個数を取得する例を示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ARGUMENT-VALUE IS ARGVAL
           :
       WORKING-STORAGE SECTION.
       01 DATA1 PIC X(10).
       PROCEDURE DIVISION.
           :
           ACCEPT DATA1 FROM ARGVAL …1.
                  ON EXCEPTION 〜
                  :
                  NOT ON EXCEPTION 〜
                  :
           END-ACCEPT.
           CALL 'SAMPLE2'.
           :

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ARGUMENT-VALUE IS ARGVAL
           :
       WORKING-STORAGE SECTION.
       01 DATA1 PIC X(10).
       PROCEDURE DIVISION.
           :
           ACCEPT DATA1 FROM ARGVAL …2.
                  ON EXCEPTION 〜
                  :
                  NOT ON EXCEPTION 〜
                  :
           END-ACCEPT.
           :

コマンド行に指定した第1引数'AAA'を取得します。

コマンド行に指定した第2引数'BBB'を取得します。

プログラム例3

順読み込みで，引数の取得がプログラム間にわたるときに，コマンド行の引数および引数の個数を取得する例を示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ARGUMENT-NUMBER IS ARGNUM
           :
       WORKING-STORAGE SECTION.
           :
       PROCEDURE DIVISION.
           :
           DISPLAY 3 UPON ARGNUM. …1.
           :
           CALL 'SAMPLE2'.
           :

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ARGUMENT-VALUE IS ARGVAL
           :
       WORKING-STORAGE SECTION.
       01 DATA1 PIC X(10).
       PROCEDURE DIVISION.
           :
           ACCEPT DATA1 FROM ARGVAL …2.
                  ON EXCEPTION 〜
                  :
                  NOT ON EXCEPTION 〜
                  :
           END-ACCEPT.
           :

コマンド行に指定した第3引数の引数位置3を指定します。

1.のDISPLAY文で指定した第3引数'CCC'を取得します。

10.3.3　引数を一括して取得する方法

機能名COMMAND-LINEを使うことで，コマンド行に指定された複数の引数を一括して取得できます。

(1)　コマンド行の引数を取得

ACCEPT文実行時に，コマンド行の引数の内容を取得します。このとき，空白行で区切られた複数の引数を1回のACCEPT文でまとめて取得できます。

ACCEPT文の形式

ACCEPT 一意名
       FROM ｛COMMAND-LINE｜COMMAND-LINEに対する呼び名｝
       〔END-ACCEPT〕

(2)　コマンド行の引数の内容を更新

DISPLAY文実行時に，一意名または定数で指定された内容をコマンド行の引数の内容を格納しているコマンド行バッファに上書きします。COMMAND-LINE指定のあるDISPLAY文の実行後に，COMMAND-LINE指定のあるACCEPT文を実行すると，先に実行したDISPLAY文で設定した内容が取り出されます。

DISPLAY文の形式

DISPLAY ｛一意名｜定数｝
        UPON ｛COMMAND-LINE｜COMMAND-LINEに対する呼び名｝
        〔END-DISPLAY〕

(3)　規則

コマンド行へのアクセスができるのは，-Main,Systemオプションを指定したCOBOL主プログラムと，主プログラムに-Main,Systemオプションを指定したCOBOLプログラムを持つCOBOLの副プログラムでだけです。

コマンド行へのアクセスを使用しているCOBOL主プログラムに-Main,V3オプションを指定した場合，コンパイルエラーとなります。また，COBOL副プログラムに，-Main,Systemオプションを指定したCOBOL主プログラム以外のプログラムを持つ場合，実行時にエラーメッセージが出力され異常終了します。

ACCEPT文で数字項目を正しく受け取るにはコンパイル時に-NumAcceptオプションが必要です。また，2進項目，内部10進項目，内部浮動小数点数字項目使用時には-NumAcceptオプションを指定しないとコンパイルエラーとなります。

10.4　環境変数へのアクセス

ACCEPT文，DISPLAY文を使用して，環境変数の値を取得・設定する方法について説明します。

環境変数のアクセスについては，マニュアル「COBOL2002　言語　拡張仕様編」　「10.　コマンド行のアクセス」を参照してください。

10.4.1　環境変数の値の読み込み

DISPLAY文（環境変数名の設定）の形式

DISPLAY ｛一意名4｜定数1｝ UPON 呼び名3※1
        〔END-DISPLAY〕

ACCEPT文（環境変数の値の取得）の形式

ACCEPT 一意名2 FROM 呼び名4※2
       〔ON EXCEPTION 無条件文3〕
       〔NOT ON EXCEPTION 無条件文2〕
       〔END-ACCEPT〕

注※1

呼び名3は，環境部の特殊名段落で，ENVIRONMENT-NAMEに関連づけておく必要があります。

注※2

呼び名4は，環境部の特殊名段落で，ENVIRONMENT-VALUEに関連づけておく必要があります。

10.4.2　環境変数への値の書き出し

DISPLAY文（環境変数名の設定）の形式

DISPLAY ｛一意名4｜定数1｝ UPON 呼び名3※1
        〔END-DISPLAY〕

DISPLAY文（環境変数の値の書き出し）の形式

DISPLAY ｛一意名2｜定数2｝ UPON 呼び名4※2
        〔ON EXCEPTION 無条件文1〕
        〔NOT ON EXCEPTION 無条件文2〕
        〔END-DISPLAY〕

注※1

呼び名3は，環境部の特殊名段落で，ENVIRONMENT-NAMEに関連づけておく必要があります。

注※2

呼び名4は，環境部の特殊名段落で，ENVIRONMENT-VALUEに関連づけておく必要があります。

10.4.3　環境変数へのアクセスに関する規則

環境変数名および環境変数の値を設定する場合，DISPLAY文に指定した一意名または定数中に含まれる空白も有効となります。

環境変数名を設定する場合，環境変数名には"="を指定できません。指定した場合，正常に動作しなくなることがあります。

環境変数名を設定する場合，環境変数名にNULL（X'00'）が含まれているとき，NULLの直前までの値が有効となります。環境変数の値を設定する場合，環境変数の値にNULL（X'00'）が含まれているとき，NULLの直前までの値が有効となります。

環境変数の値を取得する場合，環境変数が存在しない，または指定した環境変数に値がないとき，ACCEPT文で実行時エラーとなります。

環境変数名の先頭にNULL（X'00'）を指定したときの規則を次に示します。

環境変数の値の取得処理（ACCEPT文）は，エラーとなります。

環境変数の値の設定処理（DISPLAY文）は，何も処理しません。

次に示す文の組み合わせは，プログラム間にわたって指定できます。

環境変数名を設定するDISPLAY文と環境変数の値を取得するACCEPT文

環境変数名を設定するDISPLAY文と環境変数の値を設定するDISPLAY文

環境変数の値を取得するときの転記規則を次に示します。

環境変数の値は，一意名の左端から順に転送されて転記されます。

環境変数の値が一意名の領域より長い場合，一意名の長さで区切られます。

環境変数の値が一意名の領域より短い場合，標準コードの空白文字（X'20'）が埋められます。

次の環境変数には，環境変数へのアクセス機能で値を書き出せません。

CBLACTWIN

CBLCOMCBR

CBLTDEXEC

環境変数の値をクリアせずにCOBOLプログラムの実行を終了し，あとに同じプロセスでCOBOLプログラムが動作した場合，環境変数を設定しなくても以前実行時に設定した環境変数の値を取得できます。

COBOLプログラムを終了する前にNULL（X'00'）で始まる値を設定することで，値のない環境変数を設定できます。

10.4.4　使用例

実行時の環境変数指定

CBLABNLST=¥tmp¥abnlst
CBLDDUMP=¥tmp¥dumplst

プログラム例1

環境変数へのアクセス例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ENVIRONMENT-NAME IS ENVNAM
       ENVIRONMENT-VALUE IS ENVVAL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ENVNAME1 PIC X(9).
       01 ENVNAME2 PIC X(8).
       01 ENVDATA PIC X(20).
       PROCEDURE DIVISION.
           :
           MOVE 'CBLABNLST' TO ENVNAME1.
           DISPLAY ENVNAME1 UPON ENVNAM.  …1.
           ACCEPT ENVDATA FROM ENVVAL     …2.
               ON EXCEPTION 〜
               :
               NOT ON EXCEPTION 〜
               :
           END-ACCEPT.
           :
           MOVE 'CBLDDUMP' TO ENVNAME2.
           MOVE '¥tmp¥dumplst2' TO ENVDATA.
           DISPLAY ENVNAME2 UPON ENVNAM.  …3.
           DISPLAY ENVDATA UPON ENVVAL    …4.
               ON EXCEPTION 〜
               :
               NOT ON EXCEPTION 〜
               :
           END-DISPLAY.
           :

値を取得したい環境変数名（CBLABNLST）を指定します。

1.で指定した環境変数（CBLABNLST）の値（¥tmp¥abnlst）を取得します。

値を設定したい環境変数名（CBLDDUMP）を指定します。

3.で指定した環境変数（CBLDDUMP）に値（¥tmp¥dumplst2）を設定します。

プログラム例2

環境変数へのアクセスがプログラム間にわたる場合の，環境変数の値の取得例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ENVIRONMENT-NAME IS ENVNM.
                  :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ENVNAME PIC X(9).
       PROCEDURE DIVISION.
                  :
           MOVE 'CBLABNLST' TO ENVNAME.
           DISPLAY ENVNAME UPON ENVNM.   …1.
                  :
           CALL 'SAMPLE2'.
                  :

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ENVIRONMENT-VALUE IS ENVVAL.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ENVDATA PIC X(20).
       PROCEDURE DIVISION.
           :
           ACCEPT ENVDATA FROM ENVVAL  …2.
                  ON EXCEPTION 〜
                  :
                  NOT ON EXCEPTION 〜
                  :
           END-ACCEPT.
           :

値を取得したい環境変数名（CBLABNLST）を指定します。

1.で指定した環境変数（CBLABNLST）の値（¥tmp¥abnlst）を取得できます。

プログラム例3

環境変数へのアクセスがプログラム間にわたる場合の，環境変数の値の設定例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ENVIRONMENT-NAME IS ENVNM.
                  :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ENVNAME PIC X(9).
       PROCEDURE DIVISION.
                  :
           MOVE 'CBLABNLST' TO ENVNAME.
           DISPLAY ENVNAME UPON ENVNM.  …1.
                  :
           CALL 'SAMPLE2'.
                  :

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
       ENVIRONMENT-VALUE IS ENVVAL.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ENVDATA PIC X(20).
       PROCEDURE DIVISION.
           :
           MOVE '¥tmp¥abnlst' TO ENVDATA.
           DISPLAY ENVDATA UPON ENVVAL  …2.
                   ON EXCEPTION 〜
                   :
                   NOT ON EXCEPTION 〜
                   :
           END-DISPLAY.
           :

値を設定したい環境変数名（CBLABNLST）を指定します。

1.で指定した環境変数（CBLABNLST）に（¥tmp¥abnlst）を設定できます。

10.5　イベントログファイル出力機能

10.5.1　イベントログファイル出力機能の概要

イベントとイベントログファイル

Windowsでは，システムまたはアプリケーションで発生した，ユーザへの通知を必要とする重要な出来事をイベントと呼びます。

通常，多くのイベントは，Windowsによってイベントログファイルに情報が出力されます。これをイベントログサービスといい，イベントログサービスはWindowsを起動するたびに自動的に開始されます。

イベントログファイルに出力されたイベントは，イベントビューアで監視できます。イベントビューアを使用すると，システム，セキュリティ，およびアプリケーションのイベントログファイルを表示，管理できます。イベントビューアの詳細については，イベントビューアのヘルプを参照してください。

イベントログファイル出力機能とは

COBOL2002のイベントログファイル出力機能は，COBOLプログラム実行中に出力されるエラーメッセージを，イベントログファイルに出力する機能です。また，DISPLAY文の出力内容をイベントログファイルに出力することもできます。出力されたイベントは，イベントビューアで参照できます。DISPLAY文の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.12　DISPLAY文」を参照してください。

10.5.2　イベントの出力

イベントログファイル出力機能を使用するには，プログラムの実行時に次の指定が必要です。

  set CBLSYSLOG=EVLOG

環境変数CBLSYSLOGにEVLOG以外の値を指定したり，値を指定しなかったりした場合は，イベントは出力されません。

また，DISPLAY文を用いてイベントを出力する場合，上記の環境変数CBLSYSLOGの指定に加えて次の指定が必要です。

  set CBL_SYSPUNCH=syslog
    または
  set CBL_SYSOUT=syslog

10.5.3　イベントの出力内容

イベントの出力内容およびイベントの種類の指定方法を次に示します。

(1)　出力内容

イベントログファイル出力機能で出力されるイベントの出力内容を，次に示します。

表10‒2　イベントの出力内容

項目名

出力内容

日付

イベントが出力された年月日

時刻

イベントが出力された時刻

ユーザ名

サインインしているユーザ名

コンピュータ名

イベントが発生したコンピュータ名

イベントID

実行時メッセージを出力する場合

COBOLメッセージ番号

DISPLAY文で出力する場合

「0」

ソース名

イベントが発生したアプリケーション名。

イベントログファイル出力機能使用時のソース名は，

Windows(x86) COBOL2002の場合は「COBOL2002」

Windows(x64) COBOL2002の場合は「COBOL2002 64bit」

種類

「情報」，「警告」，「エラー」のどれか

分類

実行時メッセージを出力する場合

なし

DISPLAY文で出力する場合

「情報」

説明

実行時メッセージを出力する場合

COBOLプログラムが出力する実行時エラーメッセージ※

（プリフィクス，メッセージ番号，メッセージレベル，およびメッセージテキスト）

DISPLAY文で出力する場合

DISPLAY文で指定された一意名または定数

注※

実行時エラーメッセージには，それぞれ対応するイベントの種類が設定されています。実行時エラーメッセージのレベルとイベントの種類の関係を，次に示します。

表10‒3　実行時エラーメッセージのレベルとイベントの種類

実行時エラーメッセージのレベル

イベントの種類

回復不能エラー（U）

エラー（S）

エラー

警告（W）

警告

お知らせ（I）

情報

なお，DISPLAY文を用いてイベントを出力する場合は，出力するイベントの種類を指定できます。

(2)　イベントの種類の指定方法

DISPLAY文を用いてイベントを出力する場合，出力するイベントの種類を指定できます（実行時エラーメッセージ出力時は指定できません）。出力するイベントの種類を指定するには，プログラムの実行時に次の指定が必要です。

  set CBLSYSLOGLVL=｛ERR｜WAR｜INF｝

環境変数CBLSYSLOGLVLに指定された値は，イベントログファイル出力用のDISPLAY文が実行されるたびに参照されます。環境変数CBLSYSLOGLVLに指定した値とイベントの種類の対応を，次に示します。

表10‒4　環境変数CBLSYSLOGLVLの指定値とイベントの種類

環境変数CBLSYSLOGLVLの指定値

イベントの種類

ERR

エラー

WAR

警告

INF

情報

注

環境変数CBLSYSLOGLVLに値が指定されていない場合は，INFが仮定されます。

10.5.4　イベントの出力先

イベントの出力先および出力先の指定方法を次に示します。

(1)　出力先

イベントログファイルには次の3種類があります。

システムログファイル

セキュリティログファイル

アプリケーションログファイル

イベントログファイル出力機能では，3.のアプリケーションログファイルを使用します。

イベントログファイルは，システムによって用意されるファイルです。また，イベントログファイル出力機能では，ローカルコンピュータのイベントログファイルだけでなく，ネットワーク上のコンピュータのイベントログファイルに対してもイベントを出力できます。

(2)　出力先の指定方法

イベントの出力先コンピュータを指定するには，プログラムの実行時に次の指定が必要です。

  set CBLSYSLOGSRV=コンピュータ名

環境変数CBLSYSLOGSRVには，ネットワーク上で有効なコンピュータ名を指定してください。ネットワーク上で無効なコンピュータ名を指定したり，コンピュータ名を指定しなかったりした場合は，ローカルコンピュータのイベントログファイルへイベントが出力されます。

イベントログファイル出力機能でネットワーク上のコンピュータにイベントを出力し，出力先コンピュータ上でイベントビューアを使ってアプリケーションログを表示すると，COBOLプログラムで出力したメッセージの前に「イベントID(nnnn) （ソース COBOL2002内）に関する説明が見付かりませんでした。・・・」というシステムのメッセージが付けられることがあります。

この場合は，次のどちらかの方法でシステムのメッセージ付けを抑止できます。

イベントを出力するネットワーク上のコンピュータに，COBOL2002をインストールする。

COBOL2002をインストールしているマシンのイベントビューアの［操作］メニューから［別のコンピュータへ接続］を選択して，イベントを出力したコンピュータを選択し，イベントを表示する。

10.5.5　イベントログファイルへの出力がエラーになったときの動作

出力するイベントに不当な文字コードが含まれていたときは，文字コードが置き換えられてからイベントログファイルに書き込まれます。詳細は，「10.5.6　注意事項」の「(3)　イベントログファイルに出力する文字列に不当な文字が含まれている場合の動作」を参照してください。

それ以外の理由でイベントの出力に失敗した場合，イベントの出力先の指定内容によって次のどちらかの処理が行われます。なお，イベントの出力先の指定方法については，「10.5.4　イベントの出力先」の「(2)　出力先の指定方法」を参照してください。

(1)　イベントの出力先がローカルコンピュータの場合

次の順序でイベントログファイルの出力処理が実行されます。

イベントをイベントログファイルに書き込む

1.に失敗したときは，書き込みに失敗したイベントを破棄し，GUIモードのときはコンソールウィンドウに，CUIモードのときは標準エラー出力（stderr）に，実行時エラーメッセージを出力する

(2)　イベントの出力先がネットワーク上のコンピュータの場合

次の順序でイベントログファイルの出力処理が実行されます。

ネットワーク上のコンピュータのイベントログファイルにイベントを書き込む

1.に失敗したときは，ローカルコンピュータのイベントログファイルにイベントを書き込む

2.にも失敗したときは，書き込みに失敗したイベントを破棄し，GUIモードのときはコンソールウィンドウに，CUIモードのときは標準エラー出力（stderr）に，実行時エラーメッセージを出力する

10.5.6　注意事項

イベントログファイル出力機能を使用する際の注意事項を示します。

(1)　DISPLAY文の出力データ長

DISPLAY文を用いてイベントログファイルに出力できるデータの長さは1,024バイトまでです。DISPLAY文を用いて1,024バイトを超えるデータをイベントログファイルに出力した場合，1,025バイト以降のデータは無視されます。

(2)　テストデバッグ時の動作

テストデバッグ時に出力される実行時メッセージは，イベントログファイル出力機能の対象になりません。ただし，DISPLAY文の出力内容は，イベントログファイルに出力できます。

(3)　イベントログファイルに出力する文字列に不当な文字が含まれている場合の動作

(a)　イベントの中にNULL文字が含まれている場合

NULL文字以降の文字列は，イベントログファイルに出力されません。

(b)　イベントログファイルに出力する文字列に不当な文字が含まれている場合

イベントの出力エラーになることがあります。その場合は，次のように処理されます。

イベントの中に，次の文字コードの範囲以外の文字が含まれている場合

ASCIIコード

X'0D'，X'0A'，X'20'〜X'7E'，X'A1'〜X'DF'

シフトJISコード

第1バイト：X'81'〜X'9F'，X'E0'〜X'FC'

第2バイト：X'40'〜X'7E'，X'80'〜X'FC'

不当な文字が次のように変換され，イベントログファイルにテキスト出力されます。テキスト出力されたデータは，イベントビューアの説明欄に表示されます。

シフトJISコードで，第1バイトが範囲内，第2バイトが範囲外のとき

げた記号「[図データ]」（X'81AC'）に変換されます。

それ以外の文字コードのとき

ピリオド「.」（X'2E'）に変換されます。

また，変換前の文字列は，イベントログファイルにバイナリ出力されます。バイナリ出力されたデータは，イベントビューアのデータ欄に16進表示されます。

(4)　DISPLAY文を用いたイベント出力での改行

DISPLAY文を用いてイベントログファイルにイベントを出力する場合，改行コードを用いて改行しないでください。

11　整列併合機能

整列併合機能は，SORT文，MERGE文を記述したプログラムで実行します。この章では，整列併合機能で使用するファイルや，ファイルの割り当て方法，使用するメモリサイズなどについて説明します。

11.1　使用できるファイル

整列併合機能を使ったプログラムで使用できるファイルを次に示します。

表11‒1　整列併合機能で使用できるファイル

種別

ファイル編成

用途

備考

入力用ファイル

順編成ファイル

相対編成ファイル

索引編成ファイル

テキスト編成ファイル

整列用レコードの入力ファイル

併合用レコードの入力ファイル

USING指定のとき，最大12ファイル指定できる。

出力用ファイル

順編成ファイル

相対編成ファイル

索引編成ファイル

テキスト編成ファイル

整列済みレコードの出力ファイル

併合済みレコードの出力ファイル

作業用ファイル

−

整列機能が使用する整列作業用ファイル

整列機能が内部的に使用する。

なお，整列ファイル，併合ファイルについては，マニュアル「COBOL2002　言語　標準仕様編」　「5.1.15　整列ファイル」および「COBOL2002　言語　標準仕様編」　「5.1.16　併合ファイル」を参照してください。

11.2　ファイルの割り当て

整列処理，併合処理で使用するファイルの割り当て方法について説明します。

11.2.1　入出力用ファイル

SELECT句で指定した整列併合用のファイルに対して実行時に物理ファイルを割り当てる方法については，「6.2　ファイル割り当ての共通規則」を参照してください。

11.2.2　整列作業用ファイル

SORT文を使用する場合，整列処理用の作業ファイルのフォルダの名称は，環境変数CBLSORTWORKで指定します。

形式

CBLSORTWORK=フォルダ名

フォルダ名は，ドライブ名からの絶対パス名で指定します。

（例）

CBLSORTWORK=C:¥TMP¥WORK

環境変数を指定しなかった場合，作業ファイルのフォルダは，実行可能ファイルがあるフォルダになります。

11.2.3　注意事項

整列処理を実行中に異常終了が発生すると，整列作業用ファイルが削除されないで残る場合があります。

併合処理の入力ファイルは，MERGE文のASCENDING KEYまたはDESCENDING KEYで指定したとおりに整列されている必要があります。整列されていないとプログラムが異常終了します。

11.3　使用するメモリサイズ

整列処理，併合処理で使用するメモリサイズについて説明します。

11.3.1　整列処理のメモリサイズ

整列処理のメモリサイズは，環境変数CBLSORTSIZEで指定します。

形式

CBLSORTSIZE=メモリサイズ

メモリサイズ

整列処理で使用するメモリサイズを，キロバイト単位で指定します。有効となる値は，8けた以内の符号なし整数（0〜99,999,999）です。この範囲を超える値を指定した場合，実行時エラーとなります。

（例）

CBLSORTSIZE=1000

規則

環境変数CBLSORTSIZEに値が設定されていないときは，SORT-CORE-SIZE特殊レジスタの値が適用されます。また，環境変数と特殊レジスタの両方に値が設定されているときは，環境変数に指定した値が有効となります。

整列処理のメモリサイズの注意点については，「11.5　注意事項」を参照してください。

整列処理するレコード長が32キロバイトを超える場合，整列機能が確保するメモリサイズは256キロバイト以上を指定する必要があります。

メモリサイズの計算式

メモリ所要量（キロバイト）= 16 + S

Sは，環境変数CBLSORTSIZEまたはSORT-CORE-SIZE特殊レジスタで指定した値です。

11.3.2　併合処理のメモリサイズ

併合処理で使用するメモリサイズを，次に示します。

メモリサイズの計算式

Windows(x86) COBOL2002の場合

メモリ所要量（バイト）= 32 +（最大レコード長※1 + 28 + キーの合計長※2）×（併合ファイル数 + 1）

注※1

　　4バイト境界に切り上げた値

注※2

　　MERGE文に指定されたすべてのキー長の合計値を，4バイト境界に切り上げた値

Windows(x64) COBOL2002の場合

メモリ所要量（バイト）= 48 +（最大レコード長※1 + 32 + キーの合計長※2）×（併合ファイル数 + 1）

注※1

　　8バイト境界に切り上げた値

注※2

　　MERGE文に指定されたすべてのキー長の合計値を，8バイト境界に切り上げた値

なお，算出したメモリサイズの記憶領域が確保できなかった場合，プログラムは異常終了します。

11.4　使用できる特殊レジスタ

整列併合機能で使用できる特殊レジスタについて説明します。

11.4.1　特殊レジスタの種類

特殊レジスタの種類を次に示します。

表11‒2　特殊レジスタの種類

特殊レジスタ

属性

初期値

有効となる値

SORT-RETURN

PIC S9(4) USAGE COMP

0

0，16

SORT-CORE-SIZE

PIC S9(8) USAGE COMP

0

-99,999,999〜99,999,999※1

SORT-FILE-SIZE

PIC S9(8) USAGE COMP

0

−※2

SORT-MODE-SIZE

PIC S9(5) USAGE COMP

0

−※2

SORT-MESSAGE

PIC X(8) USAGE DISPLAY

空白

−※2

注※1

128未満の値を指定した場合，1,024が仮定されます。

注※2

これらの特殊レジスタにも値は設定できますが，どの値も整列処理に対しては無効となります。

11.4.2　SORT-RETURN特殊レジスタ

この特殊レジスタに値16を設定すると，整列併合の操作を強制的に終了できます。

入力または出力手続きで値16を設定すると，次のRELEASE文またはRETURN文を実行後，整列併合の操作が終了し，次の手続き文に制御が渡ります。

16以外の値を設定した場合は，整列併合の操作が継続して実行されます。

11.4.3　SORT-CORE-SIZE特殊レジスタ

整列処理実行前にこの特殊レジスタに値を設定することで，整列処理の作業用メモリのサイズをキロバイト単位で指定できます。128未満の値を指定した場合，1,024が仮定されます。また，環境変数CBLSORTSIZEが指定されているときは，環境変数で指定された値が適用されます。

なお，この特殊レジスタは，併合処理に関しては意味を持ちません。

11.5　注意事項

11.5.1　処理時間の短縮

(1)　メモリサイズと処理時間

メモリサイズと処理時間との間には，メモリサイズが大きいほど処理時間が短くなるという関係があります。しかし，実際には，設定したメモリサイズがソート実行時に使用されるメモリよりも著しく大きいと，逆に処理時間が掛かることがあります。したがって，メモリサイズを指定するときは，レコード件数，レコード長，キー長，および実メモリサイズを考慮し，適切な値にする必要があります。

メモリサイズと処理時間との関係を次に示します。

図11‒1　メモリサイズと処理時間との関係

メモリサイズが1.で示す値より小さいとき，何度かソートを繰り返すため，処理時間は長くなります。

メモリサイズが3.で示す値以上のとき，一時ファイルを使用しなくてもソートできるため，処理時間は短くなります。ただし，データ件数が多過ぎると，逆に処理時間が長くなったり，処理できなかったりする場合があります。

通常メモリサイズは，1.で示す値と3.で示す値の間の値を設定します。その場合の目安は，2.で示す値です。1.で示す値以上で，3.で示す値未満の値では，2.で示す値より大きな値を設定しても処理時間は短くなりません。

(2)　キー属性の指定

キー属性が文字の場合，数字の場合と比べてソート処理の効率が向上します。したがって，ファイル設計時にはキーとなる部分の属性を文字にしておくとソート処理の時間を短くできます。

(3)　WITH DUPLICATES指定

SORT文にWITH DUPLICATES指定をしない方がソート処理の時間を短くでき，また，作業ファイルの容量も小さくて済みます。

11.5.2　その他の注意事項

(1)　RELEASE文とRETURN文

RELEASE文はINPUT PROCEDURE中で実行します。RETURN文はOUTPUT PROCEDURE中で実行します。誤って実行するとプログラムが異常終了します。

(2)　入出力エラー

整列処理，併合処理で使用するファイルに対して入出力エラーが発生したときの処理について説明します。

なお，共通例外処理を使用する場合の詳細については，「21.　共通例外処理」を参照してください。

(a)　入出力ファイル

入出力ファイルに入出力エラーが発生すると，FILE STATUS句，USE ERROR手続きが有効となります。これらの指定がない場合，プログラムは異常終了します。

(b)　整列作業用ファイル

整列作業用ファイルに入出力エラーが発生すると，プログラムは異常終了します。

(3)　キー数

SORT文，MERGE文で指定できるキーの数は最大64個です。

12　画面入出力機能

通信節，画面節（SCREEN SECTIONおよびWINDOW SECTION）による画面機能を使うと，ディスプレイやプリンタとの間でデータの送受信ができます。この章では，それぞれの画面機能の使い方について説明します。

12.1　通信節による画面機能

12.1.1　機能の概要

通信節（COMMUNICATION SECTION）による画面機能を使用すると，ディスプレイとの間で画面データを送受信したり，プリンタに帳票データを送信したりできます。画面データを送受信する際には，画面全体を制御したり，けい線，高輝度表示などの機能を利用したりできます。

通信記述項による画面機能については，マニュアル「COBOL2002　言語　拡張仕様編」　「11.　通信節による画面機能」を参照してください。

12.1.2　画面に対する入出力

(1)　画面の定義

通信節による画面機能を使用する場合，画面はXMAP3のドロー（パネル定義）機能を利用して定義します。ドロー（パネル定義）機能については，次に示すマニュアルを参照してください。

XMAP3 Version 4の場合

マニュアル「画面・帳票サポートシステム XMAP3 プログラミングガイド 画面編」

マニュアル「画面・帳票サポートシステム XMAP3 開発・実行ガイド」

XMAP3 Version 5の場合

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 開発ガイド」

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 プログラミングガイド」

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 実行ガイド」

(2)　使用する文

画面データを送受信したり画面を閉じたりするには，原始プログラム中のデータ部通信記述項のFOR句で"I-O WS"を指定し，次に示す文を使用します。

表12‒1　画面データの送受信で使用する文

使用する文

処理

SEND文

ディスプレイに画面データを送信し，応答の完了を待たないで非同期にプログラムを続行する。

NO REPLY指定がないとき

受信した画面データは，RECEIVE文で受け取る。

NO REPLY指定があるとき

ディスプレイに画面データを送信する。RECEIVE文で画面データを受け取ることはできない。

RECEIVE文

NO REPLY指定のないSEND文で受信したデータを受け取る。

TRANSCEIVE文

ディスプレイに画面データを送信し，受信した画面データを受け取る。

DISABLE文

ディスプレイに出力された画面データを消去する。

NO REPLY指定のないSEND文とRECEIVE文との間でSEND文またはTRANSCEIVE文を実行した場合，最後のSEND文またはTRANSCEIVE文が有効となります。

(3)　画面の表示モード

画面データの表示モードには次の2種類のモードがあります。

書き換え（ERASE）モード：画面を消去して画面データを表示する。

上書き（WRITE）モード：画面を消去しないで画面データを表示する。

SEND文またはTRANSCEIVE文では，ドロー（パネル定義）機能で画面（パネル）定義時に指定した表示モードで画面データを表示します。ただし，開かれていない画面データの送受信先に対してSEND文またはTRANSCEIVE文を初めて実行する場合，上書き（WRITE）モードを指定してはなりません。

ドロー（パネル定義）機能で，画面（パネル）定義時にこのシステムに任せる指定をした場合，次の規則に従って画面データが表示されます。

初めての送受信要求で指定した物理マップ名と異なるときは，書き換え（ERASE）モードで表示される。

現在の送受信要求で指定した物理マップ名が直前の送受信要求で指定した物理マップ名と同じときは，上書き（WRITE）モードで表示される。

(4)　実行時のカーソルの位置づけ

プログラム実行時にカーソルの位置を変更するときは，原始プログラム中で論理マップとして展開したカーソルフィールドに値を設定します。

(5)　データ有無コード

データ有無コードとは，論理項目に値を設定しているかどうかを区別するためのコードで，1バイトのコードX'00'〜X'FF'で指定します。

データ有無コードには，原始プログラム中の通信記述項のDATA ABSENCE CODE句で指定したデータ名に設定した値が使われます。

DATA ABSENCE CODE句を指定したときは，プログラム中の通信記述項ごとの最初の通信文を実行する前に値を必ず設定しておく必要があります。データ名に値を設定しなかった場合の動作は保証しません。また，通信文の実行後に値を変更してはなりません。

(6)　実行状態を示すコード

続行できない異常な状態が通信文で発生すると，エラーメッセージが出力されます。通信記述項にSTATUS KEY句の指定があれば，通信文の実行状態を示す5けたのコードがこの句で指定したデータ名に設定され，処理が続行されます。

STATUS KEY句がないときに続行できないエラーが発生すると，プログラムは異常終了します。

STATUS KEY句のデータ名に設定されるコードについては，マニュアル「COBOL2002　言語　拡張仕様編」　「11.1.1　通信記述項（CD）（通信節による画面機能）」を参照してください。

(7)　送受信先の設定方法

画面機能では，送受信先を指定することで，ネットワーク上に接続されたディスプレイに画面データを送受信できます。送受信先の指定方法について，次に示します。

(a)　送受信先の決定のしかた

画面データの送受信先は，通信記述項でのSYMBOLIC TERMINAL句の指定の有無と，環境変数の指定の有無によって次のように決定されます。

表12‒2　画面データの送受信先

条件

SYMBOLIC TERMINAL句でのデータ名の指定

あり

なし

環境変数の指定

あり

環境変数CBLTERM_xxxで指定したディスプレイ

ただし，データ名に設定した内容の先頭1バイトが空白文字（X'20'）の場合は，環境変数CBLTERMIDで指定したディスプレイ

環境変数CBLTERMIDで指定したディスプレイ

なし

データ名で指定した仮想端末

ただし，データ名に設定した内容の先頭1バイトが空白文字（X'20'）の場合は，XMAP3のセットアップの値（仮定値）※

XMAP3のセットアップの値（仮定値）※

注※

マニュアル「画面・帳票サポートシステム XMAP3 開発・実行ガイド」を参照してください。

(b)　環境変数による送受信先の設定

送受信先を設定するための環境変数には次の2種類があります。

仮想端末名を指定する環境変数

次の環境変数で仮想端末名を指定します。ここで指定した仮想端末名は，SYMBOLIC TERMINAL句のデータ名に"xxx"で示す名称を指定したときに有効となります。

形式

CBLTERM_xxx=ディスプレイの仮想端末名

規則

xxxおよび仮想端末名は8文字以内の文字列で指定します。

仮想端末名の仮定値を指定する環境変数

SYMBOLIC TERMINAL句の指定を省略したときに仮定される仮想端末の名称を次の環境変数で指定します。

形式

CBLTERMID=ディスプレイの仮想端末名

規則

仮想端末名は8文字以内の文字列で指定します。

(c)　SYMBOLIC TERMINAL句の指定

通信記述項のSYMBOLIC TERMINAL句のデータ名に環境変数名または仮想端末名を指定することで，画面データの送受信先を指定できます。

環境変数名による指定方法

データ名に環境変数CBLTERM_xxxの"xxx"の名称を指定します。環境変数で指定した仮想端末名が送受信先として設定されます。

仮想端末名による指定方法

環境変数が指定されていないときは，データ名に仮想端末名を指定することで送受信先を指定できます。

(8)　送受信間の物理マップ

ディスプレイに対して画面データを送受信する場合，SEND文（NO REPLY指定なし）の前に通信記述項のMAP NAME句のデータ名に物理マップ名を指定し，画面データを送受信します。RECEIVE文はその物理マップ名に対して画面データを受信するため，RECEIVE文で物理マップ名は指定しません。

複数の仮想端末に送信した画面データを受信するとき，それぞれの最後に送信したSEND文で指定した物理マップが，RECEIVE文の物理マップとなります。

12.1.3　仮想端末の共用

送受信先が同じ仮想端末に対して，複数プログラムで定義した通信記述項を使って通信文を実行すると，複数の画面が生成されます。このとき実行時環境変数を指定することで，一つの仮想端末を複数プログラム間で共用し，送受信できます。

また，-CompatiV3オプションを指定してコンパイルしたプログラムでも同様に，一つの仮想端末を共用できます。

(1)　仮想端末の共用の指定

複数プログラム間で一つの仮想端末を共用して送受信したい場合は，次の実行時環境変数を指定します。

CBLTERMSHAR=YES

この環境変数にYESを指定すると，実行単位中のすべてのプログラムで同一名称の仮想端末を共用できます。指定がない，またはYES以外の文字が指定されている場合は，NOが仮定されます。NOの場合は，送受信先に同一名称の仮想端末を指定しても異なる仮想端末として送受信します（SEND文実行時に複数の画面が生成される）。

(2)　注意事項

一つの実行単位ファイル中の通信節を使用するプログラムに対して，-CompatiV3オプションを指定したオブジェクトファイルと未指定のオブジェクトファイルを混在して動作させてはいけません。混在させた場合の動作は保証しません。

複数プログラム間で共用した仮想端末に対して送信した画面データを受信するとき，最後に送信したSEND文と同じ通信記述項を使って受信しなければいけません。

仮想端末は，一つのCOBOL実行単位中に，複数のプログラム間で共用できます。CALL文で呼び出す実行可能ファイルなど，別のCOBOL実行単位との共用はできません。

12.1.4　プリンタに対する帳票出力

(1)　帳票の定義

通信節による帳票出力機能を使用する場合，帳票はXMAP3のドロー（パネル定義）機能を利用して定義します。ドロー（パネル定義）機能については，次に示すマニュアルを参照してください。

XMAP3 Version 4の場合

マニュアル「画面・帳票サポートシステム XMAP3 プログラミングガイド 帳票編」

マニュアル「画面・帳票サポートシステム XMAP3 開発・実行ガイド」

XMAP3 Version 5の場合

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 開発ガイド」

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 プログラミングガイド」

マニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 実行ガイド」

(2)　使用する文

帳票データをプリンタへ送信したり，プリンタを閉じたりするには，原始プログラム中のデータ部通信記述項のFOR句で"OUTPUT WS"を指定し，次に示す文を使用します。

表12‒3　帳票データの送信で使用する文

使用する文

処理

SEND文

帳票データをプリンタへ送信する。

DISABLE文

プリンタを閉じる（閉じるプリンタは，DISABLE文を実行した時点で指定されているプリンタである）。

(3)　実行状態を示すコード

続行できない異常な状態が通信文で発生すると，エラーメッセージが出力されます。通信記述項にSTATUS KEY句の指定があれば，通信文の実行状態を示す5けたのコードがこの句で指定したデータ名に設定され，処理が続行されます。

STATUS KEY句がないときに続行できないエラーが発生すると，プログラムは異常終了します。

STATUS KEY句のデータ名に設定されるコードについては，マニュアル「COBOL2002　言語　拡張仕様編」　「11.1.1　通信記述項（CD）（通信節による画面機能）」を参照してください。

(4)　送信先の設定方法

帳票出力機能では，送受信先を指定することで，ネットワーク上に接続されたプリンタに帳票データを送信できます。送信先の指定方法について，次に示します。

(a)　送信先の決定のしかた

帳票データの送信先は，通信記述項でのSYMBOLIC TERMINAL句の指定の有無と，環境変数の指定の有無によって次に示すように決定されます。

表12‒4　帳票データの送信先

条件

SYMBOLIC TERMINAL句でのデータ名の指定

あり

なし

環境変数の指定

あり

環境変数CBLPRNT_xxxで指定したプリンタ

ただし，データ名に設定した内容の先頭1バイトが空白文字（X'20'）の場合は，環境変数CBLPRNTIDで指定したプリンタ

環境変数CBLPRNTIDで指定したプリンタ

なし

データ名で指定した仮想端末

ただし，データ名に設定した内容の先頭1バイトが空白文字（X'20'）の場合は，XMAP3のセットアップの値（仮定値）※

XMAP3のセットアップの値（仮定値）※

注※

マニュアル「画面・帳票サポートシステム XMAP3 開発・実行ガイド」を参照してください。

(b)　環境変数による送信先の設定

送信先を設定するための環境変数には次の2種類があります。

仮想端末名を指定する環境変数

次の環境変数で仮想端末名を指定します。ここで指定した仮想端末名は，SYMBOLIC TERMINAL句のデータ名に"xxx"で示す名称を指定したときに有効となります。

形式

CBLPRNT_xxx=プリンタの仮想端末名

規則

xxxおよび仮想端末名は8文字以内の文字列で指定します。

仮想端末名の仮定値を指定する環境変数

SYMBOLIC TERMINAL句の指定を省略したときに仮定される仮想端末の名称を次の環境変数で指定します。

形式

CBLPRNTID=プリンタの仮想端末名

規則

仮想端末名は8文字以内の文字列で指定します。

(c)　SYMBOLIC TERMINAL句の指定

通信記述項のSYMBOLIC TERMINAL句のデータ名に環境変数名または仮想端末名を指定することで，帳票データの送信先を指定できます。

環境変数名による指定方法

データ名に環境変数CBLPRNT_xxxの"xxx"の名称を指定します。環境変数で指定した仮想端末名が送受信先として設定されます。

仮想端末名による指定方法

環境変数が指定されていないときは，データ名に仮想端末名を指定することで送信先を指定できます。

(5)　送受信間の物理マップ

プリンタに対して帳票データを送受信する場合，SEND文（NO REPLY指定なし）の前に通信記述項のMAP NAME句のデータ名に物理マップ名を指定し，帳票データを送信します。

12.2　画面節（SCREEN SECTION）による画面機能

画面節（SCREEN SECTION）を使用した画面の入出力について説明します。

画面節（SCREEN SECTION）を使用した画面の入出力については，マニュアル「COBOL2002　言語　拡張仕様編」　「12.　画面節（SCREEN SECTION）による画面機能」を参照してください。

なお，SCREEN SECTIONとWINDOW SECTIONは，同時に使用できません。同時に使用した場合，エラーメッセージが出力されます。

12.2.1　画面の種類と構成

画面節（SCREEN SECTION）では，主画面とエラー表示画面の2種類の画面を使用します。

(1)　主画面

主画面は，画面の入出力で使用する主画面であり，タイトルバー，メニューバー，ユーザ表示領域から構成されます。主画面の構成を次に示します。

メニューバーの［終了キー］をクリックすると，次のドロップダウンメニューが表示されます。これらをクリックすると，［Enter］キーや［F1］〜［F24］キーを押したのと同じ結果が得られます。

注1

［F13］〜［F24］キーは，［Ctrl］キーを押したまま［F1］〜［F12］キーを押すことを意味します。

注2

［F10］キーは通常システムキーとして割り当てられています。これをCOBOLプログラム中で使用するためには，ユーザキーとして割り当てる必要があります。割り当て方法については，マニュアル「COBOL2002　操作ガイド」の実行支援を使った画面環境の設定の説明を参照してください。

また，メニューバーの［オプション］をクリックすると，［フォントサイズ変更］コマンドが表示されます。これをクリックすると，フォントの指定ダイアログボックスが表示されます。

このダイアログボックスでフォントのサイズ，フォント名を指定して［OK］ボタンを選ぶと，ユーザ表示領域に表示される文字のサイズやフォントを変更できます。デフォルトでは，次のフォントが指定されています。

フォント名：ＭＳ ゴシック

サイズ：12

注意事項

日本語を表示できないフォントは，指定できません。

実行支援で，システムで使用できないフォントや日本語を表示できないフォントが指定されている場合，デフォルトのフォントが使用されます。

(2)　エラー表示画面

エラー表示画面は，誤ったデータを入力したときなどに自動的に表示される画面であり，エラー表示領域だけから構成されます。エラー表示画面の構成を次に示します。

12.2.2　キーの機能

カーソルの移動などで使用するキーの意味を次に示します。

使用するキー

意味

［→］

カーソルが右に1カラム移動します。ただし，フィールドの右端のときは，後方のフィールドの先頭に移動します。

［←］

カーソルが左に1カラム移動します。ただし，フィールドの左端のときは，前方のフィールドの末尾に移動します。

［↑］

前方のフィールドの先頭にカーソルが移動します。

［↓］

後方のフィールドの先頭にカーソルが移動します。ただし，後方にフィールドがない場合は，フィールドの右端にカーソルが移動します。

［Tab］

後方のフィールドの先頭にカーソルが移動します。

［BackSpace］

現在カーソルが位置づけられているカラムの入力を取り消し，カーソルが左に1カラム移動します。

［Insert］

現在カーソルが位置づけられているカラムに空白または0を挿入します。

［Delete］

現在カーソルが位置づけられているカラムの文字を削除します。

［Home］

フィールドの先頭にカーソルを移動します。フィールドが複数指定されている場合は，最初のフィールドの先頭にカーソルを移動します。

［End］

カーソルの位置に関係なく，そのフィールドのデータをクリアします。

数字項目のフィールドは0でクリアされ，カーソルは表示されているデータの左端に位置づけられます。

数字編集項目のフィールドは0でクリアされ，カーソルは表示されているデータの左端または小数点上に位置づけられます。

その他の項目は空白文字でクリアされ，カーソルは表示されているデータの左端に位置づけられます。

［Alt］+［矢印］

矢印（［→］，［←］，［↑］，［↓］）の方向に画面がスクロールします。

［Enter］，

［F1］〜［F24］，

［実行］

入力が終了します。

この場合，［F13］〜［F24］キーは，［Ctrl］キーを押したまま［F1］〜［F12］キーを押すことを意味します。

カーソルの移動などの機能に対して割り当てられたキーは変更できます。キーの割り当て方法については，マニュアル「COBOL2002　操作ガイド」の実行支援を使った画面環境の設定の説明を参照してください。

注意事項

フィールドの前方，後方とは画面上の次のような位置関係をいいます。

実行支援の画面環境で割り当てたキーは，画面節（SCREEN SECTIONおよびWINDOW SECTION）だけで有効です。

12.2.3　LINE／COLUMN句を使用した画面の座標指定

画面節（SCREEN SECTION）では，LINE／COLUMN句を指定すると，画面項目に画面上での座標を与えられます。例を次に示します。

（例）

           :
       SCREEN SECTION.
       01 SC-11.
         02 SC-12 VALUE 'ABCDE'
             LINE PLUS 2 COLUMN PLUS 2.    …2.
         02 SC-13 PIC X(5) TO WC-11
             LINE PLUS 2 COLUMN PLUS 2.    …3.
         02 SC-14 VALUE 'FGHIJ'
             LINE PLUS 2 COLUMN PLUS 2.    …4.
           :
       PROCEDURE DIVISION.
           DISPLAY SC-11 AT LINE 2 COLUMN 2. …1.
           :

起点アドレス（2，2）が与えられます。

起点からの相対値2のアドレスに画面項目が表示されます。

入力画面項目なので表示されませんが，LINE／COLUMN句の指定は有効です。

前画面項目からの相対値2のアドレスに画面項目が表示されます。

実行結果は次のようになります。

12.2.4　CRT STATUS句を使用したファンクションキー入力結果の取得

(1)　ファンクションキーとキー番号

CRT STATUS句を指定した場合，ACCEPT文を実行したときにファンクションキーを入力すると，各ファンクションキーに対応するキー番号がCRT STATUS句で指定したデータの2バイト目に設定されます。

ファンクションキーとキー番号は，［F1］キー：1，［F2］キー：2，……［F24］キー：24のように対応します。

注1

［F13］〜［F24］キーは，［Ctrl］キーを押したまま［F1］〜［F12］キーを押すことを意味します。

注2

［F10］キーは通常システムキーとして割り当てられています。これをCOBOLプログラム中で使用するためには，ユーザキーとして割り当てる必要があります。割り当て方法については，マニュアル「COBOL2002　操作ガイド」の実行支援を使った画面環境の設定の説明を参照してください。

CRT STATUS句の詳細については，マニュアル「COBOL2002　言語　拡張仕様編」　「12.1.4　CRT STATUS句（SCREEN SECTION）」を参照してください。

12.2.5　注意事項

指定したフィールドが画面（主画面のユーザ表示領域）に入りきらない場合，フィールドは入出力の対象になりません。次に示す対応を行い，画面に入るように調整してください。

フィールドの大きさを小さくする。

実行支援の画面設定で画面サイズを大きくする。

12.3　画面節（WINDOW SECTION）による画面機能

画面節（WINDOW SECTION）を使用した画面の入出力について説明します。

画面節（WINDOW SECTION）を使用した画面の入出力については，マニュアル「COBOL2002　言語　拡張仕様編」　「13.　画面節（WINDOW SECTION）による画面機能」を参照してください。

なお，SCREEN SECTIONとWINDOW SECTIONは，同時に使用できません。同時に使用した場合，エラーメッセージが出力されます。

12.3.1　画面の種類と構成

画面節（WINDOW SECTION）では，主画面，ポップアップ画面，ユーザポップアップHELP画面，およびエラー表示画面の4種類の画面を使用します。これらの画面について説明します。

(1)　主画面

主画面は，画面の入出力で使用する主画面であり，タイトルバー，メニューバー，ステータスバー，ユーザ表示領域から構成されます。主画面の構成を次に示します。

ステータスバーには，SET文のBACK CURSOR KEY指定で割り当てたバックカーソルキー，およびHELP KEY句で割り当てたヘルプキーが，それぞれ表示されます。

メニューバーの［終了キー］をクリックすると，次のドロップダウンメニューが表示されます。これらをクリックすると，［Enter］キーや［F1］〜［F24］キーを押したのと同じ結果が得られます。

注1

［F13］〜［F24］キーは，［Ctrl］キーを押したまま［F1］〜［F12］キーを押すことを意味します。

注2

［F10］キーは通常システムキーとして割り当てられています。これをCOBOLプログラム中で使用するためには，ユーザキーとして割り当てる必要があります。割り当て方法については，マニュアル「COBOL2002　操作ガイド」の実行支援を使った画面環境の設定の説明を参照してください。

また，メニューバーの［オプション］をクリックすると，［フォントサイズ変更］コマンドが表示されます。これをクリックすると，フォントの指定ダイアログボックスが表示されます。

このダイアログボックスでフォントのサイズ，フォント名を指定して［OK］ボタンを選ぶと，ユーザ表示領域に表示される文字のサイズやフォントを変更できます。デフォルトでは，次のフォントが指定されています。

フォント名：ＭＳ ゴシック

サイズ：12

注意事項

日本語を表示できないフォントは，指定できません。

実行支援で，システムで使用できないフォントや日本語を表示できないフォントが指定されている場合，デフォルトのフォントが使用されます。

(2)　ポップアップ画面

ポップアップ画面は，ポップアップ入出力機能で使用する画面であり，タイトルバーとユーザ表示領域から構成されます。ユーザ表示領域のサイズはプログラム中で指定します。ポップアップ画面の構成を次に示します。

ポップアップ画面の詳細については，「12.3.5　ポップアップ画面入出力機能」を参照してください。

(3)　ユーザポップアップHELP画面

ユーザポップアップHELP画面は，ユーザポップアップHELP機能で使用する画面であり，ユーザ表示領域だけから構成されます。ユーザ表示領域のサイズはプログラム中で指定します。ユーザポップアップHELP画面の構成を次に示します。

ユーザポップアップHELP画面の詳細については，「12.3.6　ユーザポップアップHELP機能」を参照してください。

(4)　エラー表示画面

エラー表示画面は，誤ったデータを入力したときなどに自動的に表示される画面であり，エラー表示領域だけから構成されます。エラー表示画面の構成を次に示します。

12.3.2　データの表示形式

(1)　数字項目の表示形式

数字項目はフィールドに右詰めで表示されます。このとき，必要があれば左側に空白を補って表示されます。仮想小数点（V）の指定が右端以外にある場合は，その位置にピリオド（.）が表示されます。また，符号付き数字項目の場合は，先頭または末尾に符号（+，-）を付けて表示されます。

（例）

(2)　その他の項目の表示形式

数字項目以外の場合は，データ項目の値がそのまま（左詰め）フィールドに表示されます。

12.3.3　データの入力方式

(1)　数字項目の入力方式

数字項目を入力する場合，整数部は数字を1けた入力するごとに全体の表示が左にシフトし，小数部は数字を1けた入力するごとにカーソルが右にシフトします。また，符号部はいつでも変更できます。

（例1）

PIC S99V99の場合

（例2）

PIC 999の場合

(2)　数字編集項目の入力方式

数字編集項目を入力する場合，キーを押すと同時に値が編集され，画面に反映されます。浮動挿入編集状態，ゼロ抑制編集状態では数字を1けた入力するごとに全体の表示が左にシフトし，ほかの編集状態では数字を1けた入力するごとにカーソルが右にシフトします。また，符号部はいつでも変更できます。

（例1）

PIC ***.**の場合

（例2）

PIC +ZZZ99の場合

(3)　英字項目，英数字項目，日本語項目の入力方式

英字項目，英数字項目，日本語項目は，フィールドの左端から順次入力します。不当な文字を入力するとエラーが表示されます。RESET句，JUST句が指定されているときは，フィールドへの入力を終了すると，入力した文字が右詰めで再表示されます。

（例）

PIC AAAAAA JUSTの場合

(4)　英数字編集項目，日本語編集項目の入力方式

英数字編集項目，日本語編集項目は，フィールドの左端から順次入力します。不当な文字を入力するとエラーが表示されます。キーを押すと同時に値が編集され，画面に反映されます。

（例）

PIC XX/X/Xの場合

(5)　注意事項

入力フィールドにカーソルを移動した場合，入力を助けるために，フィールドに初期表示がされます。この状態で何も入力しなければ，データ項目の内容は変更されません。また，何も入力しないでカーソルを別のフィールドに移動すると，フィールドの表示は元に戻ります。

入出力フィールドにカーソルを移動した場合，すでにデータが出力されているときはそのままですが，データが出力されていないときは入力フィールドと同様に初期表示がされます。この状態で何も入力しなければ，データ項目の内容は変更されません。また，何も入力しないでカーソルを別のフィールドに移動すると，フィールドの表示は元に戻ります。

12.3.4　キーの機能

カーソルの移動などで使用するキーの意味を次に示します。

使用するキー

意味

［→］

カーソルが右に1カラム移動します。ただし，フィールドの右端のときは，後方のフィールドの先頭に移動します。

［←］

カーソルが左に1カラム移動します。ただし，フィールドの左端のときは，前方のフィールドの末尾に移動します。

［↑］

前方のフィールドの先頭にカーソルが移動します。

［↓］

後方のフィールドの先頭にカーソルが移動します。

［Tab］

後方のフィールドの先頭にカーソルが移動します。

［BackSpace］

現在カーソルが位置づけられているカラムの入力を取り消し，カーソルが左に1カラム移動します。

［Insert］

現在カーソルが位置づけられているカラムに空白または0を挿入します。

［Delete］

現在カーソルが位置づけられているカラムの文字を削除します。

［End］

カーソルの位置に関係なく，そのフィールドのデータをクリアします。

数字項目のフィールドは0でクリアされ，カーソルは整数一の位に位置づけられます。ただし整数項目がない場合，小数第一位に位置づけられます。

数字編集項目のフィールドは0でクリアされ，カーソルは表示されているデータの左端または小数点上に位置づけられます。

その他の項目は空白文字でクリアされ，カーソルは表示されているデータの左端に位置づけられます。

［Alt］+［矢印］

矢印（［→］，［←］，［↑］，［↓］）の方向に画面がスクロールします。

［Enter］，

［F1］〜［F24］，

［実行］

入力が終了します。

この場合，［F13］〜［F24］キーは，［Ctrl］キーを押したまま［F1］〜［F12］キーを押すことを意味します。

カーソルの移動などの機能に対して割り当てられたキーは変更できます。キーの割り当て方法については，マニュアル「COBOL2002　操作ガイド」の実行支援を使った画面環境の設定の説明を参照してください。

また，フィールド間のカーソル移動の動作変更については，「36.2.6　画面」の「(14)　CBLUPDOWNMOVE」を参照してください。

注意事項

フィールドの前方，後方とは画面上の次のような位置関係をいいます。

前方または後方のフィールドがない場合は，末尾または先頭のフィールドにカーソルが移動します。

実行支援の画面環境で割り当てたキーは，画面節（SCREEN SECTIONおよびWINDOW SECTION）だけで有効です。

12.3.5　ポップアップ画面入出力機能

ポップアップ画面入出力機能は，主画面とは別にもう一つの画面（ポップアップ画面）を表示し，この画面からデータを入出力するときに使用します。ポップアップ画面の例を，次に示します。

ポップアップ画面は，プログラム中のREPLY文が実行されると表示されます。ポップアップ画面のフィールドへの入力などが終わり，終了キー（［Enter］キー，［F1］〜［F24］キー，［実行］キー）を押すと，ポップアップ画面が閉じます。

注意事項

HELP LINE指定，HELP COLUMN指定で指定する表示位置は，ユーザ表示領域の位置を示したものであり，タイトルバーは含みません。

ポップアップ画面が表示されているときは，主画面のタイトルバーのメニューは使用できません。

12.3.6　ユーザポップアップHELP機能

ユーザポップアップHELP機能は，商品コードなどを確認しながら画面に入力するために，一時的にこれらのコードの一覧をガイダンス画面に表示するような場合に使用します。このとき表示するガイダンス画面をユーザポップアップHELP画面といいます。ユーザポップアップHELP画面やこの画面を表示するためのキーは画面節（WINDOW SECTION）のHELP WINDOW句で指定します。

ユーザポップアップHELP画面の操作手順の例を次に示します。

カーソルをフィールド（商品コード）に位置づけてヘルプキー（［F12］キー）を押すと，対応するユーザポップアップHELP画面が主画面に重ねて表示されます。

ユーザポップアップHELP画面を見ながら商品コードを入力します。

カーソルをほかのフィールド（商品コード以外）に移すか，終了キーを押すと，ユーザポップアップHELP画面が閉じます。

注意事項

ここでいう終了キーとは，メニューバーの［終了キー］で表示される［Enter］キー，［F1］〜［F24］キーコマンド，およびこれらに対応する［Enter］キー，［F1］〜［F24］キー，［実行］キーを指します。

12.3.7　注意事項

(1)　ACCEPT／REPLY文を使用する場合

ACCEPT／REPLY文でFIRST FIELD指定を使用する場合，次のような制限があります。

-DebugCompatiオプションを指定しても，FIRST FIELD指定の一意名に対して添字はチェックされません。

FIRST FIELD指定の直後には，IN NUMERIC MODE指定を記述できません。ただし，INを省略した場合は，IN NUMERIC MODE指定を記述できます。

(2)　指定したフィールドが画面（主画面のユーザ表示領域）に入りきらない場合

指定したフィールドが画面（主画面のユーザ表示領域）に入りきらない場合，実行時エラーとなります。次に示す対応を行い，画面に入るように調整してください。

フィールドの大きさを小さくする。

実行支援の画面設定で画面サイズを大きくする。

13　COBOL入出力サービスルーチン

COBOL入出力サービスルーチンを使うと，ほかの言語で書かれたプログラムから，COBOL2002で作成した順編成ファイル，および相対編成ファイルにアクセスできます。

この章では，COBOL入出力サービスルーチンの使用方法について説明します。

13.1　COBOL入出力サービスルーチンの概要

13.1.1　概要

COBOL2002の順編成ファイル，および相対編成ファイルは，COBOL2002独自のファイル形式で作成されます。そのため，他言語で作成したプログラムから，直接これらの形式のファイルにはアクセスできません。

COBOL入出力サービスルーチンを使用すると，他言語のプログラムからでもCOBOL2002の順編成ファイル，および相対編成ファイルにアクセスできます。

(1)　COBOL入出力サービスルーチンの使用方法

COBOL入出力サービスルーチンは，COBOLプログラム，または他言語のプログラムから呼び出して使用します。ファイルの入出力に必要な情報は，インタフェース領域と呼ばれる構造体を通じて受け渡されます。各サービスルーチンを呼び出すときには，このインタフェース領域のアドレスを引数として渡します。

(2)　COBOL入出力サービスルーチンで発生したエラーのデバッグ方法

COBOL入出力サービスルーチンの実行中にエラーが発生した場合，エラーメッセージ番号がインタフェース領域に格納されます。エラーメッセージは出力されません。

また，環境変数CBL_FLSRVDUMPを設定すると，デバッグ情報をファイルに出力することもできます。

13.1.2　COBOL入出力サービスルーチンが対応している機能

(1)　サービスルーチンが対応しているファイル形式

COBOL入出力サービスルーチンでアクセスできるファイル形式を，次に示します。

固定長の順編成ファイル

可変長の順編成ファイル

固定長の相対編成ファイル

可変長の相対編成ファイル

COBOL入出力サービスルーチンを使うと，これらの形式のファイルに対してCOBOL2002の入出力機能，およびファイル共用が使用できます。また，COBOLプログラムからアクセスすることを考慮したエラーチェックも実行されます。

(2)　COBOL入出力サービスルーチンの制限事項

COBOL入出力サービスルーチンを使ってファイルの入出力をする場合，次の指定，および機能は使用できません。

CLOSE文のWITH LOCK指定

不定ファイル（SELECT句のOPTIONAL指定）

入出力で誤り状態が発生したときの制御移行（USE文，AT END指定など）

行制御機能（WRITE文のADVANCING指定，ファイル記述項のLINAGE句）

特殊ファイルへの入出力（テープ装置，プリンタなど）

マルチスレッド環境下での実行

ラージファイル入出力機能（ただし，順編成ファイルでは，COBOL入出力サービスルーチンを使用してラージファイルに対する入出力ができます）

GUIモードでの動作

COBOL入出力サービスルーチンでは，エラーが発生しても終了処理がされません。エラーが発生した場合は，COBOL入出力サービスルーチンを呼び出したプログラム側で終了処理するようにしてください。

13.2　COBOL入出力サービスルーチンの説明

COBOL入出力サービスルーチンの一覧を，次に示します。

表13‒1　COBOL入出力サービスルーチンの一覧

サービスルーチンの名称

順ファイルの入出力

相対ファイルの入出力

機能

CBLOPEN

○

ファイルを開く

CBLCLOSE

○

ファイルを閉じる

CBLREAD

○

レコードの入力

CBLWRITE

○

レコードの出力

CBLREWRITE

○

レコードの書き換え

CBLUNLOCK

○

レコード施錠の解除

CBLDELETE

×

○

レコードの削除

CBLSTART

×

○

レコードの位置づけ

CBLWDISK

○

ファイルのディスクへの書き込み保証

（凡例）

○：使用できる

×：使用できない

各サービスルーチンの処理概要を，次に示します。

CBLOPENサービスルーチン

OPEN文のモード，ファイル属性に従い，ファイルを開く。

書き込みモードの場合，ファイルを作成する。ファイルがすでにある場合は，既存のファイルに上書きする。

追加書き込みモードの場合，ファイルの終端にファイルポインタを移動する。

ファイルの排他・共用のための施錠要求をする。

内部的に必要な領域を確保する。

CBLCLOSEサービスルーチン

ファイルを閉じる。

レコードの施錠を解除する。

オープン時に確保した領域を解放する。

CBLREADサービスルーチン

レコードをバッファに読み込む。

読み込んだレコードの長さを設定する。

レコード施錠の指定に従い，レコードを施錠する，または施錠を解除する。

読み込んだレコードの相対レコード番号を設定する（相対ファイルだけ）。

CBLWRITEサービスルーチン

バッファのレコードを書き出す。

レコードの施錠を解除する。

書き込んだレコードの相対番号を返す（相対ファイルだけ）。

CBLREWRITEサービスルーチン

書き込みバッファのレコードとの書き換えをする。

直前のREAD文をチェックする（順アクセスの場合だけ）。

書き換えレコード長をチェックする。

レコードの施錠を解除する。

CBLUNLOCKサービスルーチン

すべてのレコード施錠を解除する。

CBLDELETEサービスルーチン

レコードを削除する。

直前のREAD文をチェックする（順アクセスの場合だけ）。

レコードの施錠を解除する。

CBLSTARTサービスルーチン

キー番号と条件からレコードを位置づける。

ファイルのアクセスモードをチェックする（乱アクセスの場合はできない）。

CBLWDISKサービスルーチン

ファイルに出力したデータの，ディスクへの書き込み保証を適用する。

COBOL入出力サービスルーチンを呼び出すときの注意事項

COBOL2002のファイル入出力機能と同様に，オープン時のOPEN文のモードによって実行できないサービスルーチンがあります。

13.3　COBOL入出力サービスルーチンのインタフェース

13.3.1　サービスルーチンを呼び出す関数の形式

COBOL入出力サービスルーチンは，すべて次の形式で呼び出します。

形式

#include "CBL85fl.h"
int WINAPI サービスルーチン名(CBLCOMFL * com, CBLPARMFL * parm)

引数

CBLCOMFL * com：管理情報インタフェース領域のアドレス

CBLPARMFL * parm：パラメタインタフェース領域のアドレス

戻り値

0：正常に終了した場合

-1：エラーが発生した場合

注意事項

管理情報インタフェース領域，およびパラメタインタフェース領域は，ユーザプログラム側で確保する必要があります。

各インタフェース領域中のシステムが使用する領域，および予備領域には，最初のCBLOPENサービスルーチンを実行する前にNULL（X'00'）を指定して，領域をクリアしておく必要があります。

ただし，一度CBLCLOSEサービスルーチンで入出力を終了したあと，再度同じインタフェース領域を使ってCBLOPENサービスルーチンで入出力を開始する場合は，管理情報インタフェース領域中のシステムが使用する領域，および予備領域をクリアする必要はありません。

同じファイルにアクセスするときには，CBLOPENサービスルーチンでファイルを開いてからCBLCLOSEサービスルーチンでファイルを閉じるまで，同じ管理情報インタフェース領域を使用する必要があります。

同時に複数のファイルにアクセスする場合は，各ファイルに対して別々の管理情報インタフェース領域を用意する必要があります。

管理情報インタフェース領域中のファイル情報は，CBLOPENサービスルーチンを実行したときの設定値が有効となります。ファイルを開いたあとの入出力サービスルーチンでファイル情報を変更しても無効です。ただし，デバッグ情報出力指示の設定は，ファイルを開いたあとでも有効となります。

13.3.2　インタフェース領域の形式

COBOL入出力サービスルーチンで使用するインタフェース領域を，次に示します。

表13‒2　COBOL入出力サービスルーチンで使用するインタフェース領域

インタフェース領域の名称

（構造体のtypedef名称）

サイズ（バイト）

用途

Windows(x86) COBOL2002の場合

Windows(x64) COBOL2002の場合

管理情報インタフェース領域

（CBLCOMFL）

256

312

ファイル情報を管理する

OPEN時のファイル情報を指定する

エラー発生時，エラー情報を指定する

COBOL2002の内部情報として使用される

パラメタインタフェース領域

（CBLPARMFL）

32

48

入出力パラメタを指定する

(1)　管理情報インタフェース領域

管理情報インタフェース領域の形式を，「表13‒3　管理情報インタフェース領域の形式（1）」，および「表13‒4　管理情報インタフェース領域の形式（2）」に示します。

表13‒3　管理情報インタフェース領域の形式（1）

データ項目名

Windows(x86) COBOL2002の場合

Windows(x64) COBOL2002の場合

設定／参照する値

CBLOPENサービスルーチンでの指定

区分

名称

位置

長さ

データ形式

位置

長さ

データ形式

OUTPUT指定

OUTPUT以外

属性チェック無

属性チェック有

ファイル情報

ファイル編成とレコード形式

0

4

char[4]

0

4

char[4]

SAMF：順ファイル固定長レコード形式

SAMV：順ファイル可変長レコード形式

RELF：相対ファイル固定長レコード形式

RELV：相対ファイル可変長レコード形式

○

△※1

○

最大レコード長

4

4

int

4

4

int

レコード長

（固定長形式の場合レコード長）

○

△※1

○

最小レコード長

8

4

int

8

4

int

レコード長

（固定長形式の場合は無視される）

○

△

○

未使用

−

−

−

12

4

char[4]

サービスルーチン予備領域

NULL（X'00'）を指定してクリアしておくこと

NULL（X'00'）を指定してクリアしておくこと

NULL（X'00'）を指定してクリアしておくこと

ファイル名称アドレス

12

4

char＊

16

8

char＊

オープンするファイル名称のアドレスファイル名称はNULLで終わる文字列とする。

CBLOPENサービスルーチンを呼び出す時だけ指定が必要。

CBLOPENサービスルーチンの呼び出しが成功したあと，CBLCLOSEサービスルーチン実行までの入出力文で，COBOL2002は，このアドレス，およびアドレスが指す領域を参照しない。

○

○

○

属性チェックオプション※2

16

1

char

24

1

char

CBLCOM_NOCHK：

管理情報インタフェース領域とファイル実体の属性をチェックしない。

CBLCOM_CHK：

管理情報インタフェース領域とファイル実体の属性をチェックする。

−

○

CBLCOM_NOCHK

○

CBLCOM_CHK

ファイルOPEN文のモード

17

1

char

25

1

char

CBLCOM_OPEN_INPUT：

読み取り専用（OPEN INPUT）

CBLCOM_OPEN_IO：

読み取りと書き込み（OPEN I-O）

CBLCOM_OPEN_OUTPUT：

書き込み専用・新規作成（OPEN OUTPUT）

CBLCOM_OPEN_EXTEND：

追加書き（OPEN EXTEND）

○

CBLCOM_OPEN_OUTPUT

○

○

ファイル施錠モード

18

1

char

26

1

char

CBLCOM_LOCK_NO：

LOCK MODE句指定なし

CBLCOM_LOCK_EXCL：

排他施錠（LOCK MODE IS EXCLUSIVE）

CBLCOM_LOCK_AUTO：

自動施錠（LOCK MODE IS AUTOMATIC）

CBLCOM_LOCK_MANU：

手動施錠（LOCK MODE IS MANUAL）※3

○

○

○

ディスク書き込みオプション

19

1

char

27

1

char

CBLCOM_ENVFSYNC：

環境変数CBLFSYNCに従う。

CBLCOM_NOFSYNC：

ディスク書き込み保証を適用しない。

CBLCOM_FSYNC：

クローズ時のディスク書き込み保証を適用する。

CBLCOM_WDISK：

書き込み時のディスク書き込み保証を適用する。

詳細は「13.7　COBOL入出力サービスルーチンでのディスク書き込み保証」を参照。

○

○

（読み取り専用では無視）

○

（読み取り専用では無視）

ファイルアクセスモード

20

1

char

28

1

char

CBLCOM_ACCESS_SEQ：

順アクセス法（ACCESS MODE IS SEQUENTIAL）

CBLCOM_ACCESS_RAND：

乱アクセス法（ACCESS MODE IS RANDOM）

CBLCOM_ACCESS_DYNA：

動的アクセス法（ACCESS MODE IS DYNAMIC）

順ファイルでは順アクセス法だけが指定できる。

○

○

○

未使用

21

7

char[7]

29

11

char[11]

サービスルーチン予備領域

○

NULL（X'00'）を指定してクリアしておくこと

○

NULL（X'00'）を指定してクリアしておくこと

○

NULL（X'00'）を指定してクリアしておくこと

（凡例）

○：必ず指定する項目

△：COBOL2002が値を返す項目

−：無視される項目

注

表中の「CBLCOM_xxx」は，COBOL2002で使用できるインクルードファイル（CBL85fl.h）中で定義されているマクロです。CBL85fl.hファイルは，次のフォルダの下に提供されています。

COBOL2002インストールフォルダ¥include

注※1

順固定長ファイルに対して入出力する場合は，必ず指定してください。

注※2

順固定長ファイルではこの指定は無視され，レコード長に従います。

注※3

順ファイルでは手動施錠を指定できません。

表13‒4　管理情報インタフェース領域の形式（2）

データ項目名

Windows(x86) COBOL2002の場合

Windows(x64) COBOL2002の場合

設定／参照する値

備考

区分

名称

位置

長さ

データ形式

位置

長さ

データ形式

エラー情報

入出力状態

（FILE STATUS）

28

2

short

40

2

short

0〜99

正常／エラーに関係なく，必ず値が返される。

返される値の詳細は「付録H　入出力状態の値」を参照

システムエラー情報有無

30

1

char

42

1

char

CBLCOM_ERR_NOSYSTEM：

システムエラー情報なし

CBLCOM_ERR_SYSTEM：

システムエラー情報有り

未使用

31

1

char

43

1

char

サービスルーチン予備領域

COBOLメッセージ番号

32

2

short

44

2

short

3001〜4099

COBOLエラーメッセージ番号

「13.5.1　COBOL入出力サービスルーチンで出力されるエラーメッセージ番号」を参照

システムコール番号

34

2

short

46

2

short

1〜999

エラーとなったシステムコールを表すCOBOL2002が定める関数番号

システムエラー情報有りの場合に有効。

番号と内容については，マニュアル「COBOL2002　メッセージ」を参照

システムエラーコード

36

4

int

48

4

int

システムが返すエラーコード

システムエラー情報有りの場合に有効。

システムのマニュアルを参照

COBOLエラー詳細情報

40

1

char

52

1

char

インタフェース領域指定誤り，およびファイル属性エラー発生時の詳細情報

COBOLメッセージ番号が3701〜3703，および3801〜3803の場合に有効。

設定される値は，「表13‒5　COBOLエラー詳細情報の一覧」を参照

未使用

41

15

char[15]

53

15

char[15]

サービスルーチン予備領域

デバッグ情報

デバッグ情報出力指示

56

1

char

68

1

char

CBLCOM_DBG_NO：

デバッグ情報を出力しない

CBLCOM_DBG_BEF：

各入出力サービスルーチン実行の前にデバッグ情報を出力する

CBLCOM_DBG_AFT：

各入出力サービスルーチン実行後にデバッグ情報を出力する

CBLCOM_DBG_BEFAFT：

各入出力サービスルーチン実行の前とあとでデバッグ情報を出力する

「13.5.2　インタフェース領域のダンプ出力」を参照

未使用

57

11

char[11]

69

11

char[11]

サービスルーチン予備領域

ユーザ領域

68

16

char[16]

80

16

char[16]

プログラムで使用可能な領域。

COBOL2002では管理しない

システムで使用する領域

84

172

char[132]

char *[10]

96

216

char[136]

char *[10]

システムで使用する領域。

最初のオープンを実行する前にNULL（X'00'）を指定してクリアしておく

NULL（X'00'）クリア以降，この領域を更新してはならない

注

表中の「CBLCOM_xxx」は，COBOL2002で使用できるインクルードファイル（CBL85fl.h）中で定義されているマクロです。CBL85fl.hファイルは，次のフォルダの下に提供されています。

COBOL2002インストールフォルダ¥include

管理情報インタフェース領域のデータ項目に関する注意事項

(a)属性チェックオプション

属性チェックオプションには，ファイルのオープン時に管理情報インタフェース領域の値とファイル実体の属性をチェックするかどうかを指定します。

(i)属性をチェックしない場合

属性チェックオプションにCBLCOM_NOCHKを指定すると，ファイルの属性がチェックされません。この場合，CBLOPENサービスルーチンの呼び出し成功時に，ファイル実体に基づいて次のデータ項目が自動的に設定されます。

ファイル形式

順ファイル可変長レコード形式の場合　：SAMV

相対ファイル固定長レコード形式の場合：RELF

相対ファイル可変長レコード形式の場合：RELV

最大レコード長

最小レコード長

入出力状態

00が返されます。

ユーザは，設定されたデータ項目の値から，入出力に必要なバッファ領域を用意するようなプログラムを作成する必要があります。また，ファイル形式が妥当かどうかをユーザプログラム側で必ず判定するようにしてください。

(ii)属性をチェックする場合

属性チェックオプションにCBLCOM_CHKを指定すると，次のデータ項目についてファイルの属性がチェックされます。

ファイル編成とレコード形式

最大レコード長

最小レコード長

また，CBLOPENサービスルーチンの呼び出し成功時に，入出力状態に00が返されます。

属性チェックの結果，管理情報インタフェース領域の設定とファイル実体の属性が一致しなかった場合，サービスルーチンはエラーの戻り値を返し，ファイルは開かれません。

注意事項

OPEN文のモードに「書き込み専用・新規作成（OPEN_OUTPUT）」を指定した場合，属性チェックオプションの指定は無視され，管理情報インタフェース領域に指定されたファイル編成，およびレコード長に従って新規にファイルが作成されます。

ファイル編成とレコード形式にSAMF（順ファイル固定長レコード形式）を指定した場合，属性チェックオプションの指定は無視され，指定したレコード長に従ってファイルの入出力処理が実行されます。

ファイル編成とレコード形式に順ファイル固定長レコード形式（SAMF）を指定しないで，かつ，属性チェックオプションにチェックしない（CBLCOM_NOCHK）を指定した場合，順固定長ファイルに対してCBLOPENサービスルーチンを実行すると，対象外ファイルとみなされます。

(b)エラー情報

エラー情報に設定される値は，サービスルーチンの終了状態によって次のように異なります。

サービスルーチンの終了状態

入出力状態

COBOLメッセージ番号

システムエラー情報有無

システムコール番号／システムエラーコード

正常終了

00

0

なし

（CBLCOM_ERR_NOSYSTEM）

0

エラー発生

入出力状態を表す値

メッセージ番号

（0以外）

なし

（CBLCOM_ERR_NOSYSTEM）

0

あり

（CBLCOM_ERR_SYSTEM）

該当するコードが設定される

COBOLメッセージ番号，システムコール番号，およびシステムエラーコードの値は，COBOL2002が独自に定めた値，またはシステム固有のコードです。そのため，エラー発生時のプログラム実行制御には，入出力状態の値を使用してください。

(c)COBOLエラー詳細情報

COBOLエラー詳細情報に返される情報，およびその意味を次に示します。

表13‒5　COBOLエラー詳細情報の一覧

COBOLメッセージ番号

エラー種別

マクロ名称

値

エラー項目／エラーの意味

3701

3801

管理情報インタフェース領域指定誤り

CBLCOM_ERRC_FORM

1

ファイル編成とレコード形式

CBLCOM_ERRC_MAX

2

最大レコード長

（最大レコード長の値が1〜1,073,741,799以外，または最小レコード長より小さい）

CBLCOM_ERRC_MIN

3

最小レコード長

（最小レコード長の値が1〜1,073,741,799以外）

CBLCOM_ERRC_PATH

4

ファイル名称アドレス

CBLCOM_ERRC_FLOPT

5

属性チェックオプション

CBLCOM_ERRC_OPEN

6

ファイルオープンモード

CBLCOM_ERRC_LOCK

7

ファイル施錠モード

CBLCOM_ERRC_FSYNC

8

ディスク書き込みオプション

CBLCOM_ERRC_DBGINF

9

デバッグ情報出力指示

CBLCOM_ERRC_ACCESS

10

ファイルアクセスモード

CBLCOM_ERRC_MSGBUFSIZ

11

メッセージ出力用バッファ長

3702

3802

パラメタインタフェース領域指定誤り

CBLCOM_ERRP_RDBUF

21

読み込みバッファアドレス

CBLCOM_ERRP_WRBUF

22

書き出しバッファアドレス

CBLCOM_ERRP_LOCK

23

WITH LOCK指定

CBLCOM_ERRP_KEY

24

レコード番号キー

CBLCOM_ERRP_ACCESS

25

レコード単位アクセスモード

CBLCOM_ERRP_KEYMODE

26

キー比較条件

3703

3803

ファイル属性エラー

CBLCOM_ERRF_CBL

41

ファイルフォーマット

（COBOL以外で作成したファイル，またはファイル破壊）

CBLCOM_ERRF_FORM

42

ファイル形式（ファイル編成，またはレコード形式）

CBLCOM_ERRF_MAX

43

最大レコード長

CBLCOM_ERRF_MIN

44

最小レコード長

インタフェース領域中の複数のデータ項目に誤りがある場合や，ファイルの属性チェックで複数の項目の属性が一致しなかった場合，COBOLエラー詳細情報には，最初に発見されたエラー項目に関する値が設定されます。

(2)　パラメタインタフェース領域

パラメタインタフェース領域の形式を，次に示します。

表13‒6　 パラメタインタフェース領域の形式

データ項目名

Windows(x86) COBOL2002の場合

Windows(x64) COBOL2002の場合

設定／参照する値

各サービスルーチンでの指定

区分

名称および意味

位置

長さ

データ形式

位置

長さ

データ形式

ＯＰ

ＣＬ

ＲＥ

ＷＲ

ＲＷ

ＤＥ

ＳＴ

ＵＮ

ＷＤ

入出力パラメタ

読み込みバッファ

アドレス

0

4

char *

0

8

char *

読み込んだレコードを格納する領域のアドレス

−

−

○

−

−

−

−

−

−

読み込み

サイズ

4

4

int

8

4

int

読み込んだレコードの長さを返す

−

−

△

−

−

−

−

−

−

未使用

−

−

−

12

4

char[4]

サービスルーチン予備領域

−

−

−

−

−

−

−

−

−

書き出しバッファアドレス

8

4

char *

16

char *

書き出すレコードのバッファアドレス

−

−

−

○

○

−

−

−

−

書き出しサイズ

12

4

int

24

4

int

書き出すレコードの長さ

−

−

−

○※1

○※1

−

−

−

−

相対レコード番号キー

(RELATIVE KEY

16

4

int

28

4

int

入出力対象レコードキー番号※2

ファイルアクセスモード：順アクセス

−

−

△

△

N

N

○

−

−

ファイルアクセスモード：乱アクセス

−

−

○

○

○

○

E

−

−

ファイルアクセスモード：動的アクセス

−

−

※3

○

○

○

○

−

−

WITH LOCK指定

20

1

char

32

1

char

CBLPARM_NOLOCK：レコード施錠要求なし（WITH NO LOCK）

CBLPARM_LOCK：レコード施錠要求あり（WITH LOCK）

レコード施錠の詳細は，マニュアル「COBOL2002　言語　標準仕様編」を参照

○

−

○

−

−

−

−

−

−

レコード単位アクセスモード

21

1

char

33

1

char

CBLPARM_ACCESS_NEXT：順アクセス（READ NEXT）

CBLPARM_ACCESS_KEY：乱アクセス（READ KEY）

−

−

○※4

−

−

−

−

−

−

キー比較条件

22

1

char

34

1

char

位置づける相対レコード番号とキー（key）の比較条件

CBLPARM_KEY_EQUAL：キーの値と等しい（EQUAL）

CBLPARM_KEY_GREAT：キーの値より大きい（GREATER THAN）

CBLPARM_KEY_NOTLESS：キーの値より小さくない（NOT LESS THAN）

CBLPARM_KEY_GREATEQ：キーの値より大きいか，または等しい（GREATER THAN OR EQUAL）

−

−

−

−

−

−

○

−

−

未使用

23

9

char[9]

35

13

char[13]

サービスルーチン予備領域

※5

※5

※5

※5

※5

※5

※5

※5

※5

（凡例）

OP：CBLOPENサービスルーチン

CL：CBLCLOSEサービスルーチン

RE：CBLREADサービスルーチン

WR：CBLWRITEサービスルーチン

RW：CBLREWRITEサービスルーチン

DE：CBLDELETEサービスルーチン

ST：CBLSTARTサービスルーチン

UN：CBLUNLOCKサービスルーチン

WD：CBLWDISKサービスルーチン

○：必ず指定する項目

△：COBOL2002が値を返す項目

E：エラー（乱アクセス法の場合，CBLSTARTサービスルーチンは実行できない）

N：無視される項目（直前にCBLREADサービスルーチンの呼び出しが成功したレコードが対象となる）

−：無視される項目

注※1

固定長レコード形式の場合，このデータ項目の指定は無視されます。

注※2

入出力対象レコードキー番号について次に示します（○△だけ該当）。

最初のレコード番号は1，以降2，3，…となり1ずつ増えます。

このデータ項目の指定は，相対ファイルだけで有効となります。順ファイルで指定した場合は，無視されます。

順アクセスの場合，CBLREADサービスルーチンやCBLWRITEサービスルーチンによって読み書きされたレコードの，相対レコード番号が返されます。

乱アクセス，または動的アクセスの場合，入出力文を実行する前に入出力対象レコードの相対レコード番号を設定する必要があります。

注※3

ファイルアクセスモードが動的アクセスのCBLREADサービスルーチンを実行したときは，レコード単位アクセスモードの指定によって，順アクセスか乱アクセスかが決まります。

注※4

順ファイルの場合，このデータ項目の指定は無視されます。

注※5

最初にCBLOPENサービスルーチンを実行する前にNULL（X'00'）を指定して，領域をクリアしておく必要があります。

パラメタインタフェース領域のデータ項目に関する注意事項

(a)レコード単位アクセスモード

レコード単位アクセスモードには，相対ファイルに対するCBLREADサービスルーチンの実行が，順アクセスか，乱アクセスかを指定します。順ファイルに対してこの項目を指定した場合，指定は無視され，常に順アクセスとなります。

レコード単位アクセスモードに指定する値による動作の違いを，次に示します。

指定する値

レコード単位

アクセスモード

指定可能な

ファイルアクセスモード

（CBLOPENサービスルーチン実行時の指定）

動作

CBLPARM_ACCESS_NEXT

順アクセス

順アクセス法

動的アクセス法

次のどちらかのレコードを読み込む。

直前のCBLREADサービスルーチンによって位置づけられたレコードの，次のレコード

直前のCBLSTARTサービスルーチンによって位置づけられたレコード

ただし，CBLOPENサービスルーチンを実行した直後の場合は，有効な先頭レコードを読み込む。

CBLPARM_ACCESS_KEY

乱アクセス

乱アクセス法

動的アクセス法

相対レコード番号キーに指定した番号のレコードを読み込む。

レコードのアクセスモードが順アクセスの場合，直前のCBLREADサービスルーチン，またはCBLSTARTサービスルーチンがエラー（パラメタエラーを含む）になると，それに続くCBLREADサービスルーチンもエラーになります。

(b)キー比較条件

キー比較条件には，相対ファイルに対するCBLSTARTサービスルーチンで，位置づける相対レコード番号とキーの比較条件を指定します。キー比較条件の指定値と意味を，次に示します。

指定する値

比較条件

対応するCOBOL START文のKEY指定

位置づけるレコード（以下の条件を満たさない時はエラー）

CBLPARM_KEY_EQUAL

キーの値と等しい

KEY IS EQUAL TO

（KEY IS = TO）

相対レコード番号がキーと等しいレコード

CBLPARM_KEY_GREAT

キーの値より大きい

KEY IS GREATER THAN

（KEY IS > ）

相対レコード番号がキーの値より大きい最初のレコード

CBLPARM_KEY_NOTLESS

キーの値より小さくない

KEY IS NOT LESS THAN

（KEY IS NOT < ）

相対レコード番号がキーの値より小さくない最初のレコード

CBLPARM_KEY_GREATEQ

キーの値より大きいか，または等しい

KEY IS GREATER THAN

OR EQUAL TO

（KEY IS >= ）

相対レコード番号がキーの値より大きいか，または等しい最初のレコード

13.4　リンクの指定

COBOL入出力サービスルーチンを使用したプログラムをリンクする場合，cbl85fl.libの指定が必要です。指定形式を次に示します。

形式

cl  -Iyyy  xxx.c  cbl85fl.lib

xxx.c

COBOL入出力サービスルーチンを使用するCプログラムのファイル名

yyy

COBOLインクルードファイルがあるフォルダ

COBOL2002インストールフォルダ¥include

また，COBOL入出力サービスルーチンを使用したCプログラムを，COBOLプログラムとともにccbl2002コマンドでリンクすることもできます。指定形式を次に示します。

形式

ccbl2002 -Main,System zzz.cbl xxx.obj

xxx.obj

COBOL入出力サービスルーチンを使用するCプログラムのオブジェクトファイル名

zzz.cbl

COBOLソースファイル

13.5　デバッグ情報の取得

COBOL入出力サービスルーチンでエラーが発生した場合，エラーメッセージは出力されません。その代わり，管理情報インタフェース領域にメッセージ番号や入出力状態などのエラー情報が出力されます。ユーザは，これらの情報や，メッセージ番号が指すエラーメッセージの内容から，エラーの内容を知ることができます。

また，デバッグ情報として，インタフェース領域の内容をダンプ形式で出力できます。

ここでは，これらのデバッグ情報の取得方法，および利用方法について説明します。

13.5.1　COBOL入出力サービスルーチンで出力されるエラーメッセージ番号

COBOL入出力サービスルーチンでエラーが発生したときだけに出力されるメッセージ番号と，その対処方法を次の表に示します。次の表にないメッセージ番号が出力された場合は，マニュアル「COBOL2002　メッセージ」の実行時のメッセージの説明を参照してください。

表13‒7　COBOL入出力サービスルーチンで出力されるメッセージ番号

メッセージ番号

エラーの内容

対処

順ファイル

相対ファイル

3701

3801

管理情報インタフェース領域の指定に誤りがあります。

管理情報インタフェース領域中のCOBOLエラー詳細情報を基に，指定値を見直す。※1

3702

3802

パラメタインタフェース領域の指定に誤りがあります。

管理情報インタフェース領域中のCOBOLエラー詳細情報を基に，指定値を見直す。※1

3703

3803

ファイルの属性情報とプログラムの指定との間に矛盾があります。

管理情報インタフェース領域中のCOBOLエラー詳細情報を基に，ファイル属性情報とプログラムの指定を一致するように変更する。※2

3704

3804

入出力エラーが発生しました。

管理情報インタフェース領域中のシステムコール番号とシステムエラーコードを基に，原因を調査する。

3705

3805

デバッグ情報の出力中に入出力エラーが発生しました。

管理情報インタフェース領域中のシステムコール番号とシステムエラーコードを基に，原因を調査する。サービスルーチンの処理自体は正常終了している。

3706

3806

デバッグ情報の出力中に入出力エラーが発生しました。サービスルーチンでもエラーが発生しています。

管理情報インタフェース領域中のシステムコール番号とシステムエラーコードを基に，原因を調査する。

管理情報インタフェース領域のエラー情報は，デバッグ情報出力中に発生したエラーに関する情報である。

サービスルーチンの処理自体でもエラーが発生しているため，デバッグ情報出力中のエラーを対策のあと，再実行して，サービスルーチンのエラー原因を調査する。

3707

3807

メッセージ番号が不正です。

関数情報のエラーリターン後に管理情報インタフェース領域が更新された可能性がある。入出力サービスルーチンの発行順序を見直す。

3751

3851

メモリが不足しました。

不要な資源を削除して再実行する。

3752

指定されたファイルは取り扱えません。

COBOL入出力サービスルーチンで取り扱えるのは，COBOL2002で作成した順可変長レコード形式，または相対ファイルである。

また，ファイルが破壊されたおそれもある。指定したファイルを見直す。

−

3861

CBLSTARTには乱アクセス以外で相対ファイルだけが指定できます。

エラーの内容に従いプログラムを見直す。

−

3862

NEXT指定のCBLREADは，相対ファイルの動的アクセス，および順アクセスファイルに指定できます。

エラーの内容に従いプログラムを見直す。

3763

3863

KEY指定のCBLREADは，順アクセス以外で相対ファイルだけが指定できます。

エラーの内容に従いプログラムを見直す。

3764

−

CBLDELETEは相対ファイルだけが指定できます。

エラーの内容に従いプログラムを見直す。

3765

−

順ファイルにはLOCK MODE MANUALの指定はできません。

エラーの内容に従いプログラムを見直す。

−

3866

EXTEND指定のCBLOPENは，順アクセスのファイルだけが指定できます。

エラーの内容に従いプログラムを見直す。

3767

3867

ファイルが開かれていないためCBLWDISKサービスルーチンが実行できません。

開かれているファイルに対してCBLWDISKサービスルーチンを実行するようにプログラムを修正して再実行する。

（凡例）

−：該当するメッセージ番号はない

注

順ファイルのエラーに対しては3700番台のメッセージ番号が，相対ファイルのエラーに対しては3800番台のメッセージ番号が，それぞれ設定されます。ただし，エラー発生時にファイル編成が特定できない場合は，3700番台のメッセージ番号が設定されます。

注※1

各インタフェース領域で複数のデータ項目の指定値に誤りがある場合，COBOLエラー詳細情報には，最初に誤りが発見されたデータ項目名に該当する値が設定されます。

注※2

ファイル属性エラーが発生したときのCOBOLエラー詳細情報には，次に示す順で最初に発見されたエラー項目に該当する値が設定されます。

ファイルフォーマット

・オープンするファイルに，COBOL2002が定めるヘッダ情報がない。

・COBOL2002で作成した順可変長ファイル，または相対ファイルでない。または，ファイルが破壊されている。

ファイル編成／レコード形式

最大レコード長

最小レコード長

13.5.2　インタフェース領域のダンプ出力

COBOL入出力サービスルーチンが使用する次の三つのインタフェース領域の内容を，デバッグ情報としてダンプ形式で出力できます。

管理情報インタフェース領域

パラメタインタフェース領域

入出力レコード領域

ここでは，これらのデバッグ情報の出力方法について説明します。

(1)　出力先ファイル名の指定

デバッグ情報を出力するときは，環境変数CBL_FLSRVDUMPに出力先となるファイル名を指定します。次に，環境変数CBL_FLSRVDUMPの指定方法を示します。

形式

CBL_FLSRVDUMP=出力先ファイル名

出力先ファイル名

デバッグ情報を出力するファイル名を絶対パスで指定します。

規則

環境変数CBL_FLSRVDUMPに指定したファイルがない場合，新規にファイルが作成されます。すでにファイルがある場合は，ファイルの最後にデバッグ情報が追加されます。

環境変数CBL_FLSRVDUMPに指定したパスがない場合，実行時エラーとなります。

環境変数CBL_FLSRVDUMPを指定しない場合，または値を指定しない場合は，デバッグ情報が出力されません。

注意事項

環境変数CBL_FLSRVDUMPを実行支援で指定した場合，最初のCOBOLプログラムが動作するまで，この環境変数の指定は無効となります。

(2)　出力タイミングの指定

デバッグ情報は，各入出力サービスルーチンの実行前，実行後，またはその両方のときに出力できます。管理情報インタフェース領域のデバッグ情報出力指示に値を指定すると，どのタイミングでデバッグ情報を出力するかを指定できます。次に，デバッグ情報出力指示に指定する値と，デバッグ情報が出力されるタイミングの関係を示します。

デバッグ情報出力指示の値

デバッグ情報が出力されるタイミング

CBLCOM_DBG_NO

デバッグ情報は出力されない

CBLCOM_DBG_BEF

各入出力サービスルーチンの実行前

CBLCOM_DBG_AFT

各入出力サービスルーチンの実行後

CBLCOM_DBG_BEFAFT

各入出力サービスルーチン実行の前後両方

規則

デバッグ情報出力指示の値は，ファイルを開いている間でも任意に変更できます。これによって，入出力サービスルーチンごとに異なるタイミングでデバッグ情報を出力できます。

COBOL入出力サービスルーチンでパラメタエラーが発生した場合，サービスルーチン実行後にはデバッグ情報が出力されません。

デバッグ情報出力指示の値は，COBOL2002によって変更されません。

(3)　出力の対象となる領域

デバッグ情報へ出力されるインタフェース領域の種類は，実行するCOBOL入出力サービスルーチンの種類によって異なります。サービスルーチンごとに出力されるデバッグ情報の種類を，次に示します。

COBOL入出力

サービスルーチン

出力される領域

管理情報インタフェース領域

パラメタインタフェース領域

読み込み

バッファ※1

書き出し

バッファ※1

CBLOPEN

○

○

×

×

CBLCLOSE

○

×

×

×

CBLREAD

○

○

○※2

×

CBLWRITE

○

○

×

○

CBLREWRITE

○

○

×

○

CBLUNLOCK

○

×

×

×

CBLDELETE

○

○

×

×

CBLSTART

○

○

×

×

CBLWDISK

○

×

×

×

（凡例）

○：デバッグ情報に出力される

×：デバッグ情報に出力されない

注※1

バッファ領域は，実際に入出力した長さでダンプ出力されます。

注※2

CBLREADサービスルーチンの実行前には出力されません。

(4)　出力形式

デバッグ情報には，それぞれの先頭の領域を0とした相対的な位置と内容が，ダンプ形式で出力されます。

デバッグ情報の出力例を，次に示します。

注※1

CBLCOMFLに続くダンプリストは，管理情報インタフェース領域を表しています。

注※2

CBLPARMFLに続くダンプリストは，パラメタインタフェース領域を表しています。

13.6　COBOL入出力サービスルーチンでの複数レコード施錠

COBOL2002の入出力機能と同様に，COBOL入出力サービスルーチンでも一つのファイルに複数のレコード施錠を同時に取得できます。複数レコード施錠の詳細については，「7.2.2　レコードレベルのファイル共用」を参照してください。

複数レコード施錠は，相対ファイルだけで使用できます。また，COBOL2002の入出力機能と同様に，環境変数CBL_RECLOCKMAXで同時に施錠するレコード数を指定できます。

注意事項

環境変数CBL_RECLOCKMAXを実行支援で指定した場合，最初のCOBOLプログラムが動作するまで，この環境変数の指定は無効となります。

13.7　COBOL入出力サービスルーチンでのディスク書き込み保証

COBOL2002のファイル入出力機能と同様に，COBOL入出力サービスルーチンでも，ファイルのクローズ時，または書き込み時に，ディスクへの書き込み保証が適用された入出力処理ができます。

ファイルのディスクへの書き込み保証は，次のCOBOL入出力サービスルーチンの呼び出し完了時に適用されます。

ファイルクローズ時の保証

CBLCLOSEサービスルーチン

ファイル書き込み時の保証

CBLWRITEサービスルーチン

CBLREWRITEサービスルーチン

CBLDELETEサービスルーチン

また，CBLWDISKサービスルーチンを呼び出すと，その時点でのディスクへの書き込み保証が適用されます。

COBOL2002のファイル入出力機能でのディスク書き込み保証については，「14.1　ファイルのディスク書き込み保証」を参照してください。

COBOL入出力サービスルーチンでは，次の3種類の方法でファイルのディスクへの書き込みを保証します。

ファイルごとに指定する

プロセス内のすべてのファイルに対して指定する

CBLWDISKサービスルーチンを呼び出す

13.7.1　ファイルごとに指定する方法

ファイルごとにディスクへの書き込み保証を適用する場合は，書き込み保証を適用したいファイルに対応する管理情報インタフェース領域中のディスク書き込みオプションを指定します。ディスク書き込みオプションに指定できる値と，その意味を次に示します。

マクロ名

値

意味

CBLCOM_ENVFSYNC

0

環境変数CBLFSYNCの指定に従う。環境変数CBLFSYNCの詳細は，「14.1　ファイルのディスク書き込み保証」を参照のこと。

CBLCOM_NOFSYNC

1

クローズ時のディスクへの書き込み保証が適用されない。

CBLCOM_FSYNC

2

クローズ時のディスクへの書き込み保証が適用される。

CBLCOM_WDISK

3

書き込み時のディスクへの書き込み保証が適用される。

13.7.2　プロセス内のすべてのファイルに対して指定する方法

クローズ時のディスクへの書き込み保証は，プロセス内のすべてのファイルに対して指定できます。指定方法を次に示します。

環境変数CBLFSYNCにYESを指定する。

環境変数CBLFSYNCの詳細は，「14.1　ファイルのディスク書き込み保証」を参照してください。

すべてのファイルに対応する管理情報インタフェース領域のディスク書き込みオプションに，「CBLCOM_ENVFSYNC」または「CBLCOM_FSYNC」を指定する。

管理情報インタフェース領域については，「13.3.2　インタフェース領域の形式」を参照してください。

注意事項

ディスク書き込みオプションにCBLCOM_NOFSYNCを指定したファイルは，ディスクへの書き込み保証が適用されません。

13.7.3　CBLWDISKサービスルーチンを呼び出して保証する方法

CBLWDISKサービスルーチンを呼び出すと，指定されたファイルに対して，サービスルーチン呼び出し時までに出力したデータのディスクへの書き込み保証が適用されます。

CBLWDISKサービスルーチンの呼び出し方法については，「13.3　COBOL入出力サービスルーチンのインタフェース」を参照してください。

また，次のサービスルーチンによってファイルの書き込みが発生したときに，ディスクへの書き込み保証を適用する場合は，ファイルに対応する管理情報インタフェース領域のディスク書き込みオプションに，「CBLCOM_WDISK」を指定してください。

CBLWRITEサービスルーチン

CBLREWRITEサービスルーチン

CBLDELETEサービスルーチン

管理情報インタフェース領域については，「13.3.2　インタフェース領域の形式」を参照してください。

13.7.4　注意事項

COBOL入出力サービスルーチンでディスク書き込み保証を使用する場合，次の点に注意してください。

ディスクへの書き込み保証が適用されるサービスルーチンの呼び出しが完了する前にシステムダウンが発生したときは，データのディスクへの書き込み保証は適用されません。

管理情報インタフェース領域のディスク書き込みオプションに指定した値は，CBLOPENサービスルーチンの呼び出し時だけチェックされます。

13.8　COBOL入出力サービスルーチンの使用例

COBOL入出力サービスルーチンの使用例を，次に示します。

（例1）サービスルーチンを使ってファイルを読み込むCプログラム

   :
#include "CBL85fl.h"   /* COBOL提供ヘッダファイルの取り込み */
   :
CBLCOMFL   com ;         /* 管理情報インタフェース領域 */
CBLPARMFL  parm ;        /* パラメタインタフェース領域 */
char  filename[100] ;    /* ファイル名称 */
int   end_flg ;

memset(&com, 0x00, sizeof(CBLCOMFL)) ; /* テーブル0クリア */
memset(&parm, 0x00, sizeof(CBLPARMFL)) ;
/* OPENパラメタを設定する */
strcpy(filename, "c:¥¥tmp¥¥outfile") ;
com.cblcom_pathname = filename ;
com.cblcom_flopt    = CBLCOM_NOCHK ;
                                    /*属性チェックをしない*/
com.cblcom_openmode = CBLCOM_OPEN_INPUT ;
                                    /*OPENモードはINPUT*/
parm.cblparm_lock   = CBLPARM_NOLOCK ;     /*施錠なし*/
if (CBLOPEN(&com, &parm) != 0) {
                               /*CBLOPENサービスルーチン実行*/
ERROUT(&com) ;          /*エラー情報出力用サブルーチン呼び出し*/
return(-1) ;
}
if (memcmp(com.cblcom_form, "SAMV", 4) != 0) {
   printf("ファイルはCOBOL順可変長形式ではない。¥n") ;
   return(-1) ;
}
/* READパラメタを設定する */
parm.cblparm_lock = CBLPARM_NOLOCK ;        /*施錠なし*/
/* OPENのリターン情報に従い入出力バッファ取得 */
if ((parm.cblparm_read_buf = malloc(com.cblcom_maxrec))
      == NULL) {
   :        /* 必要なメモリが取得できない場合のエラー処理 */
}
end_flg = 0 ;
while(end_flg == 0) {              /*レコード終了までループ*/
if (CBLREAD(&com , &parm) == 0) {
                               /*CBLREADサービスルーチン実行*/
   :                                /* READ成功時の処理 */
} else {
   end_flg = 1 ;                /*読み込み終了フラグ　オン */
     if (com.cblcom_fs == 10) {  /*入出力状態値10:ファイル終了*/
       :                        /* ファイル終了時の処理 */
   } else {
      ERROUT(&com) ;             /*エラー処理*/
     }
  }
}
/* 終了処理 */
if (CBLCLOSE(&com, &parm) != 0) {
                             /*CBLCLOSEサービスルーチン実行*/
 ERROUT(&com) ;
}

（例2）エラー情報を出力するC副プログラム

extern void ERROUT(p1)
CBLCOMFL *p1 ;
{
   if ((p1->cblcom_msgno >= 3701)
        && (p1->cblcom_msgno <= 3703)) {
     printf("パラメタエラー(詳細情報番号=%d)¥n",
                   p1->cblcom_cbldetail) ;
   } else {
     printf("メッセージ番号=%d¥n",p1->cblcom_msgno) ;
     if (p1->cblcom_sysinf == CBLCOM_ERR_SYSTEM) {
        /* システムエラー情報がある時 */
        printf("システムコール番号=%dエラーコード=%d¥n",
                   p1->cblcom_funcno, p1->cblcom_errno) ;
    }
  }
}

13.9　注意事項

ここでは，COBOL入出力サービスルーチンを使用するときの注意事項について説明します。

各インタフェース領域中のシステムが使用する領域，および予備領域は，インタフェース領域を使用する最初のCBLOPENサービスルーチンを実行する前に，すべてNULL（X'00'）を指定して内容をクリアしてください。また，クリアしたあとは，これらの領域を更新しないでください。領域をクリアしなかった場合，またはクリア後に更新した場合，動作は保証しません。

管理情報インタフェース領域に出力されるエラー情報は，サービスルーチンがエラーを返した直後だけ，内容を保証します。

CBLOPENサービスルーチンの呼び出しが成功したあとに処理を中断する場合，必ずCBLCLOSEサービスルーチンを呼び出すようにしてください。CBLCLOSEサービスルーチンを呼び出さないで処理を中断した場合，領域の解放やレコード施錠の解除がされません。

14　ファイルのディスク書き込み保証

COBOL2002には，システムダウンなどが発生したときにデータのディスクへの書き込み漏れが発生しないように，ファイルのディスク書き込み保証機能があります。この章では，ファイルのディスク書き込み保証機能について説明します。

14.1　ファイルのディスク書き込み保証

COBOL2002の入出力処理では，入出力文の実行とデータのディスクへの書き込みが非同期に処理されます。そのため，入出力文の実行直後にシステムダウンが発生した場合，OSが管理するバッファ内のデータが，ディスクに書き込まれないことがあります。

このようなディスクへの書き込み漏れを防ぐため，COBOL2002には次のようなファイルのディスク書き込みを保証する機能があります。

ファイルクローズ時の保証

プログラムの終了時，またはCLOSE文の実行終了時に，ファイルのディスク書き込みを保証する機能です。

ファイル書き込み時の保証

WRITE文，REWRITE文，またはDELETE文の実行終了時に，ファイルのディスク書き込みを保証する機能です。

ここでは，ファイルのディスク書き込み保証機能について説明します。

14.1.1　対象となるファイル編成

ディスクへの書き込み保証の対象となるファイル編成を次に示します。

表14‒1　ディスクへの書き込み保証の対象となるファイル編成

ファイル種別

ファイルクローズ時の保証

ファイル書き込み時の保証

順編成ファイル

○

○

相対編成ファイル

○

○

ISAMによる索引編成ファイル

×

○

HiRDBによる索引編成ファイル

×

×

Btrieve（Pervasive.SQL）による索引編成ファイル※1

×

×

テキスト編成ファイル

×

×

CSV編成ファイル

○

×

（凡例）

○：ディスク書き込み保証を適用できる

×：ディスク書き込み保証を適用できない※²

注※1

Windows(x86) COBOL2002で有効です。

注※2

ディスク書き込み保証を適用できないファイル編成に対して，ディスク書き込み保証を有効にするための環境変数を指定しても実行時エラーにはなりません。この場合，ディスク書き込み保証が無効なままプログラムを続行します。

HiRDBによる索引編成ファイルのディスク書き込み保証

HiRDBによる索引編成ファイルのディスク書き込み保証は，HiRDBの仕様に従います。詳細は，「HiRDBの解説マニュアル」を参照してください。

なお，HiRDBによる索引編成ファイルでは，COMMIT文の実行後は，ファイルのディスクへの書き込みを保証します。

Btrieve（Pervasive.SQL）による索引編成ファイルのディスク書き込み保証

Btrieve（Pervasive.SQL）による索引編成ファイルのディスク書き込み保証は，Pervasive.SQL，Btrieveの仕様に従います。詳細は，Pervasive.SQL，Btrieveのマニュアルを参照してください。

COBOL入出力サービスルーチン使用時のディスク書き込み保証

COBOL入出力サービスルーチン使用時のディスク書き込み保証については，「13.7　COBOL入出力サービスルーチンでのディスク書き込み保証」を参照してください。

14.1.2　ファイルクローズ時のディスク書き込み保証の指定方法

ファイルクローズ時のディスク書き込み保証は，「14.1.1　対象となるファイル編成」で示すファイルに対して，ファイル別に指定する方法と，プロセス内のすべてのファイルに対して指定する方法があります。

(1)　ファイル別に指定する方法

形式

CBLD_ファイル名=｛ FSYNC ｜ NOFSYNC ｝

機能

環境変数CBLD_ファイル名にFSYNCを指定すると，COBOLプログラムの環境部のファイル管理記述項で指定したファイル名のファイルに対してクローズ時のディスクへの書き込み保証が適用されます。

NOFSYNCを指定した場合は，ディスクへの書き込み保証が適用されません。

(2)　プロセス内のすべてのファイルを指定する方法

形式

CBLFSYNC=YES

機能

環境変数CBLFSYNCにYESを指定すると，プロセス内のすべてのファイルに対してクローズ時のディスクへの書き込み保証が適用されます。この環境変数の指定をしなかった場合，およびYES以外の値を指定した場合は，クローズ時のディスクへの書き込み保証は適用されません。

また，環境変数CBLD_ファイル名にNOFSYNCが指定されたファイルに対しては，環境変数CBLFSYNCの指定は有効とならないため，クローズ時のディスクへの書き込み保証は適用されません。

(3)　注意事項

次の場合，ファイルのディスクへの書き込み保証は適用されません。

CLOSE文の動作が完了する前にシステムダウンが発生した場合

ファイルクローズ時のディスク書き込み保証が行なわれる前にシステムダウンが発生して，ディスクへ書き込まれなかった場合

14.1.3　ファイル書き込み時のディスク書き込み保証の指定方法

形式

CBLD_ファイル名=WDISK

機能

環境変数CBLD_ファイル名にWDISKを指定すると，COBOLプログラムの環境部のファイル管理記述項で指定したファイル名のうち，「14.1.1　対象となるファイル編成」で示すファイルに対して，書き込み時のディスクへの書き込み保証が適用されます。

注意事項

次の場合，ファイルのディスクへの書き込み保証は適用されません。

WRITE文，REWRITE文，DELETE文の動作が完了する前にシステムダウンが発生した場合

14.1.4　整列併合機能の出力ファイルに対するディスク書き込み保証

SORT文およびMERGE文で使用する出力用ファイルにディスク書き込み保証を適用する場合は，出力用ファイル名に対して環境変数CBLD_ファイル名にFSYNC，またはCBLD_ファイル名にWDISKを指定します。また，環境変数CBLFSYNCにYESを指定した場合は，プロセス内のすべてのファイルに対してディスク書き込み保証が有効となり，整列併合機能で使用する出力用ファイルにもクローズ時のディスクへの書き込み保証が適用されます。

ただし，出力用ファイルとして索引ファイルを指定した場合は，環境変数CBLD_ファイル名にWDISKを指定した場合だけにディスク書き込み保証が適用されます。

ディスク書き込み保証の対象ファイルについては，「14.1.1　対象となるファイル編成」を参照してください。

次に，COBOLプログラムとファイル別の環境変数の指定例を示します。

COBOLプログラムの指定例

       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
            SELECT INFILE   ASSIGN SYS010.
            SELECT OUTFILE  ASSIGN SYS020.
            SELECT SORTFILE ASSIGN SYS001S.
          ：
       PROCEDURE DIVISION.
            SORT SORTFILE DESCENDING KEY SORT-KEY
                 USING  INFILE
                 GIVING OUTFILE.

環境変数の指定例

CBLD_OUTFILE=FSYNC

14.1.5　注意事項

環境変数CBLD_ファイル名のFSYNC／NOFSYNC／WDISKと，環境変数CBLFSYNCを同時に指定した場合，環境変数CBLD_ファイル名の指定が有効となります。このとき，環境変数CBLD_ファイル名を指定したファイルに対しては，環境変数CBLFSYNCの指定は無効となります。

環境変数CBLD_ファイル名にFSYNC／NOFSYNC／WDISKの指定がないファイルでは，環境変数CBLFSYNCの指定が有効となります。

環境変数の組み合わせと，保証するディスク書き込みについて次に示します。

環境変数CBLFSYNC

環境変数CBLD_ファイル名

FSYNC

NOFSYNC

WDISK

指定なし

YES

C

×

W

C

YES以外，または

環境変数指定なし

C

×

W

×

（凡例）

C：該当ファイルに対して，ファイルクローズ時のディスクへの書き込み保証を適用する

W：該当ファイルに対して，ファイル書き込み時のディスクへの書き込み保証を適用する

×：該当ファイルに対して，ファイルのディスクへの書き込み保証を適用しない

15　バイトストリーム入出力サービスルーチン

バイトストリーム入出力サービスルーチンを使用すると，COBOLのレコード定義に依存しないで，Cプログラムなどで作成したバイナリファイルの読み書きができます。

この章では，バイトストリーム入出力サービスルーチンの使い方について説明します。

15.1　バイトストリーム入出力サービスルーチンの概要

バイトストリーム入出力サービスルーチンを使用すると，COBOLのレコード定義に依存しないで，Cプログラムなどで作成したバイナリファイルの読み書きができます。

15.1.1　バイトストリーム入出力サービスルーチンの一覧

バイトストリーム入出力サービスルーチンの一覧を，次に示します。

表15‒1　バイトストリーム入出力サービスルーチンの一覧

サービスルーチンの名称

機能

CBLSTMCLOSE

バイトストリーム処理用に開かれたファイルを閉じる。

CBLSTMCREATE

バイトストリーム処理用の新しいファイルを作成する。

CBLSTMOPEN

バイトストリーム処理用に既存のファイルを開く。

CBLSTMREAD

ファイルからバイト列を読み込む。

CBLSTMWRITE

ファイルへバイト列を書き出す。

15.1.2　バイトストリーム入出力サービスルーチンを使用するときの注意事項

バイトストリーム入出力サービスルーチンが正常終了したかどうかは，RETURN-CODE特殊レジスタを参照して確認してください。

バイトストリーム入出力サービスルーチンは，COBOLプログラムだけから呼び出せます。COBOL以外のプログラムから呼び出されたときの動作は保証しません。

引数を誤って指定したり，省略したりしたときの動作は保証しません。

初期化属性プログラムが呼び出された場合，バイトストリームファイルの状態は初期化されません。また，CANCEL文を実行しても，バイトストリームファイルの状態は取り消されません。

バイトストリーム入出力サービスルーチンは，ラージファイル（ファイルサイズが2GB以上のファイル）を取り扱えません。バイトストリーム入出力サービスルーチンで取り扱うことができる最大ファイルサイズは，2,147,483,135バイト以内です。これを超えたサイズのファイルを読み書きした場合，結果は保証しません。

バイトストリーム入出力サービスルーチンは，COBOLファイル入出力機能およびCOBOL入出力サービスルーチン※で作成した順固定長ファイルを読み書きできます。順可変長ファイルまたは順編成ファイル以外のファイル編成で作成されたファイルに対する読み書きはできません。

注※

COBOL入出力サービスルーチンとは，COBOLで作成した順ファイル，および相対ファイルにアクセスできるCBLOPENなどのサービスルーチンであり，バイトストリーム入出力サービスルーチンではありません。COBOL入出力サービスルーチンの詳細は，「13.　COBOL入出力サービスルーチン」を参照してください。

バイトストリーム入出力サービスルーチンを使用して，固定長レコードの繰り返しとして作成したファイルは，COBOLファイル入出力機能およびCOBOL入出力サービスルーチンで，順固定長ファイルとして読み書きできます。ただし，ファイルの内容は，ユーザ側で保証してください。また，順可変長ファイルまたは順編成ファイル以外のファイル編成としては読み書きできません。

バイトストリーム入出力サービスルーチンは，マルチスレッド環境下では実行できません。

バイトストリーム入出力サービスルーチンの排他モード指定は，複数の実行単位（プロセス）でファイルを共用する場合の動作を指定します。

バイトストリーム入出力サービスルーチン呼び出し時にエラーが発生したときは，COBOL実行時メッセージを出力し，RETURN-CODE特殊レジスタにエラーの要因別の値を設定します。出力される実行時メッセージについては，マニュアル「COBOL2002　メッセージ」を参照してください。

RETURN-CODE特殊レジスタに返す値

0：処理が正常終了した。

負の値：引数の指定に誤りがある。

正の値：上記以外で処理中にエラーが発生した。

表15‒2　RETURN-CODE特殊レジスタに返す値とその内容

値

内容

0

処理が正常に終了した。

-1

OPENモードが1／2／3以外。

-2

排他モードが0／1／2／3以外。

-3

OPENモードが2のとき，排他モードが0または2でない。

-4

フラグが0／128以外（CBLSTMREADサービスルーチン），または0以外

（CBLSTMWRITEサービスルーチン）。

-5

相対位置に指定された値が最大値を超えている。

-6

読み書きするバイト数に指定された値が最大値を超えている。

-7

ファイル名の長さが最大値を超えている。

-8

ファイル名の指定がない。

-9

ファイルハンドルに指定された値が正しくない。

CBLSTMCREATEサービスルーチン，またはCBLSTMOPENサービスルーチンの場合，0でない。

CBLSTMREADサービスルーチン，CBLSTMWRITEサービスルーチン，またはCBLSTMCLOSEサービスルーチンの場合，CBLSTMCREATEサービスルーチン，またはCBLSTMOPENサービスルーチンで返される値ではない。

10

ファイルの終わりに達した。

30

ファイルの範囲を超えて読み込もうとした。

34

指定したファイルサイズが上限に達した。

35

ファイルが存在しないときCBLSTMOPENサービスルーチンを実行しようとした。

37

指定されたファイルではCBLSTMCREATEサービスルーチンまたはCBLSTMOPENサービスルーチンに書かれたモードは使用できない。

47

読み込み専用または読み込み／書き出しモードで開かれていないファイルに対してCBLSTMREADサービスルーチンを実行しようとした。

48

書き出しまたは読み込み／書き出しモードで開かれていないファイルに対してCBLSTMWRITEサービスルーチンを実行しようとした。

90

入出力エラーが発生した。

93

ファイルはすでに使用されている。

15.2　バイトストリーム入出力サービスルーチンの説明

15.2.1　CBLSTMCLOSE

バイトストリーム処理用に開いたファイルを閉じます。

形式

CALL 'CBLSTMCLOSE' USING  引数1

規則

Windows(x86) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを4バイトの符号なし2進項目（COMP-X）で指定します。

Windows(x64) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを8バイトの符号なし2進項目（COMP-X）で指定します。

STOP RUN文，またはCOBOL主プログラム中のGOBACK文が実行されるときに開いているバイトストリームファイルがあれば自動的に閉じられます。

ファイルが正常に閉じられた場合，引数1には0を返します。

15.2.2　CBLSTMCREATE

バイトストリーム処理用の新しいファイルを作成します。

形式

CALL 'CBLSTMCREATE' USING  引数1 引数2 引数3 引数4 引数5

規則

引数1には，作成するファイル名を英数字項目で指定します。領域の長さはファイル名の長さ＋1バイト以上が必要で，ファイル名は空白（X'20'），またはNULL文字（X'00'）で止める必要があります。

引数2には，OPENモードを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

1：読み込み専用

2：書き出し専用（排他モードに0または2を指定する必要がある）

3：読み込み／書き出し

引数3には，排他モードを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

0，2：読み込み／書き出しを禁止

1：書き出しを禁止

3：読み込み／書き出しを禁止しない

引数4には，1バイトの符号なし2進項目（COMP-X）の予備領域で，0を指定します。

Windows(x86) COBOL2002の場合，引数5には，開いたファイルハンドルを受け取る領域を4バイトの符号なし2進項目（COMP-X）で指定します。CBLSTMCREATEサービスルーチン呼び出し時，引数5の値は0でなければなりません。

Windows(x64) COBOL2002の場合，引数5には，開いたファイルハンドルを受け取る領域を8バイトの符号なし2進項目（COMP-X）で指定します。CBLSTMCREATEサービスルーチン呼び出し時，引数5の値は0でなければなりません。

注意事項

ファイルハンドルを受け取る領域の値は，そのファイルを閉じるまで必要です。この値を更新した場合の動作は保証しません。

空白を含むファイル名は指定できません。指定できるファイル名の最大長は255バイトです。

15.2.3　CBLSTMOPEN

バイトストリーム処理用に既存のファイルを開きます。

形式

CALL 'CBLSTMOPEN' USING  引数1 引数2 引数3 引数4 引数5

規則

引数1には，開くファイル名を英数字項目で指定します。領域の長さはファイル名の長さ＋1バイト以上必要で，ファイル名は空白（X'20'）またはNULL文字（X'00'）で止める必要があります。

引数2には，OPENモードを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

1：読み込み専用

2：書き出し専用（排他モードに0または2を指定する）

3：読み込み／書き出し

引数3には，排他モードを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

0，2：読み込み／書き出しを禁止

1：書き出しを禁止

3：読み込み／書き出しを禁止しない

引数4には，1バイトの符号なし2進項目（COMP-X）の予備領域で，0を指定します。

Windows(x86) COBOL2002の場合，引数5には，開いたファイルハンドルを受け取る領域を4バイトの符号なし2進項目（COMP-X）で指定します。CBLSTMOPENサービスルーチン呼び出し時，引数5の値は0でなければなりません。

Windows(x64) COBOL2002の場合，引数5には，開いたファイルハンドルを受け取る領域を8バイトの符号なし2進項目（COMP-X）で指定します。CBLSTMOPENサービスルーチン呼び出し時，引数5の値は0でなければなりません。

注意事項

ファイルハンドルを受け取る領域の値は，そのファイルを閉じるまで必要です。この値を更新した場合の動作は保証しません。

空白を含むファイル名は指定できません。指定できるファイル名の最大長は255バイトです。

15.2.4　CBLSTMREAD

ファイルからバイト列を読み込みます。

形式

CALL 'CBLSTMREAD' USING 引数1 引数2 引数3 引数4 引数5

規則

Windows(x86) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを4バイトの符号なし2進項目（COMP-X）で指定します。

Windows(x64) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを8バイトの符号なし2進項目（COMP-X）で指定します。

引数2には，読み込む位置を8バイトの符号なし2進項目（COMP-X）で指定します。この値はファイルの先頭を0とした相対位置です。指定できる最大値は2,147,483,135です。ただし，引数4の値が128のときは，この領域に現在のファイルサイズが返されます。

引数3には，読み込むバイト数を4バイトの符号なし2進項目（COMP-X）で指定します。指定できる最大値は65,535です。0を指定した場合は読み込まれません。

引数4には，パラメタを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

0：標準の読み込み用。

128：現在のファイルサイズを引数2に指定した領域に返す。このとき，バイト列は読み込まれない。

引数5には，バイト列が読み込まれるバッファを英数字項目で指定します。バッファのサイズは読み込まれるバイト列の格納に十分な大きさを確保しておく必要があります。

注意事項

引数5に指定したバッファのうち，引数3で指定した読み込むバイト数を超える領域は，バイトストリーム入出力サービスルーチンでは更新されません。

15.2.5　CBLSTMWRITE

ファイルへバイト列を書き出します。

形式

CALL 'CBLSTMWRITE' USING 引数1 引数2 引数3 引数4 引数5

規則

Windows(x86) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを4バイトの符号なし2進項目（COMP-X）で指定します。

Windows(x64) COBOL2002の場合，引数1には，ファイルを開いたときに返されたファイルハンドルを8バイトの符号なし2進項目（COMP-X）で指定します。

引数2には，書き出すファイル内の位置を8バイトの符号なし2進項目（COMP-X）で指定します。この値はファイルの先頭を0とした相対位置です。指定できる最大値は2,147,483,135です。

引数3には，書き出すバイト数を4バイトの符号なし2進項目（COMP-X）で指定します。指定できる最大値は65,535です。0を指定した場合は書き出されません。

引数4には，パラメタを1バイトの符号なし2進項目（COMP-X）で指定します。指定する値は次のとおりです。

0：標準の書き出し用

引数5には，書き出すバイト列を格納したバッファを英数字項目で指定します。

15.3　使用例

バイトストリーム入出力サービスルーチンの使用例を次に示します。

Windows(x86) COBOL2002の場合

  IDENTIFICATION DIVISION.
  PROGRAM-ID. SAMPLE1.
    ：
  DATA　DIVISION.
  WORKING-STORAGE SECTION.
    01 FILE-NAME      PIC X(255)      VALUE 'C:¥sample¥file.dat'.
    01 RSV            PIC X     COMP-X VALUE 0.
    01 PARM           PIC X     COMP-X VALUE 0.
    01 OPEN-MODE      PIC X     COMP-X VALUE 2.
    01 EXCLUSION-MODE PIC X     COMP-X VALUE 0.
    01 HANDLE         PIC X(4)  COMP-X VALUE 0.
    01 DATA-START     PIC X(8)  COMP-X.
    01 DATA-LENGTH    PIC X(4)  COMP-X.
    01 BUF            PIC X(128)      VALUE ALL '*'.
        :
  PROCEDURE DIVISION.
 * バイトストリーム処理用のファイルを書き出しモードで開く
      CALL 'CBLSTMOPEN'
            USING FILE-NAME OPEN-MODE EXCLUSION-MODE RSV HANDLE.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.
        :
 * ファイルの先頭を0とする相対位置63(64バイト目)から
 * 128バイトの長さのデータを書き出す
      MOVE 63  TO DATA-START.
      MOVE 128 TO DATA-LENGTH.
      CALL 'CBLSTMWRITE'
            USING HANDLE DATA-START DATA-LENGTH PARM BUF.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.
        :
 * ファイルを閉じる
      CALL 'CBLSTMCLOSE' USING HANDLE.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.

      STOP RUN.

Windows(x64) COBOL2002の場合

  IDENTIFICATION DIVISION.
  PROGRAM-ID. SAMPLE1.
    ：
  DATA　DIVISION.
  WORKING-STORAGE SECTION.
    01 FILE-NAME      PIC X(255)      VALUE 'C:¥sample¥file.dat'.
    01 RSV            PIC X     COMP-X VALUE 0.
    01 PARM           PIC X     COMP-X VALUE 0.
    01 OPEN-MODE      PIC X     COMP-X VALUE 2.
    01 EXCLUSION-MODE PIC X     COMP-X VALUE 0.
    01 HANDLE         PIC X(8)  COMP-X VALUE 0.
    01 DATA-START     PIC X(8)  COMP-X.
    01 DATA-LENGTH    PIC X(4)  COMP-X.
    01 BUF            PIC X(128)      VALUE ALL '*'.
        :
  PROCEDURE DIVISION.
 * バイトストリーム処理用のファイルを書き出しモードで開く
      CALL 'CBLSTMOPEN'
            USING FILE-NAME OPEN-MODE EXCLUSION-MODE RSV HANDLE.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.
        :
 * ファイルの先頭を0とする相対位置63(64バイト目)から
 * 128バイトの長さのデータを書き出す
      MOVE 63  TO DATA-START.
      MOVE 128 TO DATA-LENGTH.
      CALL 'CBLSTMWRITE'
            USING HANDLE DATA-START DATA-LENGTH PARM BUF.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.
        :
 * ファイルを閉じる
      CALL 'CBLSTMCLOSE' USING HANDLE.
      IF (RETURN-CODE NOT = 0) THEN
 * エラー処理
        :
      END-IF.

      STOP RUN.

第5編　COBOL実行単位と連絡

16　COBOLの実行単位

この章では，COBOLの実行単位について説明します。

16.1　実行単位の構成

16.1.1　実行単位とは

プログラムの実行時に，プログラムを構成する最も包括的な単位を実行単位といいます。実行単位は，一つの実行可能ファイル，または複数のお互いに連絡し合う実行可能ファイルやDLLから構成されている，一つの閉じた処理の単位です。

また，実行単位には，COBOL以外の言語で作成された実行可能ファイルやDLL（Cプログラムなど）を含むことができます。

16.1.2　実行可能ファイルやDLLとは

実行可能ファイルやDLLは，翻訳単位（原始プログラム）をコンパイルして生成した結果です。実行可能ファイルやDLLは，それに含まれる関数，メソッド，およびプログラムの翻訳結果である一つ以上のオブジェクトファイルから構成されています。

16.1.3　実行単位と実行モジュールの例

COBOL原始プログラム「SAMPLE1.cbl」「SAMPLE2.cbl」をコンパイルした場合に，生成されるCOBOLプログラムの実行単位，実行モジュール，およびプログラムを次に示します。

（原始プログラム：SAMPLE1.cbl）

（原始プログラム：SAMPLE2.cbl）

（生成されるプログラムの構成）

一つの実行可能ファイルで構成される場合

複数の実行可能ファイルやDLLで構成される場合

16.2　引数の受け取りと外部スイッチ

実行単位は，ほかの実行単位と共通のデータファイルや通信文を処理したり，外部スイッチを設定・参照したりできます。また，実行単位は，プログラムの実行時にコマンド行に指定した引数を受け取れます。

ここでは，実行単位で受け取るコマンド行の引数の形式と受け取り方法，および外部スイッチの設定・参照方法について説明します。

16.2.1　コマンド行に指定する引数の形式

コマンド行から受け取る引数の形式には，C言語インタフェースに従った形式と，VOS3インタフェースに従った形式の2種類があります。

(1)　C言語インタフェースに従った形式

C言語インタフェースに従った形式でコマンド行に指定した引数を受け取る場合，COBOLプログラムには，次の形式で引数が渡されます。

コマンド行

実行可能ファイル名△引数1△引数2△…

（凡例）

△：半角空白文字

COBOLプログラムに渡される引数の形式

（凡例）

△：半角空白文字

規則

C言語インタフェースに従った形式で引数を受け取るCOBOLプログラムは，コンパイル時に-Main,Systemオプションを指定する必要があります。

コマンド行に指定した実行可能ファイル名は，入力した文字列のまま取得されます。

なお，COBOLプログラムでC言語インタフェースに従った形式の引数を受け取るコーディング方法については，「16.2.2　引数の受け取り方法（C言語インタフェースに従った形式の場合）」を参照してください。

(2)　VOS3インタフェースに従った形式

VOS3インタフェースに従った形式でコマンド行に指定した引数を受け取る場合，COBOLプログラムには，次の形式で引数が渡されます。

コマンド行

実行可能ファイル名△引数

（凡例）

△：半角空白文字

COBOLプログラムに渡される引数の形式

規則

VOS3インタフェースに従った形式で引数を受け取るCOBOLプログラムは，コンパイル時に-Main,V3オプションを指定する必要があります。

なお，COBOLプログラムでVOS3インタフェースに従った形式の引数を受け取るコーディング方法については，「16.2.3　引数の受け取り方法（VOS3インタフェースに従った形式の場合）」を参照してください。

16.2.2　引数の受け取り方法（C言語インタフェースに従った形式の場合）

C言語インタフェースに従った形式でコマンド行に指定した引数を受け取る方法には，次の3種類があります。

アドレスデータ項目を使った引数の受け取り

サービスルーチンを使った引数の受け取り

ACCEPT／DISPLAY文を使った引数の受け取り

それぞれの受け取り方法について，次に示します。

(1)　アドレスデータ項目を使った引数の受け取り

コマンド行から渡された引数の形式を連絡節（LINKAGE SECTION）で定義して，直接COBOLプログラムから参照する方法です。なお，引数の値は，アドレスとして渡されるため，アドレスデータ項目で参照する必要があります。

アドレスデータ項目を使った引数の受け取りの例

                    :
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                    :
       DATA DIVISION.
       WORKING-STORAGE SECTION.              …1.
       01 CMDN-G ADDRESSED BY A-CMDN.
         02 CMDN PIC X(8).
       01 OPT1-G ADDRESSED BY A-OPT1.
         02 OPT1 PIC X(8).
       01 OPT2-G ADDRESSED BY A-OPT2.
         02 OPT2 PIC X(8).
                    :
       LINKAGE SECTION.                      …2.
       01 ARGC PIC 9(9) USAGE COMP.
       01 ARGV.
         02 ARGV1 USAGE ADDRESS.
         02 ARGV2 USAGE ADDRESS.
         02 ARGV3 USAGE ADDRESS.
                    :
       PROCEDURE DIVISION USING              …3.
                          BY VALUE     ARGC
                          BY REFERENCE ARGV.
           COMPUTE A-CMDN = ARGV1.
           COMPUTE A-OPT1 = ARGV2.
           COMPUTE A-OPT2 = ARGV3.
                    :

作業場所節（WORKING-STORAGE SECTION）で，アドレスデータ項目で参照するデータを定義します。

連絡節（LINKAGE SECTION）で，受け取る引数の形式を定義します。

アドレスデータ項目のアドレス参照を解決し，引数の値をCOBOLのデータ項目に格納します。

規則

COBOLプログラムのコンパイル時に，-Main,Systemオプションを指定する必要があります。

連絡節で定義した受け取る引数の個数と，実際にコマンド行に入力した実行可能ファイル名，および引数の個数が一致していなければなりません。

受け取った引数の終端には，NULL文字（X'00'）が付加されています。COBOLプログラム中で引数の長さなどを求める場合は，このNULL文字の分を考慮する必要があります。

最初の引数を受け取るデータ項目は，「PIC 9(9) USAGE COMP」で定義する必要があります。

(2)　サービスルーチンを使った引数の受け取り

CBLARGCサービスルーチンおよびCBLARGVサービスルーチンを呼び出して，引数を受け取る方法です。

CBLARGCサービスルーチンでコマンド行の引数の個数を取得し，引数の個数だけCBLARGVサービスルーチンを繰り返し呼び出すことで，すべてのコマンド行の引数を取得できます。

サービスルーチンを使った引数の受け取りの例

                    :
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARGC          PIC 9(9) USAGE COMP.  …1.
       01 ARGV.
         02 ARGV-LENGTH PIC 9(4) USAGE COMP.  …2.
         02 ARGV-AREA.                        …3.
           03 ARGV-AREA-C PIC X(1)
              OCCURS 1 TO 100 DEPENDING ON ARGV-LENGTH.
       77 CMD-NO        PIC 9(9) USAGE COMP.  …4.
                    :
       PROCEDURE DIVISION.
           CALL 'CBLARGC' USING BY REFERENCE ARGC.
           IF RETURN-CODE NOT = 0 THEN
             （CBLARGC異常時の処理）
           END-IF.
                    :
           MOVE 1 TO CMD-NO.
           PERFORM UNTIL ARGC = 0
             CALL 'CBLARGV' USING BY REFERENCE CMD-NO ARGV
             IF RETURN-CODE NOT = 0 THEN
              （CBLARGV異常時の処理）
             END-IF
            （CBLARGVで受け取った引数の処理）
             ADD 1 TO CMD-NO
             SUBTRACT 1 FROM ARGC
           END-PERFORM.
                    :

CBLARGCサービスルーチンで受け取る引数の個数の領域

CBLARGVサービスルーチンで受け取る引数の長さ

CBLARGVサービスルーチンで受け取る引数の文字列

CBLARGVサービスルーチンに引き渡す引数の順序

規則

COBOLプログラムのコンパイル時に，-Main,Systemオプションを指定する必要があります。

CBLARGCサービスルーチンで取得した値は，実行可能ファイル名と引数の個数の合計値となります。詳細については，「30.4.4　CBLARGC」を参照してください。

CBLARGVサービスルーチンで引数の文字列を受け取る領域は，100バイトで定義する必要があります。受け取ったコマンド行の引数が100バイト未満の場合，残りの領域は，空白文字で埋められます。また，受け取ったコマンド行の引数が100バイトを超える場合は，先頭から100バイトまでが有効となり，以降の文字列は切り捨てられます。詳細は，「30.4.5　CBLARGV」を参照してください。

(3)　ACCEPT／DISPLAY文を使った引数の受け取り

ACCEPT文やDISPLAY文を使って，コマンド行に指定された引数の個数や値を取得できます。詳細は，「10.3　コマンド行へのアクセス」を参照してください。

16.2.3　引数の受け取り方法（VOS3インタフェースに従った形式の場合）

VOS3インタフェースに従った形式でコマンド行に指定した引数を受け取る方法を，次に示します。

VOS3インタフェースに従った形式の場合の引数の受け取りの例

                    :
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       DATA DIVISION.
                    :
       LINKAGE SECTION.
       01 PARM-1.
         02 PLEN     PIC 9(4) USAGE COMP.  …1.
         02 PTAB OCCURS 10 TIMES.          …2.
           03 PTYPE  PIC X(3).
           03 PCOUNT PIC 9(3).
           03 PCOMMA PIC X(1).
       PROCEDURE DIVISION USING PARM-1.
           IF PLEN = 0 THEN
             （引数の指定がないときの処理）
           ELSE
             （引数の指定があるときの処理）
           END-IF.
                    :

受け取った引数の長さが格納されます。

受け取った引数の値が格納されます。

受け取った引数の長さがPTABの長さ未満の場合は，PLENに指定した長さ分のデータだけを保証します。また，受け取った値の長さがPLENに指定した長さを超える場合は，PTABの長さ分のデータだけを保証します。

規則

COBOLプログラムのコンパイル時に，-Main,V3オプションを指定する必要があります。

コマンド行中の実行可能ファイル名の後に指定した文字列だけが，引数として渡されます。引数が空白文字を含む場合は，引用符（"）で囲む必要があります。

受け取る引数の長さは100バイト以内でなければなりません。100バイトを超える文字列を指定した場合，先頭から100バイトまでが有効となります。

16.2.4　外部スイッチ

外部スイッチを使うと，プログラムの実行中に外部（別の実行単位）からプログラムを制御できます。ここでは，外部スイッチの使い方や値の設定方法について説明します。

(1)　外部スイッチとは

COBOL2002では，外部からの制御情報を受け取るための0と1から構成される8けたの領域があります。この領域の各けたは，プログラムの特殊名段落で記述する外部スイッチ名（UPSI-0，UPSI-1，……，UPSI-7）に対応します。外部スイッチ名と領域上の位置との関係を次に示します。"1"になっている個所がそれぞれの外部スイッチに対応します。

表16‒1　外部スイッチと位置との関係

外部スイッチ名

対応する位置

UPSI-0

10000000

UPSI-1

01000000

UPSI-2

00100000

UPSI-3

00010000

UPSI-4

00001000

UPSI-5

00000100

UPSI-6

00000010

UPSI-7

00000001

(2)　外部スイッチの設定方法

外部スイッチの状態の値は，環境変数CBLUPSIで設定します。ここでは，値の設定方法について説明します。

(a)　環境変数による外部スイッチの初期化

外部スイッチの状態の値は，プログラムの実行中に初めてスイッチ状態条件を参照したとき，環境変数CBLUPSIに指定された値の内容で初期化されます。

環境変数CBLUPSIの設定形式と規則を次に示します。

形式

CBLUPSI=文字列

規則

文字列は，8けたの0または1で設定します。8けたの文字列は，左から順にUPSI-0，UPSI-1，……，UPSI-7に対応します。

指定した文字列が8けたを超える場合は，8けたを超える部分が無視され，8けたに満たない場合は，文字列の後ろに0が仮定されます。また，0と1以外の文字を指定した場合，プログラムが異常終了します。

この環境変数を設定していない場合，すべての外部スイッチに0が仮定されます。

環境変数CBLUPSIは，COBOL実行単位中で初めて外部スイッチの参照／更新をしたときに，1回だけ参照されます。

(b)　SET文による外部スイッチの変更

SET文を使うと，プログラムの実行中に外部スイッチの状態を変更できます。ただし，SET文で変更した外部スイッチの状態は，現在実行中の実行環境だけで有効であり，環境変数CBLUPSIの値には反映されません。

(3)　外部スイッチの参照方法

プログラムで外部スイッチを参照するには，特殊名段落で外部スイッチの機能名が参照する外部スイッチのオン状態（on status）やオフ状態（off status）を，条件名に関連づけます。外部スイッチのスイッチ状態は，この条件名を使って調べられます。

外部スイッチの値を変更してプログラムの処理の流れを変更する例を示します。

（例）

次のCOBOLプログラムに対して外部スイッチの値を変更します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                    :
       ENVIRONMENT DIVISION.
                    :
        CONFIGURATION SECTION.
        SPECIAL-NAMES.
            UPSI-0 IS SW0
                   ON STATUS IS ONIND0
                   OFF STATUS IS OFFIND0
            UPSI-3 IS SW3
                   ON STATUS IS ONIND3
                   OFF STATUS IS OFFIND3
                    :
            UPSI-5 OFF STATUS IS OFFS5.
                    :
        INPUT-OUTPUT SECTION.
                    :
       PROCEDURE DIVISION.
                    :
           IF ONIND0 GO TO A   …1.
           ELSE      GO TO B.
                    :
           IF ONIND3 GO TO C   …2.
           ELSE      GO TO D.
                    :
           IF OFFS5  GO TO A   …3.
           ELSE      GO TO C.
                    :
       A.
                    :
       B.
                    :
       C.
                    :
       D.
                    :

環境変数を"CBLUPSI=10010100"と設定すると，おのおのの外部スイッチの状態は次のようになります。

外部スイッチ名

外部スイッチの状態

UPSI-0

1（オン）

UPSI-1

0（オフ）

UPSI-2

0（オフ）

UPSI-3

1（オン）

UPSI-4

0（オフ）

UPSI-5

1（オン）

UPSI-6

0（オフ）

UPSI-7

0（オフ）

外部スイッチの状態が変更されたため，プログラムの1.，2.，3.の制御は次のようになります。

UPSI-0がオン状態なので制御は手続きAに移ります。

UPSI-3がオン状態なので制御は手続きCに移ります。

UPSI-5がオン状態なので制御は手続きCに移ります。

16.3　COBOLプログラムのモード

実行単位中のCOBOLプログラムは，CUIモード／GUIモードのどちらかで実行されます。

16.3.1　CUIモード

CUIモードでは，ACCEPT／DISPLAY文での入出力先や実行時メッセージの出力先が，OSの標準入出力（stdin，stdout，stderr）となります。CUIモードでのCOBOLプログラムの実行例を，次に示します。

（実行するプログラム）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST1.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT TXT-FILE ASSIGN TO FILE-NAME
                       ORGANIZATION IS LINE SEQUENTIAL.
       SELECT DMY-FILE ASSIGN TO SYS001
                       ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD TXT-FILE.
       01 TXT-REC PIC X(40).
       FD DMY-FILE.
       01 DMY-REC PIC X(40).
       WORKING-STORAGE SECTION.
       01 FILE-NAME PIC X(40).

       PROCEDURE DIVISION.
           DISPLAY '--- プログラムのテストを開始します ---'. …1.
           DISPLAY '--- ファイル名を入力してください   ---'. …1.
           ACCEPT FILE-NAME.                                 …2.

           OPEN  OUTPUT TXT-FILE.
           WRITE TXT-REC.
           CLOSE TXT-FILE.

           OPEN  INPUT DMY-FILE.                             …3.
           READ  DMY-FILE.
           CLOSE DMY-FILE.

           EXIT PROGRAM.

       END PROGRAM TEST1.

（実行画面）

D:¥>test1.exe
--- プログラムのテストを開始します ---                 …1.
--- ファイル名を入力してください   ---                 …1.
test1_outfile.txt                                      …2.
KCCC3517R-S                                            …3.
CBL_外部装置名で示される環境変数が指定されていません。
プログラム名＝TEST1
行番号／欄＝000029/12
環境変数名＝CBL_SYS001

D:¥>

DISPLAY文によるメッセージの出力です。標準出力に出力されます。

ACCEPT文によるファイル名の入力です。標準入力から入力します。

ファイルに対応する環境変数未設定による実行時メッセージです。実行時メッセージは，標準エラー出力に出力されます。

16.3.2　GUIモード

GUIモードでは，ACCEPT／DISPLAY文での入出力先や実行時メッセージの出力先が，COBOL2002が出力するコンソールウィンドウとなります。GUIモードでのCOBOLプログラムの実行例を，次に示します。

（実行するプログラム）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST1.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT TXT-FILE ASSIGN TO FILE-NAME
                       ORGANIZATION IS LINE SEQUENTIAL.
       SELECT DMY-FILE ASSIGN TO SYS001
                       ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD TXT-FILE.
       01 TXT-REC PIC X(40).
       FD DMY-FILE.
       01 DMY-REC PIC X(40).
       WORKING-STORAGE SECTION.
       01 FILE-NAME PIC X(40).

       PROCEDURE DIVISION.
           DISPLAY '--- プログラムのテストを開始します ---'. …1.
           DISPLAY '--- ファイル名を入力してください   ---'. …1.
           ACCEPT FILE-NAME.                                 …2.

           OPEN OUTPUT TXT-FILE.
           WRITE TXT-REC.
           CLOSE TXT-FILE.

           OPEN INPUT DMY-FILE.                              …3.
           READ DMY-FILE.
           CLOSE DMY-FILE.

           EXIT PROGRAM.

       END PROGRAM TEST1.

（実行画面）

DISPLAY文によるメッセージの出力です。コンソールウィンドウに出力されます。

ACCEPT文によるファイル名の入力です。入力用のダイアログボックスから入力します。ダイアログボックスに入力した値は，DISPLAY文の出力結果と同様に，コンソールウィンドウに出力されます。

ファイルに対応する環境変数未設定による実行時メッセージです。実行時メッセージも，コンソールウィンドウに出力されます。

コンソールウィンドウ

GUIモードでプログラムを実行する場合，次のようなときにCOBOLコンソールウィンドウが出力されます。

実行単位で最初のDISPLAY文が実行された。このとき，環境変数CBL_SYSOUTまたはCBL_SYSPUNCHでファイルが割り当てられていない。

実行単位で最初のACCEPT文が実行された。このとき，環境変数CBL_SYSINまたはCBL_SYSSTDでファイルが割り当てられていない。

実行時エラーが発生した。このとき，環境変数CBL_SYSERRでファイルが割り当てられていない。

COBOLコンソールウィンドウのステータスバーには，プログラムの実行状態が次のように表示されます。

COBOLプログラムが実行中の場合：「実行中です」

STOP RUN文が実行された場合：「実行が終了しました」

実行時エラーが発生した場合：「実行時エラーが発生しました」

コンソールウィンドウからプログラムを終了する方法を，次に示します。

ステータスバーに「実行が終了しました」または「実行時エラーが発生しました」の表示があるとき

コンソールウィンドウのシステムメニューから［閉じる］を選ぶとプロセスが終了します。

ステータスバーに「実行中です」の表示があるとき

コンソールウィンドウのシステムメニューから［閉じる］を選ぶと，次のメッセージボックスが出力されます。ここで［OK］ボタンを選ぶとプロセスが終了します。

16.3.3　モードの決定方法

COBOLプログラムをGUIモード，CUIモードのどちらで実行するかは，アプリケーションの主プログラムがCOBOLプログラムの場合と，他言語のプログラムの場合とで，次のように指定方法が異なります。

(1)　アプリケーションの主プログラムがCOBOLプログラムの場合

アプリケーションの主プログラムがCOBOLプログラムの場合は，アプリケーションの主プログラムのコンパイル時にコンパイラオプションを指定することで，GUIモード，CUIモードのどちらで実行するかを選択できます。

形式

ccbl2002 ｛-Lib,GUI｜-Lib,CUI｝ ソースファイル名

-Lib,GUI

COBOLプログラムを，GUIモードで実行したい場合に指定します。

-Lib,CUI

COBOLプログラムを，CUIモードで実行したい場合に指定します。

-Lib,GUI，-Lib,CUIオプションのどちらも指定しなかった場合は，-Lib,GUIオプションが仮定されます。また，両方指定した場合は，後に指定したオプションが有効となります。

(2)　アプリケーションの主プログラムが他言語のプログラムの場合

他言語の主プログラムからCOBOLで作成した副プログラムを呼び出すと，COBOLプログラムは，CUIモードで実行されます。

COBOLプログラムをGUIモードで実行したい場合は，COBOLプログラムを呼び出す前に，他言語の主プログラムからCBLGINTサービスルーチンを呼び出してください。

他言語のプログラムから，CBLGINTサービスルーチンを使ってCOBOLプログラムをGUIモードで実行する方法を，次に示します。なお，CBLGINTサービスルーチンの規則については，「30.4.1　CBLGINT」を参照してください。

(a)　Cプログラムからの呼び出し例

#include <windows.h>

  extern int WINAPI CBLGINT();  /*CBLGINTの外部参照宣言*/

  CBLGINT();                    /*CBLGINTの呼び出し*/

  （COBOLプログラムの呼び出し）

(b)　Visual Basicからの呼び出し例

 関数宣言
 Private Declare Sub CBLGINT Lib "CBL85RT.DLL"
         Alias "_CBLGINT@0" ()

 手続き
 Private Sub Command1_Click()
   Call CBLGINT
         :
  （COBOLプログラムの呼び出し）
         :
 End Sub

注

関数宣言でのエイリアスの名称については，次のとおり指定する必要があります。

Private Declare Sub CBLGINT Lib "CBL85RT.DLL"
                            Alias "_CBLGINT@0" ()

16.4　COBOL実行単位の終了

明示的または暗黙的にSTOP RUN文が実行されると，COBOL実行単位は終了します。このとき，実行単位で使用したCOBOLの資源の解放処理※が実行されます。

注※

閉じられていないファイルのクローズ，仮想メモリの解放，カバレージ機能のカウント情報の蓄積などの処理です。

なお，暗黙的にSTOP RUN文が実行されるのは，次の場合です。

-Mainオプションが指定されたプログラムにSTOP RUN文，GOBACK文のどちらも書かれていない場合で，プログラムの処理が最外側のプログラムの末尾に到達したとき

実行中のプロセス内で，最初に呼ばれたCOBOLプログラムでGOBACK文が実行された場合

GUIモードの場合の終了方法

COBOLプログラムをGUIモードで実行していた場合は，COBOL2002が出力するコンソールウィンドウのステータスバーに，「実行が終了しました」というメッセージが表示されます。この状態で，コンソールウィンドウのシステムメニューから［閉じる］を選ぶと，コンソールウィンドウが閉じ，実行単位が終了します。

また，環境変数CBL_BATCHを使用すると，自動的にコンソールウィンドウを閉じて実行単位を終了できます。詳細は，「36.2.3　一般」の「(12)　CBL_BATCH」を参照してください。

なお，コンソールウィンドウが表示されていない場合は，何も出力しないでそのまま実行単位が終了します。

CUIモードの場合，およびコンソールウィンドウが出力されていない場合の終了方法

COBOLプログラムをCUIモードで実行していた場合，およびコンソールウィンドウが出力されていない場合は，実行の終了を示すメッセージを何も出力しないで，そのまま実行単位が終了します。

16.4.1　実行単位の終了方法

実行単位の終了方法には，次の三つがあります。

STOP RUN文によって終了する方法

実行単位中で最初に呼ばれたCOBOLプログラムのGOBACK文で終了する方法

CBLENDサービスルーチンを呼び出して終了する方法

(1)　STOP RUN文による終了

COBOLプログラムでSTOP RUN文を実行すると，COBOLの実行環境が終了します。

プログラムが終了すると，閉じられていないファイルが閉じられるとともに，実行時に確保した仮想メモリが解放され，プロセスが終了します。

STOP RUN文による終了の例を次に示します。

図16‒1　STOP RUN文による終了の例

(2)　GOBACK文による終了

実行単位内で最初に呼び出されたCOBOLプログラムでGOBACK文を実行すると，COBOLの実行環境が終了します。

プログラムが終了すると，閉じられていないファイルが閉じられるとともに，実行時に確保した仮想メモリが解放され，プロセスが終了します。

GOBACK文による終了の例を次に示します。

図16‒2　GOBACK文による終了の例

(3)　CBLENDサービスルーチンによる終了

COBOL副プログラムから他言語の主プログラムへ戻る場合，閉じられていないファイルのクローズ処理や，実行時に確保した仮想メモリの解放が実行されません。これらのCOBOL資源を解放するには，CBLENDサービスルーチンを呼び出す必要があります。

CBLENDサービスルーチンは，COBOLプログラムから呼び出すのではなく，他言語のプログラムから呼び出します。CプログラムからCBLENDサービスルーチンを呼び出す形式を，次に示します。

形式

#include <windows.h>

extern int WINAPI CBLEND(); /* CBLENDの外部参照宣言 */

CBLEND();                   /* CBLENDの呼び出し     */

CBLENDサービスルーチンの詳細は，「30.4.2　CBLEND」を参照してください。

(4)　注意事項

COBOL以外のプログラムでexit関数やExitProcess関数などを発行してプロセスを終了した場合，COBOL2002は実行環境の終了処理をしないで，OSの終了処理に任せます。

COBOLプログラムの呼び出し元が制御プログラムでない場合，呼び出し元のプログラムでは，COBOL実行環境を終了させるためにCBLENDサービスルーチンを呼び出さなければなりません。CBLENDサービスルーチンを呼び出さないでほかのCOBOLプログラムを呼び出した場合，結果は保証しません。

16.4.2　実行単位の終了コード

COBOLの実行単位が終了するときに返す終了コードについて説明します。

COBOLプログラムから終了コードを返すには，RETURN-CODE特殊レジスタを使用します。また，プログラムが異常終了した場合は，COBOL2002によって終了コードが設定される場合があります。

(1)　RETURN-CODE特殊レジスタを使用する方法

呼び出し元の制御プログラムに終了コードを返すには，プログラムが終了する前にRETURN-CODE特殊レジスタに値を設定します。

指定例

       MOVE 0 TO RETURN-CODE.

規則

RETURN-CODE特殊レジスタに設定できる値の範囲は，S9(9)の項目に設定できる値の範囲です。ただし，VOS3 COBOL85との動作と互換性を保つ必要がある場合は，0〜4,095の範囲で設定してください。

終了コードの値は，プログラム終了時にRETURN-CODE特殊レジスタに設定されている値になります。ただし，COBOLプログラム中でRETURN-CODE特殊レジスタに値を設定した後，RETURNING指定のないCALL文を実行した場合は，呼び出し先プログラムの戻り値が終了コードとなります。

RETURN-CODE特殊レジスタに値を設定しないで，COBOLプログラムが正常終了した場合は，終了コードとして0が返されます。ただし，COBOLプログラムから他言語のプログラムを呼び出している場合，呼び出し先プログラムの戻り値※が終了コードに設定されます。

注※

void型のC言語プログラムを最後に呼び出すと，終了コードの値が不定となることがあります。

(2)　プログラムが異常終了した場合の終了コード

プログラムが異常終了した場合，COBOL2002が終了コードを設定する場合があります。

COBOL実行時エラーが発生した場合

終了コードには1が設定されます。

CBLABNサービスルーチンが実行された場合

環境変数CBLABNCODEにYESが指定されている場合は，終了コードにはCBLABNサービスルーチンの引数が設定されます。

環境変数CBLABNCODEにYES以外が指定されている場合は，終了コードには1が設定されます。

上記以外のエラーが発生した場合

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，または-DebugRangeオプション指定ありのCOBOLプログラムのとき

終了コードには，1が設定されます。

ただし，環境変数CBLEXCEPT=THROWを指定したときは，システムが返す値が設定されます。

上記のコンパイラオプション指定なしのCOBOLプログラムのとき

終了コードにはシステムが返す値が設定されます。

(3)　注意事項

COBOLプログラムが上位プロセスから起動される場合や，プログラム内でソフトウェアやハードウェアによって検出されて発生した例外を処理するプログラムがある場合，プログラムの終了コードは，それぞれ上位プロセス，および例外処理プログラムの戻り値となるため，（1）（2）の規則は適用されません。次に，（1）（2）の規則が適用されない例を示します。

テストデバッガのコマンド起動で，COBOLプログラムを実行した場合

（例）cbltd2k -Execute sample.exe

Windows エラー報告（WER）でエラー情報を診断した場合

17　プログラム間の引数と返却項目

プログラム間，およびメソッド呼び起こしの情報の受け渡しの方法には，CALL文およびINVOKE文のUSING指定（引数）による方法とRETURNING指定（返却項目）による方法があります。また，RETURN-CODE特殊レジスタを使用すると，呼び出し元プログラムに対して復帰コードを返却することもできます。

この章では，引数，返却項目，および復帰コードを使用したプログラム間の情報の受け渡し方法について説明します。

17.1　引数の受け渡し

17.1.1　引数の受け渡しの種類

プログラム間で引数を受け渡す場合は，CALL文のUSING指定を，メソッドを呼び起こす場合は，INVOKE文のUSING指定を，それぞれ使用します。

引数の受け渡しの種類

引数の受け渡しには，次の3種類があります。受け渡しの種類の指定を省略した場合は，BY REFERENCEが仮定されます。

引数の受け渡しの種類

データの渡し方

仮引数の更新

BY REFERENCE

参照渡し

実引数に反映される。

BY CONTENT

内容渡し

実引数に反映されない。

BY VALUE

値渡し

実引数に反映されない。

それぞれの受け渡し方法の違いについて，次に説明します。

参照渡し（BY REFERENCE指定）

呼び出し元プログラムのデータ項目を直接参照するアドレスを，呼び出し先プログラムに渡します。呼び出し先プログラムでデータ項目の値を変更すると，呼び出し元プログラムのデータ項目にも反映されます。

内容渡し（BY CONTENT指定）

呼び出し元プログラムのデータ項目の内容を一時領域に転記し，転記後のデータ項目を参照するアドレスを呼び出し先プログラムに渡します。呼び出し先プログラムでデータ項目の値を変更しても，呼び出し元プログラムのデータ項目には影響しません。

値渡し（BY VALUE指定）

呼び出し元プログラムのデータ項目の値を，呼び出し先プログラムに渡します。呼び出し先プログラムでデータ項目の値を変更しても，呼び出し元プログラムのデータ項目には影響しません。

引数を値渡しする場合は，呼び出し元プログラムのデータ項目と呼び出し先プログラムのデータ項目での型の対応に注意する必要があります。

17.1.2　使用例

CALL文のUSING指定による引数の受け渡しの例を次に示します。

呼び出し元プログラム（MAIN1）

CALL 'SAMPLE1'
     USING ｛BY REFERENCE｜BY CONTENT｜BY VALUE｝ A1 B1 C1.

呼び出し先プログラム（SAMPLE1）

PROCEDURE DIVISION
     USING ｛BY REFERENCE｜BY VALUE｝ A2 B2 C2.

プログラムMAIN1のA1，B1，C1がプログラムSAMPLE1に渡すデータ項目です。また，プログラムSAMPLE1のA2，B2，C2がプログラムMAIN1から渡された情報を受け取るデータ項目です。データ項目A1，B1，C1はそれぞれデータ項目A2，B2，C2に対応します。

17.1.3　引数の受け渡しの規則

引数の受け渡しの規則について，説明します。

(1)　CALL文での引数の整合性チェック

プログラムのコンパイル時に引数の適合チェックのオプション（-DebugCompati，または-TDInf）を指定すると，CALL文でのプログラム間の引数の整合性をチェックできます。ただし，INVOKE文では有効となりません。

引数の整合性チェックについては，「37.4　プログラム間整合性チェック」を参照してください。

(2)　CALL文での定数指定の引数

値渡し（BY VALUE指定）のCALL文では，引数に定数を指定できます。

数字定数，およびZEROは4バイトの2進形式として設定されます。

浮動小数点数字定数は，倍精度浮動小数点形式として設定されます。

Windows(x86) COBOL2002の場合，NULLはポインタ（4バイト2進形式）として設定されます。

Windows(x64) COBOL2002の場合，NULLはポインタ（8バイト2進形式）として設定されます。

COBOLプログラム間で定数の引数を渡す場合の型の対応について，次に示します。

表17‒1　COBOLプログラム間でのデータ項目の型の対応

受け取り側作用対象

送り出し側作用対象

呼び出し元に指定された定数

数字定数

英数字定数

浮動小数点数字定数

ZERO

NULL

固定長集団項目

×

×

×

英字項目

○

×

英数字項目

○

×

英数字編集項目

×

外部10進項目

○

×

内部10進項目

×

2進項目

○

×

○

数字編集項目

×

指標データ項目

×※

×

×※

○

オブジェクト参照

×※

×

×※

外部浮動小数点数字項目

×

単精度内部浮動小数点数字項目

×

×

×

×

×

倍精度内部浮動小数点数字項目

×

×

○

×

×

アドレスデータ項目

×※

×

×※

○

日本語項目

×

日本語編集項目

×

外部ブール項目

×

内部ブール項目

×

ポインタ項目

×※

×

×※

○

（凡例）

○：指定できる

空白：受け渡しできるかどうかはプラットフォームに依存するため，動作保証についてはユーザ責任とする

×：指定してはならない（指定したときの結果は保証しない）

注※

Windows(x86) COBOL2002の場合は「空白」になります。

(3)　INVOKE文での定数指定の引数

値渡し（BY VALUE指定）のINVOKE文では，引数に定数を指定できます。

INVOKE文に指定された実引数と呼び起こされるメソッドの仮引数は，適合していなければなりません。双方が適合している場合，実引数のデータ属性は，仮引数に指定されたデータ属性と同様になります。

(4)　INVOKE文でBY指定を省略した場合

INVOKE文でBY指定を省略した場合，指定された引数の属性，および呼び出し先メソッドに定義された引数の情報によって，仮定されるBY指定が異なります。INVOKE文でBY指定を省略した場合に仮定されるBY指定の内容について，次に示します。

INVOKE文にクラス名を指定した場合，または指定した一意名のデータ項目が普遍的オブジェクト参照でない場合は，次の表に示すBY指定が仮定されます。

表17‒2　INVOKE文でBY指定を省略した場合に仮定されるBY指定の属性

INVOKE文でBY指定を省略した引数の種別

呼ばれるメソッド定義の引数のBY指定

REFERENCE

VALUE

ADDRESS OF 一意名

REFERENCE

REFERENCE

ファクトリ定義，オブジェクト定義

CONTENT

VALUE

プログラム定義

関数定義

メソッド定義

ファイル節※

作業場所節※

局所場所節

連絡節

通信節※

REFERENCE

VALUE

画面節（WINDOW SECTION）※

サブスキーマ節※

CONTENT

VALUE

注※

メソッド定義には指定できません。

INVOKE文に指定した一意名のデータ項目が普遍的オブジェクト参照の場合，BY REFERENCEが仮定されます。

17.2　復帰コードと返却項目

呼び出し先のプログラムやメソッドが呼び出し元プログラムに値を返すには，RETURN-CODE特殊レジスタ（復帰コード）を使用する方法と，RETURNING指定（返却項目）を使用する方法があります。復帰コードや返却項目は，COBOLプログラムからCOBOLプログラムやC言語のプログラムを呼び出し，呼び出し先プログラムで設定した返却項目を受け取るときに指定します。

規則

COBOLプログラム間で値を返す場合の規則を，次に示します。

呼び出し元プログラム

呼び出し先プログラム／メソッド

PROCEDURE DIVISIONの指定

RETURNING指定あり

RETURNING指定なし※

CALL文または

INVOKE文の指定

RETURNING指定あり

○

×

RETURNING指定なし※

×

○

（凡例）

○：返却項目を正しく受け渡せる

×：返却項目を正しく受け渡せない

注※

RETURNING指定がない場合は，RETURN-CODE特殊レジスタを使用して返却項目を参照または設定します。

CALL文またはINVOKE文のRETURNING指定のデータ項目と，呼び出し先プログラムまたはメソッドの手続き部見出しのRETURNING指定のデータ項目の長さ，および用途は同じでなければなりません。

同じ最外側のプログラムを複数のCALL文に指定した場合，RETURNINGの指定ありと，指定なしが混在してはいけません。また，RETURNINGの指定がある場合は，それぞれのRETURNINGに指定されたデータ項目の長さ，および用途が同じでなければなりません。

最外側のプログラムを呼び出す場合，RETURNINGに指定したデータ項目の属性で返却項目を参照します。

RETURNING指定でデータ項目に可変長項目を設定した場合，戻り値には常に最大長が受け渡されます。

例

CALL文のRETURNING指定による情報の受け渡しの例を，次に示します。

呼び出し元プログラムは，呼び出し先プログラムの返却項目（COBOLプログラムの手続き部見出しのRETURNINGに指定したデータ項目）の値を，CALL文のRETURNINGに指定したデータ項目で参照できます。

17.2.1　復帰コードと返却項目の使用方法

復帰コードと返却項目の使用方法について説明します。

(1)　返却項目の規則

規則

呼び出し元プログラムと呼び出し先プログラムが両方ともCOBOLプログラムの場合，呼び出し先プログラムで手続き部見出しのRETURNINGに指定したデータ項目の値が，呼び出し元プログラムのCALL文RETURNINGに指定したデータ項目に格納されます。このとき，CALL文のRETURNING指定のデータ項目と，呼び出し先プログラムの手続き部見出しのRETURNING指定のデータ項目の長さ，および用途は同じでなければなりません。同じでない場合，動作は保証しません。

呼び出し先プログラムで手続き部見出しのRETURNINGのデータ項目に設定された戻り値は，呼び出し元プログラムのRETURN-CODE特殊レジスタでは参照できません。同様に，呼び出し先プログラムのRETURN-CODE特殊レジスタに設定された復帰コードは，呼び出し元プログラムのRETURNING指定のデータ項目では参照できません。

呼び出し元プログラムと呼び出し先プログラムのRETURNINGに指定されたデータ項目の型が異なってはなりません。

RETURNINGでデータ項目に可変長項目を設定した場合，常に最大長のデータが返却項目として受け渡されます。

返却項目の受け渡しの例

CALL文のRETURNING指定による返却項目の受け渡しの例を次に示します。

呼び出し元プログラム

       WORKING-STORAGE SECTION.
       01 RTC PIC S9(9) USAGE COMP.
       PROCEDURE DIVISION.
           :
           CALL 'SAMPLE1' RETURNING RTC.
           IF RTC = 12345 THEN
           ：

呼び出し先プログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       LINKAGE SECTION.
       01 RTC PIC S9(9) USAGE COMP.
       PROCEDURE DIVISION RETURNING RTC.
           :
           MOVE 12345 TO RTC.
           EXIT PROGRAM.

(2)　復帰コードの規則

COBOLプログラムでは，RETURN-CODE特殊レジスタに値を設定することで，C言語のプログラムのように復帰コードを設定できます。復帰コードの規則について，次に示します。

(a)　復帰コードの設定方法

呼び出し先プログラムでRETURN-CODE特殊レジスタに値を設定できます。

呼び出し先プログラムで復帰コードに0を設定する例を，次に示します。

（呼び出し先プログラムがCOBOLプログラムの場合）

MOVE 0 TO RETURN-CODE.

（呼び出し先プログラムがCプログラムの場合）

return(0);

(b)　復帰コードの値

復帰コードに設定できる値の範囲は，S9(9) COMPの項目について設定できる値の範囲です。ただし，VOS3 COBOL85との動作と互換性を保つ必要がある場合は，0〜4,095の範囲で設定します。

RETURN-CODE特殊レジスタには，初回の呼び出しのときに初期値0が設定されます。このため，RETURN-CODE特殊レジスタを使用しないで正常終了したときは，復帰コードには0が設定されています。

(c)　復帰コードの参照方法

呼び出し先プログラムでRETURN-CODE特殊レジスタに設定された復帰コードを，呼び出し元プログラムで参照する方法を，次に示します。

COBOLプログラムの場合

ほかのプログラムから制御が戻ってきたとき，呼び出し先プログラムで設定したRETURN-CODE特殊レジスタの値を参照できます。

（例）

CALL 'SAMPLE1'.
IF RETURN-CODE = 20 THEN
    :

Cプログラムの場合

復帰コードは，関数の戻り値として参照できます。

（例）

int  rtn_value;
    :
rtn_value  =  SAMPLE1();
if  (rtn_value  ==  20)  {

(d)　注意事項

RETURN-CODE特殊レジスタの値は，Cプログラムとの混在がなく，呼び出し元以降にCALL文，INVOKE文，およびRETURN-CODE特殊レジスタの値の設定処理がない場合，COBOL主プログラムまで引き継がれます。

呼び出し元プログラムがCOBOLプログラム，呼び出し先プログラムがCプログラムの場合，復帰コードに設定できる値と参照できる値の範囲が次のように異なるので注意が必要です。

Cプログラムで設定できる戻り値

int型の変数に設定できる値の範囲が，戻り値として指定できます。

COBOLプログラムがRETURN-CODE特殊レジスタで参照できる値の範囲

S9(9) COMPで表現できる範囲が，RETURN-CODE特殊レジスタで参照できます。

18　プログラムの呼び出し

この章では，プログラム間の呼び出し方法の種類，プログラム属性，およびプログラム呼び出しでのリンク方法の違いなどについて説明します。

18.1　プログラム呼び出しの種類と概要

COBOL2002では，プログラムから別のプログラムを呼び出せます。プログラム中で同じ副プログラムを2回以上呼び出し，2回目以降に制御が渡るとき，呼び出し先プログラムは，直前に制御を戻したときの状態を保持しています。※

注※

ただし，呼び出し先プログラムがCANCEL文を実行した場合や，初期化属性のプログラムの場合は，2回目以降の呼び出し時に状態が初期化されて副プログラムが実行されます。

COBOL2002でプログラムを呼び出すには，CALL文に呼び出すプログラム名を指定します。このとき，呼び出し先プログラムのPROGRAM-ID段落で指定したプログラム名は，等価規則が適用されるため，CALL文に指定するプログラム名も等価規則適用後のプログラム名で指定する必要があります。英小文字を含むプログラム名を定義したい場合は，呼び出し先プログラムのPROGRAM-ID段落で，プログラム名を英数字定数として指定する必要があります。また，CBL，CLS，CLT，CLUで始まる最外側のプログラム名を指定した場合，動作は保証しません。

CALL文で呼び出すプログラム名を指定する方法は，定数指定と一意名指定の2種類があります。

また，プログラム属性が再帰属性プログラム（RECURSIVE句指定あり）の場合，自分自身のプログラムを再帰的に呼び出せます。再帰属性プログラムの詳細は，「18.4.1　プログラム属性」の「(3)　再帰属性プログラム」を参照してください。

18.1.1　定数指定のCALL文

定数指定のCALL文は，CALL文に呼び出すプログラム名を定数で指定する方法です。

定数指定のCALL文の場合，呼び出すプログラムがリンク時に静的に解決されるため，実行性能は良くなります。

なお，-DynamicLink,Callオプションを指定した場合は，呼び出すプログラムの解決は，各CALL文の最初の実行時に行われます。このため，-DynamicLink,Callを指定した場合，各CALL文の最初の実行の性能は，-DynamicLink,Callを指定しない場合と比べて劣化します。

ただし，各CALL文の２回目以降の実行では，最初の呼び出しで解決したプログラム情報を使用するので，最初の呼び出しと比べると処理時間は短縮されます。

（例）

18.1.2　一意名指定のCALL文

一意名指定のCALL文は，CALL文に呼び出すプログラム名を一意名で指定する方法です。一意名指定のCALL文の場合，呼び出し先のプログラム名は常に実行時に解決されます。

一意名指定のCALL文は，呼び出し先のプログラム名が実行時に解決されるため，定数指定のCALL文と比較すると実行性能は劣化します。特に，実行環境中で最初に呼び出すプログラムの場合，そのプログラムの検索に必要な処理を実行するため，最も処理時間が掛かります。ただし，すでに一意名指定で呼び出したプログラムを再び呼び出す場合，COBOL実行環境が保持しているプログラム情報を検索するので，最初の呼び出しと比べると，処理時間は短縮されます。

（例）

18.2　プログラムの取り消し

通常，呼び出し先プログラムが処理を終えて呼び出し元プログラムに戻ったとき，呼び出し先プログラムは，制御を戻したときの状態を保持しています。COBOL2002では，この状態の保持を取り消せます。

ここでは，プログラムの取り消しについて説明します。

18.2.1　取り消し対象のプログラム

実行中のプログラムを取り消すには，CANCEL文を使用します。

(1)　取り消しの対象に指定できるプログラム

CANCEL文で取り消しの対象に指定できるプログラムは，CANCEL文を実行したプログラムから呼び出せるプログラムだけです。

（例）

プログラムAは，自身が呼び出せるプログラムB，およびプログラムCに対してCANCEL文を実行できます。

プログラムB，プログラムCがお互いを呼び出せる場合，直接呼び出したプログラムでなくても，プログラムBからプログラムCに対して，プログラムCからプログラムBに対して，それぞれCANCEL文を実行できます。

プログラムDは，プログラムCの内側のプログラムなので，プログラムAからプログラムDに対してCANCEL文を実行できません。

(2)　取り消しの実行順序

CANCEL文を実行したとき，CANCEL文に指定されたプログラム中に含まれるすべてのプログラムも取り消されます。このとき，プログラムが取り消される順番は，翻訳単位のプログラム中に現れた順序とは逆順に，含まれる各プログラムに対して正しいCANCEL文を実行した場合と同じです。

（例）

プログラムTEST01から「CANCEL 'A'.」を実行すると，プログラムAに含まれるすべての内側のプログラムに対してもCANCEL文が実行されたものとして扱われます。

(3)　CANCEL文に指定できないプログラム

CANCEL文を実行する場合，すでにほかのプログラムから呼び出されていて，まだEXIT PROGRAM文が実行されていないプログラムを，直接または間接に参照してはいけません。このような実行中のプログラムを参照した場合，実行時エラーとなります。

（例）

プログラムCから，まだ実行中のプログラムBをCANCEL文で取り消そうとした場合，実行時エラーとなります。

18.2.2　取り消しで解放される資源

CANCEL文の実行によって解放される資源を，次に示します。

閉じていないファイルのクローズ処理（報告書作成機能を使用している報告書に関連づけられたファイルを含む）

通信節による画面機能で開かれた画面やプリンタのクローズ処理

最外側プログラムの場合，プログラム内で確保した仮想メモリの解放

注意事項

一度も呼び出されていないプログラムに対してCANCEL文を実行した場合，CANCEL文は無効となります。

CANCEL文で取り消すプログラムに内側のプログラムがある場合，その内側のプログラムもCANCEL文の対象となります。

他言語のプログラムに対してCANCEL文を実行しても，無効となります。

18.2.3　取り消し後の呼び出し

CANCEL文実行後のプログラムは，初期状態になっています。初期状態とは，プログラムが実行単位中で最初に呼び出された状態のことで，初期化属性を指定したプログラムの場合と同じ処理が実行されます。

CANCEL文実行後のプログラムの状態を次の表に示します。

表18‒1　CANCEL文実行後のプログラムの状態

データ領域の種別

VALUE句の指定あり

VALUE句の指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

連絡節

−

−

−

作業場所節

（1）

（2）

不定

局所場所節

（1）

不定

不定

ファイル節

−

（2）

不定

報告書節

（1）

（2）

不定

画面節（SCREEN SECTION）

（1）

（2）

不定

画面節（WINDOW SECTION）

（1）

（2）

不定

通信節（画面機能）

−

不定

不定

通信節（データコミュニケーション機能）

−

不定

不定

サブスキーマ節

−

（2）

不定

（凡例）

−：該当しない

（1）：VALUE句に指定した値で初期化される

（2）：-MultiThreadオプションを指定した最外側のプログラムの再呼び出しをした場合だけ，コンパイラ環境変数CBLVALUEに指定した値で初期化される。それ以外の場合は，不定となる

（説明）

作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION）に含まれていて，VALUE句が書かれているデータ項目の場合，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は規定されません。

ただし，-MultiThreadオプションおよび-CBLVALUEオプションを指定した最外側のプログラムを取り消したあと，そのプログラムを再び呼び出した場合，作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION），ファイル節，サブスキーマ節に含まれているデータ項目は，コンパイラ環境変数CBLVALUEに指定した値で初期化されます。

局所場所節に含まれていて，VALUE句が書かれているデータ項目の場合，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は常に規定されません。

プログラムに関連する内部ファイル結合子を持つファイルや報告書は，開かれた状態ではありません。

通信節による画面機能の送信先画面やプリンタは，開かれた状態ではありません。

プログラム中に含まれるすべてのPERFORM文に対する制御機構は，その初期状態に設定されます。

同じプログラム中に含まれるALTER文によって参照されるGO TO文は，その初期状態に設定されます。

18.3　COBOL主プログラムと副プログラム

COBOLプログラムには，COBOL主プログラムとCOBOL副プログラムの2種類があります。

COBOL主プログラムは，現在実行中のプロセス内で初めて呼ばれたCOBOLプログラムです。COBOL副プログラムは，COBOL主プログラムまたはCOBOL副プログラムから呼ばれたCOBOLプログラムです。

ここでは，COBOL主プログラムとCOBOL副プログラムについて説明します。

18.3.1　COBOLプログラムを主プログラムとして動作させる場合

COBOL主プログラムは，制御プログラムから直接呼ばれる場合と，制御プログラムから間接的に呼ばれる場合（他言語のプログラムから呼ばれる場合）があります。それぞれの場合の動作の違いを，次に示します。

(1)　制御プログラムから直接呼ばれる場合（アプリケーションの主プログラムの場合）

制御プログラムから直接呼ばれるCOBOL主プログラムを作成するには，-Main,Systemまたは-Main,V3オプションを指定してプログラムをコンパイルします。

-Main,Systemまたは-Main,V3オプションを指定してコンパイルしたCOBOL主プログラム（-Mainオプションが指定されたプログラム）には，スタートアップルーチン※が組み込まれます。制御プログラムからCOBOL主プログラムを呼び出す場合は，まず制御プログラムからスタートアップルーチンが呼ばれ，スタートアップルーチンからCOBOL主プログラムの手続きへと制御が移ります。

注※

スタートアップルーチンとは，main関数またはWinMain関数を含むCOBOL2002の実行時ライブラリのことです。

COBOLプログラムが制御プログラムから直接呼ばれる場合の例を次に示します。

(2)　制御プログラムから間接的に呼ばれる場合

制御プログラムから間接的に呼ばれるCOBOL主プログラムを作成するには，-Main,Systemおよび-Main,V3オプションを指定しないで，プログラムをコンパイルします。

-Main,Systemおよび-Main,V3オプションを指定しないでコンパイルしたCOBOL主プログラムには，スタートアップルーチンが組み込まれません。この場合，制御プログラムからはスタートアップルーチンに代わる主プログラムが呼ばれ，主プログラムからCOBOL主プログラムが呼ばれます。

COBOLプログラムが制御プログラムから間接的に呼ばれる場合の例を次に示します。

(3)　注意事項

COBOLプログラムでGOBACK文を実行すると，STOP RUN文と同様にプロセスを終了します。したがって，COBOL主プログラムを呼んだプログラムが制御プログラムでないとき，呼び出し元のプログラムには制御が戻りません。

18.3.2　COBOLプログラムを副プログラムとして動作させる場合

「18.3.1　COBOLプログラムを主プログラムとして動作させる場合」に示したように，実行中のプロセス内で初めて呼ばれたCOBOLプログラム（COBOL主プログラム）でGOBACK文を実行した場合，STOP RUN文と同じ動作となり，プロセスが終了するため，呼び出し元のプログラムに制御が戻りません。このため，COBOL主プログラムを呼び出したプログラム（C言語の主プログラムなど）がCOBOLプログラムから復帰したあとの処理を継続できなくなります。

このような場合，-MainNotCBLオプションを指定してCOBOLプログラムをコンパイルすると，実行中のプロセス内で初めて呼ばれたCOBOLプログラムをCOBOL副プログラムとみなし，GOBACK文またはEXIT PROGRAM文を実行したときでも呼び出し元のプログラムに復帰できます。

また，-MainNotCBLオプションを指定すると，他言語のプログラムからCOBOLプログラムを繰り返し呼び出す場合のCOBOL初期処理／終了処理の負荷を軽減できます。

-MainNotCBLオプションを指定した場合のCOBOLプログラムの動作を，次に示します。

上記の場合，最初に呼ばれるCOBOLプログラムAP1に-MainNotCBLオプションを指定しているので，以降に呼ばれるCOBOLプログラムは，すべてCOBOL副プログラムとして動作します。そのため，この実行環境内ではGOBACK文やEXIT PROGRAM文が有効となり，COBOLプログラムの呼び出し元へ制御が戻るため，復帰後の処理ができます。

(1)　COBOLプログラムの資源

COBOLプログラムが呼び出し元のプログラムに戻っても，COBOLの実行環境は解除されません。このため，INITIAL句を指定していないCOBOLプログラムか，またはCANCEL文で取り消されていないCOBOLプログラムは，以前に呼ばれた状態を保持しています。保持している情報は，通常属性プログラムがほかのプログラムから2回以上呼び出された場合の規則に従います。詳細は，「18.4.1　プログラム属性」の「(1)　通常属性プログラム」を参照してください。

(2)　COBOL実行環境の終了方法

利用者プログラムは，COBOLプログラムの呼び出しが完了し，以降は呼び出しをしない状態になったとき，次の方法で実行環境を終了します。

COBOLプログラム内からSTOP RUN文を実行する。

COBOLプログラムの呼び出し元プログラムからCBLENDサービスルーチンを呼び出す。

CBLENDサービスルーチンについては，「30.4.2　CBLEND」を参照してください。

(3)　注意事項

-MainNotCBLオプションを指定する場合，該当する実行可能ファイル中に含まれるすべてのCOBOLプログラムを-MainNotCBLオプション指定でコンパイルする必要があります。-MainNotCBLオプションを指定したプログラムと指定していないプログラムが混在するときは，実行環境中で最初に呼ばれたプログラムの-MainNotCBLオプションの有無に従います。

18.4　プログラム属性と呼び出し規約

ここでは，COBOLプログラムのプログラム属性と，呼び出し規約について説明します。

18.4.1　プログラム属性

COBOLプログラムでは，プログラムの使用形態に応じて次の属性を指定できます。

通常属性プログラム

初期化属性プログラム

再帰属性プログラム

共通属性プログラム

(1)　通常属性プログラム

プログラムの見出し部に特に何も指定しない場合，通常属性プログラムとなります。

通常属性プログラムは，ほかのプログラムから2回以上呼び出された場合，前回呼ばれたときの，次の状態を保持しています。

プログラムに関連するファイルの状態（報告書作成機能を使用している報告書に関連づけられたファイルを含む）

画面節（SCREEN SECTION），画面節（WINDOW SECTION），通信節（画面機能），通信節（データコミュニケーション機能），サブスキーマ節で使用された資源の状態

作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION），ファイル節，サブスキーマ節，通信節（画面機能），通信節（データコミュニケーション機能）の内容

ALTER文で設定したGO TO文

ただし，プログラム中に含まれるすべてのPERFORM文に対する制御機構は，プログラムが呼び出されるたびに，初期状態に設定されます。

保持している状態を取り消すには，CANCEL文を実行します。詳細は，「18.2　プログラムの取り消し」を参照してください。

また，通常属性プログラムは，自分自身を再帰的に呼ぶことはできません。

(2)　初期化属性プログラム

プログラムの見出し部にINITIAL句を指定した場合，初期化属性プログラムとなります。

初期化属性プログラムは，ほかのプログラムから呼ばれたときに，毎回プログラムの状態が初期化されます。そのため，プログラムの状態は，実行単位でそのプログラムが最初に呼ばれたときと同じになります。

(a)　初期化プログラムが呼ばれたときの初期化の内容

初期化プログラムが呼ばれたときのプログラムの状態を次の表に示します。

初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の初期値については，「(b)　初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の状態」を参照してください。

表18‒2　初期化プログラムが呼ばれたときのプログラムの状態

データ領域の種別

VALUE句の指定あり

VALUE句の指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

連絡節

−

−

−

作業場所節

（1）

（2）

不定

局所場所節

（1）

不定

不定

ファイル節

−

（2）

不定

報告書節

（1）

（2）

不定

画面節（SCREEN SECTION）

（1）

不定

不定

画面節（WINDOW SECTION）

（1）

（2）

不定

通信節（画面機能）

−

不定

不定

通信節（データコミュニケーション機能）

−

不定

不定

サブスキーマ節

−

（2）

不定

（凡例）

−：該当しない

（1）：VALUE句に指定した値で初期化される

（2）：最初に呼ばれたときだけ，コンパイラ環境変数CBLVALUEに指定した値での初期化は保証されるが，2回目以降に呼ばれたときは不定となる

（説明）

作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION）に含まれていて，VALUE句が書かれているデータ項目の場合，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は規定されません。

局所場所節に含まれていて，VALUE句が書かれているデータ項目の場合，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は常に規定されません。

プログラムに関連する内部ファイル結合子を持つファイルや報告書は，開かれた状態ではありません。

通信節による画面機能の送信先画面やプリンタは，開かれた状態ではありません。

プログラム中に含まれるすべてのPERFORM文に対する制御機構は，その初期状態に設定されます。

同じプログラム中に含まれるALTER文によって参照されるGO TO文は，その初期状態に設定されます。

なお，-DllInitオプションを指定して作成したDLL中のプログラムは，INITIAL句の指定がない場合でも初期化属性プログラムとなります。

(b)　初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の状態

コンパイル時にコンパイラ環境変数CBLINITVALUEがあるかどうかで，初期化プログラムの作業場所節のVALUE句の指定がないデータ項目の状態が異なります。初期化プログラムが呼ばれたときの，作業場所節のVALUE句の指定がないデータ項目の状態を次の表に示します。

表18‒3　初期化プログラムが呼ばれたときの，作業場所節のVALUE句の指定がないデータ項目の状態

VALUE句の指定なし

CBLINITVALUEの指定あり

CBLINITVALUEの指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

（1）

（2）

不定

（凡例）

（1）：呼ばれるたびに，作業場所節のデータ項目がNULL（X'00'）で初期化される

（2）：最初に呼ばれたときだけ，コンパイラ環境変数CBLVALUEに指定した値での初期化が保証されるが，2回目以降に呼ばれたときは不定となる

(3)　再帰属性プログラム

プログラムの見出し部にRECURSIVE句を指定した場合，再帰属性プログラムとなります。

再帰属性プログラムは，自分自身を直接的，または間接的に再帰呼び出しできます。

再帰属性プログラムが呼ばれたときのプログラムの状態を次の表に示します。

表18‒4　再帰属性プログラムが呼ばれたときのプログラムの状態

データ領域の種別

VALUE句の指定あり

VALUE句の指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

連絡節

−

−

−

作業場所節

（1）

（3）

（4）

局所場所節

（2）

不定

不定

ファイル節

−

（3）

（4）

報告書節

（1）

（3）

（4）

画面節（SCREEN SECTION）

（1）

（4）

（4）

画面節（WINDOW SECTION）

（1）

（3）

（4）

通信節（画面機能）

−

（4）

（4）

通信節（データコミュニケーション機能）

−

（4）

（4）

サブスキーマ節

−

（3）

（4）

（凡例）

−：該当しない

（1）：最初に呼び出された場合だけ，VALUE句に指定した値で初期化される

（2）：呼び出されるたびに初期化される

（3）：最初に呼び出された場合だけ，コンパイラ環境変数CBLVALUEに指定した値で初期化される。再帰呼び出しされた場合は，直前に呼び出された状態を保持している

（4）：最初に呼び出された場合は，不定となる。再帰呼び出しされた場合は，直前に呼び出された状態を保持している

（説明）

次の個所は，プログラムが呼び出されるたびに初期化されます。

局所場所節に含まれていて，VALUE句が書かれているデータ項目の場合，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は常に規定されません。

プログラム中に含まれるすべてのPERFORM文に対する制御機構は，その初期状態に設定されます。

同じプログラム中に含まれるALTER文によって参照されるGO TO文は，その初期状態に設定されます。

次の個所は，プログラムが再帰呼び出しされた場合，前回呼ばれた状態を保持しています。

作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION）に含まれていて，VALUE句が書かれているデータ項目の場合，最初に呼び出されたときは，VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，最初に呼び出されたときは，初期値は規定されません。

作業場所節，ファイル節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION），通信節（画面機能），通信節（データコミュニケーション機能），サブスキーマ節に含まれているデータ項目で，再帰呼び出しされたときは，直前の状態を保持しています。

局所場所節に含まれていて，VALUE句が書かれているデータ項目の場合，定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合，初期値は常に規定されません。

プログラムに関連する内部ファイル結合子を持つファイルや報告書は，開かれた状態で再帰呼び出しをすると，開かれた状態で引き継がれます。

画面節（SCREEN SECTION），画面節（WINDOW SECTION），通信節（画面機能），通信節（データコミュニケーション機能），サブスキーマ節で使用された資源の状態は，そのままの状態で引き継がれます。

(a)　RECURSIVE句の効果

RECURSIVE句を指定した場合の効果は，次のとおりです。

RECURSIVE句は，最外側のプログラム（この場合は，-Main,System／-Main,V3オプションを指定しないプログラム）でも指定できます。

また，プログラムが入れ子状態であるとき，外側のプログラムにRECURSIVE句の指定があれば，その直接または間接的な内側のプログラムにRECURSIVE句の指定がなくても，暗黙的に再帰属性プログラムとなります。

-Main,System／-Main,V3オプションを指定した最外側のプログラムにRECURSIVE句を指定した場合，警告エラーとなり，最外側のプログラムのRECURSIVE句の指定は無視されます。ただし，内側のプログラムについては，再帰属性となります。

上記の最外側のプログラム（"OYA"）を呼び出そうとした場合，次の結果となります。

最外側のプログラムの手続き，または含まれるプログラムの手続きから，CALL定数（CALL 'OYA'）で呼び出そうとした場合は，コンパイル時にエラーとなります。

別翻訳単位のプログラムの手続きから，CALL定数(CALL 'OYA')で呼び出そうとした場合，-DynamicLink,Callオプションの指定があれば実行時にエラー，-DynamicLink,Callオプションの指定がなければリンク時にリンクエラーとなります。

CALL一意名で呼び出そうとした場合は，実行時にエラーとなります。

(b)　再帰呼び出しの例

COBOL副プログラムの再帰呼び出し

（最外側のプログラムの再帰呼び出し）

（内側のプログラムの再帰呼び出し）

COBOL主プログラムの再帰呼び出し

Cプログラムなどを介して，制御プログラムから間接的に呼ばれるCOBOL主プログラムについても，再帰呼び出しができます。

(4)　共通属性プログラム

プログラムの見出し部にCOMMON句を指定した場合，共通属性プログラムとなります。

共通属性プログラムは，その共通属性プログラムを直接含まない，内側のプログラムから呼び出せます。

18.4.2　呼び出し規約

COBOLプログラムでは，以下の呼び出し規約のプログラムを作成できます。

Windows(x86) COBOL2002の場合

cdecl

stdcall

Windows(x64) COBOL2002の場合

fastcall

呼び出し規約を指定することによって，Cなどの他言語で作成したプログラムからCOBOLプログラムを呼び出したり，COBOLプログラムから他言語のプログラムを呼び出せます。

Windows(x86) COBOL2002の場合，呼び出し規約は，呼び出すプログラムで，環境部のEXTERNAL-PROGRAM SECTIONのCALL-CONVENTION段落に指定します。呼び出し規約の指定方法については，マニュアル「COBOL2002　言語　拡張仕様編」　「25.2.1　プログラム間連絡機能の環境部」を参照してください。

(1)　cdecl呼び出し規約（Windows(x86) COBOL2002で有効）

cdecl呼び出し規約は，Cプログラムのcdecl呼び出し規約のインタフェースを持つプログラムを呼び出すときに使用します。DLLでないプログラムは，すべてcdecl呼び出し規約となります。

cdecl呼び出し規約のプログラムを呼ぶ場合は，呼び出すCOBOLプログラムのCALL-CONVENTION段落で，呼び出し先プログラムとCDECLを関連づけます。なお，CALL-CONVENTION段落の指定がない場合は，CDECLが仮定されます。

(2)　stdcall呼び出し規約（Windows(x86) COBOL2002で有効）

stdcall呼び出し規約は，Cプログラムのstdcall呼び出し規約と同じインタフェースを持つプログラムを呼び出すときに使用します。

stdcall呼び出し規約のプログラムを呼ぶ場合は，呼び出すCOBOLプログラムのCALL-CONVENTION段落で，呼び出し先プログラムとSTDCALLを関連づけます。

CALL-CONVENTION段落の指定がない場合でも，-StdCallオプションを指定すると，呼び出すプログラムの呼び出し規約をstdcallにできます。詳細は，「35.　実行可能ファイルとDLLの作成」を参照してください。

(3)　fastcall呼び出し規約（Windows(x64) COBOL2002で有効）

fastcall呼び出し規約は，Cプログラムのfastcall呼び出し規約と同じインタフェースを持つプログラムを呼び出すときに使用します。

Windows(x64) COBOL2002では，fastcall呼び出し規約のプログラムだけ作成できます。

18.5　静的なリンクと動的なリンク

ここでは，プログラム間連絡での静的なリンクと動的なリンクの違いについて説明します。

リンク方法や，実行可能ファイルの作成方法については，「35.　実行可能ファイルとDLLの作成」を参照してください。また，DLLの静的なリンクと動的なリンクについては，「18.6.2　DLLに含まれるプログラムの呼び出し方法」を参照してください。

18.5.1　静的なリンク

静的なリンクとは

静的なリンクとは，オブジェクトファイルのリンク時にプログラムの呼び出しを解決して，実行可能ファイルを生成するリンク方法です。

静的なリンクとは，次の両方のことを指します。

オブジェクトファイルを静的に結合して，一つの実行可能ファイルを生成すること

DLLのインポートライブラリを使用して，呼び出し先プログラム名の名前解決を静的にすること

静的なリンクの長所と短所

静的にリンクすると，主プログラムがメモリにロードされるのと同時に，呼び出し先プログラムもロードされます。そのため，プロセス起動時にはロード時間が掛かりますが，CALL文でほかのプログラムを呼び出すとき，すでにメモリ上にプログラムがロードされているので，高速に呼び出せます。

静的にリンクした方がよいケース

同じプログラムを何度も呼び出すようなプログラム構造の場合は，静的にリンクした方がプログラムの実行性能が良くなります。

18.5.2　動的なリンク

動的なリンクとは

動的なリンクとは，呼び出し先プログラムの情報を保持しない実行可能ファイルを生成するリンク方法です。

動的なリンクでは，CALL文での呼び出し先プログラム（副プログラム）と呼び出し元プログラム（主プログラム）とを別ファイルで生成しておきます。呼び出し先プログラムは，呼び出し元プログラムがCALL文を実行したとき，メモリにロードされます。

動的なリンクの長所と短所

動的にリンクすると，主プログラムがメモリにロードされても，副プログラムはロードされないため，プロセス起動時のロード時間が静的リンクより高速になります。また，プログラムが消費するメモリ空間が少なくて済みます。しかし，CALL文の実行時に，呼び出し先プログラムのロードと検索処理が実行されるため，CALL文の処理時間は遅くなります。

動的にリンクした方がよいケース

処理の流れによって呼ばれないことがある副プログラムがある場合は，動的にリンクした方がプログラムの実行性能が良くなります。

18.6　DLLに含まれるプログラムの呼び出し

18.6.1　DLLの概要

主プログラム（呼び出し元プログラム）と副プログラム（呼び出し先プログラム）を別ファイルにして，呼び出し先プログラムを一つのファイルにまとめたものをDLL（ダイナミックリンクライブラリ）といいます。

呼び出し先プログラムをDLLにすると，次の利点があります。

複数のユーザアプリケーションで一つのDLLを共用できます。このため，メモリ空間が節約でき，スワップの回数も減らせます。

関数の引数と戻り値を変更しなければ，DLL中の関数を変更しても実行可能ファイルやほかのDLLの再コンパイルや再リンクは不要です。

18.6.2　DLLに含まれるプログラムの呼び出し方法

DLLに含まれるプログラムの呼び出しには，静的なリンクによる呼び出しと，動的なリンクによる呼び出しの二つの方法があります。

(1)　静的なリンク

呼び出し元プログラムのリンク時にインポートライブラリを指定して，呼び出し先プログラム名を解決する方法です。この場合，実行可能ファイルがロードされるときに，DLLもロードされます。

DLLを静的にリンクするには，呼び出し元プログラムから定数指定のCALL文で，呼び出し先プログラムのDLLを呼び出します。

ロード対象のDLLは次のDLL検索フォルダ下から順に検索されます。

現在のプロセスの実行可能ファイルがあるフォルダ

Windowsのシステムフォルダ

Windowsフォルダ

カレントフォルダ

環境変数PATHで登録されているフォルダ

プログラム実行時，これらの検索パスにDLLがないと，プロセス起動エラーとなります。

-DynamicLink,Callオプションを指定していない定数指定のCALL文を実行することで，静的なリンクによって呼び出しを行います。

（例）

副プログラムを含むDLLがCALL '定数'で呼ばれ，実行可能ファイルの作成時にインポートライブラリを指定してDLLをリンクした場合，静的なリンクでの呼び出しとなります。

(2)　動的なリンク

実行時に呼び出し先プログラムを検索する方式です。

DLLを動的にリンクするには，次のどれかの文を実行しDLLに含まれるプログラムを呼び出すか，またはそのアドレスを求めます。

一意名指定のCALL文

-DynamicLink,Callオプション指定時の定数指定のCALL文

-DynamicLink,Callオプション指定時のADDR関数

動的なリンクの場合，プログラム実行時に環境変数CBLLDLLで呼び出し先プログラムが含まれるDLLを指定します。

形式

CBLLDLL=DLL名称［;DLL名称］…

DLL名称

動的にリンクするDLLの名称を指定します。

規則

DLL名称の指定方法には，DLLのファイル名称だけを指定する方法と，フォルダを含めたファイル名称を指定する方法があります。

ファイル名称だけを指定した場合，動的なリンクの対象となるDLLは，次のDLL検索フォルダにある指定名称のDLLから順に検索されます。

現在のプロセスの実行可能ファイルがあるフォルダ

Windowsのシステムフォルダ

Windowsフォルダ

カレントフォルダ

環境変数PATHで登録されているフォルダ

フォルダを含めたファイル名称を指定した場合，指定したフォルダのDLLだけが動的なリンクの対象となります。

DLL自動ロード機能

DLL自動ロード機能は，環境変数CBLLDLLの指定でプログラムが見つからなかった場合に，プログラム名.dllという名称のDLLをロードして，そのDLL中のプログラムを実行できるようにする機能です。

DLL自動ロード機能で一度ロードすれば，それ以降はDLL中のほかのプログラムをCALL文で呼び出せます。

DLL自動ロード機能を使用するためには，実行時環境変数CBLLPROGDLLにYESを指定します。環境変数の設定方法については，「36.2.1　実行時環境変数の設定方法」を参照してください。

環境変数CBLLDLLで指定したDLLに呼び出し先プログラムがない場合，CALL文で実行時エラーとなります。また，DLL自動ロード機能を使用する場合は，「呼び出し先プログラムの名称.dll」という名称のDLLがないとき，または「呼び出し先プログラムの名称.dll」に呼び出し先プログラムが含まれないときも，CALL文で実行時エラーとなります。

なお，動的なリンクのプレロード機能を使用することで，プログラム起動時に検索対象となるDLLをロードできます。動的なリンクのプレロード機能の詳細は，「18.6.3　動的なリンクのプレロード機能」を参照してください。

（例）

一意名指定のCALL文での呼び出しの場合は，動的なリンクでの呼び出しとなります。

注意事項

環境変数の値は，プログラムで最初に呼ばれたCALL文の実行時に取得した値が，そのプログラム中で有効になります。

(3)　注意事項

プログラムを呼び出す場合，呼び出し先プログラムの呼び出し規約に従って呼び出さなければなりません。呼び出し規約が異なっている場合，静的なリンクのときは，リンク時にエラーとなり，動的なリンクのときは，実行時エラーとなります。

動的にロードされたDLLは，COBOL実行環境の終了時にアンロードされます。したがって，atexitシステム関数などで，COBOL実行環境の終了後のタイミングで呼び出される関数を登録する場合は，次の点に注意してください。

COBOL実行環境終了後のタイミングで呼び出される関数は，動的にロードされるDLLに含まれる関数であってはなりません。

Windows(x86) COBOL2002では，呼び出し先プログラムがSTDCALL呼び出し規約の場合，CALL文に指定されたプログラム名に装飾名を付けて呼び出されます。COBOL以外のプログラムをSTDCALL呼び出し規約にする場合は，プログラム名に装飾名を付けてエクスポートしなければ動的なリンクでは呼び出されません。詳細は，「35.2.1　DLLの作成」を参照してください。

(4)　プログラムのデバッグ

実行可能ファイルに静的にリンクしたCOBOLプログラムと同様に，動的にリンクしたDLLについてもテストデバッガを使用したデバッグができます。

(5)　動的なリンクを使用するプログラム作成時の注意事項

プログラムの作成時には次のような注意が必要になります。

利用者定義関数を含めたDLLは，動的なリンク（プログラム呼び出した時にメモリにロードされるリンク方法）では呼び出せません。

プログラムの作成方法については，「35.　実行可能ファイルとDLLの作成」を参照してください。

(6)　動的なリンクを使用する場合の注意事項

ダイナミックリンクでは，独自にDLLのロードやアンロードを管理しています。そのため，プログラムの実行中に，DLLのロードやアンロードに関連するシステム関数（LoadLibrary，FreeLibrary）を，ユーザプログラムから呼び出してはなりません。

18.6.3　動的なリンクのプレロード機能

実行単位内で最初に実行されるCOBOLプログラムの起動時に，動的なリンクで検索対象となるDLLをロードすることで，動的なリンクによるCALL文実行時の呼び出し先プログラムの検索を高速化できます。

(1)　環境変数

動的なリンクのプレロード機能を有効にするには，実行時環境変数CBLPRELOADに，プレロードするDLL名称を記述したファイル（プレロードリストファイル）名を絶対パスで指定します。

形式

CBLPRELOAD=プレロードリストファイル名

プレロードリストファイルの形式

プレロードするDLL名称を記述します。

1行に一つのDLL名称を記述します。複数行，記述できます。

空行は無視されます。

行の先頭がシャープ"#"(X'23')の行はコメント行とみなされます。

行の長さが4,096バイトを超えた場合，その行は無視されます。

拡張子が「.DLL」でないファイル名は無視されます。

プレロードリストファイルに記述した文字の扱いを次に示します。

文字

文字の扱い

半角空白および水平タブ文字

次の半角空白文字（X'20'），水平タブ文字（X'09'）は無視されます。

行の先頭からDLL名称の先頭まで

DLL名称の終端から改行まで

シャープ"#"

行の先頭がシャープ"#"（X'23'）の行はコメント行とみなされます。

上記以外の文字

DLL名称の一部とみなされます。

プレロードリストファイルの記述例

# プレロードするDLL
C:¥tmp¥test01.dll

規則

プレロードするDLLは，実行単位内で最初に実行されるCOBOLプログラムの起動時にロードします。プレロード機能でロードしたDLLはプロセス終了までアンロードされません。

プレロードするDLL名称は，絶対パスで指定してください。

プレロード機能でロードしたDLL内のプログラムは，環境変数CBLLDLLやCBLLPROGDLLを指定しなくても動的なリンクによるCALL文で呼び出せます。

プレロードリストファイル名に誤りがある，アクセス権がないなどの理由でプレロードリストファイルが開けない場合，警告メッセージが出力されます。このとき，プレロード機能は有効となりません。

プレロードリストファイルに記述したDLLのロードに失敗した場合，警告メッセージが出力されて処理が続行されます。

18.6.4　動的なリンクのプログラム検索トレース機能

プログラム検索トレース機能では，次のトレース情報を出力します。

動的なリンクによる，プログラム呼び出し時のDLLの検索情報

プレロード時のDLLのロード情報

(1)　環境変数CBLPGMSEARCHTRC

実行時環境変数CBLPGMSEARCHTRCには，トレース情報を出力するファイル名を指定します。

形式

CBLPGMSEARCHTRC=プログラム検索トレースファイル名

規則

プログラム検索トレースファイル名は，絶対パスで指定してください。

プログラム検索トレースファイル名のパスに誤りがある，アクセス権がないなどの理由で，プログラム検索トレースファイルが開けない場合，警告メッセージが出力されます。このとき，プログラム検索トレース情報は出力されません。

次のどれかに該当するCALL文では，プログラム検索トレース情報は出力されません。

・-DynamicLink,Callオプションの指定がないCOBOLプログラムの定数指定のCALL文

・-DynamicLink,Callオプションを指定したCOBOLプログラムの定数指定のCALL文による内部プログラム呼び出し

・-DynamicLink,Callオプションを指定したCOBOLプログラムの定数指定のCALL文による2回目以降のプログラム呼び出し

実行時環境変数CBLPGMSEARCHTRCに指定したプログラム検索トレースファイル名は，次の形式のファイル名に変更されて出力されます。

[形式]

ファイル名[_i]_j.拡張子

i：スレッド識別子の値です。マルチスレッド対応COBOLプログラムのときだけ付加されます。

j：管理番号です。1または2が付加されます。

プログラム検索トレースファイルのファイルサイズが実行時環境変数CBLPGMSEARCHTRC_SIZEの指定値を超えた場合，管理番号を切り替えて，ファイルの先頭からトレース情報が出力されます。切り替え後のファイル名と同一名称のファイルが存在する場合，同一名称のファイルは削除されます。必要な場合は，削除される前にバックアップをとってください。

複数プロセスが並列で実行される場合，プログラム検索トレースファイル名には一意となる名称を指定する必要があります。同じプログラム検索トレースファイル名を指定し，プログラムを並列で実行した場合のプログラム検索トレースの出力結果は保証しません。

-DynamicLink,Callオプションを指定したCOBOLプログラムでADDR関数にプログラム名を指定した場合，ADDR関数でのプログラム検索情報がCALL文のプログラム検索トレースとして出力されます。

ディスクの空き容量不足などで，プログラム検索トレースファイルへのトレース出力中にエラーが発生した場合は，それ以降のトレース情報は出力されません。なお，このとき，実行時メッセージは出力されません。

(2)　環境変数CBLPGMSEARCHTRC_SIZE

実行時環境変数CBLPGMSEARCHTRC_SIZEには，プログラム検索トレースファイル名を切り替えるサイズを指定します。

形式

CBLPGMSEARCHTRC_SIZE=プログラム検索トレースファイル名を切り替えるサイズ(1〜2,000,000)

規則

ファイルサイズはKB単位で指定してください。

指定に誤りがある場合，または指定がない場合は10,240が仮定されます。

実行時環境変数CBLPGMSEARCHTRC_SIZEの指定に従い，プログラム検索トレースファイルのサイズが指定値の上限を超えた場合，ファイル名の管理番号が切り替えられます。

切り替え先のファイルが開けないときは，警告メッセージが出力されます。なお，それ以降のプログラム検索トレースは出力されません。

プログラム検索トレースファイルの管理番号1のファイルが存在しない場合は，管理番号1のファイルにトレース情報が出力されます。管理番号1のファイルがすでに存在する場合は，次に示す管理番号のファイルにトレース情報が出力されます。

管理番号1ファイル

管理番号2のファイル

トレース情報出力

ファイルサイズが上限を超えていない

−

管理番号1のファイルに追加書きで出力する

ファイルサイズが上限を超えている

ファイルが存在しない

管理番号2のファイルを作成して出力する

ファイルが存在する

ファイルサイズが上限を超えていない

管理番号2のファイルに追加書きで出力する

ファイルサイズが上限を超えている

最終更新日時が古い管理番号のファイルを削除，作成して出力する

（凡例）

−：条件なし

(3)　注意事項

プログラム検索トレース機能機能はデバッグ機能です。プログラム検索トレース機能を使用すると，動的なリンクの実行性能が低下するため，デバッグ時にだけ使用してください。

環境変数CBLLDLLにパスを含むDLL名を指定している場合，プログラム検索トレースのDLL名には指定した値がそのまま出力されます。

環境変数CBLLDLLにパスがないDLL名を指定している，または環境変数CBLLPROGDLLを指定している場合は，プログラム検索トレースのDLL名には検索対象となるDLL名の絶対パスが出力されます。ただし，検索対象のDLLが見つからなかった場合は，次の情報が出力されます。

環境変数CBLLDLL：パス指定のないDLL名

環境変数CBLLPROGDLL：呼び出し先プログラム名

(4)　プログラム検索トレースの内容

日付/時刻を出力する。

トレース出力の契機を出力する。

PRE

環境変数CBLPRELOADで指定されたプレロードリストファイルに記述されたDLLの情報を出力する。

PROG

CALL文が実行されたプログラム名を5.に示す。

CALL

CALL文の処理であることを示す。3.がprogramの場合，呼び出すプログラム名を5.に示す。

処理内容の詳細を出力する。

open

ファイルのオープン処理であることを示す。

load

DLLのロード処理であることを示す。

program

呼び出し先プログラムの検索処理を開始したことを示す。

search

プログラムの検索処理であることを示す。

getaddr

プログラムのアドレス取得処理であることを示す。

処理の実行結果を出力する。

SUCCESS

処理が成功したことを示す。

WARNING

処理中にエラーが発生したことを示す。処理は継続する。

ERROR

処理中にエラーが発生したことを示す。処理は終了する。

NOTFOUND

処理を実行した結果，呼び出し先プログラムが見つからなかったことを示す。

FOUND

処理を実行した結果，呼び出し先プログラムが見つかり，プログラム検索処理が終了したことを示す。

処理の対象ファイルまたは対象プログラムを出力する。

INSIDE PROGRAM

呼び出しできる内側のプログラムに対する処理であることを示す。

CALLED PROGRAMS

呼び出し済みプログラムに対する処理であることを示す。

LINKED TO STATICALLY

静的にリンクされた最外側のプログラムに対する処理であることを示す。

ALREADY LOADED LIBRARY

ロード済みのDLLに対する処理であることを示す。

上記以外(ファイル名またはプログラム名)

ファイルまたはプログラムに対する処理であることを示す。

環境変数CBLPRELOADの指定がある場合は，プレロードリストファイルに記述されたDLLに対するロード結果を出力する。ロード失敗時は，エラー番号(n)と詳細メッセージ(xxxxx)を出力する。

環境変数CBLPRELOADの指定がない場合，環境変数CBLPRELOADの情報は出力しない。

呼び出しできる内側のプログラムの中から呼び出し先プログラムを検索した結果を出力する。この情報は，一意名指定のCALL文のときだけ出力する。

動的なリンクによってすでに呼び出しされたプログラムから呼び出し先プログラムを検索した結果を出力する。

すでにロードされているDLL中から呼び出し先プログラムを検索した結果を出力する。

未ロードのDLLから呼び出し先プログラムを検索した結果を出力する。

呼び出し先プログラムを含むDLLをロードした結果を出力する。

呼び出し先プログラムのアドレスを取得した結果を出力する。

DLLのロードに失敗した場合，エラー番号と詳細メッセージを出力する。

18.7　実行可能ファイルの呼び出し

CALL文で実行可能ファイルの呼び出しができます。

実行可能ファイルとは，ccbl2002コマンドなどで作成した実行可能ファイル（.exe）やバッチファイル（.bat）のように，単独で実行できるファイルのことです。

18.7.1　実行可能ファイル呼び出しの概要

CALL文で呼び出すプログラムの名称中にファイル拡張子の区切り文字のピリオド（.）が含まれる場合（例：A.exe），実行可能ファイルが指定されたものとみなされます。

注意事項

実行可能ファイルのファイル名に空白が含まれている場合は，ファイルを呼び出すときにファイル名を引用符（ " ）で囲んでください。引用符で囲まないと，異なったファイルを呼び出してしまうことがあります。以下の例を参考にしてください。

（例）

「PROG.1 ZIKKOU.exe」と「PROG.1」という二つのファイルがあった場合

・CALL 'PROG.1 ZIKKOU.exe'
    →  「PROG.1」が呼び出される。

・CALL ' "PROG.1 ZIKKOU.exe" '
    →  「PROG.1 ZIKKOU.exe」が呼び出される。

18.7.2　実行方式

CALL文で実行可能ファイルを指定すると，新しいプロセスが起動し，実行可能ファイルは，そのプロセスで実行されます。呼び出し元のプログラムは，実行可能ファイルの終了後，次の処理に移ります。

新しいプロセスが起動できない場合，CALL文にON EXCEPTIONまたはON OVERFLOWの指定があれば，この指定が有効となります。指定がなければ，共通例外処理で定義した処理を実行します。共通例外処理を使用しないときは，エラーメッセージが出力され，実行単位が異常終了します。

新しいプロセスのカレントフォルダや環境変数などの実行環境は，呼び出し元のプログラムの実行環境が引き継がれます。

外部属性を持つデータ項目のようなプログラム内で定義した情報は，呼び出し元プログラムと呼び出し先プログラムとでプロセスが異なるため共用はできません。

18.7.3　実行可能ファイルの指定

(1)　実行可能ファイル名の指定方法

実行可能ファイル名は，CALL 定数，CALL 一意名のどちらでも指定できます。実行可能ファイルの指定方法には次の二つの方法があります。

フォルダを含めたパス名で指定する。

フォルダを含めないファイル名だけで指定する。

どちらの場合も，ファイル名は拡張子を含めて指定します。拡張子のないファイルを指定するときは，ファイル名のあとに区切り文字のピリオド（.）を付けて指定します。

(2)　ファイルの検索順序

パス名で指定した場合，実行されるファイルは，指定したフォルダのファイルとなります。

ファイル名だけを指定した場合は，次の順序でファイルが検索され，最初に見つかったファイルが実行されます。

呼び出し元のプログラムがあるフォルダ

カレントフォルダ

Windowsのシステムフォルダ

Windowsフォルダ

環境変数PATH内に登録されているフォルダ

18.7.4　引数の受け渡し

実行可能ファイルが利用者引数（例えば，A.exe AAAとして実行した場合のAAA）を必要とする場合，実行可能ファイルに引数を渡すには次の方法があります。

(1)　USING 一意名による方法

USING 一意名を指定すると，一意名に指定した値は，そのままの利用者引数となります。

（例）

       01 PARM PIC X(3) VALUE 'AAA'.
           :
       CALL 'A.exe' USING PARM.

この場合，「A.exe AAA」という形でA.exeが起動します。

複数の引数を渡す場合は，複数の一意名に分けて渡しても，一つの一意名にすべてのパラメタを設定して渡してもかまいません。

なお，BY REFERENCE／BY VALUE／BY CONTENTなどのBY〜指定に関係なく，一意名に格納された値を引数として渡します。

(2)　実行可能ファイル名に含めて渡す方法

実行可能ファイル名に利用者引数を含めたコマンド列として利用者引数を渡すこともできます。

（例）

       CALL 'A.exe AAA'.

18.7.5　実行可能ファイルの終了コードの取得

CALL文で実行可能ファイルを呼び出す場合，実行可能ファイルの終了コードは，呼び出し元のRETURN-CODE特殊レジスタ，またはCALL文のRETURNING指定で参照できます。CALL文にRETURNING指定をした場合は，RETURN-CODE特殊レジスタでは参照できません。

詳細は，「17.2　復帰コードと返却項目」を参照してください。

19　他言語とのプログラム間連絡

この章では，COBOLプログラムとほかの言語で作成したプログラムとを連携させる方法について説明します。

19.1　C言語との連携

19.1.1　概要

(1)　COBOLプログラム，Cプログラム間でのプログラムの呼び出し

COBOLプログラムからCプログラムを呼び出したり，逆にCプログラムからCOBOLプログラムを呼び出したりできます。

ただし，COBOLプログラムを呼び出すCプログラムや，COBOLプログラムから呼び出されるCプログラムは，システムの規則に従って作成する必要があります。

(2)　COBOLプログラム，Cプログラム間での引数の引き渡し方法

COBOLプログラムとCプログラムとの間で引数を引き渡すには次の方法があります。

ポインタ型で引き渡す方法

値渡しで引き渡す方法

CALL文の引数にADDRESS OF／LENGTH OF一意名を指定する方法（ただし，COBOLからCを呼ぶ場合だけ）

(3)　構造化例外処理使用時の注意事項

構造化例外処理を使用してCOBOLプログラム実行中の例外を処理する場合の注意事項を次に示します。

システム例外発生後，__except節のフィルタ式以外の個所でCOBOLプログラムやCOBOLのサービスルーチンを呼び出すことはできません。

__except節のフィルタ式中では，COBOLプログラムを呼び出せます。また，この延長でCBLABNサービスルーチンを呼び出して，プログラムを終了できます。

(4)　Cプログラムでの64bitアプリケーションの作成（Windows(x64) COBOL2002で有効）

Cプログラムは，64bitアプリケーションとして作成しなければならず，システムによってはCコンパイラのオプションが必要な場合があります。Cコンパイラのオプションについては，システムのマニュアルを参照してください。64bitアプリケーションでは，ポインタ型のサイズは8バイトになります。

(5)　他言語で標準出力や標準エラー出力をする場合の注意事項

標準出力や標準エラー出力をしている他言語プログラムのあとに呼び出されるCOBOLプログラムで，DISPLAY文や実行時メッセージを標準出力や標準エラー出力に出力している場合，データの出力順が前後することがありますので，COBOLプログラムを呼び出す前に標準出力や標準エラー出力のバッファをフラッシュしてください。

19.1.2　CプログラムからCOBOLプログラムを呼び出す方法

CプログラムからCOBOLプログラムを呼ぶときの規則を示します。

(1)　CからCOBOLを呼ぶときの規則

Cプログラム内で宣言された外部変数，およびCOBOLプログラム内の外部属性を持つデータ項目は，それぞれのプログラムで参照できます。外部属性を持つデータ項目の参照方法については，「19.1.5　外部属性を持つデータ項目の共用」を参照してください。

Cプログラムは，COBOLプログラムのRETURN-CODE特殊レジスタに設定された戻り値を関数の戻り値として参照できます。COBOLプログラムが返す戻り値の有効な範囲については，「17.2　復帰コードと返却項目」を参照してください。

CプログラムからGUIモードのCOBOLプログラムを呼び出す場合，最初のCOBOLプログラムを呼び出す前に，CBLGINTサービスルーチンを呼び出す必要があります。詳細は，「16.3　COBOLプログラムのモード」を参照してください。

CプログラムからCOBOLプログラムを呼び出す場合，COBOL主プログラムとCOBOL副プログラムによってGOBACK文，EXIT PROGRAM文の動作が異なります。詳細については，「16.4　COBOL実行単位の終了」を参照してください。

CプログラムからCOBOLプログラムを呼び出して，浮動小数点型データの引数渡しをする場合，Cプログラムでプロトタイプ宣言を行い，データ型を明確にする必要があります。また，COBOLプログラムの受け取り側作用対象は，次の規則に従う必要があります。

単精度浮動小数点型データの引数渡しをする場合，受け取り側作用対象の属性はCOMP-1とする。

倍精度浮動小数点型データの引数渡しをする場合，受け取り側作用対象の属性はCOMP-2とする。

CプログラムからCOBOLプログラムを呼び出す場合，呼び出し規則を合わせる必要があります。Windows(x86) COBOL2002の場合，-DllオプションでCdeclサブオプションを指定した場合，COBOLプログラムに対するCプログラムのプロトタイプ宣言は，cdeclでなければなりません。また，-DllオプションでStdcallサブオプションを指定した場合，COBOLプログラムに対するCプログラムのプロトタイプ宣言は，stdcallでなければなりません。

手続き部見出しにRETURNING指定がある場合，COBOLプログラムの返却項目は，そのデータ項目に対応したC言語のデータ型にしなければなりません。RETURNING指定がない場合はint型にしなければなりません。

Cプログラムでは，COBOLプログラムの手続き部見出しのRETURNINGのデータ項目（返却項目）に設定した戻り値を参照できます。RETURNING指定がない場合は，RETURN-CODE特殊レジスタを参照します。

CプログラムからCOBOLプログラムを呼ぶ場合は，C実行時ライブラリに，マルチスレッドに対応したダイナミックリンクライブラリを使用する必要があります。マルチスレッド対応COBOLプログラムについては，「26.　マルチスレッド環境での実行」を参照してください。

利用者定義関数やメソッド定義は，Cプログラムから呼び出せません。

(2)　COBOLのデータ項目とCプログラムの型の対応

COBOLとCのデータ型の対応を，次に示します。引数や戻り値などでデータを受け渡す場合は，この規則に従う必要があります。

表19‒1　COBOLのデータ項目とCプログラムの型の対応

COBOL

C

char

unsigned char

short

unsigned short

int,

long

unsigned int,

unsigned long

_int64

unsigned _int64

float

double

ポインタ

構造体

固定長集団項目

×

×

○※1

可変長集団項目

×

×

×

英字項目

○※2

○※2

×

×

英数字項目

○※2

○※2

×

×

英数字編集項目

×

×

外部10進項目

○※3

○※3

×

×

内部10進項目

×

×

2進項目

○※4

○※4

○※5

○※5

○※6

○※6

○※1¹

○※1¹

×

×

COMP-X

○※7

○※7

○※8

○※8

○※9

○※9

○※1²

○※1²

×

×

数字編集項目

×

×

外部浮動小数点数字項目

×

×

単精度内部浮動小数点数字項目

×

×

×

×

×

×

×

×

○※10

×

×

×

倍精度内部浮動小数点数字項目

×

×

×

×

×

×

×

×

×

○※10

×

×

アドレスデータ項目

×

×

○

指標データ項目

×

×

日本語項目

×

×

日本語編集項目

×

×

外部ブール項目

×

×

内部ブール項目

×

×

英数字定数

○※2

○※2

×

×

数字定数

○

×

×

浮動小数点数字定数

×

×

×

×

×

×

×

×

×

○

×

×

ZERO

○

×

×

NULL

×

×

○

オブジェクト参照項目

×

×

OLEオブジェクト参照データ項目

×

×

バリアントデータ項目

×

×

強く型付けされた集団項目

×

×

（凡例）

○：指定できる

空白：受け渡しできるかどうかはプラットフォームに依存するため，動作保証についてはユーザ責任とする

×：指定してはならない。指定したときの結果は保証しない

注※1

COBOLの集団項目を受け渡しする場合，Cプログラムでの境界調整を考慮して引数のデータ項目を定義する必要があります。

COBOLの集団項目は，標準では各基本項目がすき間なく配置されるのに対し，Cプログラムでは計算機固有の境界に従って配置されます。このため，あらかじめ境界調整される分の未使用領域を定義しておくなど，計算機固有の境界調整を意識したデータを定義しておくことを推奨します。

なお，COBOLでは，SYNCHRONIZED句を指定することで計算機固有の境界調整に従って各基本項目を配置できます。

注※2

標準文字集合で1文字の場合はchar型，2文字以上の場合は次の構造体と対応づけます（nは文字数，nameは任意のフィールド名とします）。

struct {

　　char name[n];

};

注※3　SEPARATE指定なしの1けたです。

注※4　-Bin1Byteオプションの指定がある場合，1〜2けた（割り当てられる記憶域のサイズが1バイト）の整数です。

注※5

-Bin1Byteオプションの指定がない場合，1〜4けたの整数です。

-Bin1Byteオプションの指定がある場合，3〜4けた（割り当てられる記憶域のサイズが2バイト）の整数です。

注※6　5〜9けたの整数です。

注※7　割り当てられる記憶域のサイズが1バイトの場合，指定できます。

注※8　割り当てられる記憶域のサイズが2バイトの場合，指定できます。

注※9　割り当てられる記憶域のサイズが4バイトの場合，指定できます。

注※10　CプログラムからCOBOLプログラムに引数を渡す場合，プロトタイプ宣言が必要です。

注※11　10〜18けたの整数です。

注※12　割り当てられる記憶域のサイズが8バイトの場合，指定できます。

(3)　引数の受け渡し

CプログラムからCOBOLプログラムへ引数を渡す方法を，次に示します。

(a)　引数をポインタ型で受け取る例

Cプログラム

int SAMPLE2(int *,char *);
    :
int SAMPLE1(....)
{
int  cnt;
char  str[80];
    :
  SAMPLE2(&cnt,str);
    :
  return(0);
}

COBOLプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
           :
       LINKAGE SECTION.
       01 CNT PIC S9(9) USAGE COMP.
       01 STR PIC X(80).

       PROCEDURE DIVISION USING BY REFERENCE CNT STR.
           :

CプログラムからCOBOLプログラムへ引数がアドレスによって渡された場合，COBOLプログラム内で受け取る引数にBY VALUEを指定してはいけません。

COBOLプログラムは，Cプログラムから数字項目を受け取る場合，内部・外部10進項目，内部・外部浮動小数点数字項目などの数字属性を意識する必要があります。

(b)　引数を値渡しで受け取る例

Cプログラム

int  SAMPLE2(int,char);
int  SAMPLE1(....)
{
int  cnt;
char  str;
    :
  SAMPLE2(cnt,str);
    :
  return(0);
}

COBOLプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
           :
       LINKAGE SECTION.
       01 CNT PIC S9(9) USAGE COMP.
       01 STR PIC X(1).

       PROCEDURE DIVISION USING BY VALUE CNT STR.
           :

CプログラムからCOBOLプログラムへ引数が値渡しされた場合，PROCEDURE DIVISION USINGでBY VALUE指定する必要があります。

Cプログラム内で設定する引数は，すべて値渡しである必要があります。

COBOLのデータ項目とCプログラムの型の対応については，「表19‒1　COBOLのデータ項目とCプログラムの型の対応」を参照してください。

(4)　戻り値の受け渡し

COBOLプログラムからCプログラムへ戻り値を返す方法を，次に示します。

(a)　整数型のデータ項目を返す例

Cプログラム

extern int SAMPLE2();
    :
int main()
    {
    int rtc;
    :
    rtc = SAMPLE2();
    :
    }

COBOLプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
           :
       LINKAGE SECTION.
       01 RTC PIC S9(9) USAGE COMP.
       PROCEDURE DIVISION RETURNING RTC.
           :
           MOVE 12345 TO RTC.
           EXIT PROGRAM.

(b)　構造体型のデータ項目を返す例

Cプログラム

struct tbl{ int a; char b[10];};
extern struct tbl SAMPLE2();
int main()
    {
  struct tbl rtc;
    :
    rtc = SAMPLE2();
    :
    }

COBOLプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
           :
       LINKAGE SECTION.
       01 TBL.
         02 A PIC S9(9) USAGE COMP.
         02 B PIC X(10).

       PROCEDURE DIVISION RETURNING TBL.
           :
           EXIT PROGRAM.

注意事項

C言語の構造体の場合，要素の境界調整でパディング（領域間のギャップを埋めるために挿入される暗黙のFILLER項目）が挿入されます。そのほかに，構造体のサイズを最大の基本要素サイズの倍数に切り上げるため，パディングが挿入されることがあります。この場合，パディングは構造体の末尾に挿入されます。例えば上記の例の構造体tblの場合，要素の合計のサイズはCOBOLの集団項目TBLと同じ14バイトですが，構造体のサイズを4バイト（最大の基本要素のサイズ）の倍数の16バイトにするために，2バイトのパディングが構造体の末尾に挿入されます。このため，COBOLの集団項目TBLとはサイズが不一致になります。プラットフォームによっては，このサイズの不一致が原因で，引数や戻り値の受け渡しで異常終了や結果不正となることがあるため，次のどちらかの方法でC言語の構造体のサイズとCOBOLの集団項目のサイズを一致させる必要があります。

C言語の構造体のサイズをCOBOLの集団項目のサイズに合わせる方法

構造体を詰めて配置するC言語の機能（C言語の言語仕様の#pragma packやC言語のコンパイラのコンパイラオプションで提供されている）を使って構造体tblのサイズを14バイトにします。構造体を詰めて配置するC言語の機能については，各システムのCコンパイラのリファレンスを参照してください。

COBOLの集団項目のサイズをC言語の構造体のサイズに合わせる方法

COBOLの集団項目TBLのサイズを16バイトにするために，COBOLの集団項目TBLの末尾に次の2バイト分のFILLER項目を追加してください。

　　02 FILLER PIC X(2).

19.1.3　COBOLプログラムからCプログラムを呼び出す方法

COBOLプログラムからCプログラムを呼ぶときの規則を示します。

(1)　COBOLからCを呼ぶときの規則

COBOLプログラムを-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInfまたは-DebugRangeオプション指定でコンパイルし，Cプログラムで例外処理をした場合，異常終了時の結果は保証しません。

Cプログラム内で宣言された外部変数，およびCOBOLプログラム内の外部属性を持つデータ項目はそれぞれのプログラムで参照できます。外部属性を持つデータ項目の参照方法については，「19.1.5　外部属性を持つデータ項目の共用」を参照してください。

COBOLプログラムは，Cプログラムのreturn文で設定された関数値をRETURN-CODE特殊レジスタとして参照できます。Cプログラムが返す関数値の有効な範囲については，「17.2　復帰コードと返却項目」を参照してください。

COBOLプログラムからCプログラムを呼び出して，内部浮動小数点項目の引数渡しをする場合，受け取りのデータ型は次の規則に従う必要があります。

単精度内部浮動小数点項目の引数渡しをする場合，受け取りのデータ型はfloatとする。

倍精度内部浮動小数点項目，または浮動小数点数字定数の引数渡しをする場合，受け取りのデータ型はdoubleとする。

COBOLプログラムから呼び出されるCプログラムの呼び出し規則がstdcallの場合，次のどちらかをしておく必要があります。

呼び出すCOBOLプログラムを-StdCallオプションを指定してコンパイルし，stdcall呼び出し規約のプログラム名称を記述した.cbwファイルを作成する。

EXTERNAL-PROGRAM SECTIONのCALL-CONVENTION段落で，プログラムをstdcall呼び出し規約にしておく。

CALL文にRETURNING指定がある場合，Cプログラムの戻り値は，そのデータ項目に対応したC言語のデータ型にする必要があります。RETURNING指定がない場合はint型にする必要があります。

COBOLプログラムでは，Cプログラムのreturn文で設定した戻り値を，呼び出されたCALL文に指定したRETURNINGのデータ項目として参照できます。RETURNING指定がない場合はRETURN-CODE特殊レジスタで参照します。

CALL 一意名でCプログラムを呼ぶ場合，次の点に注意する必要があります。

DLL中のCプログラムを呼ぶ場合，DLLのエクスポート情報中にプログラム名がなければなりません。このため，DLL作成時にモジュール定義ファイル（.def）を使用する場合は，EXPORTS文で関数に対してNONAME指定をしてはなりません。NONAMEを指定したプログラムはCALL 一意名では呼び出せません。

実行可能ファイル（.exe）と静的にリンクしたオブジェクト中のCプログラムを呼ぶ場合，実行可能ファイルのエクスポート情報中にプログラム名がなければなりません。このため，Cプログラムは，次のように記憶クラス属性としてdllexportを指定しておく必要があります。dllexportを指定していないCプログラムを静的にリンクした場合，CALL 一意名では呼び出せません。

（例）

__declspec( dllexport ) void sub();

Cプログラムの属性を__stdcallとする場合は，記憶クラス属性としてdllexportを指定し，リンク時はモジュール定義ファイル（.def）を指定してはいけません。dllexport指定がないか，またはモジュール定義ファイルのEXPORTS文でプログラム名が指定されている場合，そのプログラムはCALL 一意名では呼び出せません。

Cプログラムの属性を__cdeclとする場合，記憶クラスとしてdllexportを指定するか，またはモジュール定義ファイルのEXPORTS文でプログラム名を指定しなければなりません。

(2)　Cプログラムの型とCOBOLでの宣言

Cプログラムのデータ型と，対応するCOBOLのデータ項目の型を，次に示します。

Cプログラムのデータ型

対応するCOBOLのデータ項目の型

unsigned char

-Bin1Byte指定あり

符号なし2進項目（1〜2けた）

9(1) COMP 〜 9(2) COMP

-Bin1Byte指定なし

9(1) COMP-X 〜 9(2) COMP-X

−

英数字項目（1けた）

X(1)

char

-Bin1Byte指定あり

符号付き2進項目（1〜2けた）

S9(1) COMP 〜 S9(2) COMP

−

英数字項目（1けた）

X(1)

unsigned short

−

符号なし2進項目（3〜4けた）

9(3) COMP 〜 9(4) COMP
9(3) COMP-X 〜 9(4) COMP-X

short

−

符号付き2進項目（3〜4けた）

S9(3) COMP 〜 S9(4) COMP

unsigned int

−

符号なし2進項目（5〜9けた）

9(5) COMP 〜 9(9) COMP
9(5) COMP-X 〜 9(9) COMP-X

int

−

符号付き2進項目（5〜9けた）

S9(5) COMP 〜 S9(9) COMP

unsigned long

−

符号なし2進項目（5〜9けた）

9(5) COMP 〜 9(9) COMP
9(5) COMP-X 〜 9(9) COMP-X

long

−

符号付き2進項目（5〜9けた）

S9(5) COMP 〜 S9(9) COMP

unsigned _int64

−

符号なし2進項目（10〜18けた）

9(10) COMP 〜 9(18) COMP
9(10) COMP-X 〜 9(18) COMP-X

_int64

−

符号付き2進項目（10〜18けた）

S9(10) COMP 〜 S9(18) COMP

float

−

単精度内部浮動小数点数字項目

COMP-1

double

−

倍精度内部浮動小数点数字項目

COMP-2

ポインタ型

−

アドレス名，アドレスデータ項目

ADDRESS

配列型

−

アドレスデータ項目

ADDRESS

構造体※

−

集団項目

−

（凡例）

−：該当しない

注※

COBOLの集団項目を受け渡しする場合，Cプログラムでの境界調整を考慮して引数のデータ項目を定義する必要があります。

COBOLの集団項目は，標準では各基本項目がすき間なく配置されるのに対し，Cプログラムでは計算機固有の境界に従って配置されます。このため，あらかじめ境界調整される分の未使用領域を定義しておくなど，計算機固有の境界調整を意識したデータを定義しておくことを推奨します。

なお，COBOLでは，SYNCHRONIZED句を指定することで計算機固有の境界調整に従って各基本項目を配置できます。

(3)　引数の受け渡し

COBOLプログラムからCプログラムへ引数を渡す方法を，次に示します。

(a)　引数をポインタ型で引き渡す例

COBOLプログラム

           :
       WORKING-STORAGE SECTION.
       01 CNT PIC S9(9) USAGE COMP.
       01 STR.
         02 STRCHAR PIC X(79).
         02 FILLER  PIC X VALUE LOW-VALUE.
           :
       PROCEDURE DIVISION.
           :
         CALL 'sample2' USING BY REFERENCE CNT STR.
           :

Cプログラム

int  sample2(int *cnt, char *str)
{
    :
  return(0);
}

COBOLプログラムからCプログラムにBY VALUE指定なしで引き渡す引数は，すべてポインタ型として引き渡されます。このため，Cプログラム内で受け取る引数は，すべてポインタ型で宣言する必要があります。

Cプログラムは，COBOLプログラムから数字項目を受け取る場合，内部・外部10進項目，内部・外部浮動小数点数字項目などの数字属性を意識する必要があります。

(b)　引数を値渡しで引き渡す例

COBOLプログラム

           :
       WORKING-STORAGE SECTION.
       01 CNT PIC S9(9) USAGE COMP.
       01 STR PIC X(1).
           :
       PROCEDURE DIVISION.
           :
         CALL 'sample2' USING BY VALUE CNT STR.
           :

Cプログラム

int  sample2(int cnt, char str)
{
    :
  return(0);
}

Cプログラム内で受け取る引数は，BY VALUE指定の場合は値渡しで受け取ります。CALL文のBY VALUEで指定したCOBOLのデータ項目に対するC言語のデータ型の対応については，「表19‒1　COBOLのデータ項目とCプログラムの型の対応」を参照してください。

BY VALUE指定時，引数は次のように設定されます。

単精度内部浮動小数点数字項目は4バイトで，倍精度内部浮動小数点数字項目は8バイトで設定されます。

数字定数，およびZEROは4バイトの2進形式として設定されます。

浮動小数点数字定数は倍精度浮動小数点形式として設定されます。

(c)　CALL文の引数にADDRESS OF 一意名，LENGTH OF 一意名を指定した例

COBOL主プログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WK-1.
         02 W01    PIC X(30)
            VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234'.
         02 FILLER PIC X VALUE LOW-VALUE. …5.
       PROCEDURE  DIVISION.
           CALL 'SAMPLE2'
                USING BY REFERENCE WK-1. …1.
           CALL 'SAMPLE3'
                USING BY REFERENCE ADDRESS OF WK-1. …2.
           CALL 'SAMPLE4'
                USING BY CONTENT LENGTH  OF WK-1. …3.
           CALL 'SAMPLE5'
                USING BY VALUE LENGTH  OF WK-1. …4.
           STOP RUN.
       END PROGRAM SAMPLE1.

C副プログラム

#include <stdio.h>
 int SAMPLE2(char *p_ptr_r)
 {
   printf("first char(r) =(%s)¥n",p_ptr_r);   … 1.
    :
 }
 int SAMPLE3(char **p_ptr_ra)
 {
   printf("first char(ra)=(%s)¥n",*p_ptr_ra);   … 2.
    :
 }
 int SAMPLE4(
     int *p_ptr_cl  /* この引数の型はWindows(x86)の場合   */
                    /* Windows(x64)の場合は _int64 *      */
     )
 {
   printf("length(p)     =(%d)¥n",*p_ptr_cl);   … 3.
                    /* この書式指定はWindows(x86)の場合   */
                    /* Windows(x64)の場合は %I64d         */
    :
 }
 int SAMPLE5(
     int p_ptr_vl   /* この引数の型はWindows(x86)の場合   */
                    /* Windows(x64)の場合は _int64        */
     )
 {
   printf("length(p)     =(%d)¥n",p_ptr_vl);   … 4.
                    /* この書式指定はWindows(x86)の場合   */
                    /* Windows(x64)の場合は %I64d         */
    :
 }

BY REFERENCE指定のCALL文で渡される値は，指定された一意名のアドレスです。

ADDRESS OFで修飾した場合に渡される値は，一意名のアドレスではなく，一意名のアドレスが入っている領域のアドレスとなります。

LENGTH OFで修飾したCONTENT指定では，一意名の長さが入っている領域のアドレスが渡されます。

LENGTH OFで修飾したVALUE指定では，一意名の長さが値として渡されます。

Cプログラム中で文字列として参照するため，COBOLプログラム中で英数字項目の終端にNULL文字（X'00'）を設定しています。

BY REFERENCE指定で渡される引数の値

実行結果

first char(r) =(ABCDEFGHIJKLMNOPQRSTUVWXYZ1234)
    :
first char(ra)=(ABCDEFGHIJKLMNOPQRSTUVWXYZ1234)
    :
length(p)     =(31)
    :
length(p)     =(31)
    :

(4)　戻り値の受け渡し

CプログラムからCOBOLプログラムへ戻り値を返す方法を，次に示します。

(a)　整数型のデータ項目をリターンする例

COBOLプログラム

       WORKING-STORAGE SECTION.
       01 RTC PIC S9(9) USAGE COMP.
           :
       PROCEDURE DIVISION.
           :
           CALL 'sample2' RETURNING RTC.

Cプログラム

int sample2()
  {
  int rtc;
    :
  return (rtc);
  }

(b)　構造体型のデータ項目をリターンする例

構造体型のデータ項目をリターンする場合，COBOLプログラムとCプログラムでは境界調整によってデータのマッピング方法が異なることがあるので注意が必要です。

COBOLプログラム

       WORKING-STORAGE SECTION.
       01 TBL.
         02 A PIC S9(9) USAGE COMP.
         02 B PIC X(10).
           :
       PROCEDURE DIVISION.
           :
           CALL 'sample2' RETURNING TBL.

Cプログラム

struct tbl {int a; char b[10];};
struct tbl sample2()
{
    struct tbl rtn;
    :
    return (rtn);
}

19.1.4　注意事項

C言語の構造体の場合，要素の境界調整でパディング（領域間のギャップを埋めるために挿入される暗黙のFILLER項目）が挿入されます。そのほかに，構造体のサイズを最大の基本要素サイズの倍数に切り上げるため，パディングが挿入されることがあります。この場合，パディングは構造体の末尾に挿入されます。例えば上記の例の構造体tblの場合，要素の合計のサイズはCOBOLの集団項目TBLと同じ14バイトですが，構造体のサイズを4バイト（最大の基本要素のサイズ）の倍数の16バイトにするために，2バイトのパディングが構造体の末尾に挿入されます。このため，COBOLの集団項目TBLとはサイズが不一致になります。プラットフォームによっては，このサイズの不一致が原因で，引数や戻り値の受け渡しで異常終了や結果不正となることがあるため，次のどちらかの方法でC言語の構造体のサイズとCOBOLの集団項目のサイズを一致させる必要があります。

C言語の構造体のサイズをCOBOLの集団項目のサイズに合わせる方法

構造体を詰めて配置するC言語の機能（C言語の言語仕様の#pragma packやC言語のコンパイラのコンパイラオプションで提供されている）を使って構造体tblのサイズを14バイトにします。構造体を詰めて配置するC言語の機能については，各システムのCコンパイラのリファレンスを参照してください。

COBOLの集団項目のサイズをC言語の構造体のサイズに合わせる方法

COBOLの集団項目TBLのサイズを16バイトにするために，COBOLの集団項目TBLの末尾に次の2バイト分のFILLER項目を追加してください。

　　02 FILLER PIC X(2).

C言語のシステム関数※は，#defineによって実際の関数名とは別の関数名で宣言され，マクロ展開後に置き換えられることがあります。COBOLではC言語のマクロは展開しないため，COBOLプログラムからC言語のシステム関数をCALL文で直接呼び出すと，COBOLからマクロ展開前の関数名を呼び出し，予期せぬ不具合が発生するおそれがあります。

COBOLプログラムからC言語のシステム関数を呼び出す場合は，直接呼び出さないで，システム関数を呼び出すCプログラムを作成し，このCプログラムを呼び出すようにしてください。

注※

Microsoft C／C++の関数

19.1.5　外部属性を持つデータ項目の共用

COBOLプログラムで定義した外部属性を持つデータ項目をCプログラムと共有する方法を，次に示します。

なお，外部属性を持つデータ項目の共有属性については，「4.2.2　外部属性（EXTERNAL句）」を参照してください。

COBOLプログラム

                      :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 EXTREC IS EXTERNAL.        ………… EXTERNAL領域定義
         02 EXT-REC1 PIC S9(9) USAGE COMP.
         02 EXT-REC2 PIC S9(4) USAGE COMP.
         02 EXT-REC3 PIC X(14).
                      :

Cプログラム

struct extarea{
    int   ext_rec1;
    short ext_rec2;
    char  ext_rec3[14];
};
int sample2()
{
  extern struct extarea EXTREC;  ……… 外部参照宣言
  if (EXTREC.ext_rec1 == 1){
      EXTREC.ext_rec2 = 2;
  }
  return(0);
}

COBOLプログラムで外部属性を持つデータ項目を指定した場合，Cプログラムからこれを参照，更新できます。このときの注意事項を次に示します。

Cプログラムで参照する外部変数名には，COBOLプログラムで定義したデータ項目の名称を使用してください。ただし，-EquivRule,NotAnyオプションが指定されていない場合，COBOLプログラム中のデータ項目名に英小文字を用いると英大文字に変換されるので，外部変数名に英小文字は使用できません。

また，外部変数名には，2バイトコードや，ハイフン（-），下線（_），#なども使用できません。

COBOLプログラム内で定義するデータ項目の名称は，最外側のプログラム名と異なる名称にしてください。

Cプログラムとの間では，EXTERNAL句による属性チェックはされません。このため，Cプログラムで外部属性を持つデータ項目の参照，および更新する場合，各データ項目の属性，位置，サイズを同じにする必要があります。

EXTERNAL句にINDEXED BY指定をした場合，Cプログラムからの参照や更新はできません。

EXTERNAL句にDYNAMICを指定した場合，Cプログラムからの参照や更新はできません。

外部属性を持つデータ項目が日本語の場合，Cプログラムからの参照や更新はできません。

19.1.6　COBOLプログラムとCプログラムのリンク方法

COBOLプログラムとCプログラムをリンクする方法については，「35.　実行可能ファイルとDLLの作成」を参照してください。

19.2　Visual Basicとの連携（Windows(x86) COBOL2002で有効）

Visual Basicプログラムから，DLLとして作成されたCOBOLプログラムを呼び出せます。

また，Visual Basicプログラムで作成したDLL（インプロセスサーバ）をCOBOLプログラムから呼び出せます。この場合，COBOL2002のOLE2オートメーションクライアント機能を使用してください。詳細は，「25.　OLE2オートメーション機能」を参照してください。

ここでは，COBOLプログラムとVisual Basic 6.0プログラムの連携方法について説明します。

19.2.1　Visual BasicからCOBOLを呼び出すときの規則

Visual BasicプログラムからCOBOLプログラムを呼ぶときの規則を，次に示します。

Visual Basicプログラムは，COBOLプログラムのRETURN-CODE特殊レジスタで設定された戻り値を，関数の戻り値として参照できます。COBOLプログラムが返す戻り値の有効な範囲については，「17.　プログラム間の引数と返却項目」を参照してください。

Visual BasicプログラムからGUIモードのCOBOLプログラムを呼び出す場合は，最初のCOBOLプログラムを呼び出す前に，CBLGINTサービスルーチンを呼び出す必要があります。詳細は，「16.3　COBOLプログラムのモード」を参照してください。

Visual BasicプログラムからCOBOLプログラムを呼び出す場合，COBOL主プログラムとCOBOL副プログラムによってGOBACK文，EXIT PROGRAM文の動作が異なります。詳細については，「16.4　COBOL実行単位の終了」を参照してください。

Visual BasicプログラムからCOBOLプログラムを呼び出す場合，DLLの関数宣言で呼び出し規則に合わせたエイリアスを指定する必要があります。

また，呼び出されるCOBOLプログラムは，stdcall呼び出し規約でなければなりません。

エイリアス名称

_プログラム名@n

n

次の計算式で求められる値を指定します。

n =（引数の数×4） +

（値渡しで受け取る倍精度浮動小数点数字項目引数の数×4）

（例）

プログラム名がSAMPLE1で，2進項目と倍精度浮動小数点数字項目の引数を値渡しにする場合の関数宣言

Private Declare Sub SAMPLE1 Lib "COB1.DLL"
  Alias "_SAMPLE1@12" (ByVal A As Long, ByVal B As Double)

手続き部見出しにRETURNING指定がある場合，COBOLプログラムの返却項目は，そのデータ項目に対応したVisual Basicのデータ型にしなければなりません。RETURNING指定がない場合はlong型にしなければなりません。

Visual Basicプログラムでは，COBOLプログラムの手続き部見出しのRETURNINGのデータ項目（返却項目）に設定した戻り値を参照できます。RETURNING指定がない場合は，RETURN-CODE特殊レジスタを参照します。

Visual Basicから呼び出されるCOBOLプログラムは，stdcall呼び出し規約でなければなりません。cdecl呼び出し規約のプログラムは，呼び出せません。

19.2.2　COBOLプログラムのデータ型とVisual Basicでの宣言

整数値，文字列，およびユーザ定義型について，Visual BasicとCOBOLのデータ型の対応を，次に示します。

表19‒2　Visual BasicとCOBOLのデータ型の対応

データ型

Visual Basic

（送り出し側作用対象）

COBOL

（受け取り側作用対象）

バイト型

Dim a As Byte

01 a PIC 9(1) COMP-X

整数型

Dim a As Integer

01 a PIC S9(4) COMP

長整数型

Dim a As Long

01 a PIC S9(9) COMP

可変長文字列

Dim a As String

01 a PIC X(n)

固定長文字列

Dim a As String * 10

01 a PIC X(n)

ユーザ定義型

Type UserDef
  x As Integer
End Type
Dim a As UserDef

01 a
  02 x PIC 9(1) COMP-X

（凡例）

n：文字列の長さを示す

バイト型，整数型，長整数型の場合

引数を渡す方法として，値渡し（ByVal）と参照渡し（ByRef）を使用できます。

値渡しを使用する場合，COBOLプログラムで値を変更しても，Visual Basicのデータ項目の内容には影響を与えません。

参照渡しを使用する場合，COBOLプログラムで値を変更すると，Visual Basicのデータ項目の内容も変更されます。

可変長文字列，固定長文字列の場合

引数を渡す方法として，値渡し（ByVal）を使用できません。Visual BasicとCOBOLでの引数の属性は，次の組み合わせとなります。

Visual Basic 値渡し（ByVal）　→　COBOL参照渡し（BY REFERENCE）

ユーザ定義型の場合

ユーザ定義型は，COBOLの集団項目に対応します。ただし，ユーザ定義型に可変長文字列が含まれる場合，アドレスデータ項目を使用して，ポインタ処理をしなければなりません。

19.2.3　引数の受け渡し

Visual BasicプログラムからCOBOLプログラムへ引数を渡す方法を，次に示します。

(1)　整数型，ユーザ定義型のデータ項目を渡す例

Visual Basicプログラム

Private Declare Sub COBSUB Lib "SAMPLE1" _
                     Alias "_SAMPLE1@12" _
                     (ByVal a As Integer, _
                      ByRef a As Integer, _
                      ByRef a As UserDef)
Private Declare Sub CBLGINT Lib "CBL85RT" Alias "_CBLGINT@0" ()
Private Declare Sub CBLEND Lib "CBL85RT" Alias "_CBLEND@0" ()

Dim PARM1 As Integer
Dim PARM2 As Integer

Private Type UserDef
  U_INT1 As Integer
  U_INT2 As Integer
End Type
Dim PARM3 As UserDef

Private Sub Command1_Click()
             ：
    Call SAMPLE1(PARM1, PARM2, PARM3)
             ：
End Sub

Private Sub Form_Load()
           ：
   Call CBLGINT
           ：
End Sub

Private Sub Form_Unload(Cancel As Integer)
           ：
    Call CBLEND
           ：
End Sub

COBOLプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       LINKAGE SECTION.
       01 L-PARM1  PIC S9(04) USAGE COMP.
       01 L-PARM2  PIC S9(04) USAGE COMP.
       01 L-PARM3.
         02 U-INT1 PIC S9(04) USAGE COMP.
         02 U-INT2 PIC S9(04) USAGE COMP.
       PROCEDURE DIVISION USING BY VALUE     L-PARM1
                                BY REFERENCE L-PARM2
                                BY REFERENCE L-PARM3.
           ADD 100 TO L-PARM1.
           ADD 100 TO L-PARM2.
           ADD 100 TO U-INT1.
           ADD 100 TO U-INT2.

           EXIT PROGRAM.

Visual BasicプログラムからCOBOLプログラムに引数が値渡しで渡された場合，COBOLプログラム内で受け取る引数には，BY VALUEを指定しなければなりません。また，参照渡しで渡される場合，COBOLプログラム内で受け取る引数には，BY REFERENCEを指定しなければなりません。

COBOLプログラムがVisual Basicプログラムから数字項目を受け取る場合は，内部・外部10進項目，内部・外部浮動小数点項目などの数字属性を意識する必要があります。

19.3　Javaとの連携

19.3.1　概要

JavaプログラムからCOBOLプログラムを呼び出せます。ここでは，JavaプログラムとCOBOLプログラムの連携の手順について説明します。

Javaアプリケーションサーバを利用して既存のCOBOLプログラムを使ったWeb環境を構築する場合は，Cosminexus連携機能，およびTP1サーバ用Cosminexus連携機能を使用します。これらの機能を使用すると，Java言語の他言語インタフェース機能（Java Native Interface）処理とデータ交換処理をラッピングするJavaクラスを自動生成できるため，開発期間を短縮できます。また，COBOLプログラムで発生したエラー情報などを取得する例外メソッドを用意しているので，このAPIを使って例外処理を備えた実行環境を構築できます。

Cosminexus連携機能の詳細については，マニュアル「COBOL2002　Cosminexus連携機能ガイド」を参照してください。

TP1サーバ用Cosminexus連携機能を使用するには，次の製品が必要です。

JavaからTP1環境下のCOBOL SPP（Service Providing Program）のサービスを利用する場合（TP1サーバ用Cosminexus連携機能）に必要な製品

開発環境：

TP1/COBOL adapter for Cosminexus Version 2

サーバ実行環境：

TP1/COBOL 拡張 Server Run Time System for Cosminexus Version 2

TP1サーバ用Cosminexus連携機能の詳細については，マニュアル「TP1/COBOL adapter for Cosminexus　ユーザーズガイド」を参照してください。

なお，COBOLプログラムからJavaプログラムを直接呼び出せません。Javaプログラム呼び出し機能を使用してください。

Javaプログラム呼び出し機能の詳細については，マニュアル「COBOL2002　Javaプログラム呼び出し機能ガイド」を参照してください。

(1)　概要

JavaプログラムからCOBOLプログラムを呼び出すには，Java言語の他言語インタフェース機能（Java Native Interface）を利用します。したがって，Java言語の他言語インタフェース機能の制限に基づいて，Javaから呼び出されるCOBOLプログラムはstdcall呼び出し規約のDLL形式で作成する必要があります。

また，JavaプログラムからCOBOLプログラムを呼び出す場合には，COBOLプログラムの初期化，および終了処理するサービスルーチン（CBLGINT／CBLEND）を呼び出す必要があります。Javaプログラムからは直接サービスルーチンを呼び出せないため，サービスルーチンを呼び出すCプログラムを作成し，JavaプログラムからそのCプログラムを呼び出すようにします。

注意事項

Javaプログラムとのインタフェースは，Sun Microsystems, IncのJava Development Kit（JDK）のバージョン1.1以降を対象とします。

(2)　Javaプログラムとのインタフェースを使ったプログラムの作成手順

Javaプログラムとのインタフェースを使ったプログラムの作成手順を次に示します。

図19‒1　Javaプログラムとのインタフェースを使ったプログラムの作成手順

Javaプログラムのソースファイルを作成する。

JavaソースファイルをコンパイルしてJavaバイトコードを生成する。

JavaバイトコードからC言語ヘッダファイルを生成する。

COBOLプログラムのソースファイルを作成する。

COBOLソースファイルをコンパイルしてCOBOLプログラム（DLL形式）を生成する。

サービスルーチン（CBLGINT／CBLEND）を呼び出すCプログラムのソースファイルを作成する。

CソースファイルをコンパイルしてDLLを生成する。

Javaプログラムを実行する。

なおこの節では，次のような構成でJavaプログラムとのインタフェースの利用手順を説明します。

Java言語での作業

次の作業について説明します。

Java言語のmainメソッドを含むJavaプログラムの作成

COBOLプログラムを呼び出すJavaプログラムの作成

Cプログラムを呼び出すJavaプログラムの作成

COBOL言語での作業

Javaプログラムから呼び出すCOBOLプログラムの作成方法について説明します。

C言語での作業

COBOLプログラムの初期化・終了処理を呼び出すCプログラムの作成方法について説明します。

Javaプログラムの実行

作成したJavaプログラムの実行方法について説明します。

制限事項

Javaプログラムとのインタフェースでの制限事項について説明します。

19.3.2　JavaプログラムからCOBOLプログラムを呼び出す方法

(1)　Java言語での作業

(a)　Javaソースプログラムの作成

COBOLプログラムを呼び出すJavaプログラムでは，次の三つのJavaソースファイルを作成する必要があります。

mainメソッドを含むJavaプログラム（Javaクラス）

COBOLプログラムに対応するJavaプログラム（Javaクラス）

COBOLプログラムの初期化・終了処理をするCプログラムに対応するJavaプログラム（Javaクラス）

mainメソッドを含むJavaプログラム（Javaクラス）

Javaアプリケーションは，「static」属性と「public」属性を持つ「main」という名前のメソッドから実行が開始されます。そのため，この「main」メソッドを含むJavaプログラム（Javaクラス）が必要です。

COBOLプログラムの呼び出し，およびサービスルーチンの呼び出しを含む「main」メソッドを含むクラス「DLLtest」を記述したJavaソースファイル「DLLtest.java」の例を次に示します。

Javaソースファイルの例（DLLtest.java）

public class DLLtest
{
  public static void main (String args[])
  {
   // サービスルーチンを呼び出す
   // Cプログラムに対応するクラスのインスタンスを生成
   DLLcbl2002rt aDLLcbl2002rt = new DLLcbl2002rt ();
   // 呼び出すCOBOLプログラムに対応する
   // クラスのインスタンスを生成
   DLLclass aDLLclass = new DLLclass ();
   // COBOLプログラムの実行環境初期化処理をする
   // サービスルーチンを呼び出す
   aDLLcbl2002rt.cblgint ();
   // COBOLプログラムの呼び出し
   int result = aDLLclass.DLLcobol (10, 20);

   // COBOLプログラムの実行環境終了処理をする
   // サービスルーチンを呼び出す
    aDLLcbl2002rt.cblend ();
   // Javaプログラムの終了
   System.exit (0);
 }
}

COBOLプログラムに対応するJavaプログラム（Javaクラス）

Javaプログラムから他言語プログラムを呼び出す場合には，他言語プログラムに対応するJavaプログラム（Javaクラス）を作成しなければなりません。そのため，呼び出されるCOBOLプログラムに対応するJavaプログラム（Javaクラス）が必要です。

Javaプログラムから呼び出す，他言語プログラムに対応するJavaプログラム（Javaクラス）には，呼び出す他言語プログラムに対応する「native」属性を持つJavaメソッドを定義します。また，他言語プログラムを含むDLLをロードするstatic命令も含んでいる必要があります。

COBOLプログラムに対応するJavaプログラム（Javaクラス）の例と，この例で仮定している名称を次に示します。

Javaソースファイル（DLLclass.java）

class DLLclass {
 // 呼び出されるCOBOLプログラムに対応する
 // メソッドプロトタイプを定義する
 public native int DLLcobol (int arg1, int arg2);
 // 呼び出されるCOBOLプログラムを含むDLLをロードする
 static {
   System.loadLibrary ("DLLfunc");
 }
}

表19‒3　例で仮定している名称

名称

意味

DLLcobol

呼び出されるCOBOLプログラムに対応するJavaメソッドのメソッド名

DLLfunc.dll

呼び出されるCOBOLプログラムを含むDLLのファイル名

DLLclass

呼び出されるCOBOLプログラムに対応するJavaメソッドを含むJavaプログラム（Javaクラス）のクラス名

DLLclass.java

DLLclassを記述したソースファイルのファイル名

注意事項

他言語プログラムに対応するJavaメソッドの宣言には，「native」を指定します。「native」指定は，Java言語以外の言語で実装されたメソッドであることを表します。なお，メソッドの本体は記述しません。

「native」が指定されたJavaメソッドに対応する他言語プログラムのプログラム名は，Javaメソッド名を変換した名前でなければなりません。詳細は，「19.3.2　JavaプログラムからCOBOLプログラムを呼び出す方法」の「(2)　COBOL言語側の作業」を参照してください。

「loadLibrary」メソッドの引数には，呼び出す他言語プログラムを含むDLLのファイル名（拡張子は除く）を指定します。

COBOLプログラムの初期化・終了処理をするCプログラムに対応するJavaプログラム（Javaクラス）

COBOLプログラムに対応するJavaプログラム（Javaクラス）と同様に，COBOLプログラムの初期化・終了処理を実行するサービスルーチン（CBLGINT／CBLEND）を呼び出すCプログラムに対応するJavaプログラム（Javaクラス）が必要です。

Cプログラムに対応するJavaプログラム（Javaクラス）の例と，この例で仮定している名称を次に示します。

Javaソースファイルの例（DLLcbl2002rt.java）

class DLLcbl2002rt {
  public native int cblgint ();
  public native int cblend ();
  static {
    System.loadLibrary ("DLLcbl2002rt");
  }
}

表19‒4　例で仮定している名称

名称

意味

DLLcbl2002rt

呼び出すCプログラムを含むDLLのファイル名

DLLcbl2002rt

「native」指定を持つJavaメソッドとDLLをロードする処理を含むJavaクラスのクラス名

DLLcbl2002rt.java

Javaクラス「DLLcbl2002rt」を定義したJavaソースファイルのファイル名

(b)　Javaソースファイルのコンパイル

作成したJavaソースファイルをコンパイルして，Javaバイトコードファイルを生成します。

次に，(a)で作成したJavaソースファイルのコンパイル指定例を示します。

Javaソースファイルのコンパイル指定例

javac DLLtest.java
javac DLLclass.java
javac DLLcbl2002rt.java

上記の指定を実行すると，コンパイル後にJavaバイトコードファイル「DLLtest.class」「DLLclass.class」「DLLcbl2002rt.class」が生成されます。

(c)　ヘッダファイルの生成

生成されたJavaバイトコードファイルの中の，他言語プログラムに対応するJavaプログラム（Javaクラス）のJavaバイトコードファイルから，C言語ヘッダファイルを生成します。このヘッダファイルには，「native」指定のあるJavaメソッドに対応するC言語の関数プロトタイプ宣言が含まれています。

サービスルーチンを呼び出すCプログラムは，このヘッダファイルをインクルードする必要があります。このヘッダファイルは，COBOLプログラム作成時にも必要です。

(b)で生成したJavaバイトコードファイル「DLLclass.class」と「DLLcbl2002rt.class」から，C言語ヘッダファイルを生成させる例を次に示します。

C言語ヘッダファイルの生成指定例

javah -jni DLLclass
javah -jni DLLcbl2002rt

上記の指定を実行すると，C言語ヘッダファイル「DLLclass.h」と「DLLcbl2002rt.h」が生成されます。次に，生成された「DLLclass.h」中のメソッド「DLLcobol」の関数プロトタイプ宣言の例を示します。

JNIEXPORT jint JNICALL Java_DLLclass_DLLcobol
                      (JNIEnv *, jobject, jint, jint);

この例では，Javaメソッドに対応して次のようなC言語の関数が作成されたことになります。

関数の要素

内容

関数名

Java_DLLclass_DLLcobol

引数

4個

関数の戻り値の型

jint

注意事項

javahコマンドには，-jniオプションを指定してください。このオプションを指定すると，Java以外の言語によって実装されたメソッドとのインタフェースであるJava言語の他言語インタフェーススタイルのヘッダファイルが生成されます。

javahコマンドの引数には，「native」指定のあるJavaメソッドを含む，Javaクラスのクラス名を指定します。

(2)　COBOL言語側の作業

(a)　COBOL原始プログラムの記述

Javaプログラムから実際に呼び出されるCOBOLプログラムのソースファイルを作成します。ここで作成するCOBOLプログラムは，次の条件を満たしている必要があります。

COBOLプログラム名は，Javaバイトコードファイルから生成されたヘッダファイル中の，対応するプロトタイプ宣言と同じ名称でなければならない。

COBOLプログラム名は，引用符で囲まなければならない。

COBOLプログラムの引数，戻り値は，Javaバイトコードファイルから生成したヘッダファイル中の，対応するプロトタイプ宣言と同じ個数でなければならない。

COBOLプログラムの引数，戻り値の型は，対応するCOBOLの型でなければならない。

データ型の対応関係については，「19.3.3　Java言語とCOBOL言語のデータ型の対応」を参照してください。

Javaプログラムから呼び出されるCOBOLプログラムの，ソースファイル例を次に示します。

COBOLプログラムのソースファイル例（DLLfunc.cbl）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 'Java_DLLclass_DLLcobol'.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
         01 JNIEnv            USAGE ADDRESS.  …1.
         01 jobject           USAGE ADDRESS.  …1.
         01 arg-1   PIC S9(9) USAGE COMP.  …2.
         01 arg-2   PIC S9(9) USAGE COMP.  …2.
         01 ret-1   PIC S9(9) USAGE COMP.  …3.
       PROCEDURE DIVISION USING BY VALUE
                  JNIEnv jobject arg-1 arg-2  …4.
                   RETURNING ret-1.
      *手続き部本体の記述
           DISPLAY 'arg-1: ' arg-1.
           DISPLAY 'arg-2: ' arg-2.
           COMPUTE ret-1 = arg-1 * arg-2.
           DISPLAY 'ret-1: ' ret-1.
       END PROGRAM 'Java_DLLclass_DLLcobol'.

COBOLプログラムの仮引数「JNIEnv」「jobject」は，必ず指定してください。これらの引数は，Javaの実行時環境を保持するポインタで，Java言語側とインタフェースの同期をとります。

COBOLプログラムの仮引数「arg-1」，「arg-2」は，対応するJavaメソッドの引数「arg1」と「arg2」にそれぞれ対応します。

COBOLプログラムの戻り値「ret-1」は，対応するJavaメソッドの戻り値と対応します。なお，対応するJavaメソッドの型がvoidの場合は，RETURNINGを指定しないでください。

JavaからCOBOLへの引数は，「値渡し」で渡されます。したがって，COBOL側では仮引数に「BY VALUE」を指定する必要があります。

(b)　COBOLソースファイルのコンパイル

作成したCOBOLソースファイルをコンパイルしてstdcall呼び出し規約（Windows(x86) COBOL2002で有効），またはfastcall呼び出し規約（Windows(x64) COBOL2002で有効）のDLLを生成します。

次に，(a)で例に挙げたソースファイル「DLLfunc.cbl」をコマンドプロンプト上からコンパイルする例を示します。

Windows(x86) COBOL2002の場合

ccbl2002 -Dll,Stdcall -DllInit -MainNotCBL -Bin1Byte
         -OutputFile DLLfunc.dll DLLfunc.cbl

Windows(x64) COBOL2002の場合

ccbl2002 -Dll※ -DllInit -MainNotCBL -Bin1Byte
         -OutputFile DLLfunc.dll DLLfunc.cbl

注※

Windows(x64) COBOL2002ではfastcall呼び出し規約を使用するため，サブオプションは指定しません。

注意事項

生成するDLLのファイル名は，Javaプログラムで指定したDLLファイル名と同じでなければなりません。

コンパイラオプションに，-Dll,Stdcall（Windows(x86) COBOL2002で有効），-Dll（Windows(x64) COBOL2002で有効），および-MainNotCBLオプションの指定が必要です。また，初期化属性を持つDLLを作成したい場合は，-DllInitオプションを指定します。

Java言語のデータ型「Boolean」または「byte」をCOBOLプログラムで引数として受け取る場合には，1バイト2進項目を有効とするために-Bin1Byteオプションの指定が必要です。

開発マネージャを使用してDLLを生成する場合，最終生成物の種類に「ダイナミックリンクライブラリ」を選び，リンク処理するように指定してください。また，［プロジェクトの設定］メニューの［実行］から，-MainNotCBLオプションを指定してください。指定方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

(3)　C言語での操作

(a)　Cソースファイルの作成

COBOLプログラムの初期化・終了処理をするサービスルーチン（CBLGINT／CBLEND）を呼び出すCプログラムを作成します。

作成するCプログラムの関数は，Javaバイトコードファイルから生成したC言語ヘッダファイル内の関数プロトタイプ宣言と同じ名称・型・引数である必要があります。

次に，C言語ヘッダファイル「DLLcbl2002rt.h」に対応するCソースファイルの例「DLLcbl2002rt.c」を示します。

Cソースファイルの例（DLLcbl2002rt.c）

#include <windows.h>
#include "DLLcbl2002rt.h"
extern int WINAPI CBLGINT();
extern int WINAPI CBLEND();
JNIEXPORT jint JNICALL
    Java_DLLcbl2002rt_cblgint(JNIEnv *env, jobject obj)
{
   /* サービスルーチンの初期化ルーチンを
      呼び出す */
   CBLGINT();
}

JNIEXPORT jint JNICALL
    Java_DLLcbl2002rt_cblend(JNIEnv *env, jobject obj)
{
   /* サービスルーチンの終了処理ルーチンを
      呼び出す */
 CBLEND();
}

ソース内で使用する関数は，実際にJavaバイトコードファイルから生成されたC言語ヘッダファイル（DLLcbl2002rt.h）中の対応する関数プロトタイプ宣言と同じである必要があります。

(b)　Cソースファイルのコンパイル

作成したCソースファイルをコンパイルし，DLLを生成します。

次に，(a)で作成したCソースファイルをコンパイルする指定例を示します。

Cソースファイルのコンパイル指定例

cl /LD DLLcbl2002rt.c cbl2k_32.lib

注

「cbl2k_32.lib」は，必ず指定してください。これは，COBOL2002で使用できるDLLのインポートライブラリです。指定しない場合，リンクエラーとなります。

上記の例を実行すると，「DLLcbl2002rt.dll」が生成されます。

(4)　プログラムの実行

(a)　環境変数の設定

Javaプログラムを実行する前に，Javaプログラム以外の他言語プログラムを含むDLLがあるパス名を，環境変数PATHに指定する必要があります。環境変数PATHの指定例を次に示します。

環境変数PATHの指定例

生成したCOBOLプログラムのDLL「DLLfunc.dll」，およびCプログラムのDLL「DLLcbl2002rt.dll」が，「d:¥users¥dll」にある場合

   set PATH=d:¥users¥dll;%PATH%

(b)　Javaプログラムの実行

Javaプログラムの実行は，JDKに付属しているJavaインタプリタを使用して実行する方法と，Javaインタプリタを内蔵したWebブラウザから実行する方法があります。

JDK付属のJavaインタプリタを使用して実行する例を次に示します。この場合，「public」属性と「static」属性を持ち，メソッド名が「main」であるメソッドを含むクラスのクラス名（DLLtest）をJavaインタプリタの引数に指定します。

JavaインタプリタでJavaプログラムを実行する例

java DLLtest

19.3.3　Java言語とCOBOL言語のデータ型の対応

(1)　COBOL言語で使用できるJava言語のデータ型と対応

COBOL言語で使用できるJava言語のデータ型と，対応するCOBOLのデータ項目の型，およびC言語でのデータ型を，次に示します。

Javaの型

対応するCOBOLのデータ項目の型

対応するC言語のデータ型

jboolean

-Bin1Byte

指定あり

符号なし2進項目

（1〜2けた）※

9(1) COMP 〜 9(2) COMP

Boolean

-Bin1Byte

指定なし

符号なし2進項目

（1〜2けた）※

9(1) COMP-X 〜 9(2) COMP-X

jbyte

-Bin1Byte

指定あり

符号付き2進項目

（1〜2けた）

S9(1) COMP 〜 S9(2) COMP

byte

jchar

-Bin1Byte

指定あり

符号なし2進項目

（3〜4けた）

9(3) COMP 〜 9(4) COMP

char

-Bin1Byte

指定なし

符号なし2進項目

（1〜4けた）

9(1) COMP 〜 9(4) COMP

符号なし2進項目

（3〜4けた）

9(3) COMP-X 〜 9(4) COMP-X

jshort

-Bin1Byte

指定あり

符号付き2進項目

（3〜4けた）

S9(3) COMP 〜 S9(4) COMP

short

-Bin1Byte

指定なし

符号付き2進項目

（1〜4けた）

S9(1) COMP 〜 S9(4) COMP

jint

−

符号付き2進項目

（5〜9けた）

S9(5) COMP 〜 S9(9) COMP

int

jlong

−

符号付き2進項目

（10〜18けた）

S9(10) COMP 〜 S9(18) COMP

_int64

jfloat

−

単精度内部浮動小数点数字項目

COMP-1

float

jdouble

−

倍精度内部浮動小数点数字項目

COMP-2

double

注※

実際の値は以下の二つだけになります。

0：Java言語でのfalseを意味する

1：Java言語でのtrueを意味する

また，次に示すJava言語でのデータ型は，COBOL言語で使用できません。

オブジェクト型

クラス型

文字列型

すべての型の配列

ただし文字列型は，C言語のサポート関数を作成すると，COBOLで使用できます。詳細は，「19.3.3　Java言語とCOBOL言語のデータ型の対応」の「(2)　Javaの文字列型をCOBOLで使用する方法」を参照してください。

(2)　Javaの文字列型をCOBOLで使用する方法

Javaの言語仕様上，文字列型はすべて Stringクラスのオブジェクトとなっています。そのため，JavaプログラムからCOBOLプログラムを呼び出した時，引数に文字列型を指定しても，COBOLプログラムでは文字列の内容を参照できません。

しかし，Java言語の他言語インタフェース機能（Java Native Interface）には，Java言語のStringオブジェクトをC言語の文字列型に変換できる機能があります。StringオブジェクトをC言語の文字列型に変換するCプログラムを作成し，COBOLプログラムから呼び出すと，COBOLプログラムでJava言語の文字列型を参照できます。

Cプログラムのサポート関数「jstring2string」を記述したCソースファイル「util.c」の例を次に示します。

サポート関数を定義するCソースファイル（util.c）

#include <windows.h>
#include <jni.h>
             /* JDKで使用できるインクルードファイル */
/* Java言語のStringオブジェクトをC言語の
   文字列に変換する */
/* この関数はC言語の文字列での文字列長を返す */
int jstring2string
(char *str,    /* C言語の文字列を格納するバッファ */
 int max,      /* 格納するバッファのサイズ      */
 JNIEnv *env,  /* Java実行時環境のポインタ     */
 jstring jstr) /* Java言語のString文字列      */
{
  const jchar *wstr;
  /* JavaNativeInterfaceの文字列変換機能を利用する */
  /* ただし，この機能によって変換された文字列は
     Unicodeである */
  wstr = (*env)->GetStringChars (env, jstr, 0);
  /* Unicode文字列をシフトJIS文字列に変換する */
  WideCharToMultiByte
      (CP_ACP, 0, wstr, -1, str, max, NULL, NULL);
  /* 変換後の文字列の長さを返す */
  return strlen (str);
}

上記のCプログラム（util.c）のサポート関数を呼び出すCOBOLプログラムの例を次に示します。このプログラムが，Javaプログラムから呼び出されるとき，引数には文字列が代入されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 'Java_DLL_func'.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
         01 len PIC S9(9) USAGE COMP.
         01 max PIC S9(9) USAGE COMP VALUE 1024.
         01 str.
           02 FILLER PIC X OCCURS 1024.
       LINKAGE SECTION.
         01 JNIEnv  ADDRESS.
         01 jobject ADDRESS.
         01 jstr    ADDRESS.
       PROCEDURE DIVISION USING BY VALUE
                              JNIEnv jobject jstr.
           CALL 'jstring2string' USING str
                          BY VALUE max JNIEnv jstr
                          RETURNING len.
           DISPLAY 'len: ' len.
           DISPLAY 'str: ' str(1:len).
           EXIT PROGRAM.
       END PROGRAM 'Java_DLL_func'.

19.3.4　制限事項

Javaプログラムインタフェース機能での制限事項について説明します。

Javaバイトコードファイルから生成されるC言語ヘッダファイル中の，Javaメソッドに対応する関数名の長さは，160バイトまでです。関数名が160バイト以内になるよう，Javaメソッド名を定義してください。

Javaプログラム呼び出し機能を使用して呼び出したJavaプログラムから，同じスレッドでCOBOLプログラムを呼び出せません。呼び出した場合の動作は保証しません。

第6編　オブジェクト指向機能

20　オブジェクト指向機能

オブジェクト指向機能は，メッセージのやり取りによる処理，カプセル化，継承など，オブジェクト指向技術を導入したCOBOL言語仕様です。

この章では，オブジェクト指向の考え方やオブジェクト指向機能の特徴について説明します。また，オブジェクト指向機能の基本概念や用語についても説明します。

20.1　オブジェクト指向の紹介

ここでは，オブジェクト指向について説明します。

20.1.1　ソフトウェア開発の現状

ソフトウェア開発の技術は，今日まで目覚ましい発展を遂げてきました。次々に新しい技術が生まれ，ソフトウェアの規模は拡張されてきました。しかし，ソフトウェアの拡張に伴い，さまざまな問題が出てきました。

(1)　生産面での問題点

従来のプログラムは，ある特定の業務を処理するために開発される，機能中心のものでした。このようにして設計されるプログラムは，適用される業務が限定され，それ以外の業務には対応できない柔軟性に欠けたものでした。そのため，プログラマは業務ごとに新しいプログラムを設計しなければならず，作業に多くの時間を必要としていました。

(2)　信頼面での問題点

従来のプログラミング言語によるプログラムでは，処理形式などの標準化が徹底されていないため，既存のプログラムを再利用するのが難しく，新しいプログラムのほとんどは最初から設計されていました。また，従来のプログラム設計では最後まで設計が終了し，実際に実行させないと期待どおりの動きをするかどうかがわかりませんでした。そのため，設計に必要な時間の割に信頼性の低いプログラムしか作成できませんでした。

(3)　保守面での問題点

従来のプログラミング言語によるプログラムを変更または修正するのには，大変な手間と時間が掛かりました。変更，修正がうまくできずに性能が劣化したり，使えなくなる場合もありました。これは，データ間またはプログラム間の依存度が高いため，一つの変更が，予想外の結果まで引き起こすことが頻発したからです。

これらの問題点に対応するための手段として，オブジェクト指向によるシステム開発技法があります。オブジェクト指向とは，どのようなものかを次に示します。

20.1.2　オブジェクト指向

オブジェクトとは，英語で「もの」という意味です。この言葉からもわかるように，オブジェクト指向とは，現実にある「もの」や，「もの」同士が作用し合うことによって作り出される「現象」を，そのままコンピュータの世界に反映しようという考えです。

(1)　データ中心の考え方（生産面での問題点の解決）

従来のCOBOLプログラミングでは，実現したいシステムの処理（機能）を分析し，機能ごとのモジュールを段階的に，細かく分割する手法がとられます。こうした分割手法では，あるモジュールはその上位のモジュールの機能を実現するために必要な機能の一つとして存在します。このため，あるモジュールをまったく別のモジュール機能として，部分的に再利用するのは困難です。また，プログラムを変更したり拡張したりする際には，機能を実現するために使用されるデータが，どこで，何の目的で参照・設定されているのかを把握しなければなりませんでした。

オブジェクト指向では，実現したいシステムで使用されるデータを中心に考えます。システムの中で何らかの役割を担うデータをオブジェクトとして抽出し，データとそのデータに対して与えられる機能を一まとまりにしてモジュールを構成します。つまり，データを基にモジュールを分割する手法です。

このようにモジュールを分割すれば，同じデータを使用するシステムには，モジュールを再利用できます。また，データを直接参照・設定する部分がそのモジュールに限られるため，プログラムの修正や拡張も容易になります。

(2)　オブジェクトの構造

オブジェクトとは，処理対象のデータとそのデータを操作する手続き（属性とサービス）をカプセル化したものです。次に例を挙げて説明します。

（例）　Aさんの銀行口座のオブジェクト

Aさんは，ある銀行に普通預金の口座を開設しています。ここでは，普通預金の口座を例にして，オブジェクトを説明します。

Aさんの普通預金口座での処理をオブジェクト指向で実現させるために，必要な情報を抽出します。まず，この口座がAさんのものであるという情報が必要です。これらは，次に示す情報で表されます。

名前

口座番号

次に，Aさんの口座の状態を知るための情報を示します。

残高

利率

これらが，Aさんの口座であるということと，その口座の状態を認識するのに必要な情報です。これらの情報に対し，銀行の普通預金口座として機能を果たすために必要な動作として，次の三つを挙げてみます。

預け入れ

引き出し

振り込み

Aさんの口座は，「名前」や「口座番号」で認識され，「残高」に対し「預け入れ」や「引き出し」の処理を行うことができます。オブジェクト指向では，これらの情報をデータ，処理をメソッド（英語で手段を表す言葉）と表現します。

このような，Aさんの普通預金口座のオブジェクトは，次のような概念図で表せます。以後，このマニュアルではオブジェクトの概念図をこのように表します。

(3)　カプセル化（保守面での問題点の解決）

オブジェクトを表す概念図は，オブジェクトのデータおよびメソッドの実装が隠ぺいされている状態を示しています。オブジェクト内のデータは，原則としてそのオブジェクトのメソッドによってだけ操作されます。また，オブジェクト内で変化したデータの値が，そのオブジェクトの外部のデータ値に，暗黙的に影響を与えることもありません。

このように，データもメソッドの実装もオブジェクト内に閉じ込め，外部から隠ぺいすることを，カプセル化といいます。

このカプセル化は，従来のプログラミング言語によるシステム開発で課題となっていた，データ間またはデータとプログラムの依存度の高さによって発生する変更時の障害を解消します。

(4)　クラス

クラスとは，オブジェクトを生成するときの型のことです。オブジェクト指向では，クラスを使用してオブジェクトのデータ属性やメソッドを定義し，オブジェクトをカプセル化します。

クラスとオブジェクトの関係を銀行口座を例にして説明します。

銀行口座に必要なデータ（名前，口座番号など）と，それらのデータを操作するメソッド（預け入れ，引き出しなど）は，銀行口座クラスとして定義します。こうして定義されたクラスは，オブジェクトを生成するための型であり，だれの口座でもありません。実際の口座は，銀行口座クラスを基にオブジェクトとして生成します。各人の口座のデータの定義は同じですが，名前，口座番号などのデータには，それぞれ異なる値が設定されます。

(a)　インスタンスオブジェクト

クラスから生成されるオブジェクトの実体のことを，インスタンスオブジェクトといいます。

一つのクラス定義から，複数のインスタンスオブジェクトを生成できます。生成されたインスタンスオブジェクトは，定義されたデータを個別に持っています。そのため，同じクラスから生成されても，それぞれのインスタンスオブジェクトは，固有のデータ値を持っています。

(b)　ファクトリオブジェクト

同じクラスから生成されたインスタンスオブジェクトは，それぞれ固有のデータ値を持っています。しかし，中には口座オブジェクトの「利率」のように，各オブジェクトに共通するデータ値もあります。このようなデータをすべてのオブジェクトが持っていてもかまいませんが，まとめて1か所に保持しておく方が，保守しやすいオブジェクトになります。

ファクトリオブジェクトは，このように全オブジェクトに共通するデータを，1か所で管理するためのオブジェクトです。

例えば，「利率」を変更する場合，各インスタンスオブジェクトがそれぞれ「利率」を持っていると，それらをすべて変更しなければなりません。しかし，「利率」がファクトリオブジェクトに保持されていれば，ファクトリオブジェクトの「利率」だけを変更すればよいのです。

ファクトリオブジェクトは，一つのクラスに対して一つだけ存在します。

(5)　メソッドの呼び起こし（メッセージパッシング）

オブジェクト指向では，データと処理は，それぞれにカプセル化されます。カプセル化されたデータは，他オブジェクトからの影響を受けてはなりません。このカプセル化という概念を守りながら，処理プログラムを実行させるために，オブジェクト指向ではメッセージを使用します。

メッセージとは，クラスからオブジェクトを生成させたり，またはあるオブジェクトが自分では処理できない問題の解決を，その処理ができるほかのオブジェクトに依頼するときに使用されるものです。次に例を示します。

（例）AさんがBさんの口座に現金を振り込む場合

AさんがBさんの口座に1万円を振り込もうとしています。しかし，Aさんの口座オブジェクトのメソッドは，Bさんの口座オブジェクトのデータを操作できません。そこで，Bさんの口座オブジェクトに次のようなメッセージを送ります。

このようにして，メッセージを介してオブジェクトのメソッドを操作することをメソッドの呼び起こし（メッセージパッシング）といいます。

(6)　継承（信頼面での問題点の解決）

継承とは，あるクラスが持つ性質をほかのクラスが受け継ぐことです。例えば，銀行が従来のサービスに新たなサービスを加えて，新しいサービスを提供する制度を設けようとした場合，継承を利用します。次に例を示します。

注

継承の矢印は，あるクラスがどのクラスを継承しているのかを示します。例えば，クラスBがクラスAを継承しているとき，矢印の向きもクラスBがクラスAを指します。

従来のサービスを持つクラスを継承したクラスでは，新しく追加するサービスだけを定義します。継承によって，従来のサービスが受け継がれ，使用できるようになっているので，これらのサービスについては定義する必要はありません。また，受け継いだ性質の再定義もできます。

このように，継承によって既存のクラスを利用して新しいクラスを作成すると，原始プログラム中のコーディングの重複が避けられるので保守資産の増加を抑えられ，システム開発にかかる労力を短縮できます。また，既存のクラスを利用することで，最初から品質が保証されている，信頼性の高いクラスを作成できます。

なお，このマニュアルでは継承されるクラスを「スーパクラス」，継承するクラスを「サブクラス」といいます。

(7)　インタフェース

インタフェースは，このあとに説明する適合やポリモルフィズムに深くかかわっている重要な概念です。インタフェースは，オブジェクトがどのようなサービスを提供するのかを表します。具体的には，オブジェクトが持つメソッドの名前とパラメタの並び（これらをまとめて，メソッド原型といいます）の集まりから成ります。インタフェースは，オブジェクトが持つすべてのメソッド原型を表現することも，一部を表現することもできます。

(a)　メソッド名

メソッドには，それぞれ名前が付いています。メソッド名を，メソッドが提供するサービス，つまり実装を簡潔に表すものにすると，プログラムが理解しやすくなります。メソッド名は，一つのクラス中で一意でなければなりません。ただし，クラスが違えば，異なるサービスを提供するメソッドに対し，同じメソッド名を付けてかまいません。

(b)　パラメタ

パラメタには，処理するデータと，その処理の結果を返すデータを指定します。

注

メソッド実装とは，メソッド内の実処理を示します。

(8)　ポリモルフィズム

ポリモルフィズムとは，同じメッセージを送っても，メッセージを受け取るオブジェクトの生成元のクラスが異なれば，そのオブジェクトごとに異なる処理が行われる仕組みです。この仕組みを使用すると，複数の処理を一つのメッセージで実現できます。

次に例を示します。

（例）普通預金口座および当座預金口座からの引き出し

普通預金口座および当座預金口座は，それぞれ別のクラスから生成されたオブジェクトです。クラスが異なるので，それぞれのオブジェクトのメソッドに同じ名前を付けることができます。

これらのオブジェクトは，「引き出してください。」というメッセージを受け取ることができます。普通預金口座クラスのオブジェクトのメソッドは普通預金から現金を引き出します。当座預金口座クラスのオブジェクトのメソッドは，当座預金からの引き出しを要求する小切手をチェックして，現金を引き出します。つまり，同じメッセージであってもそれを受け取るオブジェクトのクラスが異なっていれば，異なる動作をするわけです。

ポリモルフィズムの仕組みは，メッセージのやり取りの単純化に役立ちます。また，新規に受け手のクラスを定義しても，メッセージの送り手側を修正する必要がないため，再利用性や保守性を向上させることができます。

注

COBOL2002では，メソッドが適合していなければメソッドに同じ名前を付けること（オーバライド）は，できません。

メソッドが適合しているかどうかは，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.7(1)　オブジェクト指向での「適合」」の規則に従ってチェックされます。

20.2　COBOL2002でのオブジェクト指向機能

「20.1　オブジェクト指向の紹介」で紹介したオブジェクト指向を実現する言語仕様として，COBOL2002ではオブジェクト指向機能があります。ここでは，オブジェクト指向機能について簡単に説明します。

20.2.1　オブジェクト指向機能による定義

(1)　クラスの定義

オブジェクト指向を取り入れたプログラム開発を，COBOL2002で実現するためには，プログラム定義とクラス定義が必要です。

(a)　プログラム定義

プログラム定義では，リポジトリ段落に使用するクラス名を指定します。また，インスタンスオブジェクトを生成する場合，オブジェクトを識別するためのオブジェクト参照を定義します。手続き部では，メソッドを呼び起こすための手続き文であるINVOKE文を記述します。

リポジトリ段落の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「8.2.7　リポジトリ段落（REPOSITORY）」を参照してください。

(b)　クラス定義

クラス定義は，インスタンス定義とファクトリ定義という二つの定義部分で構成されます。また，インスタンス定義，ファクトリ定義にはそれぞれメソッド定義を定義できます。ファクトリ定義から生成されるオブジェクトがファクトリオブジェクト，インスタンス定義から生成されるオブジェクトがインスタンスオブジェクトとなります。

それぞれのオブジェクトをどのように定義しているのかを，オブジェクトの概念図との対応で示します。

このクラス定義から，オブジェクトを生成します。

ファクトリオブジェクトは，クラス定義に対して一つだけ存在します。インスタンスオブジェクトは，クラス定義に対して複数生成できます。

ファクトリ定義，インスタンス定義，およびクラス定義の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「7.　見出し部（IDENTIFICATION DIVISION）」を参照してください。

20.2.2　インスタンスオブジェクトの生成と消滅

(1)　インスタンスオブジェクトの生成

定義したインスタンスオブジェクトは型であり，生成することで使用できるようになります。インスタンスオブジェクトの生成とは，処理対象であるデータ値を格納するための記憶領域を確保することです。

インスタンスオブジェクトを生成するためには，NEWメソッドという特別なメソッドを使用します。NEWメソッドは，COBOL2002が提供する「BASEクラス」というクラスのファクトリオブジェクトのメソッドです。NEWメソッドおよびBASEクラスについては，マニュアル「COBOL2002　言語　標準仕様編」　「12.　標準クラス」を参照してください。なお，NEWメソッドを指定する場合は，'NEW'と大文字で指定する必要があります。

次に，インスタンスオブジェクトの生成例を示します。

ここでは，NEWメソッドを呼び起こして普通預金口座クラスのインスタンスオブジェクトを生成しています。インスタンスオブジェクトが生成されると，そのオブジェクト参照が返却項目に設定されます。

オブジェクト参照とは，生成されたオブジェクトを参照するデータ項目です。オブジェクト参照に関する言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.2　オブジェクト参照」を参照してください。

ここでは，生成したインスタンスオブジェクトのオブジェクト参照を使用して，「預け入れ」メソッドを呼び起こしています。

(2)　インスタンスオブジェクトの消滅

生成されたインスタンスオブジェクトが消滅させられるのは，実行単位の終了時か，COBOL2002が提供するガーベジコレクション（メモリ管理機能）によって不要と判断されたときです。

ガーベジコレクションとは，COBOL2002実行時ライブラリのメモリ管理機能です。ガーベジコレクションが実行されると，どこからも参照されていないインスタンスオブジェクト※が整理され，そのメモリ領域が再利用されます。この処理は，COBOL2002が自動的に実行し，ユーザが意識する必要はありません。

注※

オブジェクト参照データ項目は，SET文でNULLが設定されるか，別のオブジェクト参照データ項目を転記された場合，インスタンスオブジェクトを参照しなくなります。

ガーベジコレクションは，NEWメソッドが実行されたとき，次の条件を満たすと発生します。

インスタンスオブジェクトのメモリ使用の累積が，512キロバイトを超えたとき。

なお，環境変数CBLGCSTARTによって，上記の値を変更できます。

直前のガーベジコレクション完了時点からのメモリ追加量が，64キロバイトを超えたとき。

なお，環境変数CBLGCINTERVALによって，上記の値を変更できます。

環境変数CBLGCSTARTおよび環境変数CBLGCINTERVALについては，「36.2　プログラムの実行環境の設定」を参照してください。

20.2.3　メソッドの呼び起こし（メッセージパッシング）

COBOL2002でのメソッドの呼び起こし（メッセージパッシング）には，「INVOKE文」を使用します。次に例を示します。

INVOKE CLASS-A 'HIKIDASHI' USING H-1 RETURNING H-2
          1         2             3             4

呼び起こすメソッドを参照するためのクラス名またはオブジェクト参照

呼び起こしたいメソッド名

メソッドに渡すデータ項目

メソッドから返される結果を受け取る項目の名称

(1)　メソッドの呼び起こし

COBOL2002は，クラス名またはオブジェクト参照で指定したオブジェクトが実装しているメソッドを探します。INVOKE文によって，オブジェクトに対しメソッドの実行を要求することを「メソッドを呼び起こす」といいます。メソッドを呼び起こす場合には，INVOKE文にクラス名，オブジェクト参照データ項目名，または既定義オブジェクト参照を指定します。

INVOKE文の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.26　INVOKE文」を参照してください。

(a)　ファクトリメソッドの呼び起こし

クラス名を指定すると，そのクラスに定義されているファクトリメソッドが呼び起こされます。記述例を，次に示します。

       INVOKE CLASS-A 'FACTORY-METHOD' USING ARG1
                  1                      RETURNING ARG2.

クラス名

(b)　インスタンスメソッドの呼び起こし

インスタンスメソッドを呼び起こす場合，そのメソッドを内包するインスタンスオブジェクトを指すオブジェクト参照を指定します。

オブジェクト参照とは，生成されたオブジェクトを参照するデータ項目です。オブジェクト参照は，USAGE IS OBJECT REFERENCE句を使用して宣言します。オブジェクト参照の詳細はマニュアル「COBOL2002　言語　標準仕様編」　「9.16.86　USAGE句」を参照してください。

記述例を，次に示します。

             ：
       01 H-1 USAGE OBJECT-REFERENCE.
             ：
           INVOKE CLASS1 'NEW' RETURNING H-1.
             ：
           INVOKE H-1 'OBJECT-METHOD' USING ARG1
                   1                  RETURNING ARG2.

オブジェクト参照

(c)　既定義オブジェクトを使用したメソッドの呼び起こし

現在実行中のメソッドの呼び起こし対象であるオブジェクトのメソッドを呼び起こす場合，既定義オブジェクト参照のSELFまたはSUPERを使用します。

記述例を，次に示します。

       INVOKE SELF 'OBJECT-METHOD' USING ARG1
                1                  RETURNING ARG2.

既定義オブジェクト参照

既定義オブジェクト参照には，ほかにNULLおよびEXCEPTION-OBJECTがあります。既定義オブジェクト参照については，マニュアル「COBOL2002　言語　標準仕様編」　「4.3.2　一意名のいろいろ」を参照してください。

(2)　メソッドの検索

INVOKE文を実行すると，呼び起こすメソッドが検索されます。メソッドは，INVOKE文の記述によって次のように検索されます。

INVOKE クラス名 メソッド名

指定したクラスのファクトリメソッドが検索されます。指定したクラスに該当するメソッドがなければ，指定したクラスのスーパクラスのファクトリメソッドが，継承した順に検索されます。

INVOKE SELF メソッド名

実行中のメソッドを呼び起こした際に指定したオブジェクトが属するクラスのファクトリメソッドまたはインスタンスメソッドが検索されます。指定したクラスに該当するメソッドがなければ，そのクラスのスーパクラスのメソッドが，継承した順に検索されます。

INVOKE SUPER メソッド名

実行中のメソッドを呼び起こした際に指定されたオブジェクトが属するクラスのスーパクラスのファクトリメソッドまたはインスタンスメソッドが検索されます。指定したクラスに該当するメソッドがなければ，そのクラスのスーパクラスのメソッドが，継承した順に検索されます。

INVOKE 一意名 メソッド名

オブジェクト参照が指すオブジェクトがファクトリオブジェクトの場合は，そのファクトリ定義を含むクラスのファクトリメソッドが検索されます。オブジェクト参照が指すオブジェクトがインスタンスオブジェクトの場合は，そのインスタンス定義を含むクラスのインスタンスメソッドが検索されます。指定したクラスに該当するメソッドがなければ，そのクラスのスーパクラスのメソッドが，継承した順に検索されます。

(3)　メソッドに渡す引数

メソッドに渡す引数を指定します。ここで指定した引数は，メソッド側に渡されます。詳細は，「17.　プログラム間の引数と返却項目」を参照してください。

(4)　メソッドから返される結果を受け取る項目の名称

オブジェクトのメソッドを実行させた結果の値を受け取るための，データ項目を指定します。

20.2.4　オブジェクトプロパティ

オブジェクトプロパティとは，オブジェクトが持つ属性の中で，外部からでもメソッドを呼び起こさず，直接参照または更新できると宣言されたデータ項目のことです。また，オブジェクトプロパティの参照および更新には，GETプロパティメソッド，SETプロパティメソッドを使用します。また，プロパティメソッドには，暗黙的なプロパティメソッドと明示的なプロパティメソッドとがあります。

オブジェクトプロパティの詳細についてはマニュアル「COBOL2002　言語　標準仕様編」　「4.3.2(8)　オブジェクトプロパティ」を参照してください。

(1)　明示的なプロパティメソッド

GETプロパティメソッド

メソッド名段落にGET PROPERTYを指定すると，そのメソッドは，GETプロパティメソッドとなります。

GETプロパティメソッドは，オブジェクトプロパティが送り出し側作用対象として参照されたとき，自動的に呼び起こされます。このとき，GETプロパティメソッドのRETURNINGに指定された項目が返却されます。

SETプロパティメソッド

メソッド名段落にSET PROPERTYを指定すると，そのメソッドは，SETプロパティメソッドとなります。

SETプロパティメソッドは，オブジェクトプロパティが受け取り側作用対象として参照されたとき，自動的に呼び起こされます。このとき，引数としてSETプロパティメソッドに値が渡されます。

記述例を，次に示します。

プログラムMAIN-Aからオブジェクトプロパティを送り出し側作用対象として参照します。これによって，GETプロパティメソッドP-1が呼び起こされます。

P-1は，ファクトリデータGET-DATAを返却項目RET-DATAに設定し，呼び出し元へ制御を戻します。その結果，1.のW-1には，GET-DATAと同じ値が転記されます。

プログラムMAIN-Aからオブジェクトプロパティを受け取り側作用対象として参照します。これによって，SETプロパティメソッドP-1が呼び起こされます。

このとき，2.のMOVE文では，X-1の値をSETプロパティメソッドP-1の引数に指定して呼び起こします。P-1は，引数として渡されたPARA-DATAをファクトリデータSET-DATAに転記します。この結果，2.のMOVE文のX-1の値がSET-DATAに設定されます。

明示的なプロパティメソッドの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「7.6　メソッド名段落（METHOD-ID）」を参照してください。

(2)　暗黙的なプロパティメソッド

ファクトリ定義およびインスタンス定義のデータ記述項にPROPERTY句を指定すると，そのデータ項目は，オブジェクトプロパティとして参照できます。PROPERTY句が指定されたデータ項目には，暗黙的にGETプロパティメソッドとSETプロパティメソッドが生成されます。

記述例を，次に示します。

プログラムMAIN-Aからオブジェクトプロパティを送り出し側作用対象として参照します。これによって，暗黙的なGETプロパティメソッドが呼び起こされます。

暗黙的なGETプロパティメソッドは，ファクトリデータP-1の値を取得して返却します。その結果，1.のW-1には，P-1と同じ値が転記されます。

プログラムMAIN-Aからオブジェクトプロパティを受け取り側作用対象として参照します。これによって，暗黙的なSETプロパティメソッドが呼び起こされ，2.のMOVE文のX-1の値がファクトリデータP-1に設定されます。

暗黙的なプロパティメソッドの場合，オブジェクトプロパティの値がそのままファクトリデータおよびインスタンスデータに設定されます。これに対して，明示的なプロパティメソッドの場合，オブジェクトプロパティの値を加工してファクトリデータおよびインスタンスデータに設定できます。

暗黙的なプロパティメソッドの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.56　PROPERTY句」を参照してください。

20.2.5　オブジェクト指向による継承

継承を行うには，COBOL2002の「INHERITS句」を使用します。

(1)　INHERITS句

INHERITS句は，クラスの"CLASS-ID. クラス名"に続けて指定します。

（例）

CLASS-ID. クラス名 INHERITS スーパクラス名.

継承すると，スーパクラスの性質が，継承するクラスおよび継承するクラスのサブクラスにも定義されているかのように扱われます。継承の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.9　クラス継承」を参照してください。

(2)　継承の使い方

「預け入れ」メソッドと「引き出し」メソッドを持つ「預金口座」クラスがある場合，この「預金口座」クラスを継承する例を，次に示します。

（例1）

「預金口座」クラスの「預け入れ」メソッド，「引き出し」メソッドに加えて「残高照会」メソッドを持つ「普通預金口座」クラスを作成します。この場合，「普通預金口座」クラスは，「預金口座」クラスを継承し，「残高照会」メソッドだけを定義すれば，必要なメソッドを備えられます。

（例2）

「預金口座」クラスの「預け入れ」メソッド，「引き出し」メソッドに加えて「残高照会」メソッドを持ち，さらに「引き出し」メソッドが独自の処理をする「当座預金口座」クラスを作成します。この場合，すでに「普通預金口座」クラスが存在するときは，「当座預金口座」クラスは，「普通預金口座」クラスを継承し，「引き出し」メソッドだけを定義すれば，必要なメソッドを備えられます。

「引き出し」メソッドは，継承する「預金口座」クラスですでに定義されているため，「当座預金口座」クラスで独自の「引き出し」メソッドを定義する場合は，METHOD-ID段落にOVERRIDE句を指定します。これによって，当座預金口座クラスの引き出しメソッドが預金口座クラスの引き出しメソッドを上書きし，当座預金口座クラスの引き出しメソッドが有効となります。

20.2.6　オブジェクト指向でのインタフェース

インタフェースとは，メソッドの名称，引数，および返却項目の定義の集まりです。インタフェースは，メソッドの実装を持ちません。

ファクトリオブジェクトとインスタンスオブジェクトは，それぞれインタフェースを持ちます。このインタフェースは，それぞれのオブジェクトが持つ，すべてのメソッド定義の集まりです。

インタフェースについては「COBOL2002　言語　標準仕様編」　「5.2.7　適合とインタフェース」を参照してください。

(1)　インタフェースの利用

インタフェースを使用すると，クラス中の一部のメソッドだけを公開できます。例えば，プログラムAにはメソッドM1とM2だけを公開し，プログラムBにはメソッドM3とM4だけを公開することができ，誤ったメソッドの使用などを防止できます。

（インタフェースの利用例）

上記の「預金口座」クラスは，五つのメソッドを持っています。

このうち，「パスワード変更メソッド」と「利息メソッド」を，預金者用のプログラムから使用させたくない場合，「引き出しメソッド」「預け入れメソッド」「残高照会メソッド」だけを含む「預金口座預金者」インタフェースを定義し，預金者用のプログラムではこのインタフェースを使用します。

このようにすると，預金者用のプログラムからは，「パスワード変更メソッド」と「利息メソッド」を隠ぺいできるため，誤ってメソッドを使用されることがありません。

このように，インタフェースを利用すると，プログラムごとに公開するメソッドの範囲を変更できます。

インタフェースは，ファクトリメソッド，インスタンスメソッドのそれぞれに定義できます。クラスがインタフェースを持っていることを，「インタフェースを実装する」といいます。例えば，クラスAのファクトリ定義がインタフェース1を持つ場合は，「クラスAのファクトリオブジェクトは，インタフェース1を実装する」といいます。

また，クラス定義が未完成であっても，そのインタフェース部分だけが決まっていれば，-Repository,Genオプションによってリポジトリファイルを作成できます。必要なリポジトリファイルを作成しておけば，リポジトリ段落に未完成のクラスの名前を指定した原始プログラムでも，コンパイルできるようになります。詳細は「34.3.2　リポジトリファイルの単独生成」を参照してください。

(2)　インタフェースの定義

インタフェースは，INTERFACE-IDを使って定義します。INTERFACE-IDの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「7.5　インタフェース名段落（INTERFACE-ID）」を参照してください。

インタフェースの定義例を，次に示します。

       IDENTIFICATION DIVISION.
       INTERFACE-ID. I-INT1. *> インタフェース名定義
       PROCEDURE DIVISION.
       IDENTIFICATION DIVISION.
       METHOD-ID. METH1. *> メソッド名定義
       DATA DIVISION.
       LINKAGE SECTION.
       01 PRM1 PIC X. *> 引数定義
       01 RET1 PIC X. *> 返却項目定義
       PROCEDURE DIVISION USING PRM1 RETURNING RET1.
          ：
       END METHOD METH1. *> メソッドの処理は定義しない
       IDENTIFICATION DIVISION.
       METHOD-ID. METH2. *> 必要なメソッドをすべて定義する
           :
       END METHOD METH2.
       END INTERFACE I-INT1.

(3)　インタフェースの実装

クラス定義にインタフェースを実装する場合，ファクトリ定義またはインスタンス定義のIMPLEMENTS句にインタフェース名を指定します。IMPLEMENTS句に指定されたインタフェース名は，そのクラスから生成されるファクトリオブジェクトまたはインスタンスオブジェクトに実装されたインタフェースとなります。IMPLEMENTS句の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「7.7　オブジェクト段落（OBJECT）」を参照してください。

       IDENTIFICATION DIVISION.
       CLASS-ID. CLS1.
           ：
       IDENTIFICATION DIVISION.
       FACTORY. IMPLEMENTS F-INT1 F-INT2.
                     *> ファクトリオブジェクトが実装する
                     *> インタフェース名の指定
           :
       END FACTORY.

       IDENTIFICATION DIVISION.
       OBJECT. IMPLEMENTS I-INT1 I-INT2.
                     *> インスタンスオブジェクトが実装する
                     *> インタフェース名の指定
           :
       END OBJECT.
       END CLASS CLS1.

(4)　インタフェースを使ったオブジェクトの使用

インタフェースによってインスタンスオブジェクトを使用する場合，インタフェース名を指定したオブジェクト参照を使用します。

       01 OBJ-REF1 USAGE OBJECT REFERENCE I-INT1.
                                      インタフェース名

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 I-INT-OR USAGE OBJECT REFERENCE I-INT1.
                  *> インタフェース名を指定した
                  *> オブジェクト参照
       PROCEDURE DIVISION.
           INVOKE CLS1 'NEW' RETURNING I-INT-OR.
                  *> 「CLS1」クラスのインスタンス
                  *> オブジェクトの作成
           INVOKE I-INT1-OR 'METH1'.
                  *> インタフェースによるメソッド実行（1.）

インタフェース指定のオブジェクト参照によってメソッドを実行する場合，そのメソッドは，インタフェース定義中に定義されている必要があります。インタフェース中に定義されていないメソッドを実行しようとした場合，コンパイル時にエラーとなります。

上記の例で，メソッド「METH1」がインタフェース「I-INT1」の定義中にない場合は，インスタンスオブジェクト中に「METH1」があっても，1.のINVOKE文がコンパイル時にエラーとなります。

また，クラスに実装されていないインタフェース名を指定したオブジェクト参照を使用してメソッドを呼び出した場合，コンパイル時にエラーとなります。例えば，上記の例でCLS1のインスタンス定義にインタフェース名I-INT1の実装がない（IMPLEMENTS句に指定されていない）場合，コンパイル時に適合エラーが発生します。適合については，「20.2.7　オブジェクト指向による適合」を参照してください。

20.2.7　オブジェクト指向による適合

オブジェクト参照データ項目にクラス名またはインタフェース名を指定すると，メソッドの呼び起こしやオブジェクト参照の転記の際に，適合がチェックされます。これによって，不当なメソッド呼び起こしや転記を防げます。適合するかどうかは，コンパイル時または実行時にチェックされます。

(1)　オブジェクト参照の適合チェック

通常，オブジェクトを使用する場合は，オブジェクト参照を使用します。

オブジェクト参照の定義にクラス名やインタフェース名を指定した場合，そのオブジェクト参照を使用したプログラムが正しく動作するかが判定されます。

オブジェクト参照への値設定は，SET文の実行，メソッド呼び起こし時の引数への指定，または返却項目へのオブジェクト参照指定などによって発生します。オブジェクト参照へ値を設定する際，設定するデータの情報とオブジェクト参照に指定された情報との適合がチェックされ，適合するデータだけが設定できます。これによってオブジェクト参照が不適合なオブジェクトを指すことを防げます。

適合チェックの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.43　SET文」，および「COBOL2002　言語　標準仕様編」　「10.7　引数と返却項目の適合」を参照してください。

ここでは，適合チェックの概要について，説明します。

(a)　クラス同士またはインタフェース同士の適合

クラス同士，またはインタフェース同士の適合は，クラスおよびインタフェースの継承関係によって，次の規則で判定されます。

あるクラスAに適合するクラスは，そのサブクラス（クラスAを継承するクラス），またはクラスAである。

あるインタフェースBに適合するインタフェースは，インタフェースBを継承するインタフェース，またはインタフェースBである。

例えば，クラス「CLASS-A」がクラス「CLASS-B」を継承している場合，「CLASS-Aは，CLASS-Bに適合している」といえますが，「CLASS-Bは，CLASS-Aに適合していない」ことになります。これは，CLASS-BがCLASS-Aを継承していないためです。

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OR1 USAGE OBJECT REFERENCE CLASS-A.
       01 OR2 USAGE OBJECT REFERENCE CLASS-B.
           :
       PROCEDURE DIVISION.
           :
          SET OR2 TO OR1. *> 1.
          SET OR1 TO OR2. *> 2.

送り出し側作用対象であるOR1に指定されたCLASS-Aは，受け取り側作用対象であるOR2に指定されたCLASS-Bに適合しているので，このSET文は正しいと判定されます。

送り出し側作用対象であるOR2に指定されたCLASS-Bは，受け取り側作用対象であるOR1に指定されたCLASS-Aに適合していないので，このSET文はエラーとなります。

(b)　インタフェースとクラスの適合

クラスとインタフェースの適合は，次の規則で判定されます。

あるインタフェースAに適合するのは，それを実装するクラスである。

クラスとインタフェースが適合するのは，上記のとおり「あるクラスがあるインタフェースに適合する」場合だけです。「あるインタフェースがあるクラスに適合する」ということはありません。

例えば，クラス「CLASS-A」がインタフェース「INTERFACE-B」を実装している場合，「CLASS-AはINTERFACE-Bに適合している」といえますが，「INTERFACE-BはCLASS-Aに適合していない」ことになります。

       DATA  DIVISION.
       WORKING-STORAGE  SECTION.
       01 OR1 USAGE OBJECT REFERENCE CLASS-A.
       01 OR2 USAGE OBJECT REFERENCE INTERFACE-B.
           :
       PROCEDURE  DIVISION.
           :
           SET OR2 TO OR1. *> 1.
           SET OR1 TO OR2. *> 2.

送り出し側作用対象であるOR1に指定されたCLASS-Aは，受け取り側作用対象であるOR2に指定されたINTERFACE-Bに適合しているので，このSET文は正しいと判定されます。

送り出し側作用対象であるOR2に指定されたINTERFACE-Bは，受け取り側作用対象であるOR1に指定されたCLASS-Aに適合していないので，このSET文はエラーとなります。

(c)　メソッド呼び起こしの適合

INVOKE文によってメソッドを呼び起こす場合，そのメソッドが実行できるかどうかは，次の規則で判定されます。

INVOKE文で使用するオブジェクト参照にクラス名が指定されていれば，実行するメソッドは，そのクラスまたはそのクラスが継承するクラスのどちらかで定義されていなければならない。

INVOKE文で使用するオブジェクト参照にインタフェース名が指定されていれば，実行するメソッドは，そのインタフェースまたはそのインタフェースが継承するインタフェースのどちらかで定義されていなければならない。

クラス名またはインタフェース名指定のオブジェクト参照で，上記の規則に従っていないメソッドの呼び起こしがあると，コンパイル時にエラーとなります。

(2)　実装インタフェースの適合チェック

インタフェースを実装する場合，ファクトリ段落またはオブジェクト段落のIMPLEMENTS句にインタフェース名を指定します。このとき，インタフェースは，ファクトリオブジェクトまたはインスタンスオブジェクトが実装するインタフェースに適合しているかどうかがチェックされます。このチェックでは，次の条件が成立する場合だけ，適合しているとみなされます（適合条件の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.7　適合とインタフェース」を参照してください）。

インタフェースが定義する各メソッドに対して，同名のメソッドがオブジェクトにも存在する。

同名メソッドの引数と返却項目の定義が同じである。

このため，実装されるインタフェースの持つメソッド定義の集合は，それを実装するオブジェクトが持つメソッド定義と同じ集合か，またはその部分集合となります。

例として，次のようなメソッド定義集合のインスタンスオブジェクトとインタフェースがあるとします。

クラス「CL-1」のインスタンスオブジェクトのメソッド定義集合

METH1，METH2，METH3

インタフェース「INT-1」のメソッド定義集合

METH1，METH2

インタフェース「INT-2」のメソッド定義集合

METH1，METH4

インタフェースINT-1のメソッドは，すべてクラスCL-1に含まれています。このため，インタフェースINT-1は，クラスCL-1に適合しているといえます。

一方，インタフェースINT-2は，クラスCL-1が持たないメソッドMETH4を含んでいます。このため，インタフェースINT-2は，クラスCL-1に適合していないといえます。

インタフェースINT-1，INT-2にIMPLEMENTS句を指定すると，コンパイル時に次のように判定されます。

（インタフェースINT1の場合）

       IDENTIFICATION DIVISION.
       CLASS-ID. CL-1.
           ：
       OBJECT. IMPLEMENTS INT-1. …適合していると判定されます。
           ：
       END OBJECT.
       END CLASS CL-1.

（インタフェースINT2の場合）

       IDENTIFICATION DIVISION.
       CLASS-ID. CL-2.
           ：
       OBJECT. IMPLEMENTS INT-2. …INT-2が持つMETH4がオブジェクト
           ：                      にないため，適合エラーとなります。
       END OBJECT.
       END CLASS CL-2.

(3)　オブジェクトビューによる実行時の適合チェック

オブジェクトビューとは，一時的にASの指定どおりの記述を持つように，オブジェクト参照を扱うものです。オブジェクトビューの言語規則については，マニュアル「COBOL2002　言語　標準仕様編」　「4.3.2(4)　オブジェクトビュー」を参照してください。

オブジェクトビューをオブジェクト参照に指定すると，コンパイル時にオブジェクト参照の適合がチェックされないで，プログラム実行時にオブジェクト参照が指すオブジェクトとオブジェクトビューの指定内容の適合がチェックされます。チェックは，オブジェクト参照にオブジェクトビューの情報（クラス名，インタフェース名など）が設定された場合の，オブジェクト参照の適合チェックと同等となります。

オブジェクトビューを指定して，プログラム実行時に適合をチェックする例を，次に示します。

クラス「CLASS-A」は，クラス「CLASS-B」を継承している。

CLASS-Aは，メソッド「METH-A」を，CLASS-Bは，メソッド「METH-B」を，それぞれ持っている。

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OR-B USAGE OBJECT REFERENCE CLASS-B.
           :
       PROCEDURE DIVISION.
           :
           INVOKE CLASS-A 'NEW' RETURNING OR-B.
               :
           INVOKE OR-B 'METH-A'. *> 1.

上記の場合，1.のINVOKE文は，OR-Bに指定されたCLASS-BがMETH-Aを持たないため，コンパイル時にエラーとなります。しかし，OR-Bが指すのはCLASS-Aから作成されたインスタンスオブジェクトなので，METH-Aを実装しています。このため，1.のINVOKE文では，METH-Aを実行できます。

このような場合，次のようにオブジェクトビューを指定すれば，コンパイルエラーとならないでプログラムを実行できます。

           INVOKE OR-B AS CLASS-A 'METH-A'.
                    オブジェクトビュー

20.2.8　オブジェクト指向によるポリモルフィズム

ポリモルフィズムとは，一つのメッセージに対して異なる処理をすることを許す機能です。オブジェクト指向機能では，メソッドの呼び起こし（INVOKE文）でポリモルフィズムができます。これは，「あるオブジェクト参照は，それに適合するオブジェクトのメソッドを呼び起こせる」というオブジェクト参照の特徴を利用したものです。

ポリモルフィズムの使用例を，次に示します。

（例）

「20.2.5　オブジェクト指向による継承」の「(2)　継承の使い方」の例の場合，クラスの継承関係は，次のようになっています。

「預金口座」クラス←「普通預金口座」クラス←「当座預金口座」クラス

（A←Bは，BがAを継承することを表します）

また，「引き出し」メソッドは，オブジェクトごとに次のようになっていて，それぞれの「引き出し」メソッドの処理内容は異なります。

普通預金口座が実装する「引き出し」メソッド

預金口座から継承したメソッド

当座預金口座が実装する「引き出し」メソッド

当座預金口座で実装したメソッド

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 HA USAGE OBJECT REFERENCE 預金口座. *> 1.
           :
       PROCEDURE DIVISION.
               :
           IF 要求 = 普通預金処理 *> 2.
             INVOKE 普通預金口座 'NEW' RETURNING HA
           ELSE
             INVOKE 当座預金口座 'NEW' RETURNING HA
           END-IF.
               :
           INVOKE HA '引き出し'. *> 3.

継承関係による適合によって，普通預金口座と当座預金口座の両方が適合している預金口座クラスを指定したオブジェクト参照を使います。

要求によって，普通預金口座を使うか当座預金口座を使うか切り分けます。

HAが指すオブジェクトにより，異なる「引き出し」メソッド（普通預金口座のメソッドまたは当座預金口座のメソッド）を実行できます。

20.2.9　オブジェクト指向機能でのマルチスレッド対応

マルチスレッド環境下で，複数のスレッドで同時に実行できるCOBOLプログラムのことを，マルチスレッド対応COBOLプログラムといいます。

ここでは，オブジェクト指向機能を使用したマルチスレッド対応COBOLプログラムの特徴について説明します。マルチスレッド対応COBOLプログラムについては，「26.　マルチスレッド環境での実行」を参照してください。

(1)　マルチスレッド環境下でのメソッドの実行

オブジェクト指向機能を使用したマルチスレッド対応COBOLプログラムのスレッド呼び出しの対象は，プログラム定義および他言語のプログラムです。メソッドはスレッド呼び出しの対象とはなりません。マルチスレッド環境下でメソッドが実行されるのは，スレッド起動後に，プログラム定義から呼び出される場合だけです。

この場合，END METHODによってメソッド処理が終了すると，COBOL実行環境を終了しないで，呼び出し元に制御を返します。

また，スレッド実行中にSTOP RUN文が実行されると，実行中のスレッドを終了します。

(2)　マルチスレッド環境下でのファクトリデータ

マルチスレッド環境下のファクトリデータは，スレッド単位に存在するデータです。データの存在するスレッドだけで参照したり更新したりできます。ほかのスレッドからこのデータを参照したり更新したりすることはできません。

第7編　例外処理

21　共通例外処理

例外処理とは，手続き文の実行中に発生したエラーに対して処理する機能です。COBOL2002では，従来のCOBOLで使用できた入出力機能での例外処理に加えて，さまざまなエラーに対応する処理を記述できます。ここでは，COBOL2002で新しく追加された共通例外処理について説明します。

21.1　共通例外処理の概要

COBOL2002では，プログラムでエラーが発生した場合に，そのエラーに対する回復処理を定義できます。これを，例外処理といいます。

COBOL2002規格では，従来のCOBOLから仕様が拡張され，より細かい例外を処理できるようになりました。

COBOL2002で例外処理を定義する方法を，次に示します。

手続き文固有の例外処理をする場合

次の手続き文には，その文固有の例外処理を定義できます。

AT END指定のあるREAD文／SEARCH文

AT EOP指定のあるWRITE文

INVALID KEY指定があるWRITE文／REWRITE文／DELETE文／START文

ON OVERFLOW／ON EXCEPTION指定があるCALL文

ON OVERFLOW指定があるSTRING文／UNSTRING文

ON SIZE ERROR指定があるADD文／SUBTRACT文／MULTIPLY文／DIVIDE文／COMPUTE文

エラーの種類または入出力ファイル別に例外処理を定義する場合

USE文の宣言手続きを使用すると，発生するエラーの種類や入出力ファイルごとに例外処理を定義できます。

21.1.1　共通例外の仕組みと使用する用語

共通例外の発生から例外処理が実行される状態になるまでには，次のような共通例外の仕組みが規定されています。

図21‒1　共通例外の仕組み

注※

TURN指令については，「21.3　TURN指令」を参照してください。

この章で使用する例外に関する用語について，次に定義します。

この章で使用する用語

意味

例外

例外状態を示します。

TURN指令のチェックがON

TURN指令で，該当する例外名がCHECKING ON指定であり，指定された例外が引き起こせる状態であることを示します。

従来形式の例外処理

従来のCOBOLの言語仕様にある，USE手続きやINVALID KEYなどの文ごとに指定できる無条件文を示します。これに対して，COBOL2002で新たに追加された例外処理を「共通例外処理」といいます。

21.1.2　共通例外処理の機能

COBOL2002で新たに追加された例外処理を「共通例外処理」といいます。共通例外処理は，従来形式の例外処理から次の機能が拡張されています。

例外宣言手続きの実行

従来の例外処理では，入出力機能の例外が検出された場合に対してだけ，宣言手続きが定義できましたが，共通例外処理では，さまざまな機能に対する例外宣言手続きを定義できます。また，宣言手続きから指定した手続き名へ復帰できます。

呼び出し元プログラムへの例外の伝播

検出された例外の情報を，呼び出し元プログラムに伝えられます。このことを，例外の伝播といいます。呼び出し元プログラムでは，伝播によって例外を検出し，例外処理を実行できます。

例外を引き起こす文（RAISE文）を使用して，明示的に例外を引き起こせます。

引き起こした例外の情報を，プログラム中で組み込み関数などを使用して参照できます。

21.1.3　共通例外処理の使用例

プログラムに共通例外処理を追加する例を，次に示します。

この例では，ACCEPT文に内部浮動小数点項目を指定しているため，-NumAcceptコンパイラオプションの指定が必要です。

＜主プログラム：SAMPLE1.CBL（変更前）＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
        ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 PARAM USAGE COMP-1.
        ：
       PROCEDURE DIVISION.

         DISPLAY '値を入力してください '.
         ACCEPT PARAM.
         CALL 'SAMPLE2' USING PARAM.

       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL（変更前）＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
          ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ANS USAGE COMP-1.
       LINKAGE SECTION.
       01 PARAM USAGE COMP-1.
          ：
       PROCEDURE DIVISION USING PARAM.

           COMPUTE ANS = FUNCTION ACOS ( PARAM ).
           DISPLAY 'ANSWER  =' ANS.

       END PROGRAM SAMPLE2.

（変更前のプログラムの説明）

主プログラムSAMPLE1で入力された値について，副プログラムSAMPLE2内でACOS関数を使用して逆余弦の近似値を求めるプログラムです。入力した値が不正な場合，実行時エラーメッセージが出力され，プログラムが異常終了します。

不正な値が入力された場合に共通例外処理を使用して例外を処理するために，上記のプログラムを次のように修正します。

組み込み関数の引数エラーについて，例外チェックを有効にする。

組み込み関数の引数エラーについて例外を引き起こすには，翻訳指令のTURN指令を指定して，対応する例外名EC-ARGUMENT-FUNCTIONのチェックをONにします。

>>TURN EC-ARGUMENT-FUNCTION CHECKING ON

TURN指令については，「21.3　TURN指令」を参照してください。

宣言手続きを記述する。

共通例外処理として，EC-ARGUMENT-FUNCTION例外発生時の宣言手続きを記述します。宣言手続きは，USE文を使用して次のように記述します。

DECLARATIVES.
USE-EC-ARGUMENT SECTION.
  USE AFTER EXCEPTION CONDITION EC-ARGUMENT-FUNCTION.
    DISPLAY '入力値不正!!'.
    RESUME AT ERR-RETRY.
END DECLARATIVES.

この例題では，主プログラムSAMPLE1で共通例外処理するため，SAMPLE1に宣言手続きを記述します。宣言手続きについては，「21.4　共通例外の宣言手続き」を参照してください。

自動伝播を有効にする。

呼び出し先プログラム（SAMPLE2）で引き起こした例外を，呼び出し元プログラム（SAMPLE1）に自動伝播するためには，PROPAGATE指令をONにします。

>>PROPAGATE ON

伝播については，「21.5　例外の伝播」を参照してください。

上記の例外処理を追加したサンプルプログラムを，次に示します。太字（色付き）の個所が，追加部分です。

＜主プログラム：SAMPLE1.CBL（変更後）＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 PARAM USAGE COMP-1.
           ：
       PROCEDURE DIVISION.
       DECLARATIVES. *> 3.
         USE-EC-ARGUMENT SECTION.
           USE AFTER EXCEPTION CONDITION
                               EC-ARGUMENT-FUNCTION.
           DISPLAY '入力値不正!!'.
           RESUME AT ERR-RETRY. *> 4.
       END DECLARATIVES.

       ERR-RETRY.
         DISPLAY '値を入力してください '.
         ACCEPT PARAM.
       >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
         CALL 'SAMPLE2' USING PARAM. *> 2.

       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL（変更後）＞

       >>PROPAGATE ON
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
        ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ANS USAGE COMP-1.
       LINKAGE SECTION.
       01 PARAM USAGE COMP-1.
        ：
       PROCEDURE DIVISION USING PARAM.

       >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
           COMPUTE ANS = FUNCTION ACOS ( PARAM ). *> 1.
           DISPLAY 'ANSWER  =' ANS.

       END PROGRAM SAMPLE2.

（変更後のプログラムの説明）

このプログラムを実行すると，SAMPLE2のCOMPUTE文（1.）で組み込み関数ACOSの引数エラーが発生した場合，次のように例外宣言処理が実行されます。

SAMPLE2のCOMPUTE文で組み込み関数ACOSの引数エラーが発生します。

組み込み関数の引数エラーに対応する例外名EC-ARGUMENT-FUNCTIONのTURN指令のチェックがONのため，例外が引き起こされます。このとき，PROPAGATE指令がONになっているので，SAMPLE1のCALL文に例外が伝播します。

例外宣言手続きが実行されます。

RESUME文によって，例外宣言手続きからERR-RETRY節に制御が戻ります。

21.1.4　共通例外処理に対応している機能

COBOL2002で共通例外処理に対応している機能を，次に示します。

表21‒1　共通例外が使用できる機能一覧

種類

機能名

共通例外への対応

備考

規格

基本機能

○

順編成ファイル

○

相対編成ファイル

○

索引編成ファイル

○

整列併合

△※1

プログラム間連絡

△

詳細については，「21.8.2　例外検出での注意事項」の「(2)　プログラム間連絡での注意事項」を参照のこと。

組み込み関数

○

オブジェクト指向

○

再帰呼び出し

○

利用者定義関数

○

局所場所節（LOCAL-STORAGE SECTION）

○

X/Open

テキスト編成ファイル

○

ファイル共用（ファイルシェア）

×

コマンド行および環境変数へのアクセス

×

画面節（SCREEN SECTION）による画面操作

×

C言語インタフェース

×

拡張機能

日本語

×

ブール（ビット操作）

○

アドレス操作

○

1バイト2進機能・COMP-X項目

○

浮動小数点項目

○

報告書作成機能

×

HiRDBによる索引編成ファイル

○

Btrieveによる索引編成ファイル※2

○

CSV編成ファイル

○

ラージファイル入出力

○

プリンタへのアクセス（入出力による書式印刷機能）※2

○

プリンタへのアクセス（GDIモード印刷）

○

プリンタへのアクセス（ESC/Pモード印刷）

○

ファイルのディスク書き込み保証

○

イベントログファイル出力機能

×

通信節による画面操作

×

画面節（WINDOW SECTION）による画面操作

×

データコミュニケーション機能

×

データベース操作機能

×

XDMによるデータベースシミュレーション機能

×

OLE2オートメーションインタフェース機能

×

マルチスレッド環境での実行

○

基本機能サービスルーチン

×

COBOL入出力サービスルーチン

×

バイトストリーム入出力サービスルーチン

×

MSMQアクセス機能

×

Unicode機能

○

数字項目のけた拡張機能※3

△※4

動的長基本項目機能

○

定数長拡張機能

○

Javaプログラム呼び出し機能

×

デバッグ

実行時デバッグ機能

○

テストデバッグ機能

○

カバレージ機能

○

（凡例）

○：共通例外処理を使用できる

△：共通例外処理を制限付きで使用できる

×：エラーは発生するが，共通例外処理を使用できない

注※1

整列併合処理の共通例外処理への対応を，次に示します。

処理

共通例外への対応

SORT文

使用できない

MERGE文

使用できない

SORT／MERGE文のUSING／GIVINGに指定したファイルの入出力処理

使用できない

整列併合処理の入出力手続きに指定したファイルの入出力処理

使用できる

整列処理のRELEASE文

使用できる

整列処理のRETURN文

使用できる

（ただし，併合処理に使用している整列併合ファイルに対する，整列処理のRETURN文では使用できない）

併合処理のRETURN文

使用できない

注※2

Windows(x86) COBOL2002で有効です。

注※3

Windows(x64) COBOL2002で有効です。

注※4

数字項目のけた拡張機能を使用する場合，EC-SIZE例外を使用できません。詳細については，「29.　数字項目のけた拡張機能（Windows(x64) COBOL2002で有効）」を参照してください。

21.2　例外

例外は，手続き文の実行中にエラーが発生した場合，または例外を伝播した場合に検出されます。検出された例外に対して共通例外処理を実行するには，例外に対応する例外名を，TURN指令でONに指定しておきます。また，RAISE文を実行した場合は，無条件に指定した例外が引き起こされます。

共通例外処理は，引き起こされた例外に基づいて処理を実行します。例外は，例外名，または例外オブジェクトとして表されます。

21.2.1　例外名

例外名とは，おのおのの例外に関連づけられた名前のことです。例えば，「0による除算」の例外は，例外名「EC-SIZE-ZERO-DIVIDE」として識別されます。

(1)　例外名のレベル

例外名には，次の三つのレベルがあります。

レベル3

最下位のレベルに位置する例外名です。

レベル3に分類される例外名は，おのおのの例外を表します。

レベル2

レベル3の上位に位置する例外名です。

レベル2に分類される例外名は，レベル3例外名を機能や分類によってまとめたものです。機能・分類単位の例外を包括して指定したい場合に使用します。

レベル1

最上位に位置する例外名です。

レベル1に分類される例外名は，「EC-ALL」だけです。「EC-ALL」を指定すると，すべての例外名を指定したのと同じように処理されます。

すべての例外を包括して指定したい場合に使用します。

図21‒2　例外名のレベル構成

(2)　例外名の一覧

例外名の一覧を，次に示します。

表21‒2　例外名の一覧

例外名

致命度

説明

検出される文

EC-ALL

−

すべての例外

−

EC-ARGUMENT

−

引数エラー

−

EC-ARGUMENT-FUNCTION

致命的

関数で引数エラーが発生した

組み込み関数を指定できる手続き文※1

EC-ARGUMENT-IMP

致命的

組み込み関数の処理中にメモリ不足などのエラーが発生した

組み込み関数を指定できる手続き文※1

EC-BOUND

−

区域外

−

EC-BOUND-ODO

致命的

OCCURS〜DEPENDING ONデータ項目が区域外である※2

OCCURS DEPENDING ON一意名に値を設定する手続き文※1

EC-BOUND-REF-MOD

致命的

区域外の部分参照子である※3

部分参照を指定できる手続き文※1

EC-BOUND-SUBSCRIPT

致命的

区域外の添字である※4

添字を指定できる手続き文※1

EC-DATA

−

データ例外

−

EC-DATA-PTR-NULL

致命的

アドレス名によって参照されるデータ項目を参照するとき，アドレス名の設定値がNULLである

アドレス名によって参照されるデータ項目を指定した手続き文※5

EC-FLOW

−

実行制御フロー違反

−

EC-FLOW-GLOBAL-EXIT

致命的

大域的な宣言手続き中でEXIT PROGRAM文が実行された

EXIT文

EC-FLOW-GLOBAL-GOBACK

致命的

大域的な宣言手続き中でGOBACK文が実行された

GOBACK文

大域的な宣言手続き中での自動伝播の対象となる例外を引き起こした手続き文

EC-FLOW-IMP

致命的

ALTER文で行き先を指定する前に，行き先を省略したGO TO文が実行された

GO TO文

EC-FLOW-RELEASE

致命的

RELEASE文がSORT文の範囲内にない

RELEASE文

EC-FLOW-RETURN

致命的

RETURN文がMERGE文やSORT文の範囲内にない

RETURN文

EC-FLOW-USE

致命的

USE文が別のUSE手続きを実行させた

宣言手続き中で実行中の宣言手続きを実行する例外を引き起こした手続き文

EC-I-O

−

入出力例外

−

EC-I-O-AT-END

非致命的

入出力状態「1x」が発生した

READ文

EC-I-O-EOP

非致命的

ページ終了条件が発生した

WRITE文

EC-I-O-EOP-OVERFLOW

非致命的

ページあふれ条件が発生した

WRITE文

EC-I-O-IMP

致命的

入出力状態「9x」が発生した（入出力状態の詳細は，「付録H　入出力状態の値」を参照）

OPEN文

CLOSE文

READ文

WRITE文

REWRITE文

DELETE文

START文

EC-I-O-INVALID-KEY

非致命的

入出力状態「2x」が発生した

READ文

REWRITE文

START文

WRITE文

DELETE文

EC-I-O-LINAGE

致命的

LINAGE句に指定したデータ名の値が要求範囲外である

WRITE文

OPEN文

EC-I-O-LOGIC-ERROR

致命的

入出力状態「4x」が発生した

READ文

CLOSE文

REWRITE文

DELETE文

START文

OPEN文

WRITE文

EC-I-O-PERMANENT-ERROR

致命的

入出力状態「3x」が発生した

READ文

OPEN文

WRITE文

REWRITE文

DELETE文

EC-OO

−

オブジェクト指向に関連するすべての既定義例外

−

EC-OO-CONFORMANCE

致命的

オブジェクトビューに対する不成功が発生した

オブジェクトビューを指定できる手続き文

EC-OO-EXCEPTION

致命的

例外オブジェクトが処理されなかった

EXIT文

GOBACK文

EC-OO-IMP

致命的

INVOKE文の一意名1に指定されたハンドルの値が正しくない

INVOKE文

EC-OO-METHOD

致命的

要求されるメソッドが使用できない

INVOKE文

EC-OO-NULL

致命的

NULLオブジェクト参照を使用してメソッドを呼び起こそうとした

INVOKE文

EC-OO-RESOURCE

致命的

オブジェクトの作成や拡張に必要なシステム資源が不十分である

INVOKE文

EC-OO-UNIVERSAL

致命的

実行時の型チェックが失敗した

INVOKE文

EC-OVERFLOW

−

けたあふれ条件

−

EC-OVERFLOW-STRING

非致命的

STRING文のけたあふれ条件が発生した

STRING文

EC-OVERFLOW-UNSTRING

非致命的

UNSTRING文のけたあふれ条件が発生した

UNSTRING文

EC-PROGRAM

−

プログラム間連絡例外

−

EC-PROGRAM-ARG-MISMATCH

致命的

引数が不一致である

CALL文

EC-PROGRAM-CANCEL-ACTIVE

致命的

取り消されるプログラムが活性状態である

CANCEL文

EC-PROGRAM-IMP

致命的

DLLをロード中にエラーが発生した

CALL文で実行可能ファイルの処理中にエラーが発生した

EXTERNAL句を指定したデータ項目やファイル定義を処理中にエラーが発生した

CALL文

利用者定義関数を指定できる手続き文

EC-PROGRAM-NOT-FOUND

致命的

呼び出し先プログラムが見つからない

CALL文

EC-PROGRAM-RECURSIVE-CALL

致命的

呼び出し先プログラムが活性状態である

CALL文

EC-PROGRAM-RESOURCES

致命的

呼び出し先プログラムで資源が使用できない

CALL文

利用者定義関数を指定できる手続き文

EC-RAISING

−

EXIT文RAISING指定かGOBACK文RAISING指定で発生する例外

−

EC-RAISING-NOT-SPECIFIED

致命的

EXIT文RAISING指定かGOBACK文RAISING指定のEC-USER例外条件が手続き部見出しのRAISING指定にない

EXIT文

GOBACK文

EC-RANGE

−

範囲例外

−

EC-RANGE-INSPECT-SIZE

致命的

INSPECT文での置き換え項目のサイズが異なる

INSPECT文

EC-RANGE-INVALID

非致命的

THROUGH範囲の開始値が終了値よりも大きい

EVALUATE文

条件名指定のIF文

EC-RANGE-PERFORM-VARYING

致命的

PERFORM文で変更項目の設定が負値である

PERFORM文

EC-RANGE-SEARCH-INDEX

非致命的

指標の初期値が範囲外のため，SEARCH文で表要素が見つからない

SEARCH文

EC-RANGE-SEARCH-NO-MATCH

非致命的

探索基準に合致する要素がないため，SEARCH文で表要素が見つからない

SEARCH文

EC-SIZE

−

けたあふれ例外

−

EC-SIZE-EXPONENTIATION

致命的

べき乗演算規則の違反が発生した

COMPUTE文

EC-SIZE-OVERFLOW

致命的

計算でのけたあふれが発生した

ADD文

COMPUTE文

MULTIPLY文

DIVIDE文

SUBTRACT文

EC-SIZE-TRUNCATION

致命的

格納での有効けた切り捨てが発生した

MOVE文

COMPUTE文

ADD文

SUBTRACT文

DIVIDE文

MULTIPLY文

EC-SIZE-UNDERFLOW

致命的

浮動小数点での下位けたあふれが発生した

ADD文

COMPUTE文

MULTIPLY文

DIVIDE文

SUBTRACT文

EC-SIZE-ZERO-DIVIDE

致命的

ゼロによる除算が発生した

COMPUTE文

DIVIDE文

EC-SORT-MERGE

−

整列併合機能の例外

−

EC-SORT-MERGE-IMP

致命的

整列併合用ファイル記述項のRECORD句で指定したDEPENDING ONデータ名の値が数字ではない

RELEASE文

RETURN文

EC-SORT-MERGE-RELEASE

致命的

RELEASE文のレコードが長過ぎるまたは短過ぎる

RELEASE文

EC-SORT-MERGE-RETURN

致命的

RETURN文がファイル終了条件発生中に実行された

RETURN文

EC-USER

−

利用者定義の例外

−

EC-USER-（ユーザ定義例外名）

非致命的

レベル3の利用者定義の例外条件

RAISE文

EXIT文

GOBACK文

（凡例）

−：発生したレベル3の例外名の動作に従う

注※1

詳細は「21.8.1　例外が検出される文の詳細」を参照してください。

注※2

表操作で，DEPENDING ON指定のデータ名に格納されている繰り返し回数が，表の最小から最大の範囲にないことを示します。

注※3

部分参照の指定が，一意名の範囲内にないことを示します。

注※4

表操作で使用する添字または指標名が指す表要素が，表の範囲内にないことを示します。

注※5

ただし，連絡節中のデータ項目に対するポインタ変数がNULLである場合，例外が検出されません。

（例）

連絡節中のデータ項目に対してSET文のADDRESS OFによってNULLを設定したあと，そのデータ項目を参照した場合は，例外が検出されません。

(3)　利用者定義例外名

利用者定義例外名とは，ユーザが独自の例外を定義して使用できる機能です。

利用者定義例外名は，「EC-USER-」で始まる任意の例外名を記述して定義します。利用者定義例外名の命名規則については，マニュアル「COBOL2002　言語　標準仕様編」　「10.5.11(1)　例外」を参照してください。

利用者定義例外名として，「EC-USER-EXCEPTION」という例外名を使用する場合のコーディング例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.

       PROCEDURE DIVISION.
       DECLARATIVES.
         EXCEPTIONHANDLER SECTION.
           USE AFTER EXCEPTION CONDITION EC-USER-EXCEPTION. *> 1.
             DISPLAY  'EC-USER-EXCEPTION発生'.
       END DECLARATIVES.

           RAISE EXCEPTION EC-USER-EXCEPTION. *> 2.

       END PROGRAM SAMPLE.

例外宣言手続き部に利用者定義例外名「EC-USER-EXCEPTION」を定義します。

RAISE文にEC-USER-EXCEPTIONを指定して，利用者定義の例外を引き起こします。

RAISE文で例外を引き起こす場合，TURN指令のチェックをONにして例外チェックを有効にする必要はありません。

RAISE文については，「21.6　明示的な例外の引き起こし」を参照してください。

21.2.2　例外オブジェクト

例外オブジェクトは，オブジェクト指向機能を使用したCOBOLプログラムで例外を取得するときに，例外名に関連づけられた例外と同じように使用します。例外オブジェクトは，例外名に関連づけられた例外と比べて，多様な例外状況を取得できます。例外オブジェクトの詳細については，「21.7.2　EXCEPTION-OBJECT」を参照してください。また，オブジェクト指向機能については，「20.　オブジェクト指向機能」を参照してください。

21.2.3　例外の致命度

例外には致命的例外と非致命的例外の2種類があります。

例外の致命度と例外名／例外オブジェクトとの対応を，次に示します。

図21‒3　例外の致命度と例外名／例外オブジェクトとの対応

例外が発生した場合の動作，および共通例外処理での例外処理は，例外の致命度によってそれぞれ次のように異なります。

致命的例外の場合

実行単位が異常終了します。

非致命的例外の場合

実行が継続されます。

ただし，例外宣言手続きを記述することで，致命度に関係なく，例外発生時に対応する宣言手続きが実行できます。宣言手続き実行後の動作については，「21.4　共通例外の宣言手続き」を参照してください。

例外の種類と致命度の対応については，「21.2.1　例外名」の「(2)　例外名の一覧」を参照してください。

なお，利用者定義例外名は，すべて非致命的な例外となります。

21.2.4　最新例外状態

実行単位で最後に引き起こされた例外は，最新例外状態として保持されます。最新例外状態は，例外が検出されていない状態か，検出されていれば例外に対応する例外名，例外オブジェクトのどちらかを示します。

最新例外状態は，例外が引き起こされた場合に更新され，例外が引き起こされないで実行が完了したか，SET LAST EXCEPTION TO OFFによって最新状態がクリアされるまで保持されます。最新例外状態は，次の場合に更新されます。

手続き文の実行中にエラーが発生し，例外が引き起こされた場合

RAISE文を実行した場合

EXIT，GOBACK文のRAISING指定に例外名または一意名を指定して，例外を伝播し，伝播先のプログラムで例外が引き起こされた場合。

最新例外状態は，組み込み関数を使用して参照できます。詳細は，「21.7.1　組み込み関数を使用した例外情報の参照」を参照してください。

また，最新例外状態のクリアについては，「21.7.3　最新例外状態のクリア」を参照してください。

21.3　TURN指令

特定の例外に対する共通例外処理は，TURN指令によって対応する例外名のチェックをONにすることで，指定します。ただし，RAISE文や例外オブジェクトで引き起こされる例外だけを扱う場合は，TURN指令のチェックをONにする必要はありません。

21.3.1　TURN指令によるチェック

TURN指令に例外名を指定してチェックをONにすると，例外名に対する例外を引き起こせます。

TURN指令には，例外を表すレベル3例外名以外にも，レベル2またはレベル1の例外名を指定できます。また，EC-I-O例外名については，ファイル名を指定して，そのファイル名に対してだけチェックをON，またはOFFにできます。

TURN指令については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.15　TURN指令」を参照してください。

TURN指令に指定する例外名のレベルと，そのTURN指令の対象となる例外名の対応を，次に示します。

表21‒3　TURN指令と対象の例外名

TURN指令に指定する

例外名のレベル

対象となる例外名

レベル1

すべてのレベル3例外名

レベル2

指定した機能，分類に対応するレベル3例外名

レベル3

指定したレベル3例外名

表21‒4　TURN指令と対象の例外名（EC-I-O例外名）

TURN指令に指定する

例外名のレベル

ファイル名の

指定

対象となるEC-I-O例外名

レベル2

あり

指定したファイル名に対応するすべてのレベル3例外名

なし

すべてのファイルに対応するすべてのレベル3例外名

レベル3

あり

指定したファイル名に対応するレベル3例外名

なし

すべてのファイルに対応する指定したレベル3例外名

21.3.2　TURN指令の有効範囲

TURN指令は，そのTURN指令を記述した行以降で開始される文に対して有効となります。TURN指令を文の途中に記述した場合，TURN指令はその文には適用されないで，次の文から適用されます。このため，一つの文の中でTURN指令のチェックのON／OFFを切り替えられません。

TURN指令を文の途中に記述した場合の例を，次に示します。

文の範囲は，先頭の語である文の名前から，明示的または暗黙的に文が終了するまでとなります。文の開始から終了までの間の構文に現れたすべての手続き文も，文の範囲に含まれます。このとき，入れ子構造になっている文の一部を共通例外処理の対象としたい場合は，対象の文の直前でTURN指令のチェックをONにします。

次の例では，PERFORM文，READ文，SET文，COMPUTE文は，それぞれ文です。このとき，READ文は，SET文およびCOMPUTE文を含み，PERFORM文はそのREAD文全体を含みます。

図21‒4　文の範囲

上記の例で，COMPUTE文のEC-SIZEチェックを有効にしたい場合，次のように記述します。

（COMPUTE文のEC-SIZEチェックを有効にする例）

           READ RECORD1
           AT END
             SET EOF TO TRUE
           NOT AT END
             >>TURN EC-SIZE CHECKING ON
             COMPUTE C = A + B
           END-READ

READ文から見た場合，TURN指令が文の途中に記述されています。そのため，READ文に対しては，TURN指令が適用されません。

COMPUTE文から見た場合，TURN指令が文の外に記述されています。そのため，COMPUTE文に対しては，TURN指令が適用されます。

また，SET文およびCOMPUTE文のEC-SIZEチェックを有効にしたい場合，次のように記述します。

（SET文およびCOMPUTE文のEC-SIZEチェックを有効にする例）

           READ RECORD1
           >>TURN EC-SIZE CHECKING ON
           AT END
             SET EOF TO TRUE
           NOT AT END
             COMPUTE C = A + B
           END-READ

READ文から見た場合，TURN指令が文の途中に記述されています。そのため，READ文に対しては，TURN指令が適用されません。

SET文およびCOMPUTE文から見た場合，TURN指令が文の外に記述されています。そのため，SET文およびCOMPUTE文に対しては，TURN指令が適用されます。

21.3.3　例外チェックが無効な場合の動作

(1)　手続き文の実行中にエラーが発生し，例外を検出した場合

手続き文でエラーが発生して例外を検出した際に，該当する例外チェックが無効な場合は，検出された例外，コンパイラオプションの指定，および例外が検出された文に対する無条件文の指定によって，動作が異なります。

共通例外処理で取り扱える例外名について，例外チェックが無効な場合の動作を，次に示します。

表21‒5　エラー発生後に検出した例外に対して例外チェックが無効な場合の動作

例外名

例外チェックが無効な場合の動作

EC-ALL

以下のレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-ARGUMENT

EC-ARGUMENTに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-ARGUMENT-FUNCTION

組み込み関数がDISPLAY-OF関数またはNATIONAL-OF関数で文字コード変換の例外が発生した場合

・-FunctionECSup,CodeConvErrオプションなしのとき

　実行時エラーで異常終了。

・-FunctionECSup,CodeConvErrオプションありのとき

　エラーとならない。

組み込み関数がDISPLAY-OF関数またはNATIONAL-OF関数以外の場合

実行時エラーで異常終了。

EC-ARGUMENT-IMP

組み込み関数がDISPLAY-OF関数またはNATIONAL-OF関数で文字コード変換の例外が発生した場合

・-FunctionECSup,CodeConvErrオプションなしのとき

　実行時エラーで異常終了。

・-FunctionECSup,CodeConvErrオプションありのとき

　エラーとならない。

組み込み関数がDISPLAY-OF関数またはNATIONAL-OF関数以外の場合

実行時エラーで異常終了。

EC-BOUND

EC-BOUNDに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-BOUND-ODO

エラーとならないが，実行結果は保証しない。※1

EC-BOUND-REF-MOD

-DebugCompatiオプションなしの場合

エラーとならないが，実行結果は保証しない。※1

-DebugCompatiオプションありの場合

実行時エラーで異常終了。

EC-BOUND-SUBSCRIPT

-DebugCompatiまたは-DebugRangeオプションなしの場合

エラーとならないが，実行結果は保証しない。※1

-DebugCompatiまたは-DebugRangeオプションありの場合

実行時エラーで異常終了。

EC-DATA

EC-DATAに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-DATA-PTR-NULL

アプリケーションエラー（ハードウェア例外）で異常終了。

EC-FLOW

EC-FLOWに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-FLOW-GLOBAL-EXIT

エラーとならない。

EC-FLOW-GLOBAL-GOBACK

エラーとならない。

EC-FLOW-IMP

実行時エラーで異常終了。

EC-FLOW-RELEASE

実行時エラーで異常終了。

EC-FLOW-RETURN

実行時エラーで異常終了。

EC-FLOW-USE

実行時エラーで異常終了。

EC-I-O

EC-I-Oに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-I-O-AT-END

-Compati85,IoStatusオプションなしの場合

エラーとならない。

-Compati85,IoStatusオプションありの場合

AT END指定がない場合は実行時エラーで異常終了。

EC-I-O-EOP

エラーとならない。

EC-I-O-EOP-OVERFLOW

エラーとならない。

EC-I-O-IMP

実行時エラーで異常終了。

EC-I-O-INVALID-KEY

-Compati85,IoStatusオプションなしの場合

エラーとならない。

-Compati85,IoStatusオプションありの場合

INVALID KEY指定がない場合は実行時エラーで異常終了。

EC-I-O-LINAGE

-Compati85,Linageオプションなしの場合

実行時エラーで異常終了。

-Compati85,Linageオプションありの場合

エラーとならない。

EC-I-O-LOGIC-ERROR

実行時エラーで異常終了。

EC-I-O-PERMANENT-ERROR

実行時エラーで異常終了。

EC-OO

EC-OOに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-OO-CONFORMANCE

実行時エラーで異常終了。

EC-OO-EXCEPTION

実行時エラーで異常終了。

EC-OO-IMP

実行時エラーで異常終了。

EC-OO-METHOD

実行時エラーで異常終了。

EC-OO-NULL

実行時エラーで異常終了。

EC-OO-RESOURCE

実行時エラーで異常終了。

EC-OO-UNIVERSAL

実行時エラーで異常終了。

EC-OVERFLOW

EC-OVERFLOWに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-OVERFLOW-STRING

ON OVERFLOW指定がない場合でもエラーとはならない。例外が検出される時点までの処理は実行されており，その時点までの実行結果は保証する。

EC-OVERFLOW-UNSTRING

ON OVERFLOW指定がない場合でもエラーとはならない。例外が検出される時点までの処理は実行されており，その時点までの実行結果は保証する。

EC-PROGRAM

EC-PROGRAMに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-PROGRAM-ARG-MISMATCH

コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2

EC-PROGRAM-CANCEL-ACTIVE

実行時エラーで異常終了。

EC-PROGRAM-IMP

コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2

EC-PROGRAM-NOT-FOUND

コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2

EC-PROGRAM-RECURSIVE-CALL

コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2

EC-PROGRAM-RESOURCES

コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2

EC-RAISING

EC-RAISINGに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-RAISING-NOT-SPECIFIED

実行時エラーで異常終了。

EC-RANGE

EC-RANGEに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-RANGE-INSPECT-SIZE

実行時エラーで異常終了。

EC-RANGE-INVALID

エラーとならないが，実行結果は保証しない。

EC-RANGE-PERFORM-VARYING

エラーとならないが，実行結果は保証しない。

EC-RANGE-SEARCH-INDEX

エラーとならないが，実行結果は保証しない。

EC-RANGE-SEARCH-NO-MATCH

エラーとならないが，実行結果は保証しない。

EC-SIZE

EC-SIZEに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-SIZE-EXPONENTIATION

コンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3

EC-SIZE-OVERFLOW

エラーとならないが，ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。なお，べき乗演算についてはコンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3

EC-SIZE-TRUNCATION

エラーとならないが，ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。

EC-SIZE-UNDERFLOW

エラーとならないが，ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。なお，べき乗演算についてはコンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3

EC-SIZE-ZERO-DIVIDE

-TDInfオプションなしの場合

ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合はアプリケーションエラー（ハードウェア例外）で異常終了。

-TDInfオプションありの場合

ON SIZE ERROR,またはNOT ON SIZE ERROR指定がない場合は実行時エラーで異常終了。

EC-SORT-MERGE

EC-SORT-MERGEに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-SORT-MERGE-IMP

実行時エラーで異常終了。

EC-SORT-MERGE-RELEASE

実行時エラーで異常終了。

EC-SORT-MERGE-RETURN

実行時エラーで異常終了。

EC-USER

EC-USERに関連するレベル3の例外が発生した場合，おのおのに対応する動作となる。

EC-USER-（ユーザ定義例外名）

エラーとならない。

注※1

メモリの状態によっては，ハードウェア例外となる場合があります。

注※2

動作の詳細については，「表21‒6　EC-PROGRAMとコンパイラオプションの組み合わせによる動作の相違」を参照してください。

注※3

動作の詳細については，「表21‒7　べき乗演算とコンパイラオプションの組み合わせによる動作の相違」を参照してください。

表21‒6　EC-PROGRAMとコンパイラオプションの組み合わせによる動作の相違

例外名

-Compati85,Call

指定の有無

CALL文のON EXCEPTION または ON OVERFLOWの指定

あり

なし

EC-PROGRAM-ARG-MISMATCH

あり

-DebugCompatiありの場合

実行時エラーで異常終了。

-DebugCompatiなしの場合

エラーとはならないが，実行結果を保証しない場合がある（引数や返却項目の参照／設定の状態によっては，ハードウェア例外や実行結果不正となる場合がある）。

なし

-DebugCompatiありの場合

指定された無条件文を実行。

-DebugCompatiなしの場合

エラーとはならないが，実行結果を保証しない場合がある（引数や返却項目の参照／設定の状態によっては，ハードウェア例外や実行結果不正となる場合がある）。

-DebugCompatiありの場合

実行時エラーで異常終了。

-DebugCompatiなしの場合

エラーとはならないが，実行結果を保証しない場合がある（引数や返却項目の参照／設定の状態によっては，ハードウェア例外や実行結果不正となる場合がある）。

EC-PROGRAM-IMP

あり

実行可能ファイル呼び出し，またはDLLロード時に例外を検出した場合，指定された無条件文を実行。

上記以外の場合，実行時エラーで異常終了。

実行時エラーで異常終了。

なし

指定された無条件文を実行。

EC-PROGRAM-NOT-FOUND

あり

指定された無条件文を実行。

実行時エラーで異常終了。

なし

EC-PROGRAM-RECURSIVE-CALL

あり

実行時エラーで異常終了。

なし

指定された無条件文を実行。

実行時エラーで異常終了。

EC-PROGRAM-RESOURCES

あり

実行時エラーで異常終了。

なし

指定された無条件文を実行。

実行時エラーで異常終了。

表21‒7　べき乗演算とコンパイラオプションの組み合わせによる動作の相違

種別※

例外名

-Compati85,Power指定の有無

COMPUTE文のON SIZE ERRORの指定

あり

なし

NOT ON SIZE ERROR

NOT ON SIZE ERROR

あり

なし

あり

なし

整数べき乗

EC-SIZE-EXPONENTIATION

底 ：0

指数：0

あり

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

なし

ON SIZEを実行。

エラーとならない。

底 ：0

指数：負

あり

ON SIZEを実行。

エラーとならない。

実行時エラーで異常終了。

なし

浮動小数点べき乗

EC-SIZE-EXPONENTIATION

底 ：0

指数：0

あり

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

なし

ON SIZEを実行。

エラーとならない。

底 ：0

指数：負

あり

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

なし

ON SIZEを実行。

エラーとならない

実行時エラーで異常終了。

底 ：負

指数：小数

あり

ON SIZEを実行。

エラーとならない。

実行時エラーで異常終了。

なし

EC-SIZE-OVERFLOW

あり

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

なし

ON SIZEを実行。

エラーとならない。

EC-SIZE-UNDERFLOW

あり

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

なし

ON SIZEを実行。

エラーとならない。

注※

被べき数（底）が浮動小数点項目であるか，またはべき数（指数）が整数でない場合に演算の中間結果が浮動小数点形式となり，上表の浮動小数点べき乗演算となります。

これ以外は，演算の中間結果が整数形式となり，整数べき乗演算となります。

演算の中間結果の詳細については，「5.2.4　演算の中間結果」を参照してください。

(2)　伝播によって例外を検出した場合

伝播によって例外を検出した場合，CALL文，INVOKE文，および利用者定義関数の呼び出しで検出された例外名の例外チェックが無効なときは，例外の致命度によって，次に示す処理が実行されます。

表21‒8　伝播によって検出した例外に対して例外チェックが無効な場合の動作

致命度

動作

致命的な例外

「図21‒5　プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが，プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例」のように，制御遷移した文（CALL文，INVOKE文，および利用者定義関数の呼び出し）で，実行時エラーメッセージ（KCCC0402R-S）を出力し，実行単位が異常終了となる。

なお，例外を受け取れないプログラム※の場合は，「図21‒6　プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが，プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例」のように，呼び出し先プログラム中の例外を検出した文で，実行時エラーメッセージ（KCCC0403R-S）を出力し，実行単位が異常終了となる。

非致命的な例外

「図21‒7　非致命的な例外のときは，例外の伝播は無視され，実行が継続される場合の動作例」のように，例外の伝播は無視され，実行が継続される。

注※

例外を受け取れないプログラムの詳細については，「21.5.3　例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

例外の伝播によって検出された例外の詳細については，「表21‒15　例外の伝播によって検出された例外」を参照してください。

図21‒5　プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが，プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例

プログラム「PARENTPROGRAM」中のCALL文で，プログラム「CHILDPROGRAM」を呼び出します。

プログラム「CHILDPROGRAM」のDIVIDE文で，ゼロによる除算の例外が検出されます（例外名：EC-SIZE-ZERO-DIVIDE）。

PROPAGATE指令がONなので，プログラム「PARENTPROGRAM」のCALL文に致命的な例外が伝播します。

プログラム「PARENTPROGRAM」中で，伝播された致命的な例外（例外名：EC-SIZE-ZERO-DIVIDE）に対する例外チェックが無効なので，CALL文で実行時エラーメッセージ（KCCC0402R-S：「伝播により例外が検出されました。」）を出力し，プログラムが異常終了します。

図21‒6　プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが，プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例

プログラム「PARENTPROGRAM」中のCALL文で，プログラム「CHILDPROGRAM」を呼び出します。

プログラム「CHILDPROGRAM」中のDIVIDE文で，ゼロによる除算の例外が検出されます（例外名：EC-SIZE-ZERO-DIVIDE）。

PROPAGATE指令がONになっていますが，プログラム「PARENTPROGRAM」が例外を受け取れないプログラム※なので，致命的な例外が伝播できません。そのため，プログラム「CHILDPROGRAM」の例外を検出した文（DIVIDE文）で実行時エラーメッセージ（KCCC0403R-S：「例外を伝播できません。」）を出力し，プログラムが異常終了します。

注※

この場合の例外を受け取れないプログラムとは，次の条件がすべて重なった場合を指します。

プログラム中にON指定のあるPROPAGATE指令が書かれていない。

プログラム中にTURN指令が一つも書かれていない。

宣言節中のUSE文にEXCEPTION OBJECT指定が一つもない。

CALL文にON OVERFLOW指定，ON EXCEPTION指定，NOT ON EXCEPTION指定がない。

例外を受け取れないプログラムの詳細については，「21.5.3　例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

図21‒7　非致命的な例外のときは，例外の伝播は無視され，実行が継続される場合の動作例

プログラム「PARENTPROGRAM」中のCALL文で，プログラム「CHILDPROGRAM」を呼び出します。

プログラム「CHILDPROGRAM」中のSEARCH文で，指標名の範囲外による例外が検出されます（例外名：EC-RANGE-SEARCH-INDEX）。

PROPAGATE指令がONになっていますが，非致命的な例外のときは，例外の伝播は無視され，実行が継続されます。

21.4　共通例外の宣言手続き

USE文に，引き起こされた例外に対する例外名，または例外オブジェクトを指定している場合，共通例外の宣言手続きが実行されます。

共通例外の宣言手続きは，USE文に例外名，例外オブジェクトのクラス名，インタフェース名を指定して記述します。さらに，例外名EC-I-Oについては，ファイル名を指定すると，特定のファイルに対するUSE文を記述できます。USE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.53　USE文」を参照してください。

21.4.1　実行される宣言手続き

実行される宣言手続きは，引き起こされた例外と，USE文に指定した例外によって決定します。実行される宣言手続きの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.53　USE文」を参照してください。

(1)　例外によって実行される宣言手続き

例外名に関連する場合

引き起こされた例外が例外名に関連する場合は，例外に対応する例外名，または上位レベルの例外名が指定されたUSE文の宣言手続きが実行されます。

例外オブジェクトの場合

引き起こされた例外オブジェクトに適合するクラス名またはインタフェース名が指定されたUSE文の宣言手続きが実行されます。

(2)　実行される宣言手続きの優先順位

引き起こされた例外に対して宣言手続きを複数記述した場合，レベル3，レベル2，レベル1の順に検索され，宣言手続きが一つだけ実行されます。

次の例では，引き起こされた例外の例外名EC-SIZE-ZERO-DIVIDEに対して，実行される宣言手続きがEXCEPTIONHANDLER1（例外名EC-SIZEに該当）とEXCEPTIONHANDLER2（例外名EC-SIZE-ZERO-DIVIDEに該当）の2種類があります。この場合，レベル2の例外よりもレベル3の例外が優先されるため，EXCEPTIONHANDLER1は実行されないで，EXCEPTIONHANDLER2が実行されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
       >>TURN EC-SIZE CHECKING ON
       DATA DIVISION.
       WORKING-STORAGE  SECTION.
       01 A PIC 9.
       01 B PIC 9 VALUE 0.
       01 C PIC 9.

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER1 SECTION.
         USE AFTER EXCEPTION CONDITION EC-SIZE. *> 2.
           DISPLAY 'EC-SIZE'.
       EXCEPTION-HANDLER2 SECTION.
         USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE. *> 3.
           DISPLAY FUNCTION EXCEPTION-STATUS.
       END DECLARATIVES.

           DIVIDE A BY B GIVING C. *> 1.

       END PROGRAM SAMPLE.

DIVIDE文で例外EC-SIZE-ZERO-DIVIDEが引き起こされます。

EXCEPTION-HANDLER1は，例外名EC-SIZEに対応するため，1.の例外に該当します。しかし，EXCEPTION-HANDLER1は実行されないで，より下位のレベルEC-SIZE-ZERO-DIVIDEの例外宣言手続きが優先されます。

EXCEPTION-HANDLER2は，例外名EC-SIZE-DIVIDEに対応するため，1.の例外に該当します。さらに，EXCEPTION-HANDLER1の例外名EC-SIZEより下位のレベルのため，EXCEPTION-HANDLER2が優先となります。EXCEPTIONHANDLER2が実行され，DISPLAY文で「EC-SIZE-ZERO-DIVIDE」と表示されます。

なお，例外名が「EC-I-O-」ではじまる入出力例外は，ファイル名を指定する形式とファイル名を指定しない形式の2種類が指定できますが，両方の形式の例外宣言手続きを指定した場合，ファイル名を指定する形式の方が優先されます。

次の例では，FILE1のREAD文で例外が引き起こされると，IO-EXCEPTION-HANDLER2の方が実行されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.

       >>TURN EC-I-O CHECKING ON
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT FILE1 ASSIGN TO 'FILENAME.TXT'.

       DATA DIVISION.
       FILE SECTION.
       FD FILE1.
       01 REC PIC X.
       WORKING-STORAGE SECTION.
       77 FILESTATUS PIC X(2).
       77 LOOP-EXIT-FLAG PIC 9 VALUE 0.

       PROCEDURE DIVISION.
       DECLARATIVES.
       IO-EXCEPTION-HANDLER1 SECTION.
           USE AFTER EXCEPTION CONDITION EC-I-O-AT-END. *> 2.
           DISPLAY 'GENERAL HANDLER'
           RESUME AT TERMINATION.
       IO-EXCEPTION-HANDLER2 SECTION.
           USE AFTER EXCEPTION CONDITION
                               EC-I-O-AT-END FILE FILE1. *> 3.
           DISPLAY 'SPECIAL HANDLER FOR FILE1'
           CLOSE FILE1
           RESUME AT TERMINATION.
       END DECLARATIVES.
           OPEN INPUT FILE1
           PERFORM UNTIL LOOP-EXIT-FLAG = 1
             READ FILE1 *> 1.
             IF  FILESTATUS NOT = '00' AND '10' THEN
               MOVE 1 TO LOOP-EXIT-FLAG
               DISPLAY 'READ FILESTATUS = ' FILESTATUS
             END-IF
           END-PERFORM.
       TERMINATION.
           STOP RUN.

       END PROGRAM SAMPLE.

READ文で例外EC-I-O-AT-ENDが引き起こされます。

IO-EXCEPTION-HANDLER1は，例外名EC-I-O-AT-ENDに対応するため，1.の例外に該当します。しかし，IO-EXCEPTION-HANDLER1は実行されないで，ファイル名を指定した例外宣言手続きが優先されます。

EXCEPTION-HANDLER2は，例外名EC-I-O-AT-ENDに対応するため，1.の例外に該当します。さらに，ファイル名が指定されているため，IO-EXCEPTION-HANDLER1よりIO-EXCEPTION-HANDLER2の方が優先となります。

IO-EXCEPTION-HANDLER2が実行され，DISPLAY文で「SPECIAL HANDLER FOR FILE1」と表示したあと，FILE1を閉じて手続き名TERMINATIONに復帰し，プログラムが終了します。

(3)　宣言手続き実行後の処理

宣言手続きからの復帰が行われない場合，例外の致命度によって，次の処理が実行されます。

致命的な例外の場合

宣言手続きの実行後，実行単位が終了します。ただし，例外名EC-I-Oに関連する例外の場合は，各文の一般規則に従って，実行が継続されます。

非致命的な例外の場合

宣言手続きを実行後，各文の一般規則に従って実行が継続されます。

宣言手続きから復帰した場合は，致命度に関係なく実行が継続されます。宣言手続きからの復帰については，「21.4.2　宣言手続きからの復帰」を参照してください。

(4)　注意事項

例外名EC-FLOW-USEに対して実行される宣言手続きを，再帰的に実行するような処理にしないでください。このような処理にすると，無限ループが発生します。

21.4.2　宣言手続きからの復帰

宣言手続きの実行中に次の文を使用すると，宣言手続きの実行を中断して，制御を復帰できます。

(1)　RESUME文

RESUME文は，宣言手続きから復帰するときに使用します。RESUME文では，例外が引き起こされた次の文に復帰させる方法と，指定した手続き名へ復帰させる方法があります。

RESUME文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.37　RESUME文」を参照してください。

RESUME文を使用した宣言手続きからの復帰の例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
       >>TURN EC-SIZE CHECKING ON

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A PIC 9 VALUE 9.
       01 B PIC 9 VALUE 0.
       01 C PIC 9.

       PROCEDURE DIVISION.
       DECLARATIVES.
         USE-1 SECTION.
           USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE. *> 2.
             DISPLAY 'RESUME NEXT実行'.
             RESUME NEXT STATEMENT. *> 3.
         USE-2 SECTION.
           USE AFTER EXCEPTION CONDITION EC-SIZE-TRUNCATION. *> 5.
             DISPLAY 'RESUME 手続き名実行'.
             RESUME 復帰手続き. *> 6.
       END DECLARATIVES.

           DIVIDE A BY B GIVING C. *> 1.

           COMPUTE C = A * 2. *> 4.
           STOP RUN.

       復帰手続き. *> 7.
           DISPLAY '宣言手続きからの復帰'.
                ：
       END PROGRAM SAMPLE.

DIVIDE文で，ゼロによる除算の例外EC-SIZE-ZERO-DIVIDEが検出されます。

例外名EC-SIZE-ZERO-DIVIDEを指定した例外宣言手続きが実行されます。

RESUME文によって宣言手続きから復帰します。RESUME文にNEXT STATEMENTが指定されているため，例外が引き起こされた次の行（COMPUTE文）に制御が移ります。

COMPUTE文で，算術けたあふれの例外EC-SIZE-TRUNCATIONが検出されます。

例外名EC-SIZE-TRUNCATIONを指定した例外宣言手続きが実行されます。

RESUME文によって宣言手続きから復帰します。RESUME文に手続き名が指定されているため，「復帰手続き」に制御が移ります。

手続きが実行され，DISPLAY文で「宣言手続きからの復帰」と表示されます。

(2)　GOBACK文，EXIT文

宣言手続きの実行中に，GOBACK文，またはEXIT文を実行すると，暗黙的に宣言手続きからの復帰が行われます。

GOBACK文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.22　GOBACK文」を参照してください。

EXIT文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.20　EXIT文」を参照してください。

GOBACK文を使用した宣言手続きからの復帰の例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.

       PROCEDURE DIVISION.
           CALL 'SAMPLE2'. *> 1.
       END PROGRAM SAMPLE1.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.

       >>TURN EC-SIZE CHECKING ON
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A PIC 9 VALUE 9.
       01 B PIC 9 VALUE 0.
       01 C PIC 9.
       PROCEDURE DIVISION.
       DECLARATIVES.
         USE-1 SECTION.
           USE AFTER EXCEPTION CONDITION EC-ALL. *> 3.
             DISPLAY 'GOBACK実行'.
             GOBACK. *> 4.
       END DECLARATIVES.
                ：
           DIVIDE A BY B GIVING C. *> 2.
           EXIT PROGRAM.
       END PROGRAM SAMPLE2.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

プログラム「SAMPLE2」中のDIVIDE文で，例外が検出されます。

例外宣言手続きが実行されます。

GOBACK文によって，宣言手続きから呼び出し元のプログラム「SAMPLE1」のCALL文の次の行へ復帰します。

21.5　例外の伝播

呼び出し先プログラムで検出された例外情報を，呼び出し元プログラムに伝える（以下，伝播という）ことができます。

あるプログラムで例外が引き起こされ，該当する宣言手続きがない場合，呼び出し元プログラムに例外を伝播できます。

例外の伝播の例を，次に示します。

プログラム「PARENTPROGRAM」中のCALL文で，プログラム「CHILDPROGRAM」を呼び出します。

プログラム「CHILDPROGRAM」中のDIVIDE文で，ゼロによる除算の例外が検出されます（例外名：EC-SIZE-ZERO-DIVIDE）。

PROPAGATE指令がONなので，呼び出し元のCALL文に例外が伝播します。

例外の伝播によってCALL文で例外が検出され（例外名：EC-SIZE-ZERO-DIVIDE），例外が引き起こされます。これによって，例外名EC-SIZEを指定したUSE手続きへ制御が移ります。

EC-SIZE-ZERO-DIVIDEは致命的な例外のため，例外宣言節の実行後，プログラムが異常終了します。

例外を伝播させる方法には，次の2種類があります。

PROPAGATE指令によって，例外を自動伝播させる

GOBACK文またはEXIT文のRAISING指定を使用して，明示的に呼び出し元へ例外を伝播させる

21.5.1　PROPAGATE指令による例外の自動伝播

PROPAGATE指令をONにすると，引き起こされた例外を自動的に呼び出し元プログラムへ伝播させられます。

PROPAGATE指令については，マニュアル「COBOL2002　言語　標準仕様編」　「3.3.13　PROPAGATE指令」を参照してください。

PROPAGATE指令を使用した例外の伝播の例を，次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
         ：
       PROCEDURE DIVISION.
       DECLARATIVES.
       ERROR-HANDLER SECTION.
         USE  AFTER EXCEPTION CONDITION EC-BOUND-SUBSCRIPT. *> 4.
           ：
       END DECLARATIVES.
       >>TURN EC-BOUND-SUBSCRIPT CHECKING ON

           CALL 'SAMPLE2'. *> 1.

       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL＞

       >>PROPAGATE ON *> 3.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
         ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A.
         02 AA PIC 9 OCCURS 10 INDEXED BY B.
       01 C PIC 9.
         ：
       PROCEDURE DIVISION.
           SET B DOWN BY 1.
       >>TURN EC-BOUND-SUBSCRIPT CHECKING ON
           MOVE AA ( B ) TO C. *> 2.
       END PROGRAM SAMPLE2.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

プログラム「SAMPLE2」中のMOVE文で，例外が検出されます（例外名：EC-BOUND-SUBSCRIPT）。

PROPAGATE指令がONなので，呼び出し元のCALL文に例外が伝播します。

例外の伝播によってCALL文で例外が検出され，例外が引き起こされます。これによって，例外名EC-BOUND-SUBSCRIPTを指定したUSE手続きへ制御が移ります。

注意事項

PROPAGATE ONが指定されたプログラムをCOBOL主プログラムとした場合，例外が引き起こされても例外は伝播されないで，COBOLプログラムが正常終了します。

自動伝播される例外は，例外の致命度が致命的なものだけです。致命度が非致命的な例外の場合，自動伝播されないで例外を引き起こした文の次の文が実行されます。

21.5.2　EXIT文，GOBACK文のRAISING指定による例外の伝播

宣言手続き内で，GOBACK文またはEXIT文のRAISING指定に伝播する例外を指定すると，指定した例外を呼び出し元のプログラムに伝播できます。RAISING指定には，例外名，オブジェクト参照一意名，またはLAST指定します。

RAISING指定については，「COBOL2002　言語　標準仕様編」　「10.8.20　EXIT文」を参照してください。

EXIT PROGRAM文のRAISING指定を使用した例外の伝播の例を，次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
          ：
       PROCEDURE DIVISION.
       DECLARATIVES.
       ERROR-HANDLER SECTION.
         USE AFTER EXCEPTION CONDITION EC-BOUND-SUBSCRIPT. *> 3.
           ：
       END DECLARATIVES.

       >>TURN EC-BOUND-SUBSCRIPT CHECKING ON
         CALL 'SAMPLE2'. *> 1.

       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
         ：
       PROCEDURE DIVISION.

           EXIT PROGRAM RAISING EXCEPTION EC-BOUND-SUBSCRIPT. *> 2.

       END PROGRAM SAMPLE2.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

プログラム「SAMPLE2」中のEXIT PROGRAM文のRAISING指定に，伝播させる例外名EC-BOUND-SUBSCRIPTが指定されているため，呼び出し元に例外が伝播します。

例外の伝播によってCALL文で例外が検出され，例外が引き起こされます。これによって，例外名EC-BOUND-SUBSCRIPTを指定したUSE手続きへ制御が移ります。

(1)　RAISING LAST指定

EXIT文またはGOBACK文のRAISING指定にLASTを指定すると，実行単位で最後に引き起こされた例外を伝播できます。RAISING LAST指定は，宣言手続きの実行中だけで使用できます。

なお，何も例外が引き起こされていない状態では，RAISING LAST指定は無視されます。

RAISING LAST指定の例を，次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER SECTION.
           USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE. *> 4.
           DISPLAY FUNCTION EXCEPTION-STATUS.
       END DECLARATIVES.
       >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
           CALL 'SAMPLE2'. *> 1.
           STOP RUN.
       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
              ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A-REC PIC S9(9) USAGE COMP VALUE 0.
       01 B-REC PIC S9(9) USAGE COMP VALUE 0.
       01 C-REC PIC S9(9) USAGE COMP VALUE 0.
              ：
       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER SECTION.
           USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE.
           EXIT PROGRAM RAISING LAST EXCEPTION. *> 3.
       END DECLARATIVES.
       >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
           COMPUTE A-REC = B-REC / C-REC. *> 2.
       END PROGRAM SAMPLE2.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

プログラム「SAMPLE2」中のCOMPUTE文で，例外EC-SIZE-ZERO-DIVIDEが引き起こされ，例外宣言手続きが実行されます。

EXIT PROGRAM文のRAISING LAST指定によって，最後に引き起こされた例外が呼び出し元のプログラムに伝播します。

例外の伝播によってCALL文で例外が検出され，例外が引き起こされます。これによって，例外名EC-SIZE-ZERO-DIVIDEを指定したUSE手続きへ制御が移ります。

(2)　手続き部見出しのRAISING指定

EXIT文またはGOBACK文のRAISING指定を使って，利用者定義例外，または例外オブジェクトを伝播する場合，手続き部見出しのRAISING指定に，利用者定義例外名，またはオブジェクトのクラス名もしくはインタフェース名を指定する必要があります。指定していない場合，RAISINGに例外名またはオブジェクト参照データを指定したときはコンパイルエラーとなり，RAISING LAST指定のときは例外名EC-RAISING-NOT-SPECIFIEDまたはEC-OO-EXCEPTIONが伝播されます。

手続き部見出しのRAISING指定の例を，次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER SECTION.
           USE AFTER EXCEPTION CONDITION EC-USER-XXX.
           DISPLAY FUNCTION EXCEPTION-STATUS.
       END DECLARATIVES.
       >>TURN EC-USER-XXX CHECKING ON
           CALL 'SAMPLE2'.
           STOP RUN.
       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
              ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A-REC PIC S9(9) USAGE COMP VALUE 0.
       01 B-REC PIC S9(9) USAGE COMP VALUE 0.
       01 C-REC PIC S9(9) USAGE COMP VALUE 0.
              ：
       PROCEDURE DIVISION RAISING EC-USER-XXX.
       DECLARATIVES.
       ERROR-HANDLER SECTION.
         USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE.
           EXIT PROGRAM RAISING EXCEPTION EC-USER-XXX
       END DECLARATIVES.
       >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
           ：
           COMPUTE A-REC = B-REC / C-REC.
           ：
       END PROGRAM SAMPLE2.

(3)　RAISING指定による例外オブジェクトの伝播

RAISING指定を使用して例外オブジェクトを伝播する場合，次の規則が適用されます。詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「10.5.11(1)　例外」の例外オブジェクトの説明を参照してください。

EXIT文およびGOBACK文を使って例外オブジェクトを伝播する場合，呼び出し元プログラムおよび呼び出し先プログラムの状態によって，次に示す処理が実行されます。

呼び先し先のプログラムの状態

呼び出し元のプログラムの状態

該当するUSE宣言手続きあり

該当するUSE宣言手続きなし

PROPAGATE指令ON

PROPAGATE指令OFF

手続き部見出しのRAISING指定あり

手続き部見出しのRAISING指定なし

手続き部見出しのRAISING指定あり

例外オブジェクトを伝播する。※1

例外オブジェクトを伝播する。※2

例外オブジェクトを伝播する。※3

EC-OO-EXCEPTIONを伝播する。

手続き部見出しのRAISING指定なし

EC-OO-EXCEPTIONを伝播する。

注※1

伝播後，該当する宣言手続きを実行します。

注※2

伝播後，GOBACK RAISING LASTを実行します。

注※3

伝播後，GOBACK RAISING EXCEPTION EC-OO-EXCEPTIONを実行します。

RAISING指定による例外オブジェクトの伝播の例を，次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER SECTION.
           USE AFTER EXCEPTION CONDITION EC-OO-EXCEPTION. *> 3.
           DISPLAY FUNCTION EXCEPTION-STATUS.
       END DECLARATIVES.
       >>TURN EC-OO-EXCEPTION CHECKING ON
           CALL 'SAMPLE2'. *> 1.
           STOP RUN.

＜副プログラム：SAMPLE2.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
       CLASS EXCEPT-CLASS.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OBJ USAGE OBJECT REFERENCE EXCEPT-CLASS.

       PROCEDURE DIVISION RAISING EXCEPT-CLASS.
           INVOKE EXCEPT-CLASS 'NEW' RETURNING OBJ.
           GOBACK RAISING OBJ. *> 2.
       END PROGRAM SAMPLE2.

       IDENTIFICATION DIVISION.
       CLASS-ID. EXCEPT-CLASS INHERITS BASE.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
       CLASS BASE.
             ：
       END CLASS EXCEPT-CLASS.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

プログラム「SAMPLE2」中のGOBACK文のRAISING指定によって，例外オブジェクトの伝播が発生します。

このとき，SAMPLE2の手続き部見出しのRAISING指定には，クラス名が指定されていますが，主プログラム「SAMPLE1」に発生した例外に対応するUSE宣言手続きやPROPAGATE指令がないため，GOBACK文の処理は，GOBACK RAISING EXCEPTION EC-OO-EXCEPTIONとなります。

例外の伝播によってCALL文で例外EC-OO-EXCEPTIONが検出され，該当するUSE手続きへ制御が移ります。

21.5.3　例外を受け取れないプログラムに例外を伝播させた場合の動作

(1)　例外を受け取れないプログラム

CALL文，INVOKE文，および利用者定義関数によって呼び出されたプログラム（例外を送る側）で例外が発生し，呼び出し元プログラム（例外を受け取る側）へ例外の伝播を実行しようとしても，呼び出し元プログラムが例外を受け取れない場合，例外は伝播しません。

例外を受け取れる呼び出し元プログラム，例外を受け取れない呼び出し元プログラムの条件を次に示します。

条件

プログラム種別／指定

COBOL

85※1

COBOL2002

COBOL

以外の言語

-Compati85,NoPropagate指定なし※²

-Compati85,NoPropagate指定あり※²

伝播抑止条件※³

左記以外

伝播抑止条件※³

左記以外

例外を受け取る文

オブジェクト指向のINVOKE文

−

×

○

×

×

−

利用者定義関数を参照する文

−

×

○

×

×

−

CALL文

無条件指定なし※⁴

×

×

○

×

×

−

無条件指定あり※⁴

×

○※⁵

○

×

×

−

（凡例）

○：例外を受け取れる

×：例外を受け取れない

−：該当しない

注※1

COBOL85でコンパイルしたプログラムが動作可能なシステム

注※2

例外の伝播を抑止するコンパイラオプションについては，「33.5.12　他システムとの移行の設定」の「(3)　-Compati85オプション」を参照してください。

注※3

次の条件が重なった場合，例外の伝播を抑止します。

プログラム中にON指定のあるPROPAGATE指令が書かれていない。

プログラム中にTURN指令が一つも書かれていない。

ただし上記の1.〜2.では，入れ子のプログラムや複数の最外側のプログラムが書かれたソースで，該当するプログラムの前にON指定のあるPROPAGATE指令や有効なTURN指令がある場合，それ以降に定義されたすべてのプログラムは，例外の伝播を抑止する対象にはなりません。

宣言節中のUSE文にEXCEPTION OBJECT指定が一つもない。

注※4

ON OVERFLOW指定，ON EXCEPTION指定，NOT ON EXCEPTION指定

注※5

呼び出されたプログラム（例外を送る側）で例外が発生し，呼び出し元プログラム（例外を受け取る側）へ例外を伝播する場合，CALL文の無条件文は実行されません。詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.4(3)　一般規則」を参照してください。

(2)　呼び出し元プログラムが例外を受け取れない場合の動作

呼び出し元プログラムが例外を受け取れない場合，呼び出し先プログラムで例外が検出されたときの動作が異なります。

例外が検出されたときの動作の詳細については，「21.8.3　例外処理の動作」を参照してください。

例外を受け取れないプログラムへ例外の伝播を実行しようとした場合の例を次に示します。

＜主プログラム：SAMPLE1.CBL＞

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 PARAM USAGE COMP-1 VALUE +9.9E+01.
           ：
       PROCEDURE DIVISION.
           CALL 'SAMPLE2' USING PARAM. *> 1.
       END PROGRAM SAMPLE1.

＜副プログラム：SAMPLE2.CBL＞

       >>PROPAGATE ON
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
           ：
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ANS USAGE COMP-1.
       01 DATA-A PIC X(21) VALUE '100300700800400600900'.
       01 DATA-B REDEFINES DATA-A.
          02 DATA-C PIC 9(3) OCCURS 7 TIMES
                    INDEXED BY DATA-D DATA-E.
       LINKAGE SECTION.
       01 PARAM USAGE COMP-1.
           ：
       PROCEDURE DIVISION USING PARAM.
           SET DATA-D DATA-E TO 0.
       >>TURN EC-RANGE-SEARCH-INDEX CHECKING ON
           SEARCH DATA-C VARYING DATA-E      *>2.
               WHEN  DATA-C(DATA-E) > 1500
                   CONTINUE
           END-SEARCH.
       >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
           COMPUTE ANS = FUNCTION ACOS ( PARAM ). *> 3.
           DISPLAY 'ANSWER  =' ANS.
       END PROGRAM SAMPLE2.

プログラム「SAMPLE1」中のCALL文で，プログラム「SAMPLE2」を呼び出します。

PROPAGATE指令がONになっていますが，プログラム「SAMPLE2」中のSEARCH文で検出した例外が非致命的な例外のため，例外は伝播されず次の文（COMPUTE文）へ実行が継続されます。

COMPUTE文で致命的な例外が検出され，かつ，PROPAGATE指令がONになっていますが，プログラム「SAMPLE1」は例外を受け取れないため，例外は伝播しません。この場合，実行時エラーメッセージ（KCCC0403R-S:「例外を伝播できません。」）を出力し，プログラム「SAMPLE2」が異常終了します。

21.6　明示的な例外の引き起こし

COBOL2002では，明示的に例外を引き起こせます。明示的に例外を引き起こすと，ユーザプログラムが固有に定めたエラー状態を利用者定義例外として発生させたり，ある例外種別で実行される宣言手続き処理に対してユーザプログラムから明示的に例外を発生させて実行できます。これによって，宣言手続き処理を共通化できます。

共通例外処理で明示的に例外を引き起こすには，RAISE文を使用します。RAISE文にレベル3の例外名またはオブジェクト参照の一意名を指定して実行すると，指定した例外が引き起こされます。

RAISE文に指定する例外が例外名の場合，該当するTURN指令のチェックがONでなくても，例外が引き起こされます。

また，RAISE文に例外名EC-I-Oに関連する例外を指定して実行する場合，入出力状態は変更されません。

このシステムでは，ファイル名指定の例外宣言手続きは，ファイル名指定のない例外宣言手続きとみなします。

そのため，同じ名称の例外名を指定した例外宣言手続きが複数個定義されている場合は，最後に定義した例外宣言手続きが実行されます。

RAISE文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.32　RAISE文」を参照してください。

RAISE文に例外名を指定して実行した場合の例を，次に示します。

       IDENTIFICATION   DIVISION.
        PROGRAM-ID.      SAMPLE.

       >>TURN  EC-I-O  CHECKING  ON
       ENVIRONMENT      DIVISION.
        INPUT-OUTPUT     SECTION.
         FILE-CONTROL.
           SELECT  FILE1  ASSIGN  TO  'FILENAME.EXT'.

       DATA  DIVISION.
        FILE  SECTION.
           FD  FILE1.
            01  REC  PIC  X.
        WORKING-STORAGE  SECTION.
           77  FILESTATUS  PIC X(2)  VALUE  '00'.

       PROCEDURE        DIVISION.
        DECLARATIVES.
         IO-EXCEPTION-HANDLER1  SECTION.
           USE  AFTER  EXCEPTION  CONDITION  EC-I-O-AT-END FILE FILE1.  *> 2.
             DISPLAY  'GENERAL HANDLER '.
             CLOSE  FILE1.
             RESUME  AT  TERMINATION.
         IO-EXCEPTION-HANDLER2  SECTION.
           USE  AFTER  EXCEPTION  CONDITION  EC-I-O-AT-END.             *> 3.
             DISPLAY  'SPECIAL HANDLER FOR FILE1'.
             CLOSE  FILE1.
             RESUME  AT  TERMINATION.
        END DECLARATIVES.
           OPEN  INPUT  FILE1.
           RAISE EXCEPTION EC-I-O-AT-END.  *> 1.
           READ  FILE1.
        TERMINATION.
           IF FILESTATUS NOT = '00'
             DISPLAY 'RAISE FILESTATUS = ' FILESTATUS
           END-IF.
           STOP  RUN.
        END  PROGRAM     SAMPLE.

RAISE文によって，例外EC-I-O-AT-ENDが引き起こされます。

IO-EXCEPTION-HANDLER1では，指定されたファイル名は無視されて，例外名EC-I-O-AT-ENDに対応します。ただし，3.に例外名EC-I-O-AT-ENDに対応する例外宣言手続きがあるため，2.の例外宣言手続きに処理は移りません。

IO-EXCEPTION-HANDLER2では，例外名EC-I-O-AT-ENDに対応します。2.の例外名EC-I-O-AT-ENDと同じ名称であるため，あとに指定された3.の例外名に対応する例外宣言手続きに処理が移り，DISPLAY文およびCLOSE文が実行されます。

21.7　例外情報の参照

最新例外状態を参照すると，最後に発生した例外情報を参照できます。最新例外状態の参照には，組み込み関数や，EXCEPTION-OBJECTを使用します。

21.7.1　組み込み関数を使用した例外情報の参照

次の組み込み関数を使用すると，実行単位で最後に引き起こされた例外（最新例外状態）の詳細な情報を取得できます。

(1)　EXCEPTION-FILE関数

最新例外状態に関連するファイル結合子の入出力状態の値，およびファイル名称を返します。関数の戻り値の長さは，64バイトです。

EXCEPTION-FILE関数の戻り値を，次に示します。

例外の種類

関数の戻り値の内容

入出力に関連する例外の場合※1

入出力状態とファイル名

入出力以外の例外の場合※2

00

注※1

入出力に関連する例外（例外名EC-I-Oに関連する例外）であっても，例外名EC-I-O-LINAGE，EC-I-O-EOP，またはEC-I-O-EOP-OVERFLOWの場合は，入出力状態が00となります。

注※2

入出力以外の例外の場合とは，次の状態を指します。

例外が検出されていない状態

RAISE文で，例外名EC-I-Oに関連する例外を指定して実行した場合

例外名EC-I-O以外の例外が引き起こされている状態

EXCEPTION-FILE関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.23　EXCEPTION-FILE関数」を参照してください。

(2)　EXCEPTION-LOCATION関数

最新例外状態に関連する文の位置を返します。関数の戻り値の長さは，303バイトです。なお，-LiteralExtend,Alnumオプションを指定した場合は，1,167バイトになります。

EXCEPTION-LOCATION関数の戻り値は，プログラム／利用者定義関数／メソッドの名称，手続き名，およびソース行識別子から構成され，それぞれがセミコロン（;）と空白1文字で区切られた形式となっています。

EXCEPTION-LOCATION関数の戻り値を，次に示します。

例外の有無

関数の戻り値の内容

例外あり

プログラム／利用者定義関数／メソッドの名称

手続き名

ソース行識別子

例外なし

英数字空白

例外ありの場合の形式

AAA…AA;△BB…B;△CCCCCCC/CCC

AAA…AA

プログラム／利用者定義関数／メソッドの名称

BB…B

手続き名

CCCCCCC/CCC

ソース行識別子

△

半角空白文字を示します。

それぞれの項目に返される値を，次に示します。

プログラム／利用者定義関数／メソッド

プログラム／利用者定義関数／メソッド名称として返される値について，次に示します。

例外の引き起こされた位置を

含む定義の種別

関数の戻り値の内容

プログラム

プログラム名

利用者定義関数

利用者定義関数名

メソッド

メソッド名

手続き名

手続き名として返される値について，次に示します。

手続き名は，例外が発生した文の段落名，節名の有無によって出力内容が異なります。

手続きの種別

関数の戻り値の内容

段落名，節名あり※

段落名 OF 節名

段落名だけあり

段落名

節名だけあり※

節名

段落名，節名なし

何も戻さない

注※

-Optimize,2オプションの指定によって，そとPERFORM文のインライン展開が処理された場合，インライン展開によって段落名および手続き文が移動されます。このため，インライン展開された個所で例外が発生したとき，インライン展開されていない場合に返される手続き名の値と相違があります。

そとPERFORM文のインライン展開がされなかった個所（COMPUTE文）で例外が発生した場合に返される手続き名の相違の例を，次に示します。

インライン展開前の形式

インライン展開後の形式

AAA SECTION.
    PERFORM XXX.
    STOP RUN.
BBB SECTION.
XXX.
    COMPUTE A = B + 1.
CCC SECTION.
    COMPUTE A = B + 2.

AAA SECTION.
XXX.
    COMPUTE A = B + 1.
    STOP RUN.
BBB SECTION.
CCC SECTION.
    COMPUTE A = B +  2.

返される手続き名

　XXX△OF△BBB

返される手続き名

　XXX△OF△AAA

（凡例）　△：空白（X'20'）

ソース行識別子

ソース行識別子として返される値について，次に示します。

このシステムでのソース行識別子は，例外が発生した文の行番号7けたと欄番号3けたの間に/を追加したものとなります。なお，行番号が7けたを超える場合，または欄番号が3けたを超える場合，各最大けたを超える上位けたについては，けた落ちが発生します。

EXCEPTION-LOCATION関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.24　EXCEPTION-LOCATION関数」を参照してください。

(3)　EXCEPTION-STATEMENT関数

例外が引き起こされた文の名前を返します。関数の戻り値の長さは，31バイトです。

EXCEPTION-STATEMENT関数の戻り値を，次に示します。

例外の有無

関数の戻り値の内容

例外あり

例外の発生した文の名前

例外なし

英数字空白31文字

EXCEPTION-STATEMENT関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.25　EXCEPTION-STATEMENT関数」を参照してください。

(4)　EXCEPTION-STATUS関数

最新例外状態に関連する例外名称を返します。関数の戻り値の長さは，31バイトです。

EXCEPTION-STATUS関数の戻り値を，次に示します。

引き起こされた例外の種別

関数の戻り値の内容

例外名

例外名

例外オブジェクト

EXCEPTION-OBJECT

例外なし

英数字空白31文字

EXCEPTION-STATUS関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.26　EXCEPTION-STATUS関数」を参照してください。

(5)　使用例

組み込み関数を使用して最新例外状態を参照するCOBOLプログラムの例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
           ：
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT INFILE  ASSIGN 'INPUT-FILE'.
       SELECT OUTFILE ASSIGN 'OUTPUT-FILE'.
           ：
       DATA DIVISION.
       FILE SECTION.
       FD INFILE.
       01 INREC   PIC X(10).
       FD OUTFILE.
       01 OUTREC  PIC X(10).
       WORKING-STORAGE SECTION.
       01 EOF-FLG PIC 9 VALUE 0.
           ：
       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLING SECTION.
           USE AFTER EXCEPTION CONDITION EC-I-O.  *> 2.
             DISPLAY FUNCTION EXCEPTION-FILE.
             DISPLAY FUNCTION EXCEPTION-LOCATION.
             DISPLAY FUNCTION EXCEPTION-STATEMENT.
             DISPLAY FUNCTION EXCEPTION-STATUS.
             IF FUNCTION EXCEPTION-STATEMENT = 'OPEN' THEN
               IF FUNCTION EXCEPTION-FILE (3  :  ) = 'OUTFILE' THEN
                 RESUME AT ERROR-HANDLE2
               END-IF
               RESUME AT ERROR-HANDLE3
             END-IF.
             RESUME AT ERROR-HANDLE1.
       END DECLARATIVES.

       >>TURN EC-I-O CHECKING ON
           OPEN INPUT  INFILE. *> 1.
           OPEN OUTPUT OUTFILE.
           PERFORM UNTIL EOF-FLG = 1
             READ INFILE
             WRITE OUTREC FROM INREC
           END-PERFORM.
       ERROR-HANDLE1.
           CLOSE OUTFILE.
       ERROR-HANDLE2.
           CLOSE INFILE.
       ERROR-HANDLE3. *> 3.
           STOP RUN.
       END PROGRAM 'SAMPLE'.

物理ファイル「INPUT-FILE」がない場合，OPEN文で永続誤りが発生し，最新例外状態が更新されます。

例外に該当する例外宣言手続きが実行されます。この手続き中で組み込み関数を使用すれば，例外の情報を参照できます。この例では，次の例外情報が組み込み関数の戻り値として取得されます。

組み込み関数名

関数の戻り値

EXCEPTION-FILE

35INFILE

EXCEPTION-LOCATION

SAMPLE;△;△0000035/011 ※

EXCEPTION-STATEMENT

OPEN

EXCEPTION-STATUS

EC-I-O-PERMANENT-ERROR

（凡例）

△：半角空白文字を示す

注※

例外が発生したOPEN文の行番号が35，欄番号が11の場合です。

例外宣言手続き中のIF文の判定によって，RESUME ERROR-HANDLE3が実行され，手続きERROR-HANDLE3に復帰します。

(6)　注意事項

EXCEPTION-STATEMENT関数，EXCEPTION-STATUS関数では，関数の戻り値の英数字は，すべて大文字となります。

関数の戻り値に補われるスラント（/），セミコロン（;），空白文字は，英数字文字として扱われます。

関数の戻り値の長さに満たない場合は，英数字空白が補われます。

EXCEPTION-FILE関数，およびEXCEPTION-LOCATION関数に含まれる利用者定義語は，-EquivRule,NotExtend，-EquivRule,NotAny，または-EquivRule,StdCodeオプションが指定されていない場合，等価規則に基づいて変換されます。

EXCEPTION-LOCATION関数でのプログラム／利用者定義関数／メソッドの名称は，プログラム名，メソッド名，および利用者定義関数名の変換規則に基づいて変換されます。

21.7.2　EXCEPTION-OBJECT

例外オブジェクトが引き起こされると，そのオブジェクト参照がEXCEPTION-OBJECTにセットされます。宣言手続き中でEXCEPTION-OBJECTを参照すると，引き起こされたオブジェクトへの参照を取得できます。

EXCEPTION-OBJECTの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「4.3.2(5)　EXCEPTION-OBJECT」を参照してください。

EXCEPTION-OBJECTの規則

例外オブジェクトが引き起こされていない場合，または例外名による例外が引き起こされた場合，EXCEPTION-OBJECTにはNULLがセットされます。

EXCEPTION-OBJECTは，値の参照およびクリアだけができます。値の代入はできません。

EXCEPTION-OBJECTは，外部属性を持つオブジェクト参照データ項目で，実行単位に一つだけ存在します。

使用例

EXCEPTION-OBJECTの使用例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
       CLASS EXCEPT-CLASS.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OBJ USAGE OBJECT REFERENCE EXCEPT-CLASS.

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLER SECTION.
           USE AFTER EXCEPTION OBJECT EXCEPT-CLASS. *> 2.
           INVOKE EXCEPTION-OBJECT 'SAMPLEMETHOD'.
       END DECLARATIVES.

           INVOKE EXCEPT-CLASS 'NEW' RETURNING  OBJ.
           RAISE  OBJ. *> 1.

       END PROGRAM SAMPLE.

       IDENTIFICATION DIVISION.
       CLASS-ID. EXCEPT-CLASS INHERITS BASE.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
       CLASS BASE.
       IDENTIFICATION DIVISION.
       OBJECT.

       IDENTIFICATION DIVISION.

       METHOD-ID. SAMPLEMETHOD.
       PROCEDURE DIVISION.

           DISPLAY 'EXCEPTION-OBJECTの使用例'.

       END METHOD SAMPLEMETHOD.
       END OBJECT.
       END CLASS EXCEPT-CLASS.

プログラム「SAMPLE」中のRAISE文に，オブジェクト参照一意名が指定されているため，例外オブジェクトが引き起こされます。

例外宣言手続き内で，INVOKE文にEXCEPTION-OBJECTが指定されているため，例外オブジェクト（OBJ）を参照できます。SAMPLEMETHODが実行されます。

21.7.3　最新例外状態のクリア

最新例外状態は，一度例外が発生したあとに処理を継続すると，次に例外が発生するまで，前の最新例外状態を示しています。前の最新例外状態を削除（クリア）するには，SET文を使用します。このとき，EXCEPTION-OBJECTも，同時にクリアされます。

SET文の詳細については，「COBOL2002　言語　標準仕様編」　「10.8.43　SET文」を参照してください。

SET文を使用して最新例外状態をクリアする例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.
       PROCEDURE DIVISION.

           RAISE EXCEPTION EC-OVERFLOW-STRING. *> 1.
           DISPLAY '-----RAISE文実行後-----'. *> 2.
           DISPLAY 'EXCEPTION-STATEMENT = '
                   FUNCTION EXCEPTION-STATEMENT. *> 2.
           DISPLAY 'EXCEPTION-STATUS = '
                   FUNCTION EXCEPTION-STATUS. *> 2.

           SET LAST EXCEPTION TO OFF. *> 3.
           DISPLAY '-----最新例外状態のクリア後-----'. *> 4.
           DISPLAY 'EXCEPTION-STATEMENT = '
                   FUNCTION EXCEPTION-STATEMENT. *> 4.
           DISPLAY 'EXCEPTION-STATUS = '
                   FUNCTION EXCEPTION-STATUS. *> 4.

           STOP RUN.
       END PROGRAM SAMPLE.

RAISE文によって例外が引き起こされ，最新例外状態が更新されます。

1.で発生した最新例外状態の内容がDISPLAY文によって出力されます。例外が発生した文の名前として「RAISE」が，最新例外状態の例外名として「EC-OVERFLOW-STRING」が，それぞれ出力されます。

SET文によって，1.で設定された最新例外状態がクリアされます。

2.と同様，最新例外状態の内容がDISPLAY文によって出力されます。3.のSET文によって最新例外状態がクリアされているため，例外が発生した文の名前，および最新例外状態の例外名には，それぞれ空白が出力されます。

21.8　例外の検出条件

共通例外処理では，文の種類やTURN指令の有無，PROPAGATE指令の有無などによって，検出される例外が異なります。

21.8.1　例外が検出される文の詳細

例外が検出される手続き文および組み込み関数の詳細を，次に示します。なお，例外名の一覧については，「21.2.1　例外名」の「(2)　例外名の一覧」を参照してください。

(1)　例外を検出する組み込み関数

例外を検出する組み込み関数の一覧を，次に示します。

組み込み関数

EC-ARGUMENT

FUNCTION

IMP

ACOS

○

○

ANNUITY

○

−

ASIN

○

○

ATAN

−

○

CHAR

○

−

COS

−

○

COUNT-CHAR

○

−

DATE-OF-INTEGER

○

−

DAY-OF-INTEGER

○

−

DISPLAY-OF※

○

○

FACTORIAL

○

−

INTEGER-OF-DATE

○

−

INTEGER-OF-DAY

○

−

LENGTH-OF-SUBSTRING

○

−

LOG

○

○

LOG10

○

○

LOWER-CASE

○

−

MEDIAN

○

○

MOD

○

−

NATIONAL-OF※

○

○

NUMVAL

○

−

NUMVAL-C

○

−

ORD

○

−

PRESENT-VALUE

○

−

RANDOM

○

−

REM

○

−

REVERSE

○

−

SIN

−

○

SQRT

○

○

SUBSTRING

○

−

TAN

−

○

UPPER-CASE

○

−

（凡例）

○：例外が検出される

−：例外が検出されない

注※

-FunctionECSup,CodeConvErrオプションが有効な場合，文字コード変換エラーによるEC-ARGUMENT-FUNCTION／EC-ARGUMENT-IMP例外は検出されません。

上記の表に記述のない組み込み関数については，例外が検出されません。

(2)　おのおのの例外が検出される文

おのおのの例外が検出される文について，次に示します。

文

EC-BOUND

EC-PROGRAM

（利用者定義関数を指定可能な文）

ODO

REF-MOD

SUBSCRIPT

ACCEPT※¹

○

○

○

−

ADD

○

−

○

−

CALL

○

−

○

−

CANCEL

−

−

○

−

COMPUTE

○

−

○

○

DISPLAY

−

○

○

○

DIVIDE

○

−

○

○

EVALUATE

−

○

○

○

EXIT

−

−

−

−

GOBACK

−

−

−

−

IF

−

○

○

○

INITIALIZE

○

○

○

−

INSPECT

○

○

○

−

INVOKE※2

○

−

○

−

MOVE

○

○

○

○

MULTIPLY

○

−

○

−

PERFORM

○

○

○

○

RAISE

−

−

−

−

READ

○

○

○

−

RELEASE

−

○

○

○

RETURN

○

○

○

−

SEARCH

−

○

○

○

SET

−

−

−

○

STRING

○

○

○

○

SUBTRACT

○

−

○

−

UNSTRING

○

○

○

○

WRITE

−

○

○

○

（凡例）

○：例外が検出される

−：例外が検出されない

注※1

画面節（WINDOW SECTION）の画面操作で使用する，FIRST FIELD指定の一意名については，例外が検出されません。

注※2

OLE2オートメーションインタフェース機能については，例外が検出されません。

21.8.2　例外検出での注意事項

(1)　共通の注意事項

Uレベルエラー（KCCCnnnnR-U）が発生した場合，発生したUレベルエラーに対しては，共通例外処理を実行できません。Uレベルエラーは，常に実行時エラーとなります。

(2)　プログラム間連絡での注意事項

CALL文で実行可能ファイルを呼び出す場合，次に示す例外に対してだけ共通例外処理を実行できます。なお，実行可能ファイル内で引き起こされた例外は，呼び出し元プログラムに伝播できません。

表21‒9　実行可能ファイルの呼び出しで検出される例外と例外名

検出される例外

例外名

CALL文で指定した実行可能ファイルが見つからない。

EC-PROGRAM-NOT-FOUND

実行可能ファイルを実行中にメモリが不足した。

EC-PROGRAM-RESOURCES

実行可能ファイルの処理中にエラーが発生した。

EC-PROGRAM-IMP

COBOL85※で作成したプログラムをCALL文に指定して呼び出す場合は，次に示す例外に対してだけ共通例外処理を実行できます。

注※

COBOL85でコンパイルしたプログラムが動作可能なシステム

表21‒10　COBOL85で作成したプログラムの呼び出しで検出される共通例外と例外名

共通例外処理で検出される例外

例外名

CALL文で指定したプログラム名が，呼び出しできないプログラムである。

EC-PROGRAM-NOT-FOUND

ダイナミックリンク機能の処理中にメモリが不足した。

EC-PROGRAM-RESOURCES

DLLのロード中にエラーが発生した。

EC-PROGRAM-IMP

CALL文に，ENTRY文で定義した呼び出し先プログラムの入口点を指定し，かつその入口点に指定したプログラムがマルチスレッド対応COBOLプログラムの場合は，次に示す共通例外処理を実行できません。

表21‒11　CALL文にENTRY文で定義した入口点を指定した場合に共通例外処理ができない例外

共通例外処理ができない例外

例外名

-MultiThreadオプション指定あり／なしのプログラムが混在して動作した。

EC-PROGRAM-RESOURCES

マルチスレッド機能の処理中にメモリが不足した。

EC-PROGRAM-RESOURCES

再帰属性でないプログラムを再帰的に呼び出した場合，例外名EC-PROGRAM-RECURSIVE-CALLが引き起こされるかどうかは，呼び出し先プロブラムの入口点時点で該当する例外の有効状態に従います。

(3)　入出力での注意事項

共通例外処理では，プログラムが順次処理していく過程で例外を検出するため，発生する例外は，常に1種類となります。ただし，次に示す場合は，処理の順序に関係なく，致命的な例外が優先して検出されます。

ページあふれ条件での例外が発生したあと，LINAGE句に指定したデータ名の値不正によって例外が検出された場合。

入出力文を実行する際に，SELECT句のファイル名に割り当てられた物理ファイル，または物理ファイルに対するレコードが，ほかの実行単位によって排他モードで使用されている場合，入出力文の実行は不成功となり，入出力状態が9xを示しますが，例外名EC-I-O-IMPは検出されません。

(4)　コンパイラオプションとの関連性

共通例外処理とコンパイラオプションとの関連性について，次に示します。

デバッグオプションを指定した場合に実行されるエラーチェックと，共通例外処理での例外の検出は，同時に実行できません。デバッグオプションを指定した場合に無効となる例外名を，次に示します。

表21‒12　デバッグオプション指定時に無効となる例外名

デバッグオプション

デバッグオプション指定時に無効となる例外名

-DebugCompati

EC-PROGRAM-ARG-MISMATCH

EC-BOUND-REF-MOD

EC-BOUND-SUBSCRIPT

-DebugRange

EC-BOUND-REF-MOD

EC-BOUND-SUBSCRIPT

デバッグオプションによるエラーチェックは，共通例外処理の例外の検出よりも優先されます。そのため，デバッグオプションの指定の有無によって，実行結果が異なることがあります。

EC-ALLや複数の例外名を指定した場合，-DebugDataオプションの指定の有無によって，検出される例外が変わることがあります。

21.8.3　例外処理の動作

共通例外処理では，例外の検出された要因，および例外処理の指定有無によって，実行される処理が異なります。それぞれの場合の処理について，「表21‒13　手続き文で検出された例外」，「表21‒14　RAISE文によって引き起こされた例外」，および「表21‒15　例外の伝播によって検出された例外」に示します。

なお，TURN指令のチェックがONの場合の動作は，表の左から順にチェックされ，該当するものが実行されます。

表21‒13　手続き文で検出された例外

例外の

致命度

TURN指令のチェックがOFF

TURN指令のチェックがON

該当する宣言手続きがある※1

PROPAGATE指令がON

例外処理なし

呼び出し元が例外を受け取れないプログラム※2

左記以外

致命的

実行時エラー

または

実行を継続※3

該当する宣言手続きを実行したあと，エラーメッセージ（KCCC0015R-S）を出力し，実行単位が異常終了※4

エラーメッセージ（KCCC0403R-S）を出力し，実行単位が異常終了

例外を伝播

エラーメッセージ（KCCC0401R-S）を出力し，実行単位が異常終了

非致命的

実行を継続※5

該当する宣言手続きを実行し，次の文から実行を継続

実行を継続※5

実行を継続※5

実行を継続※5

注※1

宣言手続きからの復帰が実行されない場合です。

注※2

例外を受け取れないプログラムの詳細については，「21.5.3　例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

注※3

致命的な例外に対するTURN指令のチェックがOFFの場合の動作については，「21.3.3　例外チェックが無効な場合の動作」の「(1)　手続き文の実行中にエラーが発生し，例外を検出した場合」を参照してください。

注※4

致命的な例外のうち，入出力に分類される例外（例外名EC-I-O）については，実行が継続されます。

注※5

実行継続の詳細については，各文の一般規則を参照してください。

表21‒14　RAISE文によって引き起こされた例外

例外の

致命度

該当する宣言手続きがある※1

PROPAGATE指令がON

例外処理なし

致命的

該当する宣言手続きを実行したあと，エラーメッセージ（KCCC0015R-S）を出力し，実行単位が異常終了※2

例外を伝播

エラーメッセージ（KCCC0401R-S）を出力し，実行単位が異常終了

非致命的

該当する宣言手続きを実行し，RAISE文の次の文から実行を継続

RAISE文の次の文から実行を継続

RAISE文の次の文から実行を継続

注※1

宣言手続きからの復帰が実行されない場合です。

注※2

致命的な例外のうち，入出力に分類される例外（例外名EC-I-O）については，実行が継続されます。

表21‒15　例外の伝播によって検出された例外

例外の

致命度

TURN指令のチェックがOFF

TURN指令のチェックがON

該当する宣言手続きがある※1

PROPAGATE指令がON

例外処理なし

致命的

エラーメッセージ（KCCC0402R-S）を出力し，実行単位が異常終了

該当する宣言手続きを実行したあと，エラーメッセージ（KCCC0015R-S）を出力し，実行単位が異常終了※2

例外を伝播

エラーメッセージ（KCCC0401R-S）を出力し，実行単位が異常終了

非致命的※3

次の文から実行を継続※4

該当する宣言手続きを実行し，次の文から実行を継続※4

次の文から実行を継続※4

次の文から実行を継続※4

注※1

宣言手続きからの復帰が実行されない場合です。

注※2

致命的な例外のうち，入出力に分類される例外（例外名EC-I-O）については，実行が継続されます。

注※3

EXIT文，GOBACK文のRAISING指定によって例外が伝播した場合だけが対象です。

注※4

次の文とは，CALL文，INVOKE文，および利用者定義関数を呼び出した文の次の文を指します。

21.9　共通例外処理の注意事項

21.9.1　共通例外処理を使用した場合の性能について

共通例外処理を使用する場合（TURN指令のチェックをONにした場合），例外処理のためのオブジェクトが生成されるため，TURN指令のチェックをOFFにした場合と比較して，オブジェクトサイズや実行性能が劣化します。

21.9.2　従来形式の例外処理と共通例外処理の関係

(1)　従来形式の例外処理を実行する場合の最新例外状態の更新

従来形式の例外処理を実行する場合，検出した例外に対する例外名のTURN指令のチェックがONであれば，最新例外状態が更新されます。ただし，従来形式の例外処理のうちON SIZE ERROR指定については，ON SIZE ERRORを実行する際に例外が検出されないため，TURN指令のチェックがONであっても最新例外状態は更新されません。従来形式の例外処理を実行する場合に，最新例外状態が更新される例外処理と，更新されない例外処理を，次に示します。

最新例外状態が更新される従来形式の例外処理

従来形式の宣言手続き

READ文，SEARCH文のAT END指定

WRITE文のAT EOP指定

WRITE文，REWRITE文，DELETE文，START文のINVALID KEY指定

CALL文のON OVERFLOW，ON EXCEPTION指定

STRING文，UNSTRING文のON OVERFLOW指定

最新例外状態が更新されない従来形式の例外処理

ADD文，SUBTRACT文，MULTIPLY文，DIVIDE文，COMPUTE文のON SIZE ERROR指定

(2)　従来形式の宣言手続きと共通例外処理の宣言手続きの優先順序

従来形式の宣言手続きと共通例外処理の宣言手続きを同時に指定した場合，従来形式の宣言手続きが優先して実行されます。ただし，例外を検出したプログラムが入れ子のプログラムで，上位プログラムにGLOBAL句を指定した従来形式の宣言手続きが定義されているときは，入れ子のプログラム中の共通例外処理の宣言手続きが優先して実行されます。

従来形式の宣言手続きが優先される例を，次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT INFILE ASSIGN 'INPUT-FILE'.

       DATA DIVISION.
       FILE SECTION.
       FD INFILE.
       01 INREC    PIC X(10).
       WORKING-STORAGE SECTION.
       01 READDATA PIC X(10).

       PROCEDURE DIVISION.
       DECLARATIVES.
       EXCEPTION-HANDLE1 SECTION.
           USE AFTER STANDARD EXCEPTION PROCEDURE INFILE. *> 2.
           DISPLAY '従来形式USE実行'.
       EXCEPTION-HANDLE2 SECTION.
           USE AFTER EXCEPTION CONDITION EC-I-O. *> 3.
           DISPLAY '共通例外処理USE実行'.
       END DECLARATIVES.

       >>TURN EC-I-O CHECKING ON
         OPEN INPUT INFILE.

         READ INFILE INTO READDATA. *> 1.
         DISPLAY READDATA.

         CLOSE INFILE.

       END PROGRAM SAMPLE.

上記の例の場合，プログラム中のREAD文（1.）によって例外が引き起こされた場合，従来形式の宣言手続き（2.）が共通例外処理（3.）より優先して実行されます。

(3)　FILE STATUS句の指定と共通例外処理での異常終了

COBOL85では，入出力エラーが発生した場合にFILE STATUS句の指定があると実行を継続しますが，COBOL2002では，FILE STATUS句より共通例外処理が優先されます。そのため，入出力エラーが発生して共通例外処理が実行された場合，FILE STATUS句の指定があっても実行が継続されません。

FILE STATUS句の指定の有無と共通例外処理の関係を，次に示します。

発生した入出力エラーに対応するTURN指令の状態

入出力エラーに対応するUSE文

FILE STATUS句の有無

入出力エラー発生時の動作

ON

なし

○

実行時エラー※

×

実行時エラー※

新形式

○

新形式のUSE文を実行

×

新形式のUSE文を実行

従来形式

○

従来形式のUSE文を実行

×

従来形式のUSE文を実行

新形式

従来形式

○

従来形式のUSE文を実行

×

従来形式のUSE文を実行

OFF

なし

○

実行を継続

×

実行時エラー※

新形式

○

実行を継続

×

実行時エラー※

従来形式

○

従来形式のUSE文を実行

×

従来形式のUSE文を実行

新形式

従来形式

○

従来形式のUSE文を実行

×

従来形式のUSE文を実行

（凡例）

ON：入出力エラーに対応するTURN指令のチェックがON

OFF：入出力エラーに対応するTURN指令のチェックがOFF

なし：入出力エラーに対応するUSE文がない

新形式：入出力エラーに対応するCOBOL2002形式のUSE文がある

従来形式：入出力エラーに対応する従来のCOBOL形式のUSE文がある

○：FILE STATUS句が指定されている

×：FILE STATUS句が指定されていない

注※

発生した入出力エラーが非致命的な場合，実行時エラーとはならないで，実行が継続されます。

第8編　DB／DC連携

22　データコミュニケーション機能

データコミュニケーション機能は，さまざまな端末またはコンピュータシステムと，メッセージを受け渡しする機能です。この章では，データコミュニケーション機能の使用方法について説明します。

22.1　データコミュニケーション機能の概要

データコミュニケーション機能は，オンラインコントロールプログラムを経由して，端末，ファイル，またはほかのプログラムとメッセージを受け渡しする機能です。このシステムでは，オンラインコントロールプログラムとして，OpenTP1（分散トランザクション処理機能）を使用できます。

データコミュニケーション機能の文法規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「8.　データコミュニケーション機能」を参照してください。

データコミュニケーション機能を使う場合の指定

OpenTP1を使用したデータコミュニケーション機能を使用する場合，-OpenTP1オプションを指定してプログラムをコンパイルする必要があります。

なお，テストデバッガのDCシミュレーション機能で，データコミュニケーション機能を単体テストする場合は，このオプションを指定してはいけません。

データコミュニケーション機能で使用する文

データコミュニケーション機能は，メインフレーム（VOS3）COBOL85のデータコミュニケーション機能と同じインタフェースのSEND文やRECEIVE文でメッセージの送受信などができます。

データコミュニケーション機能で用いる文とその機能を，次に示します。

表22‒1　データコミュニケーション機能で用いる文

文

機能

RECEIVE

メッセージ受信

SEND

メッセージ送信

ENABLE

ファイル送信の開始

DISABLE

ファイル送信の終了

COMMIT

同期点取得処理

ROLLBACK

部分回復処理

なお，データコミュニケーション機能で使用する文の厳密な意味については，オンラインコントロールプログラム側で規定しています。

22.2　DCシミュレーション

テストデバッガを使用すると，OpenTP1が組み込まれていない環境であっても，COBOL2002で使用できる擬似OpenTP1用ライブラリをリンク時に指定すれば，DCシミュレーションができます。

DCシミュレーションの操作方法については，マニュアル「COBOL2002　操作ガイド」のテストデバッガの説明を参照してください。

注意事項

擬似OpenTP1用ライブラリをリンクした実行可能ファイルで，DCシミュレーションをしない場合，擬似OpenTP1関数を実行中であることを通知するメッセージが表示されます。

OpenTP1では，標準入出力（stdin，stdout，stderr）のリダイレクションが行われる場合があるため，COBOL実行時メッセージ，およびACCEPT／DISPLAY文については，出力先に注意する必要があります。

22.3　データコミュニケーション機能を使用したCOBOLプログラムの例

データコミュニケーション機能を使用したCOBOLプログラムの例を，次に示します。

                :
       DATA DIVISION.
                :
       WORKING-STORAGE SECTION.
       01 データ名1 PIC X(100).
       01 データ名2 PIC X(100).
       01 データ名3 PIC X(100).
                :
       COMMUNICATION SECTION.
       CD 通信記述名1 FOR I-O
          STATUS KEY IS データ名4.
       CD 通信記述名2 FOR OUTPUT
          STATUS KEY IS データ名5
          SYMBOLIC TERMINAL IS データ名6
          MAP NAME IS データ名7.
                :
       PROCEDURE DIVISION.
                :
           RECEIVE 通信記述名1 MESSAGE INTO データ名1. *> メッセージ受信
                :
      *    業務処理
                :
           SEND    通信記述名2 FROM データ名2 *> 分岐メッセージ送信
                               WITH EMI.
                :
           SEND    通信記述名1 FROM データ名3 *> 応答メッセージ送信
                               WITH EMI.
                :
           IF （エラー発生か？） THEN
              ROLLBACK
           END-IF.
                :

23　データベース操作機能

COBOL2002では，データベースインタフェース機能としてODBCインタフェース機能をサポートしています。ODBCインタフェース機能を使うことによって，SQL埋め込みCOBOLプログラムで，データベースにアクセスできます。この章では，ODBCインタフェース機能について説明します。

23.1　データベースアクセス機能

この節では，データベースアクセス機能について説明します。

なお，データベースアクセス機能の文法規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「9.　データベースアクセス機能」を参照してください。

23.1.1　埋め込みSQL文を使ったCOBOLプログラムの作成

埋め込みSQL文によるデータベースアクセスの方法は，SQLをCOBOLプログラム中に埋め込んで実行する方法（静的に行う方法）と，SQLを実行時に生成し，SQL文の埋め込み変数に設定して実行する方法（動的に行う方法）があります。

埋め込みSQL文のSELECT文は，表から1行分の値を取り出す文（SELECT文：単一行）です。複数行の値を取り出す場合は，カーソルを使用します。カーソルの使用には，静的に行う方法と動的に行う方法があります。また，ストアドプロシージャを呼び出して，一連の手続きを行う方法もあります。

(1)　COBOLプログラムで使用できるSQL文

COBOLプログラムで使用できる埋め込みSQL文を次に示します。

表23‒1　COBOLプログラムで使用できる埋め込みSQL文

種類

分類

SQL文

内容

宣言系

埋め込みSQL宣言節

BEGIN DECLARE SECTION

埋め込みSQL開始宣言

END DECLARE SECTION

埋め込みSQL終了宣言

埋め込み例外宣言

WHENEVER

埋め込み例外宣言

カーソル

DECLARE CURSOR

カーソル宣言

制御系

コネクション

CONNECT

コネクションを確立する

DISCONNECT

コネクションを解除する

SET CONNECTION

現行コネクションを変更する

トランザクション

COMMIT

コミットでトランザクションを終了させる

ROLLBACK

ロールバックでトランザクションを終了させる

操作系

静的

SELECT

表の指定された行から値を取り出す

INSERT

表に新しい行を作成する

DELETE

表から行を削除する

UPDATE

表の行を更新する

カーソル

OPEN

カーソルを開く

FETCH

カーソルを表の次の行に位置づけ，その行を取り出す

CLOSE

カーソルを閉じる

ストアドプロシージャ

CALL

ストアドプロシージャを呼び出す

動的

EXECUTE IMMEDIATE

動的SQLを準備し，実行する

PREPARE

動的SQLを準備する

DEALLOCATE PREPARE

準備した動的SQLを解放する

EXECUTE

動的SQLを実行する

(2)　埋め込みSQL宣言節

埋め込みSQL開始宣言から埋め込みSQL終了宣言までを，埋め込みSQL宣言節といいます。埋め込みSQL宣言節は，データ部に定義します。

埋め込みSQL宣言節には，SQLCODE変数，埋め込み変数，および標識変数を定義します。

(3)　埋め込み例外宣言

埋め込み例外宣言は，宣言系以外のSQL文の実行後の例外処理を記述します。

(4)　カーソル宣言

カーソル宣言は，OPEN文などでカーソルを使用する場合に，手続き部に定義します。カーソル宣言に誤りがあると，そのカーソル名に対するOPEN文の実行がエラーになります。

(5)　識別子

カーソル名，表名，列名，プロシージャ名などを表す識別子は，データベースによっても規定されます。したがって，正常にコンパイルされたプログラムでも，SQL文の実行が失敗することがあります。このような場合は，DBMSのマニュアルなどを参照してください。また，-EquivRuleコンパイラオプションの指定がない場合，等価規則が適用されます。等価規則については，マニュアル「COBOL2002　言語　標準仕様編」　「4.1.2　COBOL文字集合」を参照してください。

使用するデータベースを意識しないで運用したい場合は，カーソル名を英字で始まる18文字以内の文字列で定義することを推奨します。

(6)　トランザクション

トランザクションは，コネクションを確立したとき，または明示的にコミットやロールバックしたときから開始され，明示的，または暗黙的にコミット，ロールバックしたときに終了されます。トランザクションは，コネクションごとに管理されます。

一つのデータベースに対して複数のプログラム（コネクション）からアクセスする場合，デッドロックが発生する可能性があります。デッドロックが発生する可能性を低くするために，プログラム作成時には次のことに注意してください。

同時にアクセスするすべてのプログラムのデータベースへのアクセス順序を同じにすると，デッドロックの発生する可能性は低くなります。例えば，データベースへの更新アクセスをストアドプロシージャで登録し，これを使用することでアクセス順序を規定できます。

応答処理を含むプログラムの場合，応答処理がトランザクション内に存在すると，応答時間分，ほかのトランザクションによるアクセスがブロックされることがあります。このようなトランザクション内での応答処理をしないようにプログラムを作成することで，ブロックする時間を最小にできます。

デッドロックは，主に，同じデータベースに対するアクセスで長時間動作する複数のトランザクションが同時に実行されている場合に起こります。トランザクションが長くなれば，排他ロックまたは更新ロックが長時間になり，ほかの処理をブロックしてしまうので，デッドロックが発生する可能性が高くなります。このことから，トランザクションを最小単位で行うことで，デッドロックが発生する可能性を低くできます。

(7)　SQL文の実行順序

SQL文は，次に示す順序で実行する必要があります。

図23‒1　SQL文の実行順序

注※　動的SQL文を使用する場合については，次に示す順序を参照してください。

図23‒2　動的SQL文の実行順序

23.1.2　プログラムの例

埋め込みSQL文を使って，データベースの表にアクセスする例を示します。表は，DBMSが提供するツールなどを使用して定義します。詳細は，使用するDBMSのSQLリファレンスなどを参照してください。

なお，ここに示すのは，SQL Serverを使用した場合のアクセス方法の例です。

(1)　静的に行う方法によるプログラムの例

(a)　表の定義

氏名と住所の列を持つ「住所録」という表を定義します。

           CREATE TABLE 住所録 ( 氏名 char(20),
                                 住所 varchar(255))

(b)　表へのアクセス

「住所録」の表にアクセスします。

すでに表へ登録されている人の場合，住所を更新します。また，登録されていない人の場合，住所と氏名を新規に登録します。

      * <埋め込みSQL宣言節>
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
           01 ODBC-DSN PIC X(10) VALUE 'サンプル'.
           01 ODBC-UID PIC X(10) VALUE 'sa'.
           01 ODBC-PWD PIC X(10) VALUE SPACE.
           01 行数     PIC S9(9) USAGE COMP VALUE ZERO.
           01 住所録.
            02 氏名    PIC  X(20).
            02 住所.
             03 ODBC-length PIC S9(9) USAGE COMP.
             03 ODBC-char   PIC  X(255).
           EXEC SQL END DECLARE SECTION END-EXEC.
          :
       PROCEDURE DIVISION.
          :
      * <埋め込み例外宣言>
           EXEC SQL WHENEVER SQLERROR STOP END-EXEC.
      * <コネクションの確立>
           EXEC SQL
             CONNECT  :ODBC-UID  IDENTIFIED BY :ODBC-PWD
             USING    :ODBC-DSN
           END-EXEC.
      * <埋め込み例外宣言>
           EXEC SQL WHENEVER SQLERROR
                    GO TO :ROLLBACK-PROC END-EXEC.
           EXEC SQL WHENEVER NOT FOUND
                    PERFORM :NOTFOUND-PROC END-EXEC.
      * <登録されているかを参照する>
           MOVE '日立 太郎' TO 氏名.
           MOVE '福岡市博多区１丁目' TO ODBC-char OF 住所.
           MOVE 18 TO ODBC-length OF 住所.
           EXEC SQL
             SELECT COUNT(*) INTO :行数 FROM 住所録
             WHERE 氏名 = :氏名
           END-EXEC.
      * <住所録の表に登録する>
           IF 行数 = 0 THEN
             EXEC SQL
               INSERT INTO 住所録 ( 氏名, 住所 )
               VALUES ( :氏名, :住所 )
             END-EXEC
      * <住所録の表の住所を更新する>
           ELSE
             EXEC SQL
               UPDATE 住所録 SET 住所 = :住所
                             WHERE 氏名 = :氏名
             END-EXEC
           END-IF.
           EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
           EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
           EXEC SQL
             COMMIT WORK
           END-EXEC.
           GO TO DISCONNECT-PROC.
       ROLLBACK-PROC.
           EXEC SQL
             ROLLBACK WORK
           END-EXEC.
       DISCONNECT-PROC.
           EXEC SQL
             DISCONNECT
           END-EXEC.
           :
           STOP RUN.
       NOTFOUND-PROC SECTION.
           :
       NOTFOUND-PROC-END.
           EXIT.
           :

(2)　ストアドプロシージャの呼び出しの例

(a)　ストアドプロシージャの定義

「(1)　静的に行う方法によるプログラムの例」に示した「住所録」の表にアクセスします。

すでに表へ登録されている人の場合，住所を更新し，表に未登録の人の場合，住所と氏名を登録するようなストアドプロシージャを定義します。

           CREATE PROCEDURE
             住所更新 ( @氏名 char(20),@住所 varchar(255))
             AS

           IF 0 = (SELECT COUNT(*) FROM 住所録
                                   WHERE 氏名 = @氏名)
             BEGIN
             INSERT INTO 住所録 ( 氏名,住所 )
                    VALUES ( @氏名,@住所 )
             END
           ELSE
             BEGIN
             UPDATE 住所録 SET 住所 = @住所
                           WHERE 氏名 = @氏名
             END

(b)　ストアドプロシージャの呼び出し

定義したストアドプロシージャを呼び出します。

      * <埋め込みSQL宣言節>
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
           :
           01 住所更新.
             02 氏名 PIC X(20).
             02 住所.
               03 ODBC-length PIC S9(9) USAGE COMP.
               03 ODBC-char   PIC X(255).
           EXEC SQL END DECLARE SECTION END-EXEC.
           :

       PROCEDURE DIVISION.
           :
      * <住所録の表の住所を更新する>
           MOVE '日立 太郎' TO 氏名.
           MOVE '福岡市博多区２丁目' TO ODBC-char OF 住所.
           MOVE 18 TO ODBC-length OF 住所.
           EXEC SQL
             CALL 住所更新 ( :氏名, :住所 )
           END-EXEC.
           :

(3)　動的に行う方法によるプログラムの例

(a)　表の定義

氏名と住所の列を持つ「住所録」という表を定義します。

           CREATE TABLE 住所録 ( 氏名 char(20),
                                 住所 varchar(255))

(b)　表へのアクセス

「住所録」の表にアクセスします。

住所録の表に住所，氏名を登録し，住所録一覧を取得します。

      * <埋め込みSQL宣言節>
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
          :
           01 動的SQL PIC X(80).
           01 住所録.
             02 氏名 PIC X(20).
             02 住所.
               03 ODBC-length PIC S9(9) USAGE COMP.
               03 ODBC-char   PIC X(255).
           EXEC SQL END DECLARE SECTION END-EXEC.
          :
       PROCEDURE DIVISION.
          :
      * <埋め込み例外宣言>
           EXEC SQL WHENEVER SQLERROR
             GO TO :ROLLBACK-PROC END-EXEC.
           EXEC SQL WHENEVER NOT FOUND
             PERFORM :NOTFOUND-PROC END-EXEC.
      * <住所録の表に登録する>
           MOVE 'INSERT INTO 住所録 (氏名, 住所) VALUES (?,?)'
             TO 動的SQL.
           EXEC SQL
             PREPARE DYNSQL1 FROM :動的SQL
           END-EXEC.
           MOVE '日立 太郎' TO 氏名.
           MOVE '福岡市博多区３丁目' TO ODBC-char OF 住所.
           MOVE 18 TO ODBC-length OF 住所.
           EXEC SQL
             EXECUTE DYNSQL1 USING :氏名, :住所
           END-EXEC.
           EXEC SQL
             DEALLOCATE PREPARE DYNSQL1
           END-EXEC.
           EXEC SQL
             COMMIT WORK
           END-EXEC.
      * <住所録の表を一覧表示する>
           MOVE 'SELECT 氏名, 住所 FROM 住所録 ' TO 動的SQL.
           EXEC SQL
             PREPARE DYNSQL1 FROM :動的SQL
           END-EXEC.
           EXEC SQL
             DECLARE CRS00 CURSOR
               FOR DYNSQL1
           END-EXEC.
           EXEC SQL
             OPEN CRS00
           END-EXEC.
           EXEC SQL
               FETCH CRS00 INTO :氏名, :住所
           END-EXEC.
           ：
           EXEC SQL
             CLOSE CRS00
           END-EXEC.
           EXEC SQL
             DEALLOCATE PREPARE DYNSQL1
           END-EXEC.
           :

(4)　現行コネクションの変更の例

testdb1の接続先データベースの「住所録」の表にアクセスし，取得した住所データでtestdb2の接続先データベースの「宛先」の表の住所を更新します。

       :
      * <CONNDB1コネクションの確立>
           MOVE 'testdb1' TO ODBC-DSN.
           EXEC SQL
            CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD …1.
              USING :ODBC-DSN AS CONNDB1
           END-EXEC.
      * <住所を取得する>
           MOVE '日立 太郎' TO 氏名.
           EXEC SQL
            SELECT 住所 INTO :住所 FROM 住所録
                        WHERE 氏名 = :氏名
           END-EXEC.
            :
      * <CONNDB2コネクションの確立>
           MOVE 'testdb2' TO ODBC-DSN.
           EXEC SQL
            CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD …2.
              USING :ODBC-DSN AS CONNDB2
           END-EXEC.
      * <取得した住所で更新する>
          MOVE '日立 太郎' TO 氏名.
           EXEC SQL
             UPDATE 宛先 SET 住所 = :住所 WHERE 氏名 = :氏名
           END-EXEC.
            :
      * <現行コネクション(CONNDB2)を解除>
           EXEC SQL
            DISCONNECT CURRENT …3.
           END-EXEC.
      * <現行コネクションを変更する>
           EXEC SQL
            SET CONNECTION CONNDB1  …4.
           END-EXEC.
            :

例の説明

testdb1への接続を確立。

CONNDB1が現行コネクションとなる。

testdb2への接続を確立。

CONNDB2が現行コネクションとなる。

現行コネクションCONNDB2を解除。

現行コネクションは不定となる。

現行コネクションをCONNDB1に変更。

CONNDB1が現行コネクションとなる。

23.2　ODBCインタフェース機能の概要

ODBCインタフェース機能は，COBOLプログラムからデータベースアクセス用標準言語の構造化照会言語（SQL）を使って，データベース管理システム（DBMS）上のデータにアクセスする機能です。

COBOLプログラムに記述されたSQL文は，ODBC APIを使ってODBCドライバマネージャに渡され，さらに適切なODBCドライバへ渡されます。ODBCドライバは，渡されたSQL文を使ってデータベースにアクセスします。SQL埋め込みCOBOLアプリケーションがデータベースにアクセスする流れを，次に示します。

図23‒3　ODBCインタフェース機能の概要

23.2.1　ODBCインタフェース機能が動作する環境

(1)　動作に必要な環境

ODBCインタフェース機能を使用するには，次のような環境が必要です。

アクセスするデータが存在するDBMS

使用するDBMSがサーバ／クライアント形態の場合は，サーバへアクセスできるクライアント環境

使用するDBMSへアクセスできるODBCドライバ

ODBC2.0以降のODBCドライバマネージャ

(2)　ODBCの合致レベル

使用するODBCドライバが次のようなODBCの合致レベルを満たしていないと，SQL埋め込みCOBOLプログラムの実行時に，機能が制限されます。

(a)　APIの合致レベル

ODBCドライバは，コアおよびレベル1のすべての関数と，次のレベル2の関数をサポートしている必要があります。

SQLDataSources（ODBCレコード定義生成を使用する場合）

SQLDescribeParam（PREPARE文を使用する場合）

SQLNumParams（PREPARE文を使用する場合）

SQLExtendedFetch（FETCH文を使用する場合）

SQLMoreResult（FETCH（動的）文を使用する場合）

SQLProcedureColumns（CALL文を使用する場合）

(b)　SQLの合致レベル

ODBCドライバは，そのドライバがサポートする拡張SQL文法がCOBOL2002が対応している埋め込みSQLの文法をサポートしている必要があります。COBOL2002が対応している埋め込みSQLについては，マニュアル「COBOL2002　言語　拡張仕様編」　「9.　データベースアクセス機能」を参照してください。

23.2.2　データソースの管理について

使用するデータソースは，ODBCデータソースアドミニストレータを使用して追加，変更できます。ODBC データソースアドミニストレータは，32ビット版ODBC Administratorや，ODBC管理ツール アプリケーションと呼ばれることもあります。

データソースやドライバの詳細については，ODBCドライバ提供元のマニュアルを参照してください。

ここでは，ODBCデータソースアドミニストレータを使用してデータソースを追加する方法，およびODBC関数呼び出しをトレースする方法について説明します。

なお，次の説明内容は，ODBC3.5を使用する場合の方法です。データソースとドライバの管理についてのその他の方法は，ODBCデータソースアドミニストレータのヘルプ，およびODBCドライバ提供元のマニュアルを参照してください。

(1)　ODBCデータソースアドミニストレータの起動

コントロールパネルの［管理ツール］からデータソース（ODBC）のアイコンを選ぶ。

ODBCデータソースアドミニストレータが起動し，データソースダイアログボックスが表示されます。

(2)　データソースの管理

ODBCドライバをインストールすれば，一つ以上のデータソースを定義できます。現在インストールされているすべてのドライバに定義されているデータソースは，次の場所に表示されます。

［ユーザーDSN］ページの「ユーザーデータソース」に表示されます。

データソースは，特定のODBCドライバと，そのドライバからアクセスしたいデータを関連づけます。したがって，データソースを追加するときは，前提となるドライバがあらかじめ組み込まれている必要があります。

(a)　データソースの追加

ODBCデータソースアドミニストレータを起動し，［ユーザーDSN］ページを表示する。

［追加］ボタンを選ぶ。

データソースの新規作成ウィザードが表示され，インストール済みのドライバの一覧が表示されます。

インストール済みのドライバの一覧から，使用するデータソース用のドライバを指定し，［完了］ボタンを選ぶ。

使用するデータソース用のセットアップダイアログボックスが表示されます。ドライバ固有のセットアップダイアログボックスについては，ODBCドライバ提供元のマニュアルを参照してください（ヘルプボタンがあればヘルプを参照できます）。

そのデータソースに関する名前やフォルダなどの，必要な情報を入力する。

データソースの設定が完了したら，セットアップダイアログボックスの［OK］ボタンを選ぶ。

そのドライバ固有のセットアップダイアログボックスが閉じます。

続けてほかのデータソースを追加したいときは，2.〜5.の操作を繰り返す。

データソースの追加が終了したら，ODBCデータソースアドミニストレータウィンドウの［OK］ボタンを選ぶ。

指定したデータソースが追加されます。

(3)　トレースオプション

ODBCデータソースアドミニストレータの［トレース］ページで，ODBC関数呼び出しをトレースする方法を設定できます。

［トレース］ページからトレースを実行すると，ドライバマネージャは，その後動作するODBC関数呼び出しすべてのログをログファイルに記録します。

(a)　トレースを実行

ODBCデータソースアドミニストレータを起動し，［トレース］ページを表示する。

［トレースの開始］ボタンを選ぶ。

「ログファイルのパス」にODBC呼び出しを書き出すログファイル名を指定する。

ログファイル名は，新規のファイル名を入力するか，新しい情報を追加する既存のログファイルを［参照］ボタンから選択します。

［OK］ボタンを選ぶ。

ODBCデータソースアドミニストレータが終了します。ODBCデータソースアドミニストレータが終了した後に起動したすべてのODBCプログラムに対して，ODBC関数呼び出しのログが記録されます。

注意事項

トレース機能を実行していると，ログファイルの容量が大きくなり，ODBCプログラムの実行速度が遅くなる可能性があります。

23.2.3　コンパイル

SQL文を埋め込んだCOBOLプログラムをコンパイルするときは，コンパイル時に-SQL,ODBCオプションを指定します。

23.2.4　SQL文のエラー処理

(1)　SQL文の実行の確認

SQL文が正常に実行されたかどうかを確認するには，次の二つの方法があります。

埋め込み例外宣言を記述する

埋め込み例外宣言については，「23.1.1　埋め込みSQL文を使ったCOBOLプログラムの作成」の「(3)　埋め込み例外宣言」を参照してください。

SQLCODE変数の値を参照する

SQLCODE変数については，「(3)　SQLCODE変数」を参照してください。

(2)　SQL文でエラーが発生した場合の対処方法

エラーが発生した場合，SQL文の実行によって出力された実行時メッセージを参照して，対処してください。出力される実行時メッセージのうち，次の項目はODBCドライバ，またはデータソースから返される値です。

SQLSTATE

ODBCドライバから返される，ODBCインタフェースで規定された値です。詳細は，ODBCのプログラミングに関するマニュアルを参照してください。

SQLエラーコード

データソースが固有に持つエラーコードです。詳細は，ODBCドライバ，またはDBMSのマニュアルなどを参照してください。

ODBCメッセージ

ドライバマネージャ，またはデータソースから返されるメッセージです。

(3)　SQLCODE変数

SQLCODE変数を定義しておき，その値を参照することで，制御系，および操作系のSQL文が正しく実行されたか確認できます。

SQLCODE変数の値とその意味を次に示します。

表23‒2　SQLCODE変数の値と意味

SQLCODE変数の値

意味

0

正常に終了した。

100

該当行が存在しない。

100以外の正の数

（＞0 and ≠100）

SQLCODE変数の値が1で，警告メッセージが出力されていない場合

外部10進項目にデータを設定中に整数部，または小数部のけたあふれが発生した。

1.以外の場合

警告メッセージを出力した。

負の数（＜0）

実行は失敗し，エラーメッセージを出力した。

次の環境変数を指定するとSQLCODE変数に設定される値が変更されます。

(a)　実行時環境変数CBLSQLROWCOUNT

形式

CBLSQLROWCOUNT=YES

規則

この環境変数にYESを指定した場合，埋め込みSQL文のDELETE文，INSERT文，またはUPDATE文を実行して，影響を受けた行数が0行の場合にSQLCODE変数に100が設定されます。

WHENEVER（埋め込み例外宣言）文のNOT FOUND指定の有効範囲内で実行される埋め込みSQL文（DELETE文，INSERT文，またはUPDATE文）に対して，SQLCODE変数に100が設定されることで，NOT FOUND条件が実行されます。

この環境変数を指定しなかったとき，またはYES以外の値を指定したときは，埋め込みSQL文のDELETE文，またはUPDATE文の実行で，削除／更新行が0行の場合，SQLCODE変数に0が設定されます。ただし，INSERT文に関しては，注意事項を参照してください。

この環境変数を指定した場合，影響を受けた行数を取得するために，ODBCドライバがサポートするSQLRowCount関数が内部的に発行されるようになります。

注意事項

問い合わせ指定を記述したINSERT文の実行時，問い合わせ指定によって導出される表が空の場合（挿入行数が0行）は，この環境変数の指定がない場合でもSQLCODE変数に100が設定されます。

(4)　SQL文実行時のエラーメッセージ出力抑止

埋め込みSQL文実行時に出力される実行時メッセージの出力を抑止したい場合は，次の環境変数を指定します。

次の環境変数を指定すると埋め込みSQL文実行時に実行時メッセージが出力されなくなるので，CBLSQLERRORサービスルーチンを使用して，エラー情報はすべて取得することを推奨します。

(a)　実行時環境変数CBLSQLWMSG

形式

CBLSQLWMSG=YES

規則

設定値が形式に従ってない場合，この環境変数の指定は無効となります。

埋め込みSQL文実行時に出力される警告メッセージの出力を抑止したいときにYESを指定します。

この環境変数を指定しても，SQLCODE値，およびWHENEVER（埋め込み例外宣言）文の動作は変わりません。

(b)　実行時環境変数CBLSQLSUPPRESSMSG

形式

CBLSQLSUPPRESSMSG=8002

規則

設定値が形式に従ってない場合，この環境変数の指定は無効となります。設定値には，8002だけを指定できます。

ODBCインタフェースを使ってデータベースにアクセスする場合，KCCC8002R-Sメッセージの出力を抑止したいときに8002を指定します。

この環境変数を指定しても，SQLCODE値，およびWHENEVER（埋め込み例外宣言）文の動作は変わりません。

23.2.5　埋め込み変数

SQL文中で指定する埋め込み変数は，対応する列，または式で有効なODBC SQLデータ型と対応づけられたCOBOLデータ定義で，定義する必要があります。

使用する表の列に対応するCOBOLデータ定義は，ODBCレコード定義生成を使って生成できます。詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

ODBC SQLデータ型とCOBOLのデータ記述の対応を次に示します。

表23‒3　ODBC SQLデータ型に対応したCOBOLのデータ記述

ODBC SQLデータ型

埋め込み変数の型

データ記述

CHAR(n)

文字列型

固定長形式

Ln データ名     PIC X(n).

VARCHAR(n)

文字列型

可変長形式

L1 データ名.
 L2 ODBC-length PIC S9(9) USAGE COMP.
 L2 ODBC-char   PIC  X(n).

LONG VARCHAR

文字列型

可変長形式

L1 データ名.
 L2 ODBC-length PIC S9(9) USAGE COMP.
 L2 ODBC-char   PIC  X(max).

DECIMAL(p,s)

数値型

Ln データ名     PIC S9(p-s)V9(s)
                SIGN IS LEADING
                SEPARATE CHARACTER.

NUMERIC(p,s)

数値型

Ln データ名     PIC S9(p-s)V9(s)
                SIGN IS LEADING
                SEPARATE CHARACTER.

SMALLINT

整数型符号付き2バイト2進項目

または，整数型符号なし2バイト2進項目

Ln データ名    PIC S9(4) USAGE COMP.

Ln データ名    PIC  9(4) USAGE COMP.

INTEGER

整数型符号付き4バイト2進項目

または，整数型符号なし4バイト2進項目

Ln データ名    PIC S9(9) USAGE COMP.

Ln データ名    PIC  9(9) USAGE COMP.

REAL

内部浮動小数点型単精度形式

Ln データ名    USAGE COMPUTATIONAL-1.

FLOAT

内部浮動小数点型倍精度形式

Ln データ名    USAGE COMPUTATIONAL-2.

DOUBLE PRECISION

内部浮動小数点型倍精度形式

Ln データ名    USAGE COMPUTATIONAL-2.

BIT

ビット列型

L1 データ名.
 L2 FILLER     PIC  1(7) USAGE BIT.
 L2 ODBC-bit   PIC  1(1) USAGE BIT.

TINYINT

整数型符号付き1バイト2進形式

または整数型符号なし1バイト2進形式

Ln データ名    PIC  X(1).

Ln データ名    PIC S9(2) USAGE COMP.※

Ln データ名    PIC  9(2) USAGE COMP.※

BIGINT

整数型符号付き8バイト2進形式または整数型符号なし8バイト2進形式

Ln データ名    PIC  X(20).

BINARY(n)

バイナリデータ型固定長形式

Ln データ名    PIC  X(n).

VARBINARY(n)

バイナリデータ型可変長形式

L1 データ名.
 L2 ODBC-length PIC S9(9) USAGE COMP.
 L2 ODBC-binary PIC  X(n).

LONG VARBINARY

バイナリデータ型可変長形式

L1 データ名.
 L2 ODBC-length PIC S9(9) USAGE COMP.
 L2 ODBC-binary PIC  X(max).

DATE

日時型日付形式

L1 データ名.
 L2 ODBC-year   PIC S9(4) USAGE COMP.
 L2 ODBC-month  PIC  9(4) USAGE COMP.
 L2 ODBC-day    PIC  9(4) USAGE COMP.

TIME

日時型時刻形式

L1 データ名.
 L2 ODBC-hour   PIC  9(4) USAGE COMP.
 L2 ODBC-minute PIC  9(4) USAGE COMP.
 L2 ODBC-second PIC  9(4) USAGE COMP.

TIMESTAMP

日時型日付／時刻形式

L1 データ名.
 L2 ODBC-year   PIC S9(4) USAGE COMP.
 L2 ODBC-month  PIC  9(4) USAGE COMP.
 L2 ODBC-day    PIC  9(4) USAGE COMP.
 L2 ODBC-hour   PIC  9(4) USAGE COMP.
 L2 ODBC-minute PIC  9(4) USAGE COMP.
 L2 ODBC-second PIC  9(4) USAGE COMP.
 L2 ODBC-fraction PIC 9(9) USAGE COMP.

（凡例）

Ln：レベル番号01〜49，または77

L1：レベル番号01〜48

L2：レベル番号02〜49（ただし，L1＜L2）

max：最大データ長

ODBC-xxx：任意のデータ名

データ名：SQL文中で指定する埋め込み変数名

注

上表以外のSQLデータ型には対応していません。

注※

1バイト2進項目は，COMP-X項目で定義するか，コンパイル時に-Bin1Byteオプションを指定する必要があります。1バイト2進項目の詳細については，マニュアル「COBOL2002　言語　拡張仕様編」　「25.6.1　1バイト2進機能」を参照してください。

23.2.6　トランザクション

(1)　トランザクション分離レベル

あるデータベース上のデータに対して複数のユーザから同時にアクセスする場合，トランザクションはそれぞれの接続ごとにドライバによって管理され，ドライバのトランザクション分離レベルに従って，トランザクションが処理されます。

トランザクション分離レベルは，ドライバ，またはデータソースのデフォルトに従います。詳細は，ODBCドライバ提供元のマニュアルなどを参照してください。

23.2.7　コネクション

コネクションは，CONNECT文によって接続を確立します。CONNECT文で指定する接続先データベース名は，データソース名を指定します。

データソースはODBCドライバマネージャ経由でアクセスできるように登録されていなければなりません。データソース名を省略したときは，デフォルトデータソース（default）を仮定します。

CONNECT文で指定する接続文字列については，ODBCドライバ提供元のマニュアルなどを参照してください。

（例）

次のCONNECT文は，同じデータソースに対しての接続を要求します。

データソース名を使用する方法

       MOVE 'sa' TO ODBC-UID.
       MOVE SPACE TO ODBC-PWD.
       MOVE 'サンプル' TO ODBC-DSN.
       EXEC SQL
         CONNECT :ODBC-UID
           IDENTIFIED BY :ODBC-PWD
           USING :ODBC-DSN
       END-EXEC.

接続文字列を使用する方法

       MOVE 'DSN=サンプル;UID=sa;PWD=;'
         TO ODBC-CONN.
       EXEC SQL
         CONNECT TO :ODBC-CONN
       END-EXEC.

23.2.8　タイムアウト秒数の設定

ODBCインタフェースを使って埋め込みSQL文実行時に，実行時環境変数に指定したタイムアウト秒数でODBCオプションを設定できます。この機能を使用しない場合，タイムアウト秒数は設定しません。

(1)　CONNECT文でのタイムアウト秒数の設定

形式

CBLSQLLOGINTIMEOUT=タイムアウト秒数

タイムアウト秒数には，0〜2,147,483,647の符号なし整数を指定します。ただし，タイムアウトの最大値は，使用するODBCドライバによって規定されます。

なお，タイムアウト秒数に0を指定した場合，タイムアウトは発生しないので，永久に待ち状態となります。

規則

設定値が形式に従ってない場合，この環境変数の指定は無効となります。

ODBCインタフェースを使って埋め込みSQL文（CONNECT）実行時に，環境変数に設定されたタイムアウト秒数を，SQLSetConnectOption関数でSQL_LOGIN_TIMEOUTオプションに設定します。

(2)　埋め込みSQL文（操作系）でのタイムアウト秒数の設定

形式

CBLSQLQUERYTIMEOUT=タイムアウト秒数

タイムアウト秒数には，0〜2,147,483,647の符号なし整数を指定します。ただし，タイムアウトの最大値は，使用するODBCドライバによって規定されます。

なお，タイムアウト秒数に0を指定した場合は，タイムアウトは発生しないので，永久に待ち状態となります。

規則

設定値が形式に従ってない場合，この環境変数の指定は無効となります。

ODBCインタフェースを使って埋め込みSQL文（操作系）実行時に，環境変数で設定されたタイムアウト秒数を，SQLSetStmtOption関数でSQL_QUERY_TIMEOUTオプションに設定します。

23.2.9　カーソルオプションの設定

ODBCインタフェース機能では，ODBCカーソルライブラリの静的カーソルを使用するように次のODBCのオプションを設定してSQLのカーソル処理を実現しています。

表23‒4　ODBCのオプションに対応するSQLのカーソル処理

オプション名

設定値

機能

接続オプション

SQLSetConnectOption（hdbc,SQL_ODBC_CURSORS,SQL_CUR_USE_ODBC）；

ドライバマネージャは，ドライバのスクロール機能を使用します。

ステートメントオプション

SQLSetStmtOption（hstmt,SQL_CONCURRENCY,SQL_CONCUR_VALUES）；

カーソルは最適化同時実行制御を使用して値を比較します。

SQLSetStmtOption（hstmt,SQL_CURSOR_TYPE,SQL_SCROLL_STATIC）；

結果セットのデータは静的なデータとなります。

しかし，このODBCオプションの設定でのカーソル処理では，次の制限事項があります。

SQL Serverで，カーソル使用中にほかのクエリを実行した場合，次に示すエラーが返されることがあります。

[Microsoft][ODBC SQL Server Driver] ほかの実行結果のために接続できません。

ODBCカーソルライブラリで，ディスク容量不足などによりテンポラリファイル※が作成できないとき，次に示すエラーなどが返されます。

[Microsoft][ODBC Cursor Library] 一般エラー：ファイル バッファーを作成できません。

ODBCカーソルライブラリが使用するテンポラリファイル※のサイズが上限サイズ（2ギガバイト）に達すると，プログラムがアクセス違反で異常終了することがあります。

注※

テンポラリファイルは，ODBCカーソルライブラリが内部的に作成，または使用するファイルです（COBOL2002で管理するファイルではありません）。出力先やファイル名については，ODBCカーソルライブラリの仕様を確認してください。

このような問題を回避するため，SQL Serverのデータベースに接続する場合は，実行時環境変数CBLSQLCURUSEを指定してください。

(1)　実行時環境変数CBLSQLCURUSE

形式

CBLSQLCURUSE=DYNAMIC

規則

DYNAMIC

ODBCドライバのスクロール機能の動的カーソルを使用するように設定します。この実行時環境変数の指定がない場合は，ODBCカーソルライブラリの静的カーソルを使用するようにODBCオプションを設定します。DYNAMIC以外の値を指定した場合の結果は，保証しません。

DYNAMICを指定した場合，次の太字のオプションがデフォルトから変更されます。

表23‒5　DYNAMICを指定した場合の設定値と機能

オプション名

設定値

機能

接続オプション

SQLSetConnectOption（hdbc,SQL_ODBC_CURSORS,SQL_CUR_USE_DRIVER）;

ドライバマネージャは，ドライバのスクロール機能を使用します。

ステートメントオプション

SQLSetStmtOption（hstmt,SQL_CONCURRENCY,SQL_CONCUR_VALUES）；

カーソルは最適化同時実行制御を使用して値を比較します。

SQLSetStmtOption（hstmt,SQL_CURSOR_TYPE,SQL_SCROLL_DYNAMIC）；

ドライバは行セットの行に対するキーだけを保存して使用します。

(2)　注意事項

この実行時環境変数を指定して，SQL Server以外のデータベースに接続する場合の動作は保証しません。

SQL ServerのODBCドライバを使用したODBCカーソルライブラリの静的カーソルを使用する場合と，ODBCドライバのスクロール機能の動的カーソルを使用する場合では，動作が異なります。例を次に示します。

詳細およびその他の動作については，SQL ServerのODBCドライバのリファレンスなどで確認してください。

表23‒6　使用するカーソルによる動作の差異

対象

ODBCカーソルライブラリの静的カーソル使用時

ODBCドライバのスクロール機能の動的カーソル使用時

SQL Serverのカーソル

クライアントカーソル

サーバカーソル

カーソル使用中の他クエリ（SELECTを含むSQL文）の実行

実行できない。※1

実行できる。

副問い合わせなど複数のSELECTを含むSQL文の実行

サポートされる。

サポートされない。※2

SQL文1行のサイズ

8,060バイトに制限されない。

8,060バイトに制限される。

テンポラリファイル

作成される。※3

作成されない。

注※1

次のエラーが出力されます。

[Microsoft][ODBC SQL Server Driver]ほかの実行結果のために接続できません。

注※2

サーバカーソルではサポートしていませんが，SQL Serverのドライバによって暗黙的にカーソルを変更し，該当のSQL文を正常に実行します。

このとき，次の警告を出力します。また，この暗黙のカーソル変更は，該当のSQL文だけに有効です。

[Microsoft][ODBC SQL Server Driver]カーソルの種類が変更されました。

[Microsoft][ODBC SQL Server Driver]カーソルの同時性が変更されました。

注※3

テンポラリファイルが作成できない場合，次のエラーが出力されます。

[Microsoft][ODBC Cursor Library] 一般エラー：ファイル バッファーを作成できません。

23.2.10　データベース固有の注意事項

HiRDBのデータベースに接続する場合，COBOLプログラム実行中に環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行しないでください。環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行すると，先行トランザクションの前処理が無効となるため，COBOLの管理情報との不整合が発生し，予期しない実行時エラーが発生するおそれがあります。

環境変数PDDDLDEAPRPEXEの詳細は，「HiRDBのUAP開発ガイドマニュアル」を参照してください。

動的SQLで定義系のクエリを指定して実行しているトランザクションと，動的SQLで操作系のクエリ，または静的に行う方法やカーソル，ストアドプロシージャ呼び出しの埋め込みSQL文を実行しているトランザクションは，別々のトランザクションとしてください。一つのトランザクション内で混在させた場合の動作は保証しません。

表を参照，または更新している場合※に，その表の定義を定義系のクエリやほかのプログラムやツールなどを使用して変更したときの動作は保証しません。参照，または更新している表の定義を変更した場合，記述された埋め込みSQL文との不整合が発生し，予期しない実行時エラーが発生することがあります。

注※

表を参照，更新しているときとは，次の期間です。

埋め込みSQL文を実行し，COMMIT文またはROLLBACK文でトランザクションを終了するまでの間

PREPARE文で準備したSQL文を明示的にDEALLOCATE PREPARE文で解放するまでの間

23.2.11　動的SQLのODBC API関数発行の変更

SQL Server 2012では，メタデータ検出機能が強化されています。この影響で，使用されているSQL Serverをバージョンアップすると，SQL Serverのデータベースに動的SQLでアクセスするCOBOLプログラムの実行性能が劣化する場合があります。この場合，実行時環境変数CBLSQLDYNAMICを指定すると，実行性能が改善することがあります。

形式

CBLSQLDYNAMIC=REUSEBINDINFO

規則

設定値が形式に従ってない場合，この環境変数の指定は無効です。

環境変数CBLSQLDYNAMICにREUSEBINDINFOを指定すると，埋め込みSQL文で内部的に発行するODBC APIを次のとおりに変更し，1回目の埋め込みSQL文実行時に取得した情報で2回目以降も実行します。

・次の埋め込みSQL文を連続で実行した場合

2回目以降の実行では，1回目に取得した情報をバインド処理で再利用します。※1

EXECUTE文

動的SQLをカーソルで実行する場合のOPEN文

動的SQLをカーソルで実行する場合のOPEN文に対する最初のFETCH文

・PREPARE文で準備した動的SQLが，INSERT文，DELETE文，またはUPDATE文の場合

埋め込みSQL文のEXECUTE文を連続で実行したときに，2回目以降の実行では1回目に取得したODBCハンドル情報を再利用します。※2

注※1

2回目以降の埋め込みSQL文の実行で，内部的にSQLDescribeParam，SQLDescribeCol，SQLNumResultColsを呼び出さない（パラメタ，列情報を取得しない）ようにすることで，1回目の埋め込みSQL文の実行で取得したパラメタ，列情報を再利用します。

注※2

埋め込みSQL文のEXECUTE文の実行で，内部的にSQLFreeStmtをSQL_CLOSEパラメタ指定で呼び出さない（ODBCハンドル情報をクローズしない）ようにすることで，1回目の埋め込みSQL文のEXECUTE文の実行で取得したODBCハンドル情報を再利用します。

24　XDMによるデータベース操作シミュレーション機能

この章では，XDMによるデータベース操作シミュレーション機能について説明します。

24.1　データベース操作シミュレーションの概要

データベース操作シミュレーション機能とは，メインフレーム（VOS3）COBOL85の環境で作成したXDMによるデータベース操作を行うプログラムを，Windows COBOL2002上でシミュレーションする機能です。

データベース操作シミュレーション機能には次の二つの機能があります。

構造型データベース操作シミュレーション機能

メインフレームで構造型データベースXDM/SD（Extensible Data Manager／Structured Database）を操作するプログラムを，Windows上でコンパイルし，実行する機能です。

詳細は，「24.2　構造型データベース（XDM/SD）操作シミュレーション」を参照してください。

リレーショナルデータベース操作シミュレーション機能

メインフレームでリレーショナルデータベースXDM/RD（Extensible Data Manager／Relational Database）を操作するプログラムを，SQL文を覚え書きとしてコンパイルし，テストデバッガのTDコマンド（ASSIGN DATAコマンドなど）を使用してテストする機能です。

詳細は，「24.3　リレーショナルデータベース（XDM/RD）操作シミュレーション」を参照してください。

これらのシミュレーション機能の使い方について説明します。

なお，データベース操作シミュレーション機能の文法規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「19.　データベース操作シミュレーション機能」を参照してください。

24.2　構造型データベース（XDM/SD）操作シミュレーション

メインフレームで構造型データベースXDM/SD（Extensible Data Manager／Structured Database）を操作するプログラムを，Windows上でコンパイル，実行できます。このプログラムのコンパイル，実行，テストの方法について説明します。

24.2.1　コンパイル方法

プログラムのコンパイルまでの手順を次に示します。

データベース情報をCOBOL宣言文に展開する。

メインフレーム上でXDMのユティリティを使用し，データベース情報であるスキーマ情報，サブスキーマ情報をCOBOL宣言文に展開します。このとき，COBOL宣言文（COPY文で展開される原文）は，XDM E2系ユティリティJXBSAIDを使用して作成します。

（COBOL宣言文の展開例）

COBOL宣言文をWindowsに転送する。

作成したCOBOL宣言文を，ファイル転送プログラムIFITを使用してWindowsに転送します。このとき，Windowsで受け取るファイル名は"サブスキーマ名スキーマ名.cbl"（上記の例では，HSB1HSC1.cbl）とする必要があります。

プログラムをコンパイルする。

Windowsに転送されたCOBOL宣言文（COPY展開される原文）は，コンパイル時のSUBSCHEMA SECTION解析中にCOPY文と同様に展開されます。このため，COBOL宣言文の入ったファイルは，登録集原文が展開できるフォルダ下に置く必要があります。

24.2.2　実行方法

手続き部に記述したFIND文，FETCH文などのデータベース操作文は，"CALL 'CBLXDMSD' USING 引数 ……"と内部的に展開されます。展開されたCALL文で呼び出されるプログラムでシミュレーションをする場合は，'CBLXDMSD'という名称の関数を作成し，コンパイル，リンクして実行可能ファイルを生成しておきます。この結果，手続き部のデータベース操作文は，'CBLXDMSD'で作成した関数を呼び出せます。

なお，'CBLXDMSD'という名称の関数を，コンパイル，リンクして実行可能ファイルを生成しないときは，コンパイラが提供する，構造型データベース（XDM/SD）操作シミュレーション機能の実行時ライブラリ用ダミールーチンCBLXDMSDが実行されます。

24.2.3　内部的に展開されるCALL文の引数

CALL文に展開されたデータベース操作文の引数によって，利用者はXDM/SDプログラムをテストできます。内部的に展開されるCALL文の引数の形式を次に示します。

形式

CALL 'CBLXDMSD' USING インタフェースエリア
   DML情報エリア 固有情報エリア (その他の引数) …

データベース操作文で内部的に展開されるCALL文を次に示します。

表24‒1　データベース操作文で内部的に展開されるCALL文

データベース操作文

内部的に展開されるCALL文と設定される引数

データベース条件文

CALL 'CBLXDMSD' USING インタフェースエリア
                      ,DML情報エリア
                      ,固有情報エリア

CONNECT文

DISCONNECT文

ERASE文

NULLIFY文

RECONNECT文

CALL 'CBLXDMSD' USING インタフェースエリア
                      ,DML情報エリア
                      ,固有情報エリア

FETCH文※1

FIND文

GET文※1

MODIFY文

STORE文

CALL 'CBLXDMSD' USING インタフェースエリア
                      ,DML情報エリア
                      ,固有情報エリア
                      ,データ受け渡しエリア※2
                    〔,付加機能用情報エリア〕※3

FETCH文※4

CALL 'CBLXDMSD' USING インタフェースエリア
                      ,DML情報エリア
                      ,固有情報エリア
                      ,データ受け渡しエリア※5

GET文※4

CALL 'CBLXDMSD' USING インタフェースエリア
                      ,DML情報エリア
                      ,固有情報エリア
                      ,データ受け渡しエリア※2
                      ,データ受け渡しエリア※5

注※1　DATA AREA指定がありません。

注※2

FROM，INTOで指定したデータ名です。指定しない場合にはサブスキーマ節の先頭のレコードビュー名が使用されます。

注※3

FIND文，DATA AREA指定なしのFETCH文でUSINGを指定したときのデータ名です。〔　〕で囲まれた引数を指定しない場合，引数はBY REFERENCE指定でZERO（4バイトの0）を渡します。

注※4　DATA AREA指定があります。

注※5　DATA AREAで指定したデータ名です。

データベース操作文で内部的に展開されるCALL文の引数を「表24‒2　データベース操作文で内部的に展開されるCALL文の引数」に示します。また，各項目の詳細を次の表に示します。

表24‒3　インタフェースエリアの詳細

表24‒4　DML情報エリアの詳細

表24‒5　固有情報エリアの詳細

表24‒2　データベース操作文で内部的に展開されるCALL文の引数

引数の項目

設定内容

インタフェースエリア

01 SD-IFA.
  02 FILLER    PIC X(4).
  02 SD-IFA-01 PIC X(5).  ………… 実行結果を表す状態コード
  02 SD-IFA-02 PIC X(1).  ………… データベース条件の実行結果
  02 SD-IFA-03 PIC X(30). ………… 検索したレコードビュー名
  02 FILLER    PIC X(30).
  02 SD-IFA-04 PIC X(2).  ………… 使用しない
  02 SD-IFA-05 PIC X(2).  ………… 使用しない
  02 FILLER    PIC X(26).
  02 SD-IFA-06 PIC X(20). ………… 使用しない
  02 FILLER    PIC X(12).
  02 SD-IFA-07 PIC S9(4) COMP.  … カーソルグループ番号
  02 SD-IFA-08 PIC X(4).  ………… サブ状態コード
  02 SD-IFA-09 PIC S9(4) COMP.  … レコードビュー長
  02 FILLER    PIC X(20).
  02 SD-IFA-10 PIC X(30). ………… データベース操作文種別
  02 FILLER    PIC X(66).
  02 SD-IFA-11 PIC X(30). ………… サブスキーマ名
  02 SD-IFA-12 PIC X(30). ………… スキーマ名
  02 FILLER    PIC X(196).

DML情報エリア

01 SD-DML.
  02 SD-DML-01  PIC S9(4) COMP.  … DML情報エリア長
  02 FILLER    PIC X(2).
  02 SD-DML-02 PIC X(2).  ………… DML区分
  02 SD-DML-03 PIC X(2).  ………… 要求種別
  02 SD-DML-04 PIC X(2).  ………… 一括検索範囲指定
  02 SD-DML-05 PIC X(2).  ………… 位置指示子指定
  02 SD-DML-06 PIC X(30). ………… ビュー名
  02 FILLER    PIC X(2).
  02 SD-DML-07 PIC X(30). ………… インデクス名／
                                   親子集合ビュー名
  02 FILLER    PIC X(2).
  02 SD-DML-08 PIC X(2).  ………… 探索方向
  02 SD-DML-09 PIC X(2).  ………… 位置決め目的
  02 SD-DML-10 PIC S9(9) COMP.  … 探索方向の整数値
  02 SD-DML-11 PIC X(30). ………… パス名
  02 FILLER    PIC X(14).

固有情報エリア

（手続き文の各指定情報）

01 SD-TYP.
  02 SD-TYP-01 PIC X(2).   ………… データ名指定情報
  02 FILLER PIC X(6).
  02 SD-TYP-02 PIC X(2).   ………… 条件種別
  02 FILLER PIC X(2).
  02 SD-TYP-03  PIC X(2).  ………… 左辺指定子
  02 SD-TYP-04  PIC X(30). ………… 左辺指定子ビュー名
  02 SD-TYP-05  PIC X(2).  ………… 右辺指定子
  02 SD-TYP-06  PIC X(30). ………… 右辺指定子ビュー名
  02 SD-TYP-07  PIC X(2).  ………… 検索条件の比較演算子
  02 SD-TYP-08  PIC X(30). ………… 検索条件の構成要素
                                    ビュー名
  02 FILLER      PIC X(32).
  02 SD-TYP-09   PIC X(1). ………… RETAINING種別
  02 FILLER      PIC X(1).
  02 SD-TYP-10   PIC S9(4) COMP. … 親子集合ビュー数
  02 FILLER OCCURS 2000 DEPENDING ON SD-TYP-10.
    03 SD-TYP-11 PIC X(30).  ……… 親子集合ビュー名
    03 FILLER    PIC X(2).

データ受け渡しエリアおよび付加機能用情報エリア

データ名

表24‒3　インタフェースエリアの詳細

領域名

CALL文

実行前

シミュ

レータ

CALL文

実行後

内容

SD-IFA-01

−

設定

参照

実行結果を表す。

STATUS句で指定したデータ名の領域に転記される。

SD-IFA-02

−

設定

参照

データベース条件の結果を表し，データベース条件の判定に使用する。

'1'：判定結果は真

'0'：判定結果は偽

SD-IFA-03

−

設定

参照

検索したレコードビュー名を表す。

RECORD NAME句に指定したデータ名の領域に転記される。RECORD NAME句の指定がない場合は転記されない。

SD-IFA-04

−

−

−

使用しない。

SD-IFA-05

−

−

−

使用しない。

SD-IFA-06

−

−

−

使用しない。

SD-IFA-07

設定

参照

−

カーソルグループ番号を表す。

CURSOR NUMBER句に指定したデータ名の領域から転記される。

CURSOR NUMBER句の指定がない場合は0が転記される。

SD-IFA-08

−

設定

参照

サブ状態コードを表す。

DETAIL CODE句で指定したデータ名の領域に転記される。DETAIL CODE句の指定がない場合は転記されない。

SD-IFA-09

−

設定

参照

処理対象のレコードビュー長を表す。

RECORD LENGTH句で指定したデータ名の領域に転記される。

RECORD LENGTH句の指定がない場合は転記されない。

SD-IFA-10

設定

参照

−

データベース操作文の種別を表す。

'CONNECT' = CONNECT文

'DISCONNECT' = DISCONNECT文

'ERASE' = ERASE文

'FETCH' = FETCH文

'FIND' = FIND文

'GET' = GET文

'MODIFY' = MODIFY文

'NULLIFY' = NULLIFY文

'RECONNECT' = RECONNECT文

'STORE' = STORE文

'TEST' = データベース条件文

SD-IFA-11

設定

参照

−

サブスキーマを表す。

サブスキーマが転記される。

SD-IFA-12

設定

参照

−

スキーマを表す。

スキーマが転記される。

（凡例）

−：該当しない

データ受け渡しエリアおよび付加情報エリアでは，各文中に指定されたデータ名が引数になります。指定できるデータ名を次に示します。

FETCH文のDATA AREAまたはINTOに指定されたデータ名

GET文のDATA AREAまたはINTOに指定されたデータ名

MODIFY文のFROMに指定されたデータ名

STORE文のFROMに指定されたデータ名

FETCH文またはFIND文のUSINGに指定されたデータ名

表24‒4　DML情報エリアの詳細

領域名

CALL文

実行前

シミュ

レータ

CALL文

実行後

内容

SD-DML-01

設定

−

−

DML情報エリア長を表す。

128の固定長が転記される。

SD-DML-02

−

−

−

使用しない。

SD-DML-03

設定

参照

−

要求種別を表す。

'P' = ERASE文でALL指定なし。

'R' = FETCH(1)文でWITHIN，INDEXEDの指定なし。

または，FIND文でCURRENT，WITHIN，INDEXEDの指定なし。

'RI'= FETCH(1)，FIND文でINDEXED指定あり。

'S' = FETCH(1)，FIND文でWITHIN指定あり。

'C' = FIND文でCURRENT指定あり。

'H' = FETCH(2)文でWITHIN，INDEXEDの指定なし。

'HI'= FETCH(2)文でINDEXED指定あり。

'M' = FETCH(2)文でWITHIN指定あり。

'N' = GET(2)文。

SD-DML-04

設定

参照

−

一括検索範囲指定を表す。

'A' = FETCH文でADVANCING指定あり。

SD-DML-05

設定

参照

−

位置指示子指定を表す。

'S' = NULLIFY文でレコードビュー名，OWNER，MEMBERの指定なし。

または，CURRENT指定ありのFIND文で，レコードビュー名，OWNER，MEMBERの指定なし。

'R' = NULLIFY文でレコードビュー名の指定あり。

または，FIND文でCURRENT　レコードビュー名の指定あり。

'O' = NULLIFY文でOWNER OF　親子集合ビュー名の指定あり。

または，FIND文でCURRENT OWNER OF　親子集合ビュー名の指定あり。

'M' = NULLIFY文でMEMBER OF　親子集合ビュー名の指定あり。

または，FIND文でCURRENT MEMBER OF　親子集合ビュー名の指定あり。

SD-DML-06

設定

参照

−

次のレコードビュー名または親子集合ビュー名を表す。

CONNECT，DISCONNECT，ERASE，FETCH，GET，MODIFY，RECONNECT，STORE文で指定されたレコードビュー名

FIND文でCURRENT指定がない場合のレコードビュー名

FIND，NULLIFY文でCURRENTに指定されたレコードビュー名または親子集合ビュー名

SD-DML-07

設定

参照

−

次のインデクス名または親子集合ビュー名を表す。

FETCH，FIND文でINDEXED指定がある場合のインデクス名

FETCH，FIND，GET文でWITHIN指定がある場合の親子集合ビュー名

CONNECT，DISCONNECT，RECONNECT文で指定された先頭の親子集合ビュー名

SD-DML-08

設定

参照

−

探索方向を表す。

'F' = FETCH，FIND文でFIRST指定あり。

'L' = 〃 LAST指定あり。

'N' = 〃 NEXT指定あり。

'P' = 〃 PRIOR指定あり。

'A' = 〃 RELATIVE指定なし。

'R' = 〃 RELATIVE指定あり。

'D' = 〃 DYNAMIC指定あり。

SD-DML-09

設定

参照

−

位置決め目的を表す。

'U' = FETCH，FIND文でUPDATE指定あり。

SD-DML-10

設定

参照

−

探索方向の整数値を表す。

RELATIVE指定時，未指定時の一意名または整数の値。

SD-DML-11

設定

参照

−

パス名を表す。

FETCH文に指定されたパス名。

（凡例）

−：該当しない

FETCH(1)文，FETCH(2)文，GET(2)文は，それぞれ次の文を指します。

FETCH(1)文：DATA AREA指定なしのFETCH文

FETCH(2)文：DATA AREA指定ありのFETCH文

GET(2)文：DATA AREA指定ありのGET文

表24‒5　固有情報エリアの詳細

領域名

CALL文

実行前

シミュ

レータ

CALL文

実行後

内容

SD-TYP-01

設定

参照

−

データ名指定を表す。

'U' = USING指定あり。

SD-TYP-02

設定

参照

−

条件種別を表す。

'A' = データベース条件文のALSO指定

'NA'= 〃 NOT ALSO指定

'N' = 〃 NULL指定

'NN'= 〃 NOT NULL指定

'E' = 〃 EMPTY指定

'NE'= 〃 NOT EMPTY指定

'C' = 〃 CONTAINS指定

空白 = 上記以外

SD-TYP-03

設定

参照

−

左辺指定子を表す。

'R' = データベース条件左辺にレコードビュー名を指定

'O' = 〃 OWNER OF　親子集合ビュー名を指定

'M' = 〃 MEMBER OF　親子集合ビュー名を指定

'S' = 〃 レコードビュー名，OWNER，MEMBERのどの指定もなし

'X' = 〃 親子集合ビュー名を指定

空白 =上記以外

SD-TYP-04

設定

参照

−

データベース条件左辺のレコードビュー名または親子集合ビュー名を表す（SD-TYP-03が 'S'または空白のときは，この領域も空白となる）。

SD-TYP-05

設定

参照

−

右辺指定子を表す。

'R' = データベース条件右辺にレコードビュー名を指定

'O' = 〃 OWNER OF　親子集合ビュー名を指定

'M' = 〃 MEMBER OF　親子集合ビュー名を指定

'S' = 〃 レコードビュー名，OWNER，MEMBERのどの指定もなし

'X' = 〃 親子集合ビュー名を指定

空白 =上記以外

SD-TYP-06

設定

参照

−

データベース条件右辺のレコードビュー名または親子集合ビュー名を表す（SD-TYP-05が 'S'または空白のときは，この領域も空白となる）。

SD-TYP-07

設定

参照

−

探索条件の最初に現れた比較演算子を表す。

'>' = GREATER THAN　または > 指定

'<' = LESS THAN　または < 指定

'=' = EQUAL　または = 指定

'>='= GREATER THAN OR EQUAL または >= 指定

'<='= LESS THAN OR EQUAL　または <= 指定

空白= 上記以外

SD-TYP-08

設定

参照

−

探索条件の最初に現れた構成要素ビュー名またはKEYを表す

（SD-TYP-07が空白のときは，この領域も空白となる）。

SD-TYP-09

設定

参照

−

RETAINING種別を表す。

'A' = RETAINING指定ありのFETCH，FIND，STORE文で，RECORD，親子集合ビュー名の指定がない。

'R' = ERASE文でRETAINING指定あり。

または，RETAINING RECORD指定ありのFETCH，FIND，STORE文で，親子集合ビュー名の指定がない。

'S' = RETAINING　親子集合ビュー名指定ありのFETCH，FIND，STORE文で，RECORDの指定がない。

'B' = FETCH，FIND，STORE文に，RETAINING RECORD　親子集合ビュー名の指定がある。

SD-TYP-10

設定

参照

−

RETAININGに指定された親子集合ビューの個数を表す。親子集合ビュー名の指定があれば，その個数が入る。

SD-TYP-11

設定

参照

−

RETAININGに指定された親子集合ビュー名を表す（SD-TYP-10が0の場合，この領域はない）。

（凡例）

−：該当しない

注

SD-TYP-02〜06は，データベース条件文情報です。

SD-TYP-07，08は，探索条件情報です。

SD-TYP-09〜11は，RETAINING情報です。

24.2.4　XDM/SDプログラムのテスト方法の制限事項

COBOL原始プログラムのコンパイル時，次の部分はエラーチェックの対象となりません。

(1)　XDMシステム定義のスキーマ定義にだけ指定され，サブスキーマ節に展開されない部分

親子集合で親レコード，子レコードの対応関係があるもの

例えば，親子集合型内を検索するFETCH文で，レコードビュー名で示すレコードは，親子集合ビュー名で示す親子集合の子レコードにしなければなりません。

パスで指定したレコードの関係にあるもの

例えば，パス順に複数のレコードを検索するFETCH文で，エントリレコード名で示すレコードは，パス名で示すパスのエントリレコードにしなければなりません。

副構成要素に関するもの

例えば，条件を指定したFETCH文で，比較条件に指定した構成要素ビュー名で示す構成要素は，副構成要素以外にしなければなりません。

(2)　XDMシステム定義のサブスキーマ定義にだけ指定され，サブスキーマ節に展開されない部分

アクセス目的に関するもの

例えば，FOR UPDATE（更新）を指定したFETCH文で，レコードビュー名で示すレコードは，サブスキーマ定義でUPDATE指定をしなければなりません。

24.3　リレーショナルデータベース（XDM/RD）操作シミュレーション

メインフレームでリレーショナルデータベースXDM/RD（Extensible Data Manager／Relational Database）を操作するプログラムの埋め込みSQL文を覚え書きとしてコンパイルし，テストデバッガのTDコマンドを使用してテストができます。

24.3.1　コンパイル方法

リレーショナルデータベース（XDM/RD）操作シミュレーション機能を使用する場合，-SQL,XDMオプションを指定してコンパイルします。また，SQL連絡領域SQLCAは，メインフレームのXDM/RDが提供しているSQL連絡領域をSQLCA.cblという名称でWindows上に転送して使用します。このシステムでは，リレーショナルデータベース（XDM/RD）操作シミュレーション機能の実行時ライブラリ用ダミールーチンとして，CBLXDMRDを提供します。

24.3.2　テスト方法

実行可能ファイルではSQL文は実行に関係しないため，SQL文のテストはできません。SQL以外の文のテストをする場合は，テストデバッガのTDコマンド（ASSIGN DATAコマンドなど）を用いて次のようにテストします。

（例）

行番号3000〜3200のSQL文の擬似実行で，NAME-AREAにデータを代入し，行番号3300のIF文のTHENの処理とELSEの処理をテストする。

（原始プログラム）

001000 WORKING-STORAGE SECTION.
001100 EXEC SQL BEGIN DECLARE SECTION END-EXEC.
001200 01 NAME-AREA PIC N(20).
001300 EXEC SQL END DECLARE SECTION END-EXEC.
           :
002000 PROCEDURE DIVISION.
           :
003000     EXEC SQL
003100       SELECT NAME INTO :NAME-AREA FROM SHAIN
                               WHERE AGE = 30
003200     END-EXEC.
003300     IF NAME-AREA = N'山田　太郎'
003400       THEN
               :
004000       ELSE
               :
005000     END-IF.

（入力するTDコマンド）

SET BREAK STATEMENT(3000) COUNTER(CNT) DO
  IF CONDITION(CNT=1)
    ASSIGN DATA(NAME-AREA) VALUE(N'山田  太郎')
  ELSE
    ASSIGN DATA(NAME-AREA) VALUE(N'日立  花子')
  ENDIF
  GO
ENDDO

行番号3000の行に制御が渡るごとに実行を中断します。

最初の中断のときは"山田　太郎"を，2回目以降の中断のときは"日立　花子"をNAME-AREAに設定します。

NAME-AREAに値を設定後，実行を再開始します。

第9編　多様なCOBOLプログラムの作成

25　OLE2オートメーション機能

OLE2（Object Linking and Embedding 2）オートメーション機能を使うと，ほかのアプリケーションプログラムのOLEオブジェクトをCOBOLプログラムから操作できます。

この章では，OLE2オートメーション機能の概要と，この機能を使うためにCOBOL2002がサポートしているOLE2オートメーションクライアント機能について説明します。

25.1　OLE2オートメーション機能の概要

OLE2（Object Linking and Embedding 2）は，データ，およびアプリケーションプログラムでのデータ操作をOLEオブジェクトとして管理する技術です。

OLE2オートメーション機能は，複数の機能から構成されているOLE2の一つの機能です。あるアプリケーションプログラム内のOLEオブジェクトを外部のアプリケーションプログラムに公開したり，公開されているOLEオブジェクトを外部のアプリケーションプログラムから操作したりするための手段です。

例えば，Excelのシートを外部のVisual Basicに公開したり，公開しているExcelのシートをVisual Basicから操作したりするための手段のことです。前者をOLE2オートメーションサーバ機能，後者をOLE2オートメーションクライアント機能と呼びます。

COBOL2002では，OLE2オートメーションインタフェースと各種のサービスルーチンの2種類の方法によって，OLE2オートメーションクライアント機能をサポートしています。OLE2オートメーションクライアント機能については，「25.2　OLE2オートメーションクライアント機能」を参照してください。

また，日立COBOL85からの古い仕様である，サービスルーチンを使ったOLE2オートメーションクライアント機能を使用したい場合は，「付録D.2　サービスルーチンを使ったOLE2オートメーションクライアント機能」を参照してください。

なお，OLEオブジェクトを公開するアプリケーションプログラムをOLE2オートメーションサーバアプリケーションといいます。このマニュアルではこのアプリケーションを単にOLE2サーバと略称します。同様に，OLE2サーバが公開しているOLEオブジェクトを操作するためのアプリケーションプログラムを，OLE2クライアントと略称します。

25.2　OLE2オートメーションクライアント機能

COBOL2002のOLE2オートメーションクライアント機能は，外部のアプリケーション（OLE2サーバ）が公開しているOLEオブジェクトを，COBOLのプログラムから操作する機能です。

OLE2オートメーションクライアント機能を使用するには，OLE2サーバで使用できるOLEオブジェクトの機能をあらかじめ知っておく必要があります。

OLE2オートメーションクライアント機能を使用するときの基本的な操作手順を次に示します。

操作するOLEオブジェクトを決めて，そのOLEオブジェクトを生成するか，または生成されているOLEオブジェクトを取得する。または，生成済みのOLEオブジェクトを直接参照する。

OLEメソッドとOLEプロパティを使ってOLEオブジェクトを操作する。

操作が終了したら，OLEオブジェクトを解放する。

この節では，Excelを対象としたオブジェクトの操作を例に挙げながら，OLE2オートメーションクライアント機能の使用方法を説明します。

なお，OLE2オートメーションクライアント機能の文法規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「18.　OLE2オートメーションインタフェース機能」を参照してください。

25.2.1　OLEオブジェクトの生成と取得

OLE2サーバのOLEオブジェクトを操作するには，そのOLEオブジェクトを生成するか，またはすでに生成されているOLEオブジェクトを取得します。

(1)　CREATEOBJメソッド

INVOKE文でCREATEOBJメソッドを使用すると，OLEオブジェクトを生成できます。

ExcelのApplicationオブジェクト※を操作するためにOLEオブジェクトを生成する例を次に示します。

OLEオブジェクトの生成例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
                  RETURNING AP-OBJ.

注※

Excelでは，OLE2オートメーション機能で操作できるOLEオブジェクトの一つとしてApplicationオブジェクトがあります。このOLEオブジェクトのクラス名は，Excel.Applicationとしてシステム登録ファイルに登録されています。

(2)　GETOBJメソッド

INVOKE文でGETOBJメソッドを使用すると，すでに生成されているOLEオブジェクトを取得できます。

すでに生成されているExcelのApplicationオブジェクトを取得して操作する例を次に示します。

OLEオブジェクトの取得例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'GETOBJ'
                  RETURNING AP-OBJ.

また，INVOKE文でGETOBJメソッドを使用すると，作成済みのファイルからOLEオブジェクトのインスタンスを生成できます。

ハードディスク上にある"SAMPLE1.XLS"という作成済みのファイルを指定して，ExcelのSheetオブジェクト※を生成する例を次に示します。

インスタンスの生成例

       WORKING-STORAGE SECTION.
       01 SH-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Sheet' 'GETOBJ'
             USING VALUE 'C:¥SAMPLE1.XLS'
             RETURNING SH-OBJ.

注※

Sheetオブジェクトのクラス名は，Excel.Sheetとしてシステム登録ファイルに登録されています。

25.2.2　OLEメソッドとOLEプロパティの操作

OLEメソッドやOLEプロパティを操作する場合は，生成または取得したOLEオブジェクトからのコンテナやコレクションを含んで定義する必要があります。このときコンテナやコレクションの参照に誤りがあると，実行時にエラーとなります。

コンテナおよびコレクションの概念については，マニュアル「COBOL2002　言語　拡張仕様編」　「18.1.1(5)　コレクション」および「COBOL2002　言語　拡張仕様編」　「18.1.1(6)　コンテナ」を参照してください。

Openメソッド，Visibleプロパティ，Valueプロパティ，PrintOutメソッドを使った操作の例を次に示します。

OLEメソッドとOLEプロパティの操作例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
              RETURNING AP-OBJ.
           INVOKE AP-OBJ 'Workbooks.Open'
              USING VALUE 'C:¥SAMPLE1.XLS'. …1.
           SET 'Visible' WITH AP-OBJ TO 1. …2.
           SET 'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ TO 'ABCD'. …3.
           SET 'Workbooks(1).Worksheets(1).Cells(1,2).Value'
                  WITH AP-OBJ TO 'ABCD'.
           SET 'Workbooks(1).Worksheets(1).Cells(1,3).Value'
                  WITH AP-OBJ TO 'ABCD'.
           SET 'Workbooks(1).Worksheets(1).Cells(1,4).Value'
                  WITH AP-OBJ TO 'ABCD'.
           SET 'Workbooks(1).Worksheets(1).Cells(1,5).Value'
                  WITH AP-OBJ TO 'ABCD'.
           INVOKE AP-OBJ
               'Workbooks(1).Worksheets(1). PrintOut'. …4.

例の説明

作成済みのファイルをオープンします。

シートを表示します。

セルに値を設定します。

シートを印刷します。

25.2.3　OLEメソッドが返すOLEオブジェクトを利用した参照

OLEメソッドやOLEプロパティの参照には，コンテナやコレクションをすべて指定して参照する方法と，OLEメソッドが返すOLEオブジェクトを起点として参照する方法があります。

(1)　コンテナやコレクションをすべて指定して参照する

セルのValueプロパティを使って値を設定するときに，生成したApplicationオブジェクトからのコンテナやコレクションをすべて指定して参照する例を次に示します。

参照例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           :
           INVOKE 'Excel.Application' 'CREATEOBJ'
                  RETURNING AP-OBJ.
           :
           SET 'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ TO 'ABCD'.
           SET 'Workbooks(1).Worksheets(1).Cells(1,2).Value'
                  WITH AP-OBJ TO 'ABCD'.
           SET 'Workbooks(1).Worksheets(1).Cells(1,3).Value'
                  WITH AP-OBJ TO 'ABCD'.

例の説明

Workbooks(1).Worksheets(1).Cells(1,n)（n=1,2,3）がコンテナやコレクションの参照です。

(2)　OLEメソッドが返すOLEオブジェクトを起点として参照する

OLEオブジェクトの起点を変えてコンテナやコレクションを参照する例を次に示します。

参照例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       01 CEL-OBJ USAGE OBJECT REFERENCE OLE. …1.
       01 CEL-IDX PIC 9 VALUE ZERO.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
                  RETURNING AP-OBJ.
           :
           PERFORM SET-CELL 3 TIMES.
           :
       SET-CELL SECTION.
           COMPUTE CEL-IDX = CEL-IDX + 1.
           INVOKE AP-OBJ 'Workbooks(1).Worksheets(1).Cells'
                  USING VALUE 1 CEL-IDX
                  RETURNING CEL-OBJ. …1.
           SET 'Value' WITH CEL-OBJ TO 'ABCD'. …2.

例の説明

Cellsメソッドが返すオブジェクトを起点とします。

Cellsオブジェクトを起点として参照し，値を設定します。

25.2.4　OLEアプリケーションの終了とOLEオブジェクトの解放

OLE2オートメーションインタフェース機能では，OLE2サーバで使用できる終了メソッドを使って，アプリケーションを終了します。不要となったOLEオブジェクトはSET文で解放します。

Excelで，終了メソッドであるQuitメソッドを使う例を次に示します。

OLEオブジェクトの終了とOLEオブジェクトの解放例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
               RETURNING AP-OBJ.
           :
           INVOKE AP-OBJ 'Quit'. …1.
           SET AP-OBJ TO NULL.   …2.

例の説明

アプリケーションプログラムを終了します。

OLEオブジェクトを解放します。

注意事項

OLEオブジェクト解放時の注意事項を次に示します。

いったん解放したOLEオブジェクトを再度参照してはいけません。解放したOLEオブジェクトのOLEメソッドやOLEプロパティを参照すると，実行時にエラーとなります。

終了メソッドは，OLE2サーバによって異なります。また，終了メソッドによっては，OLEオブジェクトの解放も行うものがあり，この場合はSET文によるOLEオブジェクトの解放は不要です。

詳細は，各OLE2サーバのマニュアルを参照してください。

25.2.5　VARIANT値とCOBOLデータのやり取り

(1)　暗黙的な変換

Excelのシートのセルに数値が設定されているときに，このセルから値を取得し，SET文を使ってCOBOLの数値項目で値を受け取る例を次に示します。このとき，VARIANT値からCOBOLのデータに暗黙的なデータ変換が行われます。

VARIANT値の概念については，マニュアル「COBOL2002　言語　拡張仕様編」　「18.1.1　言語の概念（OLE2オートメーションインタフェース機能）」を参照してください。

暗黙的な変換の例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       01 CDATA-NUM PIC 9(9). …1.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
               RETURNING AP-OBJ.
           :
           SET CDATA-NUM TO
               'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ. …2.

例の説明

外部10進項目で項目を定義します。

VARIANT値を受け取ります。

(2)　変換しない場合

VARIANT値をCOBOLデータに変換する必要がない場合は，値をバリアントデータ項目で受け取ることで，受け渡したVARIANT値のポインタを保持できます。

バリアント項目で取得した値を，別のセルにそのまま設定する例を次に示します。

変換しない例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       01 CDATA-VAR USAGE VARIANT VALUE ZERO. …1.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
               RETURNING AP-OBJ.
           :
           SET CDATA-VAR TO
               'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ. …2.
           SET 'Workbooks(1).Worksheets(1).Cells(1,2).Value'
                  WITH AP-OBJ TO CDATA-VAR. …3.

例の説明

バリアントデータで項目を定義します。

値を取得します。

取得した値をそのまま別のセルに設定します。

(3)　VARIANT値の解放

不要となったVARIANT値は，バリアントデータ項目を初期化することで，解放できます。

不要となったVARIANT値を解放する例を次に示します。

VARIANT値の解放例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       01 CDATA-VAR USAGE VARIANT VALUE ZERO. …1.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
               RETURNING AP-OBJ.
           :
           SET CDATA-VAR TO
               'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ. …2.
           SET 'Workbooks(1).Worksheets(1).Cells(1,2).Value'
                  WITH AP-OBJ TO CDATA-VAR. …3.
           SET CDATA-VAR TO NULL. …4.

例の説明

バリアントデータで項目を定義します。

値を設定します。

取得した値をそのまま別のセルに設定します。

バリアントデータ項目を解放します。

(4)　明示的な変換

取得したVARIANT値がどの型かがわからない場合は，いったんVARIANT値の型をチェックしたあとで，その型に合ったCOBOLのデータ項目に設定します。VARIANT値の型は，TYPE-OF-VARIANT関数で取得できます。TYPE-OF-VARIANT関数については，マニュアル「COBOL2002　言語　拡張仕様編」　「18.5.3　TYPE-OF-VARIANT関数（OLE2オートメーションインタフェース機能）」を参照ください。

VARIANT値の型をチェックしたあとで，該当するCOBOLのデータ項目に値を設定する例を次に示します。

明示的な変換の例

       WORKING-STORAGE SECTION.
       01 AP-OBJ USAGE OBJECT REFERENCE OLE.
       01 CDATA-VAR USAGE VARIANT VALUE ZERO. …1.
       01 CDATA-COMP PIC S9(10) USAGE COMP.
       01 CDATA-COMP2 USAGE COMP-2.
       01 CDATA-ALP.
         02 FILLER OCCURS 255 DEPENDING ON C-LNG PIC X.
       01 C-LNG PIC 9(4) USAGE COMP VALUE ZERO.
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
               RETURNING AP-OBJ.
           :
           SET CDATA-VAR TO
               'Workbooks(1).Worksheets(1).Cells(1,1).Value'
                  WITH AP-OBJ. …2.
           EVALUATE FUNCTION TYPE-OF-VARIANT(CDATA-VAR) …3.
             WHEN 2
             WHEN 3 …4.
               COMPUTE CDATA-COMP =
                       FUNCTION VARIANT-TO-INTEGER(CDATA-VAR)
             WHEN 4
             WHEN 5 …4.
               COMPUTE CDATA-COMP2 =
                       FUNCTION VARIANT-TO-NUMERIC(CDATA-VAR)
             WHEN 6
             WHEN 7
             WHEN 8
             WHEN 9
               COMPUTE C-LNG =
                 FUNCTION LENGTH-OF-VARIANT(CDATA-VAR) …5.
               MOVE
                 FUNCTION VARIANT-TO-ALPHANUMERIC(CDATA-VAR)
                 TO CDATA-ALP …4.
           END-EVALUATE.

例の説明

バリアントデータで項目を定義します。

VARIANT値を取得します。

取得したVARIANT値の型をチェックします。

該当するCOBOLデータに振り分けて設定します。

文字型へデータが設定された場合は，長さをチェックします。

(5)　バリアントデータ項目の設定

SET文を使って，CONVERT-TO-VARIANT関数で作成したVARIANT

値のポインタを，バリアントデータ項目に保持したり，別のバリアントデータ項目に転記できます。

バリアントデータ項目に値を設定する例を次に示します。

バリアントデータ項目の設定例

       WORKING-STORAGE SECTION.
       01 CBL-DATA-DATE PIC X(8) VALUE '03/01/01'.
       01 CDATA-VAR1 USAGE VARIANT VALUE ZERO. …1.
       01 CDATA-VAR2 USAGE VARIANT VALUE ZERO. …1.'
       PROCEDURE DIVISION.
           INVOKE 'Excel.Application' 'CREATEOBJ'
                  RETURNING AP-OBJ.
                :
           SET CDATA-VAR1
                  TO FUNCTION
                  CONVERT-TO-VARIANT(7,CBL-DATA-DATE). …2.
           SET CDATA-VAR2 TO CDATA-VAR1. …3.

例の説明

バリアントデータで項目を定義します。（1.’も同様です）。

CONVERT-TO-VARIANT関数で取得したVARIANT値のポインタを，1.（CDATA-VAR1）のバリアントデータ項目に設定します。

CONVERT-TO-VARIANT関数で取得した値を転記する場合，関数で一時的に作成したVARIANT値の設定領域は，転記が終了したあとに解放されます。

VARIANT値をコピーした領域（CDATA-VAR1）へのポインタを，1.’（CDATA-VAR2）のバリアントデータ項目に転記します。

なお，このとき受け取り側作用対象のバリアントデータ項目にVARIANT値がすでにある場合，該当するVARIANT領域は解放されます。

また，このとき送り出し側作用対象のバリアントデータ項目のポインタがNULLの場合，受け取り側作用対象のバリアントデータ項目にもNULLが転記されます。

(6)　バリアントデータ項目にEXTERNAL句を指定する場合

バリアントデータ項目にEXTERNAL句を指定する場合については，「4.2.2　外部属性（EXTERNAL句）」の「(2)　EXTERNAL領域にVARIANTデータ項目を含む場合の注意事項」を参照してください。

25.2.6　注意事項

OLE2オートメーションクライアント機能全般に関する注意事項について説明します。

多くのOLEオブジェクトを連続して生成すると，リソース不足になることがあります。

26　マルチスレッド環境での実行

マルチスレッド環境に対応するCOBOLプログラムは，複数スレッドで同時に実行できます。この章では，マルチスレッド環境に対応したCOBOLプログラムの作成方法や，固有の機能について説明します。

26.1　マルチスレッド対応COBOLプログラムの概要

マルチスレッド対応COBOLプログラムとは，マルチスレッド環境下で，複数スレッドで同時に実行できるCOBOLプログラムのことです。

ただし，マルチスレッド対応COBOLプログラム機能は，マルチスレッド環境自体を作成するものではありません。

マルチスレッド対応COBOLプログラムには，制限や注意点があります。

26.1.1　スレッドの制御

スレッドの起動やスレッド間の同期制御など，スレッド制御に関する操作は，COBOLプログラムで実行できません。

26.1.2　実行単位

マルチスレッド対応COBOLプログラムの実行単位は，スレッドになります。各スレッドはそれぞれにCOBOL実行環境を持ち，独立して動作しています。

26.1.3　データの共用

COBOLデータ項目の領域は，スレッドごとに割り当てられます。

COBOLデータは，同じスレッド内に限り共用できます。したがって，ほかのスレッドのCOBOLデータは共用できません。また，同じスレッド内であっても，Cプログラムのデータは共用できません。

26.1.4　プログラムのコーディング

マルチスレッド対応COBOLプログラムは，通常のCOBOLプログラムを作成するときと同じようにコーディングできます。特殊な命令文は使用しません。

26.2　マルチスレッド対応COBOLプログラムの生成

26.2.1　マルチスレッド対応COBOLプログラムのコンパイル

COBOLプログラムをマルチスレッド対応COBOLプログラムにするためには，-MultiThreadオプションを指定してプログラムをコンパイルします。

今まで通常のシングルスレッド対応COBOLプログラムとして利用してきたプログラムも，-MultiThreadオプションを指定して再コンパイルすれば，そのままマルチスレッド環境で実行できるようになります。ただし，マルチスレッド対応COBOLプログラムで対応していない機能を使用しているプログラムは除きます。詳細は，「26.3　マルチスレッド対応COBOLプログラムが対応している機能」を参照してください。

注意事項

マルチスレッド対応COBOLプログラムで対応していない機能を使用したプログラムを，-MultiThreadオプションを指定してコンパイルしても，実行時の動作は保証しません。

-MultiThreadオプションを使ってコンパイルする場合，プロセス内で動作するすべてのCOBOLプログラムを，-MultiThreadオプションを使ってコンパイルする必要があります。プロセス内に，-MultiThreadオプション指定有りでコンパイルしたプログラムと，オプション指定無しでコンパイルしたプログラムが混在していると，実行時の動作は保証しません。

26.3　マルチスレッド対応COBOLプログラムが対応している機能

マルチスレッド対応COBOLプログラムが対応している機能を，次に示します。対応していない機能をマルチスレッド対応COBOLプログラムに適用しないよう注意してください。

表26‒1　マルチスレッド対応COBOLプログラムが対応する機能一覧

種類

機能名

マルチスレッドへの対応

備考

規格

基本機能

○

順編成ファイル

○※1

相対編成ファイル

○※1

索引編成ファイル

○※1

整列併合

△※1

USING／GIVING指定に対して，マルチスレッドで使用できないファイル編成は指定できない。

プログラム間連絡

○

組み込み関数

○

オブジェクト指向

○

共通例外処理

○※1

再帰呼び出し

○

利用者定義関数

○

局所場所節（LOCAL-STORAGE SECTION）

○

X/Open

テキスト編成ファイル

×※1

ファイル共用（ファイルシェア）

索引編成ファイル以外

○※1

索引編成ファイル

○※1

コマンド行および環境変数へのアクセス

△

環境変数アクセスだけで使用できる。

画面節（SCREEN SECTION）による画面操作

×※2

C言語インタフェース

△

データの共用はできない。

拡張機能

日本語

○

ブール（ビット操作）

○

アドレス操作

○

1バイト2進機能・COMP-X項目

○

浮動小数点項目

○

報告書作成機能

×※1

HiRDBによる索引編成ファイル

×※1

Btrieve（Pervasive.SQL）による索引編成ファイル※3

×※1

CSV編成ファイル

×※1

ラージファイル入出力

△※1

使用するファイル編成がマルチスレッドに対応していれば使用できる。

プリンタへのアクセス（入出力による書式印刷機能）※3

×※1

プリンタへのアクセス（GDIモード印刷）

×※1

プリンタへのアクセス（ESC/Pモード印刷）

×※1

ファイルのディスク書き込み保証

○

イベントログファイル出力機能

×

通信節による画面操作

×※1

画面節（WINDOW SECTION）による画面操作

×※2

データコミュニケーション機能

×※1

データベース操作機能

△※1

連携しているドライバおよびデータベースが，マルチスレッドに対応している必要がある。

XDMによるデータベースシミュレーション機能

○

OLE2オートメーションインタフェース機能

×※1

基本機能サービスルーチン

△

実行できないサービスルーチンがある。詳細は「26.9.2　呼び出してはいけないサービスルーチン」を参照のこと。

COBOL入出力サービスルーチン

×

MSMQアクセス機能

×

バイトストリーム入出力サービスルーチン

×

Unicode機能

○

数字項目のけた拡張機能※4

○

動的長基本項目機能

○

定数長拡張機能

○

Javaプログラム呼び出し機能

○

デバッグ

実行時デバッグ機能

○

テストデバッグ機能

○

カバレージ機能

○

（凡例）

○：使用できる

△：制限付きで使用できる

×：使用できない

注※1

コンパイル時，この機能を使用する文に対してWレベル（警告エラー）のメッセージが出力されます。

注※2

コンパイル時，この機能を使用する文に対してSレベル（重大エラー）のメッセージが出力され，コンパイルは中止します。

注※3

Windows(x86) COBOL2002で有効です。

注※4

Windows(x64) COBOL2002で有効です。

26.4　マルチスレッド対応COBOLプログラムの開始と終了

マルチスレッドプログラムの実行を開始する方法には，次の三つがあります。

COBOL以外のプログラムからの呼び出しによる方法

マルチスレッド対応COBOLプログラムをスレッド開始関数として指定する方法

マルチスレッド対応COBOLプログラムをアプリケーションの主プログラムにする方法

それぞれの開始方法と終了方法について説明します。

26.4.1　COBOL以外のプログラムからの呼び出しによる方法

COBOLプログラム以外のプログラムを入り口としてスレッドを開始して，そのプログラムから間接的にマルチスレッド対応COBOLプログラムを呼び出せます。

この方法では，スレッド内で最初に呼ばれるCOBOLプログラムが，COBOL主プログラムの場合と，COBOL副プログラムの場合とで，プログラム終了時の動作が異なります。COBOL主プログラムと副プログラムについては，「18.3　COBOL主プログラムと副プログラム」を参照してください。

(1)　COBOL主プログラムの場合

-MainNotCBLオプションを指定しないでコンパイルしたプログラムがスレッド内で最初に実行された場合，COBOL主プログラムになります。

COBOL主プログラムを終了させるには，STOP RUN文を実行します。これによって，COBOL実行環境が終了し，スレッドが終了されます。このとき，RETURN-CODE特殊レジスタの値がスレッドの終了コードになります。

(2)　COBOL副プログラムの場合

-MainNotCBLオプションを指定してコンパイルしたプログラムは，スレッド内で最初に実行した場合でも，常にCOBOL副プログラムとなります。

COBOL副プログラムは，呼び出し元のプログラムに復帰できます。このとき，COBOL実行環境は保持されます。そのため，呼び出し元のプログラムは，スレッドが終了する前にCOBOL実行環境を終了させる必要があります。COBOL実行環境を終了させるには，CBLENDサービスルーチンを呼び出します。

図26‒1　COBOL以外のプログラムからの呼び出しの例

なお，この方法でマルチスレッド対応COBOLプログラムを呼び出した場合，呼び出し元のプログラムで例外ハンドラを登録して，例外処理できます。このとき，例外ハンドラブロックでCBLDBGINFサービスルーチンを呼び出せば，COBOLの異常終了時要約情報リストを出力できます。CBLDBGINFサービスルーチンの詳細は，「30.6.1　CBLDBGINF」を参照してください。

26.4.2　マルチスレッド対応COBOLプログラムをスレッド開始関数として指定する方法

マルチスレッド対応COBOLプログラムを入り口としてスレッドを開始した場合，このプログラムが終了したときにCOBOL実行環境を終了し，スレッドが終了します。このとき，RETURN-CODE特殊レジスタに指定した値が，スレッドの終了コードになります。

この方法では，プログラム実行中にハードウェア例外が発生しても，プログラムでの例外処理はできません。ハードウェア例外が発生したときには，システムの例外処理が実行されます。なお，共通例外処理で検出できる例外については，シングルスレッドのCOBOLプログラムと同じように，アプリケーションプログラムでの例外処理ができます。

注意事項

この方法を用いる場合は，プログラムをコンパイルする時に-MainNotCBLオプションを指定しないでください。

図26‒2　COBOLプログラムがスレッド開始関数となる例

26.4.3　マルチスレッド対応COBOLプログラムをアプリケーションの主プログラムにする方法

マルチスレッド対応COBOLプログラムに対して，-Main,Systemまたは-Main,V3オプションを指定してコンパイルしたCOBOLプログラムは，アプリケーションの主プログラムになります。この場合，COBOLプログラムがプライマリスレッドになります。

マルチスレッド対応COBOLプログラムがアプリケーションの主プログラムである場合，マルチスレッド対応COBOLプログラムが終了したときに，その中のすべてのスレッドが終了していれば，プロセスが終了します。プログラムの実行が終了するためには，プログラムの実行によって発生したすべてのスレッドが終了する必要があります。

なお，コンパイル時に例外を検知するオプション（-DebugInfオプションなど）を指定した場合，プライマリスレッド内で発生した例外を取得できます。

26.4.4　戻り文に対する動作

それぞれのマルチスレッド対応COBOLプログラムの実行方法について，戻り文に対する動作の違いを，次に示します。

COBOLプログラムの種類

STOP RUN文

GOBACK文

EXIT PROGRAM文

COBOL主プログラム

STOP RUN文を実行したスレッドが終了する。

GOBACK文を実行したスレッドが終了する。

何も動作しない。

COBOL副プログラム

STOP RUN文を実行したスレッドが終了する。

呼び出し元に制御が戻る。

呼び出し元に制御が戻る。

26.5　実行時エラーが発生したときの動作

実行時エラーが検知された場合は，実行時エラーメッセージが出力されたあと，プログラムの動作していたスレッドが終了されます。実行時メッセージの形式は次のようになります。

形式

KCCCnnnnR-x(i) メッセージテキスト

nnnn

メッセージ番号

x

メッセージレベル

i

スレッド識別子の値

メッセージ番号，メッセージレベルなど，実行時メッセージの形式については，マニュアル「COBOL2002　メッセージ」を参照してください。

注意事項

COBOL実行時メッセージなどのCOBOL2002が出力する情報は，スレッド識別子が付けられます。これによって対応するスレッドを識別できます。スレッド識別子には，GetCurrentThreadId関数が返すスレッドIDを用います。

マルチスレッド対応COBOLプログラム実行時の初期処理，または終了処理中にエラーが発生した場合，KCCC03nnR-Sなどのメッセージ番号が03nnで示される300番台の実行時メッセージが，英語で出力されます。なお，この場合，異常終了時要約情報リストは出力されません。

26.6　マルチスレッド対応COBOLプログラムをGUIモードで使用する方法

マルチスレッド対応COBOLプログラムをGUIモードで使用するときの設定について説明します。

GUIモードで使用するときの設定は，COBOLプログラムがアプリケーションの主プログラムかどうかによって異なります。

26.6.1　COBOLプログラムが主プログラムの場合

COBOLプログラムが主プログラムの場合は，主プログラムのコンパイル時に-Lib,GUIオプションを指定すれば，GUIモードを設定できます。この場合，スレッド上で動作しているCOBOLプログラムのすべてが，GUIモードで動作します。

26.6.2　COBOLプログラムが主プログラムでない場合

COBOLプログラムが主プログラムでない場合は，CBLGINTサービスルーチンを呼び出せば，GUIモードを設定できます。

CBLGINTサービスルーチンは，一つのスレッドで呼び出すと，すべてのスレッドがGUIモードで動作します。ただし，CBLGINTサービスルーチンを実行する前にCOBOLプログラムが実行されているスレッドは，GUIモードになりません。確実にすべてのスレッドをGUIモードにしたいときは，ほかのスレッドを起動する前に，プライマリスレッドでCBLGINTサービスルーチンを呼び出してください。

CBLGINTサービスルーチンの詳細は，「30.4.1　CBLGINT」を参照してください。

26.6.3　注意事項

GUIモードで表示されるCOBOLコンソール画面は，スレッドごとに表示されます。

マルチスレッド対応COBOLプログラムを実行中に，コンソール画面を閉じて実行を中止すると，そのプログラムが動作していたスレッドが終了されます。ただしこの場合，ファイルを閉じたり，実行時に確保した領域を解放したりするCOBOL実行環境終了処理はされません。

マルチスレッド環境では，GUIモードでCOBOL2002が表示する画面のヘッダ部分に次の形式の識別子が付けられます。

形式

CONSOLE - 実行可能ファイル名(i)

i

スレッド識別子の値

26.7　環境変数の取り扱い

マルチスレッド環境で環境変数を扱う場合，設定値がすべてのスレッドで共用されるので注意してください。

マルチスレッド対応COBOLプログラムでは，環境変数を扱う上での混乱を避けるため，次の二つの機能を持っています。

スレッドごとに固有の出力ファイル名称を付ける機能

スレッドごとに環境変数を設定する機能

26.7.1　スレッドごとに固有の出力ファイル名称を付ける機能

出力ファイル名を指定する実行時環境変数の設定がある場合，この機能が実行されます。この機能は，実行時環境変数によって指定したファイル名へ，自動的にスレッドの識別子を付けます。これによって，スレッドごとに固有のファイルが出力されることになります。

形式

ファイル名_i.拡張子

i

スレッド識別子の値

注意事項

この機能の対象となる実行時環境変数を次に示します。

CBL_SYSOUT

CBL_SYSPUNCH

CBL_SYSERR

CBLABNLST

CBLDDUMP

CBLDATADUMPFILE

CBLPGMSEARCHTRC

ただし，CUIモードのときに，出力ファイル名に標準入力（stdin）,標準出力（stdout），または標準エラー出力（stderr）が指定された場合，この機能の対象になりません。

これらの実行時環境変数の詳細は，「36.2　プログラムの実行環境の設定」を参照してください。

26.7.2　スレッドごとに環境変数を設定する機能

マルチスレッド対応COBOLプログラムでは，環境変数へのアクセス機能を使えば，スレッドごとに環境変数の値を設定・取得できます。環境変数へのアクセス機能の詳細については，「10.4　環境変数へのアクセス」を参照してください。

規則

環境変数の値を設定・変更した場合，その値は実行スレッド内だけで有効となります。

同一の環境変数に対して，スレッドごとに別々の値を設定できます。

設定した環境変数は，COBOL以外のプログラムで使用できません。また，PATHなどのシステム環境変数や，COBOL2002以外が管理する環境変数の値を設定・変更しても有効になりません。

この機能を使って，「26.7.1　スレッドごとに固有の出力ファイル名称を付ける機能」で示した環境変数を設定した場合，この機能が優先され，出力ファイル名にスレッド識別子は付けられません。

マルチスレッド対応COBOLプログラムで環境変数へのアクセスを使用した場合，内部的に環境変数名にスレッド識別子の値を付けた環境変数名で値を登録および取得します。

スレッド識別子が1000で環境変数CBLABNLSTを設定する例を次に示します。

（例）

マルチスレッド対応COBOLプログラムで，CBLABNLST=a.txtを設定したとき，次のように環境変数を登録および取得します。

スレッド識別子を付けた環境変数名を使用して，「CBLABNLST_1000=a.txt」を値に登録します。

マルチスレッド対応COBOLプログラムで，環境変数を取得する場合，次の順序で環境変数名をアクセスし，取得した値を返します。

1.　スレッド識別子を付けた環境変数名（CBLABNLST_1000）

2.　スレッド識別子を付けない環境変数名（CBLABNLST）

このため，環境変数の値をクリアしないでCOBOLプログラムの実行を終了し，あとで同じスレッド識別子のスレッドでCOBOLプログラムが動作した場合，そのスレッドで環境変数を設定していなくても，以前のスレッドで設定した環境変数の値が取得されます。

COBOLプログラムを終了する前にNULL（X'00'）で始まる値を設定することで，スレッド識別子を付けた環境変数に対して値のない環境変数を設定できます※。

注※

　値のない環境変数を設定したあとに環境変数へのアクセス機能で環境変数の値の読み込みを行った場合，COBOLはスレッド識別子を付けない環境変数名（CBLABNLST）にアクセスし，取得した値を返します。

注意事項

マルチスレッド環境下で動作するプログラムでは，環境変数の設定中に，ほかのスレッドで環境変数を設定または取得することは，OSで保証されていません。環境変数の設定中に，同時に別のスレッドで環境変数アクセス関数※の処理が実行された場合，環境変数アクセス関数がエラーリターンしたり，アプリケーションエラーが発生したりすることでプログラムが異常終了することがあります。

DISPLAY文またはC言語プログラムで環境変数を設定する場合，環境変数アクセス関数がスレッド間で同時に実行されないようにしてください。

注※

SetEnvironmentVariable関数，またはGetEnvironmentVariable関数

26.8　マルチスレッド対応COBOLプログラムのデバッグ

26.8.1　マルチスレッド対応COBOLプログラムのデバッグ

(1)　テストデバッガを使用したデバッグ

COBOLプログラムが実行されたすべてのスレッドに対して，テスト，およびデバッグができます。詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

(2)　カバレージ機能

COBOLプログラムが実行されたすべてのスレッドに対して，カバレージ情報の採取，およびカウント情報の表示ができます。詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

26.9　マルチスレッド対応COBOLプログラムを使用する上での注意事項

26.9.1　EXTERNAL句を用いたデータの共用

EXTERNAL句を指定したCOBOLデータ項目は，同じスレッド内のプログラムでだけ共用できます。異なるスレッドの間では，COBOLデータ項目を共用できません。

また，COBOLプログラムとCプログラムとの間では，同じスレッド内であってもデータを共用できません。

26.9.2　呼び出してはいけないサービスルーチン

マルチスレッド対応COBOLプログラムから，次のサービスルーチンを呼び出さないでください。呼び出した場合，動作は保証しません。

CBLADTRMサービスルーチン

CBLBELLサービスルーチン

CBLCURサービスルーチン

CBLCNSLサービスルーチン

CBLDLTRMサービスルーチン

CBLGETサービスルーチン

CBLPUTサービスルーチン

CBLSETTITLEサービスルーチン

CBLSGETサービスルーチン

CBLSQLSETOPTサービスルーチン

JCPOPUPサービスルーチン

OLE2サービスルーチン

MSMQアクセスサービスルーチン

OLE2サービスルーチンについては，「付録D.2　サービスルーチンを使ったOLE2オートメーションクライアント機能」を参照してください。MSMQサービスルーチンについては，「27.2　MSMQアクセスサービスルーチン」を参照してください。その他のサービスルーチンについては，「30.　サービスルーチン」を参照してください。

マルチスレッド対応COBOLプログラム，およびマルチスレッド環境下で動作する他言語のプログラムからCOBOL入出力サービスルーチンを呼び出さないでください。呼び出した場合，動作は保証しません。

26.9.3　スレッドを起動する関数

マルチスレッド対応COBOLプログラムでは，STOP RUN文やエラー発生によるスレッドの終了のときに，_endthreadex関数を使用しています。そのため，スレッドの起動には_beginthreadex関数を使用する必要があります。

27　MSMQアクセス機能

MSMQ（Microsoft Message Queuing Server）アクセス機能を使うと，COBOL2002からMSMQを利用できます。

この章では，COBOL2002からMSMQを利用する方法について説明します。

27.1　MSMQの概要

MSMQ（メッセージキュー）を使用すると，プログラム間で通信する際にメッセージを非同期で送受信できます。これをキューイング（非同期通信）といいます。キューイングを使用すると，受信側プログラムに要求した処理の終了を待たないで，送信側プログラムで別の処理を実行できます。

送信側プログラムがMSMQに送信したメッセージは，いったんキューに格納された後，受信側プログラムに配信されます。

図27‒1　キューイングを使用したメッセージの送受信例

27.1.1　キュー

(1)　キューの種類

キューとは，さまざまな種類のメッセージの一時的な格納場所です。MSMQには，次のキューがあります。

パブリックキュー

プライベートキュー

ジャーナルキュー

配信不能メッセージキュー

管理キュー

応答キュー

レポートキュー

システムキュー

COBOL2002のMSMQアクセス機能では，パブリックキュー，およびプライベートキューだけにメッセージを送受信できます。

(2)　キューのパス名

キューを参照する場合，キューのパス名を指定します。キューのパス名は，キューがあるコンピュータの名前とキューの名前を結合したものです。例えば，「User1」というコンピュータ上に「Myqueue」というキューを作成した場合，キューのパス名は「User1¥Myqueue」となります。なお，キューがローカルコンピュータ上にある場合は，「.¥Myqueue」のように記述できます。また，プライベートキューの場合は，「.¥PRIVATE$¥Myqueue」のようにキュー名の前に「¥PRIVATE$」を付けたパス名となります。

注意事項

キューのパス名は，大文字小文字が等価とみなされます。また，キューのパス名は，コンピュータの名前を含めた絶対パスで124文字以下になることを推奨します。

(3)　キューのラベル

キューには，ラベルを付けられます。パブリックキューに付けられたラベルを使用して，パブリックキューのパス名を検索できます。

キューにラベルを付ける場合CBLMQCREATEサービスルーチンの呼び出し時に，データパラメタ領域の「キューのラベル」データ項目，および「キューのラベルのデータ長」データ項目を設定しておきます。

キューに付けられたラベルからキューのバス名を検索する場合，データパラメタ領域の「キューのラベル」データ項目，および「キューのラベルのデータ長」データ項目を設定した後，CBLMQLOCATEサービスルーチンを呼び出します。CBLMQLOCATEサービスルーチンが正常に終了すると，ラベルが付けられたキューのパス名が，データパラメタ領域の「キューのパス名」データ項目に格納されます。

27.1.2　メッセージ

プログラム間の通信はメッセージの送受信によって行われます。また，コンピュータ間の情報およびデータの送受信も，メッセージの送受信によって行われます。メッセージには，テキストデータおよびバイナリデータを含めることができます。

トランザクションメッセージを使用すると，メッセージの送受信とほかの処理を一つにまとめることができます。トランザクションメッセージはトランザクションキューだけに送信できます。なお，COBOL2002のMSMQアクセス機能では，トランザクションメッセージ，およびトランザクションキューは使用できません。

(1)　メッセージのラベル

メッセージには，ラベルを付けられます。付けられたラベルはプログラム中で使用できます。

メッセージにラベルを付ける場合，CBLMQSENDMSGサービスルーチンの呼び出し時に，データパラメタ領域の「メッセージのラベル」データ項目，および「メッセージのラベルのデータ長」データ項目を設定しておきます。

メッセージに付けられたラベルは，CBLMQRECEIVEMSGサービスルーチンを呼び出した後，データパラメタ領域の「メッセージのラベル」データ項目に格納されます。

(2)　メッセージクラス

メッセージの種類をメッセージの機能または性質によって表したものをメッセージクラスといいます。代表的なメッセージクラスを次に示します。

通常メッセージ

受信確認メッセージ

レポートメッセージ

応答メッセージ

COBOL2002で生成できるメッセージは，すべて通常メッセージです。

メッセージクラスは，CBLMQRECEIVEMSGサービスルーチンを呼び出した後，インタフェース領域の「メッセージクラス」データ項目に格納されます。

(3)　メッセージの優先順位

メッセージの優先順位によって，緊急なメッセージなど重要度の高いメッセージを，重要度の低いメッセージよりも先に送信できます。メッセージの優先順位は0〜7の範囲で，0が最も優先順位が低く，7が最も優先順位が高くなります。

メッセージの優先順位を設定する場合，CBLMQSENDMSGサービスルーチンの呼び出し時に，インタフェース領域の「優先順位」データ項目を設定しておきます。

(4)　メッセージの配信方法

MSMQには高速と回復可能という2種類の配信方法があります。

高速メッセージ

回復可能メッセージに比べてリソース消費量が少なく，配信速度も高速ですが，配信中にコンピュータに障害が発生するとメッセージを回復できません。

回復可能メッセージ

高速メッセージに比べてリソース消費量が多く，配信速度も低速ですが，配信中にコンピュータに障害が発生してもメッセージを回復できます。

メッセージの配信方法を設定する場合，CBLMQSENDMSGサービスルーチンの呼び出し時に，インタフェース領域の「配信方法」データ項目を設定しておきます。

(5)　ジャーナリング

メッセージのコピーを格納する処理をジャーナリングといいます。ジャーナリングされたメッセージは，ジャーナルキューに格納されます。

送信メッセージにジャーナリングを設定し，かつメッセージの送信が成功した場合，送信メッセージのコピーが送信側コンピュータのジャーナルキューに格納されます。

ジャーナリングする場合，CBLMQSENDMSGサービスルーチンの呼び出し時に，インタフェース領域の「ジャーナリング」データ項目を設定しておきます。

注意事項

メッセージングのパフォーマンスを向上させるために，すべてのジャーナルキューに格納されているメッセージをMSMQエクスプローラなどの管理ツールを使って頻繁に削除する必要があります。

(6)　配信不能メッセージ

配信に失敗した，または配信できなくなったメッセージを配信不能メッセージといいます。配信不能メッセージは，配信不能メッセージキューに格納できます。ただし，送信元がメッセージを送信先のキューに送ることを許可されていない場合，配信不能メッセージは配信不能メッセージキューには格納されません。

配信不能メッセージを配信不能メッセージキューに格納する場合，CBLMQSENDMSGサービスルーチンの呼び出し時に，インタフェース領域の「配信不能メッセージ」データ項目を設定しておきます。

注意事項

メッセージングのパフォーマンスを向上させるために，すべての配信不能メッセージキューに格納されているメッセージをMSMQエクスプローラなどの管理ツールを使って頻繁に削除する必要があります。

27.2　MSMQアクセスサービスルーチン

COBOL2002でMSMQを使ったキューイングを処理するプログラムを作成するには，MSMQアクセスサービスルーチンを使用します。

MSMQアクセスサービスルーチンの一覧を次に示します。

表27‒1　MSMQアクセスサービスルーチンの一覧

サービスルーチン名

機能

CBLMQCREATE

キューを作成する

CBLMQDELETE

キューを削除する

CBLMQOPEN

キューをオープンする

CBLMQCLOSE

キューをクローズする

CBLMQSENDMSG

メッセージを送信する

CBLMQRECEIVEMSG

メッセージを受信する

CBLMQLOCATE

キューのパス名を検索する

MSMQアクセスサービスルーチンを呼び出すときには，インタフェース領域とデータパラメタ領域を引数に設定します。インタフェース領域は，COBOLプログラムとMSMQシステムとの間で情報をやり取りするための領域です。また，データパラメタ領域は，キューに対して送受信するデータやそのデータ長を格納するための領域です。

MSMQアクセスサービスルーチンは，キューのパス名，キューのラベル，メッセージのラベル，およびデータ変換フラグに有効を指定して送受信するメッセージデータの文字列を，内部的にワイド文字列（Unicode）にデータ変換，またはワイド文字列（Unicode）からデータ変換して使用します。

なお，各サービスルーチンの戻り値は，ほかのサービスルーチンと同様にRETURN-CODE特殊レジスタで参照できます。詳細は，「30.2　戻り値の使い方」を参照してください。

MSMQアクセスサービスルーチンを使用するには，「メッセージキュー」が組み込まれている必要があります。

MSMQアクセスサービスルーチンでは，必要な権限が与えられているプライベートキューとパブリックキューに対して，非トランザクションのメッセージの送受信，およびキューの作成と削除が実行できます。

27.2.1　キューを作成する（CBLMQCREATE）

キューを作成するには，CBLMQCREATEサービスルーチンを呼び出します。

形式

CALL 'CBLMQCREATE' USING 引数1 引数2

引数

引数1には，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

インタフェース領域中に設定する項目はありません。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

作成するキューのパス名，およびキューのラベルを指定するデータ項目を，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

キューのパス名のデータ長

02 データ名3 PIC X(256).

キューのパス名

02 データ名4 PIC S9(9) USAGE COMP.

キューのラベルのデータ長

02 データ名5 PIC X(256).

キューのラベル

戻り値

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が-2の場合）

規則

データパラメタ領域のデータ名2には，データ名3で指定したキューのパス名のデータ長を，バイト数で指定します。

データパラメタ領域のデータ名4には，データ名5で指定したキューのラベルのデータ長を，バイト数で指定します。

27.2.2　キューを削除する（CBLMQDELETE）

キューを削除するには，CBLMQDELETEサービスルーチンを呼び出します。

形式

CALL 'CBLMQDELETE' USING 引数1 引数2

引数

引数1には，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

インタフェース領域中に設定する項目はありません。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

削除するキューのパス名を，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

キューのパス名のデータ長

02 データ名3 PIC X(256).

キューのパス名

戻り値

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が-2の場合）

規則

データパラメタ領域のデータ名2には，データ名3で指定したキューのパス名のデータ長を，バイト数で指定します。

27.2.3　キューをオープンする（CBLMQOPEN）

メッセージを送受信するためにキューをオープンするには，CBLMQOPENサービスルーチンを呼び出します。

形式

CALL 'CBLMQOPEN' USING 引数1 引数2

引数

引数1には，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

アクセスモード

メッセージを送信する場合（SENDモード）は2を，メッセージを受信する場合（RECEIVEモード）は1を指定します。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

オープンするキューのパス名を，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

キューのパス名のデータ長

02 データ名3 PIC X(256).

キューのパス名

戻り値

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が-2の場合）

規則

データパラメタ領域のデータ名2には，データ名3で指定したキューのパス名のデータ長を，バイト数で指定します。

27.2.4　キューをクローズする（CBLMQCLOSE）

オープンしているキューをクローズするには，CBLMQCLOSEサービスルーチンを呼び出します。

形式

CALL 'CBLMQCLOSE' USING 引数1 引数2

引数

引数1には，キューをオープンしたときにCBLMQOPENサービスルーチンに指定した「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

インタフェース領域中に設定する項目はありません。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

クローズするキューのパス名を，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

キューのパス名のデータ長

02 データ名3 PIC X(256).

キューのパス名

戻り値

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が-2の場合）

規則

データパラメタ領域のデータ名2には，データ名3で指定したキューのパス名のデータ長を，バイト数で指定します。

27.2.5　メッセージを送信する（CBLMQSENDMSG）

キューへメッセージを送信するには，CBLMQSENDMSGサービスルーチンを呼び出します。

形式

CALL 'CBLMQSENDMSG' USING 引数1 引数2

引数

引数1には，キューをオープンしたときにCBLMQOPENサービスルーチンに指定した「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

優先順位

メッセージの優先順位を0〜7の範囲で指定します。

配信方法

メッセージの配信方法を指定します。

高速メッセージとして配信する場合は0を，回復可能メッセージとして配信する場合は1を指定します。

ジャーナリング

メッセージの送信に成功した場合，ジャーナルキューにメッセージのコピーを格納するかどうかを指定します。

メッセージのコピーを格納する場合は1を，格納しない場合は0を指定します。

配信不能メッセージ

メッセージの送信に失敗した場合，配信不能メッセージキューにメッセージのコピーを格納するかどうかを指定します。

メッセージのコピーを格納する場合は1を，格納しない場合は0を指定します。

データ変換フラグ

メッセージデータをデータ変換して，テキストデータとしてキューへ送信するかどうかを指定します。

テキストデータに変換して送信する場合は1を，そのまま送信する場合は0を指定します。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

送信するメッセージデータ，およびメッセージのラベルを，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

メッセージのラベルのデータ長

02 データ名3 PIC X(512).

メッセージのラベルのパス名

02 データ名4 PIC S9(9) USAGE COMP.

メッセージデータのデータ長

02 データ名5 PIC X(n).

メッセージデータ

（凡例）

n：メッセージデータのデータ長

戻り値

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が-2の場合）

規則

データパラメタ領域のデータ名2には，データ名3で指定したメッセージのラベルのデータ長を，バイト数で指定します。

データパラメタ領域のデータ名5の領域長には，メッセージデータのデータ長を指定します。指定できる最大データ長は，4,096,000バイトです。

データパラメタ領域のデータ名4には，データ名5で指定したメッセージデータのデータ長を，バイト数で指定します。

ただし，インタフェース領域のデータ変換フラグに有効（テキストデータに変換）を指定した場合，CBLMQSENDMSGサービスルーチンはメッセージデータをワイド文字列（Unicode）に変換してキューに送信します。したがって，実際にキューに格納されるメッセージ本文のデータサイズは，データ名4で指定したメッセージデータのデータ長よりも大きくなり，最大で（メッセージデータのデータ長＋1）×2バイトとなります。なお，実際にキューに格納されたメッセージ本文のデータサイズは，MSMQエクスプローラなどで確認できます。

このサービスルーチンを実行する場合，あらかじめCBLMQOPENサービスルーチンを使って，メッセージを送信するキューをSENDモードでオープンしておく必要があります。

27.2.6　メッセージを受信する（CBLMQRECEIVEMSG）

キューからメッセージを受信するには，CBLMQRECEIVEMSGサービスルーチンを呼び出します。

形式

CALL 'CBLMQRECEIVEMSG' USING 引数1 引数2

引数

引数1には，キューをオープンしたときにCBLMQOPENサービスルーチンに指定した「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

受信待ち時間

キューにメッセージが配信されるのを待つ時間をmsec単位で指定します。

-1を指定した場合，キューにメッセージが配信されるまで待ち続けます。

データ変換フラグ

キューから受信したメッセージ本文のデータをデータ変換して，テキストデータとして格納するかどうかを指定します。

テキストデータに変換して格納する場合は1を，そのまま格納する場合は0を指定します。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

受信したメッセージデータ，およびメッセージのラベルが，次の形式で格納されます。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

メッセージのラベルのデータ長

02 データ名3 PIC X(512).

メッセージのラベルのパス名

02 データ名4 PIC S9(9) USAGE COMP.

メッセージデータのデータ長

02 データ名5 PIC X(n).

メッセージデータ

（凡例）

n：メッセージデータのデータ長

戻り値

100：受信待ち時間の間にメッセージが配信されなかった。

2：受信メッセージを格納中に警告エラーを検出した。

1：メッセージを格納するデータ領域長が不足していた。

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が2または-2の場合）

メッセージクラス

メッセージクラスが返されます。

通常メッセージを受信した場合は，LOW-VALUEが返されます。

それ以外のメッセージを受信した場合は，メッセージクラスのコードが返されます。詳細は，MSMQのマニュアルを参照してください。

優先順位

メッセージの優先順位が0〜7の範囲で返されます。

配信方法

メッセージの配信方法が返されます。

高速メッセージとして配信された場合は0が，回復不能メッセージとして配信された場合は1が返されます。

ジャーナリング

受信したメッセージのジャーナリングフラグ（ジャーナリングするかどうか）の設定が返されます。

ジャーナリングフラグが設定されていた場合は1が，設定されていなかった場合は0が返されます。

配信不能メッセージ

受信したメッセージの配信不能メッセージフラグ（配信不能キューへ格納するかどうか）の設定が返されます。

配信不能メッセージフラグが設定されていた場合は1が，設定されていなかった場合は0が返されます。

規則

データパラメタ領域のデータ名2には受信したメッセージのラベルのデータ長が，バイト数で返されます。また，データ名3には受信したメッセージのラベルが返されます。

データパラメタ領域のデータ名4には，データ名5のメッセージデータのデータ長を指定します。指定できる最大データ長は，4,096,000バイトです。指定するデータ長には，実際にキューから受信するメッセージ本文のデータサイズ分が必要です。CBLMQSENDMSGサービスルーチンでメッセージを送信するとき，実際にキューに格納されるメッセージ本文のデータサイズについては，「27.2.5　メッセージを送信する（CBLMQSENDMSG）」の規則を参照してください。また，MSMQエクスプローラなどでメッセージ本文のデータサイズを確認することもできます。

データパラメタ領域のデータ名5のデータ長よりキューから受信したメッセージ本文のデータサイズが短かった場合，データ名5に受信したメッセージ本文のデータが，データ名4に受信したメッセージ本文のデータサイズが，それぞれ返されます。ただし，インタフェース領域のデータ変換フラグに有効（テキストデータに変換）を指定した場合，データ名5には受信したメッセージ本文のデータがテキストデータに変換されて格納され，データ名4にはデータ名5に格納されたテキストデータのデータ長が返されます。

データパラメタ領域のデータ名5のデータ長よりキューから受信したメッセージ本文のデータサイズが長かった場合，データ名4に受信したメッセージ本文のデータサイズが返され，サービスルーチンの戻り値が1となります。このとき，データ名2，データ名3，データ名5，およびインタフェース領域には何も返されません。

キューから受信したメッセージのラベル，またはメッセージ本文のデータを格納中にサービスルーチンがデータエラーを検出した場合，サービスルーチンの戻り値が2となります。この場合，キューから受信したメッセージのラベル，またはメッセージ本文のデータは，テキストデータに変換されないで格納されます。

このサービスルーチンを実行する場合，あらかじめCBLMQOPENサービスルーチンを使って，メッセージを受信するキューをRECEIVEモードでオープンしておく必要があります。

27.2.7　キューのパス名を検索する（CBLMQLOCATE）

パブリックキューのラベルからパス名を検索するには，CBLMQLOCATEサービスルーチンを呼び出します。

形式

CALL 'CBLMQLOCATE' USING 引数1 引数2

引数

引数1には，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」の名前を指定します。

引数2には，データパラメタ領域の名前を指定します。

インタフェース領域に設定する項目

検索強制終了フラグ

すべてのパス名の検索が終了する前に検索を終了したい場合，この項目に1を指定して再度CBLMQLOCATEサービスルーチンを呼び出します。

それ以外の場合は0を指定します。

インタフェース領域の形式については，「表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域」を参照してください。

データパラメタ領域に設定する項目

検索するキューのラベル名，および検索結果のキューのパス名を格納するデータ項目を，次の形式で指定します。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するデータパラメタ領域の名前

02 データ名2 PIC S9(9) USAGE COMP.

キューのパス名のデータ長

02 データ名3 PIC X(256).

キューのパス名

02 データ名4 PIC S9(9) USAGE COMP.

キューのラベルのデータ長

02 データ名5 PIC X(256).

キューのラベル

戻り値

100：すべてのパス名の検索が終了した。

2：パス名を格納中にデータエラーを検出した。

1：パス名を検索中である。

0：サービスルーチンは正常に終了した。

-1：MSMQアクセスでエラーを検出した。

-2：MSMQアクセス以外でエラーを検出した。

また，インタフェース領域に次の項目が返されます。

MSMQのエラーコード（戻り値が-1の場合）

表27‒3　詳細コードの内容（戻り値が2または-2の場合）

規則

データパラメタ領域のデータ名4には，データ名5で指定したキューのラベルのデータ長を，バイト数で指定します。

キューのパス名の検索に成功した場合，データパラメタ領域のデータ名2およびデータ名3に，検索したキューのパス名のデータ長，およびパス名が返されます。また，CBLMQLOCATEサービスルーチンは，戻り値として1を返します。

同じラベルを持つキューのパス名を引き続き検索するには，再度CBLMQLOCATEサービスルーチンを呼び出してください。サービスルーチンを呼び出すたびに，順番にキューのパス名が検索され，データパラメタ領域のデータ名2およびデータ名3に上書きで格納されます。

目的のパス名を取得できた場合など，パス名の検索を終了したい場合は，インタフェース領域の検索終了強制フラグに1を指定して，再度CBLMQLOCATEサービスルーチンを呼び出してください。戻り値として0が返され，検索が終了します。この方法で正しく検索を終了させないと，ほかのMSMQサービスルーチンを呼び出したときにエラーとなります。

すべてのパス名の検索が終了すると，戻り値として100が返され，検索が終了します。この場合，検索終了強制フラグを使用して検索を終了させる必要はありません。

パス名の格納中にデータエラーが検出された場合，戻り値として2が返されます。この場合，パス名はデータエラーとなったデータ形式で格納されます。

変換したパス名がデータパラメタ領域のデータ名3よりも長い場合，戻り値として2が返されます。この場合，変換したパス名はデータ名3の領域長分だけ格納されます。

27.3　MSMQアクセスサービスルーチンのインタフェース

インタフェース領域は，COBOLプログラムとMSMQシステムとの間で情報をやり取りするための連絡領域です。インタフェース領域に必要な情報を設定してサービスルーチンを呼び出し，また，処理結果をインタフェース領域から取得します。

MSMQアクセスサービスルーチンで使用するインタフェース領域の形式を次に示します。

表27‒2　MSMQアクセスサービスルーチンで使用するインタフェース領域

記述形式

内容

C

R

E

A

T

E

D

E

L

E

T

E

O

P

E

N

C

L

O

S

E

S

E

N

D

R

E

C

V

L

O

C

A

T

E

01 データ名01.

CALL文のUSINGで指定するインタフェース領域の名前

02 データ名02 PIC X(8).

MSMQのエラーコード※1

△

△

△

△

△

△

△

02 データ名03

PIC S9(9) USAGE COMP.

詳細コード※2

△

△

△

△

△

△

△

02 データ名04 PIC X.

検索強制終了フラグ

（0：無効，1：有効）

○

02 データ名05 PIC X.

アクセスモード

（1：RECEIVE，2：SEND）

○

02 データ名06 PIC X(2).

メッセージクラス

△

02 データ名07

PIC S9(9) USAGE COMP.

受信待ち時間

○

02 データ名08

PIC 9(4) USAGE COMP.

優先順位（0〜7）

○

△

02 データ名09 PIC X.

配信方法

（0：高速，1：回復可能）

○

△

02 データ名10 PIC X.

ジャーナリング

（0：無効，1：有効）

○

△

02 データ名11 PIC X.

配信不能メッセージ

（0：無効，1：有効）

○

△

02 データ名12 PIC X.

データ変換フラグ

（0：無効，1：有効）

○

○

02 データ名13 PIC X(102).

予約領域

×

×

×

×

×

×

×

（凡例）

○：サービスルーチンの呼び出し時，必ず設定する項目

△：サービスルーチンの完了時，リターン情報として設定される項目

×：初期化後に変更してはいけない項目

空欄：該当しない

CREATE：CBLMQCREATEサービスルーチン

DELETE：CBLMQDELETEサービスルーチン

OPEN：CBLMQOPENサービスルーチン

CLOSE：CBLMQCLOSEサービスルーチン

SEND：CBLMQSENDMSGサービスルーチン

RECV：CBLMQRECEIVEMSGサービスルーチン

LOCATE：CBLMQLOCATEサービスルーチン

注※1

サービスルーチンの戻り値が-1の場合に設定されます。エラーコードの内容についてはMSMQのマニュアルを参照してください。

注※2

サービスルーチンの戻り値が2または-2の場合に設定されます。

詳細コードの内容を，次に示します。

表27‒3　詳細コードの内容

戻り値

詳細コード

エラーの要因

該当する

サービスルーチン

対処

2

1

受信メッセージのラベルが不正である。

CBLMQRECEIVEMSG

メッセージのラベルをテキストデータとして正しい値で再送信し，メッセージを再受信する。

(サービスルーチンの動作)

サービスルーチンは，受信したメッセージのラベルをテキストデータに変換しないで格納した。

2

バイナリデータとして送信されたメッセージを受信し，テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージを再送信し，データ変換フラグを無効にして再受信する。

メッセージをテキストデータとして正しい値で再送信し，再受信する。

(サービスルーチンの動作)

サービスルーチンは，受信したメッセージデータをテキストデータに変換しないで格納した。

3

テキストデータとして送信されたメッセージを受信したが，テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージをテキストデータとして正しい値で再送信し，再受信する。

(サービスルーチンの動作)

サービスルーチンは，受信したメッセージデータをテキストデータに変換しないで格納した。

4

受信メッセージのラベルが不正である。かつ，テキストデータとして送信されていないメッセージを受信し，テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージのラベルをテキストデータとして正しい値で再送信し，データ変換フラグを無効にして再受信する。

メッセージのラベル，およびメッセージデータをテキストデータとして正しい値で再送信し，再受信する。

(サービスルーチンの動作)

サービスルーチンは，受信したメッセージのラベル，およびメッセージデータをテキストデータに変換しないで格納した。

5

受信メッセージのラベルが不正である。かつ，テキストデータとして送信されたメッセージを受信したが，テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージのラベル，およびメッセージデータをテキストデータとして正しい値で再送信し，再受信する。

(サービスルーチンの動作)

サービスルーチンは，受信したメッセージのラベル，およびメッセージデータをテキストデータに変換しないで格納した。

6

検索したキューのパス名が不正である。

CBLMQLOCATE

検索したキューのパス名をテキストデータとして正しい値で再作成し，再度キューのパス名を検索する。

(サービスルーチンの動作)

サービスルーチンは，検索したキューのパス名をテキストデータに変換しないで格納した。

7

検索したキューのパス名が長過ぎる。

CBLMQLOCATE

検索したキューのパス名が，絶対パスで256バイト以下になるようにキューを再作成し，再度キューのパス名を検索する。

(サービスルーチンの動作)

サービスルーチンは，検索したキューのパス名の先頭256バイトだけを格納した。

-2

40

キューをオープンしていない。

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

キューをオープンしてからCBLMQCLOSEサービスルーチンを呼び出す。

キューをSENDアクセスモードでオープンしてからCBLMQSENDMSGサービスルーチンを呼び出す。

キューをRECEIVEアクセスモードでオープンしてからCBLMQRECEIVEMSGサービスルーチンを呼び出す。

41

キューをクローズしていない。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQLOCATE

キューをクローズしてからサービスルーチンを呼び出す。

42

キューのパス名の検索が終了していない。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATEサービスルーチンでの検索を終了してから，ほかのMSMQアクセスサービスルーチンを呼び出す。

50

インタフェース領域の必ず設定する項目に，規定の値が設定されていない。

CBLMQOPEN

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

引数で指定したインタフェース領域に，規定の値を設定してサービスルーチンを呼び出す。

51

データパラメタのデータ長が不正である。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQSENDMSG

CBLMQLOCATE

引数で指定したデータパラメタ領域のデータ長に正しい値を設定してサービスルーチンを呼び出す。

52

データパラメタのデータが不正である。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQSENDMSG

CBLMQLOCATE

引数で指定したデータパラメタ領域のメッセージデータに正しい値を設定してサービスルーチンを呼び出す。

60

コード変換のための環境が整っていない（Unicode機能を使用する場合）。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

コード変換ライブラリが正しくインストールされているか，または使用するコード変換ライブラリが前提バージョンを満たしているかを確認する。

61

コード変換中にエラーが発生した（Unicode機能を使用する場合）。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

UCS-4の範囲（UCS-2の範囲を含む）の文字コードを使用しているか確認する。

99

サービスルーチンを実行するためのメモリが不足している。

CBLMQOPEN

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

削除できるプログラムなどを削除して再実行する。

負数

上記以外の予期しないエラーを検出した。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

当社保守員に連絡する。このとき，詳細コードの値，ソースファイル，登録集原文，およびコンパイルリストファイルが資料として必要になる。

規則

インタフェース領域は，最初のMSMQアクセスサービスルーチンを呼び出す前に次の値で初期化しておく必要があります。

・英数字項目：SPACE（ただし，予約領域はLOW-VALUE）

・数字項目：ZERO

コーディング例

MSMQアクセスサービスルーチンのインタフェース領域のコーディング例を次に示します。

       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.

27.4　MSMQアクセスサービスルーチンの実行順序

MSMQアクセスサービスルーチンの実行順序を，次に示します。

図27‒2　MSMQアクセスサービスルーチンの実行順序

27.5　MSMQアクセスサービスルーチンの使用例

27.5.1　キューを作成するコーディングの例

'.¥SampleQueue'というキューを作成するコーディングの例を次に示します。

         :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.
       01 CREATE-PARM.
         02 PATH-LEN  PIC S9(9) USAGE COMP VALUE 13.
         02 PATH-NAME PIC X(256)     VALUE '.¥SampleQueue'.
         02 LABEL-LEN PIC S9(9) USAGE COMP VALUE 12.
         02 LABEL-DAT PIC X(256)     VALUE 'Sample Queue'.
         :
       PROCEDURE DIVISION.
            :
           INITIALIZE CBLMQINF.
           MOVE LOW-VALUE TO CBLMQ-RESERVE OF CBLMQINF.

           CALL 'CBLMQCREATE' USING CBLMQINF CREATE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE CREATE ERROR'
           END-IF.
           :

27.5.2　キューを削除するコーディングの例

'.¥SampleQueue'というキューを削除するコーディングの例を次に示します。

         :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.
       01 DELETE-PARM.
         02 PATH-LEN  PIC S9(9) USAGE COMP VALUE 13.
         02 PATH-NAME PIC X(256)     VALUE '.¥SampleQueue'.
         :
       PROCEDURE DIVISION.
           :
           INITIALIZE CBLMQINF.
           MOVE LOW-VALUE TO CBLMQ-RESERVE OF CBLMQINF.

           CALL 'CBLMQDELETE' USING CBLMQINF DELETE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE DELETE ERROR'
           END-IF.
           :

27.5.3　メッセージを送信するコーディングの例

'.¥SampleQueue'というキューへメッセージを送信するコーディングの例を次に示します。

         :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.
       01 QUEUE-PARM.
         02 PATH-LEN  PIC S9(9)  USAGE COMP VALUE 13.
         02 PATH-NAME PIC X(256) VALUE '.¥SampleQueue'.
       01  MESSAGE-PARM.
         02 LABEL-LEN PIC S9(9)  USAGE COMP VALUE 14.
         02 LABEL-DAT PIC X(512) VALUE 'Sample Message'.
         02 BODY-LEN  PIC S9(9)  USAGE COMP VALUE 19.
         02 BODY-DAT  PIC X(512) VALUE 'Sample Message data'.
         :
       PROCEDURE DIVISION.
           :
           INITIALIZE CBLMQINF.
           MOVE LOW-VALUE TO CBLMQ-RESERVE OF CBLMQINF.

           MOVE '2' TO QUEUE-ACCESS OF CBLMQINF.
           CALL 'CBLMQOPEN' USING CBLMQINF QUEUE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE OPEN ERROR'
             STOP RUN
           END-IF.

           DISPLAY 'SEND MESSAGE LABEL:' LABEL-DAT(1:LABEL-LEN).
           DISPLAY 'SEND MESSAGE DATA:' BODY-DAT(1:BODY-LEN).
           MOVE 3   TO MQMSG-PRIORITY   OF CBLMQINF.
           MOVE '0' TO MQMSG-DELIVERY   OF CBLMQINF.
           MOVE '0' TO MQMSG-JOURNAL    OF CBLMQINF.
           MOVE '0' TO MQMSG-DEADLETTER OF CBLMQINF.
           MOVE '0' TO MSGDATA-CONV     OF CBLMQINF.
           CALL 'CBLMQSENDMSG' USING CBLMQINF MESSAGE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE SEND MESSAGE ERROR'
           END-IF.

           CALL 'CBLMQCLOSE' USING CBLMQINF QUEUE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE CLOSE ERROR'
             STOP RUN
           END-IF.
           :

27.5.4　メッセージを受信するコーディングの例

'.¥SampleQueue'というキューからメッセージを受信するコーディングの例を次に示します。

         :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.
       01 QUEUE-PARM.
         02 PATH-LEN  PIC S9(9)  USAGE COMP VALUE 13.
         02 PATH-NAME PIC X(256) VALUE '.¥SampleQueue'.
       01 MESSAGE-PARM.
         02 LABEL-LEN PIC S9(9)  USAGE COMP.
         02 LABEL-DAT PIC X(512).
         02 BODY-LEN  PIC S9(9)  USAGE COMP.
         02 BODY-DAT  PIC X(512).
         :
       PROCEDURE DIVISION.
           :
           INITIALIZE CBLMQINF.
           MOVE LOW-VALUE TO CBLMQ-RESERVE OF CBLMQINF.

           MOVE '1' TO QUEUE-ACCESS OF CBLMQINF.
           CALL 'CBLMQOPEN' USING CBLMQINF QUEUE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE OPEN ERROR'
             STOP RUN
           END-IF.

           MOVE 20000 TO MQMSG-TIMEOUT OF CBLMQINF.
           MOVE '0'   TO MSGDATA-CONV  OF CBLMQINF.
           COMPUTE BODY-LEN = FUNCTION LENGTH(BODY-DAT).
           CALL 'CBLMQRECEIVEMSG' USING CBLMQINF MESSAGE-PARM.
           EVALUATE RETURN-CODE
           WHEN ZERO
           WHEN 2
             IF 2 = RETURN-CODE THEN
               DISPLAY 'RECEIVE MESSAGE DATA ERROR'
             ELSE IF LOW-VALUE = MQMSG-CLASS OF CBLMQINF THEN
               DISPLAY 'NORMAL MESSAGE'
             ELSE
               DISPLAY 'NOT NORMAL MESSAGE'
             END-IF END-IF
             DISPLAY 'PRIORITY   :'
                      MQMSG-PRIORITY   OF CBLMQINF
             DISPLAY 'DELIVERY   :'
                      MQMSG-DELIVERY   OF CBLMQINF
             DISPLAY 'JOURNAL    :'
                      MQMSG-JOURNAL    OF CBLMQINF
             DISPLAY 'DEAD-LETTER:'
                      MQMSG-DEADLETTER OF CBLMQINF
             DISPLAY 'LABEL:' LABEL-DAT(1:LABEL-LEN)
             DISPLAY 'DATA :' BODY-DAT (1:BODY-LEN)
           WHEN 1
             DISPLAY 'RECEIVE MESSAGE BUFFER OVERFLOW:' BODY-LEN
           WHEN 100
             DISPLAY 'RECEIVE MESSAGE TIME-OUT'
           WHEN OTHER
             DISPLAY 'QUEUE RECEIVE MESSAGE ERROR'
           END-EVALUATE.

           CALL 'CBLMQCLOSE' USING CBLMQINF QUEUE-PARM.
           IF ZERO NOT = RETURN-CODE THEN
             DISPLAY 'QUEUE CLOSE ERROR'
             STOP RUN
           END-IF.
           :

27.5.5　キューのパス名を検索するコーディングの例

'Sample Queue'というラベルの付いた'user1¥samplequeue'というパス名のキューがあるかどうかを検索し，なければ'Sample Queue'というラベルの付いたパブリックキューのパス名を一覧表示するコーディング例を次に示します。

         :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.
       01 LOCATE-PARM.
         02 PATH-LEN  PIC S9(9)  USAGE COMP.
         02 PATH-NAME PIC X(256).
         02 LABEL-LEN PIC S9(9)  USAGE COMP VALUE 12.
         02 LABEL-DAT PIC X(256) VALUE 'Sample Queue'.
         :
       PROCEDURE DIVISION.
           :
           INITIALIZE CBLMQINF.
           MOVE LOW-VALUE TO CBLMQ-RESERVE OF CBLMQINF.

           MOVE '0' TO LOCATE-END OF CBLMQINF.
           PERFORM WITH TEST AFTER
             UNTIL ( 1 NOT = RETURN-CODE ) AND
                   ( 2 NOT = RETURN-CODE )
             CALL 'CBLMQLOCATE' USING CBLMQINF LOCATE-PARM
             IF ( 1 = RETURN-CODE ) AND
                ( 'user1¥samplequeue' = PATH-NAME ) THEN
               MOVE '1' TO LOCATE-END OF CBLMQINF
             END-IF
           END-PERFORM.
           EVALUATE RETURN-CODE
           WHEN 0
             DISPLAY 'FOUND !:' PATH-NAME(1:PATH-LEN)
             STOP RUN
           WHEN 100
             DISPLAY 'NOT FOUND PATH-NAME'
           WHEN OTHER
             DISPLAY 'QUEUE LOCATE ERROR'
             STOP RUN
           END-EVALUATE.

           MOVE '0'TO LOCATE-END OF CBLMQINF.
           PERFORM WITH TEST AFTER
             UNTIL ( 1 NOT = RETURN-CODE ) AND
                   ( 2 NOT = RETURN-CODE )
             CALL 'CBLMQLOCATE' USING CBLMQINF LOCATE-PARM
             EVALUATE RETURN-CODE
             WHEN 1
             WHEN 2
               IF 2 = RETURN-CODE THEN
                 DISPLAY 'QUEUE PATH-NAME DATA ERROR'
               END-IF
               DISPLAY 'QUEUE PATH-NAME[' PATH-LEN ']:'
                       PATH-NAME(1:FUNCTION MIN(PATH-LEN,256))
             END-EVALUATE
           END-PERFORM.
           IF ZERO > RETURN-CODE THEN
             DISPLAY 'QUEUE LOCATE ERROR'
           END-IF.
           :

28　Unicode機能

Unicode機能は，COBOLが扱うデータをUnicodeとして扱う機能です。Unicode機能を使用すると，プログラム間およびファイル入出力をUnicodeでやり取りできます。この章では，Unicode機能について説明します。

28.1　Unicode機能の概要

ここでは，コンパイル，実行，およびデバッグでのUnicode機能の概要について説明します。

28.1.1　コンパイルでのUnicode機能

シフトJISで記述されたCOBOLソースプログラムを，-UniObjGenオプションを指定してコンパイルすることで，コード系がUnicodeのオブジェクトを生成します。これによって，Unicodeデータ同士の転記または比較ができます。コンパイルでのUnicode機能を次に示します。

図28‒1　コンパイルでのUnicode機能

シフトJISで記述されたCOBOLソースプログラム，登録集原文を入力し，-UniObjGenオプションを指定しないでコンパイルすると，シフトJIS環境で動作するオブジェクトが生成されます。

シフトJISで記述されたCOBOLソースプログラム，登録集原文を入力し，-UniObjGenオプションを指定してコンパイルすると，COBOLのUnicode機能を使用する環境で動作するオブジェクトが生成されます。コンパイル時に出力されるコンパイルメッセージ，コンパイルリストはシフトJISで出力されます。

Unicodeで記述されたCOBOLソースプログラムは，コンパイルできません。コンパイルした場合，動作は保証しません。

COBOL2002コンパイラは，COBOLソースプログラム上に記述された英数字文字定数をUTF-8に，日本語文字定数をUTF-16に変換します。

28.1.2　実行でのUnicode機能

プログラム実行時に実行時環境変数CBLLANGにUNICODEが指定されている場合，コード系がUnicodeとみなして実行します。プログラム実行時のUnicode機能について次に示します。

図28‒2　プログラム実行時のUnicode機能

XML連携機能とCosminexus連携機能でUnicodeデータを使用できます。

ファイル入出力機能でUnicodeデータの読み書きができます。

28.1.3　デバッグでのUnicode機能

テストデバッガでプログラムをデバッグすると，Unicodeデータに対して次の操作ができます。詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

データ項目の値の表示

データ項目への値の代入

比較条件式の設定

28.2　Unicode機能のサポート範囲

Unicode機能で使用できるUnicodeの文字は，UCS-4の範囲（UCS-2の範囲を含む）とします。

このシステムで異体字セレクタとみなすコード範囲は，U+E0100〜U+E01EFとします。

28.3　Unicode機能の前提条件

Unicode機能を使用する場合の前提条件を次に示します。

28.3.1　コード変換ライブラリ

Unicode機能を使用する場合，次のプログラムプロダクト（以降これらのプログラムプロダクトをコード変換ライブラリと表記します）のどれかをインストールしてください。

Windows(x86) COBOL2002の場合

Hitachi Code Converter - Server Runtime for C/COBOL

Hitachi Code Converter - Client Runtime for C/COBOL

Windows(x64) COBOL2002の場合

Hitachi Code Converter - Client Runtime for C/COBOL(64)

Hitachi Code Converter - Server Runtime for C/COBOL(64)

また，COBOLプログラムから直接コード変換ライブラリを呼び出す場合は，上記に加えて次のプログラムプロダクトのどれかが必要です。

Windows(x86) COBOL2002の場合

Hitachi Code Converter - Development Kit for C/COBOL

Hitachi Code Converter - Development Kit for C/COBOL(64)

Windows(x64) COBOL2002の場合

Hitachi Code Converter - Development Kit for C/COBOL(64)

28.4　Unicode機能の詳細

28.4.1　コンパイル

-UniObjGenオプションおよび-UniEndianオプションを指定すると英数字定数，および日本語文字定数の文字コードをUnicodeに変換します。-UniObjGenオプションについては，「33.5.14　その他の設定」の「(16)　-UniObjGenオプション」を参照してください。-UniEndianオプションについては，「33.5.14　その他の設定」の「(17)　-UniEndianオプション」を参照してください。

(1)　-UniObjGenオプションと-UniEndianオプションの関係

-UniObjGenオプションと-UniEndianオプションの関係を，次に示します。

表28‒1　-UniObjGenオプションと-UniEndianオプションの関係

-UniObjGenオプション指定

-UniEndianオプション指定

-UniEndian,Little

-UniEndian,Big

指定なし

（デフォルト）

指定あり

日本語文字定数

UTF-16LEに変換

UTF-16BEに変換

UTF-16LEに変換

英数字定数

UTF-8に変換（-UniEndianオプションの影響はない）

指定なし

無変換

(2)　-UniObjGenオプション指定時の注意事項

-UniObjGenオプション指定時の注意事項を次に示します。

-UniObjGenオプション指定の有無が異なるCOBOLプログラムを混在して実行することはできません。混在して実行した場合，動作は保証しません。

前提条件を満たしていない環境で-UniObjGenオプションを指定してコンパイルした場合，コンパイルエラーとなります。前提条件を満たしていない環境を次に示します。

コード変換ライブラリがインストールされていない場合

使用するコード変換ライブラリが前提バージョンに満たない場合

NATIVE指定以外の符号系名を，実行用計算機段落のPROGRAM COLLATING SEQUENCE句，またはSORT，MERGE文のCOLLATING SEQUENCE句に指定した場合，コンパイルエラーとなります。

-Switch,EBCDIKオプションまたは-Switch,EBCDICオプションと-UniObjGenオプションを同時に指定した場合，コンパイルエラーとなります。

コンパイル中にコード変換に失敗した場合，コンパイルエラーとなります。

-JPNオプション，-CompatiV3オプション，-V3Recオプションは指定できません。ただし，コンパイラ環境変数CBLV3UNICODEにYESを指定すると，-UniObjGenオプションと-CompatiV3または-V3Recオプションを同時に指定できます。コンパイラ環境変数CBLV3UNICODEについては，「33.6.3　コンパイラ環境変数の詳細」の「(22)　CBLV3UNICODE」を参照してください。

(3)　-UniEndianオプション指定時の注意事項

-UniEndianオプション指定時の注意事項を次に示します。

-UniEndianオプション指定（Little／Big）の異なるCOBOLプログラムを混在して使用することはできません。混在して使用した場合，動作は保証しません。

28.4.2　実行

-UniObjGenオプションを指定してコンパイルしたプログラムを正しく実行するには，実行時環境変数CBLLANGにUNICODEを指定してください。実行時環境変数CBLLANGについては，「36.2.3　一般」を参照してください。

ここでは，実行時での規則について説明します。

(1)　実行時環境変数CBLLANGとCBLUNIENDIANの関係

実行時環境変数CBLLANGの設定形式を次に示します。

形式

CBLLANG=UNICODE

実行時環境変数CBLUNIENDIANの設定形式を次に示します。

形式

CBLUNIENDIAN=｛LITTLE｜BIG｝

実行時環境変数CBLLANGとCBLUNIENDIANの関係を，次に示します。

表28‒2　実行時環境変数CBLLANGとCBLUNIENDIANの関係

環境変数CBLLANG指定

環境変数CBLUNIENDIAN指定

LITTLE

BIG

指定なし

（デフォルト）

指定あり

UNICODE指定あり

用途がNATIONALの項目

UTF-16LEを仮定

UTF-16BEを仮定

UTF-16LEを仮定

用途がDISPLAYの項目

UTF-8を仮定（環境変数CBLUNIENDIANの影響はない）

無変換

指定なし

(2)　-UniObjGenオプションと実行時環境変数CBLLANGの関係

-UniObjGenオプションと実行時環境変数CBLLANGの関係を，次に示します。

表28‒3　-UniObjGenオプションと実行時環境変数CBLLANGの関係

-UniObjGenオプション指定

環境変数CBLLANG指定

UNICODE

指定なし（デフォルト）

指定あり

○※

×

指定なし

×

○

（凡例）

○：動作を保証する

×：動作を保証しない

注※

Unicode機能で動作します。

(3)　-UniEndianオプションと実行時環境変数CBLUNIENDIANの関係

-UniEndianオプションの指定（Little／Big）と，実行時環境変数CBLUNIENDIANの指定（LITTLE／BIG）の組み合わせが異なる場合，動作は保証しません。-UniEndianオプションと実行時環境変数CBLUNIENDIANの関係を次に示します。

表28‒4　-UniEndianオプションと実行時環境変数CBLUNIENDIANの関係

-UniEndianオプションの指定

環境変数CBLUNIENDIANの指定

LITTLE

BIG

指定なし（デフォルト）

-UniEndian,Little

○

×

○

-UniEndian,Big

×

○

×

指定なし

○

×

○

（凡例）

○：動作を保証する

×：動作を保証しない

(4)　コード変換失敗時の動作

コード変換ライブラリの前提条件を満たしていない環境で，実行時環境変数CBLLANGにUNICODEを指定して実行した場合，コード変換失敗となります。コード変換失敗時の動作を次に示します。

表28‒5　コード変換失敗時の動作

機能

コード変換失敗時の動作

CSV編成ファイルの入出力

実行時エラーとなる。

MSMQアクセス機能

戻り値として-2を返し，詳細コードにデータ変換失敗を示すコードを設定する。詳細については，「27.3　MSMQアクセスサービスルーチンのインタフェース」の「表27‒3　詳細コードの内容」を参照のこと。

OLE2オートメーションクライアント機能

実行時エラーとなり，詳細情報にコード変換失敗を示すコードを設定する。

CBLNCNVサービスルーチン

戻り値として-2または-3を返す。詳細については，「30.7.1　CBLNCNV」を参照のこと。

DISPLAY-OF関数／NATIONAL-OF関数

実行時エラーとなる。

(5)　開発マネージャからデバッガを起動する場合

開発マネージャからデバッガを起動する場合，デバッガに対しては実行支援による環境変数の指定が有効となりません。そのため，実行時環境変数CBLLANG，CBLUNIENDIANの指定については，開発マネージャの「プロジェクトの設定」ダイアログボックスのユーザ設定タブからも指定が必要となります。

28.5　Unicodeに対応する機能

Unicodeに対応する機能を，次に示します。

表28‒6　Unicodeに対応する機能（規格）

機能名

Unicode対応状況

備考

用途DISPLAY

用途NATIONAL

ASCII範囲内※1

ASCII範囲外※1

基本機能

○

△

△

定数に多バイト文字を指定できない句または文がある。詳細については，「28.5.1　基本機能」，または「28.7　Unicode機能での制限事項」を参照のこと。

順編成ファイル

○

○※2

○※2

相対編成ファイル

○

○※2

○※2

ISAMによる索引編成ファイル

○

○※2

○※2

キーとして用途がNATIONALの項目を指定した場合，意図しない行に位置づけられることがある。

整列併合

○

○※2

○※2

キーとして用途がNATIONALの項目を指定した場合，整列併合の結果が意図しない結果となることがある。

プログラム間連絡

○

○※3※4

○※3※4

組み込み関数

○

○

○

オブジェクト指向

○

○※3※4

○※3※4

共通例外処理

○

○

○

次に示す組み込み関数の戻り値はシフトJISとする。

EXCEPTION-FILE関数

EXCEPTION-LOCATION関数

EXCEPTION-STATUS関数

EXCEPTION-STATEMENT関数

再帰呼び出し

○

○

○

利用者定義関数

○

○

○

局所場所節（LOCAL-STORAGE SECTION）

○

○

○

原始文操作

○

○

○

自由形式正書法

○

○

○

TYPEDEF句とSAME AS句

○

○

○

条件翻訳

○

○

○

Unicode機能の影響は受けない。

翻訳指令行の定数および-Defineオプションで受け取る値はシフトJISである。

区分化

○

○

○

（凡例）

○：制限なく使用できる

△：制限付きで使用できる

注※1

USAGE DISPLAY項目のASCII範囲内は1バイト文字，ASCII範囲外は2バイト以上の文字を指します。

注※2

ファイル名の定数指定で多バイト文字を指定した場合，コンパイルエラーとなります。

注※3

プログラム名などの外部シンボルとなる名称に多バイト文字を含む場合，コンパイルエラーとなります。詳細は，「28.7.1　コンパイル時の制限事項」を参照してください。

注※4

CALL文の定数（プログラム名）またはINVOKE文の定数（メソッド名）に多バイト文字を指定した場合，コンパイルエラーとなります。

表28‒7　Unicodeに対応する機能（X/Open）

機能名

Unicode対応状況

備考

用途DISPLAY

用途NATIONAL

ASCII範囲内※1

ASCII範囲外※1

テキスト編成ファイル

○

△※2

△※2

ファイル共用（ファイルシェア）

○

○

○

コマンド行および環境変数へのアクセス

コマンド行

○

○

○

シフトJISとして取得する。

環境変数の取得

○

○

○

環境変数の設定

○

×

×

多バイト文字を指定した場合，動作は保証しない。

画面節（SCREEN SECTION）による画面操作

○

×

×

定数に多バイト文字を指定できない句または文がある。詳細については，「28.5.2　入出力機能」の「(6)　画面入出力機能」，または「28.7　Unicode機能での制限事項」を参照のこと。

C言語インタフェース

○

○※3

○※3

（凡例）

○：制限なく使用できる

△：制限付きで使用できる

×：未対応

注※1

USAGE DISPLAY項目のASCII範囲内は1バイト文字，ASCII範囲外は2バイト以上の文字を指します。

注※2

ファイル名の定数指定で多バイト文字を指定した場合，コンパイルエラーとなります。

注※3

プログラム名などの外部シンボルとなる名称に多バイト文字を含む場合，コンパイルエラーとなります。詳細は，「28.7.1　コンパイル時の制限事項」を参照してください。

表28‒8　Unicodeに対応する機能（拡張機能）

機能名

Unicode対応状況

備考

用途DISPLAY

用途NATIONAL

ASCII範囲内※1

ASCII範囲外※1

日本語

○

○

○

ブール演算

○

○

○

アドレス操作

○

○

○

1バイト2進およびCOMP-X項目

○

○

○

浮動小数点項目

○

○

○

報告書作成機能

○

×

×

ISAMによる索引編成ファイル機能の拡張（合成キー，逆順読み）

○

○

○

キーとして用途がNATIONALの項目を指定した場合，意図しない行に位置づけられることがある。

HiRDBによる索引編成ファイル

○

○※2

○※2

キーとして用途がNATIONALの項目を指定した場合，意図しない行に位置づけられることがある。

Btrieveによる索引編成ファイル※3

○

○※2

○※2

キーとして用途がNATIONALの項目を指定した場合，意図しない行に位置づけられることがある。

CSV編成ファイル

○

△※2

△※2

画面節（WINDOW SECTION）による画面操作

○

×

×

定数に多バイト文字を指定できない句または文がある。詳細については，「28.5.2　入出力機能」の「(6)　画面入出力機能」，または「28.7　Unicode機能での制限事項」を参照のこと。

通信節による画面操作

○

×

×

COPY文の接頭辞／接尾辞

○

○

○

プリンタへのアクセス

XMAP3による印刷※3

○

×

×

GDIモード印刷

○

×

×

ESC/Pモード印刷

○

×

×

ファイルのディスク書き込み保証

○

○

○

イベントログファイル出力機能

○

×

×

実行時エラーメッセージはシフトJISで出力されるが，埋め字として含まれるUnicode文字は変換されない。

データコミュニケーション機能

○

○※4

○※4

データベース操作機能（ODBCインタフェース）※6

△

×

×

XDMによるデータベースシミュレーション機能

構造型データベース（XDM/SD）

○

○

○

リレーショナルデータベース（XDM/RD）

○

○

○

OLE2オートメーションインタフェース機能

OLE2オートメーションクライアント機能

○

○

×

マルチスレッド環境での実行

○

○

○

サービスルーチン

基本機能サービスルーチン

○

△

○

引数を画面に出力するサービスルーチンには対応しない。

COBOL入出力ルーチン

○

○

○

バイトストリーム入出力

○

○

×

ファイル名に多バイト文字を指定した場合，動作は保証しない。

MSMQアクセス機能

○

○

×

数字項目のけた拡張機能※5

○

○

○

動的長基本項目機能

○

○

○

定数長拡張機能

○

○

○

Javaプログラム呼び出し機能※7

○

△

○

（凡例）

○：制限なく使用できる

△：制限付きで使用できる

×：未対応

注※1

USAGE DISPLAY項目のASCII範囲内は1バイト文字，ASCII範囲外は2バイト以上の文字を指します。

注※2

ファイル名の定数指定で多バイト文字を指定した場合，コンパイルエラーとなります。

注※3

Windows(x64) COBOL2002は未対応です。

注※4

UCS-2の範囲を使用できます。

注※5

Windows(x86) COBOL2002は未対応です。

注※6

Unicodeに対応するODBCのSQLデータ型は使用できません。

注※7

一部制限の詳細は，マニュアル「COBOL2002 Javaプログラム呼び出し機能ガイド」を参照してください。

表28‒9　Unicodeに対応する機能（連携機能）

機能名

Unicode対応状況

備考

用途DISPLAY

用途NATIONAL

ASCII範囲内※1

ASCII範囲外※1

XML連携機能

○

○※2

○※2

Cosminexus連携機能

○

○

○

（凡例）

○：制限なく使用できる

注※1

USAGE DISPLAY項目のASCII範囲内は1バイト文字，ASCII範囲外は2バイト以上の文字を指します。

注※2

UCS-2の範囲を使用できます。

表28‒10　Unicodeに対応する機能（テストデバッガ）

機能名

Unicode対応状況

備考

用途DISPLAY

用途NATIONAL

ASCII範囲内※

ASCII範囲外※

実行時デバッグ機能

○

△

△

異常終了時要約リスト，データ領域ダンプリストはシフトJISで出力されるが，リスト中に含まれるUnicode文字は変換されない。

テストデバッグ機能

GUIモード

○

○

○

バッチモード

○

○

○

カバレージ機能

GUIモード

○

○

○

バッチモード

○

○

○

（凡例）

○：制限なく使用できる

△：制限付きで使用できる

注※

USAGE DISPLAY項目のASCII範囲内は1バイト文字，ASCII範囲外は2バイト以上の文字を指します。

28.5.1　基本機能

ここでは，転記，文字列操作文などの基本機能での規則について説明します。

(1)　UnicodeとCOBOLの文字数の関係

(a)　UnicodeとCOBOLの文字数

シフトJISでは，1文字のバイト数は半角1バイト，全角2バイトと決まっていますが，Unicodeでは，1文字のバイト数は文字によって異なります。

例えば，UTF-8では半角英数字は1文字1バイトですが，半角かたかなは1文字3バイト，全角日本語は3〜8バイトの可変長になります。また，UTF-16でも，全角日本語は2バイト，4バイト（サロゲートペア文字），6〜8バイト（IVS文字）の可変長となります。

一方，COBOLの文字項目は，1文字のバイト数は文字に関係なく固定となります。

例えば，英数字項目（PIC X）では，1文字は1バイト固定，日本語項目（PIC N）では，1文字は2バイト固定となります。このため，COBOLの文字項目にUnicodeデータを格納する場合，見た目の1文字とCOBOLが扱う1文字は異なります。

見た目の1文字（Character）と区別するため，PICTURE句に指定する長さをけた（COBOL2002規格では「文字位置」（Character Position））と呼びます。

サロゲートペアやIVSを含めて，字類が英字，英数字，および日本語の項目に格納した各種文字のバイト数，けた数，文字数，および見た目幅の値を次の表に示します。なお，文字の長さの具体例については，「(2)　文字の長さ」を参照してください。

表28‒11　字類が英字，英数字の項目の場合（UTF-8エンコーディング）

説明

バイト数

けた数※1

文字数

見た目幅

半角※2

ASCII文字

1

1

1

1

半角かたかな

3

3

1

1

その他の半角文字※3

3

3

1

1

全角（日本語）

Unicodeの基本多言語面の文字

2〜3

2〜3

1

2

Unicodeの追加漢字面の文字（UTF-16のサロゲートペアで表される文字）

4

4

1

2

IVSで表される文字

7〜8

7〜8

1

2

注※1

PICTURE句の文字列に指定した値です。

注※2

次の範囲をUnicodeの半角文字とみなします。

U+0000〜U+007F，U+FF61〜U+FFDC，U+FFE8〜U+FFEE

注※3

その他の半角文字には，半角の矢印（[図データ]，[図データ]）などがあります。コード範囲はU+FFE8〜U+FFEEです。

表28‒12　字類が日本語の項目の場合（UTF-16エンコーディング）

説明

バイト数

けた数※1

文字数

見た目幅

半角※2

ASCII文字

2

1

1

1

半角かたかな

2

1

1

1

その他の半角文字※3

2

1

1

1

全角（日本語）

Unicodeの基本多言語面の文字

2

1

1

2

Unicodeの追加漢字面の文字（UTF-16のサロゲートペアで表される文字）

4

2

1

2

IVSで表される文字

6または8

3または4

1

2

注※1

PICTURE句の文字列に指定した値です。

注※2

次の範囲をUnicodeの半角文字とみなします。

U+0000〜U+007F，U+FF61〜U+FFDC，U+FFE8〜U+FFEE

注※3

その他の半角文字には，半角の矢印（[図データ]，[図データ]）などがあります。コード範囲はU+FFE8〜U+FFEEです。

(b)　結合文字

結合文字（例：「か」＋「゛」⇒「が」）が格納されている場合は，2文字として扱います。

(c)　サロゲートペア文字

Unicode機能でのサロゲートペア文字は，次の点を考慮してプログラミングすることで，ユーザデータとして使用できます。なお，IVSの異体字セレクタはサロゲートペア文字で表すため，IVSも同様に注意が必要です。

COBOLプログラムでサロゲートペア文字を含むデータ使用時の注意事項

データ定義での注意事項

サロゲートペア文字は，4バイトで１文字を表します。Unicode（UTF-16）で1文字が2バイトで表される範囲の文字だけ使う場合，COBOL2002のUnicode機能では，PIC Nの日本語項目1けたで1文字を扱うことができます。したがって，サロゲートペア文字を含むデータが格納されるデータ項目は，日本語項目2けたでサロゲートペア文字の1文字を扱うことになる点に注意してください。

手続き部での注意事項

サロゲートペア文字が格納されるデータ領域が，サロゲートペア文字1文字に対してPIC N(2)の日本語項目2けたで定義されていれば，転記や比較などで問題はありません。

ただし，文字列中の文字位置を固定で参照・更新されるような処理や，部分参照での文字位置や長さで文字数を意識しているような処理では，サロゲートペア文字1文字に対して日本語項目2けたであることを考慮した処理にする必要があります。

テストデバッガでの注意事項

サロゲートペア文字が格納されたデータ領域を画面に表示する場合，16進で表示させてください。データ属性で表示させた場合，「〓」で表示されます。

上記以外の注意事項

次に示す機能でサロゲートペア文字を含むデータ値を使用した場合，動作は保証しません。

・データコミュニケーション機能

・XML連携機能

(2)　文字の長さ

文字の長さの例を次に示します。

（例1）

UTF-8の場合，半角かたかなは3バイトで表現するため，TEST-DATA1は英数字で9けた必要となります。

（例2）

UTF-16の場合，Unicodeの基本多言語面の全角文字は2バイトで表現するため，TEST-DATA2は2けた必要となります。UTF-8の場合，Unicodeの基本多言語面の全角文字は3バイトで表現するため，TEST-DATA3は6けた必要となります。

（例3）

UTF-16でサロゲートペア文字を扱う場合，次の例では3文字を表すのに日本語項目で5けた（10バイト）必要となります。

（例4）

UTF-16でIVS文字を扱う場合，基となる文字（基底文字）に異体字セレクタと呼ばれる4バイトが付加されるため，次の例では3文字を表すのに日本語項目で5けた（10バイト）必要となります。

（例5）

UTF-8でIVS文字を扱う場合，基となる文字（基底文字）に異体字セレクタと呼ばれる4バイトが付加されるため，次の例では3文字を表すのに英数字項目で13けた（13バイト）必要となります。

(3)　空白文字，表意定数SPACE，および転記の空白詰めの文字コード

空白文字，表意定数SPACE，および転記の空白詰めの文字コードについて，次に示します。

用途がDISPLAYの場合，UTF-8の半角空白（X'20'）を設定します。

用途がNATIONALの場合，バイトオーダによって次の文字コードを設定します。

バイトオーダがリトルエンディアンの場合，全角空白（X'0030'）とします。

バイトオーダがビッグエンディアンの場合，全角空白（X'3000'）とします。

(4)　表意定数ZEROの文字コード

表意定数ZEROの文字コードについて，次に示します。

用途がDISPLAYの場合，UTF-8の半角ゼロ（X'30'）を設定します。

用途がNATIONALの場合，バイトオーダによって次の文字コードを設定します。

バイトオーダがUTF-16LEの場合，全角ゼロ（X'10FF'）とします。

バイトオーダがUTF-16BEの場合，全角ゼロ（X'FF10'）とします。

(5)　文字コードを変換するプログラム例

Unicode機能を使用するプログラム実行時には，用途がDISPLAY／NATIONALの項目に格納される文字データはすべてUTF-8／UTF-16として処理します。たとえば，ファイルから読み込んだレコード項目にシフトJISの文字データが格納されることで，用途がDISPLAY／NATIONALの項目にUTF-8／UTF-16以外の文字データが格納される場合は，コード変換ライブラリを使用して入力データをUTF-8／UTF-16へ変換する必要があります。

コード変換ライブラリを使用してシフトJISの文字データをUTF-8へ変換するコーディング例を次に示します。

コンパイル例

Windows(x86) COBOL2002の場合

ccbl2002 -UniObjGen sample1.cbl codeconv.lib

Windows(x64) COBOL2002の場合

ccbl2002 -UniObjGen sample1.cbl codeconv64.lib

プログラム例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
      *>コード変換ライブラリ提供の登録集原文の取り込み
       COPY 'codeconv.cbl'.
       01 CONV-TABLE-P   ADDRESS.
       01 DEFAULT-CODE1  PIC X(1).
       01 DEFAULT-CODE2  PIC X(1).
       01 TABLE-FULLPATH ADDRESS VALUE NULL.
       01 MAPPING-FULLPATH ADDRESS VALUE NULL.
       01 RETCODE        PIC 9(9) USAGE COMP.
       01 SYSTEM-ERRCODE PIC 9(9) USAGE COMP.
       01 INLEN          PIC 9(9) USAGE COMP.
       01 INBUF          PIC X(100).
       01 OUTLEN         PIC 9(9) USAGE COMP.
       01 OUTBUF         PIC X(300).
       PROCEDURE DIVISION.
           CALL 'CodeConvOpen' USING
               BY VALUE     CCF-SJIS-UTF
                            0
               BY REFERENCE DEFAULT-CODE1
                            DEFAULT-CODE2
               BY VALUE     TABLE-FULLPATH
                            MAPPING-FULLPATH
               BY REFERENCE RETCODE
                            SYSTEM-ERRCODE
               RETURNING CONV-TABLE-P.
           IF CONV-TABLE-P NOT = NULL THEN
               COMPUTE CCT-CODECONVTABLEA = CONV-TABLE-P
                         ：
               （INBUFにシフトJISデータを格納）
                         ：
               MOVE 100 TO INLEN
               MOVE 300 TO OUTLEN
               CALL 'CodeConvString' USING
                   BY REFERENCE CCT-CODECONVTABLE
                                INLEN
                                INBUF
                                OUTLEN
                                OUTBUF
           ELSE      *>エラー時の処理
                    ：
           END-IF.
           CALL 'CodeConvClose' USING
               BY REFERENCE CCT-CODECONVTABLE
                            SYSTEM-ERRCODE.
           DISPLAY 'INBUF=' INBUF.
           DISPLAY 'OUTBUF=' OUTBUF.
           EXIT PROGRAM.

(6)　用途DISPLAYと用途NATIONALとの間の変換

用途がDISPLAYの項目と，用途がNATIONALの項目との間で変換（転記）する場合，コード変換が必要です。コード変換する方法を次に示します。

DISPLAY-OF関数，NATIONAL-OF関数を使用する

コード変換ライブラリを使用してUTF-8とUTF-16を相互に変換する

(7)　入出力データの変換

CSV編成ファイルを除き，入出力データは無変換とします。入出力データとは，次の機能使用時に入出力されるデータのことです。

ファイル入出力

少量入出力（DISPLAY文，ACCEPT文）

画面機能

データベース操作機能

サービスルーチン

(8)　シフトJIS範囲外の文字

シフトJIS範囲外の文字については，16進英数字定数または16進日本語文字定数を使用し，UTF-8またはUTF-16のコード値を直接指定してください。このとき，16進日本語文字定数は，常にUTF-16BEで指定してください。COBOL2002コンパイラは，-UniEndianオプションの指定に従い，16進日本語文字定数の文字コードを変換します。

(9)　データの比較

データの比較は，文字コードによるバイナリ比較となります。そのため，用途がNATIONALの項目または日本語文字定数の大小比較はバイトオーダによって結果が異なります。

28.5.2　入出力機能

Unicode機能では，順編成ファイル，相対編成ファイル，および索引編成ファイルについては，文字コードを意識することなく，入出力できます。しかし，テキスト編成ファイルおよびCSV編成ファイルは，ほかのアプリケーションで参照可能とするため，文字コードをUTF-8に統一します。

(1)　テキスト編成ファイル

テキスト編成ファイルでは，UTF-8で作成されたファイルの入出力ができます。この機能の規則を次に示します。

使用するテキスト編成ファイルはUTF-8で作成してください。また，テキスト編成ファイルに関連づけられたレコード記述項は，用途をDISPLAYに統一してください。用途をDISPLAYに統一していない場合は，コンパイルエラーとなります。

新規ファイルを作成時，該当するファイルにUnicodeシグニチャとして（X'EFBBBF'）の3バイトを付加します。

Unicodeシグニチャを含むテキスト編成ファイルを入力する場合，Unicodeシグニチャは自動的に読み飛ばします。そのため，ユーザがUnicodeシグニチャを意識する必要はありません。

COBOLプログラム以外で，COBOLで作成するテキスト編成ファイルを処理するとき，Unicodeシグニチャを意識しなければなりません。

ただし，次に示すテキスト編成ファイルのUnicodeシグニチャ出力の切り替え機能を使用すると，Unicodeシグニチャを出力しないファイルを作成できるため，Unicodeシグニチャを意識する必要がなくなります。

(a)　テキスト編成ファイルのUnicodeシグニチャ出力の切り替え機能

新規ファイル作成時にUnicodeシグニチャを出力しないようにする場合，実行時環境変数CBLD_ファイル名にTEXTSUPPRESSBOMを設定するか，または実行時環境変数CBLTEXTSUPPRESSBOMを設定します。

なお，この機能はテキスト編成ファイル作成時だけ有効です。

ファイル単位に指定する方法

形式

CBLD_ファイル名=｛TEXTSUPPRESSBOM｜NOTEXTSUPPRESSBOM｝

機能

この環境変数にTEXTSUPPRESSBOMが指定された場合，実行単位中の任意の新規作成のテキスト編成ファイルに対してUnicodeシグニチャを出力しません。

この環境変数にNOTEXTSUPPRESSBOMが指定された場合，テキスト編成ファイルのUnicodeシグニチャ出力の切り替え機能は無効となります。

実行単位中のすべてのファイルに指定する方法

形式

CBLTEXTSUPPRESSBOM=YES

機能

この環境変数にYESが指定された場合，実行単位中のすべての新規作成のテキスト編成ファイルに対してUnicodeシグニチャを出力しません。

この環境変数にYESの指定がないか，またはYES以外が指定された場合，テキスト編成ファイルのUnicodeシグニチャ出力の切り替え機能は無効となります。

規則

ファイル単位に指定する方法と実行単位中のすべてのファイルに指定する方法を併用した場合，ファイル単位に指定する方法が優先されます。

環境変数CBLTEXTSUPPRESSBOMと環境変数CBLD_ファイル名の指定の組み合わせによるUnicodeシグニチャの出力状態を次の表に示します。

表28‒13　環境変数CBLTEXTSUPPRESSBOMと環境変数CBLD_ファイル名の指定の組み合わせによるUnicodeシグニチャの出力状態

CBLTEXTSUPPRESSBOM

CBLD_ファイル名

TEXTSUPPRESSBOM

NOTEXTSUPPRESSBOM

指定なし

YES

出力しない

出力する

出力しない

環境変数指定なし，

または

YES以外

出力しない

出力する

出力する

(2)　CSV編成ファイル

CSV編成ファイルではUTF-8で作成されたファイルの入出力ができます。この機能の規則を次に示します。

(a)　CSV編成ファイルの入出力

CSV編成ファイルを入力する場合，対象ファイルはUTF-8で作成してください。対象ファイルのレコード記述項に用途がNATIONALの項目が定義されている場合，入出力時にUTF-8／UTF-16の相互変換をします。そのため，CSV編成ファイルにUTF-8以外の文字コードが含まれる場合，動作は保証しません。CSV編成ファイルの入出力について次に示します。

入力したデータに対応する項目の用途がNATIONALの場合，実行時環境変数CBLUNIENDIANの指定に従い，UTF-8からUTF-16に自動変換し，データ項目に格納します。

出力するレコード領域に用途がNATIONALの項目を含む場合，該当する項目の文字コードをUTF-16からUTF-8に自動変換することで，CSV編成ファイルの文字コードをUTF-8に統一します。

CSV編成ファイルでは，用途がNATIONALの項目の文字コードをUTF-16からUTF-8に変換することで，プログラム上のサイズと実際のレコードサイズが異なります。

（例1）

       IDENTIFICATION DIVISION.
             ：
       DATA DIVISION.
       FILE SECTION.
       FD FILE01.
       01 REC01 PIC X(5) USAGE DISPLAY.
       PROCEDURE DIVISION.
             ：
           MOVE 'ABCDE' TO REC01.
           WRITE REC01.

この場合，データ項目「REC01」は用途がDISPLAYなので，文字コードはUTF-8であり，実際にREC01に格納されたデータとファイルに書き出されたデータサイズは等しくなります。

（例2）

       IDENTIFICATION DIVISION.
             ：
       DATA DIVISION.
       FILE SECTION.
       FD FILE02.
       01 REC02 PIC N(5) USAGE NATIONAL.
       PROCEDURE DIVISION.
             ：
           MOVE NC'あいうえお' TO REC02.
           WRITE REC02.

この場合，データ項目「REC02」は用途がNATIONALであり，文字コードはUTF-16なので，ファイルへ書き出すときにUTF-8に自動変換します。UTF-16（2バイトの固定）からUTF-8（可変。日本語は3バイト）に変換することで，データサイズは大きくなります。

（例3）

       IDENTIFICATION DIVISION.
             ：
       DATA DIVISION.
       FILE SECTION.
       FD FILE02.
       01 REC02 PIC N(5) USAGE NATIONAL.
       PROCEDURE DIVISION.
             ：
           READ  FILE02.

例2で出力したデータを入力するとき，入力データはUTF-8で15バイトですが，入力時にUTF-16に変換することで10バイトとなり，データサイズは小さくなります。

(b)　Unicodeシグニチャ

CSV編成ファイルは，Unicodeシグニチャを含まないでください。CSV編成ファイルにUnicodeシグニチャが含まれる場合，データとして扱います。

(3)　順編成ファイル，相対編成ファイル，および索引編成ファイルを使用した入出力

順編成ファイル，相対編成ファイル，および索引編成ファイルを使用した入出力では，用途がNATIONALの項目についてUTF-16からUTF-8への自動変換はしません。この機能の規則を次に示します。

順編成ファイル，索引編成ファイル，および相対編成ファイルの入力時，ファイル中の用途がNATIONALの項目に対応するUTF-16データと，実行時環境変数CBLUNIENDIANのバイトオーダを一致させてください。

(4)　HiRDBによる索引編成ファイル使用時の，HiRDBのクライアント環境変数PDCLTCNVMODEの指定

HiRDBによる索引編成ファイルを使用している場合，HiRDBのクライアント環境変数PDCLTCNVMODEには，NOUSE（デフォルト値）を指定してください。ほかの値を指定した場合，不当なコード変換によって入出力エラーになることがあります。

(5)　ACCEPT／DISPLAY文による入出力

(a)　ACCEPT文による入力

ACCEPT文で外部から入力したデータは，文字コードを変換しません。外部から入力することで，用途がDISPLAY／NATIONALの項目にUTF-8／UTF-16以外の文字データが格納されるときは，コード変換ライブラリを使用して入力データをUTF-8／UTF-16へ変換してください。

(b)　DISPLAY文による出力

DISPLAY文で用途がDISPLAY／NATIONALの項目の内容を画面上に出力するとき，文字コードは変換しません。出力する内容がUnicodeの場合，文字情報を正しく出力するためにはコード変換ライブラリを使用し文字コードを変換してください。

(c)　注意事項

DISPLAY文でファイルに出力する場合，指定した項目の用途にかかわらず，改行コードはX'0D0A'となります。

(6)　画面入出力機能

日本語，半角かたかななど，Unicodeの多バイト文字をCOBOLプログラムから直接画面表示はできません。

(7)　プリンタへのアクセス

日本語，半角かたかななど，Unicodeの多バイト文字をCOBOLプログラムから直接印刷はできません。

28.5.3　CBLNCNVサービスルーチン

CBLNCNVサービスルーチンを呼び出すと，UTF-8で記述された半角文字からUTF-16で記述された全角文字への変換ができます。CBLNCNVサービスルーチンについては，「30.7.1　CBLNCNV」を参照してください。

(1)　CBLNCNVサービスルーチンでの文字変換

CBLNCNVサービスルーチンでの文字変換は，次の順序でします。

UTF-8のコード範囲の半角文字をUTF-8の全角文字コードに変換します。

変換したUTF-8の全角文字コードを，実行時環境変数CBLUNIENDIANの指定に従いUTF-16LEまたはUTF-16BEに変換します。

(2)　CBLNCNVサービスルーチンの戻り値

Unicode機能でのCBLNCNVサービスルーチンの戻り値について次に示します。

コード変換ライブラリが正しくインストールされていない場合，戻り値として-2を返します。

コード変換ライブラリがエラーを返し，コード変換に失敗した場合，戻り値として-3を返します。主なエラーの要因を次に示します。

送り出し側作用対象の項目に，UTF-16に変換できない文字が含まれている。

送り出し側作用対象の項目が，日本語文字や半角かたかななどの多バイト文字の途中で切れている。

その他のエラーの要因については，「コード変換ライブラリのマニュアル」のCodeConvString関数の説明を参照してください。

28.5.4　MSMQアクセス機能

MSMQアクセス機能では，Unicodeデータのやり取りができます。MSMQアクセス機能については，「27.　MSMQアクセス機能」を参照してください。

Unicode機能でのMSMQアクセスのサービスルーチンの戻り値について次に示します。

コード変換ライブラリが正しくインストールされていない場合，戻り値として−2を返し，詳細コードとして，60を設定します。

コード変換ライブラリがエラーを返し，コード変換に失敗した場合，戻り値として−2を返し，詳細コードとして，61を設定します。

28.5.5　OLE2オートメーション機能

OLE2オートメーション機能については「25.　OLE2オートメーション機能」を参照してください。

(1)　OLE2オートメーションクライアント機能

OLE2オートメーションクライアント機能では，Unicodeデータのやり取りができます。

(a)　OLE2オートメーション機能での制限

OLE2オートメーションクライアント機能で，INVOKE文の引数や戻り値，SET文，またはOLE2インタフェース機能の組み込み関数の引数には，次の項目は指定できません。指定した場合はコンパイルエラーとなります。

用途がNATIONALの項目

用途がNATIONALの項目を従属項目として含む集団項目

日本語文字定数

16進日本語文字定数

(b)　実行時の注意事項

実行時の注意事項を次に示します。

コード変換ライブラリが正しくインストールされていない場合，実行時エラーとなります。

コード変換ライブラリがエラーを返し，コード変換に失敗した場合，実行時エラーとなります。

28.5.6　組み込み関数

(1)　Unicodeに対応した組み込み関数

Unicodeの文字操作や文字数／けた数の取得，コード変換をする組み込み関数を次の表に示します。これらの組み込み関数の形式や使用例などの詳細は，マニュアル「COBOL2002　言語　拡張仕様編」　「23.2　組み込み関数」を参照してください。

表28‒14　Unicodeに対応した組み込み関数

項番

用途

組み込み関数名

概要

1

文字列の取り出し

SUBSTRING

字類が英字，英数字，または日本語のデータ項目から部分文字列を返します。

2

文字数の取得

COUNT-CHAR

字類が英字，英数字，または日本語のデータ項目の文字数を返します。

3

けた数の取得

LENGTH-OF-SUBSTRING

字類が英字，英数字，または日本語のデータ項目の部分文字列のけた数を返します。

4

コード変換

DISPLAY-OF

字類が日本語のデータ項目中のUTF-16の文字列をUTF-8の文字列に変換して返します。

5

NATIONAL-OF

字類が英数字のデータ項目中のUTF-8の文字列をUTF-16の文字列に変換して返します。

なお，Unicodeに対応した組み込み関数を使用した場合，Unicode文字の特性上，文字の判定や取得する処理の実行時間が増加する場合や，動作を保証できない場合があります。詳細は，「(2)　Unicodeに対応した組み込み関数の注意事項」を参照してください。

(2)　Unicodeに対応した組み込み関数の注意事項

Unicode文字は特性上，シフトJISや日本語EUCと比べて1文字のサイズが多様なため，文字の判定や取得する処理の実行時間が増加します。シフトJISや日本語EUCの既存のプログラムをUnicode機能に移行してUnicodeに対応した組み込み関数を使用する場合は，実行時間が大きく増える場合があります。そのため，次の点に注意して組み込み関数を使用してください。

1文字のサイズが可変となる可能性がないデータ項目※の場合は，Unicodeに対応した組み込み関数を使用しないで，部分参照を使用して処理する。

注※

例えば，半角英数字だけ格納される英数字項目や，サロゲートペアおよびIVSを含む可能性がない日本語項目などが該当します。

Unicodeに対応した組み込み関数は，文字数の考慮が必要な処理の場合だけ使用する。

例えば，文字列の取り出しで，けた数と文字数の両方がわかっている場合は，けた数による部分参照を使用して処理します。

-UniObjGenコンパイラオプションを指定してコンパイルした組み込み関数を使用するプログラムを，実行時環境変数CBLLANGでUNICODEを指定していない環境で実行すると，実行時エラーが発生してプログラムの実行が中止します。

Unicodeの文字を格納するデータ項目のけた数が，格納しようとする文字の長さより短い場合，データ項目のけた数までのデータが格納されます。

Unicodeに対応した組み込み関数には，格納されるUnicode文字の長さを考慮したけた数を定義したデータ項目を指定する必要があります。

英数字集団項目の従属項目に，字類が英字および英数字の項目と，字類が日本語の項目が混在している場合，各項目の文字列をUnicode文字として扱えないことがあります。そのため，英数字集団項目の従属項目は，字類が英字および英数字の項目だけを使用してください。

組み込み関数の引数の指定に誤りがある場合は，次の表に示すように，実行時にEC-ARGUMENT-FUNCTION例外が発生します。

要因

組み込み関数名

COUNT-CHAR

DISPLAY-OF

LENGTH-OF- SUBSTRING

NATIONAL-OF

SUBSTRING

引数1の文字コードが不当な値である。※1

○

○※4

○

○※4

○

引数1の文字列中にある異体字セレクタが不当な位置にある。※2

○

−

○

−

○

引数2と引数3が一意名または算術式で，値が正の整数でない。

−

−

○

−

○

引数2で指定する開始位置，または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置が引数1の終端を超えている。

−

−

○

−

○

引数2で指定する開始位置，または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置が全角文字の途中である。※3

−

−

○

−

○

（凡例）

○：EC-ARGUMENT-FUNCTION例外が成立する。

−：EC-ARGUMENT-FUNCTION例外が成立しない。

注※1

文字コードが不当な値の場合で，実行時エラーとなる例を次に示します。

（例）

01 DATA1 PIC X(30)
VALUE X'EFBDB1EFBDB2EFBDB3EFBDB4EFFDB5EFBDB6EFBDB7EFBDB8EFBDB9EFBDBA'.
*> ｱｲｳｴｵｶｷｸｹｺにしたいが，14バイト目が不正（BDのはずがFDになっている。
*> この位置にFDがあるのはUTF-8として不正な文字と扱う）

MOVE FUNCTION SUBSTRING(DATA1, 2, 4) TO DATA2.

<実行結果>

KCCC2310R-S
組み込み関数処理中に文字コード不正を検出しました。
プログラム名＝MAIN
行番号／欄＝000022/15
関数名＝SUBSTRING
詳細情報＝引数1の14バイト目で文字コード不正を検出しました。
4バイト目以降:efbdb2efbdb3efbdb4effdb5efbdb6efbdb7efbdb8

「nバイト目以降:」の行には，不正を検出した位置とその前後10バイトが表示されます。上記の例では，14バイト目で不正を検出したため，前の10バイト（4〜13バイト目），不正バイト（14バイト目），および後の10バイト（15〜24バイト目）の計21バイトが表示されています。

注※2

次の場合が該当します。

異体字セレクタが文字列の先頭にある

異体字セレクタが連続している

（例）

FD FILE1.
01 GRP01 GROUP-USAGE NATIONAL.
  02  DATA1 PIC N(1).
  02  DATA2 PIC N(2).

01 DATA3    PIC N(6).

READ FILE1.
*>UTF-16の'葛'(X'845BDB40DD03')をファイルから読み取る。
*>このときDATA1にX'845B'，DATA2にX'DB40DD03'が転記される。
MOVE FUNCTION SUBSTRING(DATA2, 1) TO DATA3.
*>DATA2の文字列は先頭から異体字セレクタとなっているため，不正な文字として扱う。

注※3

引数に指定した開始位置が，データ項目中の全角文字の途中となった場合の例を次に示します。

（例1）

01 DATA1 PIC X(4) VALUE 'あBC'.

MOVE FUNCTION SUBSTRING(DATA1, 2, 2 WIDTH) TO DATA2.
*>引数2で指定する開始位置は'あ'の途中を指しているため文字を正確に取り出せない。

（例2）

01 DATA1 PIC X(4) VALUE 'ABう'.

MOVE FUNCTION SUBSTRING(DATA1, 2, 2 WIDTH) TO DATA2.
*>引数2で指定する開始位置から引数3の長さだけ進めた文字位置は'う'の途中を
*> 指しているため文字を正確に取り出せない。

なお，IVSは基底文字＋異体字で構成されます。ただし，基底文字だけでもUnicode文字として扱われるため，部分文字列として取得してもエラーになりません。

注※4

コンパイル時にコンパイラオプション-FunctionECSup,CodeConvErrの指定がない場合は，例外が成立します。コンパイル時にコンパイラオプション-FunctionECSup,CodeConvErrの指定がある場合は，例外が成立しません。

28.6　シフトJISで入出力する情報

シフトJISコードで入出力する情報を次に示します。

表28‒15　シフトJISコードで入出力する情報

分類

入力／出力

入出力情報

翻訳時

入力

COBOLソースプログラム（登録集原文を含む）

コマンドラインの引数

stdcall呼び出し指示ファイル※

モジュール定義ファイル

出力

コンパイラメッセージ

コンパイルリストファイル

TDコマンド格納ファイル

実行時

入力

外部で設定された環境変数の設定値

コマンドラインの引数

ACCEPT文で入力したデータ

プレロードリストファイル

出力

実行時エラーメッセージ

異常終了時要約情報リスト

データ領域ダンプリスト

入出力サービスルーチンデバッグリスト

プログラム検索トレースファイル

リポジトリ管理ツール

出力

エラーメッセージ

リポジトリファイル情報リスト

テストデバッガ

入力

TDコマンド格納ファイル

出力

モニタ表示出力ファイル（ログ出力ファイル）

結果蓄積ファイル

結果出力ファイル

エラーメッセージ

カバレージ

出力

カウント情報リストファイル

カバレージ情報リストファイル

実行結果出力ファイル

エラーメッセージ

注※

Windows(x86) COBOL2002で有効です。

28.7　Unicode機能での制限事項

ここでは，Unicode機能での制限事項を説明します。

28.7.1　コンパイル時の制限事項

日本語，半角かたかななど，Unicodeで多バイト文字となる文字を含む語，英数字定数または日本語文字定数を，次の個所に指定した場合，コンパイルエラーとなります。

表28‒16　UTF-8の多バイト文字およびUTF-16の文字が指定できない個所

分類

翻訳時にエラーとなる個所

翻訳グループの構造

END PROGRAMの定数1およびEND METHODの定数1

見出し部

プログラム名段落のプログラム名1／定数2

メソッド名段落のメソッド名1／定数2

環境部

ALPHABET句の定数指定の定数1／2／3

ASSIGN句の定数1

CLASS句の定数5／6

CURRENCY SIGN句の定数7

外部プログラム節のプログラム名1／定数1（Windows(x86) COBOL2002で有効）

特殊名段落の定数10※2

データ部

CODE句の定数1

手続き部

CALL文の定数1

CANCEL文の定数1

ENTRY文の定数

DISPLAY文の定数1／2／3※1

INVOKE文の定数1

STOP文の定数2

組み込み関数

ADDR関数の引数1

画面機能（SCREEN／WINDOW SECTION）

DISPLAY文の定数1（SCREEN SECTION）

PICTURE句FROM指定の定数1（SCREEN SECTION）

PROMPT句の定数1（SCREEN SECTION）

VALUE句の定数1（SCREEN SECTION）

RESET句の定数1（WINDOW SECTION）

VALUE句の定数1（WINDOW SECTION）

注※1

画面への出力，環境変数へのアクセス，コマンドラインへのアクセス

注※2

特殊名段落の定数10は報告書作成機能で，-CompatiV3オプションを指定したときに有効になります。コンパイラ環境変数CBLV3UNICODEにYESを指定すると，-UniObjGenオプションと-CompatiV3オプションを同時に指定できます。そのため，特殊名段落の定数10が使用できるようになりますが，Unicodeで多バイトとなる文字を指定した場合，コンパイルエラーとなります。

16進英数字定数または16進日本語文字定数と，文字定数が混在した連結式を指定した場合，コンパイルエラーとなります。

28.7.2　実行時の制限事項

実行時の制限事項について，次に示します。

使用できる文字コードはUCS-4の範囲（UCS-2の範囲を含む）です。

日本語，半角かたかななど，Unicodeで多バイト文字となる文字を，次のサービスルーチンに指定した場合，動作は保証しません。

JCPOPUPサービスルーチン

CBLMESSAGEサービスルーチン

CBLPUTサービスルーチン

CBLSETTITLEサービスルーチン

CBLINPUTDLGサービスルーチン

次に示す例外に関する組み込み関数の関数値の文字コードはシフトJISです。関数値をUnicodeのデータで使用する場合，コード変換ライブラリを使用して，文字コードを統一してください。

EXCEPTION-FILE

EXCEPTION-LOCATION

EXCEPTION-STATEMENT

EXCEPTION-STATUS

用途がNATIONALの項目を従属として含む集団項目と，用途がDISPLAYの項目間の転記処理した場合，転記結果は保証しません。

転記や文字列操作機能（部分参照やSTRING文などの文字列操作文）では，用途がDISPLAYの項目に格納された文字は，1文字1バイトとして処理し，用途がNATIONALの項目に格納された文字は，1文字2バイトとして処理します。文字列操作文が，用途がDISPLAYの項目に対して作用する場合，定数または一意名の値に多バイト文字を含まないでください。

イベントログファイル出力機能で，DISPLAY文で出力する情報に多バイト文字を含む場合，出力結果は保証しません。

日本語，半角かたかななど，Unicodeの多バイト文字を含むソースファイル名，およびパス名は使用できません。

シフトJISなどUnicode以外のデータを入力し，Unicodeに変換しないで処理を続行した場合，動作は保証しません。

外部で設定された環境変数の設定値およびコマンドラインの引数にUnicodeで多バイトとなる文字は使用できません。使用した場合，動作は保証しません。

29　数字項目のけた拡張機能（Windows(x64) COBOL2002で有効）

数字項目のけた拡張機能は，数字項目，数字編集項目，および数字定数で扱えるけた数の上限を18けたから38けたに拡張し，算術演算，転記，および比較条件で使用できるようにします。この章では，数字項目のけた拡張機能について説明します。

29.1　数字項目のけた拡張機能の概要

ここでは，数字項目のけた拡張機能の概要について説明します。

29.1.1　概要

数字項目のけた拡張機能とは，数字項目（外部10進項目，内部10進項目），数字編集項目，および数字定数で扱えるけた数の上限を18けたから38けたに拡張するものです。これによって，38けたに拡張した数字項目，数字編集項目，および数字定数を，算術演算，転記，および比較条件で使用できます。なお，算術演算での中間結果を保持する領域は，30けたの固定小数点形式から40けたの10進浮動小数点形式となります。

数字項目のけた拡張機能で38けたの数字項目を定義したコーディング例を次に示します。

図29‒1　38けたの数字項目を定義したコーディング例

数字項目のけた拡張機能を使用する場合の注意事項を次に示します。

数字項目や数字編集項目のけた数は，従来の18けたより大きなけた数が扱えますが，けた数が増えると実行時間も大きく増えるおそれがあります。

数字項目のけた拡張機能を使用した場合，中間結果で保持するけた数が，数字項目のけた拡張機能を使用しない場合より大きい40けたとなるため，従来の18けた以下の演算であっても演算結果が異なり，算術式および条件式の結果が異なる場合があります。

次の場合は，数字項目のけた拡張機能と同時に使用できません。

MEDIAN関数の引数に，算術式または組み込み関数を指定したとき。

TURN指令にEC-SIZEを指定したとき。

29.1.2　数字項目のけた拡張機能で必要なコンパイラオプション

数字項目のけた拡張機能を使用する場合は，コンパイル時に-MaxDigits38オプションと-IntResult,DecFloat40オプションを同時に指定してください。-MaxDigits38オプションと-IntResult,DecFloat40オプションを同時に指定していない場合は，コンパイルエラーとなります。

-MaxDigits38オプションの詳細については，「33.5.14　その他の設定」の「(18)　-MaxDigits38オプション（Windows(x64) COBOL2002で有効）」を参照してください。

-IntResult,DecFloat40オプションの詳細については，「33.5.14　その他の設定」の「(19)　-IntResult,DecFloat40オプション（Windows(x64) COBOL2002で有効）」を参照してください。

29.2　数字項目のけた拡張機能の詳細

数字項目のけた拡張機能に対応している数字項目，数字編集項目，および数字定数は，最大けた数を18けたから38けたに拡張できます。数字項目のけた拡張機能の詳細について説明します。

29.2.1　数字項目のけた拡張機能で対象となるデータ項目

数字項目のけた拡張機能の対象となるデータ項目の指定方法および表現形式を次の表に示します。

表29‒1　数字項目のけた拡張機能に対応したデータ項目の指定方法および表現形式

項目

PICTURE句の指定

USAGE句の指定

表現形式

数字項目のけた拡張機能への対応

数字項目

数字

DISPLAY

外部10進形式

○

PACKED-DECIMAL

または

COMPUTATIONAL-3

内部10進形式

○

BINARY

または

COMPUTATIONAL

COMPUTATIONAL-4

COMPUTATIONAL-5

2進形式

×

'9'，'X'，'A'だけ

COMPUTATIONAL-X

2進形式

×

外部浮動小数点の数字※

DISPLAY

外部浮動小数点形式

×

PICTURE句の指定なし

COMPUTATIONAL-1※

内部浮動小数点形式（4バイト）

×

COMPUTATIONAL-2※

内部浮動小数点形式（8バイト）

×

数字編集項目

数字編集

DISPLAY

1バイトで1文字を表現する

○

（凡例）

○：指定できる

×：指定できない

注※

内部浮動小数点形式または外部浮動小数点形式の詳細については，マニュアル「COBOL2002　言語　拡張仕様編」　「6.　浮動小数点形式データを扱う機能」を参照してください。

29.2.2　数字項目のけた拡張機能で対象となる定数

数字項目のけた拡張機能の対象となる定数について次の表に示します。

表29‒2　数字項目のけた拡張機能に対応した定数

字類と項類

定数

数字項目のけた拡張機能への対応

数字

数字定数

固定小数点数字定数

○

浮動小数点数字定数

×

16進数字定数

×

（凡例）

○：指定できる

×：指定できない

29.2.3　数字項目のけた拡張機能での有効けた数

算術文に対して，数字項目（外部10進項目，内部10進項目）および数字編集項目を算術文の作用対象に指定したときの有効けた数に関する共通事項を次に示します。

作用対象のデータ記述が同一である必要はありません。

計算の過程で，すべての必要な変数と小数点の位置が合わせられます。

作用対象の数字の最大けた数は38けたです。

また，作用対象の合成※の最大けた数も38けたです。

注※

作用対象の合成とは，指定された各作用対象を小数点で位置合わせし，重ね合わせてできる仮想のデータ項目です。

29.3　数字項目のけた拡張機能での演算の中間結果

ここでは，数字項目のけた拡張機能での演算の中間結果について説明します。

29.3.1　演算の中間結果

数字項目のけた拡張機能での中間結果には，次の規則があります。

中間結果の表現形式は，40けた10進浮動小数点形式です。中間結果の値は作用対象のけた数にかかわらず，演算の結果の値によって，上位けたから有効な40けたを格納します。10進浮動小数点形式の詳細については，「29.3.2　10進浮動小数点形式について」を参照してください。

中間結果の40けたに入りきれない値は，下位のけたが切り捨てられます。

数字項目のけた拡張機能での演算の中間結果についての注意事項

次のどれかに該当する演算の場合，内部浮動小数点演算となるため，中間結果に40けた10進浮動小数点形式は適用されません。

・被べき数（底）またはべき数（指数）が浮動小数点項目または浮動小数点定数のべき乗演算

・べき数（指数）が算術式のべき乗演算

・べき数（指数）が整数でないべき乗演算

・関数値のデータ属性が内部浮動小数点形式の組み込み関数

・浮動小数点項目および浮動小数点定数に対するマイナス（-）単項演算子

・浮動小数点項目および浮動小数点定数同士の演算

29.3.2　10進浮動小数点形式について

数字項目のけた拡張機能での中間結果の表現形式は，40けた10進浮動小数点形式です。

40けた10進浮動小数点形式は，符号，仮数部（40けた）および指数部（4けた）で構成し，図29-2に示す範囲の数値を格納します。格納できる値の範囲を超えた場合は，オーバーフロー（指数部が+9999より大きくなった状態）またはアンダーフロー（指数部が-9999より小さくなった状態）となります。オーバーフローまたはアンダーフローとなった場合の結果は保証しません。

図29‒2　40けた10進浮動小数点の領域の範囲

中間結果は，演算の結果の値によって有効な40けたのけた数（精度）を保持します。図29-3および図29-4に，数字項目の加算を行う場合の例を示します。

図29‒3　数字項目の加算を行う場合の中間結果（例1）

図29‒4　数字項目の加算を行う場合の中間結果（例2）

29.4　数字項目のけた拡張機能に対応する機能一覧

ここでは，数字項目のけた拡張機能に対応する機能について説明します。

29.4.1　数字項目のけた拡張機能で対象となる機能

数字項目のけた拡張機能に対応する機能を次に示します。

表29‒3　数字項目のけた拡張機能に対応する機能

種類

機能名

けた拡張機能への対応

規格

基本機能

○

順編成ファイル

○

相対編成ファイル

○

索引編成ファイル

×

整列併合

×

プログラム間連絡

○

組み込み関数

○※1

オブジェクト指向

×

共通例外処理

○※2

再帰呼び出し

○

利用者定義関数

×

局所場所節（LOCAL-STORAGE SECTION）

○

原始文操作

○

自由形式正書法

○

TYPEDEF句とSAME AS句

○

翻訳指令

×

区分化

○

X/Open

テキスト編成ファイル

○

ファイル共用（ファイルシェア）

○

コマンド行および環境変数へのアクセス

×

画面節（SCREEN SECTION）による画面操作

×

C言語インタフェース

×

拡張機能

日本語

×

ブール（ビット処理）

×

アドレス操作

×

1バイト2進およびCOMP-X項目

×

浮動小数点データ

×

ISAMによる索引編成ファイル機能の拡張（合成キー，逆順読み）

×

CSV編成ファイル

×

HiRDBによる索引編成ファイル

○

ラージファイル入出力

○

COBOL入出力サービスルーチン

×

バイトストリーム入出力サービスルーチン

×

画面節（WINDOW SECTION）による画面操作

×

通信節による画面操作（XMAP3）

×

COPY文の接頭辞／接尾辞

○

プリンタへのアクセス

○

ファイルのディスク書き込み保証

○

報告書作成機能

×

MIOS7 COBOL85との互換機能

○

イベントログファイル出力機能

○

データコミュニケーション

×

データベース操作機能（ODBCインタフェース）

×

XDMによるデータベース操作シミュレーション機能

構造型データベース（XDM/SD）操作シミュレーション

×

リレーショナルデータベース(XDM/RD)操作シミュレーション

○

OLE2オートメーション機能

×

マルチスレッド環境での実行

○

MSMQアクセス機能

×

エンディアン切換え

○

Unicode機能

○

動的長基本項目機能

○

定数長拡張機能

○

Javaプログラム呼び出し機能

○

デバッグ機能

実行時デバッグ機能

○

テストデバッグ機能

○

カバレージ機能

○

連携機能

XML連携機能

×

Cosminexus連携機能

×

（凡例）

○：使用できる

×：使用できない

注

19〜38けたの数字項目および数字定数を指定できない個所や文については，マニュアル「COBOL2002　言語　拡張仕様編」　「21.　数字項目のけた拡張機能」を参照してください。

注※1

組み込み関数のADDR関数およびLENGTH関数の引数に，19〜38けたの数字項目，または数字編集項目を指定できます。

注※2

-MaxDigits38オプションを指定した場合，TURN指令に次の例外名は指定できません。

EC-SIZE，EC-SIZE-EXPONENTIATION，EC-SIZE-OVERFLOW，EC-SIZE-TRUNCATION，EC-SIZE-UNDERFLOW，EC-SIZE-ZERO-DIVIDE

29.4.2　数字項目のけた拡張機能で対象となるソース単位

数字項目のけた拡張機能で対象となるソース単位について，次に示します。

表29‒4　数字項目のけた拡張機能で対象となるソース単位

定義名

数字項目のけた拡張機能への対応

プログラム定義

○

関数定義

×

クラス定義

×

ファクトリ定義

×

インスタンス定義

×

メソッド定義

×

インタフェース定義

×

（凡例）

○：使用できる

×：使用できない

29.4.3　数字項目のけた拡張機能で対象となる節や文

数字項目のけた拡張機能の対象となる節や文について，次に示します。

(1)　環境部

環境部では，データ名および定数の指定できる個所に19〜38けたの数字項目，数字編集項目，および数字定数の定義や参照はできません。

(2)　データ部

数字項目のけた拡張機能の対象となる節を次に示します。

表29‒5　数字項目のけた拡張機能の対象となる節

節名

数字項目のけた拡張機能への対応

ファイル節（FILE SECTION）

○

作業場所節（WORKING-STORAGE SECTION）

○

局所場所節（LOCAL-STORAGE SECTION）

○

連絡節（LINKAGE SECTION）

○

報告書節（REPORT SECTION）

×

画面節（SCREEN SECTION）

×

画面節（WINDOW SECTION）

×

通信節（COMMUNICATION SECTION）

×

サブスキーマ節（SUBSCHEMA SECTION）

×

（凡例）

○：使用できる

×：使用できない

数字項目のけた拡張機能の対象となるファイルを次に示します。

表29‒6　数字項目のけた拡張機能の対象となるファイル

ファイル編成

数字項目のけた拡張機能への対応

順編成ファイル

○

相対編成ファイル

○

索引編成ファイル

×

テキスト編成ファイル

○

CSV編成ファイル

×

整列併合ファイル

×

報告書ファイル

×

HiRDBによる索引編成ファイル

○

（凡例）

○：使用できる

×：使用できない

数字項目のけた拡張機能の対象となるその他のデータ部の句について，次に示します。

表29‒7　数字項目のけた拡張機能の対象となるその他のデータ部の句

データ部の句

数字項目のけた拡張機能への対応

BLANK WHEN ZERO句

○

BLOCK CONTAINS句

×

DATA RECORDS句

×

EXTERNAL句

×

LINAGE句

×

OCCURS句

×

PICTURE句

記号「P」を含む場合

×

USAGE句

DISPLAY

COMPUTATIONAL-3

または

COMP-3

PACKED-DECIMAL

○

上記以外

×

VALUE句（作業場所節，局所場所節，ファイル節，連絡節）

○

（凡例）

○：使用できる

×：使用できない

(3)　手続き部

数字項目のけた拡張機能の対象となる手続き部見出しおよび手続き文について，次に示します。各手続き文の対応の詳細については，マニュアル「COBOL2002　言語　標準仕様編」およびマニュアル「COBOL2002　言語　拡張仕様編」を参照してください。

表29‒8　数字項目のけた拡張機能の対象となる手続き部見出しおよび手続き文

手続き部見出しおよび手続き文

数字項目のけた拡張機能への対応

手続き部見出しの引数と返却項目

○

ACCEPT文

×

ADD文

○

ALTER文

−

CALL文

△

CANCEL文

−

CLOSE文

−

COMMIT文

−

COMPUTE文

○

CONTINUE文

−

DELETE文

−

DISABLE文

×

DISPLAY文

△

DIVIDE文

○

ENABLE文

×

ENTER文

−

ENTRY文

○

ERASE文

×

EVALUATE文

○

EXAMINE文

×

EXIT文

−

GO TO文

×

GOBACK文

−

IF文

○

INITIALIZE文

○

INSPECT文

×

INVOKE文

×

MERGE文

×

MOVE文

○

MULTIPLY文

○

OPEN文

−

PERFORM文

△

RAISE文

−

READ文

△

RECEIVE文

×

RELEASE文

×

REPLY文

×

RESUME文

−

RETURN文

×

REWRITE文

○

ROLLBACK文

−

SEARCH文

△

SEND文

×

SET文

△

SORT文

×

START文

×

STOP文

×

STRING文

○

SUBTRACT文

○

TRANSCEIVE文

×

TRANSFORM文

×

UNLOCK文

−

UNSTRING文

×

USE文

−

WAIT文

−

WRITE文

△

（凡例）

○：使用できる

△：一部使用できない構文がある

×：使用できない

−：該当する指定がない

29.5　数字項目のけた拡張機能の注意事項

ここでは，数字項目のけた拡張機能の注意事項について説明します。

29.5.1　数字項目のけた拡張機能を使用する場合の演算結果

数字項目のけた拡張機能を使用する場合，中間結果で保持するけた数が40けたとなります。そのため，従来の1〜18けたの演算であっても，数字項目のけた拡張機能を使用しない場合と演算を含む算術式および条件式の結果が異なるときがあります。数字項目のけた拡張機能を使用しない場合の結果と合わせるときは，別の数字項目を使用して演算を分けてください。

（例）
   01 A  PIC 9(4)  VALUE  0.
   01 B  PIC 9(2)  VALUE 10.
   01 C  PIC 9(1)  VALUE  4.
          ：
   COMPUTE A = (B / C) * 100.

上記のCOMPUTE文は，次のような連続した操作に変換します。なお，tempはこのシステムが用意する中間結果項目です。

   B / C      → temp
   temp * 100 → A

数字項目のけた拡張機能を使用する場合，演算結果は次のようになります。

表29‒9　数字項目のけた拡張機能を使用する場合の演算結果

数字項目のけた拡張機能の使用有無

tempの属性

tempに設定される（B / C）の値

temp * 100の値

Aに設定される値

使用する

40けた10進浮動小数点

2.500・・・・000

（40けたの数値）

250.000・・・・000

（40けたの数値）

250

使用しない

次のけた数の数字項目※

　整数部のけた数：2

　小数部のけた数：なし

2

200

200

注※

数字項目のけた拡張機能を使用しないときの中間結果のけた数は，「5.2.4　演算の中間結果」を参照してください。

数字項目のけた拡張機能を使用する場合の計算結果を，数字項目のけた拡張機能を使用しないときと同じにするには，次のように除算（B/C）の結果を別の数字項目WK1（数字項目のけた拡張機能を使用しない場合のtempの属性と同じけた数で定義）に転記したもので演算します。

   01 A   PIC 9(4)  VALUE  0.
   01 B   PIC 9(2)  VALUE 10.
   01 C   PIC 9(1)  VALUE  4.
   01 WK1 PIC 9(2)  VALUE  0.
          ：
   COMPUTE WK1 = B / C.
   COMPUTE A = WK1 * 100.

29.5.2　内部浮動小数点項目から固定小数点形式の数字項目への転記

内部浮動小数点項目から固定小数点形式の数字項目への転記で，固定小数点形式の数字項目が内部浮動小数点項目の有効けたを超える下位のけたを持つ場合，下位のけたが大きくなるほど，誤差の影響も大きくなります。

内部浮動小数点数の小数点位置合わせに伴う誤差の影響が，けた数の拡張によって現れる例を次に示します。なお，内部浮動小数点数の有効けた数および標準けた寄せ規則については，マニュアル「COBOL2002　言語　拡張仕様編」　「6.　浮動小数点形式データを扱う機能」を参照してください。

（例）
   01 A  USAGE COMP-2    VALUE 2.0E+0.
   01 B  PIC 9(1)V9(14).
   01 C  PIC 9(1)V9(23).
          ：
   COMPUTE B = A.
   COMPUTE C = A.
          ：

 （出力結果）
   B = +200000000000000
   C = +199999999999999983222784

第10編　サービスルーチン

30　サービスルーチン

サービスルーチンは，COBOLの言語仕様にない機能を，CALL文で呼び出すプログラムとして提供しているものです。この章では，このシステムが提供しているサービスルーチンの機能と使い方について説明します。

30.1　サービスルーチンの概要

サービスルーチンは，COBOLの言語仕様にない機能を，CALL文で呼び出すプログラムとして提供しているものです。

ここでは，このシステムが提供しているサービスルーチンについて説明します。

30.1.1　プログラム実行制御

主にCOBOLプログラムの開始／終了時に，プログラムを制御するサービスルーチンです。

プログラム実行制御のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLGINT※

他言語のプログラムから呼び出したCOBOLプログラムを，GUIモードで動作させる。

2

CBLEND※

COBOLの実行環境を終了させる。

3

CBLABN

プログラムを異常終了させる。

4

CBLARGC

コマンド行に指定した引数の個数を取得する。

5

CBLARGV

コマンド行に指定した引数の内容を取得する。

6

CBLEXEC

別のアプリケーションプログラムを起動する。

7

CBLHANDLE

コンソールウィンドウのハンドル，インスタンスハンドルを取得する。

注※

COBOLプログラムのCALL文で呼び出して使用するのではなく，他言語のプログラムから呼び出して使用するサービスルーチンです。

サービスルーチンの詳細については，「30.4　プログラム実行制御」を参照してください。

30.1.2　ダイアログボックス／ウィンドウ

ダイアログボックスへの入出力，およびウィンドウへの入出力を制御するサービスルーチンです。

ダイアログボックスのサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLMESSAGE

指定した文字列を画面に表示する。

2

CBLINPUTDLG

指定した文字列を画面に表示し，入力された文字列を受け取る。

3

JCPOPUP

表形式のデータ項目を主画面とは別の画面に表示し，選ばれたブロック番号をインタフェース領域に格納する。

サービスルーチンの詳細については，「30.5　ダイアログボックス／ウィンドウ」を参照してください。

30.1.3　デバッグ機能

COBOLが使用できるアプリケーションデバッグ機能によって，異常終了時要約情報リスト，およびデータ領域ダンプリストを出力するサービスルーチンです。

デバッグ機能のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLDBGINF※

例外が発生したときに，異常終了時要約情報リストを出力する。

2

CBLDATADUMP

COBOLプログラム実行時の任意の時点でのデータ領域ダンプリストを出力する。

注※

COBOLプログラムのCALL文で呼び出して使用するのではなく，他言語のプログラムから呼び出して使用するサービスルーチンです。

サービスルーチンの詳細については，「30.6　デバッグ機能」を参照してください。

30.1.4　変換・転記・演算

特殊な変換・転記・演算をするためのサービスルーチンです。

変換・転記・演算のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLNCNV

英字・英数字・英数字編集・数字編集項目を日本語・日本語編集項目に変換する。

2

CBLUBIT

ビットデータを論理演算する。

3

CBLCNVERRORINFO

組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数のエラー情報を取得する。

サービスルーチンの詳細については，「30.7　変換・転記・演算」を参照してください。

30.1.5　画面節（SCREEN SECTIONおよびWINDOW SECTION）

画面節での画面入出力機能で使用するサービスルーチンです。

画面節のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLSGET

キーボードからの入力を1文字受け取る。

2

CBLSETTITLE

画面機能のウィンドウタイトルバーに，指定された文字列を表示する。

サービスルーチンの詳細については，「30.8　画面節（SCREEN SECTIONおよびWINDOW SECTION）」を参照してください。

30.1.6　データベース操作機能

データベース操作機能で使用するサービスルーチンです。

データベース操作機能のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLSQLERROR

SQL文によるODBCインタフェース使用時に，出力された実行時メッセージのエラー情報を取得する。

2

CBLSQLSETOPT

SQL文によるODBCインタフェース使用時に，接続オプションを設定する。

サービスルーチンの詳細については，「30.9　データベース操作機能」を参照してください。

30.1.7　COBOLの入出力機能

COBOLの入出力機能についてのサービスルーチンは次のとおりです。

COBOLで作成したファイルを他言語のプログラムから入出力するためのサービスルーチン

サービスルーチンの詳細については，「13.　COBOL入出力サービスルーチン」を参照してください。

他言語のプログラムで作成したバイナリファイルをCOBOLで入出力するためのサービスルーチン

サービスルーチンの詳細については，「15.　バイトストリーム入出力サービスルーチン」を参照してください。

30.1.8　XMAP3を使用した画面・帳票関連

XMAP3を使用した書式印刷機能（Windows(x86)COBOL2002で有効），XMAP3を使用した通信節による画面操作・帳票出力機能に関するサービスルーチンです。

サービスルーチンの詳細については，「30.10　XMAP3を使用した画面・帳票関連」を参照してください。

30.1.9　MSMQアクセス機能

COBOLプログラムからMSMQにアクセスするためのサービスルーチンです。

サービスルーチンの詳細については，「27.　MSMQアクセス機能」を参照してください。

30.1.10　その他の機能

その他の機能のためのサービスルーチンです。

その他の機能のサービスルーチンを，次に示します。

項番

サービスルーチン

機能

1

CBLPUT

画面に1文字を出力する。

2

CBLGET

キーボードから1文字を入力する。

3

CBLADTRM

終了キーを追加する。

4

CBLDLTRM

終了キーを削除する。

5

CBLCNSL

コンソールの状態を検査する。

6

CBLBELL

警告音を発信する。

7

CBLCUR

指定した位置へカーソルを移動する。

サービスルーチンの詳細については，「30.11　その他の機能」を参照してください。

30.2　戻り値の使い方

各サービスルーチンの戻り値は，COBOLプログラムではRETURN-CODE特殊レジスタで参照できます。

サービスルーチンを呼び出した直後は，戻り値を参照し，異常終了時またはエラー発生時の処理を記述しておくことを推奨します。詳細は，「30.4.5　CBLARGV」の使用例を参照してください。

30.3　サービスルーチン使用時の注意事項

サービスルーチンを使用する場合の注意事項を，次に示します。

-BigEndian,Binオプションを指定したプログラムから引数に2進項目を持つサービスルーチンの呼出しを行なう場合，引数となる2進項目はCOMP-5でなければなりません。

引数を省略したり，引数の属性や長さを誤って指定した場合，動作は保証しません。

各サービスルーチンの引数の説明では，2進形式の項目を指定する場合，「4バイトの2進項目」のように，割り当てられる項目のサイズであるバイト数を示すものがあります。

2進形式の項目では，PICTURE句で指定した項目のけた数と，その項目に割り当てられる項目のサイズは異なります。

次に関係を示します。

表30‒1　2進形式の項目のけた数とサイズ

PICTURE句で指定したけた数

項目が占めるバイト数

1〜2けた

2バイト

（1バイト2進機能，またはCOMP-X項目の場合は，1バイト）

3〜4けた

2バイト

5〜9けた

4バイト

10〜18けた

8バイト

30.4　プログラム実行制御

30.4.1　CBLGINT

CBLGINTサービスルーチンは，COBOLプログラムをGUIモードで動作させるための環境を設定するものです。このサービスルーチンは，CALL文で呼び出すのではなく，COBOL以外のプログラム内で使用します。

記述例

#include <windows.h>

extern int WINAPI CBLGINT();
                   /*CBLGINTの外部参照宣言*/

CBLGINT();         /*CBLGINTの呼び出し    */

引数

なし。

戻り値

常に0が返されます。

規則

CBLGINTサービスルーチンは，COBOLプログラムの呼び出しに先立って1回だけ呼び出さなければなりません。

COBOLプログラムを呼び出したあとにCBLGINTサービスルーチンを呼び出した場合，CBLGINTサービスルーチンは何も処理しないでリターンします。また，COBOLの実行環境は，最初に呼び出されたCOBOLプログラムのモードに従います。このため，CBLGINTサービスルーチンでは，設定済みのCOBOLプログラムのモードを変更できません。

CBLGINTサービスルーチンでGUIモードのCOBOLプログラムの環境設定をした場合，GUIモードで動作するCOBOLプログラムは，明示的または暗黙的なSTOP RUN文の実行，またはCBLENDサービスルーチンの呼び出しまで有効です。

CBLGINTサービスルーチンは，COBOL以外の言語だけから呼び出せます。

主プログラムがCOBOL以外の言語で，CBLGINTサービスルーチンを呼び出さないでCOBOLプログラムを呼び出した場合，COBOLプログラムはCUIモードで動作します。

このサービスルーチンを使用するプログラムでは，リンク時に以下のインポートライブラリを指定してください。

cbl2k_32.lib

使用例

CBLGINTサービスルーチンを使用して，Cプログラムから呼び出すCOBOLプログラムのGUIモードを設定する例を，次に示します。

C言語で記述されたWinMain関数から，COBOLプログラムをGUIモードで実行させるためのCBLGINTサービスルーチンを呼び出します。

COBOLプログラムを呼び出します。

呼び出されたCOBOLプログラムでDISPLAY文を実行すると，COBOLコンソールウィンドウに「CBLSUB1 START.」が表示されます。

30.4.2　CBLEND

CBLENDサービスルーチンは，-MainNotCBLオプションを指定してコンパイルしたプログラムが動作したときに，設定したCOBOLの実行環境を終了させるものです。

このサービスルーチンは，CALL文で呼び出すのではなく，COBOL以外のプログラム内で使用します。

記述例

#include <windows.h>

extern int WINAPI CBLEND(); /* CBLENDの外部参照宣言 */

CBLEND();                   /* CBLENDの呼び出し     */

引数

なし。

戻り値

0：正常終了した場合

-1：COBOLプログラムが動作中であるため，CBLENDサービスルーチンが無視された場合

注意事項

CBLENDサービスルーチンは，COBOLプログラムが終了したあと，1回だけ呼び出さなければなりません。

COBOLプログラム内でSTOP RUN文を実行した場合，CBLENDサービスルーチンを呼び出す必要はありません。

COBOLプログラム内でSTOP RUN文を実行したあと，CBLENDサービスルーチンを呼び出した場合，何も処理しないでリターンします。

CBLENDサービスルーチンは，COBOL以外の言語から呼び出さなければなりません。

CBLENDサービスルーチンをCOBOLプログラムから呼び出した場合，結果は保証しません。

CBLENDサービスルーチンを呼び出したあとでも，再度COBOLプログラムを呼び出せます。この場合，CBLENDサービスルーチンを呼び出す前のCOBOL実行環境が終了しているため，新たな実行環境でCOBOLプログラムが実行されます。

再度COBOLプログラムを呼び出さないで，CBLENDサービスルーチンを複数回呼び出した場合，2回目以降の呼び出しでは何も処理しないでリターンします。

このサービスルーチンを使用するプログラムでは，リンク時に次のインポートライブラリを指定してください。

cbl2k_32.lib

使用例

C言語で記述されたmain関数から，-MainNotCBLオプション指定でコンパイルしたCOBOLプログラムAPLSUBを呼び出します。

APLSUBは，COBOL副プログラムとして処理されるため，EXIT PROGRAM文で制御が戻るとき，COBOL実行環境が終了されません。

CBLENDサービスルーチンを呼び出して，COBOL実行環境を終了します。

30.4.3　CBLABN

CBLABNサービスルーチンは，利用者がプログラムを異常終了させるときに呼び出すものです。このサービスルーチンを実行すると，引数1に指定した要因コードと実行時メッセージを表示し，実行プロセスが異常終了します。

形式

CALL 'CBLABN' USING 引数1

引数

引数1には，異常終了時の要因コードを2バイトの2進項目で指定します。

戻り値

なし。

環境変数

引数1に指定した値を異常終了時の終了コードにする場合，環境変数CBLABNCODEにYESを指定してください。環境変数CBLABNCODEにYES以外を指定した場合，異常終了時の終了コードは1になります。

ただし，COBOLがプログラム（プロセスまたはスレッド）を終了しない環境（COBOLが副プログラムとして動作する場合など）では，環境変数CBLABNCODEの指定が無効となります。

規則

このサービスルーチンは，COBOLプログラムだけから呼び出せます。

このサービスルーチンは呼び出し元に制御を戻しません。

VOS3 COBOL85との互換性を保つ必要があるときは，引数1の要因コードは0〜4,095の範囲で指定します。

このサービスルーチンによってプログラムを終了させた場合，終了コードは1になります。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       WORKING-STORAGE SECTION.
       01 AB-CODE PIC S9(4) USAGE COMP. …1.
           :
       PROCEDURE DIVISION.
           :
           MOVE 100 TO AB-CODE.  …2.
           CALL 'CBLABN' USING AB-CODE.   …3.
           :

異常終了時の要因コードを2バイトの2進項目で指定します。

異常終了時の要因コードを設定します。

CBLABNサービスルーチンを呼び出します。

30.4.4　CBLARGC

CBLARGCサービスルーチンは，コマンド行に指定した引数の個数を，引数1で指定した領域に格納するものです。コマンド引数の個数は，C言語のmain関数で受け取るargcに該当します。

形式

CALL 'CBLARGC' USING 引数1

引数

引数1には，コマンド行に指定した引数の個数を受け取る領域を4バイトの2進項目で指定します。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

このサービスルーチンは，-Main,Systemオプションを指定した最外側のCOBOLプログラムだけから呼び出せます。これ以外のプログラムから呼び出した場合は，戻り値-1が返されます。

このサービスルーチンが異常終了した場合，CBLARGCに渡された引数1の内容は保証しません。

使用例

「30.4.5　CBLARGV」の使用例を参照してください。

30.4.5　CBLARGV

CBLARGVサービスルーチンは，コマンド行に指定した引数の内容を，引数2の領域に転送するものです。コマンド引数の内容は，C言語のmain関数で受け取るargvに該当します。

形式

CALL 'CBLARGV' USING 引数1 引数2

引数

引数1には，CBLARGVサービスルーチンによって受け取るコマンド引数の順序を4バイトの2進項目で指定します。

引数2には，コマンド引数の情報を受け取る領域を指定します。この項目は次の形式で定義します。

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 PARM.
         02 PARM-LENGTH PIC 9(4) USAGE COMP.  …1.
         02 PARM-AREA.
           03 PARM-AREA-DETAIL PIC X(1)
                    OCCURS 1 TO 100 TIMES  …2.
                    DEPENDING ON PARM-LENGTH.

コマンド引数の長さを格納する領域で，2バイトの2進項目で指定します。コマンド引数が100バイトを超えたときは常に100が設定されます。

コマンド引数の値を格納する領域で，最大長100バイトの可変長項目で定義します。コマンド引数が100バイトを超えたときは先頭から100バイトが格納されます。

戻り値

0：正常終了した場合

1：コマンド引数の長さが100バイトを超えた場合

2：CBLARGCで戻された引数の個数を超えた値で引数1を指定した場合，またはこのサービスルーチンに引き渡された引数1（引数の順序）に示される引数を，実行する実行可能ファイルの引数に指定していない場合

-1：エラーが発生した場合（-Main,Systemオプションを指定した最外側のCOBOLプログラム以外から呼び出した場合）

規則

このサービスルーチンは，-Main,Systemオプションを指定した最外側のCOBOLプログラムだけから呼び出せます。これ以外のプログラムから呼び出した場合は，戻り値-1が返されます。

このサービスルーチンの戻り値が0または1以外の場合，CBLARGVに渡された引数2の内容は保証しません。

引数2の領域は，コマンド引数として受け取れる最大長分の100バイトを準備する必要があります。引数2に100バイト未満の領域を指定した場合，領域を破壊することがあります。

コマンド引数の長さが100バイト未満の場合，引数2の引数格納領域の余った領域には空白が設定されます。

使用例

       IDENTIFICATION DIVISION.
             :
       DATA DIVISION.
        WORKING-STORAGE SECTION.
         77 ARGC    PIC 9(9) USAGE COMP.
         77 COUNTER PIC 9(9) USAGE COMP.
             :
         01 PARM.                              …1.
           02 PARM-LENGTH PIC 9(4) USAGE COMP. …2.
           02 PARM-AREA.                       …3.
               03 PARM-AREA-C PIC X(1)
                   OCCURS 1 TO 100
                   DEPENDING ON PARM-LENGTH.
             :
       PROCEDURE DIVISION.
             :
           CALL 'CBLARGC' USING ARGC.
           IF RETURN-CODE NOT = 0 THEN
               CBLARGC異常時の処理
           END-IF.
             :
           MOVE 1 TO COUNTER.
           PERFORM UNTIL ARGC = 0
               MOVE SPACES TO PARM-AREA
               CALL 'CBLARGV' USING COUNTER PARM
               IF RETURN-CODE NOT = 0 THEN
                  CBLARGV異常時の処理
               END-IF
               CBLARGVで受け取ったパラメタに対応する処理
               ADD 1 TO COUNTER
               SUBTRACT 1 FROM ARGC
           END-PERFORM.
             :

CBLARGVに引き渡す実引数領域です。

CBLARGVによって3.に示す引数格納領域に設定された文字列の長さを示します。最大長を超えて引数を設定したときは100が設定されます。

CBLARGVで設定する引数領域で，最大長100バイトの領域として可変長で定義します。100バイト以上の引数を指定した場合，実際のコマンドに指定した引数情報の先頭から100バイトまでが設定されます。

30.4.6　CBLEXEC

CBLEXECサービスルーチンは，COBOLプログラムから別のアプリケーションプログラムを起動するものです。

形式

CALL 'CBLEXEC' USING 引数1 引数2 引数3

引数

引数1には，プロセス起動するコマンド文字列の長さを，2バイトの2進項目で指定します。指定できる長さは1〜255バイトです。

引数2には，プロセス起動するコマンド文字列を指定します。この領域中にシステムが認識できないコードがある場合の結果は保証しません。

引数3には，次に示すインタフェース領域の名前を指定します。

表30‒2　CBLEXECサービスルーチンのインタフェース領域

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するインタフェース領域の名前を指定する。

 02 FILLER  PIC X(01).

システムの使用する領域。値はX'00'でなければならない。

 02 データ名2 PIC X(01).

起動したプロセスの終了を待つかどうかを指定する。

0：プロセスの終了を待つ。

1：プロセスの終了を待たない。

 02 データ名3 PIC X(01).

起動したプロセスのウィンドウ表示方法を指定する。

0：プロセスのデフォルトウィンドウ表示とする。

1：ウィンドウをアイコン化して表示する。

 02 FILLER  PIC X(01).

予備。値は0でなければならない。このシステムではこの領域は使用しない。

戻り値

0：正常に起動し，プロセスの終了を待たない場合

（正常に起動し，プロセスの終了を待つ場合は，呼び出したコマンドの戻り値がそのまま返ります）

-1：起動できなかった場合

規則

引数2の実際の長さより引数1中の長さが長い場合は，結果は保証しません。

引数2の実際の長さより引数1中の長さが短い場合は，引数1の長さまでがコマンド文字列とみなされます。

CBLEXECからCOBOLプログラムを呼び出したとき，プログラムの実行終了（STOP RUN文，実行時エラー）と同時にプロセスを終了させたい場合には，次の環境変数を設定します。

    CBL_BATCH=1

CBLEXECを使って呼び出したCOBOL主プログラムで設定したRETURN-CODE特殊レジスタの内容は制御が戻ってきたときに参照できます。参照できる範囲は0〜255で，RETURN-CODE特殊レジスタの下位8ビットの内容です。

引数2に空白が含まれた実行可能ファイル名を指定した場合，CALL文のときと同様の注意が必要となります。詳細は，「18.7　実行可能ファイルの呼び出し」の注意事項を参照してください。

使用例

メモ帳を呼び出す例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 EXEC-NAME-LEN PIC 9(4) USAGE COMP VALUE 29.
       01 EXEC-NAME     PIC X(29)
                  VALUE 'NOTEPAD.EXE C:¥TMP¥SAMPLE.TXT'.
       01 EXEC-PARM.
         02 FILLER    PIC X(01) VALUE X'00'.
         02 PROC-IND  PIC X(01).
         02 SHOW-WIND PIC X(01) VALUE '0'.
         02 FILLER    PIC X(01) VALUE '0'.
           :
       PROCEDURE DIVISION.
           :
           MOVE '1' TO PROC-IND.
           CALL 'CBLEXEC'
                 USING EXEC-NAME-LEN EXEC-NAME EXEC-PARM.
           IF RETURN-CODE NOT = 0 THEN
             CBLEXECエラー処理
           END-IF.
           :

30.4.7　CBLHANDLE

CBLHANDLEサービスルーチンは，COBOLのウィンドウハンドルなどを取得するものです。

形式

CALL 'CBLHANDLE' USING 引数1 引数2 引数3

引数

引数1には，コンソールウィンドウのハンドル情報を格納する領域を4バイトの2進項目※で指定します。

引数2には，インスタンスハンドルを格納する領域を4バイトの2進項目※で指定します。

引数3は予備項目であり，4バイトの2進項目※で指定します。

注※

Windows(x64) COBOL2002の場合は，8バイトの2進項目です。

戻り値

0：正常終了した場合

-1：COBOLプログラムが主プログラムでない場合，またはCUIモードで実行中の場合

規則

引数の指定，引数の属性が異なった場合の結果は保証しません。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE  SECTION.
       01 HWND   PIC 9(9) USAGE COMP.※
       01 HINST  PIC 9(9) USAGE COMP.※
       01 HDUMMY PIC 9(9) USAGE COMP.※
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLHANDLE' USING HWND HINST HDUMMY.
           IF RETURN-CODE NOT = 0 THEN
             CBLHANDLEエラー処理
           END-IF.
          ：

注※

Windows(x64) COBOL2002の場合は，「PIC 9(9)」は「PIC 9(18)」に読み替えてください。

30.5　ダイアログボックス／ウィンドウ

30.5.1　CBLMESSAGE

CBLMESSAGEサービスルーチンは，引数で指定した文字列をメッセージボックスに表示するものです。

形式

CALL 'CBLMESSAGE' USING 引数1 引数2

引数

引数1には，表示する文字列の長さを4バイトの2進項目で指定します。対応する長さは1〜1,024バイトであり，この長さ以外を指定するとエラーになります。

引数2には，表示する文字列を指定します。システムが表示できないコードが文字列中にあった場合の結果は保証しません。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

引数1で指定した長さが引数2の実際の長さより長い場合，結果は保証しません。

引数1で指定した長さが引数2の実際の長さより短い場合，引数1の長さで出力されます。

使用例

「DISPLAY TESTING」という文字列をメッセージボックスに表示する場合の例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                 :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 M-BOX-LEN PIC 9(9) USAGE COMP VALUE 15.
       01 M-BOX-DATA PIC X(15) VALUE 'DISPLAY TESTING'.
                 :
       PROCEDURE DIVISION.
           CALL 'CBLMESSAGE' USING M-BOX-LEN
                                   M-BOX-DATA.
           IF RETURN-CODE NOT = 0 THEN
               CBLMESSAGEエラー処理
           END-IF.
                 :

30.5.2　CBLINPUTDLG

CBLINPUTDLGサービスルーチンは，引数で指定した文字列をダイアログボックスに表示したあと，そのダイアログボックスから入力された文字列を受け取るものです。なお，入力用の領域に入力された文字列は，左詰めで格納されます。

形式

CALL 'CBLINPUTDLG' USING 引数1 引数2 引数3

引数

引数1には，次に示すインタフェース領域の名前を指定します。

表30‒3　CBLINPUTDLGサービスルーチンのインタフェース領域

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するインタフェース領域の名前を指定する。

  02 データ名2 PIC 9(09)
     USAGE COMP.

出力する文字列の長さを4バイトの2進項目で指定する。0〜1,024バイトまでの長さを指定できる。

  02 データ名3 PIC 9(09)
     USAGE COMP.

入力する文字列の長さを4バイトの2進項目で指定する。0〜1,024バイトまでの長さを指定できる。

引数2には，出力する文字列を格納する領域を英数字項目で指定します。

引数3には，入力した文字列を格納する領域を英数字項目で指定します。

戻り値

1：正常終了した場合（キャンセルボタンが押された）

0：正常終了した場合（OKボタンが押された）

-1：パラメタエラーが発生した場合

-2：その他のエラーが発生した場合

規則

出力文字列に関する注意

引数2に指定された文字列中に，システムが表示できないコードがあった場合の結果は保証しません。

引数1のデータ名2に指定した文字列長より，引数2に指定した出力領域長が長い場合，引数1のデータ名2に指定した文字列長で出力します。また，指定した文字列長が多バイト文字の途中で終わる場合，この文字は出力されません。

引数1のデータ名2に指定した文字列長より，引数2に指定した出力領域長が短い場合の結果は保証しません。

引数2に指定された文字列の途中にNULL（X'00'）がある場合，NULL以降の文字列は出力されません。

入力文字列に関する注意

引数1のデータ名3に指定した文字列長より，引数3に指定した入力領域長が長い場合，引数1のデータ名3に指定した文字列長で入力できます。

引数1のデータ名3に指定した文字列長より，引数3に指定した入力領域長が短い場合の結果は保証しません。

ダイアログボックスから入力された文字列長が引数1のデータ名3に指定した文字列長より短い場合，残りの入力領域は1バイトの空白文字で埋められます。

使用例

ダイアログボックスに「入力してください」と表示したあと，データをダイアログボックスから入力する例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG01.
         02 OUT-LEN PIC 9(09) USAGE COMP.
         02 IN-LEN  PIC 9(09) USAGE COMP.
       01 OUT-STR   PIC X(16).
       01 IN-AREA   PIC X(30).
                :
       PROCEDURE DIVISION.
      *** 引数情報をセット ***
           MOVE 16 TO OUT-LEN.
           MOVE '入力してください' TO OUT-STR.
           MOVE 30 TO IN-LEN.
      *** サービスルーチンを呼び出す ***
           CALL 'CBLINPUTDLG' USING ARG01 OUT-STR IN-AREA.
           IF RETURN-CODE < 0 THEN
                     CBLINPUTDLGエラー処理
           END-IF.
          :

作成したダイアログボックスの出力例を次に示します。

30.5.3　JCPOPUP

JCPOPUPサービスルーチンは，表形式のデータ項目を主画面とは別の画面に表示し，画面中でブロックカーソルを移動して選んだブロック番号をインタフェース領域に格納するものです。これを利用すると，画面上での各種のコードの入力などが目的の項目をマウスやキーで選ぶだけでできるようになります。

なお，ここで表示される画面をポップアップブロックカーソル画面といいます。

形式

CALL 'JCPOPUP' USING 引数1 引数2

引数

引数1には，次に示すインタフェース領域の名前を指定します。

表30‒4　JCPOPUPサービスルーチンのインタフェース領域

記述形式

内容

01 データ名01.

CALL文のUSINGで指定するインタフェース領域の名前を指定する。

  02 データ名02 PIC 9(02).

JCPOPUPサービスルーチンが次の戻り値を設定する。

00：正常終了した。

10：異常終了した。

  02 データ名03 PIC 9(04).

JCPOPUPサービスルーチンがブロックカーソルで選択したブロック番号を設定する（先頭を1とし，固定部分は含まない）。

  02 データ名04 PIC 9(02).

データを表示する画面上の行の番号を1〜99で指定する。※1

  02 データ名05 PIC 9(02).

データを表示する画面上のカラムの番号を1〜99で指定する。※1

  02 データ名06 PIC 9(02).

画面の行数を1〜24で指定する。

  02 データ名07 PIC 9(02).

画面の列数を1〜80で指定する。

  02 データ名08 PIC 9(02).

画面の固定領域行数を1〜24で指定する。

  02 データ名09 PIC 9(02).

画面の1ブロック（1エントリ）のサイズを指定する。

  02 データ名10 PIC X(02).

固定領域の色を指定する。

G△：緑色　W△：白色　R△：赤色　B△：青色

P△：紫色　Y△：黄色　S△：空色

  02 データ名11 PIC X(02).

ブロックカーソルの色をデータ名10と同じ形式で指定する。

  02 データ名12 PIC X(02).

可変領域の色をデータ名10と同じ形式で指定する。

  02 データ名13 PIC X(02).

可変領域の初期表示位置を指定する。

T△：先頭表示

B△：最終表示

  02 データ名14 PIC 9(04).

画面の固定領域のサイズを指定する。

  02 データ名15 PIC 9(02).

可変領域のデータ項目（1エントリ）のサイズを指定する。

  02 データ名16 PIC 9(04).

出力データのサイズ（固定領域＋可変領域）を指定する。

  02 データ名17 PIC 9(02).

JCPOPUPサービスルーチンが終了キーコードを設定する。※2

  02 データ名18 PIC X(01).

画面に枠けい線を出力するかどうかを指定する。

Y：出力する。

N：出力しない。

  02 FILLER     PIC X(09).

予備。値はX'00'でなければならない。ただし，このシステムではこの領域は使用しない。

（凡例）

△：半角空白を示す

注※1

モニタ画面の左上からの位置となります。また，1行，1列の幅は，表示する文字のフォントサイズに依存します。ただし，指定した値が不正な場合，および指定位置がモニタ画面外になる場合は，ポップアップウィンドウの出力位置はWindowsのシステムに依存します。

注※2

終了キーと終了キーコードとの対応を次に示します。

Enterキー：89

F1キー：00　F9キー：08　F17キー：53

F2キー：01　F10キー：09　F18キー：54

F3キー：02　F11キー：18　F19キー：55

F4キー：03　F12キー：19　F20キー：56

F5キー：04　F13キー：49　F21キー：57

F6キー：05　F14キー：50　F22キー：58

F7キー：06　F15キー：51　F23キー：59

F8キー：07　F16キー：52　F24キー：60

なお，F10キーは通常システムキーとして割り当てられています。これをCOBOLプログラム中で使用するためには，実行支援を使って，ユーザキーとして割り当てる必要があります。実行支援を使った画面環境の設定については，マニュアル「COBOL2002　操作ガイド」を参照してください。

引数2には，1次元の繰り返し構造（表形式）を持つレベル番号01のデータ項目の名前を指定します。

（例）

01 データ名20.
  02 FILLER  PIC  X(16)  VALUE  LOW-VALUE.
  02 表示データ項目（固定領域+可変領域）を
     表形式で指定する。 … 1.
  02 FILLER  PIC  X(nn)  VALUE  LOW-VALUE. … 2.

表示データ項目のデータは文字形式でなければなりません。文字形式でない場合，出力結果は保証しません。

nnには次のサイズを指定します。

・枠けい線機能を使用しない場合：32バイト

・枠けい線機能を使用する場合：（可変領域のサイズ／可変領域のデータ項目のサイズ）×9＋50バイト

ただし，この領域はこのシステムでは使用しません。

戻り値

なし。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ICHIRAN-GAMEN.
         02 HUKKI-CODE      PIC 9(2).
         02 BLOCK-NUMBER    PIC 9(4).  …1.
         02 Y-LOCATION      PIC 9(2) VALUE 10.
         02 X-LOCATION      PIC 9(2) VALUE 10.
         02 WINDOW-LINE     PIC 9(2) VALUE  5. …2.
         02 WINDOW-COLUMN   PIC 9(2) VALUE 20. …3.
         02 KOTEI-LINE      PIC 9(2) VALUE  2. …4.
         02 BLOCK-SIZE      PIC 9(2) VALUE 10. …5.
         02 KOTEI-COLOR     PIC X(2) VALUE 'G '.
         02 CURSOR-COLOR    PIC X(2) VALUE 'R '.
         02 KAHEN-COLOR     PIC X(2) VALUE 'B '.
         02 HYOUJI-ICHI     PIC X(2) VALUE 'T '. …6.
         02 KOTEI-SIZE      PIC 9(4) VALUE 60. …7.
         02 ENTRY-SIZE      PIC 9(2) VALUE 15. …8.
         02 DATA-SIZE       PIC 9(4) VALUE 210. …9.
         02 END-KEY         PIC 9(2). …10.
         02 WAKU-KEISEN     PIC X(1) VALUE 'Y'. …11.
         02 FILLER          PIC X(9) VALUE LOW-VALUE.
       01 ICHIRAN-DATA.
         02 FILLER          PIC X(16) VALUE LOW-VALUE.
         02 HD1             PIC X(15) VALUE 'コード一覧'.
         02 HD2             PIC X(15) VALUE SPACE.
         02 HD2             PIC X(15) VALUE SPACE.
         02 HD2             PIC X(15) VALUE SPACE.
         02 ATEM            PIC X(15) OCCURS 10 TIMES.
         02 FILLER          PIC X(140) VALUE LOW-VALUE.
           :
       PROCEDURE DIVISION.
           :
           MOVE '1:AAA' TO ATEM(1).
           MOVE '2:BBB' TO ATEM(2).
           :
           MOVE '10:JJJ' TO ATEM(10).
           CALL 'JCPOPUP' USING ICHIRAN-GAMEN ICHIRAN-DATA.
           :

上記の指定によって表示されるポップアップブロックカーソル画面を次に示します。図中の数字は，プログラム中のコメントに記載している数字の個所と対応しています。

固定領域には，表示データ項目の先頭から固定領域のサイズ分（7.）の文字が，固定領域に表示できる分（3.×4.）だけ表示されます。

可変領域には，表示データ項目のうち，可変領域のサイズ（表示データ項目のサイズ（9.）−固定領域のサイズ（7.））分の文字が，可変領域のデータ項目のサイズ（8.）ごとに区切って各ブロックに表示されます。ただし，表示されるのは各項目とも先頭から1ブロック分のサイズ（5.）までで，はみ出す部分は表示されません。なお，上図で表示されていない"7：GGG"以降の項目はスクロールによって表示できます。

上記の画面で［↑］キー，［↓］キー，［←］キー，［→］キー，またはマウスでブロックカーソルを移動すると，ブロックを選べます。そのあと，終了キーを押すかマウスでダブルクリックすると，画面が閉じ，選んだブロックの番号がBLOCK-NUMBERの領域（1.）に格納されます。

また，このとき押された終了キーに対応する終了キーコードが10.の領域に格納されます。ダブルクリックで終了した場合の終了キーコードは89です。

CBLJCPOPENDKEY

JCPOPUPサービスルーチンの終了キーを拡張したい場合，環境変数CBLJCPOPENDKEYにYESを指定します。拡張される終了キーと終了キーコードの対応を次に示します。なお，これらのキーはメニューに反映されず，キー操作だけ有効となります。

［Alt］+［F1］キー：10　［PageDown］キー：24

［Alt］+［F2］キー：11　［PageUp］キー：25

［Alt］+［F3］キー：12　［Alt］+［↑］キー：26

［Alt］+［F4］キー：13　［Alt］+［↓］キー：27

［Alt］+［F5］キー：14　［Alt］+［←］キー：28

［Alt］+［F6］キー：15　［Alt］+［→］キー：29

［Alt］+［F7］キー：16　［Alt］+［F8］キー：17

この環境変数の指定する値を指定しなかった場合や，YES以外を指定した場合，終了キーは拡張されません。

30.6　デバッグ機能

30.6.1　CBLDBGINF

CBLDBGINFサービスルーチンは，COBOL以外のプログラムからCOBOLプログラムを呼ぶ場合，COBOLプログラムの例外発生時に異常終了時要約情報リストを出力するものです。

このサービスルーチンは，CALL文で呼び出すのではなく，C言語の構造化例外処理のフィルタ式から呼び出す必要があります。

記述例

#include <windows.h>
extern int WINAPI CBLDBGINF(DWORD);
                       /* CBLDBGINF 外部参照宣言 */
         :
  CBLDBGINF(GetExceptionCode())
         :

引数

発生した例外の種類を識別するコードを引数にします。GetExceptionCode()関数の戻り値をそのまま指定します。

戻り値

構造化例外のフィルタ式の評価結果の値を戻します。

EXCEPTION_CONTINUE_SEARCH

例外コードがEXCEPTION_BREAKPOINT，またはEXCEPTION_SINGLE_STEPの場合

EXCEPTION_EXECUTE_HANDLER

例外コードが上記の二つ以外だった場合

なお，上記のEXCEPTION_CONTINUE_SEARCHおよびEXCEPTION_EXECUTE_HANDLERの詳細については，CまたはC++の各マニュアルの構造化例外処理に関する個所を参照してください。

規則

このサービスルーチンは，Cプログラムの構造化例外処理のフィルタ式から呼び出す必要があります。その他の方法によって呼び出した場合，実行時の動作は保証しません。

異常終了時要約情報リストには，-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，または-DebugRangeオプションを指定してコンパイルしたプログラムの情報が出力されます。リストの出力内容，および出力先については，「37.2　異常終了時要約情報リスト」を参照してください。

戻り値がEXCEPTION_EXECUTE_HANDLERのとき，CBLDBGINFは異常終了時要約情報リストを出力しません。

このサービスルーチンを使用するプログラムでは，リンク時に以下のインポートライブラリを指定してください。

cbl2k_32.lib

注意事項

COBOL2002が動作していない環境でCBLDBGINFを呼び出した場合，エラーメッセージが表示されます。

使用例

CBLDBGINFサービスルーチンを呼び出す例を，次に示します。

#include <windows.h>
extern int WINAPI CBLDBGINF();
                       /* CBLDBGINF 外部参照宣言 */

_try{
 COBOL_SUB( );           /* COBOLプログラム実行 */
}

/* フィルタ式でのCBLDBGINF呼び出し */
_except (CBLDBGINF(GetExceptionCode())){
  /* 例外ハンドラブロック　例外発生時の処理をする */
         :
         :
}

30.6.2　CBLDATADUMP

CBLDATADUMPサービスルーチンは，COBOLプログラム実行時の任意の時点でのデータ領域ダンプリストを出力するサービスルーチンです。

通常は，COBOLプログラムが異常終了したときにデータ領域ダンプリストを出力しますが，CBLDATADUMPサービスルーチンによって，プログラム実行中に異常終了時と同様のデータ領域ダンプリストを出力できます。これにより，異常終了時だけでなく，プログラム実行中の任意の時点のデータ領域の状態を求めることができます。

データ領域ダンプリストには，CBLDATADUMPサービスルーチンを呼び出すまでに実行されたすべてのプログラムのうち，デバッグ対象プログラムのデータ領域の状態が出力されます※。

データ領域ダンプリストは，CBLDATADUMPサービスルーチンを実行するごとに追加書きされるので，各時点のデータをトレース情報として保持できます。

データ領域ダンプリストについては，「37.3　データ領域ダンプリスト」を参照してください。

CBLDATADUMPサービスルーチンは，次に示す場合に実行します。

COBOLプログラムのデバッグ時に，ある状態のデータ領域の内容を参照する場合

COBOLプログラムのデバッグ時に，データ領域の内容の遷移を確認する場合

COBOLプログラムが異常終了したときに，データ領域の内容の遷移を採取し，異常終了の原因を調査する場合

注※

デバッグ対象プログラムは，次のどれかのコンパイラオプションを指定したプログラムを示します。どのプログラムをデータ領域ダンプリストに出力するかは，これらのコンパイラオプションの指定有無によって切り分けることができます。

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRange

デバッグ対象プログラムであっても，プログラムの実行状態などによって，情報が出力されない場合があります。例えば，実行後にCANCELされたプログラムはダンプ出力の対象となりません。情報出力の対象となるプログラムの実行状態については，規則のデータ領域ダンプリスト出力の対象となるプログラムを参照してください。

記述例

CALL  'CBLDATADUMP'

引数

なし。

戻り値

戻り値は次のように設定されます。

0：正常終了した場合

1：環境変数CBLDATADUMPFILEが指定されていない場合

2：どのプログラムのデータ状態も出力されなかった場合

どのプログラムのデータ状態も出力されなかった場合，データ領域ダンプリストにはヘッダだけが出力されます。次の場合に該当します。

1回以上実行されたプログラムにデバッグ対象プログラムがない場合

実行されたすべてのデバッグ対象プログラムが，規則のデータ領域ダンプリスト出力の対象となるプログラムではなく，EXTERNAL句を指定したファイル名およびデータ名の出力もない場合

-1：データ領域ダンプリストの出力中にエラー※が発生した場合

注※

次の要因が考えられます。

環境変数CBLDATADUMPFILEで指定したファイルが開けない

データ領域ダンプリストの出力処理中に入出力エラーが発生した

環境変数CBLDATADUMPFILEで指定したファイルを閉じられない

規則

データ領域ダンプリストの出力先は，環境変数CBLDATADUMPFILEで指定します。環境変数CBLDATADUMPFILEの指定がない場合，または出力先が指定されていない場合，データ領域ダンプリストは出力されません。環境変数CBLDATADUMPFILEの指定方法については，「37.3.2　データ領域ダンプリストの出力先」を参照してください。

データ領域ダンプリストの出力対象とするプログラムは，プログラム翻訳時に次のどれかのコンパイラオプションの指定が必要です。

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRange

データ領域ダンプリスト出力の対象となるのは次のプログラムです。

・1回以上実行され，CANCEL文で取り消されていないプログラム

・1回以上実行された利用者定義関数

・CBLDATADUMPサービスルーチン実行時に動作中のメソッド

・CBLDATADUMPサービスルーチン実行時に動作中のメソッドを含むクラス

注意事項

データ領域ダンプリストは追加書きのため，古い情報が残ります。そのため，不要なデータ領域ダンプリストは削除してください。

使用例

CBLDATADUMPサービスルーチン呼び出しの例を次に示します。

       IDENTIFICATION  DIVISION.
       PROGRAM-ID.  SAMPLE1.
              ：
       DATA  DIVISION.
       WORKING-STORAGE  SECTION.
       01 DATA1 PIC S9(4).
       01 DATA2 PIC S9(4) VALUE 1.
       01 DATA3 PIC S9(4) VALUE 0.
              ：
       PROCEDURE  DIVISION.
         MOVE 1 TO DATA1.･･･････････････････････････････1.
         CALL  'CBLDATADUMP'.･･･････････････････････････2.
         IF  RETURN-CODE NOT = 0 THEN
             DISPLAY 'CBLDATADUMPが失敗しました。'
         END-IF.
              ：
         MOVE 100 TO DATA1.･････････････････････････････3.
         CALL  'CBLDATADUMP'.･･･････････････････････････4.
         IF  RETURN-CODE NOT = 0 THEN
             DISPLAY 'CBLDATADUMPが失敗しました。'
         END-IF.
              ：

データ領域の内容を設定します。

CBLDATADUMPサービスルーチンを呼び出し，データ領域ダンプリストを出力します。

データ領域の内容を更新します。

CBLDATADUMPサービスルーチンを呼び出し，データ領域ダンプリストを出力します。2.で出力したデータ領域ダンプリストと比較し，各データが正しく更新できていることを確認します。

30.7　変換・転記・演算

30.7.1　CBLNCNV

CBLNCNVサービスルーチンは，英字項目・英数字項目・英数字編集項目・数字編集項目を日本語項目・日本語編集項目に変換するものです。

形式

CALL 'CBLNCNV' USING 引数1 引数2 引数3

引数

引数1には，次に示すインタフェース領域の名前を指定します。

表30‒5　CBLNCNVサービスルーチンのインタフェース領域

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するインタフェース領域の名前を指定する。

 02 データ名2.

転記インジケータの名前を指定する。

  03 データ名3 PIC X(01).

ALL指定※の有無を指定する。

0：ALL指定なし。

1：ALL指定あり。

  03 データ名4 PIC X(01).

送り出し側作用対象のデータ属性を指定する。

0：英字，英数字，英数字編集，数字編集項目

1：数字項目

  03 データ名5 PIC X(01).

受け取り側作用対象のデータ属性を指定する。

0：日本語項目

1：日本語編集項目

  03 FILLER   PIC X(01).

予備。値は0でなければならない。このシステムではこの領域は使用しない。

 02 データ名6 PIC 9(8)
                USAGE COMP.

送り出し側作用対象の項目のけた数を指定する。

 02 データ名7 PIC 9(8)
                USAGE COMP.

受け取り側作用対象の項目のけた数を指定する。

注※

ALL指定は，COBOLの言語仕様のALL定数と同じように扱われます。ALL指定がある場合，変換後のデータは，変換前のデータのデータ名6で指定したけた数の何回かの繰り返しによって，データ名7で指定したけた数まで生成されます。ALL指定がない場合は，データ名6で指定したけた数しか変換しません。

引数2には，変換前のデータを指定します。

引数3には，変換後のデータが格納されます。

戻り値

0：正常終了した場合

-1：パラメタエラーが発生した場合

-2：コード変換のための環境が整っていない場合（Unicode機能を使用する場合）

-3：コード変換ライブラリでエラーが発生した場合（Unicode機能を使用する場合）

変換規則（シフトJISを使用する場合）

このサービスルーチンでの変換規則を次に示します。

次の半角文字はそのまま同じ全角文字に変換します。

⁻（半角オーバライン）は全角の「〜」に変換します。

'（アポストロフィ）は全角の「’」（X'8166'）に変換します。

"（引用符）は全角の「"」（X'8168'）に変換します。

次の文字は半角の空白2個（X'2020'）に変換します。

`（アクサングラーブ，X'60'）　X'01'〜X'0F'

X'10'〜X'1F'　X'80'　X'A0'　X'FD'　X'FE'

X'00'は，X'0000'に変換します。

X'7F'およびX'FFは，X'FFFF'に変換します。

半角の空白が偶数個のときは変換しません。

半角の空白が奇数個のときは，受け取り側作用対象が日本語項目か日本語編集項目かによって次のように異なります。

・受け取り側作用対象が日本語項目のときは，最後の1個を全角の空白（X'8140'）に変換します。

・受け取り側作用対象が日本語編集項目のときは，最後に半角の空白（X'20'）を追加します。

次の文字は変換しません。

全角文字　X'81'〜X'8F'　X'90'〜X'9F'　X'E0'〜X'EF'

X'F0'〜X'FC'

このとき，受け取り側作用対象の項目の後ろの空き領域には半角の空白（X'20'）を埋めます。

一般規則（シフトJISを使用する場合）

規則に反した引数を指定した場合の結果は保証しません。

使用例（シフトJISを使用する場合）

半角の"AAAA"を全角の"ＡＡＡＡ"に変換する場合の使用方法を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
             :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 EISUU PIC X(4) VALUE 'AAAA'.
       01 NIHON PIC N(4).
       01 CHECK-PARM.
         02 CHECK-IND.
           03 CHECK-ALL PIC X(01).
           03 CHECK-TYP PIC X(01).
           03 CHECK-UKE PIC X(01).
           03 FILLER    PIC X(01)  VALUE  '0'.
         02  CHECK-LNG1 PIC 9(08) USAGE COMP.
         02  CHECK-LNG2 PIC 9(08) USAGE COMP.
             :
       PROCEDURE DIVISION.
             :
           MOVE '0' TO CHECK-ALL CHECK-TYP CHECK-UKE.
           MOVE  4  TO CHECK-LNG1.
           MOVE  4  TO CHECK-LNG2.
           CALL 'CBLNCNV' USING CHECK-PARM EISUU NIHON.
           IF RETURN-CODE NOT = 0 THEN
               CBLNCNVエラー処理
           END-IF.
             :

変換規則（Unicode機能を使用する場合）

Unicode機能については，「28.　Unicode機能」を参照してください。

このサービスルーチンでの変換規則を次に示します。

次の半角文字（UTF-8）は，該当する全角文字（UTF-16）に変換します。UTF-16への変換は，実行時環境変数CBLUNIENDIANの設定に従いUTF-16LE，またはUTF-16BEに変換します。

⁻（半角オーバライン）は全角の「〜」に変換します。

'（アポストロフィ）は全角の「’」（X'2019'）に変換します。

"（引用符）は全角の「”」（X'201D'）に変換します。

次の文字は半角空白1個※1に変換します。

`（アクサングラーブ，X'60'）　X'01'〜X'0F'　X'10'〜X'1F'

X'00'はX'0000'に変換します。

X'7F'はX'FFFF'に変換します。

半角の空白（X'20'）が偶数個のときは全角変換※1しません。

半角空白が奇数個のときは，受け取り側作用対象が日本語項目か日本語編集項目かによって次のように異なります。

・受け取り側作用対象が日本語項目のときは，最後の1個を全角の空白※2に変換します。

・受け取り側作用対象が日本語編集項目のときは，最後に半角の空白※1を追加します。

全角文字（UTF-8）は，対応する全角文字（UTF-16）へ変換します。

注※1

半角空白の文字コードは，UTF-16LEのときはX'2000'，UTF-16BEのときはX'0020'となります。

注※2

全角空白の文字コードは，UTF-16LEのときはX'0030'，UTF-16BEのときはX'3000'となります。

一般規則（Unicode機能を使用する場合）

規則に反した引数を指定した場合の結果は保証しません。

使用例（Unicode機能を使用する場合）

半角の"[図データ]"を全角の"ＡＡアア"に変換する場合の使用方法を次に示します。

用途がDISPLAYの項目の領域は，文字コードを意識して設定してください。シフトJISとUTF-8では必要とする領域のサイズが異なります。半角かたかなの場合，シフトJISでは1文字が1バイトですが，UTF-8では1文字が3バイトとなります。

       IDENTIFICATION  DIVISION.
       PROGRAM-ID.  SAMPLE1.
                ：
       DATA  DIVISION.
       WORKING-STORAGE  SECTION.
       01  EISUU  PIC  X(8)  VALUE  '[図データ]'.
       01  NIHON  PIC  N(4).
       01  CHECK-PARM.
         02  CHECK-IND.
           03  CHECK-ALL  PIC  X(01).
           03  CHECK-TYP  PIC  X(01).
           03  CHECK-UKE  PIC  X(01).
           03  FILLER       PIC  X(01)  VALUE  '0'.
         02  CHECK-LNG1     PIC  9(8)  USAGE  COMP.
         02  CHECK-LNG2     PIC  9(8)  USAGE  COMP.
                ：
       PROCEDURE  DIVISION.
                ：
           MOVE  '0'  TO  CHECK-ALL  CHECK-TYP  CHECK-UKE.
           MOVE   8   TO  CHECK-LNG1.
           MOVE   4   TO  CHECK-LNG2.
           CALL  'CBLNCNV'  USING  CHECK-PARM  EISUU  NIHON.
           IF  RETURN-CODE  NOT = 0  THEN
               *> CBLNCNVエラー処理
           END-IF.
                ：

30.7.2　CBLUBIT

CBLUBITサービスルーチンは，ビットデータを論理演算するものです。

形式

CALL 'CBLUBIT' USING 引数1 引数2 引数3 引数4

引数

引数1には，第一演算項のデータを1バイトの英数字項目で指定します。

引数2には，第二演算項のデータを1バイトの英数字項目で指定します。

引数3には，次の演算命令コードを指定します。

A：AND（論理積）

O：OR（論理和）

X：XOR（排他的論理和）

引数4には，演算結果が格納されます。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

引数1〜4が1バイト以上の長さの場合，先頭の1バイトだけが有効となります。

使用例

X'00'とX'FF'の論理積を求める場合の使用例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
            :
       DATA DIVISION.
       WORKING-STORAGE  SECTION.
       01 OP-1 PIC X(01) VALUE X'00'.
       01 OP-2 PIC X(01) VALUE X'FF'.
       01 OP-3 PIC X(01) VALUE 'A'.
       01 OP-4 PIC X(01).
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLUBIT' USING OP-1 OP-2 OP-3 OP-4.
           IF RETURN-CODE NOT = 0 THEN
               CBLUBITエラー処理
           END-IF.
           :

30.7.3　CBLCNVERRORINFO

CBLCNVERRORINFOサービスルーチンは，直前に実行された組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数のエラー情報を取得するものです。

形式

CALL 'CBLCNVERRORINFO' USING 引数1 引数2 引数3

引数

引数1には，4バイトの符号なし2進項目を指定します。

引数2には，4バイトの符号なし2進項目を指定します。

引数3には，4バイトの符号付き2進項目を指定します。

戻り値

0：正常終了した場合

100：エラー情報がなかった場合

規則

このサービスルーチンでエラー情報を取得するためには，-FunctionECSup,CodeConvErrオプションを指定して，組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数が記述されたCOBOLソースをコンパイルする必要があります。

引数1には，実行時エラーのメッセージ番号が格納されます。このサービスルーチンで取得できるのは，次の表に示す実行時メッセージに対応するエラー情報です。直前の組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数で，これらの実行時メッセージが出力されていない場合，サービスルーチンはエラーの戻り値100を返します。

表30‒6　引数1に格納されるメッセージ番号

実行時メッセージ

引数1に格納される値

KCCC2313R-W

2313

KCCC2314R-W

2314

KCCC2315R-W

2315

引数2には，組み込み関数の引数に指定されたデータのうち，コード変換失敗の要因となったデータの位置情報が格納されます。引数1が2315以外の場合，引数2には0が格納されます。

引数3には，コード変換失敗の要因となったコード変換ライブラリの関数が返した戻り値が格納されます。戻り値の内容については，コード変換ライブラリのマニュアルのCodeConvString関数に関する説明を参照してください。

戻り値が0以外の場合，引数1，引数2，および引数3の内容は変更されません。

注意事項

取得できるエラー情報は，直前に実行された組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数のエラー情報です。コード変換が失敗する組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数を実行したあとから，このサービスルーチンを呼び出す前までの間に，正常終了する組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数を実行した場合，エラー情報は取得できません。

使用例

       IDENTIFICATION   DIVISION.
       PROGRAM-ID.      SAMPLE1.
       DATA             DIVISION.
       WORKING-STORAGE  SECTION.
       01 ALNUM-DATA    PIC X(10).
       01 NATIONAL-DATA PIC N(10).
      *エラー情報取得用
       01 ERR-NUMBER  PIC 9(9)  USAGE COMP.
       01 ERR-OFFSET  PIC 9(9)  USAGE COMP.
       01 ERR-RETCODE PIC S9(9) USAGE COMP.
       01 戻り値      PIC S9(9) USAGE COMP.
       PROCEDURE DIVISION.
                :
           *>NATIONAL-OF関数で呼び出し
           MOVE FUNCTION NATIONAL-OF(ALNUM-DATA) TO NATIONAL-DATA.
           *>NATIONAL-OF関数呼び出し直後にサービスルーチン呼び出し
           CALL 'CBLCNVERRORINFO' USING ERR-NUMBER
                                        ERR-OFFSET
                                        ERR-RETCODE.
                :
           MOVE RETURN-CODE TO 戻り値.
                :
           IF 戻り値 = 0
             THEN
               *> NATIONAL-OF関数で発生したエラーに対する処理
                :
             ELSE
               *> NATIONAL-OF関数で正常実行後の処理
           END-IF.

30.8　画面節（SCREEN SECTIONおよびWINDOW SECTION）

30.8.1　CBLSGET

CBLSGETサービスルーチンは，キーボードからの入力を1文字受け取るものです。

形式

CALL 'CBLSGET' USING 引数1

引数

引数1には，入力された文字を格納する領域を指定します。

この項目は，1バイトの英数字項目でなければなりません。入力された文字は，対応するコードに変換されて，格納されます。入力文字とコードとの対応については，「図30‒1　入力文字とコードとの対応」を参照してください。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

このサービスルーチンを呼び出す前に，CBLCURサービスルーチンでカーソルを位置づけておかないと，入力するときのカーソル位置が不定となります。

このサービスルーチンは，画面節（WINDOW SECTION）の実行中には呼び出せません。呼び出した場合，実行時エラーになります。

画面節（SCREEN SECTION）を実行中のときは，呼び出せます。

全角文字を入力した場合，引数1にはNULL（X'00'）が格納されます。

［Alt］キー，［Ctrl］キー，および［Shift］キーなど，制御文字を入力した場合，入力は終了しません。

入力文字とコード

入力された文字とコードとの対応を次に示します。

図30‒1　入力文字とコードとの対応

30.8.2　CBLSETTITLE

CBLSETTITLEサービスルーチンは，画面節（SCREEN SECTIONおよびWINDOW SECTION）の画面機能で，ウィンドウのタイトルバーに指定された文字列を表示するものです。

形式

CALL 'CBLSETTITLE' USING 引数1 引数2

引数

引数1には，表示する文字列の長さを，バイト数で指定します。2バイトの2進項目で指定します。指定できる文字列の長さは，1〜1,024バイトです。

引数2には，表示する文字列を指定します。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

画面機能のウィンドウが表示されていないときにこのサービスルーチンを呼び出すと，ウィンドウが開いたときにタイトルバーに反映されます。

このサービスルーチンを使って文字列を表示すると，すでにタイトルバーに表示されていた文字列は消去されます。

引数1で指定した長さが，引数2で指定した文字列の長さよりも長い場合，実行時の結果は保証しません。

引数1で指定した長さが，引数2で指定した文字列の長さよりも短い場合，引数1で指定した長さだけ出力されます。

引数2で指定した文字列の中に，システムが表示できないコードが含まれていた場合，実行時の動作は保証しません。

引数2で指定した文字列の中に，NULL（X'00'）が含まれていた場合，NULL以降の文字列は出力されません。

30.9　データベース操作機能

30.9.1　CBLSQLERROR

CBLSQLERRORサービスルーチンは，埋め込みSQL文によるODBCインタフェース機能の使用時に，出力された実行時メッセージのエラー情報（COBOLメッセージ番号，SQLSTATE，SQLエラーコード）を取得します。

形式

CALL 'CBLSQLERROR' USING 引数1

引数

引数1は，取得する実行時エラーメッセージのエラー情報を指定します。この項目は次の形式の集団項目とします。

表30‒7　CBLSQLERRORサービスルーチンのインタフェース領域

記述形式

内容

01 データ名01.

CALL文のUSINGで指定するエラー情報取得領域の名前を指定する。

 02 データ名02 PIC S9(9)
                USAGE COMP.

COBOLメッセージ番号

 02 FILLER    PIC X(7).

予備。このサービスルーチンを呼び出す前にLOW-VALUE(X'00')を設定しなければならない。

 02 データ名03 PIC X(5).

SQLSTATE

 02 データ名04 PIC S9(9)
                USAGE COMP.

SQLエラーコード

 02 FILLER    PIC X(516).

予備。このサービスルーチンを呼び出す前にLOW-VALUE(X'00')を設定しなければならない。

戻り値

0：エラー情報が取得できた場合

100：エラー情報がない場合

-1：エラー情報の取得に失敗した場合

規則

CBLSQLERRORサービスルーチンを呼び出すと，直前に実行された埋め込みSQL文で出力されたエラーメッセージに対するエラー情報（COBOLメッセージ番号，SQLSTATE，SQLエラーコード）が引数1に設定されます。また，SQL文実行時のエラーメッセージ出力抑止の環境変数を指定した場合でも，抑止されたメッセージのエラー情報が設定されます。引数1に設定されるエラー情報を次に示します。

表30‒8　引数1に設定されるエラー情報の説明

エラー情報

説明

COBOLメッセージ番号

直前に実行された埋め込みSQL文で出力されたKCCC8000R-SからKCCC8026R-Sのメッセージ番号が設定されます。メッセージについては，マニュアル「COBOL2002　メッセージ」を参照してください。

SQLSTATE

ODBCドライバマネージャが返す診断コードが設定されます。詳細については，使用しているODBCドライバまたはDBMSのマニュアルを参照してください。

SQLエラーコード

データソース固有のネイティブエラーコードが設定されます。詳細については，使用しているODBCドライバまたはDBMSのマニュアルを参照してください。

CBLSQLERRORサービスルーチンの戻り値は，RETURN-CODE特殊レジスタで参照できます。

SQLSTATEおよびSQLエラーコードは，実行時メッセージKCCC8002R-SまたはKCCC8007R-Wが出力された場合に設定されます。それ以外の実行時メッセージの場合は，SQLSTATEには空白，SQLエラーコードには0が設定されます。

直前に実行された埋め込みSQL文で複数のエラーメッセージが出力された場合，CBLSQLERRORサービスルーチンの戻り値が100になるまで繰り返し呼び出すことで，すべてのエラー情報を取得できます。CBLSQLERRORサービスルーチンの戻り値が100の場合，COBOLメッセージ番号，SQLエラーコードは0，SQLSTATEには空白が設定されます。

埋め込みSQL文を実行しないでCBLSQLERRORサービスルーチンを実行すると，戻り値は100を返します。

CBLSQLERRORサービスルーチンでエラーが発生し，エラー情報の取得に失敗した場合，戻り値は-1を返します。

暗黙的に実行されるSQL文（DISCONNECT文での暗黙的なCOMMIT文など）でエラーが発生した場合でも，CBLSQLERRORサービスルーチンはエラー情報を取得します。暗黙的に実行されるSQL文は，マニュアル「COBOL2002　言語　拡張仕様編」　「9.　データベースアクセス機能」の各SQL文の一般規則を参照してください。

注意事項

引数の指定，および形式が「表30‒7　CBLSQLERRORサービスルーチンのインタフェース領域」と異なる場合の動作は保証しません。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
                :
       01  OP-1.
         02 ERR-MSGNUMBER     PIC S9(9) USAGE COMP.
         02 FILLER            PIC X(7)   VALUE LOW-VALUE.
         02 ERR-SQLSTATE      PIC X(5).
         02 ERR-SQLERRORCODE  PIC S9(9) USAGE COMP.
         02 FILLER            PIC X(516) VALUE LOW-VALUE.
       01  STMT-PROC          PIC X(20).
       01  戻り値             PIC S9(9) USAGE COMP.
                :
       EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 ODBC-DSN            PIC X(10) VALUE 'サンプル'.
       01 ODBC-UID            PIC X(10) VALUE 'sa'.
       01 ODBC-PWD            PIC X(10) VALUE SPACE.
       EXEC SQL END DECLARE SECTION END-EXEC.
            :
       PROCEDURE DIVISION.
                :
      *>SQL文を実行できたかどうかを<埋め込み例外宣言>にて判断します。
           EXEC SQL
                WHENEVER SQLERROR PERFORM :エラー処理  … 1.
           END-EXEC.
                :
      *>データソースに接続する。
           MOVE 'データソースへの接続' TO STMT-PROC.  … 2.
           EXEC SQL
                CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD
                    USING :ODBC-DSN
           END-EXEC.
                :
      *>表を参照する。
           MOVE '表のデータ参照' TO STMT-PROC.  … 2.
           EXEC SQL
                SELECT  … 3.
           END-EXEC.
                :
      *>データソースから切断する。
           MOVE 'データソースから切断' TO STMT-PROC.  … 2.
           EXEC SQL
                DISCONNECT
           END-EXEC.
           STOP RUN.
                ：
       エラー処理.    … 4.
           PERFORM WITH TEST AFTER UNTIL 戻り値 NOT = ZERO
             CALL 'CBLSQLERROR' USING OP-1
             MOVE RETURN-CODE TO 戻り値
             EVALUATE 戻り値
               WHEN  0
                 DISPLAY STMT-PROC … 5.
      *>              ＜＜ エラー情報判定，リカバリ処理 ＞＞
                                 :
               WHEN  -1
                 DISPLAY 'CBLSQLERRORが失敗しました。'
             END-EVALUATE
           END-PERFORM.
                :

上記の例では，3.の埋め込みSQL文実行でエラーが発生した場合に，1.の埋め込み例外宣言の指定によって，4.のエラー処理段落が実行されます。ここでCBLSQLERRORサービスルーチンを呼び出し，エラー情報を取得します。2.のように埋め込みSQL文実行ごとに，実行状態を退避しておくと，5.で，どの実行状態でエラーが発生したかがわかります。

30.9.2　CBLSQLSETOPT

CBLSQLSETOPTサービスルーチンは，埋め込みSQL文によるODBCインタフェース機能の使用時に，SQLSetConnectOption関数で接続関連を制御するオプションを設定します。

形式

CALL 'CBLSQLSETOPT' USING 引数1 引数2

引数

引数1は，オプション種別を設定する128バイトの英数字項目です。

引数2は，引数1に関連づけられた値を4バイトの符号なし2進項目で指定します。引数1に指定するオプション種別に対して引数2に設定できる値を次に示します。

表30‒9　CBLSQLSETOPTサービスルーチンで設定できるオプション

引数1の設定値と機能

引数2の設定値と機能

注意事項

設定値

機能

SQL_COPT_SS_ENLIST_IN_XA

SQL Server Version 6.5以降の分散トランザクションのX/OpenのXAトランザクションを行います。

1

XAトランザクションをODBC接続に関連づけます。

この指定によってXAトランザクションをODBC接続に関連づけた場合，COMMIT，ROLLBACK文によるトランザクション管理はできません。それまでのトランザクションは，コミットされます。

0

XAトランザクションを終了します。

戻り値

0：正常終了した場合

-1：引数に誤りがある場合

-2：メモリ不足が発生した場合

規則

引数の属性，および引数に指定する値が上記と異なる場合の結果は保証しません。

SQLSetConnectOption関数でODBCの接続関連を制御するオプションを設定する場合

CBLSQLSETOPTサービスルーチンで指定した接続オプションは，直後に実行されるSQL文で設定されます。SQLSetConnectOption関数実行のタイミングを次に示します。

CONNECT文，またはSET CONNECTION文の場合

CONNECT文，またはSET CONNECTION文の処理後に関数を実行します。

CONNECT文，またはSET CONNECTION文以外のSQL文

各SQL文の処理に先立って関数を実行します。

指定した接続オプションの設定時に接続されている現行コネクションのデータソースが，該当するデータベースでない場合，その実行は保証しません。

使用例

SQLSetConnectOption関数でODBCの接続関連を制御するオプションを設定する場合

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                :
       DATA DIVISION.
        WORKING-STORAGE SECTION.
                :
        01 OP-1 PIC X(128).
        01 OP-2 PIC 9(9) USAGE COMP.
                :
       PROCEDURE DIVISION.
                :
           *> XAトランザクションをODBC接続に関連づける
           MOVE 'SQL_COPT_SS_ENLIST_IN_XA' TO OP-1.
           MOVE 1 TO OP-2.

           CALL 'CBLSQLSETOPT' USING OP-1 OP-2.
           IF RETURN-CODE NOT = 0 THEN
             *> エラー処理
           END-IF.
           EXEC SQL … 1.
             SELECT
                :

CBLSQLSETOPTサービスルーチンを呼び出した直後に実行される埋め込みSQL文（SELECT）で，SQL_COPT_SS_ENLIST_IN_XAの接続オプションが設定されます。

30.10　XMAP3を使用した画面・帳票関連

XMAP3を使用した書式印刷機能（Windows(x86) COBOL2002で有効），XMAP3を使用した通信節による画面操作・帳票出力機能に関するサービスルーチンです。

30.10.1　CBLXMAPERROR

CBLXMAPERRORサービスルーチンは，XMAP3を使用した書式印刷機能（Windows(x86) COBOL2002で有効），XMAP3を使用した通信節による画面操作・帳票出力機能で，出力される実行時メッセージのエラー情報（COBOLメッセージ番号，エラーコード）を取得します。

形式

CALL  'CBLXMAPERROR'  USING  引数1

引数

引数1は，次に示す形式の集団項目です。

表30‒10　 CBLXMAPERRORサービスルーチンの集団項目

記述形式

内容

01 データ名01.

CALL文のUSINGで指定するエラー情報取得領域の名前を指定します。

 02 データ名02  PIC S9(9) USAGE COMP.

COBOLメッセージ番号です。

 02 データ名03  PIC 9(9)  USAGE COMP.

エラーコードです。

 02 FILLER      PIC X(528).

予備。このサービスルーチンを呼び出す前にLOW-VALUE(X'00')を設定しておきます。

注

引数の指定，および形式が異なる場合の動作は保証しません。

戻り値

0：エラー情報が取得できた場合

100：エラー情報がない場合

-1：エラー情報の取得に失敗した場合

規則

CBLXMAPERRORサービスルーチンを呼び出すと，直前に実行されたXMAP3を使用した書式印刷機能の入出力文，またはXMAP3を使用した通信節による画面操作・帳票出力機能の通信文で出力されるエラーメッセージに対するエラー情報（COBOLメッセージ番号，エラーコード）が引数1に設定されます。また，XMAP3を使用した書式印刷機能でFILE STATUS句を指定した場合でも，該当する実行時メッセージのエラー情報が設定されます。

引数1に設定されるエラー情報を次に示します。

表30‒11　引数1に設定されるエラー情報の説明

エラー情報

説明

COBOLメッセージ番号

直前に実行されたXMAP3を使用した書式印刷機能の入出力文，またはXMAP3を使用した通信節による画面操作・帳票出力機能の通信文で出力されたKCCC3401R-SからKCCC3418R-S，またはKCCC5000R-WからKCCC5051R-WまでのSレベル以下のメッセージ番号が設定されます。メッセージについては，マニュアル「COBOL2002　メッセージ」を参照してください。

エラーコード

XMAP3が返したエラー詳細コードです。XMAP3のエラー詳細コードについては，XMAP3のマニュアル「画面・帳票サポートシステム XMAP3 開発・実行ガイド」またはマニュアル「XMAP3 Version 5 画面・帳票サポートシステム XMAP3 実行ガイド」のリターンコードの説明を参照してください。

CBLXMAPERRORサービスルーチンの戻り値は，RETURN-CODE特殊レジスタで参照できます。

エラーコードは，実行時メッセージKCCC3416R-S，KCCC3417R-S，KCCC5007R-S，KCCC5008R-S，またはKCCC5040R-S〜KCCC5051R-Wが出力された場合に設定されます。それ以外の実行時メッセージの場合は，エラーコードには0が設定されます。

次に示す場合，CBLXMAPERRORサービスルーチンの戻り値は100を返します。CBLXMAPERRORサービスルーチンの戻り値が100の場合，COBOLメッセージ番号，エラーコードは0が設定されます。

・直前に実行された入出力文，通信文でエラーが発生していない場合

・入出力文，通信文を実行しないでCBLXMAPERRORサービスルーチンを呼び出した場合

・CBLXMAPERRORサービスルーチンを呼び出したあとに入出力文，通信文を実行しないで，再度，CBLXMAPERRORサービスルーチンを呼び出した場合

CBLXMAPERRORサービスルーチンでエラーが発生し，エラー情報の取得に失敗した場合，戻り値は-1を返します。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
                :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
                :
       01  OP-1.
         02 ERR-MSGNUMBER     PIC S9(9) USAGE COMP.
         02 ERR-XMAPERRORCODE PIC 9(9)  USAGE COMP.
         02 FILLER            PIC X(528) VALUE LOW-VALUE.
       01  STMT-PROC          PIC X(20).
       01  戻り値             PIC S9(9) USAGE COMP.
                :
           COPY MDC1PCO.
                :
       COMMUNICATION  SECTION.
       CD  PRINT-O  FOR  OUTPUT  WS
           MAP  NAME  IS  PRINT-MAP
           MAPPING  MODE  IS  PRINT-MAPMODE
           STATUS  KEY  IS  PRINT-KEY
           DATA  ABSENCE  CODE  IS  PRINT-ABSENCE
           SYMBOLIC  TERMINAL  IS  PRINT-TERMINAL.
                :
     PROCEDURE DIVISION.
                :
           MOVE 'PRT001へMDC1PC6G帳票を送信' TO STMT-PROC.   … 2.
           MOVE  'MDC1PC6G' TO  PRINT-MAP.
           MOVE  'PRT001'  TO  PRINT-TERMINAL.
           SEND  PRINT-O  FROM  MDC1PCO  WITH  EMI.          … 3.
           IF PRINT-KEY NOT = '00000'
             PERFORM エラー処理                              … 1.
                :
           STOP RUN.
               ：
       エラー処理.                                           … 4.
             CALL 'CBLXMAPERROR' USING OP-1
             MOVE RETURN-CODE TO 戻り値
             EVALUATE 戻り値
               WHEN  0
                 DISPLAY STMT-PROC                           … 5.
      *>              ＜＜ エラー情報判定，リカバリ処理 ＞＞
                                 :
               WHEN  -1
                 DISPLAY 'CBLXMAPERRORが失敗しました。'
             END-EVALUATE.
                :

この例では，3.のSEND文実行でエラーが発生した場合に，1.のPERFORM文から，4.のエラー処理段落が実行されます。ここでCBLXMAPERRORサービスルーチンを呼び出し，エラー情報を取得します。2.のように通信文実行ごとに実行状態を退避しておくと，5.で，どの実行状態でエラーが発生したかがわかります。

30.11　その他の機能

30.11.1　CBLPUT

CBLPUTサービスルーチンは，画面に1文字を出力するものです。

形式

CALL 'CBLPUT' USING 引数1

引数

引数1には，現在のカーソル位置に出力する文字を，1バイトの英数字項目で指定します。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

引数1が1バイト以上の長さの場合，先頭の1バイトだけが有効となります。

このサービスルーチンを使用して文字を出力すると，カーソルは右へ1文字移動します。

このサービスルーチンを呼ぶ前に，CBLCURサービスルーチンでカーソルを位置づけておく必要があります。位置づけていないと，文字の表示される位置は不定となります。

画面節（WINDOW SECTION）を実行中にこのサービスルーチンを呼び出すと実行時エラーとなります。画面節（SCREEN SECTION）とは同時に実行できます。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC X(1) VALUE 'A'.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLPUT' USING OP-1.
           IF RETURN-CODE NOT = 0 THEN
             CBLPUTエラー処理
           END-IF.
           :

30.11.2　CBLGET

CBLGETサービスルーチンは，キーボードから文字を1文字入力するものです。

形式

CALL 'CBLGET' USING 引数1

引数

引数1には，現在のカーソル位置から入力される文字を格納する領域を，1バイトの英数字項目で指定します。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

このサービスルーチンを呼ぶ前に，CBLCURサービスルーチンでカーソルを位置づけておく必要があります。位置づけていないと，入力時のカーソル位置は不定となります。

画面節（WINDOW SECTION）を実行中にこのサービスルーチンを呼び出すと実行時エラーとなります。画面節（SCREEN SECTION）とは同時に実行できます。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC X(1) VALUE SPACE.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLGET' USING OP-1.
           IF RETURN-CODE NOT = 0 THEN
             CBLGETエラー処理
           END-IF.
           :

30.11.3　CBLADTRM

CBLADTRMサービスルーチンは，ACCEPT文の終了キーに任意のコードを追加するものです。

形式

CALL 'CBLADTRM' USING 引数1 引数2

引数

引数1には，終了キーに指定するコードのバイト数を，2バイトの2進項目で指定します。

引数2には，終了キーに指定するコードを指定します。この項目は，引数1で指定した長さの英数字項目（PIC X(n)：n=引数1）でなければなりません。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

このサービスルーチンで指定した終了キーは，画面節（SCREEN SECTIONおよびWINDOW SECTION）のACCEPT文に対して有効となります。ただし，ENTERキーと実行キーは本サービスルーチンで終了キーに追加できません。

画面節（WINDOW SECTION）のACCEPT文を実行した際に押された終了キーのコードは，WINDOW-KEYCODE特殊レジスタに設定されます。

画面節（SCREEN SECTION）のACCEPT文を実行した際に押された終了キーのコードは，環境部の特殊名段落でCRT STATUS句に指定したデータ名に設定されます。詳細については，「12.2.4　CRT STATUS句を使用したファンクションキー入力結果の取得」を参照してください。

使用例

終了キーに［Tab］キー，および［Esc］キーを追加する例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC 9(4) USAGE COMP VALUE 4.
       01 OP-2 PIC X(2) VALUE X'091B'.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLADTRM' USING OP-1 OP-2.
           IF RETURN-CODE NOT = 0 THEN
             CBLADTRMエラー処理
           END-IF.
           :

終了キーとコード

終了キーとコードとの対応を「図30‒2　終了キーとコードとの対応（1バイトコード）」，「図30‒3　終了キーとコードとの対応（2バイトコード）」に示します。

終了キーは，日立パーソナルワークステーション2020（以降，2020と呼びます）のキーボードのキーで表しています。

2020のキーボードにはあり，106日本語キーボードにはないキーが幾つかあるため，106日本語キーボードではこれらのキーを別のキーに置き換えることで対応しています。「図30‒4　2020のキーボードと106日本語キーボードとの対応表」に2020のキーボードと106日本語キーボードの対応表を示します。

図30‒2　終了キーとコードとの対応（1バイトコード）

図30‒3　終了キーとコードとの対応（2バイトコード）

図30‒4　2020のキーボードと106日本語キーボードとの対応表

30.11.4　CBLDLTRM

CBLDLTRMサービスルーチンは，ACCEPT文の終了キーから任意のコードを削除するものです。

形式

CALL 'CBLDLTRM' USING 引数1 引数2

引数

引数1には，終了キーから削除するコードのバイト数を，2バイトの2進項目で指定します。

引数2には，終了キーから削除するコードを指定します。この項目は，引数1で指定した長さの英数字項目（PIC X(n)：n=引数1）でなければなりません。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

このサービスルーチンで呼び出した終了キーは，画面節（SCREEN SECTIONおよびWINDOW SECTION）のACCEPT文に対して有効となります。

終了キーとコードとの対応については，「30.11.3　CBLADTRM」で示した「図30‒2　終了キーとコードとの対応（1バイトコード）」，「図30‒3　終了キーとコードとの対応（2バイトコード）」を参照してください。

使用例

終了キーから［Tab］キー，および［Esc］キーを削除する例を次に示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC 9(4) USAGE COMP VALUE 4.
       01 OP-2 PIC X(2) VALUE X'091B'.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLDLTRM' USING OP-1 OP-2.
           IF RETURN-CODE NOT = 0 THEN
             CBLDLTRMエラー処理
           END-IF.
           :

30.11.5　CBLCNSL

CBLCNSLサービスルーチンは，キーボードからの読み込み待ちの文字があるかどうかを検査するものです（ただし，このシステムでは，常に読み込み待ちの文字ありとなります）。

形式

CALL 'CBLCNSL' USING 引数1

引数

引数1には，キーボードからの読み込み待ちの文字があるかどうかの情報が次のように設定されます。この項目は，2バイトの2進項目でなければなりません。

0：読み込み待ちの文字なし。

0以外：読み込み待ちの文字あり。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

注意事項

このサービスルーチンは，常に0以外を引数に設定します。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC 9(4) USAGE COMP VALUE 0.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLCNSL' USING OP-1.
           IF RETURN-CODE NOT = 0 THEN
             CBLCNSLエラー処理
           END-IF.
           :

30.11.6　CBLBELL

CBLBELLサービスルーチンは，警告音を鳴らす機能を提供するものです。

形式

CALL 'CBLBELL'

引数

なし。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLBELL'.
           IF RETURN-CODE NOT = 0 THEN
             CBLBELLエラー処理
           END-IF.
           :

30.11.7　CBLCUR

CBLCURサービスルーチンは，画面上の指定された位置にカーソルを移動するものです。

形式

CALL 'CBLCUR' USING 引数1 引数2

引数

引数1は使用しません。

引数2には，カーソルを移動する行とカラムを指定します。この項目は次の形式の集団項目とします。

記述形式

内容

01 データ名1.

CALL文のUSINGで指定するインタフェース領域の名前を指定する。

 02 データ名2 PIC 9(04)
    USAGE COMP.

カーソルを移動する行の番号を，2バイトの2進項目で指定する。

 02 データ名3 PIC 9(04)
    USAGE COMP.

カーソルを移動するカラム位置を，2バイトの2進項目で指定する。

戻り値

0：正常終了した場合

-1：エラーが発生した場合

規則

行の番号は1〜24，カラム位置は1〜80の値でなければなりません。

画面節（WINDOW SECTION）を実行中にこのサービスルーチンを呼び出すと実行時エラーとなります。画面節（SCREEN SECTION）とは同時に実行できます。

使用例

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
           :
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 OP-1 PIC X VALUE SPACE.
       01 OP-2.
         02 OP-2-1 PIC 9(4) USAGE COMP VALUE 10.
         02 OP-2-2 PIC 9(4) USAGE COMP VALUE 20.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLCUR' USING OP-1 OP-2.
           IF RETURN-CODE NOT = 0 THEN
             CBLCURエラー処理
           END-IF.
           :

第11編　プログラム作成上の留意点

31　プログラミング上の留意点

この章では，処理速度が速く，移植性の良いプログラムを作成する上での留意点について説明します。

31.1　処理速度の速いプログラムの作成

処理速度の速いプログラムを作成するためのチェック項目と，その理由などについて説明します。

31.1.1　チェック項目一覧

項番

分類

チェック項目

1

演算，転記，比較

数字項目の定義や演算を工夫できないか。

2

添字は4バイトの符号付き2進項目で定義しているか。

3

添字は定数で指定できないか。

4

比較する項目の長さは同じか。

5

2進項目，指標データ項目，浮動小数点項目の境界は適切な位置にあるか。

6

USAGE句項目の指定や，小数点以下のけた数は一致しているか。

7

データ転送にむだはないか。

8

不要な小数点はないか。

9

可変長項目のあとに固定長項目を定義していないか。

10

ファイル処理

READ INTO，WRITE FROMを使っていないか。

11

領域

作業場所節および局所場所節で，一緒に使う項目は互いに近くで定義しているか。

31.1.2　チェック項目の説明

(1)　数字項目の定義や演算を工夫できないか

データ項目の属性変換が発生しないようにしたり，算術演算子を少なくしたりして中間結果のけた数を最小にすると処理速度が向上します。そのために留意する点を次に示します。

(a)　数字項目のけた拡張機能を使用しない場合

数字項目を定義する場合は，SYNC句指定のある符号付き2進項目（COMP）とし，また，けた数を必要以上に大きくしないようにします。

10進項目は演算に使わないようにします。例えば，入出力レコード中の10進のデータ項目を演算で頻繁に使うときは，データ項目を2進項目の作業領域に移してから演算するようにします。

属性の異なるもの同士の演算は避けます。例えば，2進項目と内部10進項目，2進項目と外部10進項目などの演算を避けます。

複雑なCOMPUTE文は分割するなどし，一つのCOMPUTE文中の算術演算子を少なくします。COMPUTE文中に多くの算術演算子を使うと，けたあふれも発生しやすくなります。

1バイト2進項目を使用する処理はできるだけ局所化し，演算に使用する項目には2バイト2進項目を使用するようにします。

(b)　数字項目のけた拡張機能を使用する場合

けた数が19〜38けたの数字項目を定義する場合は，内部10進項目（COMP-3）とし，けた数を必要以上に大きくしないようにします。

けた数が19〜38けたの数字項目や数字定数を使用する処理は，ソースファイルごとにできるだけ局所化します。

属性の異なるもの同士の演算は避けます。例えば，2進項目と内部10進項目，2進項目と外部10進項目などの演算を避けます。

複雑なCOMPUTE文は分割するなどし，一つのCOMPUTE文中の算術演算子を少なくします。COMPUTE文中に多くの算術演算子を使うと，けたあふれも発生しやすくなります。

1バイト2進項目を使用する処理はできるだけ局所化し，演算に使用する項目には2バイト2進項目を使用するようにします。

数字項目のけた拡張機能については，「29.　数字項目のけた拡張機能（Windows(x64) COBOL2002で有効）」を参照してください。

(2)　添字は4バイトの符号付き2進項目で定義しているか

添字は4バイトの符号付き2進項目として処理されます。それ以外の形式のときは，データ変換命令が生成されるため処理速度が遅くなります。

(3)　添字は定数で指定できないか

添字を定数にすると，アドレス計算のための命令が生成されないので，処理速度が向上します。

（悪い例）

             :
           MOVE 3 TO J.
           MOVE A TO B(J).

（良い例）

             :
           MOVE A TO B(3).

(4)　比較する項目の長さは同じか

英数字項目を比較するときに項目の長さが異なると，コンパイラは長さの差の部分が空白かどうかを調べるオブジェクトコードを生成します。このため，項目の長さを同じにすると処理速度が向上します。

(5)　2進項目，指標データ項目，浮動小数点項目の境界は適切な位置にあるか

2進項目，指標データ項目，浮動小数点項目がそれぞれの適切な境界にないと，処理速度が遅くなります。境界については，マニュアル「COBOL2002　言語　標準仕様編」　「4.4.1(7)　実行用コードの効率を高めるための項目のけた詰め」を参照してください。

境界を合わせるには，SYNC句を指定する方法と，利用者がバイト数を計算して合わせる方法とがあります。ただし，SYNC句を使うと処理速度は向上しますが，多用すると実行可能プログラムが必要以上に大きくなることがあるので注意してください。

バイト数を計算して境界を合わせる例を次に示します。

（例）

       WORKING-STORAGE SECTION.
       01 DATA-SGROUPS.
          *> 境界合わせが必要なものをまとめ,境界合わせを
          *> 計算しながら並べる
         02 A PIC S9(12) USAGE COMP.
         02 B PIC S9(7) USAGE COMP.
         02 C PIC S9(7) USAGE COMP.
         02 D USAGE COMP-1.
         02 E USAGE COMP-1.
         02 F USAGE COMP-2.
         02 G PIC S9(14) USAGE PACKED-DECIMAL.
         02 H PIC S9(10) USAGE COMP.
         02 I USAGE INDEX.
          *> 境界合わせが不要なものをまとめる
         02 J PIC S9(10) DISPLAY.

(6)　USAGE句項目の指定や，小数点以下のけた数は一致しているか

USAGE句項目が一致していないと，データ変換命令が生成されるため処理速度が遅くなります。また，小数点以下のけた数が一致していないと，演算のときにけた数を合わせる命令が生成されるため処理速度が遅くなります。

（悪い例）

       WORKING-STORAGE SECTION.
       77 TOL PIC S9(3) USAGE COMP.
       77 NUM PIC S9(3)V99 USAGE PACKED-DECIMAL.
       77 AVE PIC S9(3)V9.
            :
       PROCEDURE DIVISION.
            :
           COMPUTE AVE = TOL / NUM.

（良い例）

       WORKING-STORAGE SECTION.
       77 TOL PIC S9(3)V9 USAGE PACKED-DECIMAL.
       77 NUM PIC S9(3)V9 USAGE PACKED-DECIMAL.
       77 AVE PIC S9(3)V9 USAGE PACKED-DECIMAL.
           :
       PROCEDURE DIVISION.
           :
           COMPUTE AVE = TOL / NUM.

(7)　データ転送にむだはないか

入力レコードを作業領域に転送するとき，むだなデータを転送することがよくあります。転記する文は，項目の長さに比例して時間が掛かります。複数のMOVE文に分けて実際に転送する長さを短くすると処理速度が向上します。

（悪い例1）

       01 A1.     *> 入力領域
         02 FILLER PIC X(300).
         02 B1     PIC X(5).
         02 FILLER PIC X(30).
         02 C1     PIC X(5).
       01 A2.     *> 作業領域
         02 FILLER PIC X(300).
         02 B2     PIC X(5).
         02 FILLER PIC X(30).
         02 C2     PIC X(5).
              :
       PROCEDURE DIVISION.
              :
           MOVE A1 TO A2.

（良い例1）

       01 A1.     *> 入力領域
         02 FILLER PIC X(300).
         02 B1     PIC X(5).
         02 FILLER PIC X(30).
         02 C1     PIC X(5).
       01 A2.     *> 作業領域
         02 FILLER PIC X(300).
         02 B2     PIC X(5).
         02 FILLER PIC X(30).
         02 C2     PIC X(5).
           :
       PROCEDURE DIVISION.
           :
           MOVE B1 TO B2.
           MOVE C1 TO C2.

（悪い例2）

       FILE SECTION.
       FD AFILE RECORDING MODE V.
       01 A1.
         02 L      PIC S9(5) USAGE COMP. *> 入力レコード長
         02 FILLER PIC X(4000).
            *> 最大レコードだけを定義している
           :
       WORKING-STORAGE SECTION.
       01 WK.
         02 詳細なレコード定義
           :
       PROCEDURE DIVISION.
           :
           MOVE A1 TO WK.

（良い例2）

       FILE SECTION.
       FD AFILE
       RECORD VARYING IN SIZE
               TO 4000
               DEPENDING ON CNT.
       01 A1 PIC X(4000).
               :
       WORKING-STORAGE SECTION.
       77 CNT PIC 9(4).
       01 WK.
         02 詳細なレコード定義
               :
       PROCEDURE DIVISION.
           :
           MOVE A1(1:CNT) TO WK(1:CNT).

(8)　不要な小数点はないか

小数点があると処理が複雑になることがあり，処理速度が遅くなります。

(9)　可変長項目のあとに固定長項目を定義していないか

可変長項目の長さは実行時に変化します。可変長項目のあとにある固定長項目を参照する文があると，コンパイラはアドレスづけのための特別なオブジェクトコードを生成します。このため，通常の固定長項目を参照するよりも処理速度が遅くなります。

また，可変長項目のあとにその可変長項目に従属する項目以外を記述することは，COBOL規格で禁止されています。そのため，このような記述をする場合は，COBOL規格外の記述として注意する必要があります。

（悪い例）

       WORKING-STORAGE SECTION.
       01 V-GROUP.
         02 C PIC X
            OCCURS …… DEPENDING  ON I.
         02 A PIC S9(5) USAGE COMP.
         02 B PIC 9(6).
               :

（良い例）

       WORKING-STORAGE SECTION.
       01 J-GROUP.
         02 A PIC S9(5) USAGE COMP.
         02 B PIC 9(6).
         02 C PIC X
           OCCURS …… DEPENDING ON I.
               :

(10)　READ INTO，WRITE FROMを使っていないか

READ INTO，WRITE FROMを使うと，レコードの入出力処理でプログラム内のレコード領域との間でデータ転送が発生し，処理速度が遅くなります。

(11)　作業場所節および局所場所節で，一緒に使う項目は互いに近くで定義しているか

このシステムでは，作業場所節および局所場所節で定義した項目は，定義した場所に確保されます。このため，一緒に使用する項目は近くに定義して参照を局所化すると処理速度が向上します。

31.2　移植性の良いプログラムの作成

移植性の良いプログラムを作成するためのチェック項目と，その理由などについて説明します。

31.2.1　チェック項目一覧

項番

分類

チェック項目

1

定数

半角かたかな文字は使わないようにできないか。

2

16進英数字定数は使わないようにできないか。

3

日本語文字データの転記，比較に英数字定数を使わないようにできないか。

4

日本語定数の中に空白を使わないようにしているか。

5

プログラム名

プログラム名には英小文字を使わないようにできないか。

6

文字比較

異なった文字集合間での順序の比較はしていないか。

7

内部表現

数値の内部表現を意識したコーディングをしていないか。

8

入出力

9xの入出力状態は利用しないようにできないか。

9

正書法

固定形式正書法の場合，日本語を含む原始プログラムの1行を，プログラム原文領域の2/3程度までで終わらせているか。

10

COPY文

REPLACE文

COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わないようにできないか。

11

C言語との連携

CALL文で直接システム関数を呼び出していないか。

12

その他

システム固有の言語仕様を使わないようにできないか。

31.2.2　チェック項目の説明

(1)　半角かたかなは使わないようにできないか

このシステムのコンパイラのコード系はシフトJIS（SJIS）ですが，EUC（UJIS）を使っているコンパイラもあります。

半角かたかな文字のバイト数が，シフトJISコードと日本語EUCコードでは次のように異なります。このため，半角かたかな文字は使わないで全角かたかなを使った方が移植性が良くなります。

(2)　16進英数字定数は使わないようにできないか

内部コードはシステムによって異なります。16進英数字定数を使うということは内部コードを意識しているということなので移植性が悪くなります。

(3)　日本語文字データの転記，比較に英数字定数を使わないようにできないか

システムによってはシフトコードを指定することで日本語文字データを区別しているものがあります。日本語定数を使わないで，英数字定数で日本語文字データを指定すると，英数字定数の長さが異なってきます。日本語文字データの転記，比較などは日本語定数を使った方が移植性が良くなります。

(4)　日本語定数の中に空白を含まないようにしているか

全角の空白を記述した場合，システムによってコード値が(2020)₁₆になったり，(8140)₁₆になったりします。このため，比較や転記などで使用する日本語定数の中に空白があると，生成されるオブジェクトコードが異なります。

(5)　プログラム名には英小文字を使わないようにできないか

システムによっては，プログラム名に英小文字を使えないものや英大文字と英小文字の等価規則が適用されないものがあります。このため，プログラム名段落やCALL文のプログラム名に英小文字を使わない方が移植性が良くなります。

(6)　異なった文字集合間での順序の比較はしていないか

異なった文字集合（例えば，かたかな文字と英数字文字）の順序は，システムによって異なります。このため，異なった文字集合間の比較をしない方が移植性が良くなります。

(7)　数値の内部表現を意識したコーディングをしていないか

数値の表現方法は，符号表現を含めてシステムに依存します。このため，数値の内部表現を意識したコーディングを避けた方が移植性が良くなります。

（悪い例）

       01 X.
         02 A PIC 9(2) USAGE COMP-X.
         02 B PIC X.
       01 FILLER REDEFINES X.
         02 AA PIC X.
         02 BB PIC 9(2) USAGE COMP-X.
           :
       PROCEDURE DIVISION.
           :
           MOVE 65 TO A.
           IF AA = 'A' THEN
               :

(8)　9xの入出力状態は利用しないようにできないか

9xの入出力状態はシステムによって異なります。このため，比較などに使わない方が移植性が良くなります。

9xを使う必要があるときは，90以上かどうかを問う比較にした方が，移植性が良くなります。

（悪い例）

           :
       SELECT A-FILE...
               FILE STATUS IS RTN.
           :
       PROCEDURE DIVISION.
           :
         IF RTN = '90'

（良い例）

           :
       SELECT A-FILE...
               FILE STATUS IS RTN.
           :
       PROCEDURE DIVISION.
           :
         IF RTN NOT < '90'

(9)　固定形式正書法の場合，日本語を含む原始プログラムの1行をプログラム原文領域の2/3程度で終わらせているか

システムによっては，シフトコードを指定することで日本語文字を区別しているものがあります。

日本語を含む1行でプログラム原文領域すべてを使った原始プログラムをほかのシステム（例えば，VOS3など）に移植すると，シフトコードを付加してプログラム原文領域をはみ出てしまうおそれがあります。このため，日本語を含む原始プログラムは，シフトコードを意識して1行を終わらせた方が移植性が良くなります。

(10)　COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わないようにできないか

システムによっては，COPY文のREPLACING指定およびREPLACE文の作用対象に，日本語が指定できないものがあります。このため，COPY文のREPLACING指定およびREPLACE文の作用対象に日本語を使わない方が移植性が良くなります。

(11)　CALL文で直接システム関数を呼び出していないか

C言語のシステム関数※は，#defineによって実際の関数名とは別の関数名で宣言され，マクロ展開後に置き換えられることがあります。COBOLではC言語のマクロは展開しないため，COBOLプログラムからC言語のシステム関数をCALL文で直接呼び出すと，COBOLからマクロ展開前の関数名を呼び出し，予期しない不具合が発生するおそれがあります。

COBOLプログラムからC言語のシステム関数を呼び出す場合は，直接呼び出さないで，システム関数を呼び出すCプログラムを作成し，このCプログラムを呼び出すようにしてください。

注※

Microsoft C／C++の関数

31.3　COBOLプログラムが使用するスタック領域

プログラムが実行時に異常終了する原因の一つに，スタックオーバフローがあります。スタックオーバフローを回避するには，プログラムが使用するスタック領域の量について事前に把握しておく必要があります。ここでは，COBOLプログラムがスタック領域に配置するデータの種類とサイズについて説明します。

なお，スタックオーバフロー発生後のプログラムの動作は保証しません。

31.3.1　スタック領域に配置されるデータ

COBOLプログラム実行時にスタック領域に配置されるデータを次に示します。

局所場所節に定義したデータ項目

連絡節に定義したデータ項目

COBOLプログラムが内部的に使用するデータ

(1)　局所場所節に定義したデータ項目

局所場所節に定義したデータ項目はスタック領域に配置します。データの配置については，マニュアル「COBOL2002　言語　標準仕様編」　「4.4.1　機種によらないデータ記述」を参照してください。局所場所節に非常にサイズの大きいデータを定義した場合，スタック領域が不足するおそれがありますので注意してください。

(2)　連絡節に定義したデータ項目

連絡節に定義したデータ項目はスタック領域に配置します。配置するサイズは，手続き部のUSING／RETURNING指定によって異なります。

(a)　BY REFERENCE指定のデータ項目

参照渡しの場合

配置するサイズはポインタサイズ（4バイト）※１となります。手続き部のUSINGに指定したデータの数だけポインタサイズを配置します。

内容渡しの場合

配置するサイズは，定義したデータ項目のサイズ（4バイト境界に切り上げ）※２とポインタサイズ（4バイト）※１を合計した値となります。

なお，サイズが非常に大きいデータを定義した場合は，スタック領域が不足するおそれがあるため注意してください。

注※1

Windows(x64) COBOL2002の場合は8バイトとなります。

注※2

Windows(x64) COBOL2002の場合は8バイト境界に切り上げます。

(b)　BY VALUE／RETURNING指定のデータ項目

配置するサイズは，定義したデータ項目のサイズ（4バイト境界に切り上げ）※となります。スタック領域に定義したデータ項目の値をそのまま配置します。データの配置については，マニュアル「COBOL2002　言語　標準仕様編」　「4.4.1　機種によらないデータ記述」を参照してください。

なお，サイズが非常に大きいデータを定義した場合，スタック領域が不足するおそれがあるため注意してください。

注※

Windows(x64) COBOL2002の場合は8バイト境界に切り上げます。

(3)　COBOLプログラムが内部的に使用するデータ

COBOLプログラムで明示的に定義したデータ項目以外に，COBOLプログラムが内部的に使用するデータがあります。このデータはプログラムを実行するために必要なデータです。このデータはCOBOLコンパイラが内部的に自動生成するものであり，またプログラムの内容に依存します。

31.3.2　プログラム実行時呼び出し関係に依存するスタック領域の消費量

プログラム実行時に必要なスタック領域のサイズは，実行時要素の呼び出し関係やその属性に依存します。実行時要素が必要とするスタック領域のサイズは，スタック領域に配置されるデータの合計サイズです。スタック領域に配置されるデータについては，「31.3.1　スタック領域に配置されるデータ」を参照してください。

(1)　実行時要素の呼び出し関係

プログラム実行時に必要なスタック領域のサイズは，実行時要素の呼び出し関係に依存します。例えば，ある実行時要素が別の実行時要素を呼び出し，呼び出された実行時要素がまた別の実行時要素を呼び出します。このように実行時要素の呼び出しが入れ子になっている場合，実行時に必要なスタック領域のサイズは，各実行時要素が必要とするスタック領域のサイズの合計となります。

(2)　再帰属性プログラム

再帰属性プログラムが実行時に必要とするスタック領域のサイズは，プログラムが再帰的に呼び出される回数に依存します。再帰属性プログラムが実行時に必要とするスタック領域のサイズを次に示します。

再帰属性プログラムが一つの実行時要素として必要とするスタック領域のサイズ×再帰的に呼び出される回数

31.3.3　スタック領域のサイズ変更方法

プログラムが使用できるスタック領域のサイズは変更できます。規定の状態ではスタックオーバフローが起こるプログラムであっても，スタック領域のサイズを変更すると正常に実行できます。ただし，この対処方法はプログラムが使用するスタック領域の最大値があらかじめ予想できる場合だけ使用できます。

スタック領域のサイズ変更方法は，-STACKオプションによって使用できるスタック領域のサイズを変更します。-STACKオプションについては，「38.1.3　オプション」を参照してください。

32　最適化機能

COBOL2002には，プログラムの実行効率を上げるための最適化機能があります。最適化をするためには，最適化オプションを指定してコンパイルします。この章では，指定するオプションと最適化の内容について説明します。

32.1　最適化のレベル

32.1.1　最適化オプションの種類

最適化用のオプションには次に示す-Optimize,0，-Optimize,1，-Optimize,2，-Optimize,3の4種類があり，省略時は-Optimize,1が仮定されます。

(1)　-Optimize,0オプション

最適化をしません。このため，コンパイル時間は最短になります。

(2)　-Optimize,1オプション

文の中で閉じた次の最適化をします。

命令レベルでの最適化（ピープホールによる不要命令の削除など）

(3)　-Optimize,2オプション

広域的な次の最適化をします。

命令レベルでの最適化（ピープホールによる不要命令の削除など）

不変式のループ外への移動

コピー伝播

定数の畳み込み

共通式の削除

演算の強さの軽減

そとPERFORM文のインライン展開

(4)　-Optimize,3オプション

-Optimize,2オプションでの最適化に加えて，10進項目を2進項目に変換します。

(5)　注意事項

最適化によって文または文の一部が移動または削除されると，実行時メッセージや異常終了時要約情報リストなどの行番号／欄の情報が正しく出力されないことがあります。

正しい行番号／欄の情報を出力するには，コンパイル時に-Optimize,0オプションを指定して最適化を抑止する必要があります。

-Optimize,3オプションを指定すると次のような副作用を伴うことがあります。

（例）

       01 A PIC S9(9) VALUE +123456789.
       01 B PIC S9(5).
       01 C PIC S9(9).
           :
       PROCEDURE DIVISION.
            :
           MOVE A TO B.
           MOVE B TO C.
           DISPLAY C.

-Optimize,3指定以外のときはデータ項目Cに+56,789が設定されますが，-Optimize,3指定の場合，+123,456,789が設定されます（-DigitsTrunc指定ありの場合を除く）。

また，演算よりも10進項目への代入の方が多いプログラムなど，プログラムによっては-Optimize,3オプションを指定すると実行速度がかえって低下する場合があります。

32.2　最適化の内容

32.2.1　そとPERFORM文のインライン展開

そとPERFORM文のインライン展開の規則について説明します。

なお，PERFORM文については，マニュアル「COBOL2002　言語　標準仕様編」　「10.8.31　PERFORM文」を参照してください。

(1)　対象となる節，段落

手続き部分で定義された節と段落であることが必要です。宣言節で定義された節，段落はインライン化の対象となりません。

(2)　THRU指定のあるPERFORM文

THRU指定のあるPERFORM文の場合，次のどちらかの条件を満たしていなければなりません。

手続き名1と手続き名2の両方が節である

手続き名1と手続き名2の両方が段落である

例1のPERFORM文は，SECT-1が節，PARG-2-1が段落であるため，インライン化の対象となりません。

（例1）

           :
       PROCEDURE DIVISION.
           :
           PERFORM SECT-1 THRU PARG-2-1.
           SECT-1 SECTION.
           PARG-1-1.
           :
           SECT-2 SECTION.
           PARG-2-1.
           :

手続き名1と手続き名2が節の場合，手続き名2の節は手続き名1の節の直後に定義された節である

例2のPERFORM文は，SECT-2がSECT-1の直後に定義されています。

（例2）

               :
       PROCEDURE DIVISION.
               :
           PERFORM SECT-1 THRU SECT-2.
           SECT-1 SECTION.
           PARG-1-1.
               :
           SECT-2 SECTION.
           PARG-2-1.
               :

手続き名1と手続き名2が段落の場合，手続き名2の段落は手続き名1の段落の直後に定義された段落である

例3のPERFORM文は，PARG-1-3がPARG-1-1の直後に定義された段落ではないため，インライン化の対象となりません。

（例3）

            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-1 THRU PARG-1-3.
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :

(3)　呼ばれる節と段落

呼ばれる節と段落が次の（a）（b）の条件を満たしていることが必要です。

(a)　THRU指定がある場合

手続き名1と手続き名2が節の場合，節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。

手続き名1と手続き名2が段落の場合，段落を分岐文や複数のPERFORM文で参照してはなりません。

例1のPERFORM文は，PARG-2-1がGO TO文によって参照されているため，インライン化の対象となりません。

（例1）

             :
       PROCEDURE DIVISION.
             :
           PERFORM SECT-1 THRU SECT-2.
             :
           GO TO PARG-2-1.
             :
           SECT-1 SECTION.
           PARG-1-1.
             :
           SECT-2 SECTION.
           PARG-2-1.
             :

例2の（1）のPERFORM文は，PARG-1-2とPARG-1-3が（2）のPERFORM文と（3）のGO TO文によって参照されているため，インライン化の対象となりません。

（例2）

            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-2 THRU PARG-1-3. …(1)
            :
           PERFORM PARG-1-1 THRU PARG-1-4. …(2)
            :
           GO TO SECT-1. …(3)
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :
           PARG-1-4.
            :

(b)　THRU指定がない場合

手続き名1が節の場合，節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。

手続き名1が段落の場合，段落を分岐文や複数のPERFORM文で参照してはなりません。

例1のPERFORM文は，PARG-1-2がGO TO文によって参照されているため，インライン化の対象となりません。

（例1）

            :
       PROCEDURE DIVISION.
            :
           PERFORM SECT-1.
            :
           GO TO PARG-1-2.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           SECT-2 SECTION.
            :

例2の（1）のPERFORM文は，PARG-1-2が（2）のPERFORM文と（3）のGO TO文によって参照されているため，インライン化の対象となりません。

（例2）

            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-2. …(1)
            :
           PERFORM PARG-1-1 THRU PARG-1-3. …(2)
            :
           GO TO SECT-1. …(3)
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :
           PARG-1-4.
            :

(4)　PERFORM文の位置

PERFORM文が記述されている位置が次の(a)(b)の条件を満たしていることが必要です。

(a)　THRU指定がある場合

手続き名1と手続き名2が節の場合，節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。

手続き名1と手続き名2が段落の場合，段落の中に呼び出し元のPERFORM文があってはなりません。

例1のPERFORM文は，SECT-2の中に書かれているため，インライン化の対象となりません。

（例1）

            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
            :
           SECT-2 SECTION.
           PARG-2-1.
            :
           PERFORM SECT-1 THRU SECT-2.
            :
           SECT-3 SECTION.
            :

例2のPERFORM文は，PARG-1-2中に書かれているため，インライン化の対象となりません。

（例2）

            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PERFORM PARG-1-1 THRU PARG-1-2.
            :
           PARG-1-3.
            :

(b)　THRU指定がない場合

手続き名1が節の場合，節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。

手続き名1が段落の場合，段落の中に呼び出し元のPERFORM文があってはなりません。

例1のPERFORM文はSECT-1中に書かれているため，インライン化の対象となりません。

（例1）

           :
       PROCEDURE DIVISION.
           :
           SECT-1 SECTION.
           PARG-1-1.
           :
           PERFORM SECT-1.
           :
           SECT-2 SECTION.
           :

例2のPERFORM文はPARG-1-1中に書かれているため，インライン化の対象となりません。

（例2）

            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PERFORM PARG-1-1.
            :
           SECT-2 SECTION.
            :

(5)　呼ばれる節と段落までの間にある文

呼び出し元のPERFORM文または手続き部先頭から（「(7)　注意事項」を参照），呼ばれる節と段落までの間にある文が次の二つの条件を満たしていることが必要です。

最上位レベルのSTOP RUN文（「(7)　注意事項」を参照）など，プログラムの実行を終了する文がなければなりません。

例1では，STOP RUN文が文のレベルの最上位でないため，インライン化の対象とはなりません。

（例1）

            :
       PROCEDURE DIVISION.
            :
           PERFORM SECT-1.
            :
           IF FLAG = 'ON' THEN
           STOP  RUN.
            :
           SECT-1 SECTION.
            :

文のレベルに関係なく，ENTRY文があってはなりません。

例1ではENTRY文があるため，インライン化の対象となりません。

（例1）

            :
       PROCEDURE DIVISION.
            :
           PERFORM SECT-1.
            :
           IF FLAG = 'ON' THEN
           ENTRY 'SUB01'.
            :
           SECT-1 SECTION.
            :

(6)　呼ばれる節と段落までの間にある節と段落

呼び出し元のPERFORM文または手続き部先頭から（「(7)　注意事項」を参照），呼ばれる節と段落までの間にある節と段落がGO TO文とALTER文の飛び先で参照されてはなりません。

例のPERFORM文は，1.のGO TO文によってSECT-1が参照されているため，インライン化の対象となりません。

（例）

            :
       PROCEDURE DIVISION.
            :
           GO TO SECT-1.  *> 1.
            :
           PERFORM SECT-2.
            :
           SECT-1 SECTION.
            :
           SECT-2 SECTION.
            :

(7)　注意事項

（5），（6）の適用範囲を次の図に示します。

PERFORM文の方が節と段落の定義より前に書かれたときは1.の範囲。

節と段落の定義の方がPERFORM文より前に書かれたときは2.の範囲。

STOP RUN文，-MainNotCBLオプションの指定，または内側のプログラムのEXIT PROGRAM文，EXIT METHOD文，EXIT FUNCTION文，GOBACK文を示します。宣言節中の節と段落は対象外となるため，EXIT USE文，GO TO MORE-LABELS文は対象となりません。

インライン展開された個所で例外が発生した場合，EXCEPTION-LOCATION関数で返される手続き名の値は，インライン展開されていない場合と相違があります。詳細については，「21.7.1　組み込み関数を使用した例外情報の参照」の「(2)　EXCEPTION-LOCATION関数」の注を参照してください。

32.2.2　10進項目の2進項目化

10進項目の2進項目化とは，作業場所節および局所場所節で定義された内部10進項目，外部10進項目を2進項目として扱うことをいいます。すなわち，USAGE句にBINARYが指定されているものとして扱います。-Bin1Byteオプションが指定されていても，けた数が1〜2けたの10進項目なら2バイトの2進項目として扱います。ただし，次のどれかの条件に該当する場合は，2進項目化の対象にはなりません。

(1)　2進項目が指定できない個所に指定されているもの

画面機能（SCREEN SECTION）のCURSOR データ名

BLANK WHEN ZERO句がある

SIGN句があるデータ名

サブスキーマ節のSTATUS データ名

サブスキーマ節のDETAIL CODE データ名

部分参照がある

字類条件 一意名

英字，英数字，英数字型関数，英数字編集，数字編集，ZERO以外の表意定数，英数字定数との比較条件（EVALUATEの選択主体と選択対象の比較も含む）

EXAMINE文 一意名1

INSPECT文 一意名1，一意名3〜一意名n

STRING文 一意名1，2，3

TRANSFORM文 一意名1

UNSTRING文 一意名4

(2)　2進化することでサイズが大きくなるもの

次の場合，2進化することでサイズが大きくなります。ただし，01／77レベルは除きます。

1けたの外部10進

1，5，10，11，12，13けたの内部10進

(3)　データを外部と入出力するもの

EXTERNAL属性

SYMBOLIC KEY データ名

埋め込みSQL宣言節のデータ名

ADDR関数の引数

次の文に指定されたADDRESS OF 一意名

CALL文 REFERENCE 一意名

比較条件 一意名

SET文 送り出し側作用対象 一意名

SET文 受け取り側作用対象 一意名

ACCEPT文

ただし，次の一意名，データ名は除きます。

ACCEPT 一意名 FROM DATE／DAY／DAY-OF-WEEK／TIME

画面節（SCREEN SECTION）でのACCEPT文のLINE／COLUMN 一意名

コマンド行の引数の個数を取得するACCEPT文の一意名9

DISPLAY文

ただし，次の一意名，データ名は除きます。

画面節（SCREEN SECTION）でのDISPLAY文のLINE／COLUMN 一意名

コマンド行の引数の読み込み位置を設定するDISPLAY文の一意名7

CALL文 USING

CALL文 RETURNING

SQLデータ操作の文の一意名，データ名

DISABLE文 一意名1

ENABLE文 一意名1

RECEIVE文 一意名1

SEND文 一意名1，2，3，4

TRANSCEIVE文 一意名1，2

INVOKE文 USING

INVOKE文 RETURNING

利用者定義関数

(4)　2進にすると長さが異なるもの

LENGTH関数

次の文に指定されたLENGTH OF 一意名

CALL文 BY CONTENT 一意名

CALL文 BY VALUE 一意名

INVOKE文 BY CONTENT 一意名

INVOKE文 BY VALUE 一意名

(5)　英数字転記／比較をするもの

MOVE文の転記の規則に従って転記するWRITE FROM，REWRITE FROM，RELEASE FROM，報告書節（REPORT SECTION）のSOURCE句，画面節（WINDOW SECTION）のSOURCE句などを含みます。

集団項目との比較（EVALUATEの選択主体と選択対象の比較も含む）

MOVE 2進項目 TO 集団項目

MOVE 集団項目 TO 2進項目

READ文 INTO 一意名

RETURN文 INTO 一意名

-H8SwitchオプションがあるときのMOVE 2進項目 TO 英数字／英数字編集項目

(6)　外部10進，内部10進，2進で設定される値が異なるもの

MOVE WHEN-COMPILED TO 一意名

MOVE CURRENT-DATE TO 一意名

MOVE 外部10進項目／内部10進項目／2進項目／浮動小数点項目／数字編集項目以外の項目，英数字型関数 TO 一意名

（MOVE文の転記の規則に従って転記する場合も含む）

(7)　10進項目を間接的に参照／更新するもの

10進項目を含む集団項目が参照／更新されている

注

CORRESPONDING指定のあるADD文，SUBTRACT文，MOVE文，およびINITIALIZE文で指定した集団項目中の10進項目は2進化されません。

10進項目が再定義項目または被再定義項目となっている

10進項目を含む集団項目が再定義項目または被再定義項目となっている

10進項目にアドレス名指定がある

10進項目を含む集団項目にアドレス名指定またはVALUE句がある

再命名項目（RENAMES句がある）

被再命名項目（THRUなし）

被再命名項目（THRUあり）

被再命名項目（THRU範囲内の項目）

(8)　2進化すると実行速度が遅くなるもの

MOVE 2進 TO 数字編集項目（MOVE文の転記の規則に従って転記する場合も含む）

(9)　ファクトリ定義およびインスタンス定義中の10進項目

ファクトリ定義およびインスタンス定義中の10進項目

(10)　その他

作業場所節または局所場所節以外で定義されている

SYNCHRONIZED句がある

FILLER項目

特殊レジスタ

可変長集団項目中の10進項目

外部10進項目を含む集団項目にSIGN LEADING指定またはSIGN SEPARATE指定がある

PICTURE句の左端に「P」がある

CSV編成ファイルに対するWRITE文 FROM 一意名

32.2.3　不変式のループ外移動

繰り返し処理中で結果が常に同じになるような式や代入を繰り返し処理の前に移動することによって，繰り返し内の実行命令数を削減します。

（最適化前）

           :
           :
           :
       PERFORM VARYING I
         FROM 1 BY 1 UNTIL I = 100
           MULTIPLY A BY B GIVING C(I)
           MOVE 10 TO D
       END-PERFORM.

（最適化後）

          :
       MULTIPLY A BY B GIVING temp.
       MOVE 10 TO D.
       PERFORM VARYING I
         FROM 1 BY 1 UNTIL I = 100
           MOVE temp TO C(I)
       END-PERFORM.
          :

演算の最適化条件

四則演算である。

代入の最適化条件

代入元変数（この最適化によって前に出された式の結果の一時的記憶域を含む）がループ内で不変である。

代入先変数はループ内ではこの代入以外で変更されない。

代入元変数として代入先変数を参照している場合，必ずこの代入の結果を参照する。すなわち，ループ外で設定された値を参照することはない。

32.2.4　コピー伝播

変数1=定数

変数1=変数2

このような単純な代入文があったとき，次の変数1への代入までに現れた変数1の参照を定数や変数2で置き換えることによって，定数の畳み込みや無用命令の削除（代入があり，次の代入または終わりまでに参照がない場合，その代入は無用である）などをします。ただし，-Optimize,2オプション指定時には，ユーザが定義したデータ項目への代入に対する無用命令の削除はしません。

次の例では，A，Bはユーザ定義変数ではないものとします。

定数"23"を代入しているAは1.，2.で参照されているだけなので，1.，2.のAはそれぞれ定数"23"に変更されます。さらに，Bは2.で参照されているだけなので，Bも定数"23"に変更されます。なお，この例では2.のCOMPUTE文が定数の演算だけになるため，定数の畳み込みによって最終的に定数"50"に変更されます。

最適化条件

次の条件を満たす代入X=Yによってだけコピー伝播は行われます。

Xは添字指定を含まない。

Xに対する別名はない。

Yが定数なら，YはXのデータの型およびサイズに変換できる。

Yが変数なら，YはXのデータの型およびサイズに等しい。

32.2.5　共通式の削除

同一の式が複数ある場合，最初の式だけ計算をし，残りの式は最初の式の結果で置き換えることによって演算時間の短縮を図ります。

（最適化前）

COMPUTE C = A + B.
COMPUTE D(I) = A + B.
COMPUTE E = A + B + C.
MOVE D(I) TO F.

（最適化後）

ADD     A TO B GIVING C temp.
MOVE    temp TO D(I).
COMPUTE E = temp + C.
MOVE D(I) TO F.

最適化条件

二つの式XとYの間で式の共通化が行われる条件は次のとおりです。

式XはYの前にある。

式XまたはYがループ内にある場合，式YまたはXも同一ループ内にある。

式Yは代入を含まない。

式X，式Yの両方で参照である同じ演算項に対して，式間でこの演算項への代入がない。

32.2.6　定数の畳み込み

式の中に複数の定数があった場合，計算可能な範囲でコンパイラが定数同士の演算を計算することによって式を単純化します。

（最適化前）

COMPUTE C = 1 + 3.
COMPUTE D = 0.1415926 + 3.0000000 + A.

（最適化後）

MOVE    4 TO C.
COMPUTE D = 3.1415926 + A.

最適化条件

COBOLの演算順序に従った演算の過程で定数同士の演算が発生する場合だけ，この最適化は行われます。

32.2.7　演算強さの軽減

(1)　ループの削除

次のようなループを削除します。

ループ本体が空であり，かつループ制御変数が不要であるループ

ほかの最適化によってループ本体が空になったループ

最適化条件

ループ本体が空である。

ループ制御変数が不要なループである。

第12編　コンパイルと実行

33　COBOLソースの作成とコンパイル

この章では，COBOLソースの作成方法とコンパイル方法について，コンパイラ環境の設定方法や，コンパイル時の入出力構成，使用するファイル，登録集原文の使用方法なども含めて説明します。

33.1　コンパイル時の主な入出力ファイル

プログラムをコンパイルするときの主な入出力の流れを次に示します。

図33‒1　コンパイル時の入出力の流れ

ccbl2002コマンドを実行すると，COBOL2002コンパイラに制御が渡り，COBOLソースファイルからオブジェクトファイル（.obj）が生成されます。このとき，同時に次のファイルが生成されます。

モジュール定義ファイル（.def）

リソース定義ファイル（.rc）

生成されたリソース定義ファイルを基に，リソースコンパイラによってリソースファイル（.res）が生成されます。

オブジェクトファイル，モジュール定義ファイル，リソースファイルがリンカに取り込まれ，実行可能ファイル（.exe），ダイナミックリンクライブラリ（.dll），または標準ライブラリ（.lib）が生成されます。

上記に示したファイルや，その他COBOL2002で使用するファイルの内容については，「付録F　COBOLで使用するファイル」を参照してください。

33.2　COBOLソースの作成方法

コンパイル対象のCOBOLソースファイルを作成するときの規則について説明します。

33.2.1　ソースファイル名と拡張子

ソースファイル名，拡張子の指定規則を次に示します。

(1)　ソースファイル名

ソースファイル名はWindowsのファイル名の規則に従って指定します。ただし，ccbl2002コマンドに指定するソースファイル名に次の文字を使用した場合の動作は保証しません。

スラント（/）　ハイフン（-）

(2)　拡張子

COBOLソースファイルは，ファイル名のあとに次の拡張子を付けます。

固定形式正書法で書かれた原始プログラムをコンパイルする場合

.cbl，.cob，.ocb，または環境変数CBLFIXで指定した拡張子

自由形式正書法で書かれた原始プログラムをコンパイルする場合

.cbf，.ocf，または環境変数CBLFREEで指定した拡張子

33.2.2　原始プログラムの作成規則

COBOL原始プログラムは次の規則に従って記述します。

各行は復帰改行文字で終了させます。

固定形式正書法の場合は，1行は80バイト以内（ただし，コンパイラ環境変数CBLFIXEDFORMLINE=255が有効な場合は，255バイト以内）とします。また，自由形式正書法の場合は，1行は255バイト以内とします。これらの制限を超えた分は無視されます。

タブ文字以外の制御文字（X'00'〜X'1F'，およびX'7F'）は，使用できません。

タブ文字は，次のタブ位置まで空白として扱われます。タブを空白に置き換えるときの空白の個数は，環境変数CBLTABで設定できます。

33.2.3　正書法

ここでは，COBOLソースファイルの拡張子と正書法の関係，およびSOURCE FORMAT指令を使った正書法の切り替え方法について説明します。

正書法およびSOURCE FORMAT指令の文法規則については，マニュアル「COBOL2002　言語　標準仕様編」　「2.　正書法（Reference format）」および「COBOL2002　言語　標準仕様編」　「3.3.14　SOURCE FORMAT指令」を参照してください。

(1)　正書法の種類と概要

正書法は，COBOL原始プログラムや登録集原文を記述するための規約です。COBOLには，自由形式正書法と固定形式正書法の二つの正書法があります。それぞれの正書法の特徴を，次に示します。

固定形式正書法

行の文字位置によって，一連番号領域，標識領域，プログラム記述領域などの用途がはっきり決められている書き方です。

自由形式正書法

一連番号領域，標識領域などはなく，プログラムを行中の任意の位置に記述できる書き方です。

また，SOURCE FORMAT指令を使用すると，2種類の正書法を原始プログラムや登録集原文の途中で切り替えることができます。

なお，正書法の言語仕様についてはマニュアル「COBOL2002　言語　標準仕様編」　「2.　正書法（Reference format）」を，SOURCE FORMAT指令の言語仕様についてはマニュアル「COBOL2002　言語　標準仕様編」　「3.3.14　SOURCE FORMAT指令」を，それぞれ参照してください。

(2)　拡張子による正書法の指定

(a)　ソースファイルの拡張子と正書法の種類の対応

COBOL2002のコンパイラは，拡張子によってCOBOLソースファイルの種類が固定形式正書法か，自由形式正書法かを区別します。

拡張子が.cbl，.cob，.ocbのCOBOLソースファイル

固定形式正書法で記述されているものとして扱われます。

拡張子が.cbf，.ocfのCOBOLソースファイル

自由形式正書法で記述されているものとして扱われます。

また，上記以外の拡張子が付いたファイルであっても，環境変数CBLFIXまたはCBLFREEに設定しておくことで，それぞれ固定形式正書法，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルできます。

環境変数CBLFIXまたはCBLFREEを使用して，COBOL原始プログラムの拡張子を指定する方法については，「33.6　コンパイラ環境変数」を参照してください。

(b)　正書法の決定の優先順位

COBOL原始プログラムの正書法

COBOL原始プログラムが，固定形式／自由形式のどちらの正書法としてコンパイルされるかは，次の1.〜3.の判定順序に従って決定されます。

環境変数CBLFIXに設定した拡張子のファイルは，固定形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。

環境変数CBLFREEに設定した拡張子のファイルは，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。

拡張子が.cbl，.cob，.ocbのファイルは，固定形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。また，拡張子が.cbf，.ocfのファイルは，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。

したがって，同じ拡張子を環境変数CBLFIX，環境変数CBLFREEの両方に指定した場合，環境変数CBLFIXの指定が有効となり，COBOL原始プログラムは固定形式正書法としてコンパイルされます。

登録集原文の正書法

登録集原文の正書法も，COBOL原始プログラムと同じ規則で決定されます。ただし，原文名定数に書かれた登録集原文ファイルの拡張子が，上記以外の拡張子の場合，登録集原文は，固定形式正書法で書かれたものとして扱われます。

登録集原文ファイルの検索

登録集原文ファイルは，次の1.〜4.の順に検索されます。ただし，原文名定数で書かれた場合は，除きます。

環境変数CBLFIXに設定した拡張子の左から順に，その拡張子が付くファイル。

環境変数CBLFREEに設定された拡張子の左から順に，その拡張子が付くファイル。

.cbl，.cob，.ocbの順に，その拡張子が付くファイル。

.cbf，.ocfの順に，その拡張子が付くファイル。

上記の検索順位は，登録集原文の複写元の原始プログラムの正書法とは関係しません。

例えば自由形式の原始プログラムTP001.cbfの中に「COPY ABC.」という記述があって，ABC.cblとABC.cbfという二つのファイルがある場合，ABC.cblの方が展開されます。

正書法の異なるプログラム間の複写

COPY文を使用して，固定形式正書法の原始プログラムから自由形式正書法の原始プログラムを取り込んだり，自由形式正書法の原始プログラムから固定形式正書法の原始プログラムを取り込んだりできます。

この場合，ファイルの拡張子で正書法が判断されるため，SOURCE FORMAT指令によって明示的に正書法を指定する必要はありません。

(3)　SOURCE FORMAT指令による正書法の切り替え

SOURCE FORMAT指令を使用すると，原始プログラムの正書法を切り替えられます。原始プログラムの先頭にSOURCE FORMAT指令を記述すると，原始プログラム全体の正書法を変更できます

また，原始プログラムの途中でSOURCE FORMAT指令を記述すると，SOURCE FORMAT指令の次の行から正書法を変更できます。

次に，SOURCE FORMAT指令の使用例を示します。

（例1）

固定形式正書法のCOBOLソースファイルに自由形式正書法を適用する場合

000100 >>SOURCE FORMAT IS FREE     …1.
IDENTIFICATION DIVISION.           …2.
PROGRAM-ID. FIX-FORM-EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A-LONG-ITEM PIC X(100) VALUE 'THE FIRST PART CONTINUED'-
   ' ON THE NEXT LINE - SIMPLE ENOUGH'.
01 NUM-ITEM PIC 9(10).
PROCEDURE DIVISION.
A-PARAGRAPH-NAME.
  ：

SOURCE FORMAT指令が有効となるのは，SOURCE FORMAT指令の次の行からです。このため，「>>SOURCE FORMAT IS FREE」を指定している行自身は，固定形式正書法に従って記述する必要があります。

別のSOURCE FORMAT指令が現れるまで，1.の指定が有効となります。

（例2）

自由形式正書法のCOBOLソースファイルに固定形式正書法を適用する場合

>>SOURCE FORMAT IS FIXED                      …1.
000010 IDENTIFICATION DIVISION.               …2.
000020 PROGRAM-ID. FIX-FORM-EXAMPLE.
000030 DATA DIVISION.
000040 WORKING-STORAGE SECTION.
000050 01 A-LONG-ITEM PIC X(100) VALUE 'THE FIRST PART CONTINUED
000060- '  ON THE NEXT LINE - SIMPLE ENOUGH'.
000070 01 NUM-ITEM PIC 9(10).
  ：

SOURCE FORMAT指令が有効となるのは，SOURCE FORMAT指令の次の行からです。このため，「>>SOURCE FORMAT IS FIXED」を指定している行自身は，自由形式正書法に従って記述する必要があります。

別のSOURCE FORMAT指令が現れるまで，1.の指定が有効となります。

(4)　自由形式正書法で指定できないコンパイラオプション

次のオプションは，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされるプログラムには，指定できません。指定してコンパイルした場合，エラーとなってコンパイルが中止されます。

表33‒1　自由形式正書法で指定できないコンパイラオプション

オプション名

機能

-StdVersion

第1次規格／第2次規格の解釈でコンパイルする

-V3Rec

メインフレーム（VOS3）の固定長または可変長レコード形式のプログラムを，VOS3の日本語文字の扱いに合わせてコンパイルする

-CompatiV3

VOS3 COBOL85互換を指定する

-StdMIA

MIA仕様の範囲外チェックをする

-Std85

JIS仕様でチェックする

なお，固定形式正書法で書かれたソースの途中に「>>SOURCE FORMAT IS FREE」が指定されている場合も，これらのコンパイラオプションを指定するとエラーとなります。

33.3　さまざまな形態のCOBOL原始プログラムのコンパイル

33.3.1　原始文操作機能

ここでは，COBOL2002の原始文操作機能について説明します。

(1)　COPY文による登録集原文の取り込み

登録集原文（COPY登録集）は，プログラムでよく利用する標準化した手続き，ファイル記述，完全なプログラムなどを登録したファイルです。プログラム中にCOPY文を記述すると，この登録集原文を複写してコンパイルできます。

(2)　登録集原文のファイル形式

登録集原文は，ファイル単位に登録・複写します。

登録集原文を登録するファイルのファイル形式は，.cbl，.cob，.ocb，.cbf，.ocfのどれかの拡張子の付いた形式とします。ただし，環境変数CBLFREEまたはCBLFIXで自由形式拡張子，固定形式拡張子が設定してあれば，該当する拡張子の付いた形式も有効です。

(3)　COPY文の指定形式

COPY文の指定形式を次に示します。COPY文の文法の詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「3.2.2　COPY文」を参照してください。

原文名

原文名には，登録集原文が登録されているファイルの名称を，拡張子を付けないで指定します。

原文名には，かな文字と拡張コード文字は使用できません。また，原文名で英大文字と英小文字は区別されません。

原文名は，COBOL語の定義に従い31文字まで指定できます。ただし，-Compati85,Syntaxオプション指定時は，先頭の30文字までしか有効となりません。また，次のオプションを指定している場合は，先頭の8文字までしか有効となりません。

-V3Rec,Fixed　-V3Rec,Variable　-CompatiV3

原文名定数

原文名定数は，登録集原文を登録してあるファイルの絶対パス名を引用符で囲んで指定します。このとき，ファイル名には拡張子も付けます。

-V3ConvtNameオプションを指定したときの原文名定数の扱い

-V3ConvtNameオプションを指定する場合，原文名定数には登録集原文を登録してあるファイルのファイル名を引用符で囲んで指定します。

-V3ConvtNameオプションを指定すると，VOS3 COBOL85のソースファイルとの互換のため，原文名定数中の文字が変換されて検索されます。変換規則については，「33.5.12　他システムとの移行の設定」の「(12)　-V3ConvtNameオプション」を参照してください。

登録集名

登録集名は，登録集環境変数としてSETコマンドで次のように設定しておきます。

形式

SET 登録集名=登録集検索フォルダ〔; …〕

規則

登録集検索フォルダには，原文名に対応するファイルを検索する任意のフォルダを絶対パスで指定します。このパス名に，原文名または原文名定数で指定したファイル名を連結して絶対パス名とします。

登録集環境変数名は，先頭が英大文字で始まる，英大文字と数字で構成される8文字以下の文字列でなければなりません。

登録集環境変数に設定するパス名は，複数指定できます。複数指定した場合，左側から指定した順番に検索されます。

(4)　登録集原文の検索順序

原文名で指定したファイルは，拡張子，フォルダの二つの条件で検索されます。それぞれの検索順序は次のようになっていて，両者のうちでは拡張子による検索順序が優先します。また，-V3ConvtNameオプションを指定した場合，原文名定数に指定したファイルは，フォルダによる検索順序で検索されます。

拡張子による検索順序

固定形式拡張子（環境変数CBLFIXで設定）

自由形式拡張子（環境変数CBLFREEで設定）

.cbl

.cob

.ocb

.cbf

.ocf

フォルダによる検索順序※

登録集環境変数で設定したフォルダ

環境変数CBLLIBで指定したフォルダ

カレントフォルダ

例えば，固定形式拡張子，自由形式拡張子とも設定されていない場合，"ファイル名.cbl"で1.〜3.の順にフォルダを検索し，目的のファイルがなければ，次に"ファイル名.cob"で同様に検索します。

注※

開発マネージャを使用する場合の検索順序については，「33.6.3　コンパイラ環境変数の詳細」の「(10)　CBLLIB」の説明を参照してください。

33.3.2　スタックコンパイル機能（連続コンパイル機能）の利用

スタックコンパイル機能とは，複数個の翻訳単位のソース単位を含む翻訳グループを一つのコンパイル単位としてコンパイルする機能です。この機能には次のような利点があります。

一つのCOBOLソースファイルに主プログラム，副プログラムを含めることができます。このソースファイルから作成される実行可能ファイルと1対1で対応するため管理がしやすくなります。

一つのDLLを構成する副プログラム群を，同じソースファイルにまとめることができます。

(1)　コンパイラオプションとの関係

主プログラム指定（-Main,System／-Main,V3）以外のオプションは，すべての翻訳単位のソース単位に対して有効となります。-Main,System，-Main,V3オプションとほかのオプションとの関係については，「33.5.5　最終生成物の種類（プロジェクトの種類）の設定」を参照してください。

(2)　主プログラム指定

主プログラム指定（-Main,System／-Main,V3）を指定した場合は，ソースファイル中の先頭の最外側のプログラムが主プログラムとなります。したがって，制御プログラムからは先頭の最外側のプログラムだけが呼び出せます。2番目以降の最外側のプログラムは，呼び出せません。

(3)　スタックコンパイル（連続コンパイル）時の出現順序

クラス定義，インタフェース定義を含むソースファイルを，連続コンパイルできます。ただし，リポジトリ段落に指定された翻訳単位が別のソースファイルで定義されている場合，別のソースファイルを先にコンパイルしておく必要があります。詳細は，「34.　定義別のコンパイル方法とリポジトリファイル」を参照してください。

なお，インタフェース定義は，ほかのソース単位より先に記述されていてもかまいません。

(4)　コンパイルリスト

スタックコンパイルを実行したときのコンパイルリストについては，「付録E　コンパイルリスト」を参照してください。

(5)　プログラム間連絡

一つのコンパイル単位に最外側のプログラムが複数個含まれていても，これらの最外側のプログラムはすべて別のコンパイル単位のCALL文で呼び出せます。

(6)　ソースファイルと各種ファイルの関係

スタックコンパイル時にコンパイラが生成するファイルは，通常のコンパイル時に生成するファイルと同じです。

(7)　実行可能ファイルの作成単位

スタックコンパイル機能を使用した場合，オブジェクトファイルは，ソースファイル単位で作成されます。このため，ソースファイル中の複数のプログラムから，別々の実行可能ファイルを作成することはできません。

複数の最外側のプログラムを含むソースファイルをスタックコンパイルし，生成されたオブジェクトファイルの一部のプログラムだけを利用するような実行可能プログラムは，作成できます。ただし，使用しないプログラムを含んでいるため，必要以上に実行可能ファイルのサイズが大きくなります。

33.3.3　条件翻訳の利用

条件翻訳を使用すると，翻訳変数を用いた条件式の真偽に従って，ソースコードの有効／無効を制御できます。翻訳変数は，原始プログラム中にDEFINEを書いて定義する方法と，コンパイル時に-Defineオプションを指定して定義する方法があります。

翻訳指令の詳細な構文規則および一般規則については，マニュアル「COBOL2002　言語　標準仕様編」　「3.　翻訳指令機能」を参照してください。

条件翻訳の使用例を，次に示します。

（例1）IF指令の使用例

IF指令は，分岐の条件翻訳をしたい場合に使用します。

>>IFに続く条件式の真偽によって，プログラムテキストの有効・無効を指示できます。

000100*>IFとDEFINED条件の例
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. IF-SYNTAX.
000400 DATA DIVISION.
000500 >>DEFINE CHR01 AS 'ABCD'
000600 WORKING-STORAGE SECTION.
000700 PROCEDURE DIVISION.
000800 >>IF CHR01 IS DEFINED
000810     *> 翻訳変数CHR01は定義されているのでこちらが有効になる
000900     DISPLAY '--- CHR01 IS DEFINED ---'.
001000 >>ELSE
001100     *> こちらの行はコンパイルの結果無効となる
001100     DISPLAY '--- CHR01 IS NOT DEFINED ---'.
001200 >>END-IF

（例2）IF指令およびDEFINED条件と-Defineオプションの例

DEFINED条件は，指定された翻訳変数名が定義済みかどうかを判定する条件文です。

次の原始プログラムでは，翻訳変数DEBUGの定義の有無によって，IF指令の真偽が決定します。コンパイル時に「-Define DEBUG」を指定すると，翻訳変数DEBUGが定義され，IF指令が真となります。-Defineオプションを指定しない場合は，IF指令が偽となります。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. TEST001.
000300 PROCEDURE DIVISION.
000400
000500 >>IF DEBUG IS DEFINED
000600     DISPLAY 'this is debug message'.
000700 >>END-IF

デバッグ行を使用しても同様の処理ができますが，デバッグ行は第4次規格の廃要素であり，次回規格改訂時には削除される予定のため，条件翻訳を使用することを推奨します。

（例3）EVALUATE指令の例−書き方1

EVALUATE指令は，多方向分岐の条件翻訳をしたい場合に使用します。

WHEN以下の条件によって，有効となるプログラムテキストが選択されます。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. TEST001.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 PROCEDURE DIVISION.
000600 >>DEFINE EXD01 AS 10
000700
000800 >>EVALUATE EXD01 *> 翻訳変数 EXD01の値を評価する
000900   >>WHEN  3
001000     DISPLAY '--- 3          ---'.
001100   >>WHEN  15
001200     DISPLAY '--- 15         ---'.
001300   >>WHEN  9  THRU 11 *> 9から11の間にある場合
001400     DISPLAY '---  9 THRU 11 ---'. *> ここが有効となる
001500   >>WHEN OTHER
001600     DISPLAY '--- WHEN OTHER ---'.
001700 >>END-EVALUATE

（例4）EVALUATE指令の例−書き方2

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINE01.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 >>DEFINE LEVEL AS 2
000600 PROCEDURE DIVISION.
000700 >>EVALUATE TRUE
000800   >>WHEN LEVEL < 3  *> ここが真
000900     DISPLAY 'lower'.
001000   >>WHEN LEVEL > 5
001100     DISPLAY 'higher'.
001200   >>WHEN OTHER
001300     DISPLAY 'other'.
001400 >>END-EVALUATE

（例5）EVALUATE指令の例−書き方2

EVALUATE指令では，一度真の条件が現れた場合，それ以降にさらに真の条件があっても実行されません。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINE01.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 >>DEFINE LEVEL AS 2
000600 PROCEDURE DIVISION.
000700 >>EVALUATE TRUE
000800   >>WHEN LEVEL < 3 *> ここが真
000900     DISPLAY 'lower'.
001000   >>WHEN LEVEL > 5
001100     DISPLAY 'higher'.
001200   >>WHEN LEVEL < 5 *>ここも真だが，すでに真となるWHENが存在する。
001300     DISPLAY 'lower 2'. *> よってここは実行されない。
001400   >>WHEN OTHER
001500     DISPLAY 'other'.
001600 >>END-EVALUATE

（例6）-Defineオプションの使用例

次のプログラムを「ccbl2002 -Define CHR01=ABCD SAMPLE1.cbl」と指定してコンパイルした場合，「>>IF CHR01 = 'ABCD'」の条件が真となります。

ソースファイル名称：SAMPLE1.cbl
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINEOPTION.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 PROCEDURE DIVISION.
000600 >>IF CHR01 = 'ABCD'
000700     *> 翻訳変数CHR01は-DefineオプションでABCDと定義。
000750     *> よってこちらが真。
000800     DISPLAY '--- CHR01 IS "ABCD" ---'.
000900 >>ELSE
001000     *> こちらの行は偽
001100     DISPLAY '--- CHR01 IS NOT "ABCD" ---'.
001200 >>END-IF

注意事項

-Defineオプションでは，翻訳変数値を文字列として扱います。このため，数値は渡せません。

33.3.4　条件翻訳結果のコンパイルリスト

条件翻訳の結果，コンパイル対象とならなかった行を，無効行と呼びます。

COBOL2002では，コンパイルリスト上で，原始プログラム中の無効行となった部分を確認できます。また，コンパイルリストに無効行を出力しない機能もあります。

(1)　コンパイルリスト上の表示

条件翻訳の結果無効行となった行は，コンパイルリストに'X'が出力されます。

また，コンパイルリストに無効行を出力したくない場合は，-SrcListオプションにNoFalsePathサブオプションを付けて指定します。

コンパイルリストに関係するその他のオプションについては，「付録E.1　リストの出力」を参照してください。

コンパイルリストの例1

-SrcList,CopyAllオプションを指定した場合

D CP N ----+----1----+----2----+----3----+----4----+----5----+----6----+
       000100 IDENTIFICATION DIVISION.
       000200 >>DEFINE CMPVAR1 AS -123456
       000500 PROGRAM-ID. AAA.
       000900 PROCEDURE DIVISION.
       001000 >>IF CMPVAR1 IS DEFINED
       001100     DISPLAY '--- test (1) ---'.
       001200     DISPLAY '--- test (2) ---'.
       001300 >>ELSE
X      001400     DISPLAY '--- test (3) ---'.
X      001500     DISPLAY '--- test (4) ---'.
       001600 >>END-IF

（説明）

翻訳変数CMPVAR1が000200行で定義されているので，ELSE側である001400，001500行は無効行となります。そのため，これらの行の先頭にXが出力されます。

コンパイルリストの例2

-SrcList,CopyAll,NoFalsePathオプションを指定した場合

D CP N ----+----1----+----2----+----3----+----4----+----5----+----6----+
       000100 IDENTIFICATION DIVISION.
       000200 >>DEFINE CMPVAR1 AS -123456
       000500 PROGRAM-ID. AAA.
       000900 PROCEDURE DIVISION.
       001000 >>IF CMPVAR1 IS DEFINED
       001100    DISPLAY '--- test (1) ---'.
       001200    DISPLAY '--- test (2) ---'.
       001300 >>ELSE
       001600 >>END-IF

（説明）

-SrcListオプションにNoFalsePathサブオプションを指定した場合，無効行となった001400，001500行は，コンパイルリストに出力されません。

その結果，001600行が詰められて，001300行の次に出力されます。

(2)　無効行の定義

無効行の定義を，次に示します。

条件翻訳として判定中の>>IF，>>ELSE，>>END-IF，>>EVALUATE，>>WHEN，>>END-EVALUATEが指定された行自身は，無効行とはなりません。

条件翻訳のための翻訳指令行でも，無効な領域にある場合は無効行となります。

>>SOURCE FORMATは，常に無効行となりません。

次に，各定義の例を示します。なお，例中の「X」は，その行が無効行となることを示します。

1.の例（その1）

>>IFの>>ELSE側が無効な場合，>>IFや>>ELSEなどは無効行となりません。

      >>DEFINE ABC 123
      >>IF ABC = 123
          DISPLAY 'OK'.
      >>ELSE
X         DISPLAY 'NG'.
      >>END-IF

1.の例（その2）

>>IFの>>ELSE側が有効な場合の例です。

      >>DEFINE ABC 123
      >>IF ABC = 12345
X         DISPLAY 'NG'.
      >>ELSE
          DISPLAY 'OK'.
      >>END-IF

1.の例（その3）

>>EVALUATEの例です。

      >>DEFINE CHAR01  AS  'ABCD'
      >>EVALUATE TRUE
        >>WHEN CHAR01 = 'ABCD'
          DISPLAY '0001'.
          DISPLAY '0002'.
        >>WHEN CHAR01 = 'XYZ'
X         DISPLAY '0003'.
X         DISPLAY '0004'.
        >>WHEN OTHER
X         DISPLAY 'OTHER'.
      >>END-EVALUATE

2.の例

無効な領域にある場合は，>>IFなどの翻訳指令行自身も無効行となります。

      >>DEFINE ABC 123
      >>IF ABC = 123
          DISPLAY 'OK'.
      >>ELSE
X         DISPLAY 'NG'.
X         >>IF ABC = 456
X           DISPLAY 'OK'.
X         >>ELSE
X           DISPLAY 'NG'.
X         >>END-IF
      >>END-IF

3.の例

無効な領域にある場合でも，>>SOURCE FORMAT指令は，無効行になりません（>>SOURCE FORMAT指令は，どこに指定されても有効となります）。

      >>DEFINE ABC 123
      >>IF ABC = 123
          DISPLAY 'OK'.
      >>ELSE
X         DISPLAY 'NG1'.
X         DISPLAY 'NG2'.
          >>SOURCE FORMAT IS FREE
X         DISPLAY 'NG3'.
X         DISPLAY 'NG4'.
      >>END-IF

33.4　コンパイラの起動方法

COBOL2002で作成したプログラムをコンパイルするには次の方法があります。

ccbl2002コマンドによる方法

ccbl2002コマンドを実行することで，COBOLソースファイルをコンパイル，リンクし，実行可能ファイル，DLL（ダイナミックリンクライブラリ）を生成できます。

開発マネージャを利用する方法

開発マネージャを利用して，プログラムのコンパイル，リンクができます。

開発マネージャを利用したコンパイルの方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

cblbuild2kコマンドによる方法

開発マネージャの［ビルド］［リビルド］をコマンドラインから起動する方法です。

ccblコマンドによる方法

ccblコマンドを使用することで，COBOL85形式のコンパイラオプションを指定して，プログラムのコンパイル，リンクができます。

33.4.1　ccbl2002コマンド

COBOLプログラムをコマンドプロンプトからコンパイルするには，ccbl2002コマンドを使用します。

ccbl2002コマンドの形式を次に示します。

形式

ccbl2002 〔オプション〔…〕〕 ファイル名〔…〕

オプション

コンパイラオプションを指定します。

コンパイラオプションの指定方法には，ccbl2002コマンドの引数に指定する方法と環境変数CBLCOPT2002で指定する方法の2種類があります。なお，ccbl2002コマンドの引数と環境変数CBLCOPT2002の両方にコンパイラオプションを指定した場合は，引数で指定したオプションの方が優先されます。

個々のコンパイラオプションの機能と使用方法については，「33.5　コンパイラオプション」を参照してください。

ファイル名

コンパイルするCOBOLソースファイルや，その他必要なファイルの名称を指定します。指定できるファイルの種類は次のとおりです。

COBOLソースファイル（.cblほか）

オブジェクトファイル（.obj）

ライブラリファイル（.lib）

リソース定義ファイル（.rc）

モジュール定義ファイル（.def）

リソースファイル（.res）

指定規則

各引数は，一つ以上の空白，タブ，または改行文字で区切ります。

ただし，ccbl2002コマンドに空白を含むファイル名を指定する場合は，ファイル名を引用符（ " ）で囲む必要があります。

コマンドライン上には，リンカに渡すオプションも指定できます。この場合，-Linkオプションを使用します。-Linkオプションの使い方については，「33.5　コンパイラオプション」を参照してください。

コマンドファイルを使った引数の指定方法

ccbl2002コマンドにオプションやファイル名を指定する場合，コマンドラインに直接指定する代わりに，コマンドファイルを使っても指定できます。コマンドファイルを指定すると，ファイルの中身がコマンドライン上に展開され，コマンドの一部となります。

コマンドライン上には，コマンド名以降であればどこにでもコマンドファイルを指定できます。コマンドファイル名の先頭には，@を付けて指定します。

（コマンドファイルの使用例）

cblsrc.txtの内容

  -Main,System sample.cbl

objfiles.txtの内容

  prog1.obj prog2.obj

入力コマンド

  ccbl2002 @cblsrc.txt @objfiles.txt -OutputFile test1.exe

展開後のコマンドライン

  ccbl2002 -Main,System sample.cbl prog1.obj prog2.obj
           -OutputFile test1.exe

終了コード

ccbl2002コマンドは，次の終了コードを返します。

終了コード

意味

出力される

エラーメッセージのレベル

0

コンパイルは正常終了した。

Iレベルエラー

Wレベルエラー

1

重大エラーが発生した。

Sレベルエラー

2

回復不能エラーが発生した。

Uレベルエラー

なお，エラーの詳細については，コンパイルリストやエラーメッセージを参照してください。

ccbl2002コマンドのヘルプ

オプションもファイル名も指定しないで，ccbl2002コマンドだけが入力された場合，または次のコマンドを入力された場合にccbl2002コマンドのヘルプを出力できます。

形式

ccbl2002 〔｛-Help｜-?｝〕

33.4.2　ccblコマンド

ccblコマンドは，COBOL85からCOBOL2002への移行を円滑にするために使用するコマンドです。

ccblコマンドを使用すると，COBOL85形式のコンパイラオプションを指定して，COBOLプログラムをコンパイルおよびリンクできます。これによって，既存のCOBOL85で作成した資産（コンパイル用のバッチファイルなど）をCOBOL2002で流用できます。ただし，COBOL2002で新たに追加されたコンパイラオプションは，ccblコマンドでは使用できません。したがって，通常は，ccbl2002コマンドを使用してください。

ccblコマンドは，オプションの指定形式がccbl2002コマンドとは異なりますが，以下の「注意事項」にある場合を除き，コンパイル結果や生成するオブジェクトは，ccbl2002と同じです。ただし，ccblコマンドによって生成したさまざまなファイル（オブジェクトファイル，実行可能ファイル，DLL，プログラム情報ファイルなど）はCOBOL85環境で使用することはできません。

形式

ccbl 〔オプション〔…〕〕 ファイル名〔…〕

ccblコマンドの形式，指定方法，および終了コードは，COBOL85のccblコマンドと同じです。また，コンパイラオプションの指定形式も，COBOL85と同じ形式です。

COBOL85形式のコンパイラオプションの詳細については，「付録I　COBOL85とCOBOL2002のコンパイラオプションの対応」を参照してください。

ccblコマンドのヘルプ

オプションもファイル名も指定せず，ccblコマンドだけが入力された場合，または次のコマンドを入力することでccblコマンドのヘルプを出力できます。なお，COBOL85でサポートされているオプションだけが出力され，COBOL2002で新規に追加されたオプションは出力されません。

形式

ccbl 〔-?〕

注意事項

ccblコマンドには，COBOL2002形式のコンパイラオプションを指定できません。また，COBOL2002で新規に追加されたコンパイラオプションは，ccblコマンドには指定できません。

コンパイルリストやコンパイラオプション詳細情報表示では，ccblコマンドに指定された旧形式のオプションは，新形式に変換されて表示されます。

ccblコマンドは，常に-Compati85,Allオプションを暗黙的に仮定して動作します。

33.4.3　cblbuild2kコマンド

cblbuild2kコマンドは，プロジェクト単位に実行可能ファイル，DLL，または標準ライブラリを生成する方法です。このコマンドは，開発マネージャの［ビルド］［リビルド］メニューに対応するものです。

(1)　プロジェクトの概念と定義方法

プロジェクトとは，実行単位を構成する資源を一括して管理するための概念です。プロジェクトには，実行単位を構成するソースファイル（登録集原文を含む）や，登録集原文を生成する基となった各種定義ファイル，およびコンパイル時の環境やオプションなどを登録・定義できます。定義したプロジェクトの内容は，プロジェクトマスタファイル（.hmf）に格納されます。プロジェクトマスタファイルには，複数の関連するプロジェクトをまとめて定義できます。なお，COBOL85 Version 5以前のプロジェクトファイルを対象とするときは，元のファイルと同じフォルダにCOBOL2002のプロジェクトマスタファイルが作成されます。

プロジェクト，およびプロジェクトマスタは，開発マネージャ上で定義します。定義方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

プロジェクトマスタファイルの保存について

プロジェクトマスタファイルは，ビルド，またはリビルドによってプロジェクトマスタ内のプロジェクトの管理情報に変更が生じた場合，自動的に保存されます。ただし，プロジェクトマスタファイル読み込み時に無効なファイルやオプションなどの警告メッセージが表示されたときは，プロジェクトマスタファイルの自動保存は行われません。

(2)　ビルドとリビルド

ビルド，リビルドは，プロジェクト内の資源の依存関係を基に，プロジェクト単位に実行可能ファイル，DLL，または標準ライブラリを生成する方法です。

ソースファイルからコンパイル，リンクをするだけでなく，例えば，必要な登録集原文が定義ファイルから生成されていなければ，コンパイルに先立って登録集原文を生成します。

ビルド，リビルドには次のような違いがあります。

(a)　ビルド

実行可能ファイル，DLL，または標準ライブラリを生成したあとに定義ファイル，ソースファイル，オプションなどを変更した場合，必要な資源だけを再生成，再コンパイルして実行可能ファイル，DLL，または標準ライブラリを作り直す方法です。

(b)　リビルド

変更の有無に関係なくすべての資源を再生成，再コンパイルして実行可能ファイル，DLL，または標準ライブラリを作り直す方法です。

再生成，再コンパイルが実行されるケースやその対象など，ビルド，リビルドの詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

(3)　コマンドの形式

cblbuild2kコマンドの指定形式を次に示します。

形式

cblbuild2k
   {〔-a〕〔-p〕〔-y〕〔-c〕〔-m〕 入力ファイル名 …｜-h｜-? }

-a

このオプションを指定するとリビルドが実行されます。

指定しない場合はビルドが実行されます。

-p

このオプションを指定すると，プロジェクトマスタに定義されているすべてのプロジェクトに対してビルドが実行されます。

指定しない場合は，プロジェクトマスタで作業中プロジェクトに設定されたプロジェクトに対して，ビルドが実行されます。

-y

このオプションは，COBOL85 Version 5以前のバージョンからCOBOL2002へ移行するための機能です。

このオプションを指定すると，プロジェクトマスタを作成するかどうかの確認メッセージが表示されません。

指定しない場合は，プロジェクトマスタを作成するかどうかの確認メッセージが表示されます。

-c

このオプションは，COBOL85 Version 5以前のバージョンからCOBOL2002へ移行するための機能です。

このオプションを指定すると，プロジェクトマスタファイルの作成だけを行い，プロジェクトのビルドは実行しません。

指定しない場合は，プロジェクトマスタファイルの作成を行ったあと，プロジェクトのビルドが実行されます。

-m

このオプションは，このシステム以外で作成されたプロジェクトマスタファイルをCOBOL2002へ移行するための機能です。

このオプションを指定すると，入力ファイルがこのシステム以外の開発マネージャで保存されたプロジェクトマスタファイルの場合でも警告メッセージを表示しません。

指定しない場合は，警告メッセージを表示します。

入力ファイル名

処理の対象となるファイルを指定します。入力ファイルには，次のファイルが指定できます。

プロジェクトマスタファイル（.hmf）

入力ファイル名の拡張子を省略した場合は，.hmfが仮定されます。また，入力ファイルには複数のファイルが指定できます。

また，COBOL85で作成したプロジェクトファイルおよびプロジェクトマスタファイルも入力ファイルにできます。

「-」（ハイフン）で始まる名称を指定した場合はエラーになります。

-hまたは-?

コマンドの説明が表示されます。

規則

オプションの記号には「-」の代わりに「/」も使用できます。

指定されたオプションは，すべての入力ファイルに対して有効となります。

(4)　割り込み

cblbuild2kコマンドの実行中に［Ctrl］＋［C］キーを押すと，処理を中断して終了します。ただし，各ソースのコンパイル単位で中断を受け付けるため，すぐには中断しない場合があります。

(5)　終了コード

cblbuild2kコマンドは，次の終了コードを返します。

終了コード

意味

0

cblbuild2kは正常終了した。

1

cblbuild2kでエラーが発生した。

2

cblbuild2kがユーザによって中断された。

終了コード1が返ってくる条件を，以下に示します。

プログラム内で内部エラーが発生した

cblbuild2kコマンドが呼び出すコンパイラ，およびリンカが，目的とする生成物を生成できなかった

ユーザが「新しいファイルの種類」で登録した生成ツールが，目的とする生成物を生成できなかった

ただし，これは生成ツールが以下の終了コードを返す仕様である必要があります。

目的とする生成物を生成できた場合：0

目的とする生成物を生成できなかった場合：0以外

33.5　コンパイラオプション

ここでは，ccbl2002コマンドおよび開発マネージャに指定するコンパイラオプションについて説明します。なお，COBOL85のコンパイラオプションとCOBOL2002のコンパイラオプションとの対応については，「付録I　COBOL85とCOBOL2002のコンパイラオプションの対応」を参照してください。

33.5.1　構文規則

コンパイラオプションの構文規則について説明します。

(1)　オプション指定項

コマンドライン上で，コンパイラオプションを指定する部分をオプション指定項と呼びます。

次の例の下線部分は，それぞれオプション指定項です。

ccbl2002 -Option,SubOption -AnotherOption filename.cbl

(2)　オプション指定項の構成

一つのオプション指定項を構成する要素，および構成要素の名称を次に示します。

-Option,SubOption Argument
   1.      2.        3.

1.をオプション名と呼びます。

2.をサブオプション名と呼びます。

3.をオプションの引数と呼びます。上記の例では，サブオプション名に引数が従属していますが，オプション名に直接引数が従属することもあります。

2.と3.を合わせて，サブオプションと呼びます。

1.〜3.を合わせて，オプションと呼びます（オプションは，一つのオプション指定項全体を表します）。

規則

あるオプションOptionに従属するオプションのことを「Optionのサブオプション」と呼びます。また，説明の対象となるサブオプションがどのオプションに従属するか明確な場合には，主従関係を特定しないで単に「サブオプション」と呼びます。

SubOptionがOptionのサブオプションである場合，構文規則およびオプション指定項では，次のように記述します。

-Option,SubOption

また，複数のサブオプションを持つオプションは，次のように記述します。

-Option,SubOption1,SubOption2

オプションとサブオプションの区切りには，コンマ（,）を使用します。また，サブオプション同士の区切りにもコンマを使用します。

オプションには，サブオプションのほかに，ファイル名や数値などの値を引数として持つものもあります。

オプションOptionが引数Argumentを持つ場合は，次のように記述します。

-Option Argument

引数は，オプション一つにつき一つだけしか指定できません。

オプション名同士，およびオプション名と引数の区切りには，半角空白文字を使用します。

33.5.2　一般規則

コンパイラオプションの一般規則について説明します。

大文字小文字は，等価とみなされます。

オプション指定項の先頭文字は，ハイフン（-）またはスラント（/）となります。

オプションとサブオプションを区切るコンマの前後には，空白を入れてはいけません。

コンパイラオプションの指定に構文誤りがある場合，コンパイル時に回復不能（Uレベル）エラーとなり，コンパイルが中止されます。

33.5.3　コンパイラオプションの優先順位

複数のコンパイラオプションを指定した場合の，各オプションの優先順位を次に示します。

(1)　指定個所による優先順位

コンパイラオプションを指定した個所によって，優先順位が高くなります。

ccbl2002コマンドの場合

次の順序で，コンパイラオプションの優先順位が高くなります。

優先度

指定個所

オプションの形式

1

ccbl2002のコマンド行に指定したオプション

新形式

2

環境変数CBLCOPT2002に指定したオプション

新形式

ccblコマンドの場合

次の順序で，コンパイラオプションの優先順位が高くなります。

優先度

指定個所

オプションの形式

1

ccblのコマンド行に指定したオプション

旧形式

2

環境変数CBLCOPTに指定したオプション

旧形式

3

ccblコマンドで暗黙的に仮定されるオプション

新形式

環境変数CBLCOPT2002，CBLCOPTについては，「33.6　コンパイラ環境変数」を参照してください。

(2)　オプション間の優先順位

コンパイラオプションには，オプション同士が背反の関係となっていたり，あるオプションを指定するとほかのオプションが仮定されたりするものがあります。このようなオプション間の優先順位を，次に示します。

(a)　あとに指定した方のオプションが有効となる場合

次のオプションを同時に指定した場合，あとに指定した方のオプションが有効となります。

-DigitsTrunc／-Comp5

-V3Rec／-EquivRule

-CompatiV3／-EquivRule

(b)　オプションを指定すると，ほかのオプションが無効となる場合

次のコンパイラオプションを指定した場合，無効となるオプションがあります。

指定したオプション

無効となるオプション

-MainNotCBL

-Main

-Dll

-Main

-SimSub

-Compile

-OutputFile

-ManifestFileExt

-Compile,CheckOnly

-DebugInf

-DebugCompati

-DebugData

-TDInf

-CVInf

-DebugRange

-TestCmd

-StdMIA

-Std85

-Std2002

-V3Spec

-StdVersion

-CompatiM7

-CompatiV3

-H8Switch

-Cblctr

-IgnoreLCC

-JPN

-CmDol

-Comp5

-NumAccept

-V3Rec

-V3RecFCSpace

-V3RecEased

-EquivRule,NotAny

-SQL

-SQLDisp

-BinExtend

-MaxDigits38

-IntResult,DecFloat40

-LiteralExtend

-StdMIA

-EquivRule,StdCode

-Bin1Byte

-V3Spec

-Comp5

-CmAster

-BinExtend

-CBLVALUE

-Bin1Byte

-CompatiM7

-NumAccept

-CmDol

-MaxDigits38

-IntResult,DecFloat40

-LiteralExtend

-V3RecEased

-Compati85,Syntax

-LiteralExtend

-Repository,Gen

-Compile

-UniObjGen

-JPN

-CompatiV3※

-V3Rec※

-V3RecFCSpace※

-V3RecEased※

-IntResult,DecFloat40

-Compati85,Power（-Compati85,All指定時も含む）

-CompatiV3

-LiteralExtend

-SimMain

-SimSub

-SimIdent

-LiteralExtend

注※

コンパイラ環境変数CBLV3UNICODEにYESを指定した場合，無効になりません。

(c)　仕様チェックオプションを複数指定した場合

-StdMIAオプション，-Std85オプション，-Std2002オプションは，同時に指定できません。同時に指定した場合，警告のメッセージが出力され，次の優先順位で有効となります。

-Std2002オプション

-Std85オプション

-StdMIAオプション

(d)　オプションを指定することによって，仮定されるオプション

次のコンパイラオプションを指定した場合，仮定されるオプションがあります。

指定したオプション

仮定されるオプション

-V3Spec

-V3Rec,Variable※1

-CompatiV3

-JPN,Alnum※2 ※3

-V3Rec,Variable

-DebugCompati

-DebugInf

-DebugData

-DebugInf

-DebugRange

-DebugInf

-DebugCompati

-TestCmd

-DebugInf

-TDInf

-TDInf

-DebugInf

-TDInfと-Optimize,3を同時に指定

-Optimize,2

（-Optimize,3を指定しても-Optimize,2が仮定される）

-CVInf

-DebugInf

-StdMIA,14

-StdMIA,13

-MaxDigits38および-IntResult,DecFloat40と-Optimize,3を同時に指定

-Optimize,2

（-Optimize,3を指定しても-Optimize,2が仮定される）

-SpaceAsZeroと-Optimize,3を同時に指定

-Optimize,2

（-Optimize,3を指定しても-Optimize,2が仮定される）

注※1

-V3Specオプションと-UniObjGenオプションを同時に指定した場合，-V3Rec,Variableオプションは仮定されません。

注※2

コンパイラ環境変数CBLV3UNICODEにYESを指定し，-UniObjGenオプションを指定した場合は，-CompatiV3オプションを指定しても-JPN,Alnumオプションは仮定されません。

注※3

-CompatiV3オプションと-JPN,V3JPNオプションまたは-JPN,V3JPNSpaceオプションを同時に指定した場合，-JPN,Alnumオプションは仮定されません。

(e)　ほかのオプションの指定を必要とするオプション

次のコンパイラオプションは，同時に指定する必要があるオプションを指定しない場合，無視されます。

指定したオプション

同時に指定する必要があるオプション

-SQLDisp

-SQL,ODBC

-UniEndian

-UniObjGen

-V3RecFCSpace

-V3Rec

-DllInit

-Dll

-V3RecEased

-V3Rec

-CheckUninitData

-Compile,CheckOnly

次のコンパイラオプションは，同時に指定する必要があるオプションを指定しない場合，コンパイルエラーとなります。

指定したオプション

同時に指定する必要があるオプション

-IntResult,DecFloat40

-MaxDigits38

-MaxDigits38

-IntResult,DecFloat40

-SpaceAsZero

-Compati85,All

-VOSCBL,OccursKey

-CompatiV3

-VOSCBL,ReportControl

-CompatiV3

-VOSCBL,DataComm

-CompatiV3

-VOSCBL,RedefinesData

-CompatiV3

-VOSCBL,AssignDataToDevice

-CompatiV3

-VOSCBL,EvaluateWhenOther

-CompatiV3

-JPN,V3JPNSpace

-CompatiV3

(3)　同じオプションを重複して指定した場合の規則

同じオプションを重複して指定した場合，次の規則に従ってオプションが決定されます。なお，オプションごとのサブオプションの指定規則については，「33.5.4　コンパイラオプションの一覧」を参照してください。

(a)　背反関係にあるサブオプション同士を指定した場合

最後に指定されたオプションが有効となります。

（例）

-Compile,｛CheckOnly｜NoLink｝

に対して

-Compile,CheckOnly -Compile,NoLink

と指定した場合，-Compile,NoLinkが有効となります。

ただし，次の場合は，特定のサブオプションが有効となります。

-JPN,V3JPNSpaceオプションと-JPN,Alnumオプションを重複して指定した場合は，-JPN,V3JPNSpaceオプションが有効となります。

-JPN,V3JPNSpaceオプションと-JPN,V3JPNオプションを重複して指定した場合は，-JPN,V3JPNSpaceオプションが有効となります。

-JPN,Alnumオプションと-JPN,V3JPNオプションを重複して指定した場合は，-JPN,V3JPNオプションが有効となります。

-Std85,Highオプション，-Std85,Middleオプション，-Std85,Lowオプションを重複して指定した場合は，次の優先順位で有効となります。

-Std85,Lowオプション

-Std85,Middleオプション

-Std85,Highオプション

(b)　省略可能なサブオプション同士，または複数選択できるサブオプション同士を指定した場合

前に指定したサブオプションの指定を引き継ぎ，あとに指定したサブオプションの指定が追加で有効となります。

（例）

-BigEndian ｛,Bin｜,Float｝+

に対して

-BigEndian,Bin -BigEndian,Float

と指定した場合，BinサブオプションとFloatサブオプションの両方が有効となります。これは，「-BigEndian,Bin,Float」を指定した場合と同じです。

(4)　オプションの打ち消し指定

デフォルト設定や環境変数などで指定済みのオプションを，コンパイル時に打ち消したい場合は，プリフィクス'no'の付いたコンパイラオプションを使用します。

例えば，環境変数CBLCOPT2002でオプション「-Details」が指定されている場合，コマンドラインで「ccbl2002 -noDetails …」と指定すると，環境変数CBLCOPT2002で設定済みのオプション「-Details」を打ち消せます。

規則

オプションにデフォルト値の設定がある場合，プリフィクス'no'は指定できません。この場合，オプションのデフォルト値を指定することで，オプションを打ち消します。

例えば，環境変数CBLCOPT2002でオプション「-Lib,CUI」が指定されている場合，デフォルト値に戻したいときは，コマンドラインで「-Lib,GUI」を指定します。

通常のオプションと打ち消しのオプションを同時に指定した場合は，あとに指定したオプションが有効となります。

打ち消しのオプションは，コマンドラインや環境変数CBLCOPT2002に指定したオプションを打ち消し，オプション指定によって仮定されるオプションは打ち消しません。

注意事項

コンパイルリストに出力されるオプション一覧や，-Detailsオプションを指定した場合にコマンドラインへ出力されるコンパイラオプションの詳細情報表示では，no指定のコンパイラオプションは表示されません。コンパイラオプションとして有効となったオプションだけが表示されます。

33.5.4　コンパイラオプションの一覧

コンパイラオプションの一覧を次に示します。

なお，打ち消しのオプション（-noXXX）を開発マネージャで指定する場合は，プロジェクト設定ダイアログボックスの［ユーザ設定］タブを使用してください。［ユーザ設定］タブの詳細は，マニュアル「COBOL2002　操作ガイド」のオプションの設定方法の説明を参照してください。

(1)　最終生成物の種類（プロジェクトの種類）

最終生成物※の種類（開発マネージャでは，プロジェクトの種類）を設定するコンパイラオプションを，次に示します。

注※

最終生成物とは，コンパイラが最終的に生成する実行可能ファイル，DLL，または標準ライブラリのことを示します。

表中の参照先の番号（（1），（2），…）は「33.5.5　最終生成物の種類（プロジェクトの種類）の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-Main,｛System｜V3｝ ファイル名

○

先頭の最外側プログラムを主プログラムとして作成する。開発マネージャでは，次のオプションが該当する。

System指定メインプログラム

V3指定メインプログラム

(1)　-Mainオプション

2

−

○

メインプログラムなし

(2)　メインプログラムなし

3

-Dll,｛Stdcall｜Cdecl｝（Windows(x86) COBOL2002で有効）

-Dll（Windows(x64) COBOL2002で有効）

-noDll

○

DLLの形式を指定する。

開発マネージャでは，次のオプションが該当する。

最終生成物の種類がダイナミックリンクライブラリ

StdCall：Dllの属性をstdcallにする

Cdecl：Dllの属性をcdeclにする

(3)　-Dllオプション（最終生成物の種類がダイナミックリンクライブラリ）

4

−

○

標準ライブラリを作成する

(4)　標準ライブラリ

（凡例）

○：開発マネージャから指定できる

−：コマンドライン（ccbl2002コマンド）に対応するオプションがない

(2)　製品連携

他製品との連携を設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.6　他製品との連携の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-SQL,｛XDM｜ODBC〔,NoCont〕｝

-noSQL

○

埋め込みSQL文をXDM/RDまたはODBCインタフェース機能で使用できるようにする。

(1)　-SQLオプション

2

-SQLDisp

-noSQLDisp

○

埋め込みSQL文に用途（USAGE句）が表示用（DISPLAY）のデータ項目を指定できるようにする。

(2)　-SQLDispオプション

3

-RDBTran

-noRDBTran

○

COMMIT文／ROLLBACK文をHiRDBによる索引編成ファイルに対して適用する。

(3)　-RDBTranオプション

4

-IsamExtend〔,Zone〕

-noIsamExtend

○

Btrieve（Pervasive.SQL）による索引編成ファイルを使用する。

(4)　-IsamExtendオプション（Windows(x86) COBOL2002で有効）

5

-XMAP,LinePrint

-noXMAP

○

書式印刷機能を使用して，順編成ファイルをプリンタに出力する。

(5)　-XMAPオプション（Windows(x86) COBOL2002で有効）

6

-OpenTP1

-noOpenTP1

○

OpenTP1を使用したデータコミュニケーション機能を使用できるようにする。

(6)　-OpenTP1オプション

（凡例）

○：開発マネージャから指定できる

(3)　実行

実行時の動作を設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.7　実行の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-NumAccept

-noNumAccept

○

ACCEPT文に数字項目を指定できるようにする。

(1)　-NumAcceptオプション

2

-NumCsv

-noNumCsv

○

CSV編成ファイルで，セルデータを数値として入出力できるようにする。

(2)　-NumCsvオプション

3

-MultiThread

-noMultiThread

○

マルチスレッド対応COBOLプログラムを作成する。

(3)　-MultiThreadオプション

4

-MainNotCBL

-noMainNotCBL

○

すべて副プログラムとして作成する。

(4)　-MainNotCBLオプション

5

-DllInit

-noDllInit

○

DLLを初期化する。

(5)　-DllInitオプション

6

−

○

メインファイルを指定する（開発マネージャで，プロジェクトのメインプログラムにするソースファイルを指定する）

(6)　メインファイルを指定する

（凡例）

○：開発マネージャから指定できる

−：コマンドライン（ccbl2002コマンド）に対応するオプションがない

(4)　最適化

プログラムの最適化を設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2））は「33.5.8　プログラムの最適化の設定」の番号（（1），（2））と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-Optimize,｛0｜1｜2｜3｝

○

コンパイル時の最適化のレベルを指定する。

(1)　-Optimizeオプション

2

-ScreenSpeed

-noScreenSpeed

○

画面の表示速度を重視する。

(2)　-ScreenSpeedオプション

（凡例）

○：開発マネージャから指定できる

(5)　デバッグ

デバッグを設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.9　デバッグの設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-DebugLine

-noDebugLine

○

デバッグ行を有効にする。

(1)　-DebugLineオプション

2

-DebugInf〔,Trace〕

-noDebugInf

○

異常終了時，エラー要約情報を出力する。

(2)　-DebugInfオプション

3

-DebugCompati

-noDebugCompati

○

実行時に次のチェックをする。

添字，指標名の繰り返し回数の範囲外チェック

プログラム間整合性チェック

(3)　-DebugCompatiオプション

4

-DebugData〔,ValueHex〕

-noDebugData

○

データ例外を検出する。

(4)　-DebugDataオプション

5

-TDInf

-noTDInf

○

テストデバッグ情報を出力する。

(5)　-TDInfオプション

6

-CVInf

-noCVInf

○

カバレージ情報を出力する。

(6)　-CVInfオプション

7

-DebugRange

-noDebugRange

○

添字，指標名の繰り返し回数について，次元ごとの範囲外チェックをする。

(7)　-DebugRangeオプション

8

-TestCmd｛,Full｜,Break｜,Sim｝+

-noTestCmd

○

TDコマンド格納ファイルに出力する情報の種類を指定する。

(8)　-TestCmdオプション

9

-SimMain プログラム名

-noSimMain

○

主プログラムをシミュレーションする。

(9)　-SimMainオプション

10

-SimSub プログラム名

-noSimSub

○

副プログラムをシミュレーションする。

(10)　-SimSubオプション

11

-SimIdent

-noSimIdent

○

副プログラム（一意名CALL文）をシミュレーションする。

(11)　-SimIdentオプション

（凡例）

○：開発マネージャから指定できる

(6)　リンク

リンクを設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.10　リンクの設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-StdCall

-noStdCall

○

stdcall呼び出し指示ファイルを有効にする。

(1)　-StdCallオプション（Windows(x86) COBOL2002で有効）

2

-StdCallFile .cbwファイル名

-noStdCallFile

○

stdcall呼び出し指示ファイル名を指定する。

(2)　-StdCallFileオプション（Windows(x86) COBOL2002で有効）

3

-Lib,｛GUI｜CUI｝

○

GUIモード／CUIモードのどちらの実行時ライブラリをリンクするかを指定する。

(3)　-Libオプション

4

−

○

ライブラリの指定。

(4)　ライブラリの指定

5

−

○

リンケージを行わない。

(5)　リンケージを行わない

6

-Compile,｛CheckOnly｜NoLink｝

-noCompile

×

コンパイルの処理範囲を指定する。

(6)　-Compileオプション

7

-DefFile .defファイル名

-noDefFile

×

生成する.defファイル名を指定する。

(7)　-DefFileオプション

8

-IconFile アイコンファイル名

-noIconFile

×

アイコンファイル名を指定する。

(8)　-IconFileオプション

9

-ResrcFile ファイル名

-noResrcFile

×

生成するリソース定義ファイル名を指定する。

(9)　-ResrcFileオプション

10

-OutputFile ファイル名

-noOutputFile

×

生成する実行可能ファイル名，またはDLLファイル名を指定する。

(10)　-OutputFileオプション

11

-Link オプションの並び

-noLink

U

リンカに渡すオプションを指定する。

(11)　-Linkオプション

12

-DynamicLink,Call

-noDynamicLink

○

定数指定のCALL文実行に動的リンク機能を使用するときに指定する。

(12)　-DynamicLinkオプション

13

-ManifestFileExt

-noManifestFileExt

○

マニフェストファイルを実行可能ファイルやDLLに埋め込まず，外部マニフェストファイルとするときに指定する。

(13)　-ManifestFileExtオプション

（凡例）

○：開発マネージャから指定できる

U：開発マネージャで使用する場合，［ユーザ設定］タブに指定する

×：開発マネージャから指定できない

−：コマンドライン（ccbl2002コマンド）に対応するオプションがない

(7)　規格

規格仕様のチェックを設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.11　規格の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-StdMIA｛,13｜,14｝+

-noStdMIA※

○

MIA仕様の範囲外チェックをする。

(1)　-StdMIAオプション

2

-Std85｛,｛High｜Middle｜Low｝｜,Obso｜,Report｝+

-noStd85※

○

JIS仕様をチェックする。

(2)　-Std85オプション

3

-Std2002｛,OutRange｜,Obso｜,Archaic｝+

-noStd2002

○

COBOL2002規格仕様をチェックする。

(3)　-Std2002オプション

4

-StdVersion,｛1｜2｝

-noStdVersion※

○

第1次規格／第2次規格の解釈でコンパイルする。

(4)　-StdVersionオプション

（凡例）

○：開発マネージャから指定できる

注※

これらのオプションは，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルするプログラムには指定できません。指定してコンパイルすると，エラーとなってコンパイルが中止されます。

(8)　移行

他システムとの移行を設定するコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.12　他システムとの移行の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-CompatiM7

-noCompatiM7

○

MIOS7 COBOL85との互換機能を有効にする。

(1)　-CompatiM7オプション（Windows(x86) COBOL2002で有効）

2

-CompatiV3※

-noCompatiV3

○

VOS3 COBOL85との互換機能を有効にする。

(2)　-CompatiV3オプション

3

-Compati85｛,IoStatus｜,Linage｜,Call｜,Power｜,Syntax｜,IDParag｜,RsvWord｜,NoPropagate｜,All｝+

-noCompati85

○

COBOL85互換機能を有効にする。

(3)　-Compati85オプション

4

-H8Switch

-noH8Switch

○

HITAC8000シリーズの仕様でコンパイルする。

(4)　-H8Switchオプション

5

-Cblctr

-noCblctr

○

CBL-CTR特殊レジスタを使用できるようにする。

(5)　-Cblctrオプション

6

-DigitsTrunc

-noDigitsTrunc

○

転記文で上位けたを切り捨てる。

(6)　-DigitsTruncオプション

7

-IgnoreLCC

-noIgnoreLCC

○

行送り制御文字を無視する。

(7)　-IgnoreLCCオプション

8

-CmAster

-noCmAster

○

1カラム目が'*'の行を注記行とする。

(8)　-CmAsterオプション

9

-CmDol

-noCmDol

○

7カラム目が'$'の行を注記行とする。

(9)　-CmDolオプション

10

-Comp5

-noComp5

○

COMP-5を指定できるようにする。

(10)　-Comp5オプション

11

-V3Spec〔,CopyEased〕

-noV3Spec

○

VOS3 COBOL85に対するCOBOL2002固有の構文をチェックする。

(11)　-V3Specオプション

12

-V3ConvtName

-noV3ConvtName

○

VOS3 COBOL85からのソースファイル互換のため，COPY文の原文名定数中の'¥'と'@'を変換する。

(12)　-V3ConvtNameオプション

13

-Switch,｛EBCDIC｜EBCDIK｝〔,Unprintable〕〔,noApplyJpnItem〕

-noSwitch

○

照合順序および字類条件をEBCDICコードまたはEBCDIKコードに切り替える。

(13)　-Switchオプション

14

-V3Rec,｛Fixed｜Variable｝※

-noV3Rec

○

メインフレーム（VOS3）の固定長または可変長レコード形式のプログラムを，VOS3の日本語文字の扱いに合わせてコンパイルする。

(14)　-V3Recオプション

15

-V3RecFCSpace

-noV3RecFCSpace

○

空白に関する機能キャラクタの扱いをメインフレーム（VOS3）と同等にする。

(15)　-V3RecFCSpaceオプション

16

-V3RecEased｛,QuoteCheck｜,WordCheck｝+

-noV3RecEased

○

-V3Recオプション指定時の仕様チェックを緩和する。

(16)　-V3RecEasedオプション

17

-DoubleQuote

-noDoubleQuote

○

引用符（ " ）を分離符とみなしてコンパイルする。

(17)　-DoubleQuoteオプション

18

-BigEndian｛,Bin｜,Float｝+

-noBigEndian

○

2進データ項目または浮動小数点データ項目をビッグエンディアン形式で処理する。

(18)　-BigEndianオプション

19

-VOSCBL｛,OccursKey｜,ReportControl｜,DataComm｜,RedefinesData｜,AssignDataToDevice｜,EvaluateWhenOther｝+

-noVOSCBL

○

メインフレーム互換機能を有効にする。

(19)　-VOSCBLオプション

20

-PortabilityCheck｛,Literal｜,Numeric｝+

-noPortabilityCheck

○

移行向けチェック機能を有効にする。

(20)　-PortabilityCheckオプション

21

-IgnoreAPPLY,FILESHARE

-noIgnoreAPPLY

○

APPLY FILE-SHARE句を覚え書きとみなす。

(21)　-IgnoreAPPLY,FILESHAREオプション

（凡例）

○：開発マネージャから指定できる

注※

これらのオプションは，自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルするプログラムには指定できません。指定してコンパイルすると，エラーとなってコンパイルが中止されます。

(9)　リスト出力

リスト出力の設定をするコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2））は「33.5.13　リスト出力の設定」の番号（（1），（2））と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-SrcList,｛OutputAll｜CopyAll｜CopySup｜NoCopy｝〔,NoFalsePath〕〔,DataLoc〕

-noSrcList

○

コンパイルリストを出力する。

(1)　-SrcListオプション

2

-ErrSup｛,I｜,W｝+

-noErrSup

○

IレベルまたはWレベルエラーの出力を抑止する。

(2)　-ErrSupオプション

（凡例）

○：開発マネージャから指定できる

(10)　その他

その他の設定をするコンパイラオプションを，次に示します。

表中の参照先の番号（（1），（2），…）は「33.5.14　その他の設定」の番号（（1），（2），…）と対応しています。

項番

オプション

マネージャ

機能

参照先

1

-Bin1Byte

-noBin1Byte

○

1バイトの2進項目を有効にする（PICTURE句の指定で2けたまでは1バイトとして扱う）。

(1)　-Bin1Byteオプション

2

-JPN,｛Alnum｜V3JPN｜V3JPNSpace｝

-noJPN

○

日本語項目の扱いを指定する。

(2)　-JPNオプション

3

-EquivRule,｛NotExtend｜NotAny｜StdCode｝

-noEquivRule

○

文字の等価規則をどう変更するか指定する。

(3)　-EquivRuleオプション

4

-UscoreStart

-noUscoreStart

○

先頭が下線のCALL定数を指定できるようにする。

(4)　-UscoreStartオプション

5

-BinExtend

-noBinExtend

○

2進データ項目に指定できる初期値を拡張する。

(5)　-BinExtendオプション

6

-MinusZero

-noMinusZero

○

10進項目で負の符号を持つゼロを正の符号を持つゼロに変換する。

(6)　-MinusZeroオプション

7

-TruncCheck

-noTruncCheck

○

転記でのデータ切り捨てをチェックする。

(7)　-TruncCheckオプション

8

-LowerAsUpper

-noLowerAsUpper

○

定数指定のCALLに指定された英小文字を英大文字に変換してプログラムを呼び出す。

(8)　-LowerAsUpperオプション

9

-CBLVALUE

-noCBLVALUE

○

環境変数CBLVALUEを有効にする。

(9)　-CBLVALUEオプション

10

-Repository,｛Gen｜Sup｝

-noRepository

○

リポジトリファイルの生成時，強制的に出力するか，更新しないかを指定する。

(10)　-Repositoryオプション

11

-RepositoryCheck

-noRepositoryCheck

○

同じソースファイル中の翻訳単位の定義と外部リポジトリ中の情報に相違があるかどうかをチェックする。

(11)　-RepositoryCheckオプション

12

-Define 翻訳変数名〔=値〕〔,翻訳変数名〔=値〕〕…

-noDefine

○

コンパイル時に有効となる，翻訳変数名とその値を定義する。

(12)　-Defineオプション

13

-Details

-noDetails

○

コンパイラオプションの詳細情報を出力する。

(13)　-Detailsオプション

14

-OldForm "旧オプションの並び"

U

PC COBOL85のオプションを指定する。

(14)　-OldFormオプション

15

-Help｜-?

×

ccbl2002コマンドのヘルプを出力する。

(15)　-Helpオプション

16

-UniObjGen

-noUniObjGen

○

シフトJISのCOBOLソースからUnicodeのオブジェクトを生成する。

(16)　-UniObjGenオプション

17

-UniEndian,｛Little｜Big｝

-noUniEndian

○

シフトJISで記述された日本語文字定数をUTF-16LE，またはUTF-16BEに変換する。

(17)　-UniEndianオプション

18

-MaxDigits38

○

数字項目，数字編集項目，および数字定数に指定できる最大けた数を18けたから38けたに拡張する。

(18)　-MaxDigits38オプション（Windows(x64) COBOL2002で有効）

19

-IntResult,DecFloat40

○

算術演算の中間結果の表現形式を40けたの10進浮動小数点形式にする。

(19)　-IntResult,DecFloat40オプション（Windows(x64) COBOL2002で有効）

20

-LiteralExtend,Alnum

-noLiteralExtend

○

英数字定数と定数指定のプログラム名の長さを拡張する。

(20)　-LiteralExtendオプション

21

-SpaceAsZero

-noSpaceAsZero

○

外部10進項目中に空白文字があるとき，ゼロとみなして比較，演算，転記を実行する。

(21)　-SpaceAsZeroオプション

22

-CheckUninitData

-noCheckUninitData

×

データ項目の初期化漏れをチェックする。

(22)　-CheckUninitDataオプション

23

-FunctionECSup,CodeConvErr

-noFunctionECSup

○

組み込み関数でコード変換エラーが発生しても例外条件を成立させない。

(23)　-FunctionECSup,CodeConvErrオプション

（凡例）

○：開発マネージャから指定できる

U：開発マネージャで使用する場合，［ユーザ設定］タブに指定する

×：開発マネージャから指定できない

(11)　XML連携（開発マネージャを使用する場合）

開発マネージャのツリービューでXMLデータ定義ファイルを選択したときに指定できるオプションです。

このページで指定するオプションの詳細については，マニュアル「COBOL2002　XML連携機能ガイド」を参照してください。

33.5.5　最終生成物の種類（プロジェクトの種類）の設定

最終生成物※の種類（開発マネージャでは，プロジェクトの種類）を設定するコンパイラオプションについて，説明します。

注※

最終生成物とは，コンパイラが最終的に生成する実行可能ファイル，DLL，または標準ライブラリのことを示します。

(1)　-Mainオプション

(a)　形式

-Main,｛System｜V3｝ ファイル名

(b)　機能

最外側のプログラムをアプリケーションの主プログラムとしてコンパイルします。

ファイル中に複数の最外側のプログラムがあるときは，先頭の最外側のプログラムを主プログラムとしてコンパイルします。

-Main,System ファイル名（System指定メインプログラム）

最外側のプログラムをアプリケーションの主プログラムとしてコンパイルします。

このとき，主プログラムが制御プログラムから受け取る引数の形式を，システム固有のargc，argv形式に合わせます。

なお，開発マネージャでは，プロジェクトの種類で「System指定メインプログラム」を選び，「メインファイルを指定する」オプションにメインファイルを指定すると，-Main,Systemオプションが指定されます。

-Main,V3 ファイル名（V3指定メインプログラム）

最外側のプログラムをアプリケーションの主プログラムとしてコンパイルします。

このとき，主プログラムが制御プログラムから受け取る引数の形式を，メインフレーム（VOS3）に合わせます。

なお，開発マネージャでは，プロジェクトの種類で「V3指定メインプログラム」を選び，「メインファイルを指定する」オプションにメインファイルを指定すると，-Main,V3オプションが指定されます。

(c)　注意事項

-Main,Systemオプションまたは-Main,V3オプションの指定がない場合で，次の条件をすべて満たすときには，先頭のCOBOLソースファイルに-Main,Systemオプションを指定したものと仮定されます。

-Compileオプションの指定がなく，かつ，オブジェクトファイル（.obj）の指定がない。

-SimMainオプションの指定がない。

-Mainオプションと-MainNotCBLオプションまたは-Dllオプションを同時に指定した場合，-Mainオプションが無効となります。

（例）

-MainNotCBL -Main,System

と指定した場合，-MainNotCBLオプションが有効となり，-Mainオプションは無効となります。

-Main,Systemオプション，-Main,V3オプションについては，「16.2　引数の受け取りと外部スイッチ」の記述も参照してください。

このオプションは，直後に指定されたファイルをアプリケーションの主プログラムとして扱います。

-Main,V3オプションを指定して作成した実行可能ファイルを実行するとき，受け取れるコマンド引数は一つ（空白まで）です。コマンド引数に空白を含むときは，引用符（ " ）で囲みます。

(2)　メインプログラムなし

開発マネージャ上でプロジェクトをビルドする場合に，メインのCOBOLソースファイルを指定しないとき，このオプションを指定します。「メインプログラムなし」を指定したプロジェクトは，メインプログラムのオブジェクトファイルまたはライブラリを，プロジェクトに登録する必要があります。

このコンパイル方式を選んだ場合で，作成しようとしているCOBOLプログラムが次の二つの条件を満たすときは，-MainNotCBLオプションを指定する必要があります。

最初に呼び出されるCOBOLプログラムより前に，他言語で記述されたプログラムが実行される場合

最初に呼び出されるCOBOLプログラムから，呼び出し元プログラムに戻る場合

このプロジェクトの種類で指定できるオプションは，-Main,Systemオプション（System指定メインプログラム）または-Main,V3オプション（V3指定メインプログラム）を指定して実行可能ファイルを生成する場合に準じますが，次のオプションは指定できません。

「メインファイルを指定する」

このオプションは，開発マネージャだけで指定できます。

(3)　-Dllオプション（最終生成物の種類がダイナミックリンクライブラリ）

(a)　形式

-Dll,｛Stdcall｜Cdecl｝
-Dll
-noDll

(b)　機能

DLL形式のオブジェクトファイルを出力します。-Dllオプションを指定しない場合は，実行可能ファイル（.exe）形式のオブジェクトファイルを出力します。

-Dllオプションを指定した場合，同時に指定したCOBOL原始プログラムは，すべてDLL形式のオブジェクトファイルとなります。

なお，開発マネージャでは，最終生成物の種類に「ダイナミックリンクライブラリ」を選ぶと，-Dllオプションが指定されます。

-Dll,Stdcall（Dllの属性をstdcallにする）（Windows(x86) COBOL2002で有効）

DLLの属性をstdcallにします。

なお，開発マネージャでは，「Dllの属性をstdcallにする」を選ぶと，-Dll,Stdcallオプションが指定されます。

-Dll,Cdecl（Dllの属性をcdeclにする）（Windows(x86) COBOL2002で有効）

DLLの属性をcdeclにします。

なお，開発マネージャでは，「Dllの属性をcdeclにする」を選ぶと，-Dll,Cdeclオプションが指定されます。

-Dll（ Dllの属性をfastcallにする）（Windows(x64) COBOL2002で有効）

DLLの属性をfastcallにします。

開発マネージャでは，最終生成物の種類に「ダイナミックリンクライブラリ」を選びます。

-noDll

-Dllオプションの指定を打ち消します。

(c)　注意事項

-Dllオプションを指定すると，-Main,System，-Main,V3，および-SimSubオプションが無効となります。

Windows(x64) COBOL2002の場合，-Dll,Stdcallオプション，または-Dll,Cdeclオプションを指定しても，-Dllオプションを指定したとみなされ，DLLの属性はfastcallになります。

(4)　標準ライブラリ

COBOLソースから標準ライブラリを作成します。

プロジェクトの作成時に，最終生成物の種類で「標準ライブラリ」を選んだ場合，この項目が指定されます。

このプロジェクトによって生成された標準ライブラリをリンクする実行可能プログラムが次の条件を満たす場合，-MainNotCBLオプションを指定する必要があります。

最初に呼び出されるCOBOLプログラムより前に，他言語で記述されたプログラムが実行される場合

最初に呼び出されるCOBOLプログラムから，呼び出し元プログラムに戻る場合

このプロジェクトの種類を選んだ場合，プロジェクトに指定できるオプションは-Main,Systemまたは-Main,V3オプションを指定した場合と同じです。ただし，次のオプションは指定できません。

-SimMain，-SimSub，-SimIdent，-Lib，「リンク処理をしない」，「メインファイルを指定する」

このオプションは，開発マネージャだけで指定できます。

33.5.6　他製品との連携の設定

他製品との連携を設定するコンパイラオプションについて，説明します。

(1)　-SQLオプション

(a)　形式

-SQL,｛XDM｜ODBC〔,NoCont〕｝
-noSQL

(b)　機能

埋め込みSQL文を使用できるようにします。

-SQL,XDM

リレーショナルデータベース（XDM/RD）操作シミュレーション機能を使用する場合に指定します。このオプションを指定すると，VOS3 XDM/RDのSQLは覚え書きとみなされます。

-SQL,ODBC

埋め込みSQL文をODBCインタフェース機能で実行する場合に指定します。このオプションを指定すると，埋め込みSQL文を使用して，ODBCインタフェース機能でデータベースにアクセスします。

-SQL,ODBC,NoCont

埋め込みSQL文をODBCインタフェース機能で実行する場合で，SQL構文内の浮動継続指示子を有効としないときに指定します。

-noSQL

-SQLオプションの指定を打ち消します。

(c)　注意事項

-SQL,XDMオプションと-SQL,ODBCオプションを同時に指定した場合，あとに指定したオプションが有効となります。

(2)　-SQLDispオプション

(a)　形式

-SQLDisp
-noSQLDisp

(b)　機能

-SQLDisp

埋め込みSQL文に，用途が表示用のデータ項目を指定できるようにします。

このオプションを指定すると，データベースアクセス機能で，埋め込み変数の定義に次に示すデータ記述項を指定できます。埋め込みSQL文では，これらの項目が占めるバイト数分と同じバイト数を占める，英数字項目の埋め込み変数として使用できます。

英字項目

〔SIGN IS〕 LEADING SEPARATE CHARACTERの指定がない外部10進形式の数字項目

英数字編集項目

数字編集項目

日本語項目

日本語編集項目

外部ブール項目

外部浮動小数点項目

-noSQLDisp

-SQLDispオプションの指定を打ち消します。

(3)　-RDBTranオプション

(a)　形式

-RDBTran
-noRDBTran

(b)　機能

-RDBTran

翻訳単位中に記述されたCOMMIT文，ROLLBACK文を，HiRDBによる索引編成ファイルに対して適用します。詳細は，「6.9.6　プログラムのコンパイルと実行」を参照してください。

なお，このオプションを指定するとデータコミュニケーション（DC）機能，およびDCシミュレーション機能は使用できません。

また，このオプションを指定しないと，COMMIT文，ROLLBACK文は，DC機能に対して適用されます。

-noRDBTran

-RDBTranオプションの指定を打ち消します。

(4)　-IsamExtendオプション（Windows(x86) COBOL2002で有効）

(a)　形式

-IsamExtend〔,Zone〕
-noIsamExtend

(b)　機能

-IsamExtend

Btrieve（Pervasive.SQL）による索引編成ファイルを使用します。ISAMによる索引編成ファイルを使用するときは，このオプションを指定しません。Btrieve（Pervasive.SQL）による索引編成ファイルについては，「6.10　Btrieve（Pervasive.SQL）による索引編成ファイル（Windows(x86) COBOL2002で有効）」を参照してください。

-IsamExtend,Zone

Btrieve（Pervasive.SQL）による索引編成ファイル使用する場合，レコードキーに外部10進項目が指定されたときに，外部10進属性として処理します。

-noIsamExtend

-IsamExtendオプションの指定を打ち消します。

(5)　-XMAPオプション（Windows(x86) COBOL2002で有効）

(a)　形式

-XMAP,LinePrint
-noXMAP

(b)　機能

-XMAP,LinePrint

XMAP3を使用して，順編成ファイルをプリンタに出力するときに指定します。このとき，次の印刷機能も使用できます。

書式オーバレイ（APPLY FORMS-OVERLAY句）

印刷制御付き（CHARACTER TYPE句）

COBOLプログラム中にAPPLY FORMS-OVERLAY句またはCHARACTER TYPE句があっても，-XMAP,LinePrintオプションの指定がなければ，これらの句は覚え書きとなります。

注

XMAP3を使用しないでCHARACTER TYPE句を使用した印刷制御付きのプリンタ出力をする場合，GDIモード印刷機能を使用します。

これらの印刷機能の詳細については，「8.　プリンタへのアクセス」の該当する節を参照してください。

-noXMAP

-XMAPオプションの指定を打ち消します。

(6)　-OpenTP1オプション

(a)　形式

-OpenTP1
-noOpenTP1

(b)　機能

-OpenTP1

OpenTP1を使用したデータコミュニケーション機能を使用する場合に指定します。ただし，テストデバッガのDCシミュレーション機能で，データコミュニケーション機能を単体テストする場合は，このオプションを指定しないでください。

-noOpenTP1

-OpenTP1オプションの指定を打ち消します。

33.5.7　実行の設定

実行の設定をするコンパイラオプションについて，説明します。

(1)　-NumAcceptオプション

(a)　形式

-NumAccept
-noNumAccept

(b)　機能

-NumAccept

ACCEPT文の一意名1に次の項目を指定できるようにします。

符号なし数字項目

符号あり数字項目

数字編集項目

外部浮動小数点数字項目

内部浮動小数点数字項目

数字項目を指定した場合，入力データは右詰めで格納され，残りの部分には左側に0が埋められます。数字編集項目を指定した場合，編集文字に合わせて右詰めで格納されます。浮動小数点数字項目を指定した場合，受け取りの有効けた数分の値が格納されます。

-noNumAccept

-NumAcceptオプションの指定を打ち消します。

(2)　-NumCsvオプション

(a)　形式

-NumCsv
-noNumCsv

(b)　機能

-NumCsv

CSV編成ファイルで，セルのデータを数値として入出力したい場合に指定するオプションです。詳細は，「6.8.5　セルデータを数値として入出力する機能」を参照してください。

-noNumCsv

-NumCsvオプションの指定を打ち消します。

(3)　-MultiThreadオプション

(a)　形式

-MultiThread
-noMultiThread

(b)　機能

-MultiThread

COBOLプログラムをマルチスレッド環境下で動作させたい場合に指定します。

詳細は，「26.2　マルチスレッド対応COBOLプログラムの生成」を参照してください。

-noMultiThread

-MultiThreadオプションの指定を打ち消します。

(4)　-MainNotCBLオプション

(a)　形式

-MainNotCBL
-noMainNotCBL

(b)　機能

-MainNotCBL

実行中のプロセスで最初に呼び出されるCOBOLプログラムを，副プログラムとします。他言語で作成したアプリケーションのメインプログラムからCOBOLプログラムを呼び出す場合，このオプションを指定します。

-noMainNotCBL

-MainNotCBLオプションの指定を打ち消します。

(c)　注意事項

-Mainオプションと-MainNotCBLオプションを同時に指定した場合，-MainNotCBLオプションが有効となります。

(5)　-DllInitオプション

(a)　形式

-DllInit
-noDllInit

(b)　機能

-DllInit

呼び出し時にDLLを初期状態にします。

-noDllInit

-DllInitオプションの指定を打ち消します。

(c)　注意事項

-DllInitオプションを指定して，-Dllオプションを指定しなかった場合，-DllInitオプションは無視されます。この場合，-DllInitオプションが無効であることを示す警告メッセージが出力されます。

-DllInitオプションを指定した場合に初期化される情報については，「18.4.1　プログラム属性」の「(2)　初期化属性プログラム」を参照してください。

(6)　メインファイルを指定する

プロジェクトのメインプログラムにするソースファイルを指定します。

メインファイルに指定していたファイルをプロジェクトから削除した場合などは，この項目でメインファイルを指定します。

このオプションは，開発マネージャだけで指定できます。

33.5.8　プログラムの最適化の設定

プログラムの最適化を設定するコンパイラオプションについて，説明します。

(1)　-Optimizeオプション

(a)　形式

-Optimize,｛0｜1｜2｜3｝

(b)　機能

最適化のレベルを指定します。-Optimizeオプションの詳細については，「32.　最適化機能」を参照してください。

-Optimize,0

最適化しません。

-Optimize,1

文の中で閉じた次の最適化をします。

命令レベルでの最適化（ピープホールによる不要命令の削除など）

-Optimizeオプションを指定しなかった場合，このオプションが仮定されます。

-Optimize,2

広域的な次の最適化をします。

命令レベルでの最適化（ピープホールによる不要命令の削除など）

不変式のループ外への移動

コピー伝播

定数の畳み込み

共通式の削除

演算の強さの軽減

そとPERFORM文のインライン展開

-Optimize,3

-Optimize,2オプションでの最適化に加えて，10進項目を2進項目に変換します。

(c)　注意事項

最適化オプションを指定すると，データ項目の使用状況の解析や文の順番の入れ替えなどをするため，コンパイル時間が増加します。-Optimize,0指定時が最短で，-Optimize,3指定時が最長となります。

-Optimize,3オプションと-TDInfオプションを同時に指定すると，-Optimize,3オプションが無効になり，-Optimize,2オプションが仮定されます。

最適化の内容については，「32.　最適化機能」を参照してください。

-Optimize,3オプションを指定すると10進項目を2進項目化するため，アドレス操作機能を使用しているプログラムは正しく動作しないことがあります。

Windows(x64) COBOL2002の場合，-Optimize,3オプション，-MaxDigits38オプション，および-IntResult,DecFloat40オプションを同時に指定したときは，-Optimize,3オプションは無効となり，-Optimize,2オプションが仮定されます。

(2)　-ScreenSpeedオプション

(a)　形式

-ScreenSpeed
-noScreenSpeed

(b)　機能

-ScreenSpeed

画面節（WINDOW SECTIONまたはSCREEN SECTION）による画面機能を使用するとき，表示の見栄えや機能よりも表示速度を重視するためのオプションです。このオプションを指定すると，表示速度は速くなりますが，次の不都合が生じます。

文字間隔が狭くなる，縦けい線と文字が一部重なるなど，表示の見栄えが悪くなる。

データ項目が画面上で重なりあっている場合の表示は保証しない。

縦倍文字，横倍文字に対するけい線の表示は保証しない。

画面節（WINDOW SECTION）のTHROUGH指定のLINE NUMBER句，COLUMN NUMBER句を指定すると，ERASE（ATTRIBUTE）文が正しく実行されない場合がある。

表示する項目が1行に収まらない場合の表示は保証しない。

-noScreenSpeed

-noScreenSpeedオプションの指定を打ち消します。

(c)　注意事項

-ScreenSpeedオプションを指定してコンパイルした画面機能を含むプログラムと，-ScreenSpeedオプションを指定しないでコンパイルしたプログラムを一つの実行可能ファイル，DLL，または標準ライブラリ中に混在させないでください。

33.5.9　デバッグの設定

デバッグを設定するコンパイラオプションについて，説明します。

(1)　-DebugLineオプション

(a)　形式

-DebugLine
-noDebugLine

(b)　機能

-DebugLine

原始プログラム中のデバッグ行をコンパイルの対象とします。デバッグ行とは，原始プログラムの標識領域にデバッグ標識（「D」または「d」）が記述されているか，浮動デバッグ指示子（「>>D」）が記述されている行のことです。

このシステムでは，WITH DEBUGGING MODE句は覚え書きとみなされるので，デバッグ行を有効にするためにはこのオプションの指定が必要です。

-noDebugLine

-DebugLineオプションの指定を打ち消します。

(2)　-DebugInfオプション

(a)　形式

-DebugInf〔,Trace〕
-noDebugInf

(b)　機能

-DebugInf

実行時に異常終了した場合，または実行時エラーが発生した場合，異常終了時要約情報リストを出力します。異常終了時要約情報リストの詳細については，「37.2　異常終了時要約情報リスト」を参照してください。

-DebugInf,Trace

異常終了時要約情報リスト中にトレースバック情報を出力します。

-noDebugInf

-DebugInfオプションの指定を打ち消します。

(c)　注意事項

-DebugInfオプション，-TDInfオプション，-CVInfオプション，-DebugRangeオプション，-DebugCompatiオプション，-DebugDataオプション，および-TestCmdオプションを指定していない場合，エラー／デバッグ情報（異常終了時要約情報リストやデータ領域ダンプリスト）が出力されません。

-DebugInfオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-DebugInfオプションが無効となります。

-DebugInf,Traceオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-DebugInf,Traceオプションは，デバッグの目的でコンパイルするときだけ指定してください。

(3)　-DebugCompatiオプション

(a)　形式

-DebugCompati
-noDebugCompati

(b)　機能

-DebugCompati

次のチェックをします。なお，表要素または部分参照された一意名にOCCURS DEPENDINGONの指定がある場合は，実行時点の制御変数の値を用いてチェックします。

表操作で使用する添字または指標名が指す表要素が表の範囲内であるかどうか。

部分参照の指定が一意名の範囲内であるかどうか。

プログラム間で整合性が取れているかどうか。

ただし，実行時環境変数CBLPRMCHKWにNOCHKを指定したときは，プログラム間で整合性が取れていなくてもエラーとしないで，実行を継続します。

詳細は，「37.4　プログラム間整合性チェック」を参照してください。

-noDebugCompati

-DebugCompatiオプションの指定を打ち消します。

(c)　注意事項

-DebugCompatiオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-DebugCompatiオプションが無効となります。

-DebugCompatiオプションを指定すると，-DebugInfオプションが仮定されます。

-DebugCompatiオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-DebugCompatiオプションは，デバッグの目的でコンパイルするときだけ指定してください。

-DebugCompatiオプションを指定すると，一部の例外名に対するTURN指令が無効となります。詳細は「21.8.2　例外検出での注意事項」の「(4)　コンパイラオプションとの関連性」を参照してください。

(4)　-DebugDataオプション

(a)　形式

-DebugData〔,ValueHex〕
-noDebugData

(b)　機能

-DebugData

外部または内部10進項目に対して，格納値がデータ項目の属性と矛盾している場合，データ例外エラーを検出します。

詳細は，「37.6　データ例外検出機能」を参照してください。

-DebugData,ValueHex

データ例外検知機能でデータ例外が検出された場合，出力されるエラーメッセージにデータ項目の属性と矛盾している格納値を16進数で表示します。

詳細は，「37.6　データ例外検出機能」を参照してください。

-noDebugData

-DebugDataオプションの指定を打ち消します。

(c)　注意事項

-DebugDataオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-DebugDataオプションが無効となります。

-DebugDataオプションを指定すると，-DebugInfオプションが仮定されます。

-DebugDataオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-DebugDataオプションは，デバッグの目的でコンパイルするときだけ指定してください。

ValueHexサブオプションを指定した場合，-noDebugDataオプションの指定がないかぎり，ValueHexサブオプションの指定は有効となります。ValueHexサブオプションの指定を打ち消すときは，-noDebugDataオプションを指定してください。

（例）

ccbl2002 -DebugData -DebugData,ValueHex -DebugData …
（コンパイル結果）
　-DebugData,ValueHex

ccbl2002 -DebugData,ValueHex -noDebugData -DebugData …
（コンパイル結果）
　-DebugData

(5)　-TDInfオプション

(a)　形式

-TDInf
-noTDInf

(b)　機能

-TDInf

デバッグ情報を含むプログラム情報ファイル（.cbp）を出力します。また，除算例外については，除算実行前に検出します。

-TDInfオプションを指定したプログラムをテストデバッガでデバッグする場合，-DebugCompatiオプションの指定の有無に関係なく，プログラム間の整合性がチェックされます。プログラム間の整合性チェックについては，「(3)　-DebugCompatiオプション」を参照してください。

-noTDInf

-TDInfオプションの指定を打ち消します。

(c)　注意事項

-TDInfオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-TDInfオプションが無効となります。

-TDInfオプションを指定すると，-DebugInfオプションが仮定されます。

-TDInfオプションと-Optimize,3オプションを同時に指定すると，-Optimize,3オプションが無効になり，-Optimize,2オプションが仮定されます。

コンパイルとリンクを別々に実行する場合で，-TDInfオプションを指定してコンパイルしたときは，ccbl2002コマンドでリンクを実行するときにも，同じオプションを指定する必要があります。

-TDInfオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-TDInfオプションは，デバッグの目的でコンパイルするときだけ指定してください。

-TDInfオプションはテストデバッガのためにゼロによる除算チェックなど最適化に影響を与えるオブジェクトコードを生成します。これによって，-TDInfオプションを指定することで，異常終了時要約リストなどの行番号／欄の情報が変化することがあります。行番号／欄の情報を常に正しく保つためには，-Optimize,0オプションを指定する必要があります。

(6)　-CVInfオプション

(a)　形式

-CVInf
-noCVInf

(b)　機能

-CVInf

カバレージ情報を含むプログラム情報ファイル（.cbp）を出力します。

-noCVInf

-CVInfオプションの指定を打ち消します。

(c)　注意事項

-CVInfオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-CVInfオプションが無効となります。

-CVInfオプションを指定すると，-DebugInfオプションが仮定されます。

コンパイルとリンクを別々に実行する場合で，-CVInfオプションを指定してコンパイルしたときは，ccbl2002コマンドでリンクを実行するときにも，同じオプションを指定する必要があります。

-CVInfオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-CVInfオプションは，デバッグの目的でコンパイルするときだけ指定してください。

-CVInfオプションを指定してカバレージ情報を出力できるのは，ccbl2002コマンドでコンパイルして出力したプログラム情報ファイルだけです。COBOL85で作成したプログラム情報ファイルを使用した場合，ccbl2002コマンドに-CVInfオプションを指定してコンパイルしても，プログラム情報ファイルにカバレージ情報を出力しません。

(7)　-DebugRangeオプション

(a)　形式

-DebugRange
-noDebugRange

(b)　機能

-DebugRange

表操作で使用する添字および指標名の値が，次元ごとにOCCURS句で指定した繰り返し回数の範囲内であるかどうかを，実行時に調べます。

なお，表要素にOCCURS DEPENDING ONの指定がある場合は，実行時点の制御変数の値を用いて調べます。

-noDebugRange

-DebugRangeオプションの指定を打ち消します。

(c)　注意事項

-DebugRangeオプションと-Compile,CheckOnlyオプションを同時に指定した場合，-DebugRangeオプションが無効となります。

-DebugRangeオプションを指定すると，-DebugInfオプションおよび-DebugCompatiオプションが仮定されます。

-DebugRangeオプションを指定すると，実行時の処理速度が遅くなる可能性があります。このため，-DebugRangeオプションは，デバッグの目的でコンパイルするときだけ指定してください。

-DebugRangeオプションを指定すると，一部の例外名に対するTURN指令が無効となります。詳細は「21.8.2　例外検出での注意事項」の「(4)　コンパイラオプションとの関連性」を参照してください。

(8)　-TestCmdオプション

(a)　形式

-TestCmd｛,Full｜,Break｜,Sim｝+
-noTestCmd

(b)　機能

TDコマンド格納ファイルに出力する情報の種類を指定します。

-TestCmd,Full

中断点情報，シミュレーション情報のTDコマンドをTDコマンド格納ファイル（.tdi）に出力します。

-TestCmd,Break

中断点情報のTDコマンドをTDコマンド格納ファイル（.tdi）に出力します。

-TestCmd,Sim

シミュレーション情報のTDコマンドをTDコマンド格納ファイル（.tds）に出力します。

-noTestCmd

-TestCmdオプションの指定を打ち消します。

(c)　注意事項

-TestCmd,Fullオプションと-TestCmd,Breakオプション，または-TestCmd,Fullオプションと-TestCmd,Simオプションを重複して指定した場合，-TestCmd,Fullオプションが有効となります。

-TestCmdオプションを指定すると，-DebugInfおよび-TDInfオプションが仮定されます。

コンパイルとリンクを別々にする場合で，コンパイル時に-TestCmdオプションを指定したときは，ccbl2002コマンドでのリンク時に-TDInfオプションを指定する必要があります。

(9)　-SimMainオプション

(a)　形式

-SimMain プログラム名
-noSimMain

(b)　機能

-SimMain プログラム名

テストデバッガの主プログラムシミュレーション機能を使用します。

プログラム名には，主プログラムシミュレーションの対象となる副プログラムの名称（最外側のプログラムのプログラム名段落で指定した名称）を指定します。

このオプションを指定すると，主プログラムシミュレーション用の一時的なCOBOLソースファイル（擬似主プログラム）が内部的に生成され，コンパイルされます。コンパイルによって生成されたオブジェクトファイルは，リンク時に取り込まれます。ここで生成されたソースファイル，およびオブジェクトファイルは，コンパイル終了時に消去されます。

また，テストデバッガで必要な擬似主プログラム用のプログラム情報ファイル（.cbs）が生成されます。テストデバッガの主プログラムシミュレーション機能を使用するとき，生成されたプログラム情報ファイル（.cbs）をテストデバッガ環境に指定してください。生成するプログラム情報ファイルの名称については，「(12)　主／副プログラムシミュレーションで生成する擬似プログラム用プログラム情報ファイル」を参照してください。

擬似主プログラムを生成するCOBOLソースファイルの情報は，プログラム情報ファイル（.cbp）から取得されます。このため，このオプションを指定する場合は，次のどちらかをする必要があります。

-TDInfオプションを同時に指定してコンパイルする。

副プログラムを含むCOBOLソースファイルを-TDInfオプションを指定してコンパイルし，生成された.cbpファイルを，環境変数CBLPIDIRで指定したフォルダまたはカレントフォルダに入れておく。

また，このオプションを指定し，-OutputFileオプションで実行可能ファイル名を指定しない場合は，生成される主プログラムの実行可能ファイル名はNONAME1.exeとなります。

Windows(x86) COBOL2002の場合

DLLを呼び出す擬似主プログラムを作成する場合は，次のオプションを同時に指定してコンパイルしてください。

DLLの属性がstdcall呼び出し規約の場合：-Dll,Stdcall

DLLの属性がcdecl呼び出し規約の場合：-Dll,Cdecl

Windows(x64) COBOL2002の場合

DLLを呼び出す擬似主プログラムを作成する場合は，-Dllオプションを同時に指定してコンパイルしてください。

このとき，生成される主プログラムの実行可能ファイル名はNONAME1.exeとなります。

-noSimMain

-SimMainオプションの指定を打ち消します。

(c)　注意事項

下記に示すデータ項目を主プログラムシミュレーションの対象となる副プログラムの手続き部見出しに指定することはできません。

プロパティ項目

関数一意名

-SimMainオプションを指定した場合，コンパイラのバージョンが03-01未満で作成したプログラム情報ファイル（.cbp）は使用できません。使用した場合は，コンパイルエラーとなり，コンパイルを中止します。

-LiteralExtendオプションと同時に指定した場合は，-LiteralExtendオプションが無効となります。

(10)　-SimSubオプション

(a)　形式

-SimSub プログラム名〔,…〕
-noSimSub

(b)　機能

-SimSub プログラム名〔,…〕

テストデバッガの副プログラムシミュレーション機能を使用します。

プログラム名には，副プログラムシミュレーションの対象となる副プログラムの名称（CALL文で指定した名称）を指定します。ただし，副プログラムの呼び出し方法は，CALL文の定数指定呼び出しでなければなりません。

このオプションを指定すると，副プログラムシミュレーション用の一時的なCOBOLソースファイル（擬似副プログラム）が内部的に生成され，コンパイルされます。コンパイルによって生成されたオブジェクトファイルは，リンク時に取り込まれます。ここで生成されたソースファイル，およびオブジェクトファイルは，コンパイル終了時に消去されます。

また，テストデバッガで必要な擬似副プログラム用のプログラム情報ファイル（.cbs）が生成されます。テストデバッガの副プログラムシミュレーション機能を使用するとき，生成されたプログラム情報ファイル（.cbs）をテストデバッガ環境に指定してください。生成するプログラム情報ファイルの名称については，「(12)　主／副プログラムシミュレーションで生成する擬似プログラム用プログラム情報ファイル」を参照してください。

擬似副プログラムを生成するCOBOLソースファイルの情報は，プログラム情報ファイル（.cbp）から取得されます。このため，このオプションを指定する場合は，次のどちらかをする必要があります。

-TDInfオプションを同時に指定してコンパイルする。

副プログラムを呼び出しているCOBOLソースファイルを-TDInfオプションを指定してコンパイルし，生成された.cbpファイルを，環境変数CBLPIDIRで指定したフォルダまたはカレントフォルダに入れておく。

-noSimSub

-SimSubオプションの指定を打ち消します。

(c)　注意事項

このオプションは，-Dllオプションと同時に指定できません。また，呼び出し属性がstdcallとなる副プログラムシミュレーションはできません。

下記に示すデータ項目を副プログラムシミュレーションの対象となるプログラムに指定したCALL文の引数に指定することはできません。

プロパティ項目

関数一意名

-SimSubオプションを指定した場合，コンパイラのバージョンが03-01未満で作成したプログラム情報ファイル（.cbp）は使用できません。使用した場合は，コンパイルエラーとなり，コンパイルを中止します。

-LiteralExtendオプションと同時に指定した場合は，-LiteralExtendオプションが無効となります。

(11)　-SimIdentオプション

(a)　形式

-SimIdent
-noSimIdent

(b)　機能

-SimIdent

テストデバッガの副プログラムシミュレーション機能を使用します。この場合，副プログラムシミュレーションの対象となるのは，一意名呼び出しのCALL文を指定したプログラムです。

このオプションを指定すると，副プログラムシミュレーション用の一時的なCOBOLソースファイルが内部的に生成され，コンパイルされます。コンパイルによって生成されたオブジェクトファイルは，リンク時に取り込まれます。ここで生成されたソースファイル，およびオブジェクトファイルは，コンパイル終了時に消去されます。

また，テストデバッガで必要な擬似副プログラム用のプログラム情報ファイル（.cbs）が生成されます。テストデバッガの副プログラムシミュレーション機能を使用するとき，生成されたプログラム情報ファイル（.cbs）をテストデバッガ環境に指定してください。生成するプログラム情報ファイルの名称については，「(12)　主／副プログラムシミュレーションで生成する擬似プログラム用プログラム情報ファイル」を参照してください。

擬似副プログラムを生成するCOBOLソースファイルの情報は，プログラム情報ファイル（.cbp）から取得されます。このため，このオプションを指定する場合は，次のどちらかをする必要があります。

-TDInfオプションを同時に指定してコンパイルする。

副プログラムを呼び出しているCOBOLソースファイルを-TDInfオプションを指定してコンパイルし，生成された.cbpファイルを，環境変数CBLPIDIRで指定したフォルダまたはカレントフォルダに入れておく。

注意事項

呼び出し属性がstdcallとなる副プログラムシミュレーションはできません。

下記に示すデータ項目を副プログラムシミュレーションの対象となるプログラムに指定したCALL文の引数に指定することはできません。

・プロパティ項目

・関数一意名

-noSimIdent

-SimIdentオプションの指定を打ち消します。

(c)　注意事項

呼び出し属性がstdcallとなる副プログラムシミュレーションはできません。

下記に示すデータ項目を副プログラムシミュレーションの対象となるプログラムに指定したCALL文の引数に指定することはできません。

プロパティ項目

関数一意名

-SimIdentオプションを指定した場合，コンパイラのバージョンが03-01未満で作成したプログラム情報ファイル（.cbp）は使用できません。使用した場合は，コンパイルエラーとなり，コンパイルを中止します。

-LiteralExtendオプションと同時に指定した場合は，-LiteralExtendオプションが無効となります。

(12)　主／副プログラムシミュレーションで生成する擬似プログラム用プログラム情報ファイル

主／副プログラムシミュレーションでは，テストデバッガで必要な情報である擬似プログラム用プログラム情報ファイル（.cbs）が生成されます。擬似プログラム用プログラム情報ファイル（.cbs）は，カレントフォルダ，または環境変数CBLPIDIRで指定したフォルダに出力されます。

生成される擬似プログラム用プログラム情報ファイル（.cbs）の名称規則を，次に示します。

-SimMainオプションによって，擬似主プログラムシミュレーションする場合

SimMain@（-SimMainオプションで指定したプログラム名）.cbs

-SimSubオプションによって，定数指定のCALL文の擬似副プログラムシミュレーションする場合

SimSub@（-SimSubオプションで指定したプログラム名※）.cbs

注※

プログラム名を複数指定した場合，先頭のプログラム名が使用されます。

-SimIdentオプションによって，一意名指定のCALL文の擬似副プログラムシミュレーションする場合

SimIdent@001.cbs

33.5.10　リンクの設定

リンクを設定するコンパイラオプションについて，説明します。

(1)　-StdCallオプション（Windows(x86) COBOL2002で有効）

(a)　形式

-StdCall
-noStdCall

(b)　機能

-StdCall

stdcall呼び出し指示ファイル（.cbw）を読み込むためのオプションです。stdcall呼び出し指示ファイルは，CALL文で最外側のプログラムを呼び出すときの属性がstdcall呼び出し規約となるように指示するファイルです。したがって，cdecl呼び出し規約で呼び出す最外側のプログラム名を，stdcall呼び出し指示ファイルに指定できません。

このオプションを指定しない場合，stdcall呼び出し指示ファイルは，読み込まれません。また，呼び出し属性は，CALL-CONVENTION段落の指定に従います。

-noStdCall

-StdCallオプションの指定を打ち消します。

(2)　-StdCallFileオプション（Windows(x86) COBOL2002で有効）

(a)　形式

-StdCallFile ファイル名
-noStdCallFile

(b)　機能

-StdCallFile ファイル名

-StdCallオプションで読み込むstdcall呼び出し指示ファイル（.cbw）の名称を指定します。

このオプションを指定した場合，stdcall呼び出し指示ファイルに指定したファイル名だけが参照され，「COBOLソースファイル名.cbw」は参照されません。このオプションを指定しないときは，「COBOLソースファイル名.cbw」だけが参照されます。

-noStdCallFile

-StdCallFileオプションの指定を打ち消します。

(3)　-Libオプション

(a)　形式

-Lib,｛GUI｜CUI｝

(b)　機能

-Lib,GUI

GUIモードのユーザプログラムを作成します。

-Libオプションを指定しなかった場合，このオプションが仮定されます。

-Lib,CUI

CUIモードのユーザプログラムを作成します。

(4)　ライブラリの指定

インポートライブラリ，標準ライブラリを指定します。

このオプションは，開発マネージャだけで指定できます。

(5)　リンケージを行わない

リンク処理をしない場合に指定します。

リンク処理をしない場合は，コンパイル処理によってオブジェクトファイルが生成されますが，リンク処理は行われません。

擬似主プログラム生成，擬似副プログラム生成を指定する場合は，この項目を指定しないでください。

このオプションは，開発マネージャだけで指定できます。

(6)　-Compileオプション

(a)　形式

-Compile,｛CheckOnly｜NoLink｝
-noCompile

(b)　機能

プログラムのコンパイル時，オブジェクトファイル（.obj），実行可能ファイル（.exe），およびDLL（.dll）の生成を抑止します。

-Compile,CheckOnly

COBOLプログラムのコンパイル時にエラーチェックだけします。オブジェクトファイル，実行可能ファイル，およびDLLは出力しません。

このオプションを指定すると，実行可能ファイルを生成しないため，コンパイル速度が向上します。単にエラーチェックだけをしたい場合に指定します。

-Compile,NoLink

オブジェクトファイルは出力しますが，実行可能ファイル，DLLは生成しません。出力したオブジェクトファイルは，あとでリンカを使用して実行可能ファイル，またはDLLにできます。

-noCompile

-Compileオプションの指定を打ち消します。

(c)　注意事項

-Compileオプションを指定した場合，-OutputFileオプションの指定は無効となります。

また，-Compile,CheckOnlyオプションを指定した場合，アプリケーションデバッグ機能に関連するオプション（-DebugInf，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRange，または-TestCmdオプション）が指定されても，無効となります。

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(7)　-DefFileオプション

(a)　形式

-DefFile ファイル名
-noDefFile

(b)　機能

-DefFile ファイル名

COBOL2002が自動生成するモジュール定義ファイル（.def）の名称を指定します。

モジュール定義ファイルは，カレントフォルダに出力されるため，パス名を付けて指定してはいけません。パス名を付けて指定した場合，動作は保証しません。

このオプションを指定しない場合，生成されるモジュール定義ファイル名は，生成されるDLLファイルの名称に拡張子.defを付けた名称になります。

-noDefFile

-DefFileオプションの指定を打ち消します。

(c)　注意事項

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(8)　-IconFileオプション

(a)　形式

-IconFile ファイル名
-noIconFile

(b)　機能

-IconFile ファイル名

生成する実行可能ファイルのアイコンを変更します。

このオプションを指定すると，COBOL2002が自動生成するリソース定義ファイル（.rc）中に指定するアイコンを，オプションで指定したアイコンファイルに変更します。ファイル名は，パス名を付けて指定することもできます。

このオプションを指定しないときは，COBOL2002が用意しているアイコンが設定されます。

-noIconFile

-IconFileオプションの指定を打ち消します。

(c)　注意事項

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(9)　-ResrcFileオプション

(a)　形式

-ResrcFile ファイル名
-noResrcFile

(b)　機能

-ResrcFile ファイル名

COBOL2002が自動生成するリソース定義ファイル（.rc）の名称を指定します。

リソース定義ファイルは，カレントフォルダに出力されるため，パス名を付けて指定してはいけません。パス名を付けて指定した場合，動作は保証しません。

このオプションを指定しない場合，生成されるモジュール定義ファイル名は，生成される実行可能ファイルの名称に拡張子.rcを付けた名称になります。

-noResrcFile

-ResrcFileオプションの指定を打ち消します。

(c)　注意事項

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(10)　-OutputFileオプション

(a)　形式

-OutputFile ファイル名
-noOutputFile

(b)　機能

-OutputFile ファイル名

生成する実行可能ファイル，またはDLLファイルの名称を指定します。

ファイル名には，生成する実行可能ファイル，またはDLLファイルの名称を指定します。カレントフォルダに出力する場合は，ファイル名だけを指定します。また，任意のフォルダに出力する場合は，ドライブ名からの絶対パス名で指定します。

このオプションの指定がない場合，次の規則に従って実行可能ファイル，またはDLLファイル名が決定します。

（実行可能ファイルを生成する場合）

-Mainオプションに指定したファイル名に拡張子（.exe）を付けたファイル名になります。-Mainオプションの指定がない場合，ccbl2002コマンド中で-Mainが仮定されたソースファイル名（ccbl2002コマンド中で最初にコンパイルされたソースファイル名）に拡張子.exeを付けた名称となります。このとき，出力先のフォルダも上記のソースファイルと同じになります。

（DLLファイルを生成する場合）

ccbl2002コマンド中で最初にコンパイルされたソースファイル名称に拡張子.dllを付けた名称となります。このとき，出力先のフォルダも上記のソースファイルと同じになります。

なお，-SimMainオプション，-SimSubオプション，または-SimIdentオプションを指定した場合については，-SimMainオプション，-SimSubオプション，-SimIdentオプションの説明をそれぞれ参照してください。

-OutputFileオプションと-Compileオプションを同時に指定した場合，-OutputFileオプションは，無効となります。

-noOutputFile

-OutputFileオプションの指定を打ち消します。

(c)　注意事項

ccbl2002コマンドは，-OutputFileに指定したファイル名の拡張子が.exeまたは.dllであるかどうかをチェックしません。.exeまたは.dll以外の拡張子を指定した場合，動作は保証しません。

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(11)　-Linkオプション

(a)　形式

-Link オプションの並び
-noLink

(b)　機能

-Link オプションの並び

リンカに渡すオプションの並びを指定します。オプションとオプションの間は，空白で区切ります。

-noLink

-Linkオプションの指定を打ち消します。

(c)　注意事項

-Linkオプション以降の文字は，ほかのオプション名，ファイル名なども含めすべてリンカに渡されます。したがって，このオプションは最後に指定してください。

コマンドファイル中に-Linkオプションの指定がある場合は，その行の-Linkオプション以降がリンカに渡され，次の行から別のオプションとして扱われます。

-Linkオプションは，-Detailsオプションでのコンパイラオプションの詳細情報表示の対象にはなりません。

このオプションを開発マネージャで指定する場合，プロジェクト設定ダイアログボックスの［ユーザ設定］タブを使用してください。［ユーザ設定］タブの詳細は，マニュアル「COBOL2002　操作ガイド」のオプションの設定方法の説明を参照してください。

オプションの並びに-OUTリンカオプションを指定して，生成する実行可能ファイル，またはDLLファイルの名称を指定しないでください。生成されたファイルの動作は保証しません。

(12)　-DynamicLinkオプション

(a)　形式

-DynamicLink,Call
-noDynamicLink

(b)　機能

-DynamicLink,Call

定数指定のCALL文によってプログラムを呼び出す場合，呼び出されるプログラムが静的にリンクされていないときに，動的なリンク（ダイナミックリンク）が設定されます。詳細は「18.　プログラムの呼び出し」を参照してください。

ccblコマンドでコンパイルする場合に，-Bdオプションを指定できます。

-noDynamicLink

-DynamicLinkオプションの指定を打ち消します。

(13)　-ManifestFileExtオプション

(a)　形式

-ManifestFileExt
-noManifestFileExt

(b)　機能

-ManifestFileExt

マニフェストファイルを実行可能ファイル，およびDLLに埋め込まずに，外部マニフェストファイルとします。

COBOL2002コンパイラは，LINKコマンド実行時に生成されたマニフェスト情報※を，MTコマンドを使用して実行可能ファイルやDLLに埋め込みますが，このオプションを使用するとマニフェスト情報を外部マニフェストファイルとして出力できます。

外部マニフェストファイルの出力先フォルダは，生成する実行可能ファイル，またはDLLファイルと同じになります。

マニフェスト情報の追加，または変更をしたい場合，生成した外部マニフェストファイルを直接テキストエディタで編集するか，または追加情報のマニフェストファイルを作成してMTコマンドの機能によってマニフェスト情報をマージします。

なお，MTコマンドがマニフェスト情報の埋め込みに失敗して，COBOL2002コンパイラがエラーとなることがありますが，このオプションを使用すると，MTコマンドの実行を抑止してエラーを回避できます。

注※

COBOL2002が同梱するLINKコマンドは，使用するC実行時ライブラリの情報やUAC情報がマニフェスト情報として生成されます。

なお，マニフェスト情報の種類や詳細については，Microsoftのリファレンスを参照してください。

-noManifestFileExt

-ManifestFileExtオプションの指定を打ち消します。

(c)　注意事項

このオプションと-Compileオプションを同時に指定した場合，このオプションは無効となります。

このオプションは，開発マネージャ上で出力したコンパイルリストの情報リストのオプションには表示しません。

このオプションを指定した場合，外部マニフェストファイル名は「実行可能ファイル名.manifest」，および「DLLファイル名.manifest」となります。そのため，ファイルの出力先フォルダに同名のファイルがあると上書きされます。

実行可能ファイルに対応する外部マニフェストファイルは，必ず実行可能ファイルと同じフォルダに配置してください。実行可能ファイルと同じフォルダに配置されない場合，使用するC実行時ライブラリのバージョンによっては実行可能ファイルが正しく動作しません。

DLLファイルを作成するとき，このオプションを指定して生成されるマニフェストファイルはDLLファイルに埋め込んで使用してください。マニフェストの埋め込みについては，「35.1.2　コンパイルとリンクを別々に実行する方法」の「(2)　LINKコマンドによるリンク方法」にある「(b)　マニフェストの埋め込み方法」を参照してください。

また，使用するC実行時ライブラリのバージョンによってはマニフェストファイルは生成されないことがあります。

生成されない場合は，マニフェストファイルがなくても動作に問題ありません。

33.5.11　規格の設定

規格との仕様チェックを設定するコンパイラオプションについて，説明します。

(1)　-StdMIAオプション

(a)　形式

-StdMIA｛,13｜,14｝+
-noStdMIA

(b)　機能

仕様チェック機能として，MIA仕様※を範囲外チェックします。

仕様範囲外の記述があると，警告レベルのエラーメッセージが出力されます。

注※

MULTIVENDOR INTEGRATION ARCHITECTURE VERSION 1.3および1.4（日本電信電話株式会社）の仕様（JIS X 3002-1988　電子計算機プログラムCOBOLの仕様が前提）

-StdMIA,13

MIAバージョン1.3仕様を範囲外チェックします。

-StdMIA,14

MIAバージョン1.4仕様を範囲外チェックします。

なお，このオプションを指定すると，-StdMIA,13サブオプションを仮定します。

-noStdMIA

-StdMIAオプションの指定を打ち消します。

(c)　注意事項

-StdMIAオプション，-Std85オプション，-Std2002オプションは，同時に指定できません。同時に指定した場合は，警告のメッセージが出力され，次の優先順位に従ってオプションが有効となります。

-Std2002オプション

-Std85オプション

-StdMIAオプション

次のオプションは，-StdMIAオプションと背反となるため，同時に指定できません。同時に指定した場合は，-StdMIAオプションが有効となり，次のオプションが無効となります。

-V3Spec　-StdVersion　-CompatiM7　-CompatiV3　-H8Switch

-Cblctr　-IgnoreLCC　-JPN　-CmDol　-Comp5　-NumAccept

-V3Rec　-EquivRule,NotAny　-SQL　-BinExtend　-MaxDigits38

-IntResult,DecFloat40　-LiteralExtend　-V3RecFCSpace　-SQLDisp

-V3RecEased

-StdMIA,13オプションは，次のオプションと背反となるため，同時に指定できません。同時に指定した場合は，-StdMIA,13オプションが有効となり，次のオプションが無効となります。

-EquivRule,StdCode　-Bin1Byte

このオプションは，自由形式正書法で書かれたCOBOL原始プログラムをコンパイルする場合には指定できません。指定した場合，エラーとなってコンパイルが中止されます。

(2)　-Std85オプション

(a)　形式

-Std85｛,｛High｜Middle｜Low ｝｜,Obso｜,Report｝+
-noStd85

(b)　機能

仕様チェック機能として，JIS仕様※の範囲外チェックや廃要素をチェックします。

仕様範囲外の記述や廃要素があると，警告レベルのエラーメッセージが出力されます。

注※

JIS X 3002-1992　電子計算機プログラムCOBOLの仕様

-Std85,High

JIS仕様の範囲外チェックをします。

-Std85,Middle

JIS仕様の中位集合範囲外（上位集合，JIS仕様の範囲外）チェックをします。

-Std85,Low

JIS仕様の下位集合範囲外（中位集合，上位集合，JIS仕様の範囲外）チェックをします。

-Std85,Obso

JIS仕様の廃要素をチェックします。

-Std85,Report

JIS仕様の報告書作成機能をチェックします。

-noStd85

-Std85オプションの指定を打ち消します。

(c)　注意事項

-Std85オプションは，次のオプションと背反となるため，同時に指定できません。同時に指定した場合は，-Std85オプションが有効となり，次のオプションが無効となります。

-V3Spec　-StdVersion　-CompatiM7　-CompatiV3　-H8Switch　-Cblctr

-IgnoreLCC　-JPN　-CmDol　-Comp5　-NumAccept　-V3Rec

-EquivRule,NotAny　-SQL　-BinExtend　-MaxDigits38

-IntResult,DecFloat40　-LiteralExtend　-V3RecFCSpace　-SQLDisp

-V3RecEased

このオプションは，自由形式正書法で書かれたCOBOL原始プログラムをコンパイルする場合には指定できません。指定した場合，エラーとなってコンパイルが中止されます。

(3)　-Std2002オプション

(a)　形式

-Std2002｛,OutRange｜,Obso｜,Archaic｝+
-noStd2002

(b)　機能

仕様チェック機能として，COBOL2002仕様の範囲外チェックや廃要素をチェックします。

仕様範囲外の記述や廃要素があると，警告レベルのエラーメッセージが出力されます。

-Std2002,OutRange

COBOL2002仕様の範囲外チェックをします。

-Std2002,Obso

COBOL2002仕様の廃要素をチェックします。

-Std2002,Archaic

COBOL2002仕様の古典的要素をチェックします。

-noStd2002

-Std2002オプションの指定を打ち消します。

(c)　注意事項

-Std2002オプションは，次のオプションと背反関係にあり同時に指定した場合は，-Std2002オプションを有効とします。

-V3Spec　-StdVersion　-CompatiM7　-CompatiV3　-H8Switch　-Cblctr

-IgnoreLCC　-JPN　-CmDol　-Comp5　-NumAccept　-V3Rec

-EquivRule,NotAny　-SQL　-BinExtend　-MaxDigits38

-IntResult,DecFloat40　-LiteralExtend　-V3RecFCSpace　-SQLDisp

-V3RecEased

(4)　-StdVersionオプション

(a)　形式

-StdVersion,｛1｜2｝
-noStdVersion

(b)　機能

第1次または第2次規格の言語仕様の解釈でコンパイルするためのオプションです。このオプションを指定しないときは，第3次規格以降の解釈でコンパイルされます。

-StdVersion,1

第1次規格（JIS72，ISO72，ANSI68）の解釈でコンパイルします。

-StdVersion,2

第2次規格（JIS80，ISO78，ANSI74）の解釈でコンパイルします。

-noStdVersion

-StdVersionオプションの指定を打ち消します。

このオプションを指定した場合，第3次規格以降の解釈※でコンパイルします。

注※

第3次規格以降の解釈とは，次の二つの規格の解釈を指します。

第3次規格（ISO85，ANSI85，JIS88，JIS92）

第4次規格（ISO/IEC 1989:2002，JIS X3002:2011）

-StdVersionオプション指定時，および未指定時の言語仕様の相違を，次に示します。

差異の生じる言語仕様

第1次規格

第2次規格

第3次規格以降

比較条件の略記法のNOT

略記法の条件の中のNOTが比較演算子の一部とも取れるときには論理演算子とみなす。

NOTの直後にGREATER，>，LESS，<，EQUAL，=，>=，<=のどれかが続くとき，NOTは比較条件の一部となる。これ以外のNOTは論理演算子とみなす。

MOVE文の位取り

送り出し側作用対象が位取りした整数項目（PICTURE句の右端文字がP）で，受け取り側作用対象が英数字編集項目の場合，あとに続くゼロを切り捨てて空白とする。

左記の場合，あとに続くゼロを切り捨てない。

UNSTRING文のDELIMITED BY ALL指定

複数の連続する区切り文字が現れた場合，区切り文字の受け取り領域に入るだけ区切り文字を移す。

左記の場合，区切り文字の受け取り領域には1個（1組）の区切り文字しか移さない。

COPY文の展開

第1次規格の仕様に従った書き方は旧仕様として展開する。

第2次規格以降の仕様に従ってCOPY文を展開する。

JUST句の処理

JUST句の指定がある英数字，英字，英数字編集にVALUE句で初期値を与える場合，JUST句の機能を働かせる。

左記の場合，JUST句の機能を働かせない。

WRITE文のADVANCINGの仮定

1ファイルに対する複数個のWRITE文でADVANCING指定があるものとないものを混用した場合，ADVANCING指定のないものに対してはBEFORE ADVANCING 1かAFTER ADVANCING 1のどちらかを仮定する。どちらを仮定するかはWRITE文の指定の内容による。

左記の場合，常にAFTER ADVANCING 1を仮定する。

PERFORM文のVARYING

AFTER指定がある場合の反復制御変数を初期化する位置

TEST AFTER指定時

外側のループの反復制御変数をBY指定の値で増加させてから，内側のループの反復制御変数をFROM指定の変数で再び初期化する。

TEST BEFORE指定時

内側のループの反復制御変数FROM指定の変数で初期化してから，外側のループの反復制御変数をBY指定の値で増加させる。

TEST AFTER指定時もTEST BEFORE指定時も，外側のループの反復制御変数をBY指定の値で増加させてから，内側の反復制御変数をFROM指定で再び初期化する。

SELECT OPTIONAL句

覚え書きとする。

覚え書きとしない。

CURRENCY SIGN句に指定できる定数

"="，"/"が指定できる。

"="，"/"は指定できない。

(c)　注意事項

このオプションは，自由形式正書法で書かれたCOBOL原始プログラムをコンパイルする場合には指定できません。指定した場合，エラーとなってコンパイルが中止されます。

33.5.12　他システムとの移行の設定

他システムとの移行に関連するコンパイラオプションについて，説明します。

(1)　-CompatiM7オプション（Windows(x86) COBOL2002で有効）

(a)　形式

-CompatiM7
-noCompatiM7

(b)　機能

-CompatiM7

MIOS7 COBOL85との互換機能を有効にします。

-noCompatiM7

-CompatiM7オプションの指定を打ち消します。

(2)　-CompatiV3オプション

(a)　形式

-CompatiV3
-noCompatiV3

(b)　機能

-CompatiV3

メインフレーム（VOS3）COBOL85との互換を指定するオプションです。-CompatiV3オプションは，VOS3 COBOL85で開発したCOBOLプログラムをWindows環境に移行することを目的として提供しているオプションで，日立拡張機能の中で使用頻度の高いものを対象としています。

このオプションを指定した場合，指定しない場合と比べて次の点が異なります。

ASSIGN句で指定した外部装置名に関連する環境変数名が，次のように変更されます。

（書き方）

SYSnnn〔-装置クラス〕〔-装置名〕〔-編成〕〔-ファイル定義名〕
または，〔装置クラス-〕〔装置名-〕〔編成-〕ファイル定義名

-CompatiV3オプション指定時の環境変数名

次のどちらかとなる。

CBL_SYSnnn

CBL_ファイル定義名

-CompatiV3オプション未指定時の環境変数名

次のどちらかとなる。

CBL_SYSnnn〔_装置クラス〕〔_装置名〕〔_編成〕〔_ファイル定義名〕

CBL_〔装置クラス_〕〔装置名_〕〔編成_〕ファイル定義名

OPEN I-Oで開かれた順ファイルに対してWRITE文が指定できます。このとき，次の条件をすべて満たすと，WRITE文はREWRITE文として扱われます。

（条件）

-CompatiV3オプションの指定がある。

EXTERNAL句が指定されているか，またはOPEN I-Oで開かれている。

WRITE文にADVANCING指定がない。

LINAGE句の指定がない。

-CompatiV3オプションを指定した場合，次のオプションが仮定されます。

（仮定されるオプション）

-V3Rec,Variable

可変長形式の原始プログラムのコンパイルを，メインフレームの日本語項目の扱いに合わせるオプションです。

なお，固定長形式でコンパイルする場合，-CompatiV3オプションと-V3Rec,Fixedオプションを指定する必要があります。

-JPN,Alnum

日本語項目，日本語編集項目，および日本語文字定数を，それぞれ英数字項目，英数字編集項目，および英数字定数として扱うオプションです。

VOS3 COBOL85でXCOBOL=(N)を指定したときと同じ動作となります。

VOS3 COBOL85上で使用できる報告書作成機能を記述したプログラムをコンパイルできます。

なお，-CompatiV3オプションを指定しない場合，PC COBOL85と同じ言語仕様の報告書作成機能を使用します。

通信節による画面機能で，複数プログラムで通信文が実行された場合，一つの仮想端末を複数のプログラム間で共用し，送受信します。

DIVIDE文書き方4および書き方5の，除算の剰余を計算するのに使う商は，商を計算したときの中間結果と同じけた数，同じ小数点位置，同じ符号の有無を持ちます。

（例）

DIVIDE A BY B GIVING C REMAINDER D.

上記の例のDIVIDE文は，下記のような連続した操作に変換されます（ただし，TMP1，TMP2，TMP3はコンパイラによって作成された中間結果の記憶場所を表します）。

A/B → TMP1
TMP1 → TMP2
A - (B * TMP2) → TMP3
TMP1 → C
TMP3 → D

-CompatiV3オプションを指定したときは，TMP2はTMP1と同じけた数，同じ小数点位置，同じ符号になります。

-CompatiV3オプション未指定のときは，TMP2は商（C）と同じけた数，同じ小数点位置，同じ符号になります。

-CompatiV3オプションを指定した場合，英数字定数の分離符には，アポストロフィ（'）だけが使用できます。

-CompatiV3オプションと-EquivRuleオプションは，同時に指定できません。指定した場合，あとに指定したオプションが有効となります。

Windows(x64) COBOL2002の場合，-CompatiV3オプションと-IntResult,DecFloat40オプションを同時に指定したとき，算術式と算術文に対する-CompatiV3オプションの仕様（DIVIDE文の書き方4および書き方5）は無効となります。この場合，-IntResult,DecFloat40オプション指定時での演算を行います。-IntResult,DecFloat40オプションについては，「(19)　-IntResult,DecFloat40オプション（Windows(x64) COBOL2002で有効）」を参照してください。

-noCompatiV3

-CompatiV3オプションの指定を打ち消します。

-CompatiV3オプションを指定した場合，-V3Rec,Variableオプションおよび-JPN,Alnumオプションが仮定されますが，-noCompatiV3オプションを指定しても，仮定された-V3Rec,Variableオプションおよび-JPN,Alnumオプションは打ち消されません。

(c)　注意事項

このオプションは，自由形式正書法で書かれたCOBOL原始プログラムをコンパイルする場合には指定できません。指定した場合，エラーとなってコンパイルが中止されます。

このオプションを指定した場合，連結式を記述できません。

コンパイラ環境変数CBLV3UNICODEにYESを指定し，-UniObjGenオプションを指定した場合，-CompatiV3オプションを指定しても-JPN,Alnumオプションは仮定されません。

このオプションを指定した場合，特殊名段落の定数10が有効になります。ただし，コンパイラ環境変数CBLV3UNICODEにYESを指定すると，-UniObjGenオプションと-CompatiV3オプションの同時指定が可能となるため，Unicodeで多バイトになる文字を指定した場合，コンパイルエラーとなります。

(3)　-Compati85オプション

(a)　形式

-Compati85｛,IoStatus｜,Linage｜,Call｜,Power｜,Syntax｜,IDParag｜,RsvWord｜,NoPropagate｜,All｝+
-noCompati85

(b)　機能

-Compati85,IoStatus

入出力状態1x，2xに対する処理をCOBOL85と同様にします。

-Compati85,Linage

LINAGE値が不正なときの処理をCOBOL85と同様にします。

-Compati85,Call

CALL文のON EXCEPTION，またはON OVERFLOW指定の無条件文を実行するエラーの条件をCOBOL85と同様にします。

-Compati85,Power

べき乗演算でのエラー時の処理をCOBOL85と同様にします。また，べき乗演算の精度を，同一システムのCOBOL85と同様にします。べき乗演算と-Compati85,Powerオプションとの関係については，「21.3.3　例外チェックが無効な場合の動作」の「(1)　手続き文の実行中にエラーが発生し，例外を検出した場合」を参照してください。

-Compati85,Syntax

次の機能について，コンパイル時の解釈をCOBOL85と同様にします。

COPY文のREPLACING指定での置換位置

見出し部注記項（-Compati85,IDParagオプション指定時と同等の解釈をする）

部の見出し，節名，段落名，END PROGRAMなどの開始位置チェック

直前のピリオドが省略されたA領域に置かれた語の解釈

COBOL語の最大長（30文字とする）

予約語（COBOL85では予約語で，COBOL2002では文脈依存語に変更されたものを予約語に戻す）

なお，COBOL85で予約語だったものがCOBOL2002で文脈依存語となっているのは，次の語です。

ONLY　PREVIOUS　RECURSIVE

プログラム名の長さ（30バイトとする）

自由形式正書法の1行の長さ（80文字とする）

-Compati85,IDParag

見出し部の構文チェックを緩和します。

このオプションを指定すると，見出し部にAUTHOR段落，INSTALLATION段落，DATE-WRITTEN段落，DATE-COMPILED段落，SECURITY段落，およびREMARKS段落が記述できます。

-Compati85,RsvWord

予約語のうちCOBOL2002で新たに追加されたものを除き，COBOL85の予約語と同じ範囲でコンパイルします。

-Compati85,NoPropagate

CALL文，INVOKE文，および利用者定義関数で伝播を抑止します。

次のプログラムを呼び出す場合，例外が伝播することはないため，このオプションを指定するとオブジェクトファイルサイズを縮小できます。

PROPAGATE指令が指定されていないプログラム

Cプログラムなど，COBOL言語以外の言語を使用したプログラム

COBOL2002で使用できるサービスルーチン

OpenTP1，XMAP3などの関連プログラムが提供している関数など

ただし，条件によっては，自動的に呼び出し元プログラムへの伝播が抑止される場合があります。その場合は，このオプションを指定する必要はありません。詳細は，「21.5.3　例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

-Compati85,All

-Compati85オプションのすべてのサブオプションを仮定します。

-Compati85,Allを指定した場合，-Compati85オプションのすべてのサブオプションを指定したものとみなします。

-noCompati85

-Compati85オプションの指定を打ち消します。

(c)　注意事項

-Compati85オプションは，単独で指定できません。必ずサブオプションを指定する必要があります。

-Compati85,IDParagオプションを指定した場合，見出し部中にCOPY文，REPLACE文，およびINCLUDE文を記述できません。注記項中にCOPY文，REPLACE文，またはINCLUDE文を記述した場合，そのCOPY文，REPLACE文，またはINCLUDE文を注記とみなします。

-Compati85,IDParagオプションを指定した場合，注記項中に継続行を表す標識（-）が現れたときは，コンパイルエラーとなります。

-Compati85,IDParagオプションを指定した場合，見出し部には，COBOL85で指定できる段落見出し（PROGRAM-ID，AUTHOR，INSTALLATION，DATE-WRITTEN，DATE-COMPILED，SECURITY，およびREMARKS）以外を指定できません。

-Compati85,Syntaxオプションを指定した場合に適用される予約語は，COBOL2002の予約語およびONLY，PREVIOUS，RECURSIVE の三つの語となります。

-Compati85,RsvWordオプションを指定した場合に適用される予約語は，COBOL85の予約語だけとなります。このため，次のCOBOL2002で新しく追加された予約語は，予約語とみなしません。

ACTIVE-CLASS

ALIGNED

ALLOCATE

ANYCASE

B-AND

B-NOT

B-OR

B-XOR

BASED

BINARY-CHAR

BINARY-DOUBLE

BINARY-LONG

BINARY-SHORT

COLS

COLUMNS

CONDITION

CONSTANT

DATA-POINTER

DEFAULT

EC

EO

EXCEPTION-OBJECT

FACTORY

FLOAT-EXTENDED

FLOAT-LONG

FLOAT-SHORT

FUNCTION-ID

GROUP-USAGE

LOCAL-STORAGE

LOCALE

MINUS

NESTED

OBJECT-REFERENCE

OPTIONS

OVERRIDE

PRESENT

PROGRAM-POINTER

RAISE

RAISING

RESUME

RETRY

SHARING

SOURCES

SYSTEM-DEFAULT

TYPEDEF

USER-DEFAULT

VAL-STATUS

VALID

VALIDATE

VALIDATE-STATUS

-Compati85,RsvWordオプションを指定した場合，COBOL2002で新しく追加された構文が利用できなくなります。このため，既存プログラムにCOBOL2002の新機能を加えて拡張することが困難になります。既存プログラムにCOBOL2002の新しい予約語が使われている場合，新しい予約語とは異なる語に置き換えることを推奨します。

-Compati85オプションのうち次のオプションを指定した場合，COBOLソース中にTURN指令を指定できません。指定した場合，コンパイルエラーとなります。

-Compati85,IoStatus

-Compati85,Linage

-Compati85,Call

-Compati85,Power

-Compati85,NoPropagate

-Compati85,NoPropagateオプションは，CALL文のほかにINVOKE文，および利用者定義関数の呼び出しの場合にも，伝播が抑止されます。なお，CALL文，INVOKE文，および利用者定義関数を使用していない場合，このオプションは意味を持ちません。

-Compati85,Syntaxオプションは，-LiteralExtendオプションと同時に指定すると，-Compati85,Syntaxオプションが有効となり，-LiteralExtendオプションは無効となります。

(4)　-H8Switchオプション

(a)　形式

-H8Switch
-noH8Switch

(b)　機能

-H8Switch

HITAC8000シリーズの仕様でコンパイルするためのオプションです。

次の文で，送り出し側作用対象が数字項目（または固定小数点数字定数）で，受け取り側作用対象が英数字項目（または英数字編集項目）の場合，数字項目を英数字項目とみなして転記します。

MOVE

WRITE FROM

REWRITE FROM

RELEASE FROM

ACCEPT FROM DAY

ACCEPT FROM DATE

ACCEPT FROM TIME

ACCEPT FROM DAY-OF-WEEK

また，比較条件で，両辺の組み合わせが数字項目（または固定小数点数字定数）と英数字項目（または英数字編集項目，英字項目，英数字定数）の場合，数字項目を英数字項目とみなして比較します。

このオプションを指定しなかった場合，数字項目は数字項目として転記，比較されます。

-noH8Switch

-H8Switchオプションの指定を打ち消します。

(5)　-Cblctrオプション

(a)　形式

-Cblctr
-noCblctr

(b)　機能

-Cblctr

報告書作成機能を使用するときに指定します。このオプションを指定すると，CBL-CTR特殊レジスタが生成され，COBOLプログラムと報告書作成機能間で連絡ができるようになります。

詳細は，マニュアル「COBOL2002　言語　拡張仕様編」　「7.　報告書作成機能の拡張」を参照してください。

-noCblctr

-Cblctrオプションの指定を打ち消します。

(6)　-DigitsTruncオプション

(a)　形式

-DigitsTrunc
-noDigitsTrunc

(b)　機能

-DigitsTrunc

原始プログラム中の転記文で受け取り側作用対象が2進項目の場合，送り出し側作用対象のけたが受け取り側作用対象よりも大きいときに，上位のけたを切り捨てます。

（例）次のプログラムの実行結果を示します。

       77 A PIC S9(4) USAGE COMP VALUE +123.
       77 B PIC S9(2) USAGE COMP.
           :
           MOVE A TO B.

-DigitsTruncオプションを指定した場合 …… +23

-DigitsTruncオプションを指定しない場合 … +123

このオプションを指定しなかった場合，原始プログラム中の転記文で受け取り側作用対象が2進項目のとき，送り出し側作用対象の有効けた数が受け取り側作用対象よりも大きいと，入り切らない部分が切り捨てられます。

-noDigitsTrunc

-DigitsTruncオプションの指定を打ち消します。

(c)　注意事項

-DigitsTruncオプションと-Comp5オプションを同時に指定した場合，あとに指定したオプションだけが有効となります。

例外名EC-SIZE-TRUNCATIONに対するTURN指令が有効の場合で，送り出し側作用対象の有効けた数が受け取り側作用対象のけた数より大きいときは，このオプションの指定があっても，上位けたを切り捨てないで，EC-SIZE-TRUNCATION例外を検出します。

(7)　-IgnoreLCCオプション

(a)　形式

-IgnoreLCC
-noIgnoreLCC

(b)　機能

-IgnoreLCC

WRITE〜ADVANCING／POSITIONING文で書き出すレコードの先頭1バイトを出力しないことを指定します。

あらかじめ，レコード記述項で行送り制御文字用の1バイト分の領域を確保しておいたプログラムをコンパイルするときに指定します。ただし，次の場合には-IgnoreLCCオプションの指定があっても，レコードの先頭から出力されます。

順ファイル以外のファイルの場合

順ファイルのWRITE文に行送りの指定（ADVANCING，POSITIONING）がない場合

順ファイルのファイル記述項にLINAGE句の指定がある場合

-noIgnoreLCC

-IgnoreLCCオプションの指定を打ち消します。

(8)　-CmAsterオプション

(a)　形式

-CmAster
-noCmAster

(b)　機能

-CmAster

固定形式正書法のとき，行の先頭文字（1カラム目の文字）が標準コードの星印（*）である行を注記行とします。

ただし，このオプションは固定形式正書法で記述されたCOBOLソースファイルをコンパイルするときだけ有効となります。

-noCmAster

-CmAsterオプションの指定を打ち消します。

(9)　-CmDolオプション

(a)　形式

-CmDol
-noCmDol

(b)　機能

-CmDol

固定形式正書法のとき，行の先頭から7カラム目の文字が「$」記号である行を注記行とします。

ただし，このオプションは固定形式正書法で記述されたCOBOLソースファイルをコンパイルするときだけ有効となります。

-noCmDol

-CmDolオプションの指定を打ち消します。

(10)　-Comp5オプション

(a)　形式

-Comp5
-noComp5

(b)　機能

-Comp5

COBOLプログラム中のUSAGE句のCOMP-5を使用できるようにするオプションです。

このオプションを指定すると，COMP-5は，COMPを指定した場合と同様に処理されます。このオプションを指定しなかった場合，USAGE句にCOMP-5が指定されているとエラーになります。

COMP-5は，-BigEndian,Binオプションの対象にはなりません。

COMP-5を指定できる場所は，COMPを指定できる場所と同じです。また，COMP-5は，COMPと同じ仕様となるため，PICTURE句のけた数，データのバイト数，および実際に格納できる数値は次のとおりです。

表33‒2　COMP-5で実際に格納できる数値

PICTURE句のけた数

データのバイト数

実際に格納できる数値

符号あり

符号なし

1〜4けた

2バイト

-2¹⁵〜2¹⁵-1

0〜2¹⁵-1

5〜9けた

4バイト

-2³¹〜2³¹-1

0〜2³¹-1

10〜18けた

8バイト

-2⁶³〜2⁶³-1

0〜2⁶³-1

USAGE句にCOMP-5を指定した項目にVALUE句がある場合，指定できる値については，マニュアル「COBOL2002　言語　拡張仕様編」　「25.3.2(7)　USAGE COMP-5を指定した項目に設定できる初期値（VALUE句の値）の拡張」を参照してください。

-noComp5

-Comp5オプションの指定を打ち消します。

(c)　注意事項

-Comp5オプションと-DigitsTruncオプションを同時に指定した場合，あとに指定したオプションだけが有効となります。

(11)　-V3Specオプション

(a)　形式

-V3Spec〔,CopyEased〕
-noV3Spec

(b)　機能

-V3Spec

VOS3 COBOL85でサポートされていない，COBOL2002固有の言語仕様に対して構文チェックするためのオプションです。

VOS3 COBOL85 09-00を対象として，ほぼ同等の言語仕様で構文チェックをし，VOS3 COBOL85ではサポートされていないCOBOL2002固有の言語仕様に対して警告メッセージを出力します。

出力するオブジェクトファイルは，このオプションの影響を受けません。

このオプションは，VOS3 COBOL85互換機能です。

-V3Spec,CopyEased

-V3Specオプションで指定された構文チェックの範囲を緩和し，COPY文，REPLACE文の一部のエラーチェックをしません。

このオプションは，VOS3 COBOL85互換機能です。

-noV3Spec

-V3Specオプションの指定を打ち消します。

-V3Specオプションを指定した場合，-V3Rec,Variableオプションが仮定されますが，-noV3Specオプションを指定しても，仮定された-V3Rec,Variableオプションは打ち消されません。

(c)　注意事項

日本語項目の部分参照については，VOS3 COBOL85のXCOBOL=(-N)オプションを指定した状態を対象とします。

-V3Specオプションと-CompatiV3オプションを同時に指定した場合，一部のチェック項目が重複するため，-CompatiV3オプションのエラーメッセージが出力され，このオプションのエラーメッセージは出力されません。

-V3Specオプションを指定すると，-V3Rec,Variableオプションが仮定されます。このため，固定長形式でコンパイルする場合は-V3Rec,Fixedオプションを同時に指定する必要があります。

-V3Specオプションと次のオプションを同時に指定すると，-V3Specオプションが有効になり，次のオプションは無効になります。

-Comp5　-CmAster　-BinExtend　-CBLVALUE　-Bin1Byte

-CompatiM7　-NumAccept　-CmDol　-MaxDigits38　-IntResult,DecFloat40

-LiteralExtend　-V3RecEased

-V3Specオプションと-UniObjGenオプションを同時に指定した場合，-V3Rec,Variableオプションは仮定されません。-V3Recオプションを有効とするときは，環境変数CBLV3UNICODEを指定してください。

(12)　-V3ConvtNameオプション

(a)　形式

-V3ConvtName
-noV3ConvtName

(b)　機能

-V3ConvtName

原文名定数の「¥」を「_」に，「@」を「!」に変換した名称で登録集原文を検索する場合，このオプションを指定します。このオプションは，COPY文およびINCLUDE文で有効になります。また，原文名定数の末尾の拡張子を省略した場合は，「.cbl」が仮定されます。なお，原文名指定の場合は，このオプションの対象となりません。

（例1）原文名定数に¥，@が含まれる場合

原文名定数中に¥，@が含まれる場合は，-V3ConvtNameオプションを指定してコンパイルします。

COPY '¥ABC'.

_ABC.cblを登録集原文として検索します。

COPY '@ABC'.

!ABC.cblを登録集原文として検索します。

（例2）原文名に¥，@が含まれる場合

¥，@，#は，COBOL2002では原文名に使用できない文字のため，コンパイルエラーとなります。この場合は，¥，@を含む原文名を定数指定に変更してから-V3ConvtNameオプションを指定してコンパイルします。※

COPY ¥ABC.　→　COPY '¥ABC'.

_ABC.cblを登録集原文として検索します。

COPY @ABC.　→　COPY '@ABC'.

!ABC.cblを登録集原文として検索します。

-V3ConvtNameオプションを使用しない場合は，¥，@を¥，@，#以外の文字に変更してください。

注※

#を含む原文名は，原文名定数に変更するだけで使用できます。

COPY文での登録集原文の利用については，「33.3.1　原始文操作機能」を参照してください。

このオプションは，VOS3 COBOL85互換機能です。

-noV3ConvtName

-V3ConvtNameオプションの指定を打ち消します。

(13)　-Switchオプション

(a)　形式

-Switch,｛EBCDIC｜EBCDIK｝〔,Unprintable〕〔,noApplyJpnItem〕
-noSwitch

(b)　機能

照合順序および字類条件をEBCDICコードまたはEBCDIKコードに切り替えるためのオプションです。

-Switch,EBCDIC

英数字の照合順序および字類条件をEBCDICコードに切り替えます。ただし，1バイトで印字できないコードは，照合順序としてX'00'またはX'FF'に割り付けられます。

-Switch,EBCDIK

英数字の照合順序および字類条件をEBCDIKコードに切り替えます。ただし，1バイトで印字できないコードは，照合順序としてX'00'またはX'FF'に割り付けられます。

-Switch,xxxxx,Unprintable

英数字の照合順序を，xxxxxに指定したコードに切り替えます。

1バイトで印字できないコードも，照合順序として固有の文字位置に割り付けます。詳細は，「(c)　注意事項」を参照してください。

xxxxxは，EBCDIC，EBCDIKのどちらかを指定します。

-Switch,xxxxx,noApplyJpnItem

英数字の照合順序を，xxxxxに指定したコードに切り替えます。

日本語項目を-Switchオプションの適用対象外とします。

xxxxxは，EBCDIC，EBCDIKのどちらかを指定します。

-noSwitch

-Switchオプションの指定を打ち消します。

(c)　注意事項

字類条件の判断基準と文字の大小関係

プログラムに記述した字類条件に対するコードの判断基準と文字の大小関係を，次に示します。

表33‒3　字類条件の判断基準と文字の大小関係

条件

ASCII

EBCDIC

EBCDIK

字類の判断基準

ALPHABETIC

a〜z，A〜Z

A〜Z，a〜z

A〜Z

ALPHABETIC-UPPER

A〜Z

A〜Z

A〜Z

ALPHABETIC-LOWER

a〜z

a〜z

−

文字の大小関係

a〜z＞A〜Z

a〜z＜A〜Z

a〜z＜A〜Z

組み込み関数の結果

UPPER-CASE

a〜z→A〜Z

a〜z→A〜Z

a〜z→A〜Z

LOWER-CASE

A〜Z→a〜z

A〜Z→a〜z

A〜Z→a〜z

（凡例）

−：字類条件が真になる事はない

＞：大きい（a＞b　aはbより大きい）

＜：小さい（a＜b　aはbより小さい）

→：置換（a→b　aをbに置換する）

PROGRAM COLLATING SEQUENCE句と-Switchオプションの指定値の対応を次に示します。

PROGRAM COLLATING SEQUENCE句の符号系名

-Switchオプション

EBCDICサブオプションを指定した場合

EBCDIKサブオプションを指定した場合

指定なし

EBCDICコード

EBCDIKコード

EBCDIC

EBCDICコード

Sレベルエラー

EBCDIK

Sレベルエラー

EBCDIKコード

EBCDIC，EBCDIK以外

Sレベルエラー

Sレベルエラー

-Switchオプションの対象

-Switchオプションの対象を次に示します。

機能

対象の字類

比較条件

英字，英数字，日本語※1

整列併合※2

英字，英数字

注※1

noApplyJpnItemサブオプションを指定している場合，対象の字類が日本語のときは-Switchオプションの対象となりません。

注※2

-Switchオプション指定による照合順序は，索引ファイルの参照キーには適用されません。参照キーの比較は，固有文字集合の大小順序に従います。

照合順序

比較のときに使用する照合順序として，1バイトの印字可能文字は対応する文字位置に割り付けられ，その他の印字できないコードはX'00'またはX'FF'に割り付けられます。

ただし，Unprintableサブオプションが有効な場合は，印字できないコードに，印字可能文字が割り付けられていない固有の文字位置が割り付けられます。Unprintableサブオプションの有無での照合順序の違いを次に示します。

文字コード種別

Unprintableサブオプション

無効

有効

印字可能文字

対応する文字の文字位置に割り付けられます。

印字できないコード

X'80'はX'00'に，X'80'以外はすべてX'FF'に，それぞれ割り付けられます。

印字可能文字が割り付けられていない固有の文字位置に割り付けられます。

ただし，印字できないコードの大小関係は保証しません。

Unprintableサブオプションが有効な場合，JIS8単位コードが，EBCDICコードまたはEBCDIKコードのどの位置に割り付けられるかをそれぞれ次に示します。なお，表中の網掛けは，印字できないコードを示します。

図33‒2　EBCDICコードとJIS8単位コードの対応表

図33‒3　EBCDIKコードとJIS8単位コードの対応表

Unprintableサブオプションが有効でない場合の照合順序の対応表については，マニュアル「COBOL2002　言語　標準仕様編」　「付録B　計算機文字集合」を参照してください。

-Switchオプションを指定したプログラムでの比較結果

-Switchオプションを指定したプログラムでは，特定のデータ種別の比較結果で注意が必要です。

次のように，1バイトで印字できないコード（日本語データや数字データなど）を含む作用対象（データ項目や定数）を比較条件に指定している場合は，値が異なるのに等しいと解釈されたり，-Switchオプション未指定時とは大小関係が逆転したりすることがあります。

データ種別

日本語データ（英数字項目や日本語項目※に日本語文字が格納されている場合など）

数字データ（集団項目の従属項目に，用途（USAGE句）がDISPLAY以外の数字項目（2進項目，内部10進項目，内部浮動小数点項目）がある場合など）

注※

noApplyJpnItemサブオプションが無効の場合です。

比較結果

日本語データや数字データで，1バイトの印字できないコードでは，等しいと解釈されることがあります。

ただし，Unprintableサブオプションが有効な場合は，コードの一致および不一致を判定できます。なお，Unprintableサブオプションが有効な場合でも，照合順序が切り替わることで，大小関係が-Switchオプション未指定時とは逆転することがあります。

日本語データや数字データ中の印字可能文字は，照合順序が切り替わることで，-Switchオプション未指定時とは大小関係が逆転することがあります。

(14)　-V3Recオプション

(a)　形式

-V3Rec,｛Fixed｜Variable｝
-noV3Rec

(b)　機能

メインフレーム（VOS3）COBOL85の固定長または可変長レコード形式のプログラムを，VOS3 COBOL85の日本語文字の扱いに合わせてコンパイルするためのオプションです。

-V3Rec,Fixed

VOS3 COBOL85の固定長レコード形式のCOBOL原始プログラムを，VOS3 COBOL85の日本語文字の扱いに合わせてコンパイルします。

-V3Rec,Variable

VOS3 COBOL85の可変長レコード形式のCOBOL原始プログラムを，VOS3 COBOL85の日本語文字の扱いに合わせてコンパイルします。

-V3Rec,Variableオプションは，-CompatiV3オプションと同時に指定できます。また，-CompatiV3オプションを指定すると，-V3Rec,Variableオプションが仮定されます。

-noV3Rec

-V3Recオプションの指定を打ち消します。

(c)　注意事項

-V3Recオプションと-EquivRuleオプションを重複指定した場合，あとに指定したオプションを優先します。

このオプションを指定した場合，このシステムの標準コードと拡張コードの等価規則は適用されません。また，日本語文字定数に標準コードの空白を書いてもエラーとはなりません。ただし，日本語文字定数に空白以外の標準コード文字を書けますが，警告レベルのエラーとなります。なお，日本語文字定数の標準コード文字数は偶数としてください。日本語文字定数の標準コード文字数が奇数の場合，警告レベルのエラーとし，日本語文字定数に標準コードの空白を追加します。

日本語空白は半角空白2個と等価とみなし，機能キャラクタが付加されたものとみなす対象としません。日本語空白を使用しているメインフレームの固定長形式の原始プログラムを-V3Rec,Fixedオプションを指定してコンパイルする場合は，カラムずれなどの影響がないか確認する必要があります。機能キャラクタについては，マニュアル「COBOL2002　言語　拡張仕様編」　「24.3.3(2)　文字集合」を参照してください。また，日本語空白を拡張コードとして扱いたいときは，-V3Recオプションと合わせて-V3RecFCSpaceオプションを指定してください。-V3RecFCSpaceオプションの詳細については，「(15)　-V3RecFCSpaceオプション」を参照してください。

VOS3 COBOL85の固定長レコード形式の原始プログラムと可変長レコード形式の原始プログラムは，このオプションを指定したときだけコンパイルできます。

したがって，COPY文で複写した原始プログラムを含め，固定長レコード形式の原始プログラムと可変長レコード形式の原始プログラムは同時にコンパイルできません。

このオプションを指定した場合，72カラムより前に改行文字があるCOBOL原始プログラムは，改行文字から72カラムまで空白に置き換えてコンパイルされます。

このオプションは，自由形式正書法で書かれたCOBOL原始プログラムをコンパイルする場合には指定できません。指定した場合，エラーとなってコンパイルが中止されます。

このオプションを指定した場合，英数字定数の分離符には，アポストロフィ（'）だけが使用できます。

(15)　-V3RecFCSpaceオプション

(a)　形式

-V3RecFCSpace
-noV3RecFCSpace

(b)　機能

-V3RecFCSpace

-V3Recオプションでの空白に関する機能キャラクタの扱いを，VOS3 COBOL85と同等にします。機能キャラクタが付加されたものとみなす条件については，「(d)　機能キャラクタが付加されたものとみなす条件」を参照してください。

-noV3RecFCSpace

-V3RecFCSpaceオプションの指定を打ち消します。

(c)　注意事項

-V3RecFCSpaceオプションの指定は，-V3Recオプションの指定が有効な場合にだけ有効となります。

(d)　機能キャラクタが付加されたものとみなす条件

このコンパイラは，-V3Recオプションの指定が有効な場合に，-V3RecFCSpaceオプションの有無で，空白に関する機能キャラクタの扱いが異なります。次の条件文中の太字の部分は，-V3RecFCSpaceオプションの有無での相違点です。

なお，これ以降「KEISコード開始」と「EBCDIKコード開始」を表す2バイトの機能キャラクタをそれぞれ，[漢]と[E]で表します。また，改行を[改行]で表します。

-V3RecFCSpaceオプション指定がない場合

日本語空白を除く日本語文字列の先頭文字の直前に[漢]が付加されたものとみなします。

直前に[漢]が付加されたものとみなした日本語文字列のあとに，最初に現れた半角空白以外の半角文字の直前に[E]が付加されたものとみなします。

[漢]が付加されたものとみなしたあとは，[E]が付加されたものとみなすまで，同じ行には[漢]が付加されたものとみなしません。

-V3RecFCSpaceオプション指定がある場合

日本語空白を含む日本語文字列の先頭文字の直前に[漢]が付加されたものとみなします。

直前に[漢]が付加されたものとみなした日本語文字列のあとに，最初に現れた半角空白以外の半角文字の直前に[E]が付加されたものとみなします。また，日本語文字列の直後が改行か日本語文字列と改行との間が半角空白だけのとき，日本語文字列の直後に[E]が付加されたものとみなします。

[漢]が付加されたものとみなしたあとは，[E]が付加されたものとみなすまで，同じ行には[漢]が付加されたものとみなしません。

-V3Recオプションの指定が有効な場合に，-V3RecFCSpaceオプションの有無での機能キャラクタが付加されたものとみなした状態を次の例に示します。

（例1）日本語空白に関する機能キャラクタの扱い

COBOL原始プログラム

000100 01△DATA1△PIC△N(5)△VALUE△N'▲あいう▲'.

-V3Rec,Fixedオプション指定ありで， -V3RecFCSpaceオプション指定がない場合

000100 01△DATA1△PIC△N(5)△VALUE△N'▲[漢]あいう▲[E]'.

-V3Rec,Fixedオプション指定ありで，-V3RecFCSpaceオプション指定がある場合

000100 01△DATA1△PIC△N(5)△VALUE△N'[漢]▲あいう▲[E]'.

（凡例）

▲：日本語空白

△：半角空白

-V3RecFCSpaceオプション指定がない場合，日本語空白を日本語文字列の先頭文字と扱いません。このため，日本語空白以外の先頭文字「あ」の直前に[漢]が付加されたものとみなします。また，直前に[漢]が付加されたものとみなした日本語文字列「あいう」のあとで最初に現れた半角空白以外の半角文字「'」の直前に[E]が付加されたものとみなします。

-V3RecFCSpaceオプション指定がある場合，日本語空白を日本語文字列の先頭文字と扱い，直前に[漢]が付加されたものとみなします。また，直前に[漢]が付加されたものとみなした日本語文字列「▲あいう▲」のあとで最初に現れた半角空白以外の半角文字「'」の直前に[E]が付加されたものとみなします。

（例2）空白と改行に関する機能キャラクタの扱い

COBOL原始プログラム

000100 01△DATA1△PIC△N(5)△VALUE△N'あいう△△[改行]
000200-'△△'.

-V3Rec,Fixedオプション指定ありで， -V3RecFCSpaceオプション指定がない場合

000100 01△DATA1△PIC△N(5)△VALUE△N'[漢]あいう△△[改行]
000200-'△△'.

-V3Rec,Fixedオプション指定ありで，-V3RecFCSpaceオプション指定がある場合

000100 01△DATA1△PIC△N(5)△VALUE△N'[漢]あいう[E]△△[改行]
000200-'△△'.

（凡例）

▲：日本語空白

△：半角空白

-V3RecFCSpaceオプション指定がない場合，日本語文字列「あいう」のあとには，半角空白以外の半角文字がないため[E]が付加されたものとみなしません。

-V3RecFCSpaceオプション指定がある場合，日本語文字列「あいう」と[改行]の間が半角空白だけであるため，日本語文字列「あいう」の直後に[E]が付加されたものとみなします。

(16)　-V3RecEasedオプション

(a)　形式

-V3RecEased｛,QuoteCheck｜,WordCheck｝+
-noV3RecEased

(b)　機能

-V3RecEased,QuoteCheck

-CompatiV3または-V3Recオプションを指定したとき，定数の分離符のチェックを緩和します。

-V3RecEased,QuoteCheckオプションが有効な場合，-DoubleQuoteオプションに関係なく，定数の分離符は，アポストロフィ（'）と引用符（"）のどちらでも指定できます。

-V3RecEased,WordCheck

-CompatiV3または-V3Recオプションを指定したとき，語またはPICTURE文字列の制限値のチェックを緩和します。

-V3RecEased,WordCheckオプションが有効な場合，語またはPICTURE文字列の制限値を超えたときのコンパイルエラーを，重大エラーから警告エラーに緩和できます。

-noV3RecEased

-V3RecEasedオプションの指定を打ち消します。

(c)　注意事項

-V3RecEasedオプションと-V3Specオプションを同時に指定したとき，-V3RecEasedオプションの指定は無効になります。

-V3RecEasedオプションの指定は，-V3Recオプションの指定が有効な場合にだけ有効です。

-V3RecEased,QuoteCheckオプションの指定に関係なく，SQL文中の定数の分離符はアポストロフィ（'）だけ使用できます。

-V3RecEased,QuoteCheckオプションは，翻訳指令に対しても有効です。

(17)　-DoubleQuoteオプション

(a)　形式

-DoubleQuote
-noDoubleQuote

(b)　機能

-DoubleQuote

VOS3 COBOL85互換に関連するオプションである-V3Rec，-CompatiV3のどちらかを指定したときに，英数字定数の分離符として引用符（ " ）を用いることを指定するオプションです。このオプションを指定しないときは，アポストロフィ（ ' ）を分離符として用います。

-V3Recオプション，-CompatiV3オプションのどちらも指定していない場合は，-DoubleQuoteオプションを指定しても無効となります。この場合は，引用符（ " ），アポストロフィ（ ' ）のどちらも分離符として使用できます。

ただし，SQL文中の定数の分離符は，-DoubleQuoteオプションの指定に関係なく，常にアポストロフィ（ ' ）を使用します。

また，QUOTE表意定数は，-V3Recオプション，-CompatiV3オプションの指定に関係なく，-DoubleQuoteオプション指定時は引用符（ " ）を意味し，-DoubleQuoteオプション指定なしのときはアポストロフィ（ ' ）を意味します。

なお，このオプションは，翻訳指令に対しても有効となります。

-noDoubleQuote

-DoubleQuoteオプションの指定を打ち消します。

(18)　-BigEndianオプション

(a)　形式

-BigEndian｛,Bin｜,Float｝+
-noBigEndian

(b)　機能

用途（USAGE句）が2進または浮動小数点のデータ項目の形式を，ビッグエンディアン形式にするためのオプションです。

-BigEndian,Bin

用途が2進（BINARY，COMP，COMP-4）のデータ項目の形式を，ビッグエンディアン形式にします。

このオプションを指定した場合，2進項目を演算などで参照すると，実行性能が劣化します。このため，必要のないかぎりこのオプションは指定しないでください。

-BigEndian,Float

用途が浮動小数点（COMP-1，COMP-2）のデータ項目の形式を，ビッグエンディアン形式にします。

このオプションを指定した場合，浮動小数点を演算などで参照すると，実行性能が劣化します。このため，必要のないかぎりこのオプションは指定しないでください。

-noBigEndian

-BigEndianオプションの指定を打ち消します。

(c)　注意事項

ビッグエンディアン形式とリトルエンディアン形式との違い

コンピュータで扱うバイナリ形式のデータ（2進データ，内部浮動小数点数字データ）には，ビッグエンディアン形式とリトルエンディアン形式の2種類があります。

これは，マイクロプロセッサのアーキテクチャの違いによるもので，システムによって採用されるエンディアン形式が異なります。システムごとのエンディアン形式を次に示します。

システム

エンディアン形式

Windows

Linux

リトルエンディアン

HP-UX

AIX

Solaris

ビッグエンディアン

ビッグエンディアン形式とリトルエンディアン形式では，バイナリデータがメモリ上に配置されるときの順序が次の例のように逆になります。

（例）

10（=H'0000000A'）が4バイトのメモリに配置された場合の違い

ビッグエンディアン形式では左側から右側へ1バイトずつ配置されるのに対して，リトルエンディアン形式では右側から左側へ1バイトずつ配置されます。このため，ビッグエンディアン形式のシステムとリトルエンディアン形式のシステムで同じデータを扱う場合でも，参照のしかたによっては違った結果になることがあります。-BigEndianオプションは，このような場合にデータを正しく処理できるようにするために使用します。

-BigEndianオプションの使い方

リトルエンディアン形式のシステムで2進データをそのまま参照したり，リトルエンディアン形式のシステムで作成したファイルを参照したりする場合は，このオプションを指定する必要はありません。しかし，REDEFINES句などで英数字データを2進データとして参照したり，ビッグエンディアン形式のシステムで作られたファイル（可変長ファイルは対象外）を参照したりする場合は，ビッグエンディアン形式のシステムとリトルエンディアン形式のシステムで2進データ，内部浮動小数点数字データの表現形式が異なるため，このオプションを指定する必要があります。このオプションは次のような場合に指定してください。

ビッグエンディアン形式のシステム上で開発した2進データや内部浮動小数点数字データのメモリ上での配置を意識しているようなプログラムをリトルエンディアン形式のシステム上に移植する場合

ビッグエンディアン形式のシステム上で作成した2進データや内部浮動小数点数字データを含むファイルをそのままリトルエンディアン形式のシステム上へ移行し，リトルエンディアン形式のシステム上のプログラムで参照する場合

ビッグエンディアン形式のシステム上で開発したREDEFINES句でほかの形式のデータ項目を2進データとして参照するようなプログラムをリトルエンディアン形式のシステム上に移植する場合

使用上の注意

-BigEndianオプションの使用上の注意を次に示します。

C言語と連携している場合，-BigEndian,Binオプション指定時には，Cプログラムとインタフェースを取る2進データはCOMP-5で定義してください。

コマンド行に指定した引数を受け取る場合（16.2.2　引数の受け取り方法（C言語インタフェースに従った形式の場合）または16.2.3　引数の受け取り方法（VOS3インタフェースに従った形式の場合）を参照）-BigEndian,Bin指定時には，連絡節の2進データは，COMP-5で定義してください。

2進項目を引数とするサービスルーチン（OLE2オートメーション機能で使用するサービスルーチンも含む）は，受け取る項目をCOMP-5で定義してください。

CALL文でLENGTH OF 一意名を指定した場合，呼び出し先プログラムは，受け取る項目をCOMP-5で定義してください。

開発マネージャでのビルド，リビルドやcblbuild2kコマンドを使用する場合，一つのプロジェクト中にこのオプションを指定したプログラムと指定しないプログラムを混在させないでください。

XMAP3を使用する場合は，XMAP3のオプションと合わせる必要があります。

索引ファイル，および整列併合機能で使用するキーデータ項目の2進データ項目は，リトルエンディアン形式でキーを大小比較します。このため，このオプションを指定したビッグエンディアン形式では，正常に動作できません。

キーデータ項目の2進データ項目はCOMP-5で定義するか，またはリトルエンディアン形式データとしてください。

(19)　-VOSCBLオプション

(a)　形式

-VOSCBL｛,OccursKey｜,ReportControl｜,DataComm｜,RedefinesData｜,AssignDataToDevice｜,EvaluateWhenOther｝+
-noVOSCBL

(b)　機能

メインフレーム互換機能を有効にします。

-VOSCBL,OccursKey

OCCURS句のKEY IS指定のデータ名の名前の有効範囲を，そのOCCURS句のある記述項または，それに従属する記述項とします。

OCCURS句のKEY IS指定のデータ名は，修飾してもその修飾は無視されます。

（例1）

       WORKING-STORAGE SECTION.
         01 DAT0.
           02 DAT1 PIC X.   ・・・・・・・・・・・・・・(1)
         01 DAT2.
           02 DAT3 OCCURS 10 ASCENDING KEY DAT1.  ・・・(2)
             03 DAT1  PIC X.      ・・・・・・・・・・・(3)
             03 DAT5  PIC X.

-VOSCBL,OccursKeyオプションの指定がある場合は，（2）のDAT1は修飾しなくても，（2）の従属項目として定義された（3）のDAT1が参照されます。

-VOSCBL,OccursKeyオプションの指定がない場合は，DAT1が（1）と（3）にあるため，名前が一意になりません。一意に参照するためには，（2）のDAT1を「OF DAT3」で修飾する必要があります。

（例2）

       WORKING-STORAGE SECTION.
         01 DAT0.
           02 DAT1 PIC X.     ・・・・・・・・・・・・・・・(1)
         01 DAT2.
           02 DAT3 OCCURS 10 ASCENDING KEY DAT1 OF DAT0.・・(2)
             03 DAT1  PIC X.      ・・・・・・・・・・・・・(3)
             03 DAT5  PIC X.

-VOSCBL,OccursKeyオプションの指定がある場合は，（2）のDAT1を修飾（OF DAT0）してもその修飾は無視されるため，（2）のDAT1は，（2）の従属項目として定義された（3）のDAT1が参照されます。

-VOSCBL,OccursKeyオプションの指定がない場合は，（2）のDAT1の修飾（OF DAT0）を無視されないため，（1）のDAT1が参照されます。しかし，KEY IS指定のデータ名は，OCCURS句のある記述項または，それに従属する記述項でなければなりません。

したがって，（1）のDAT1は（2）の従属項目でないため，（2）の修飾を「OF DAT3」に変更する必要があります。

-VOSCBL,ReportControl

制御脚書きの印刷中に改ページが起こった場合，ページの頭書きでSOURCE句によって制御用データ項目を参照しているときは，その制御用データ項目の値を元の値で参照します。

-VOSCBL,DataComm

データコミュニケーション機能の通信記述項で，次のどちらかに該当するときの初期値を，メインフレーム(VOS3/VOS1)のXDM/DCCMデータコミュニケーション機能を使用する場合の値とします。

通信記述項の句の指定を省略している。

通信文の実行前に，通信記述項の句に指定されたデータ名に初期値を設定していない。

なお，このオプションの指定がない場合は，TP1/Server Baseを使用する場合の初期値とします。

-VOSCBL,RedefinesData

REDEFINES句の右辺のデータ名が未定義のとき，直前の同一レベル番号のデータ名をREDEFINES句の右辺として仮定します。

（例）

  4              WORKING-STORAGE SECTION.
  5                01 DAT1.
  6                  02 DAT2.
  7                    03 DAT3  PIC XX.
  8                  02 DAT4  REDEFINES UNDEF.
  9                    03 DAT5  PIC X.
 10                    03 DAT6  PIC X.

この例では，8行目のREDEFINES句の右辺のデータ名UNDEFが定義されていません。-VOSCBL,RedefinesDataオプションが有効な場合，直前の同一レベル番号のデータ名DAT2をREDEFINES句の右辺のデータ名として仮定します。-VOSCBL,RedefinesDataオプションが無効な場合，8行目のREDEFINES句は無視されます。

-VOSCBL,AssignDataToDevice

ASSIGN句の利用者定義語がデータ名と一致していても外部装置名とみなします。

（例）

  4       ENVIRONMENT         DIVISION.
  5        INPUT-OUTPUT       SECTION.
  6         FILE-CONTROL.
  7           SELECT  TEST-F  ASSIGN    SYS001.
  8       DATA                DIVISION.
  9        FILE               SECTION.
 10         FD    TEST-F      LABEL  RECORD  STANDARD.
 11          01   TEST-R      PIC  X(80).
 12       WORKING-STORAGE    SECTION.
 13          01   SYS001      PIC  X(16).

この例では，7行目のASSIGN句でデータ名「SYS001」を定義しています。

-VOSCBL,AssignDataToDeviceオプションが有効な場合は，「SYS001」を外部装置名とみなして，お知らせメッセージを出力します。-VOSCBL,AssignDataToDeviceオプションが無効な場合は，「SYS001」をデータ名とみなします。

-VOSCBL,EvaluateWhenOther

EVALUATE文のWHEN指定とWHEN OTHER指定の間の無条件文が省略された場合に，-VOSCBL,EvaluateWhenOtherオプションが有効なときは，警告エラーメッセージを出力してCONTINUE文を仮定します。-VOSCBL,EvaluateWhenOtherオプションが無効なときは，重大エラーメッセージを出力します。

-noVOSCBL

-VOSCBLオプションの指定を打ち消します。

(c)　注意事項

このオプションは，-CompatiV3オプションと同時に指定してください。-CompatiV3オプションの指定がない場合は，エラーメッセージが出力されます。

次のオプションは-CompatiV3オプションを無効とするため，このオプションおよび-CompatiV3オプションと次のオプションを同時に指定しないでください。-CompatiV3オプションの指定が無効となり，Uレベルのエラーになります。

-StdMIA　-Std85　-Std2002

このオプションと-UniObjGenオプション，および-CompatiV3オプションを同時に指定する場合，-CompatiV3オプションが有効となるよう，コンパイラ環境変数CBLV3UNICODEを指定してください。

(20)　-PortabilityCheckオプション

メインフレームから移行する場合，ユーザが注意すべき個所にお知らせメッセージ（Iレベルメッセージ）を出力し，ユーザの移行作業を支援します。このオプションを指定すると，COBOL2002とメインフレームで動作の異なる可能性がある個所を対象に，お知らせメッセージを出力します。

なお，このオプションは，Sレベル以上のエラーがないプログラムに適用してください。Sレベル以上のエラーがあるプログラムで適用した場合の動作は，保証しません。

(a)　形式

-PortabilityCheck｛,Literal｜,Numeric｝+
-noPortabilityCheck

(b)　機能

-PortabilityCheck,Literal

-UniObjGenオプション指定時，英数字定数および日本語文字定数中の日本語または半角かたかなにお知らせメッセージを出力します。

次に示す16進定数にお知らせメッセージを出力します。

16進英数字定数，16進数字定数，16進日本語文字定数

-PortabilityCheck,Numeric

RECORD KEY句，ALTERNATE RECORD KEY句の2進項目，内部浮動小数点項目にお知らせメッセージを出力します。

浮動小数点の演算が発生する個所にお知らせメッセージを出力します。

浮動小数点の演算が発生する個所は次を対象とします。

算術式，算術文に指定された浮動小数点項目や浮動小数点定数

算術式が記述できる場所に書かれた単項の浮動小数点項目や浮動小数点定数も含みます。

ただし，受け取り項目など，演算に関係しない浮動小数点項目は除外します。

べき乗の場合，べき数に指定されたデータ項目および算術式が小数点を持つ場合，または，べき数が小数点を含む数字定数である場合

次の組み込み関数

ACOS，ASIN，ATAN，COS，LOG，LOG10，MOD，RANDOM，REM，SIN，SQRT，STANDARD-DEVIATION，TAN，VARIANCE

次のどれかが引数に指定されている組み込み関数

浮動小数点項目※，べき乗が含まれる算術式，または除算が含まれる算術式

注※

　ADDR関数，およびLENGTH関数を除きます。

-noPortabilityCheck

-PortabilityCheckオプションの指定を打ち消します。

(21)　-IgnoreAPPLY,FILESHAREオプション

(a)　形式

-IgnoreAPPLY,FILESHARE
-noIgnoreAPPLY

(b)　機能

-IgnoreAPPLY,FILESHARE

入出力管理記述項のAPPLY FILE-SHARE句を覚え書きとみなします。覚え書きとみなしたときは，コンパイル時にお知らせメッセージを出力します。

-noIgnoreAPPLY

-IgnoreAPPLYオプションの指定を打ち消します。

33.5.13　リスト出力の設定

リスト出力を設定するコンパイラオプションについて，説明します。

(1)　-SrcListオプション

(a)　形式

-SrcList,｛OutputAll｜CopyAll｜CopySup｜NoCopy｝〔,NoFalsePath〕〔,DataLoc〕
-noSrcList

(b)　機能

コンパイルリストの出力形式を指定するオプションです。このオプションを指定しなかった場合，コンパイルリストは，出力されません。

出力されるリストの内容については，「付録E　コンパイルリスト」を参照してください。また，コンパイルリストに関連する翻訳指令については，「2.3.4　コンパイルリストに関連する翻訳指令」を参照してください。

-SrcList,OutputAll

すべての情報を出力します。

原始プログラム中に，COPY文のSUPPRESS指定やLISTING OFF指令がある場合でも，すべてのソースをコンパイルリストに展開します。

-SrcList,CopyAll

SUPPRESS指定を無視して，すべてのCOPY文を強制的に展開します。

-SrcList,CopySup

プログラムにSUPPRESS指定があるときだけ，COPY文の展開を抑止します。SUPPRESS指定がないCOPY文は，すべて展開します。

-SrcList,NoCopy

すべてのCOPY文の展開を抑止します。

-SrcList,xxxxx,NoFalsePath

条件翻訳の無効行を出力しません。

xxxxxには，CopyAll，CopySup，NoCopyのどれかを指定します。

-SrcList,OutputAll,NoFalsePathと指定した場合は，OutputAllサブオプションが有効となり，NoFalsePathサブオプションは無効になります。

-SrcList,xxxxx,DataLoc

コンパイルリスト（原始プログラムリスト）にデータ項目の相対位置と長さ（バイト）を16進数で表示します。相対位置は，データ部のファイル節／作業場所節／局所場所節の各節の先頭からの位置を表示します。

xxxxxには，OutputAll，CopyAll，CopySup，NoCopyのどれかを指定します。

Sレベル／Uレベルのコンパイルエラーが発生した場合は，指定があっても相対位置は表示しません。なお，相対位置の表示については，「付録E.2　リストの見方」の「(4)　相対位置表示時の原始プログラムリスト」を参照してください。

-noSrcList

-SrcListオプションの指定を打ち消します。

(c)　注意事項

NoFalsePathサブオプションまたは，DataLocサブオプションを指定した場合，-noSrcListオプションの指定がないかぎり，NoFalsePathサブオプション，およびDataLocサブオプションの指定は有効となります。

NoFalsePathサブオプション，およびDataLocサブオプションの指定を打ち消すときは，-noSrcListオプションを指定してください。

（例1） NoFalsePathサブオプション，およびDataLocサブオプション指定が打ち消されない場合

ccbl2002 -SrcList,OutputAll,NoFalsePath,DataLoc,-SrcList,CopyAll …

（コンパイル結果）

-SrcList,CopyAll,NoFalsePath,DataLoc

ccbl2002 -SrcList,OutputAll,NoFalsePath -SrcList,CopySup -SrcList,CopyAll,DataLoc

-SrcList,CopySup -SrcList,CopyAll …

（コンパイル結果）

-SrcList,CopyAll,NoFalsePath,DataLoc

（例2）NoFalsePathサブオプション，およびDataLocサブオプション指定が打ち消される場合

ccbl2002 -SrcList,CopySup,NoFalsePath,DataLoc,-noSrcList -SrcList,CopyAll …

（コンパイル結果）

-SrcList,CopyAll

(2)　-ErrSupオプション

(a)　形式

-ErrSup｛,I｜,W｝+
-noErrSup

(b)　機能

コンパイル時にIレベルまたはWレベルメッセージの出力を抑止します。

-ErrSup,I

コンパイル時にIレベル（お知らせ）メッセージの出力を抑止します。

-ErrSup,W

コンパイル時にWレベル（警告）メッセージの出力を抑止します。

-noErrSup

-ErrSupオプションの指定を打ち消します。

(c)　注意事項

-ErrSup,Wオプションを指定した場合，利用者が注意する必要があるエラー（コンパイラによる解釈の変更や，中間結果けた数制限の適用など）の出力が抑止されます。このため，必要な場合以外は，-ErrSup,Wオプションを指定しないようにしてください。

-ErrSupオプションを指定してエラーメッセージの出力を抑止した場合，標準エラーおよびコンパイルリストにも，該当レベルのエラーが出力されません。

抑止されたエラーメッセージは，コンパイルリストに出力されるエラー件数にはカウントされません。

コマンドライン上の記述誤りに対するWレベルメッセージは，抑止されません。

33.5.14　その他の設定

その他のコンパイラオプションについて，説明します。

(1)　-Bin1Byteオプション

(a)　形式

-Bin1Byte
-noBin1Byte

(b)　機能

-Bin1Byte

1バイトの2進項目を有効にします。

-noBin1Byte

-Bin1Byteオプションの指定を打ち消します。

(2)　-JPNオプション

(a)　形式

-JPN,｛Alnum｜V3JPN｜V3JPNSpace｝
-noJPN

(b)　機能

-JPN,Alnum

日本語項目，日本語編集項目，および日本語文字定数をそれぞれ英数字項目，英数字編集項目，および英数字定数として扱います。

これは，VOS3 COBOL85のLANGOPT=(-D)オプションとXCOBOL=(N)オプションを同時に指定したときと同じ動作になります。

なお，-CompatiV3オプションを指定すると，このオプションが仮定されます。

-JPN,V3JPN

日本語項目，日本語編集項目，および日本語文字定数をそれぞれ英数字項目，英数字編集項目，および英数字定数として扱うようにするためのオプションです。ただし，LENGTH関数の引数※，STRING文，UNSTRING文，またはINSPECT文では日本語項目，日本語編集項目，および日本語文字定数はそのままの属性として扱います。

また，日本語項目または日本語編集項目の部分参照は，英数字項目または英数字編集項目として扱いますが，最左端の文字位置と長さは日本語文字数を表します。これは，VOS3 COBOL85のLANGOPT=(-D)オプションとXCOBOL=(-N)オプションを同時に指定したときと同じ動作になります。

注※

VOS3 COBOL85では，LENGTH関数の引数に日本語項目，日本語編集項目，および日本語文字定数は指定できません。

-JPN,V3JPNSpace

-CompatiV3オプションと同時に指定した場合，日本語項目，日本語編集項目および日本語文字定数をそのままの属性で扱います。これは，VOS3 COBOL85のLANGOPT=(D)オプションとXCOBOL=(-N)オプションを同時に指定したときと同じ動作になります。

VOS3 COBOL85でLANGOPT=(D)オプションを指定した場合とCOBOL2002での動作の相違については，マニュアル「COBOL2002　言語　拡張仕様編」　「付録B　LANGOPT=(D)オプションと-JPN,V3JPNSpaceオプションを指定した場合の仕様の相違」を参照してください。

このオプションを指定してコンパイルすると，日本語項目および日本語編集項目に対して，次に示すとおりに扱います。

表意定数SPACE（SPACES）の扱い

日本語項目および日本語編集項目に対する表意定数SPACE（SPACES）は，日本語空白（X'8140'）となります。

日本語項目および日本語編集項目同士の転記の扱い

日本語項目および日本語編集項目同士の転記で，受け取り側のけた数が送り出し側のけた数より長い場合，受け取り側の右側に日本語空白（X'8140'）を補います。

日本語項目および日本語編集項目同士の比較の扱い

日本語項目および日本語編集項目同士の比較で，作用対象のけた数が等しくない場合，短い方の作用対象の右側に，長い方の作用対象のけた数に等しくなるまで日本語空白（X'8140'）があるものとみなして比較します。

-noJPN

-JPNオプションの指定を打ち消します。

(c)　注意事項

-JPN,Alnumオプションと-JPN,V3JPNオプションを重複して同時に指定した場合，-JPN,V3JPNオプションが有効になり，-JPN,Alnumオプションが無効になります。

コンパイラ環境変数CBLV3UNICODEにYESを指定し，かつ-UniObjGenオプションを指定すると，-CompatiV3オプションを指定しても-JPN,Alnumオプションは仮定されません。

-JPN,V3JPNSpaceオプションを指定するとき，-CompatiV3オプションを同時に指定する必要があります。-CompatiV3オプションの指定がない場合，コンパイルエラーとなります。

-JPN,V3JPNSpaceオプションと-JPN,Alnumオプション，-JPN,V3JPNオプションを同時に指定すると，-JPN,Alnumオプション，-JPN,V3JPNオプションは無効となります。

また，-JPN,V3JPNSpaceオプションと-CompatiV3オプションを同時に指定すると，-CompatiV3オプションが仮定する-JPN,Alnumオプションは無効となります。

-JPN,V3JPNSpaceオプションと-UniObjGenオプションを同時に指定すると，-JPN,V3JPNSpaceオプションは無効となります。

-JPN,Alnumオプションを指定するとき，動的長基本項目はすべて字類を英数字として扱います。また，PIC Nが指定された動的長基本項目のLIMIT指定の値は，その2倍の値が指定されたものと仮定します。

(3)　-EquivRuleオプション

(a)　形式

-EquivRule,｛NotExtend｜NotAny｜StdCode｝
-noEquivRule

(b)　機能

拡張コード文字と標準コード文字を等価とみなさないようにするためのオプションです。

標準コードおよび拡張コードについては，マニュアル「COBOL2002　言語　標準仕様編」　「付録H　用語の定義（Terms and Definitions）」を参照してください。

-EquivRule,NotExtend

拡張コード文字と標準コード文字を等価とみなしません。

-EquivRule,NotAny

拡張コード文字と標準コード文字を等価とみなしません。さらに，標準コードの英大文字と標準コードの英小文字も等価とみなしません。

この場合，予約語および文脈依存語はすべて標準コードの英大文字で記述してください。

-EquivRule,StdCode

拡張コード文字と標準コード文字を等価とみなしません。さらに，日本語文字定数中に標準コードの空白を書いてもエラーとしません。ただし，日本語文字定数中に空白以外の標準コード文字を書いた場合は，警告レベルのエラーとなります。なお，日本語文字定数の標準コード文字数は偶数としてください。日本語文字定数の標準コード文字数が奇数の場合，警告レベルのエラーとし，日本語文字定数に標準コードの空白を追加します。

また，72カラムより前に改行文字があるCOBOL原始プログラムは，改行文字から72カラムまでを空白に置き換えてコンパイルします。

-noEquivRule

-EquivRuleオプションの指定を打ち消します。

(4)　-UscoreStartオプション

(a)　形式

-UscoreStart
-noUscoreStart

(b)　機能

-UscoreStart

先頭が下線のCALL定数を指定できるようにします。

先頭が下線のプログラム名をCALL定数で指定した場合，定数の先頭から'_'または'__'（下線2個）を除いた名称でプログラムを呼び出します。

-noUscoreStart

-UscoreStartオプションの指定を打ち消します。

(5)　-BinExtendオプション

(a)　形式

-BinExtend
-noBinExtend

(b)　機能

-BinExtend

用途（USAGE句）が2進（BINARY，COMP，COMP-4）のデータ項目に指定できる初期値（VALUE句の値）を拡張します。

PICTURE句で指定したけた数とVALUE句に指定できる値との対応は次のとおりです。

PICTURE句で指定したけた数

VALUE句に指定できる値

1〜4けた

-2¹⁵〜2¹⁵-1

5〜9けた

-2³¹〜2³¹-1

10〜18けた

-999,999,999,999,999,999〜999,999,999,999,999,999

-noBinExtend

-BinExtendオプションの指定を打ち消します。

(6)　-MinusZeroオプション

(a)　形式

-MinusZero
-noMinusZero

(b)　機能

符号付き内部10進項目または符号付き外部10進項目への転記で切り捨てが発生した結果，負の符号を持つゼロ（以下，-0と表記します）が発生することがあります。この-0は演算や比較で数値として参照する場合は，正の符号を持つゼロ（以下，+0と表記します）と同じに扱われ，プログラムの動作には影響しません。しかし，DISPLAY文で表示したり，上位の集団項目で参照したり，REDEFINES句で別の属性として参照した場合に，実行結果が異なることがあります。-MinusZeroオプションは，符号付き内部10進項目および符号付き外部10進項目に，ほかのデータ項目の値や演算結果を転記する場合に発生した-0を強制的に+0に変換して，-0の発生を防止するオプションです。他システムや他社のCOBOLとのデータの互換性や移行性が向上します。

（例1）

       01 A PIC S9(5) USAGE DISPLAY.
       01 B PIC S9(5) USAGE DISPLAY VALUE 0.
           COMPUTE A = B - 0.1.

右辺の式の結果は-0.1になり，それをAに格納する際に，小数部が切り捨てられて-0となる。※-MinusZeroオプションを指定すると，-0が+0に変換されてAに格納される。

注※

ただし，演算結果が必ず-0になるとは限りません。

（例2）

       01 A PIC S9(4) USAGE DISPLAY.
       01 B PIC S9(5) USAGE DISPLAY VALUE -10000.
           MOVE B TO A.

Aに格納する際に，10,000の最上位けたの1が切り捨てられて-0となる。

-MinusZeroオプションを指定すると，-0が+0に変換されてAに格納される。

-MinusZero

負の符号を持つゼロ（-0）を強制的に正の符号を持つゼロ（+0）に変換します。

-noMinusZero

-MinusZeroオプションの指定を打ち消します。

(c)　注意事項

-MinusZeroオプションは，符号付き外部10進項目への転記および符号付き内部10進項目への転記に対してだけ有効です。したがって，-MinusZeroオプションを指定していても，REDEFINES句や集団項目名で，10進項目を10進項目以外の項目として転記した場合，-0（例えば，内部10進数3けたの場合にはX'000D'）がそのまま転記されます。

(7)　-TruncCheckオプション

(a)　形式

-TruncCheck
-noTruncCheck

(b)　機能

-TruncCheck

転記での送り出し側作用対象のサイズをチェックします。

送り出し側作用対象のけた数が受け取り側作用対象のけた数より大きい場合は，メッセージが出力されます。

-noTruncCheck

-TruncCheckオプションの指定を打ち消します。

(c)　-TruncCheckオプションのチェック対象

-TruncCheckオプションは，次の項目について，転記での送り出し側作用対象のサイズをチェックします。

チェック対象となる項目

外部10進項目

内部10進項目

2進項目（1バイト2進項目を含む）

数字定数（16進数字定数を含む）

固定長集団項目

英数字項目

英数字定数（16進英数字定数を含む）

ALL英数字定数

数字型，整数型，または英数字型の，組み込み関数※および利用者定義関数

注※

送り出し側が英数字型の組み込み関数で，かつ次に示す条件の場合はチェックしません。

引数が部分参照されていて，長さが可変である。

長さが可変になるのは次のどちらかのときです。

・部分参照の長さがデータ名指定である

・部分参照の開始位置がデータ名指定で，長さが省略されている

組み込み関数がMAX関数またはMIN関数で，データ名の引数が複数指定されている。

組み込み関数がTRIM関数またはSUBSTRING関数である。

チェック対象となる転記の個所

VALUE句

画面節（WINDOW SECTION）のSOURCE句

ACCEPT文の書き方2（日付と時刻を取得するACCEPT文）

INITIALIZE文のREPLACING指定

MOVE文

READ文のINTO指定

RELEASE文のFROM指定

RETURN文のINTO指定

SET文の書き方4（条件設定のSET文）

WRITE文のFROM指定

COMPUTE文（送り出し側作用対象が単一の数字項目や数字定数の場合）

上記以外の算術文（中間結果のけた数※1が受け取り側作用対象のけた数より大きい場合※2）

注※1

中間結果のけた数については，「5.2.4　演算の中間結果」を参照してください。

注※2

Windows(x64) COBOL2002の場合，-MaxDigits38オプションおよび-IntResult,DecFloat40オプションを指定しているときは，常に中間結果のけた数の方が大きいと判定します。

受け取り側作用対象が英数字の場合

受け取り側作用対象が固定長集団項目のときはバイト数で比較されます。

送り出し側作用対象が数字で，受け取り側作用対象が英数字のときは，送り出し側作用対象はけた数（小数けたを含む）で比較します。

-H8Switchオプションが指定してあり，送り出し側作用対象が数字で受け取り側作用対象が英数字のときは，数字項目はバイト数で比較されます。

受け取り側作用対象が数字の場合

整数けた数で比較します。

次のすべての条件を満たすときはチェックしません。

・-DigitsTruncオプションの指定がある

・-MaxDigits38オプションおよび-IntResult,DecFloat40オプションを指定していない（Windows(x64) COBOL2002の場合）

・受け取り側作用対象が2進項目である

・VALUE句の転記ではない

送り出し側作用対象が18けた※を超える英数字項目のときはチェックしません。

注※

Windows(x64) COBOL2002の場合，-MaxDigits38オプションおよび-IntResult,DecFloat40オプションを指定しているときは，38けたとなります。

(8)　-LowerAsUpperオプション

(a)　形式

-LowerAsUpper
-noLowerAsUpper

(b)　機能

-LowerAsUpper

CALL定数の英小文字を英大文字に変換した名称でプログラムを呼び出します。

-noLowerAsUpper

-LowerAsUpperオプションの指定を打ち消します。

(9)　-CBLVALUEオプション

(a)　形式

-CBLVALUE
-noCBLVALUE

(b)　機能

-CBLVALUE

環境変数CBLVALUEを有効にするためのオプションです。

環境変数CBLVALUEの詳細については，「33.6.3　コンパイラ環境変数の詳細」の「(21)　CBLVALUE」を参照してください。

-noCBLVALUE

-CBLVALUEオプションの指定を打ち消します。

(10)　-Repositoryオプション

(a)　形式

-Repository,｛Gen｜Sup｝
-noRepository

(b)　機能

-Repository,Gen

ソースファイルからリポジトリファイルを作成するときに指定します。この場合，オブジェクトファイルは作成されません。

なお，翻訳単位（プログラム定義を除く）が未完成でも，シグニチャと呼ばれるインタフェース部分が決まっていれば，リポジトリファイルを作成できます。詳細は，「34.3.2　リポジトリファイルの単独生成」を参照してください。

注意事項

クラス定義，インタフェース定義，および関数定義が一つも格納されていないファイルに-Repository,Genオプションを指定した場合，オプションの指定が無効となります。

-Repository,Genオプションと-Compileオプションが同時に指定された場合，-Repository,Genオプションが有効になり，-Compileオプションが無効になります。

-Repository,Sup

リポジトリファイルを更新しません。

ただし，リポジトリファイルがない場合は，新規に作成します。

また，オブジェクトファイルは，生成されます。

-noRepository

-Repositoryオプションの指定を打ち消します。

(11)　-RepositoryCheckオプション

(a)　形式

-RepositoryCheck
-noRepositoryCheck

(b)　機能

-RepositoryCheck

同じソースファイル中の翻訳単位の定義と外部リポジトリ中の情報に相違があるかどうかをチェックし，相違がある場合には警告メッセージを出力します。-RepositoryCheckオプションを指定した場合，リポジトリファイルは更新されません。

詳細は，「34.2.3　リポジトリファイルの生成方法」を参照してください。

-noRepositoryCheck

-RepositoryCheckオプションの指定を打ち消します。

(12)　-Defineオプション

(a)　形式

-Define 翻訳変数名〔=値〕〔,翻訳変数名〔=値〕〕…
-noDefine

(b)　機能

-Define 翻訳変数名〔=値〕〔,翻訳変数名〔=値〕〕…

翻訳変数名（条件翻訳で，ソース行の取り込みや読み飛ばしを制御する変数の名称）を定義します。

詳細は，「33.3.3　条件翻訳の利用」を参照してください。

-noDefine

-Defineオプションの指定を打ち消します。

(c)　注意事項

翻訳変数名は，31文字まで指定できます。32文字以上の文字列を指定した場合，コンパイル時に警告メッセージが出力され，先頭の31文字だけが翻訳変数名として有効となります。

翻訳変数名は，-Defineオプションに指定した文字列がそのまま使われます。この文字列には，COBOLの語の等価変換が適用されません。

-Defineオプションで定義した英小文字の翻訳変数名をCOBOLプログラム中で参照するには，-EquivRule,NotAnyオプションの指定が必要です。

翻訳変数の値は，160バイトまで指定できます。161バイト以上の文字列を指定した場合，コンパイル時に警告メッセージが出力され，先頭の160バイトだけが翻訳変数の値として有効となります。

翻訳変数名で使用できる文字は，COBOLの語で使用できる文字と同じです。ただし，コンパイラオプションの区切り文字となるイコール（=），コンマ（,）および半角空白文字は，指定できません。

翻訳変数の値を指定する場合の注意事項を，次に示します。

翻訳変数に指定した値は，すべて英数字定数として扱われます。

（例1）

　コンパイラオプションに，-Define VER=3 を指定したとき，ソース中に

　>>IF VER = '3'

　という記述があれば，上記条件が真となる。

（例2）

　コンパイラオプションに，-Define VER=5 を指定したとき，ソース中に

　>>IF VER = '3'

　という記述があれば，上記条件が偽となる。

コンパイラオプションの区切り文字となるイコール（=），コンマ（,）は，指定できません。

文字列内に区切り文字（空白）を指定するときは，値全体をダブルコーテーション（"）で囲む必要があります。このとき，ダブルコーテーションは値として扱われません。

（例）

　-Define DEF01="aaa bbb"

　翻訳変数名：DEF01

　値　　　　：aaa bbb

(13)　-Detailsオプション

(a)　形式

-Details
-noDetails

(b)　機能

-Details

コンパイラオプションの詳細情報を出力します。

また，環境変数CBLLINKER，環境変数CBLMANIFESTTOOL，および環境変数CBLRESOURCECOMPILERを指定した場合，環境変数に指定されたコマンドが起動するときに，コマンドのパス情報を出力します。

出力形式は，次のようになります。

形式

COBOL2002コマンドの絶対パス名: ccbl2002オプション群　COBOLソースファイル名群

ccbl2002オプション群

ccbl2002コマンドが認識するオプションがすべて出力されます。ほかのオプションを指定したために仮定されたオプションも出力されます。反対に，ほかのオプションを指定したために無視されたオプションは出力されません。オプションの引数を指定した場合は，オプションの引数も出力されます。

COBOLソースファイル名群

コンパイル対象のCOBOLソースファイル名がすべて出力されます。

（例）

入力

ccbl2002 -TDInf -SrcList,CopyAll -SimSub PROG1 -Details sample1.cbl

出力

COBOL2002インストールフォルダ¥bin¥ccbl2002: ccbl2002 -DebugInf -TDInf -SrcList,CopyAll -Details -Optimize,1 -Lib,GUI -SimSub PROG1 -Main,System sample1.cbl

-noDetails

-Detailsオプションの指定を打ち消します。

(14)　-OldFormオプション

(a)　形式

-OldForm "旧オプションの並び"

(b)　機能

-OldForm "旧オプションの並び"

旧形式のオプション（COBOL85用のコンパイラオプション）を指定できるようにします。

(c)　注意事項

-OldFormオプションに指定する旧オプションの並びに，旧オプションの引数ではない単独ファイル名を指定した場合，そのファイル名は無視されます。ただし，旧オプションの引数として指定したファイル名については，有効となります。

指定例を，次に示します。

-OldForm "-Mw sample.cbl subsample.cbl"

sample.cblは，-Mwオプションの引数として有効となりますが，subsample.cblは旧オプションの引数でない単独のファイル名のため，無視されます。

-OldFormオプションに指定する旧オプションの並びの中に，さらにダブルコーテーション（"）がある場合，ダブルコーテーションを「¥"」に置き換えて指定してください。指定例を次に示します。

-OldForm "-Fw ¥"c:¥temp¥sample.cbw¥" -Mw sample.cbl"

このオプションを開発マネージャで指定する場合，プロジェクト設定ダイアログボックスの［ユーザ設定］タブを使用してください。［ユーザ設定］タブの詳細は，マニュアル「COBOL2002　操作ガイド」のオプションの設定方法の説明を参照してください。ただし，プロジェクト構成のコンパイル方法に影響する次のオプションを指定できません。指定した場合，動作は保証しません。

-Mw　-Mh　-Cs　-Dl　-Vb　-Ad　-Ax　-Dc

(15)　-Helpオプション

(a)　形式

-Help｜-?

(b)　機能

ccbl2002コマンドのヘルプを表示します。

(c)　注意事項

-Helpオプションを指定した場合，ほかのオプションやファイル名を指定しても無視されます。

このオプションは，コマンドライン（ccbl2002コマンド）で指定できます。開発マネージャでは，指定できません。

(16)　-UniObjGenオプション

(a)　形式

-UniObjGen
-noUniObjGen

(b)　機能

-UniObjGen

シフトJISで記述されたCOBOLソースから英数字定数をUTF-8に，日本語文字定数をUTF-16LEまたはUTF-16BEに変換したオブジェクトファイルを生成します。

-noUniObjGen

-UniObjGenオプションの指定を打ち消します。

(c)　注意事項

日本語文字定数の文字コードのバイトオーダは，-UniEndianオプションの指定に従います。

このオプションを指定する場合，次のオプションは同時に指定できません。同時に指定した場合，このオプションが有効となり，次のオプションは無効になります。

-JPN　-CompatiV3　-V3Rec　-V3RecFCSpace　-V3RecEased

ただし，コンパイラ環境変数CBLV3UNICODEにYESを指定すると，このオプションを指定しても-CompatiV3，-V3Rec，-V3RecFCSpace，および-V3RecEasedオプションは有効となります。

(17)　-UniEndianオプション

(a)　形式

-UniEndian,｛Little｜Big｝
-noUniEndian

(b)　機能

-UniEndian,Little

日本語文字定数をUTF-16LEに変換したオブジェクトファイルを生成します。

-UniEndian,Big

日本語文字定数をUTF-16BEに変換したオブジェクトファイルを生成します。

-noUniEndian

-UniEndianオプションの指定を打ち消します。

(c)　注意事項

このオプションは，-UniObjGenオプションが指定された場合だけ有効となります。

-UniObjGenオプションが指定されていて，-UniEndianオプションが指定されていない場合，日本語文字定数はUTF-16LEのコードに変換されます。

(18)　-MaxDigits38オプション（Windows(x64) COBOL2002で有効）

(a)　形式

-MaxDigits38
-noMaxDigits38

(b)　機能

-MaxDigits38

数字項目，数字編集項目，および数字定数に指定できる数字の最大けた数を18けたから38けたに拡張します。外部10進形式および内部10進形式の数字項目と数字編集項目と固定小数点数字定数で，けた数を拡張できます。詳細については，「29.　数字項目のけた拡張機能（Windows(x64) COBOL2002で有効）」およびマニュアル「COBOL2002　言語　拡張仕様編」　「21.　数字項目のけた拡張機能」を参照してください。

-noMaxDigits38

-MaxDigits38オプションの指定を打ち消します。

(c)　注意事項

-IntResult,DecFloat40オプションと同時に指定してください。-IntResult,DecFloat40オプションの指定がない場合，エラーメッセージが出力されます。

-MaxDigits38オプション，-IntResult,DecFloat40オプション，および-Optimize,3オプションを同時に指定した場合，-Optimize,3オプションは無効となり，-Optimize,2オプションが仮定されます。

-MaxDigits38オプションを指定しても，19〜38けたの数字項目および数字定数が指定できない機能や文があります。詳細については，「29.　数字項目のけた拡張機能（Windows(x64) COBOL2002で有効）」およびマニュアル「COBOL2002　言語　拡張仕様編」　「21.　数字項目のけた拡張機能」を参照してください。

(19)　-IntResult,DecFloat40オプション（Windows(x64) COBOL2002で有効）

(a)　形式

-IntResult,DecFloat40
-noIntResult

(b)　機能

-IntResult,DecFloat40

算術演算の中間結果の表現形式を40けた10進浮動小数点形式にします。詳細については，「29.3　数字項目のけた拡張機能での演算の中間結果」を参照してください。

-noIntResult

-IntResultオプションの指定を打ち消します。

(c)　注意事項

-MaxDigits38オプションと同時に指定してください。-MaxDigits38オプションの指定がない場合，エラーメッセージが出力されます。

-IntResult,DecFloat40オプション，-MaxDigits38オプション，および-Optimize,3オプションを同時に指定した場合，-Optimize,3オプションは無効となり，-Optimize,2オプションが仮定されます。

-IntResult,DecFloat40オプション，-MaxDigits38オプション，および-Compati85,Powerオプション（-Compati85,All指定による仮定時を含む）を同時に指定した場合，-Compati85,Powerオプションは無効となります。

-IntResult,DecFloat40オプションと-CompatiV3オプションを同時に指定すると，-CompatiV3オプションの仕様が一部無効となります。詳細については，「33.5.12　他システムとの移行の設定」の「(2)　-CompatiV3オプション」を参照してください。

(20)　-LiteralExtendオプション

(a)　形式

-LiteralExtend,Alnum
-noLiteralExtend

(b)　機能

-LiteralExtend,Alnum

英数字定数の最大長を拡張します。拡張する項目と制限値および限界値を次に示します。

表33‒4　最大長を拡張する項目と制限値および限界値

最大長を拡張する項目

制限値および限界値

-LiteralExtend,Alnumなし

-noLiteralExtendあり

-LiteralExtend,Alnumあり

英数字定数の長さ

1〜160文字（バイト）

1〜8,191文字（バイト）

STOP文の定数に指定した英数字定数の長さ

1〜160文字（バイト）

1〜8,191文字（バイト）

定数指定する場合のプログラム名，メソッド名の長さ

1〜160文字（バイト）

1〜1,024文字（バイト）

ただし，次に示す項目では英数字定数の最大長は拡張されません。

表33‒5　最大長を拡張しない項目

最大長を拡張しない項目

制限値および限界値（-LiteralExtendの有無に関係なく同じ）

連結式で連結した英数字定数の長さ

2〜1,024文字（バイト）

指定できる文字位置のけた数が個別に規定されている構文

各構文の規定に従う

COPY文，REPLACE文の構文中に指定する原文語の長さ

1〜322文字（バイト）

翻訳指令行で使用する英数字定数の長さ

1〜160文字（バイト）

SQL文中で使用する英数字定数の長さ

1〜160文字（バイト）

-noLiteralExtend

-LiteralExtendオプションの指定を打ち消します。

(c)　注意事項

-LiteralExtendオプションは，次のオプションと背反関係にあり，同時に指定した場合は，-LiteralExtendオプションが無効となり，次のオプションが有効となります。

-StdMIA　-Std85　-Std2002　-V3Spec　-Compati85,Syntax　-CompatiV3

-SimMain　-SimSub　-SimIdent

COBOLプログラム中にCOPY文またはREPLACE文がある場合，322バイトを超える英数字定数に対して，原文語の長さが322文字を超えている旨の警告エラーを出力することがありますが，プログラムの動作には影響しません。

(21)　-SpaceAsZeroオプション

(a)　形式

-SpaceAsZero
-noSpaceAsZero

(b)　機能

-SpaceAsZero

外部10進項目に空白文字（X'20'）データがあるとき，ゼロ（X'30'）とみなして比較，演算，転記を実行します。このオプションを指定すると，約1.5倍の実行性能劣化となります。このため，必要のないかぎり，このオプションは指定しないでください。

-noSpaceAsZero

-SpaceAsZeroオプションの指定を打ち消します。

(c)　注意事項

-SpaceAsZeroオプションは，-Compati85,Allオプションと同時に指定してください。-Compati85,Allオプションの指定がない場合，エラーメッセージが出力されます。なお，-Compati85,Allオプションと同じ意味となる-Compati85のサブオプションが指定された場合，-SpaceAsZeroオプションの指定が有効になります。

-SpaceAsZeroオプションと-Optimize,3オプションを同時に指定した場合，-Optimize,3オプションは無効となり，-Optimize,2オプションが仮定されます。

-DebugDataオプションが指定されている場合，比較，演算，転記の外部10進項目に含まれる空白文字（X'20'）は，-SpaceAsZeroオプションを指定しても，不当なデータ（データ例外）として検出されます。

外部10進項目に空白文字（X'20'）データがあるとき，比較，演算，転記以外の実行結果（画面節（SCREEN SECTIONおよびWINDOW SECTION），索引ファイルのキー項目，整列・併合処理のキー指定，DISPLAY文，組み込み関数，埋め込みSQL文などの実行結果）は，-SpaceAsZeroオプションを指定しても保証しません。

(22)　-CheckUninitDataオプション

(a)　形式

-CheckUninitData
-noCheckUninitData

(b)　機能

-CheckUninitData

ソースに閉じた初期化漏れチェック機能を有効にします。ソースに閉じた初期化漏れチェック機能については，「33.7.3　初期化漏れチェック機能」を参照してください。

-noCheckUninitData

-CheckUninitDataオプションの指定を打ち消します。

(c)　注意事項

このオプションは，-Compile,CheckOnlyオプションと同時に指定する必要があります。-Compile,CheckOnlyオプションを指定していない場合，または-Compile,CheckOnlyオプションと，-Compile,NoLinkオプションもしくは-Repository,Genオプションを同時に指定した場合，-CheckUninitDataオプションは無効となります。

(23)　-FunctionECSup,CodeConvErrオプション

(a)　形式

-FunctionECSup,CodeConvErr
-noFunctionECSup

(b)　機能

-FunctionECSup,CodeConvErr

組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数で，変換前の文字に対応する変換後の文字を持たない文字が引数中にある場合，文字変換を行わないで，EC-ARGUMENT-FUNCTION／EC-ARGUMENT-IMP例外が成立しないようにします。

組み込み関数のDISPLAY-OF関数またはNATIONAL-OF関数のエラー情報の取得には，CBLCNVERRORINFOサービスルーチンを使用します。CBLCNVERRORINFOサービスルーチンの詳細は，「30.7.3　CBLCNVERRORINFO」を参照してください。

なお，このオプションの指定がない場合は，EC-ARGUMENT-FUNCTION／EC-ARGUMENT-IMP例外が成立します。

-noFunctionECSup

-FunctionECSupオプションの指定を打ち消します。

33.6　コンパイラ環境変数

ここでは，ccbl2002コマンドでコンパイルするときに使用する環境変数について，設定方法と環境変数の種類を説明します。

33.6.1　コンパイラ環境変数の設定方法

(1)　システムに従った環境変数の設定方法

ccbl2002コマンドでのコンパイラ環境は環境変数で設定できます。環境変数はコンソール，またはWindowsシステムの環境変数で，次の形式で設定します。

形式

環境変数=環境変数の値

注意事項

空白を含むフォルダ名やファイル名を環境変数の値に指定するときは，ダブルコーテーション（ " ）で囲まないでください。

(2)　コンパイラ環境変数の規則

環境変数にYESを設定するとき，大文字と小文字は等価とみなします。

33.6.2　コンパイラ環境変数の一覧

コンパイラ環境変数の一覧を，次に示します。

表33‒6　コンパイラ環境変数の一覧

項番

環境変数

マネージャ

設定内容

1

CBL_RDBSYS

○

HiRDBによる索引編成ファイルで操作対象となるデータベースシステムの種別

2

CBL_UNINITDATA_BREAKOFF

×

初期化漏れチェック機能使用時，初期化漏れチェック処理を打ち切るかどうか

3

CBLCOPT

×

ccblコマンドに指定する旧形式のオプション列

4

CBLCOPT2002

○

ccbl2002コマンドに指定する新形式のオプション列

5

CBLERRMAX

○

コンパイルを打ち切るSレベルのエラーの数

6

CBLFIX

○

固定形式正書法のCOBOLソースファイルの拡張子

7

CBLFIXEDFORMLINE

×

固定形式正書法の1行の長さの制限値

8

CBLFREE

○

自由形式正書法のCOBOLソースファイルの拡張子

9

CBLINITVALUE

○

初期化属性プログラムが呼ばれたときのVALUE句の指定がないデータ項目の初期値（X'00'）

10

CBLLIB

○

登録集原文の検索フォルダ

11

CBLLINKER

○

コンパイラが使用するリンカの絶対パス名

12

CBLLINKINTERVAL

○

ccbl2002コマンド，ccblコマンドで実行可能ファイル，またはDLLを作成する際に，対象ファイルへのアクセス処理の前に空ける間隔をミリ秒単位で指定する

13

CBLMANIFESTTOOL

○

コンパイラが使用するマニフェストツールの絶対パス名

14

CBLPIDIR

○

プログラム情報ファイル（.cbp）の生成先フォルダ

15

CBLREP

○

リポジトリファイルの出力先のフォルダ，およびリポジトリ段落で指定した翻訳単位名を含むリポジトリファイルを検索するフォルダ

16

CBLRESOURCECOMPILER

○

コンパイラが使用するリソースコンパイラの絶対パス名

17

CBLSYSREP

○

リポジトリファイルの参照時に検索するフォルダ

18

CBLTAB

○

COBOLソース中のタブ位置を設定する

19

CBLUNINITDATA_OUTRESULTLIST

×

初期化漏れチェック機能使用時，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧を出力するかどうか

20

CBLUNINITDATA_OUTRESULTLISTDIR

×

初期化漏れチェック機能使用時，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧の出力先フォルダ

21

CBLVALUE

○

VALUE句の指定のないデータ項目の初期値

22

CBLV3UNICODE

○

-UniObjGenオプション指定時に，-CompatiV3オプションおよび-V3Recオプションの指定を有効とするかどうか

23

登録集環境変数

○

登録集原文の検索フォルダ

（凡例）

○：開発マネージャから指定できる

×：開発マネージャから指定できない

33.6.3　コンパイラ環境変数の詳細

(1)　CBL_RDBSYS

HiRDBによる索引編成ファイルの操作対象になるデータベースシステムを設定します。指定できる値は，HiRDBだけです。この環境変数の指定がない場合，および指定した値に誤りがある場合は，HiRDBが仮定されます。

（例）

CBL_RDBSYS=HiRDB

(2)　CBL_UNINITDATA_BREAKOFF

初期化漏れチェック処理を打ち切るかどうかを指定します。

この環境変数の値にNOを指定すると，初期化漏れチェック処理は打ち切られません。プログラムを実行したときに通る可能性のある経路（制御ブロック）をすべて走査するまで，初期化漏れチェック処理を続行します。

次の場合は，この環境変数の指定は無効となり，初期化漏れチェック処理で走査した制御ブロックの数が内部的な上限を超えると，初期化漏れチェック処理は打ち切られます。

この環境変数の指定がない，または環境変数の値にNO以外を指定している

-CheckUninitDataオプションを指定していない

（例）

CBL_UNINITDATA_BREAKOFF=NO

(3)　CBLCOPT

ccblコマンドに指定するオプション列（コンパイラオプションの並び）を設定します。この環境変数に設定しておけば，ccblのコマンドラインにオプションを指定する必要がなくなります。ただし，この環境変数はCOBOL85からの移行を目的とする場合にだけ使用してください。

環境変数CBLCOPTにファイル名を指定した場合は，ファイル名が無視されます。

各オプションは空白で区切って指定します。

（例）

CBLCOPT=-S1 -T4 -Ek

旧形式のオプションを開発マネージャで指定する場合，プロジェクト設定ダイアログボックスの［ユーザ設定］タブのコンパイラオプション欄で，-OldFormオプションを使用してください。［ユーザ設定］タブの詳細は，マニュアル「COBOL2002　操作ガイド」のオプションの設定方法の説明を参照してください。

(4)　CBLCOPT2002

ccbl2002コマンドに指定するオプション列（コンパイラオプションの並び）を設定します。この環境変数に設定しておけば，ccbl2002のコマンドラインにオプションを指定する必要がなくなります。

環境変数CBLCOPT2002にファイル名を指定した場合は，ファイル名が無視されます。

また，開発マネージャを使用する場合は，プロジェクト構成のコンパイル方法に影響する次のオプションを指定できません。指定した場合，動作は保証しません。

-Main　-MainNotCBL　-Dll

各オプションは空白で区切って指定します。

（例）

CBLCOPT2002=-StdVersion,1 -DebugData -Switch,EBCDIK

(5)　CBLERRMAX

コンパイルを打ち切るSレベルのエラーの数を設定します。設定した個数分のエラーが発生すると，メッセージが出力され，コンパイルが打ち切られます。

設定できる範囲は0〜999,999で，省略時は30が仮定されます。コンパイルを続行し，すべてのエラーメッセージを出力したい場合は0を設定します。

なお，コンパイルリストを出力する場合（-SrcListオプションを指定した場合），この環境変数は無効となります。

（例）

CBLERRMAX=15

(6)　CBLFIX

固定形式正書法で書かれたCOBOL原始プログラムとしてコンパイルするCOBOLソースファイルの拡張子を設定します。ただし，拡張子.cbl，.cob，.ocbの付いたファイルは，ここで設定しなくても固定形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。

拡張子は，先頭のピリオド（.）と3文字以内の英数字で指定します。複数の拡張子を設定する場合は，それぞれの拡張子を半角空白文字で区切って指定します。

（例）

CBLFIX=.fix

注意事項

コンパイル後のファイル種別の変換

環境変数CBLFIXおよびCBLFREEに，コンパイラで使用するファイル（COBOLソースファイルを除く）の拡張子は指定しないでください。COBOLソースファイルが別のファイル種別に変換されることがあります。

(7)　CBLFIXEDFORMLINE

固定形式正書法の1行の長さの制限値（バイト単位）を80または255で指定します。次の場合は，80を仮定します。

この環境変数の指定がない場合

この環境変数に80または255以外を指定している場合

次のコンパイラオプションのどれかが有効である場合

-V3Spec，-V3Rec,Fixed，-TDInf，-CVInf

（例）

CBLFIXEDFORMLINE=255

注意事項

この環境変数に255を指定した場合でも，固定形式正書法のプログラム原文領域は，72カラムまでです。

この環境変数の指定値（制限値）を超える部分は無視されます。コンパイルリストの原始プログラムリストに，制限値を超える部分は表示されません。

(8)　CBLFREE

自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルするCOBOLソースファイルの拡張子を設定します。ただし，拡張子.cbf，.ocfの付いたファイルは，ここで設定しなくても自由形式正書法で書かれたCOBOL原始プログラムとしてコンパイルされます。

拡張子は，先頭のピリオド（.）と3文字以内の英数字で指定します。複数の拡張子を設定する場合は，それぞれの拡張子を半角空白文字で区切って指定します。

（例）

CBLFREE=.aaa .bbb .ccc

注意事項

環境変数CBLFIXおよび環境変数CBLFREEに，コンパイラで使用するファイル（COBOLソースファイルを除く）の拡張子は指定しないでください。COBOLソースファイルが別のファイル種別に変換されることがあります。

自由形式正書法で書かれたCOBOLソースに対するコンパイラオプションの制限

自由形式正書法で書かれたCOBOLソースをコンパイルするとき，次のコンパイラオプションは指定できません。

-StdVersion，-V3Rec，-CompatiV3，-StdMIA，-Std85

(9)　CBLINITVALUE

初期化属性プログラムの作業場所節にある，VALUE句の指定がないデータ項目の初期値をNULL（X'00'）に設定するときに，環境変数CBLINITVALUEにNULLを設定します。初期化属性プログラムが呼ばれるたびに，初期値が設定されます。

環境変数CBLINITVALUEにNULL以外の値を設定した場合は，環境変数CBLINITVALUEは無視されます。

（例）

CBLINITVALUE=NULL

環境変数CBLINITVALUEは，次のデータ項目には適用されません。

VALUE句の指定があるデータ項目

ADDRESSED句の指定があるデータ項目

EXTERNAL句の指定があるデータ項目

注意事項

初期化属性プログラムの作業場所節に対する初期化は，環境変数CBLVALUEと環境変数CBLINITVALUEが両方とも有効な場合と，どちらか片方だけが有効な場合とで初期値が異なります。詳細については，「18.4.1　プログラム属性」の「(2)　初期化属性プログラム」を参照してください。また，環境変数CBLVALUEについては，「(21)　CBLVALUE」を参照してください。

(10)　CBLLIB

登録集原文を検索するフォルダを設定します。フォルダを複数指定する場合は，セミコロン（;）で区切って指定します。

（例）

CBLLIB=¥usr¥user¥copylib;c:¥source¥copy

なお，登録集環境変数が設定してある場合，登録集環境変数で設定したフォルダの方が環境変数CBLLIBで指定したフォルダよりも優先します。フォルダによる検索順序を次に示します。

登録集環境変数で設定したフォルダ

環境変数CBLLIBで設定したフォルダ

カレントフォルダ

開発マネージャを使用した場合の登録集原文の検索順序

開発マネージャからビルドを実行する場合，上記の2.，3.については，開発マネージャによって次の検索順序が仮定されます。

プロジェクト設定ダイアログボックスで，ファイルに対して設定した環境変数CBLLIBに指定されているフォルダ

プロジェクト設定ダイアログボックスで，プロジェクトに対して設定した環境変数CBLLIBに指定されているフォルダ

プロジェクトの作業フォルダ

プロジェクトに登録されている登録集原文が格納されているすべてのフォルダ

プロジェクトに登録されているCOBOLソースファイルが格納されているすべてのフォルダ

システムに設定されている環境変数CBLLIBに指定されているフォルダ

開発マネージャは上記1.〜6.のフォルダを仮定するため，1.の登録集環境変数で明示的に検索フォルダを設定してください。

(11)　CBLLINKER

コンパイラが呼び出すリンカを変更したい場合にLINKコマンド（LINK.exe）の絶対パス名を指定します。

詳細は，「35.4　リンカパスの切り替え機能」を参照してください。

（例）

CBLLINKER=C:¥Program Files¥…¥BIN¥LINK.exe

注意事項

LINKコマンドを相対パスで指定しないでください。指定した場合の動作は保証しません。

この製品が同梱するLINKコマンドより古いバージョンのLINKコマンドを指定しないでください。古いバージョンのLINK.コマンドファイルのプロパティからファイルバージョンを参照してください。古いLINKコマンドを指定した場合の動作は保証しません。

この環境変数を指定する場合，環境変数PATHとLIBには，環境変数に指定したLINKコマンドが必要とするパスをこの製品のパスより優先して指定してください。指定しなかった場合の動作は保証しません。

この環境変数を指定する場合，環境変数CBLRESOURCECOMPILERおよび環境変数CBLMANIFESTTOOLを同時に指定してください。同時に指定しなかった場合の動作は保証しません。

この環境変数に指定する値の長さは256バイト以内でなければなりません。256バイトを超える値を指定した場合，エラーメッセージを出力してコンパイルを中止します。このとき，生成対象のファイル（実行可能ファイルまたはDLLファイル）が残っている場合は削除します。

COBOL2002コンパイラはLINKコマンド（LINK.exe）の起動に失敗した場合，エラーメッセージを出力し，コンパイルを中止します。このとき，生成対象のファイル（実行可能ファイルまたはDLLファイル）が残っている場合は削除します。

(12)　CBLLINKINTERVAL

ccbl2002コマンドまたはccblコマンドで，実行可能ファイルまたはDLLを作成する際に，対象ファイルへのアクセス処理の前に空ける間隔をミリ秒単位で指定します。指定できる範囲は，1〜60,000であり，省略時および範囲外の値の場合は，この環境変数の指定を無効とします。

なお，環境変数CBLLINKINTERVALの指定が有効な場合は，対象ファイルが占有可能な状態か合わせてチェックします。

（例）対象ファイルへのアクセス間隔を200ミリ秒とする場合

CBLLINKINTERVAL=200

ccbl2002コマンドまたはccblコマンドから呼び出すLINKコマンドやMTコマンドは，出力ファイルがOSやウィルスチェッカなどから，一時的に共有されることが原因でエラーになることがあります。

この場合，時間をおいて再コンパイルしてください。時間をおいても問題が解決しないときは，環境変数CBLLINKINTERVALで対象ファイルへのアクセス間隔を変更した状態で再コンパイルすることで対処してください。

注意事項

環境変数CBLLINKINTERVALで指定する値は，開発環境で使用されるディスク装置，マシン環境，およびシステムの仕様に依存するため，実際の試行（検証）によって最適な値を使用してください。

環境変数CBLLINKINTERVALの指定は，実行可能ファイルまたはDLLを作成する際のファイルアクセスごとに有効となります。また，ファイルアクセスごとに，ファイルの占有ができるかを最大で5回チェックします。このため，環境変数CBLLINKINTERVALを指定すると，指定した値以上にコンパイル時間が遅くなります。

環境変数CBLLINKINTERVALが有効な場合，開発マネージャでのビルド，クイックビルド，リビルドの際にもそれぞれの処理時間が遅くなります。また，それぞれの処理でのリンクの実行中は，リンクが完了するまでビルドの中止がすぐにできないため，環境変数CBLLINKINTERVALを指定する場合は注意が必要です。

(13)　CBLMANIFESTTOOL

コンパイラが呼び出すマニフェストツールを変更したい場合にMTコマンド（MT.exe）の絶対パス名を指定します。

詳細は，「35.4　リンカパスの切り替え機能」を参照してください。

（例）

CBLMANIFESTTOOL=C:¥Program Files¥…¥bin¥MT.exe

注意事項

MTコマンドを相対パスで指定しないでください。指定した場合の動作は保証しません。

この環境変数を使用する場合，環境変数PATHには環境変数に指定したMTコマンドが必要とするパスをWindows SDKのbinへのパスより優先して指定してください。指定しなかった場合の動作は保証しません。

この環境変数を使用する場合，環境変数CBLLINKERおよび環境変数CBLRESOURCECOMPILERを同時に指定してください。同時に指定しなかった場合の動作は保証しません。

この環境変数に指定する値の長さは256バイト以内でなければなりません。256バイトを超える値を指定した場合，エラーメッセージを出力してコンパイルを中止します。このとき，生成対象のファイル（実行可能ファイルまたはDLLファイル）が残っている場合は削除します。

COBOL2002コンパイラはMTコマンドの起動に失敗した場合，エラーメッセージを出力し，コンパイルを中止します。このとき，生成対象のファイル（実行可能ファイルまたはDLLファイル）が残っている場合は削除します。

(14)　CBLPIDIR

プログラム情報ファイル（.cbp）を任意のフォルダに生成したい場合に設定します。プログラム情報ファイルは，テストデバッガを使用するときに必要となるファイルです。設定できるフォルダは一つだけです。

（例）

CBLPIDIR=c:¥temp

(15)　CBLREP

リポジトリファイル（.rep）を任意のフォルダに生成，または更新したい場合に，出力先のフォルダを指定します。指定されたフォルダは，リポジトリ段落で指定された名前の翻訳単位（関数定義，クラス定義，またはインタフェース定義）を含むリポジトリファイル参照時の検索対象となります。

詳細は，「34.　定義別のコンパイル方法とリポジトリファイル」を参照してください。

規則

指定するフォルダが複数ある場合は，各フォルダをセミコロン（;）で区切って指定します。

指定したフォルダ群に同じ名称のリポジトリファイルが複数ある場合，先に指定したフォルダに含まれるリポジトリファイルを優先します。

生成または更新時に，同じ名称のリポジトリファイルがない場合，最初に指定されたフォルダにリポジトリファイルを新規に生成します。

リポジトリファイル検索時に同じ名称のリポジトリファイルが見つからなければ，カレントフォルダが検索されます。また，環境変数CBLREPの指定がない場合，リポジトリファイルの生成，更新，および検索は，カレントフォルダが対象となります。

（例）

フォルダとして¥usr¥user¥replibを指定します。

CBLREP=¥usr¥user¥replib

(16)　CBLRESOURCECOMPILER

コンパイラが呼び出すリソースコンパイラを変更したい場合にRCコマンド（RC.exe）の絶対パス名を指定します。

詳細は，「35.4　リンカパスの切り替え機能」を参照してください。

（例）

CBLRESOURCECOMPILER=C:¥Program Files¥…¥bin¥RC.exe

注意事項

RCコマンドを相対パスで指定しないでください。指定した場合の動作は保証しません。

この環境変数を指定する場合，環境変数PATHには環境変数に指定したRCコマンドが必要とするパスをWindows SDKのbinへのパスより優先して指定してください。指定しなかった場合の動作は保証しません。

この環境変数を指定する場合，環境変数CBLLINKERおよび環境変数CBLMANIFESTTOOLを同時に指定してください。同時に指定しなかった場合の動作は保証しません。

環境変数に指定する値の長さは256バイト以内でなければなりません。256バイトを超える値を指定した場合，エラーメッセージを出力してコンパイルを中止します。このとき，生成対象のファイル（リソースファイル）が残っている場合は削除します。

COBOL2002コンパイラはRCコマンドの起動に失敗した場合，エラーメッセージを出力し，コンパイルを中止します。このとき，生成対象のファイル（リソースファイル）が残っている場合は削除します。

(17)　CBLSYSREP

リポジトリ段落で指定された名前の翻訳単位（関数定義，クラス定義，またはインタフェース定義）を含むリポジトリファイルを検索するフォルダを指定します。

環境変数CBLSYSREPに指定したフォルダに格納されたリポジトリファイルは，リポジトリファイルに情報が格納されている翻訳単位と同じ名称の翻訳単位を作成してコンパイルした場合でも，上書きされることはありません。このため，環境変数CBLSYSREPには，主に（DLLとリポジトリファイルだけが提供されている場合など）生成元ソースファイルのないリポジトリファイルの検索フォルダを指定する場合に使用します。

詳細は，「34.　定義別のコンパイル方法とリポジトリファイル」を参照してください。

規則

指定するフォルダが複数ある場合は，各フォルダをセミコロン（;）で区切って指定します。

リポジトリファイルの検索順序は，カレントフォルダが優先されます。

（例）

フォルダとしてc:¥usr¥user¥sysreplibとd:¥users¥lib¥repを指定します。

CBLSYSREP=c:¥usr¥user¥sysreplib:d:¥users¥lib¥rep

(18)　CBLTAB

COBOLソース中のタブ位置を設定します。指定できる範囲は1〜72で，省略時は8を仮定します。

（例）

CBLTAB=4

(19)　CBLUNINITDATA_OUTRESULTLIST

初期化漏れチェック機能使用時，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧を出力するかどうかを指定します。

この環境変数にONを指定すると，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧が出力されます。初期化漏れ確認結果一覧および初期化漏れ従属項目一覧の詳細は，「33.7.3　初期化漏れチェック機能」を参照してください。

次の場合は，この環境変数の指定は無効となり，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧が出力されません。

この環境変数の指定がない，または環境変数の値にON以外を指定している

-CheckUninitDataオプションを指定していない

（例）

CBLUNINITDATA_OUTRESULTLIST=ON

(20)　CBLUNINITDATA_OUTRESULTLISTDIR

初期化漏れチェック機能使用時，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧を任意のフォルダに出力したい場合に，その出力先フォルダを255バイト以内の絶対パス名で指定します。この環境変数の指定がない場合，初期化漏れ確認結果一覧および初期化漏れ従属項目一覧の出力先フォルダには，カレントフォルダが仮定されます。

注意事項

出力先フォルダは絶対パスで指定してください。絶対パスで指定していない場合の動作は保証しません。

この環境変数に指定する値の長さは255バイト以内でなければなりません。255バイトを超える値を指定した場合，255バイトまでの値を有効とします。

次の場合は，この環境変数の指定は無効となります。

・環境変数CBLUNINITDATA_OUTRESULTLISTにONを指定していない

・-CheckUninitDataオプションを指定していない

（例）

CBLUNINITDATA_OUTRESULTLISTDIR=C:¥Work

(21)　CBLVALUE

サブスキーマ節，作業場所節，画面節（WINDOW SECTION／SCREEN SECTION），報告書節，ファイル節で定義しているデータ項目のVALUE句の指定のない初期値を，このシステムで採用している計算機文字集合であるJIS8単位コードの順序位置（1〜256）で指定します。JIS8単位コードについては，マニュアル「COBOL2002　言語　標準仕様編」　「付録B　計算機文字集合」を参照してください。

実行単位でプログラムが最初に呼び出された場合だけ，この環境変数に指定した初期値をデータ項目に設定します。

この環境変数は，-CBLVALUEオプションを指定した場合だけ有効です。また，-CBLVALUEオプションを指定している場合で，この環境変数の指定がないとき，および指定した値に誤りがあるときは，1が仮定されます。

（例）

CBLVALUE=33

VALUE句のないデータ項目の初期値に，空白文字（JIS8単位コードで33番目の文字）を指定します。

なお，この環境変数は次のデータ項目には適用されません。

VALUE句の指定のあるデータ項目

ADDRESSED句の指定のあるデータ項目

EXTERNAL句の指定のあるデータ項目

DYNAMIC LENGTH句のあるデータ項目

注意事項

初期化属性プログラムの作業場所節に対する初期化は，環境変数CBLVALUEと環境変数CBLINITVALUEが両方とも有効な場合と，どちらか片方だけが有効な場合とで初期値が異なります。詳細については，「18.4.1　プログラム属性」の「(2)　初期化属性プログラム」を参照してください。また，環境変数CBLINITVALUEについては，「(9)　CBLINITVALUE」を参照してください。

(22)　CBLV3UNICODE

-UniObjGenオプション指定時，-CompatiV3オプションおよび-V3Recオプションの指定を有効としたい場合に設定します。

ただし，この環境変数を設定した場合，-CompatiV3オプションは-JPN,Alnumオプションを仮定しません。

（例）

CBLV3UNICODE=YES

なお，この環境変数は次の場合は無効となります。

この環境変数にYESを指定していない場合

-UniObjGenオプションを指定していない場合

この環境変数とコンパイラオプションの組み合わせによるメインフレーム（VOS3）COBOL85移行用オプションである，-CompatiV3オプション，-JPNオプション，および-V3Recオプションの有効／無効の関係を次に示します。

環境変数CBLV3UNICODE

-UniObjGenオプションと同時に指定するオプション

-CompatiV3

-JPN

-V3Rec

YES

○※

×

○

YES以外

×

×

×

（凡例）

○：有効となる

×：無効となる

注※

-V3Rec,Variableオプションは仮定されますが，-JPN,Alnumオプションは仮定されません。

注意事項

-JPN,Alnumオプションが仮定されないことで，日本語項目，日本語編集項目，および日本語文字定数をそれぞれ英数字項目，英数字編集項目，および英数字定数として扱うことができないため，日本語項目と英数字項目間での比較および転記ができません。また，VOS3 COBOL85と日本語機能に差異があるため，日本語項目または英数字項目のどちらか一方に合わせる必要があります。VOS3 COBOL85とCOBOL2002との日本語機能差異を次に示します。

項目

VOS3 COBOL85

COBOL2002※

日本語項目と英数字項目間の転記／比較

LANGOPT=(-D)の場合，転記または比較できる。

転記または比較できない。

INITIALIZE文（日本語項目の初期設定）

REPLACING指定がないと半角空白で初期化する。

REPLACING ALPHANUMERIC，ALPHANUMERIC-EDITED指定時，一意名2，定数1の値で初期化する。

REPLACING指定がないと全角空白で初期化する。

NATIONAL,NATIONAL-EDITED以外のREPLACING指定の場合，初期化されない。

INSPECT，STRING，UNSTRING文の日本語項目

XCOBOL=(N)オプションのときは1バイト単位で処理する。

日本語文字単位で処理する。

日本語項目パディング

LANGOPT=(-D)の場合，パディング文字に半角空白(X'40')を使用する。

パディング文字に全角空白(X'3000')を使用する。

注※

環境変数CBLV3UNICODE=YES，-UniObjGenオプションおよび-CompatiV3オプション指定あり

-V3Rec,Variableオプションが指定できることで，日本語文字定数に標準コード文字が指定できます。日本語文字定数がUTF-16となり，標準コード文字も2バイトとなります。このことから，転記先のけた数を増やす必要があり，その日本語項目または日本語編集項目を参照している個所も修正が必要となる場合があります。例を次に示します。

（転記先のけた数の見直しの例）

01 ABC PIC N(2).

01 DEF PIC N(1).

：

MOVE N'あAB' TO ABC.

MOVE ABC(2:1) TO DEF.

日本語文字定数は3けた（6バイト）になることから，転記先のABCけた数を3けたに修正する必要があります。

また，標準コード文字が2バイトになることから，DEFに'AB'が格納されていることを期待する場合，標準コード文字'AB'を参照する部分参照の長さを1から2 に修正する必要があり，その転記先となるDEFのけた数も1から2に修正する必要があります。

（日本語文字定数の半角空白補完による転記先のけた数の見直しの例）

01 ABC PIC N(3).

：

MOVE N'あabc' TO ABC.

日本語文字定数の標準コード文字数が奇数になる場合は，標準コード文字数が偶数になるように日本語文字定数の終端に半角空白が補完されます。これによって，補完された半角空白を含み，日本語文字定数は5けた（10バイト）になることから，転記先となるABCのけた数を5けたに修正する必要があります。

-CompatiV3オプションが指定できることで，報告書作成機能が拡張され，特殊名段落の定数10が指定可能となりますが，1バイト文字の指定が前提であるため，UTF-8で多バイトとなる半角かたかなは指定できません。このことから，定数10にUTF-8で多バイトとなる文字を指定している場合，UTF-8で1バイトとなる文字に変更する必要があります。

(23)　登録集環境変数

登録集原文を検索するフォルダを設定します。フォルダを複数指定する場合は，セミコロン（;）で区切って指定します。

（例）

登録集名=¥usr¥user¥copylib

登録集名は，英大文字と数字から成る8文字以内の任意の文字列で指定します。

ここで指定したフォルダは，環境変数CBLLIBで指定したフォルダよりも優先します。詳細については，「33.3.1　原始文操作機能」を参照してください。

33.7　コンパイラ付属機能

33.7.1　TDコマンド生成機能

TDコマンド生成機能とは，COBOLソースファイルを解析して，テストデバッガで使用するTDコマンドをファイルに生成する機能です。

生成されるTDコマンドには，中断点情報，プログラムのシミュレーション情報，およびファイルのシミュレーション情報の3種類があります。

これらのTDコマンド群は，-TestCmd,Break，-TestCmd,Sim，-TestCmd,Fullオプションを指定してコンパイルしたときに生成されます。生成されたTDコマンド群に，必要に応じてTDコマンドの修正や追加をすることで，TDコマンド格納ファイルを作成できます。

また，TDコマンド生成機能の対象となるプログラムは，コンパイルしたときすべてのプログラムで，Sレベル，Uレベルのコンパイルエラーのなかった原始プログラムファイルだけです。

TDコマンド生成機能の詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

33.7.2　ヘルプ機能

ここではヘルプ機能（オプション表示）について説明します。

(1)　ヘルプ機能（オプション表示）

ヘルプ機能（オプション表示）とは，COBOL2002のコンパイラを起動するとき，ccbl2002コマンド行，およびccblコマンド行に指定できるオプションを画面に表示する機能です。

オプションを何も指定しないでccbl2002コマンド，およびccblコマンドを起動すると，すべてのコンパイラオプションが表示されます。

ccbl2002コマンド，およびccblコマンドの詳細については，「33.4.1　ccbl2002コマンド」，および「33.4.2　ccblコマンド」を参照してください。

33.7.3　初期化漏れチェック機能

ここでは，初期化漏れチェック機能の使用方法について説明します。

(1)　初期化漏れチェック機能の概要

初期化漏れチェック機能とは，データ項目を参照しているが，値の設定（初期化）がされていない，またはその可能性のあるデータ項目を「初期化漏れ」として検出する機能です。

実行時に検出される初期化漏れが原因の不良は，不良個所の特定のために複数のプログラムにわたった調査が必要になります。このため，不良個所の特定に時間が掛かることがあります。初期化漏れチェック機能を使用すると，コンパイル時に初期化漏れを検出でき，テスト工程前に対策できるため，COBOLプログラムの開発効率を向上できます。

初期化漏れチェック機能で「初期化漏れ」を検出するCOBOLソースの例を次の図に示します。

図33‒4　初期化漏れチェック機能で「初期化漏れ」を検出するCOBOLソースの例

(2)　初期化漏れチェック機能を使用するときに指定するコンパイラオプション

初期化漏れチェック機能を使用する場合は，コンパイル時に次のオプションを同時に指定します。

-Compile,CheckOnlyオプション※

-Compile,CheckOnlyオプションについては，「33.5.10　リンクの設定」の「(6)　-Compileオプション」を参照してください。

-CheckUninitDataオプション

-CheckUninitDataオプションについては，「33.5.14　その他の設定」の「(22)　-CheckUninitDataオプション」を参照してください。

注※

次の場合，-Compile,CheckOnlyオプションが無効となるため，初期化漏れチェック機能も無効になります。

開発マネージャでビルドを実行した場合

明示的に-Compile,NoLinkオプションを指定した場合

注意事項

初期化漏れチェック機能は，-CBLVALUEオプションおよび環境変数CBLVALUE，ならびに環境変数CBLINITVALUE指定時に設定される初期値を無視します。

初期化漏れチェック機能は，プログラムを実行したときに通る可能性のある経路（制御ブロック）をすべて走査し，手続き文で参照されているデータ項目の初期化漏れをチェックします。ただし，環境変数CBL_UNINITDATA_BREAKOFFの指定が無効な場合に，走査した制御ブロックの数が上限を超えたときは，初期化漏れチェック機能の警告メッセージを出力して，初期化漏れチェック処理を打ち切ります。環境変数CBL_UNINITDATA_BREAKOFFについては，「33.6.3　コンパイラ環境変数の詳細」の「(2)　CBL_UNINITDATA_BREAKOFF」を参照してください。

(3)　初期化漏れチェック機能で出力するファイル

初期化漏れチェック機能では，この機能でチェックした初期化漏れの可能性があるデータ項目を，次に示す一覧でファイルに出力することもできます。

初期化漏れ確認結果一覧

初期化漏れ従属項目一覧

これらの一覧を出力する場合は，環境変数CBLUNINITDATA_OUTRESULTLISTにONを指定します。環境変数CBLUNINITDATA_OUTRESULTLISTの詳細は，「33.6.3　コンパイラ環境変数の詳細」の「(19)　CBLUNINITDATA_OUTRESULTLIST」を参照してください。

また，これらの一覧の出力先を変更する場合は，環境変数CBLUNINITDATA_OUTRESULTLISTDIRに出力先フォルダを指定します。環境変数CBLUNINITDATA_OUTRESULTLISTDIRの詳細は，「33.6.3　コンパイラ環境変数の詳細」の「(20)　CBLUNINITDATA_OUTRESULTLISTDIR」を参照してください。

初期化漏れチェック機能で出力するファイルの共通規則を次に示します。

共通規則

ファイルはCSV形式です。

ファイルの1行目は列名を表します。2行目以降は列に対する内容の値を表します。

各項目は引用符（"）で囲みます。ただし，項目の値がない場合は囲みません。

"列名1","列名2","列名3",…

"値1",,"値3",…

ファイルの文字コードはシフトJISです。

ファイルは，コンパイルの対象となるCOBOLソースファイルの単位に出力します。

ファイルは，コンパイルごとに上書きして出力します。

ファイル入出力でエラーが発生した場合，メッセージを出力し，処理を中断します。

(a)　初期化漏れ確認結果一覧

初期化漏れ確認結果一覧は，初期化漏れチェック機能でチェックした，初期化漏れの可能性があるデータ項目の情報を出力する一覧です。初期化漏れ確認結果一覧は，初期化漏れのメッセージごとに，次に示す形式で情報を出力します。

初期化漏れ確認結果一覧の形式

列名

内容

#

初期化漏れ確認結果一覧内の一意な通番です。

ディレクトリ名

COBOLソースファイルがあるフォルダ名です。

ファイル名

COBOLソースファイル名です。

プログラム名

プログラム名です。

COPY定義ディレクトリ名

メッセージが出力された個所が登録集原文内である場合，登録集原文があるフォルダ名です。登録集原文内でない場合は何も出力されません。

COPYファイル名

メッセージが出力された個所が登録集原文内である場合，登録集原文のファイル名。登録集原文内でない場合は何も出力されません。

一連番号

メッセージが出力された，コンパイルリストの原始プログラムリストに表示される行番号です。

ファイル内行番号

メッセージが出力された，COBOLソースファイルまたは登録集原文ファイル内の相対行番号です。

ただし，埋め込みSQL文の場合，メッセージは語「EXEC」の位置に出力されますが，ここにはデータ項目の位置が出力されます。

ファイル内カラム

メッセージが出力された，COBOLソースファイルまたは登録集原文ファイル内のカラム番号です。

ただし，埋め込みSQL文の場合，メッセージは語「EXEC」の位置に出力されますが，ここにはデータ項目の位置が出力されます。

データ項目名

データ項目の修飾付きデータ名です。

修飾付きデータ名の形式を次に示します。

データ名 〔OF 集団項目名〕…〔IN ファイル名〕

従属項目一覧有無

初期化漏れ従属項目一覧への情報の出力有無を0または1で示します。

0：初期化漏れ従属項目一覧へ情報は出力していません。

1：初期化漏れ従属項目一覧に情報を出力しています。

初期化漏れ確認結果一覧の規則

初期化漏れ確認結果一覧のファイル名称は，「<COBOLソースファイル名（拡張子を除く）>-UninitCheckResult.csv」です。

（例）COBOLソースファイル名が「Prog1.cbl」の場合

　　Prog1-UninitCheckResult.csv

初期化漏れ確認結果一覧のファイルは，初期化漏れの可能性があるデータ項目を検出しなかった場合でも出力します。

初期化漏れ確認結果一覧の出力例

COBOLソースファイル

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. MAIN.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 A PIC X.
000600 01 B PIC X VALUE 'B'.
000700 01 C.
000800   03 C1 PIC X.
000900   03 C2 PIC X.
001000 PROCEDURE DIVISION.
001100     DISPLAY A.
001200     IF B = 'B' THEN
001300         MOVE SPACE TO C
001400         PERFORM SEC1
001500     ELSE
001600         PERFORM SEC1
001700     END-IF.
001800     STOP RUN.
001900
002000 SEC1.
002100     COPY SAMPLECOPY.
002200
002300 END PROGRAM MAIN.

登録集原文

           DISPLAY C1.

コンパイルリストの原始プログラムリスト

初期化漏れ確認結果一覧

"#","ディレクトリ名","ファイル名","プログラム名","COPY定義ディレクトリ名","COPYファイル名","一連番号","ファイル内行番号","ファイル内カラム","データ項目名","従属項目一覧有無"
"1","C:¥WORK","Prog1.CBL","MAIN",,,"001100","11","20","A","0"
"2","C:¥WORK","Prog1.CBL","MAIN","C:¥WORK¥COPY","SAMPLECOPY.CBL","2101","1","20","C1 OF C","0"

(b)　初期化漏れ従属項目一覧

初期化漏れ従属項目一覧は，初期化漏れチェック機能でチェックした，初期化漏れの可能性があるデータ項目が集団項目である場合に，その従属項目の情報を出力する一覧です。初期化漏れ従属項目一覧は，次に示す形式で情報を出力します。

初期化漏れ従属項目一覧の形式

列名

内容

#

初期化漏れ従属項目一覧内の一意な通番です。

確認結果一覧の#

初期化漏れ確認結果一覧での#（通番）です。

従属項目名

初期化漏れの可能性がある従属項目の修飾付きデータ名です。

修飾付きデータ名の形式を次に示します。

データ名 〔OF 集団項目名〕…〔IN ファイル名〕

初期化漏れの可能性がある従属項目がFILLER項目の場合は，データ名をFILLERとみなした修飾付きデータ名です。なお，対象は，従属項目のうち基本項目だけとなります。

初期化漏れ従属項目一覧の規則

初期化漏れ従属項目一覧のファイル名称は，「<COBOLソースファイル名（拡張子を除く）>-UninitCheckSubordinate.csv」です。

（例）COBOLソースファイル名がProg1.cblの場合

　　Prog1-UninitCheckSubordinate.csv

初期化漏れ従属項目一覧のファイルは，初期化漏れ確認結果一覧での初期化漏れの可能性があるデータ項目に集団項目がない場合でも出力します。

初期化漏れ従属項目一覧の出力例

COBOLソースファイル

       IDENTIFICATION DIVISION.
       PROGRAM-ID. MAIN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 A.
        03 A1.
          05 A11 PIC X.
        03 A2.
          05 A21 PIC X.
       01 B.
        03 B1.
          05 B11 PIC X.
        03 B2.
          05 B21 PIC X.
       PROCEDURE DIVISION.
           DISPLAY A.

           MOVE SPACE TO B1.
           DISPLAY B.

       END PROGRAM MAIN.

コンパイルリストの原始プログラムリスト

初期化漏れ確認結果一覧

"#","ディレクトリ名","ファイル名","プログラム名","COPY定義ディレクトリ名","COPYファイル名","一連番号","ファイル内行番号","ファイル内カラム","データ項目名","従属項目一覧有無"
"1","C:¥WORK","Prog1.CBL","MAIN",,,"16","16","20","A","1"
"2","C:¥WORK","Prog1.CBL","MAIN",,,"19","19","20","B","1"

初期化漏れ従属項目一覧

"#","確認結果一覧の#","従属項目名"
"1","1","A11 OF A1 OF A"
"2","1","A21 OF A2 OF A"
"3","2","B21 OF B2 OF B"

(4)　初期化漏れチェック機能の使用方法

初期化漏れチェック機能を使用するときの作業の流れを次の図に示します。初期化漏れチェック機能を使用する前に，あらかじめSレベル，Uレベルのコンパイルエラーがないことを確認してください。

図33‒5　初期化漏れチェック機能を使用するときの作業の流れ

初期化漏れチェック機能は，次の方法で使用できます。

コンパイルリストから調査する

COBOLエディタで構文チェックする

COBOLソース解析を使用する

(a)　コンパイルリストから調査する方法

コンパイルリストから初期化漏れを調査する手順を次に示します。

-CheckUninitDataオプション，-Compile,CheckOnlyオプションおよび-SrcListオプションを指定してコンパイルする。

コンパイルリストに初期化漏れチェックの結果が出力されます。

注意事項

開発マネージャのビルドを使用する場合は，-Compile,CheckOnlyオプションが無効となるため，初期化漏れチェック機能も無効となります。開発マネージャで初期化漏れチェックをする場合は，COBOL2002 Developer ProfessionalのCOBOLソース解析の機能を使用してください。

コンパイルリストまたは標準エラー出力に，初期化漏れチェック機能の警告メッセージが出力されていないかを確認する。

初期化漏れチェック機能の警告メッセージが出力されている場合は，メッセージの内容を確認して，初期化漏れの可能性があるデータ項目に，値設定が必要かどうかを確認する。

値設定が必要な場合は，プログラムを修正する。

(b)　COBOLエディタで構文チェックする方法

COBOLエディタの構文チェック結果ウィンドウから初期化漏れを調査する手順を次に示します。COBOLエディタの操作方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

構文チェック オプションダイアログボックスのコンパイラの設定のオプションに「-CheckUninitData」を指定して，構文チェックを実行する。

構文チェック結果ウィンドウに初期化漏れチェック機能の警告メッセージが出力されていないかを確認する。

初期化漏れチェック機能の警告メッセージが出力されている場合は，メッセージをダブルクリックして該当行へジャンプし，初期化漏れの可能性があるデータ項目に，値設定が必要かどうかを確認する。

値設定が必要な場合は，プログラムを修正する。

(c)　COBOLソース解析を使用する方法

COBOLソース解析の解析ログから初期化漏れを調査する手順を次に示します。COBOLソース解析の操作方法については，マニュアル「COBOL2002 Professional Tool Kit COBOLソース解析ガイド」を参照してください。

-CheckUninitDataコンパイラオプションを指定してCOBOLソース解析を実行する。

解析ログを参照して，初期化漏れチェック機能の警告メッセージが出力されていないか確認する。

初期化漏れチェック機能の警告メッセージが出力されている場合は，メッセージをダブルクリックして該当行へジャンプし，初期化漏れの可能性があるデータ項目に，値設定が必要かどうかを確認する。

値設定が必要な場合は，プログラムを修正する。

(5)　初期化漏れチェック機能使用時の注意事項

次の表に示す機能に該当するデータ項目は，初期化漏れチェック機能の対象外となり，常に初期化済みと判定されます。

項番

機能

1

オブジェクト指向機能

オブジェクトビュー

オブジェクトプロパティ

SELFおよびSUPER

オブジェクト参照

INVOKE文

など

2

利用者定義関数

3

OLE2オートメーション機能

4

連絡節で定義されているデータ項目

5

EXTERNAL句またはGLOBAL句が指定されているデータ項目またはその従属項目

6

コンパイル対象とならない行

コメント行

デバッグ行（-DebugLineオプション未指定時）

条件翻訳の無効行

7

制御が渡らない文，手続き

8

覚え書きとみなされた構文

9

Sレベル，Uレベルエラーが発生するCOBOL原始プログラムファイル

10

宣言部分の文，手続き（USE文の宣言手続き）

11

XDMによるデータベース操作シミュレーション機能

構造型データベース操作シミュレーション機能（XDM/SD）

リレーショナルデータベース操作シミュレーション機能（XDM/RD）

12

ADDRESSED BY句が指定されているデータ項目，またはその従属項目

13

可変部分に定義されたデータ項目

14

動的長基本項目

15

報告書作成機能

16

被再定義項目が初期化漏れチェック機能のチェック対象外である再定義項目およびその従属項目すべて※1※2

17

被再命名項目が初期化漏れチェック機能のチェック対象外である再命名項目※2

18

再定義項目が初期化漏れチェック機能のチェック対象外である被再定義項目およびその従属項目すべて※2

19

RENAMES句にTHRU指定がある再命名項目※3

20

合成キー

21

すべての従属項目が初期化漏れチェック機能のチェック対象外であるデータ項目

注※1

　チェック対象外であるデータ項目を再定義した例を次に示す。

　（例）

    022000 WORKING-STORAGE SECTION.
    023000  01 DAT1 EXTERNAL        PIC X.
    024000  01 DAT2 REDEFINES DAT1  PIC X.
                ：
    039000
    043000     DISPLAY DAT2.           ← DAT2はチェック対象外

　DAT2の被再定義項目DAT1が，初期化漏れチェックの対象外（EXTERNAL句指定のデータ項目）であるため，DAT2もチェックされません。

注※2

　チェック対象外のデータ項目で再定義した例を次に示します。

　（例）

    022000 WORKING-STORAGE SECTION.
    023000  01 DAT1.
    023100     03 DAT11             PIC X.
    023200     66 DAT12 RENAMES DAT11.
    024000  01 DAT2 REDEFINES DAT1  PIC 9.
    025000  01 DAT3 REDEFINES DAT1  GLOBAL.
    025100     03 DAT31             PIC X.
    025200     66 DAT32 RENAMES DAT31.
                ：
    039000
    040000     DISPLAY DAT31 DAT32.    ← DAT31，DAT32はチェック対象外
    041000     DISPLAY DAT1 DAT2.      ← DAT1，DAT2はチェック対象外
    042000     DISPLAY DAT11 DAT12.    ← DAT11，DAT12はチェック対象外

　再定義項目DAT3が，初期化漏れチェックの対象外（GLOBAL句指定のデータ項目）であるため，DAT3と領域を共有する次の項目もチェックされません。

　・DAT3の従属項目DAT31とDAT31の再命名項目DAT32

　・DAT3の被再定義項目DAT1，およびDAT1の従属項目DAT11とDAT11の再命名項目DAT12

　・DAT1の再定義項目DAT2

注※3

　THRU指定がある再命名項目がチェック対象外となる例を次に示します。

　（例）

    022000 WORKING-STORAGE SECTION.
    023000  01 DAT1.
    024000    03 DAT2.
    025000      05 DAT3  PIC X.
    026000      05 DAT4  PIC 9.
    027000      05 DAT5  PIC 9.
    028000      05 DAT6  PIC X.
    029000    66 R-DAT RENAMES DAT3 THRU DAT6.
                ：
    043000    DISPLAY R-DAT.           ← R-DATはチェック対象外

ファイル節のレコードの初期化漏れチェックは，作業場所節と同じ扱いとなります。

手続き文の作用対象に添字付きデータ名が指定された場合，値参照または値設定の対象は，反復データ項目またはその従属項目のすべてとします。

（例）

  01 DAT1 .
    03 DAT2 OCCURS 10.
      05 DAT3 PIC X(1).
      05 DAT4 PIC X(1).
          ：
  MOVE SPACE TO DAT3(1).           ← DAT3のすべての要素を初期化済みとみなす
  DISPLAY DAT3(2).                 ← DAT3は初期化済みと判定される
  DISPLAY DAT4(3).                 ← DAT4は初期化漏れの可能性ありと検出される
  MOVE SPACE TO   DAT2(4).         ← DAT2の4番目の要素に半角空白を設定する
  DISPLAY DAT2(1) DAT3(2) DAT4(3). ← DAT2およびその従属項目は初期化済と判定される

手続き文の作用対象に部分参照付きデータ名が指定された場合，値参照または値設定の対象は，データ項目またはその従属項目すべてとします。

（例）

  01 DAT1 .
    03 DAT2 PIC X(5).
    03 DAT3 PIC X(5).
          ：
  MOVE SPACE TO DAT2(5:1). ← DAT2全体が初期化されたものとみなす
  DISPLAY DAT2(1:3).       ← DAT2は初期化済みと判定される
  MOVE SPACE TO DAT1(1:5). ← DAT1全体が初期化されたものとみなす
  DISPLAY DAT1  DAT2 DAT3. ← DAT1およびその従属項目すべて初期化済みと判定される

被再定義項目と再定義項目，同じ被再定義項目を持つ再定義項目など，再定義によって同じ記憶域に関連づけられた2つの集団項目で，一方の集団項目の従属項目に値が設定されたとき，もう一方の集団項目の従属項目は，値が設定された従属項目と同じ領域であったとしても，初期化済みとはみなしません。

（例）

    01 A.
      03  A-1   PIC X.
      03  A-2   PIC X.
    01 B REDEFINES A.
      03  B-1   PIC X.
      03  B-2   PIC X.
          ：
    MOVE '1'   TO A-1.        *> 被再定義項目の集団項目Aの従属項目A-1に値を設定
    DISPLAY B-1.              *> 再定義項目の集団項目Bの，A-1と同じ領域の従属項目
                              *> B-1を初期化漏れの可能性ありと判定する
            ?
KCCC6951C-W データ名"B-1"は，初期化されていない可能性があります。

被再定義項目と再定義項目，同じ被再定義項目を持つ再定義項目など，再定義によって同じ記憶域に関連づけられた2つのデータ項目がある場合に，一方が初期化済みであるときは，もう一方のデータ項目およびその従属項目はすべて初期化済みとみなします。このため，初期化済みのデータ項目の長さが，もう一方のデータ項目の長さより短かったとしても，もう一方のデータ項目およびその従属項目を初期化漏れの可能性ありとは判定しません。

（例）

    01 A.
      03  A-1   PIC X.
      03  A-2   PIC X.
    01 B REDEFINES A PIC X.
          ：
    MOVE '0'   TO B.          *> 再定義項目のBに値を設定
    DISPLAY A-2.              *> BよりもAの方がデータ項目の長さが長いが，
                              *> 被再定義項目の集団項目Aの従属項目A-2は
                              *> 初期化漏れの可能性ありとは判定しない

34　定義別のコンパイル方法とリポジトリファイル

COBOL2002では，プログラム定義のほかに，関数定義，クラス定義，およびインタフェース定義など，さまざまな定義を指定できます。この章では，定義の情報を保管するリポジトリファイルについて説明します。また，定義別のコンパイル方法について説明します。

34.1　リポジトリファイルを使用するCOBOLプログラム開発の概要

34.1.1　概要

COBOL2002では，関数定義，クラス定義，およびインタフェース定義を使用できます。これらの翻訳単位が参照関係を持つ場合，参照先の翻訳単位と参照元の翻訳単位とで，それぞれ次のような処理が必要になります。

参照先の翻訳単位

参照元の翻訳単位から参照されるときに必要な定義情報を，参照元の翻訳単位のコンパイルより前に出力する必要があります。この定義情報を，外部リポジトリと呼びます。外部リポジトリの言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「4.12　外部リポジトリ」を参照してください。

COBOL2002では，関数定義，クラス定義，またはインタフェース定義をコンパイルすると，自動的に翻訳単位の外部リポジトリをリポジトリファイル（.rep）に出力します。

参照元の翻訳単位

参照先の翻訳単位の定義情報を取り込む指定が必要です。

COBOL2002では，参照元の翻訳単位のリポジトリ段落に参照先の翻訳単位名を指定しておくことによって，参照元の翻訳単位のコンパイル時に参照先の翻訳単位に対応するリポジトリファイルを取り込めます。

規則

参照元の翻訳単位と参照先の翻訳単位が同じソースファイル中だけに存在する場合は，リポジトリファイルがなくても翻訳単位をコンパイルできます。

プログラム定義だけで構成されているCOBOLプログラムの場合，リポジトリファイルは出力されません。また，リポジトリ段落に参照するプログラム名を指定する必要もありません。詳細は，「34.3.3　プログラム定義だけのコンパイル」を参照してください。

参照元の翻訳単位をコンパイルする時点で，参照先の翻訳単位のリポジトリファイルが出力されていない場合，参照関係が解決できないためコンパイルエラーとなります。そのため，異なるソースファイルに存在する翻訳単位同士が参照関係を持つ場合は，ソースファイルをコンパイルする順序を意識する必要があります。

ただし，開発マネージャを使用しているときは，構成するソースファイルをすべてプロジェクトに指定しておけば，開発マネージャがコンパイルする順番を自動的に決定するため，翻訳単位の参照関係によってソースファイルのコンパイル順を意識する必要はありません。

34.1.2　リポジトリファイルを使用するCOBOLプログラムの作成手順

リポジトリファイルを使用するCOBOLプログラム作成の例として，各翻訳単位の定義と，それを参照する翻訳単位を別々のソースファイルで作成する場合の開発手順について説明します。この手順は，例えば複数の開発者が担当部分の原始プログラムを作成およびコンパイルし，最後にそれぞれのオブジェクトファイルをリンクして実行可能ファイルを作成するようなケースに適用できます。

開発手順を，次に示します。

翻訳単位間のインタフェースの決定

まず，参照先の翻訳単位と参照元の翻訳単位の間のインタフェースを決定する必要があります。COBOL2002では，この翻訳単位間のインタフェース情報のことをシグニチャと呼びます。シグニチャの詳細については，マニュアル「COBOL2002　言語　標準仕様編」　「4.12　外部リポジトリ」を参照してください。

翻訳単位間のインタフェースを決定するためには，参照先の翻訳単位の原始プログラムで，シグニチャを作成しておく必要があります。

ただし，オブジェクト指向機能の場合，クラス定義のシグニチャを作成する代わりに，インタフェース定義を使用する方法もあります。インタフェース定義は，実装するクラス定義とインタフェースの構成を変更したい場合などに使用します。インタフェースの詳細は，「20.　オブジェクト指向機能」を参照してください。

リポジトリファイルの生成

1.で作成したシグニチャを持つ，参照先の翻訳単位の原始プログラムをコンパイルして，リポジトリファイルを生成します。リポジトリファイルの生成方法については，「34.3.2　リポジトリファイルの単独生成」を参照してください。

原始プログラムの作成

原始プログラムを作成します。

参照元の翻訳単位で，環境部構成節のリポジトリ段落に，参照先の翻訳単位名を指定します。また，1.でシグニチャだけを作成した参照先の翻訳単位の原始プログラムも完成させます。

リポジトリファイルの取り込みとコンパイル

リポジトリファイルの格納フォルダに，2.で生成した，参照先の翻訳単位から生成したリポジトリファイルを格納します。リポジトリファイルの格納フォルダについては，「34.2.4　リポジトリファイルの参照方法」を参照してください。

翻訳単位をコンパイルすると，コンパイラによってリポジトリファイルが読み込まれ，参照先の翻訳単位のシグニチャと，参照元の翻訳単位のINVOKE文，SET文，関数一意名などの参照情報との適合がチェックされます。適合チェックの詳細は，「34.1.3　リポジトリファイルに格納される情報と適合チェック」を参照してください。

実行可能ファイルまたはDLLの生成

4.で生成したオブジェクトファイルをリンカによって結合して，実行可能ファイルまたはDLLを生成します。

34.1.3　リポジトリファイルに格納される情報と適合チェック

リポジトリファイルには，関数定義，クラス定義，およびインタフェース定義のシグニチャ（定義情報）が格納されます。COBOL2002コンパイラは，コンパイル時にリポジトリファイルを使用して，次の適合チェックをします。

関数定義の場合

参照元の引数と参照先の返却項目の適合がチェックされます。

クラス定義およびインタフェース定義の場合

オブジェクトの適合がチェックされます。このとき，メソッド定義を呼び出すときの引数と返却項目の適合についても，チェックされます。

適合していれば，実行時に関数定義やメソッド定義を呼び出せます。引数と返却項目の適合については，マニュアル「COBOL2002　言語　標準仕様編」　「10.7　引数と返却項目の適合」を参照してください。また，オブジェクトの適合については，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.7　適合とインタフェース」および「20.　オブジェクト指向機能」を参照してください。

34.2　リポジトリファイル

COBOL2002の場合，翻訳単位の原始プログラムをコンパイルしたときに出力される外部リポジトリは，リポジトリファイル（.rep）に格納されます。

リポジトリファイルは，ソースファイルと1対1の関係となっています。そのため，ソースファイルをコンパイルした場合，一つのソースファイルに対して一つのリポジトリファイルが生成されます。生成されるリポジトリファイルの名称は，ソースファイルの名称と同じで，拡張子が.repとなります。

34.2.1　リポジトリファイルの生成とコンパイル時の利用

関数定義の場合とオブジェクト指向機能の場合について，それぞれリポジトリファイルの生成とコンパイル時のリポジトリファイルの利用について，例を示します。

(1)　関数定義の場合

関数定義を呼び出すCOBOLプログラムの場合の例を，次に示します。なお，関数定義については，「2.5　利用者定義関数」を参照してください。

関数定義FUNC1が含まれるソースファイルFUNC1.cblをコンパイルして，リポジトリファイルFUNC1.repを生成します。

関数定義FUNC1を参照するプログラム定義PROGRAM1で，環境部構成節のリポジトリ段落に，参照する関数定義FUNC1を指定します。

プログラム定義PROGRAM1をコンパイルすると，リポジトリ段落の指定を基に，関数定義FUNC1が含まれるリポジトリファイルFUNC1.repが検索して取り込まれます。リポジトリファイルの検索規則については，「34.2.4　リポジトリファイルの参照方法」の「(2)　リポジトリファイルの検索」を参照してください。

コンパイラは，リポジトリファイルから取り込んだ関数定義FUNC1の情報と，参照しているプログラム定義PROGRAM1の関数一意名FUNCTION FUNC1の情報の適合をチェックします。このとき，情報が適合していなければエラーメッセージが出力され，適合していればコンパイルが正常終了します。

(2)　オブジェクト指向機能の場合

オブジェクト指向機能を呼び出すCOBOLプログラムの場合の例を，次に示します。なお，オブジェクト指向機能については，「20.　オブジェクト指向機能」を参照してください。

クラス定義CLASS1が含まれるソースファイルCLASS1.cblをコンパイルして，リポジトリファイルCLASS1.repを生成します。

クラス定義CLASS1を参照するプログラム定義PROGRAM1で，環境部構成節のリポジトリ段落に，参照するクラス定義CLASS1を指定します。

プログラム定義PROGRAM1をコンパイルすると，リポジトリ段落の指定を基に，クラス定義CLASS1が含まれるリポジトリファイルCLASS1.repが検索して取り込まれます。リポジトリファイルの検索規則については，「34.2.4　リポジトリファイルの参照方法」の「(2)　リポジトリファイルの検索」を参照してください。

コンパイラは，取り込んだクラス定義CLASS1の情報から，クラス定義CLASS1に含まれるメソッド定義METH-1の情報と，参照しているプログラム定義PROGRAM1のINVOKE文に指定したメソッドMETH-1の情報の適合をチェックします。このとき，情報が適合していなければエラーメッセージが出力され，適合していればコンパイルが正常終了します。

34.2.2　ソースファイル，リポジトリファイル，およびリポジトリ段落の関係

リポジトリファイル（.rep）は，COBOLソースファイルをコンパイルしたときに，そのソースファイルに格納されている翻訳単位ごとの定義情報から生成されます。

リポジトリファイルが生成されるフォルダの規則について，次に示します。

環境変数CBLREPを設定している場合は，環境変数に指定したフォルダに生成されます。環境変数CBLREPに複数のフォルダを指定している場合は，最初に指定したフォルダに生成されます。

環境変数CBLREPを設定していない場合は，カレントフォルダに生成されます。

ここでは，複数の翻訳単位を含むCOBOLソースファイルを例にして，ソースファイル，リポジトリファイル，およびリポジトリ段落の関連を説明します。

(1)　ソースファイルとリポジトリファイルの関係

（例）

クラス定義，インタフェース定義，関数定義，およびプログラム定義を格納しているソースファイル（FILE1.cbl）をコンパイルすると，ソースファイルと同名で拡張子が（.rep）となったリポジトリファイル（FILE1.rep）が作成されます。リポジトリファイルには，それぞれの定義に対応する情報が格納されます。ただし，プログラム定義に対応する情報は，格納されません。

ソースファイルとリポジトリファイルの関係を，次に示します。

図34‒1　ソースファイルとリポジトリファイルの関係

(2)　リポジトリファイルとリポジトリ段落の関係

リポジトリ段落に指定したクラス名，インタフェース名，利用者定義関数名，およびプロパティ名は，コンパイル時に同じソースファイル中に存在する翻訳単位，およびリポジトリファイル中から検索された情報と関連づけられます。

（例）

プログラム定義が関数定義を呼び出す場合の，リポジトリ段落の指定例について，次に示します。

プログラム定義のリポジトリ段落で，参照する利用者定義関数名（FUNC1）を宣言します。

プログラム定義（PROGRAM1）は，リポジトリ段落の宣言に従ってリポジトリファイル（FILE1.rep）の中の利用者定義関数名（FUNC1）の情報を参照できます。リポジトリファイル内の定義情報を検索する方法については，「34.2.4　リポジトリファイルの参照方法」の「(2)　リポジトリファイルの検索」を参照してください。

リポジトリファイルとリポジトリ段落の関係を，次に示します。

図34‒2　リポジトリファイルとリポジトリ段落の関係

注意事項

リポジトリ段落で指定するクラス名，インタフェース名，または利用者定義関数名が，リポジトリ段落を指定した翻訳単位と異なるソースファイル中にある場合，参照先の翻訳単位をあらかじめコンパイルして，リポジトリファイルを生成しておく必要があります。

リポジトリ段落に指定したクラス名，インタフェース名，利用者定義関数名，およびプロパティ名は，リポジトリ段落を指定した定義中だけで有効となります。

34.2.3　リポジトリファイルの生成方法

リポジトリファイルは，ソースファイルにクラス定義，インタフェース定義，または関数定義を含む場合，ソースファイルのコンパイル時に生成されます。このとき，オブジェクトファイルを生成しないでリポジトリファイルだけの生成もできます。リポジトリファイルの生成方法については，「34.3.2　リポジトリファイルの単独生成」を参照してください。

(1)　リポジトリファイルの生成規則

リポジトリファイルの生成規則を，次に示します。

環境変数CBLREPを指定している場合

環境変数CBLREPに指定したフォルダが指定順に検索され，ソースファイルと同じ名称のリポジトリファイルが最初に見つかった時点で，そのリポジトリファイルが更新されます。

ソースファイルと同じ名称のリポジトリファイルが見つからなければ，環境変数CBLREPに指定した最初の有効なフォルダに，リポジトリファイルが新規に生成されます。

環境変数CBLREPを指定していない場合，または環境変数CBLREPに指定したフォルダが存在しない場合

カレントフォルダ※にソースファイルと同じ名称のリポジトリファイルが存在する場合，そのリポジトリファイルが更新されます

カレントフォルダ※に，ソースファイルと同じ名称のリポジトリファイルが存在しない場合，カレントフォルダ※に，リポジトリファイルが新規に生成されます。

注※

この場合のカレントフォルダは，次のようになります。

ccbl2002コマンドを使用している場合

ccbl2002コマンドを起動したフォルダ

開発マネージャを使用している場合

プロジェクトの作業フォルダ

注意事項

-Repository,Supオプションを指定している場合，すでに存在するリポジトリファイルは，更新されません。詳細は，「34.5　リポジトリファイルの生成に関連するコンパイラオプション」を参照してください。

リポジトリファイルの生成に関連するコンパイラオプションを指定しないでコンパイルした場合，インタフェースの情報（シグニチャ）に変更がないときは，リポジトリファイルが更新されません。詳細は，「34.5　リポジトリファイルの生成に関連するコンパイラオプション」を参照してください。

34.2.4　リポジトリファイルの参照方法

リポジトリ段落に指定したクラス名，インタフェース名，または利用者定義関数名の情報は，コンパイル時に次の順序で検索されます。

同じソースファイル中に存在する翻訳単位のクラス名，インタフェース名，または利用者定義関数名

リポジトリファイル中のクラス名，インタフェース名，または利用者定義関数名

注意事項

リポジトリ段落に指定したプロパティ名の定義情報は，同じリポジトリ段落に指定したクラス定義やインタフェース定義に含まれるため，個別の定義情報は検索されません。

(1)　同じソースファイル中に存在する翻訳単位名の検索

COBOL2002コンパイラは，まず同じソースファイル中に存在する翻訳単位中で，リポジトリ段落に指定されたクラス名，インタフェース名，または利用者定義関数名を探します。

同じソースファイル中で，リポジトリ段落よりも後に参照するクラス名，インタフェース名，または利用者定義関数名を指定してもかまいません。また，リポジトリファイルに同じクラス名，インタフェース名，または利用者定義関数名が存在する場合でも，同じソースファイル中の翻訳単位名の情報が優先して使用されます。

図34‒3　同じソースファイル中の翻訳単位名の検索の例

クラス名を定義するクラス定義DRINKが，リポジトリ段落でのクラス名DRINKの宣言より後に出現してもかまいません。

同じソースファイル中にクラス名DRINKの情報があるため，リポジトリファイルは参照されません。

(2)　リポジトリファイルの検索

リポジトリファイルは，次の順序で検索されます。

環境変数CBLREPに指定したフォルダ

カレントフォルダ※

環境変数CBLSYSREPに指定したフォルダ

インストールフォルダ下のrepフォルダ

注※

この場合のカレントフォルダは，次のようになります。

ccbl2002コマンドを使用している場合

ccbl2002コマンドを起動したフォルダ

開発マネージャを使用している場合

プロジェクトの作業フォルダ

環境変数CBLREPには，リポジトリファイルの検索フォルダをカレントフォルダ以外の場所に指定したい場合に設定します。環境変数CBLSYSREPは，DLLとリポジトリファイルだけが提供されている場合など，生成元ソースファイルのないリポジトリファイルの検索フォルダを設定します。これらの環境変数の詳細については，「33.6　コンパイラ環境変数」を参照してください。

なお，標準クラスのBASEクラスは，「インストールフォルダ¥rep」のフォルダに格納されています。BASEクラスについては，「COBOL2002　言語　標準仕様編」　「12.2　BASEクラス」を参照してください。

翻訳単位名の検索時，同じフォルダに複数のリポジトリファイルが存在する場合，検索する翻訳単位名と同名のリポジトリファイルの中が検索され，見つからなければ，アルファベット順にリポジトリファイルが検索され，見つかった時点で検索が終了します。

検索したフォルダ下にリポジトリファイルがない場合や，リポジトリファイルに読み込み権限がない場合，リポジトリファイルが不当な場合は，コンパイル時にエラーメッセージが出力され，コンパイルが終了します。

34.3　リポジトリ段落を指定したソースファイルのコンパイル方法

異なるソースファイルで定義されたクラス名，インタフェース名，利用者定義関数名をリポジトリ段落に指定したソースファイルをコンパイルする場合，それらの定義を含むソースファイルを先にコンパイルしておく必要があります。

リポジトリ段落で参照するクラス定義，インタフェース定義，または関数定義のような翻訳単位を含むソースファイルを先にコンパイルしておく必要があります。ただし，開発マネージャを使用しているときは，構成するソースファイルをすべてプロジェクトに指定しておけば，開発マネージャがコンパイルする順番を自動的に決定するため，翻訳単位の参照関係によってソースファイルのコンパイル順を意識する必要はありません。

翻訳単位別にソースファイルをコンパイルする方法を，次に示します。

34.3.1　リポジトリ段落でほかの翻訳単位を参照する場合のコンパイル

リポジトリ段落でほかの翻訳単位を参照する場合，その翻訳単位を含む別のソースファイルを，先にコンパイルしておく必要があります。

例えば，次のように，ソースファイルPROGRAM1.cbl内のプログラム定義PROGRAM1で，リポジトリ段落に関数定義FUNC1を指定して参照する場合，FUNC1を含むソースファイルFUNC1.cblを先にコンパイルし，その後でソースファイルPROGRAM1.cblをコンパイルする必要があります。

この場合，次のようなコマンドを指定して，コンパイルします。

ccbl2002 FUNC1.cbl -Main,System PROGRAM1.cbl

ソースファイルでコンパイル順序を考慮したくない場合は，-Repository,Genオプションを使用して，コンパイルを実行する前にリポジトリファイルだけを先に生成しておく必要があります。-Repository,Genオプションの詳細については，「34.3.2　リポジトリファイルの単独生成」を参照してください。

34.3.2　リポジトリファイルの単独生成

ソースファイルのコンパイル時に-Repository,Genオプションを指定すると，ソースファイルのコンパイルが実行されないで，リポジトリファイルだけを作成できます。-Repository,Genオプションは，インタフェース部分だけを作成した翻訳単位を含むソースファイルをコンパイルしたり，互いに参照し合う翻訳単位をコンパイルしたりする場合に使用します。

ここでは，-Repository,Genオプションの使用方法について説明します。-Repository,Genオプションの指定方法や規則の詳細については，「33.　COBOLソースの作成とコンパイル」を参照してください。

(1)　インタフェース部分だけを作成した翻訳単位のコンパイル

翻訳単位が未完成であっても，そのインタフェース部分だけが決まっていれば，-Repository,Genオプションによってリポジトリファイルを作成できます。必要なリポジトリファイルを作成しておけば，リポジトリ段落に未完成の翻訳単位の名前を指定した原始プログラムでも，コンパイルできるようになります。この機能を利用すると，参照先の翻訳単位が未完成の状態でも，参照元の翻訳単位に-Compile,NoLinkオプションを指定してコンパイルを実行し，構文レベルの誤りがないか確認できます。

例えば，インタフェース部分だけが決まっているクラス定義CLASS1およびそれをリポジトリ段落に指定したプログラム定義PROGRAM1があり，それぞれCLASS1.cblファイルおよびPROGRAM1.cblファイルに格納されているとします。この場合は，次の手順でPROGRAM1.cblをコンパイルします。

CLASS1に対応するリポジトリファイルを生成する

「ccbl2002 -Repository,Gen CLASS1.cbl」と指定すると，CLASS1がインタフェース部分だけ作成されていても，リポジトリファイルCLASS1.repが作成されます。

CLASS1のリポジトリファイルの情報を取り込み，PROGRAM1をコンパイルする

「ccbl2002 PROGRAM1.cbl」と指定すると，1で作成したCLASS1.repがCOBOL2002コンパイラによって取り込まれ，PROGRAM1.cblがコンパイルされます。

(2)　互いに参照し合う翻訳単位のコンパイル

プログラム単位を除く翻訳単位が，リポジトリ段落に互いの翻訳単位名を指定して，互いに定義情報を参照しあうような場合は，まず-Repository,Genオプションによって必要なリポジトリファイルを作成しておき，次にそれぞれの翻訳単位をコンパイルしてください。

例えば，互いに参照しているクラス定義CLASS1およびCLASS2があり，それぞれCLASS1.cblファイルおよびCLASS2.cblファイルに格納されているとします。CLASS1.cbl，CLASS2.cblの順序でコンパイルしたい場合は，次の手順で互いのクラス定義をコンパイルします。

CLASS2に対応するリポジトリファイルを生成する

「ccbl2002 -Repository,Gen CLASS2.cbl」と指定すると，リポジトリファイルCLASS2.repが作成されます。

CLASS2のリポジトリファイルの情報を取り込み，CLASS1をコンパイルする

「ccbl2002 CLASS1.cbl」と指定すると，1で作成されたCLASS2.repがCOBOL2002コンパイラによって取り込まれ，CLASS1.cblがコンパイルされます。このとき，CLASS1のリポジトリファイルCLASS1.repが作成されます。

CLASS1のリポジトリファイルの情報を取り込み，CLASS2をコンパイルする

「ccbl2002 CLASS2.cbl」と指定すると，2で作成されたCLASS1.repがCOBOL2002コンパイラによって取り込まれ，CLASS2.cblがコンパイルされます。

注意事項

一つのソースファイル中でスタックコンパイルとして翻訳単位を複数定義し，その中で互いに参照する場合は，リポジトリファイルを先に作成する必要はなく，一度にコンパイルできます。

互いに参照し合う翻訳単位を含むソースファイルから別々のDLLを作成できません。

34.3.3　プログラム定義だけのコンパイル

プログラム定義だけで構成されているソースファイルをコンパイルする場合，リポジトリ段落を使用してほかのプログラム定義を参照しないため，特に順番を考慮しないでコンパイルできます。

34.4　リポジトリファイルの管理

34.4.1　外部リポジトリに関連したコンパイルエラー発生時の対処方法

この項では，外部リポジトリを使用したCOBOLプログラムをコンパイルしたときに出力されるコンパイルエラーの対処方法について，次のような場合に分けて説明します。

外部リポジトリに翻訳単位が見つからない場合

メソッドまたは利用者定義関数の定義情報が適合しない場合

インタフェースを実装，またはメソッドの上書きができない場合

(1)　外部リポジトリに翻訳単位が見つからない場合

リポジトリ段落に記述した参照先の翻訳単位の定義情報が外部リポジトリに見つからない場合，コンパイルエラーが出力されます。コンパイルリストを使った対処方法を次に説明します。

注意

外部リポジトリの検索手順は，「34.2.4　リポジトリファイルの参照方法」の「(2)　リポジトリファイルの検索」を参照してください。コンパイルリストについては，「付録E　コンパイルリスト」を参照してください。

図34‒4　参照元の翻訳単位を含むCOBOLプログラムのコンパイルリスト（外部リポジトリに翻訳単位が見つからない場合）

コンパイルリストで，?が付いた個所（上記の図の1.）の記述を参照し，翻訳単位の名称（CLS1），CLASS，INTERFACE，FUNCTION，およびPROPERTYの指定が正しいかを確認してください。

記述が誤っている場合は，COBOLプログラムの誤りを修正してください。

記述が正しい場合は，記述した翻訳単位を定義したCOBOLプログラムを先にコンパイルし，「34.2.4　リポジトリファイルの参照方法」の「(2)　リポジトリファイルの検索」に記載している検索対象のフォルダにリポジトリファイルを作成してください。

(2)　メソッドまたは利用者定義関数の定義情報が適合しない場合

INVOKE文や関数一意名で，呼び起こし対象のメソッドまたは利用者定義関数の定義情報が適合しない場合，コンパイルエラーが出力されます。コンパイルリストを使った対処方法を次に説明します。

呼び起こすメソッドを定義したクラス，または利用者定義関数が定義されたCOBOLプログラムを特定できる場合は，「(a)　COBOLプログラムを使った対処方法」に記載している手順でコンパイルエラーの要因を修正してください。COBOLプログラムが特定できない場合は，「(b)　リポジトリファイルを使った対処方法」に記載している手順でコンパイルエラーの要因を修正してください。

注意

適合チェックの詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「10.7　引数と返却項目の適合」を参照してください。コンパイルリストについては，「付録E　コンパイルリスト」を参照してください。

(a)　COBOLプログラムを使った対処方法

図34‒5　参照元の翻訳単位を含むCOBOLプログラムのコンパイルリスト（メソッドまたは利用者定義関数の定義情報が適合しない場合：その1）

コンパイルリストで，?が付いた個所（上記の図の1.）の記述を参照し，呼び起こすメソッドを定義したクラス，または利用者定義関数の名称（CLS1）を確認してください。

手順1.のクラスまたは利用者定義関数が定義されたCOBOLプログラムを参照し，定義情報を確認してください。

確認した定義情報を使ってCOBOLプログラムの誤りを修正してください。

(b)　リポジトリファイルを使った対処方法

図34‒6　参照元の翻訳単位を含むCOBOLプログラムのコンパイルリスト（メソッドまたは利用者定義関数の定義情報が適合しない場合：その2）

コンパイルリストで，?が付いた個所（上記の図の1.）の記述を参照し，呼び起こすメソッドを定義したクラス，または利用者定義関数の名称（CLS1）を確認してください。

手順1.のクラスまたは利用者定義関数の名称（CLS1）を，参照元のCOBOLプログラムで最初に定義した，リポジトリ段落の行番号6を確認してください（上記の図の2.）。

手順2.の行番号6を基に，参照しているリポジトリファイル名（C:¥users¥cobol2002¥CLASS1.rep）をコンパイルリストで確認してください（上記の図の3.）。

手順3.で確認したリポジトリファイル名（C:¥users¥cobol2002¥CLASS1.rep）から，リポジトリ管理ツールを使用して定義情報を出力してください。リポジトリ管理ツールの仕様については，「34.4.2　リポジトリ管理ツール」を参照してください。

リポジトリ管理ツールが出力した定義情報（次の図の1.）を使ってCOBOLプログラムの誤りを修正してください。リポジトリ管理ツールの出力例を次に示します。

図34‒7　リポジトリ管理ツールの出力例（メソッドまたは利用者定義関数の定義情報が適合しない場合：その3）

(3)　インタフェースを実装，またはメソッドの上書きができない場合

インタフェースを実装するとき，または継承したクラスのメソッドを上書きするとき，実装または上書きするメソッド原型（またはメソッド）がない，または適合しない場合は，コンパイルエラーが出力されます。

インタフェースを実装する場合を例に，コンパイルリストを使った対処方法を次に説明します。

実装するインタフェースが定義されたCOBOLプログラムを特定できる場合は，「(a)　COBOLプログラムを使った対処方法」に記載している手順でコンパイルエラーの要因を修正してください。COBOLプログラムが特定できない場合は，「(b)　リポジトリファイルを使った対処方法」に記載している手順でコンパイルエラーの要因を修正してください。

注意

適合チェックの詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「5.2.7　適合とインタフェース」を参照してください。コンパイルリストについては，「付録E　コンパイルリスト」を参照してください。

(a)　COBOLプログラムを使った対処方法

図34‒8　参照元の翻訳単位を含むCOBOLプログラムのコンパイルリスト（インタフェースを実装，またはメソッドの上書きができない場合：その1）

コンパイルリストで，?が付いた個所（上記の図の1.）の記述を参照し，実装するインタフェース名（INT1）を確認してください。

手順1.のインタフェース（INT1）が定義されたCOBOLプログラムを参照し，定義しているメソッド原型を確認してください。

確認したメソッド原型をすべて実装するようにCOBOLプログラムを修正してください。

(b)　リポジトリファイルを使った対処方法

図34‒9　参照元の翻訳単位を含むCOBOLプログラムのコンパイルリスト（インタフェースを実装，またはメソッドの上書きができない場合：その2）

コンパイルリストで，?が付いた個所（上記の図の1.）の記述を参照し，実装するインタフェースの名称（INT1）を確認してください。

手順1.のインタフェースの名称（INT1）を，参照元のCOBOLプログラムで最初に定義したリポジトリ段落の行番号6を確認してください（上記の図の1.）。

手順2.の行番号6を基に，参照しているリポジトリファイル名（C:¥users¥cobol2002¥INTERFACE1.rep）をコンパイルリストで確認してください（上記の図の2.）。

手順3.で確認したリポジトリファイル名（C:¥users¥cobol2002¥INTERFACE1.rep）から，リポジトリ管理ツールを使用して定義情報を出力してください。リポジトリ管理ツールの仕様については，「34.4.2　リポジトリ管理ツール」を参照してください。

リポジトリ管理ツールが出力した定義情報（次の図の1.）を使って，インタフェース（INT1）で定義されたすべてのメソッド原型を実装するようにCOBOLプログラムを修正してください。リポジトリ管理ツールの出力例を次に示します。

図34‒10　リポジトリ管理ツールの出力例（インタフェースを実装，またはメソッドの上書きができない場合：その3）

34.4.2　リポジトリ管理ツール

外部リポジトリに関連したコンパイルエラーが発生したとき，リポジトリファイルに格納された情報を確認すると，コンパイルエラーの原因を容易に特定できることがあります。

リポジトリ管理ツールは，リポジトリファイルに格納された翻訳単位の定義情報を出力できます。この項では，リポジトリ管理ツール（cbl2krepコマンド）の機能について説明します。

コンパイルエラー発生時の対処方法については，「34.4.1　外部リポジトリに関連したコンパイルエラー発生時の対処方法」を参照してください。

(1)　リポジトリ管理ツールの概要

リポジトリ管理ツールには，次に示す機能があります。

翻訳単位の情報の表示

オプション概略の一覧（ヘルプ機能）

(a)　形式

cbl2krep 〔リポジトリファイル名〕 … 〔オプション〕 …

リポジトリファイル名

リポジトリファイル名を指定します。ファイルの表示をするときは，指定した順序に従ってリポジトリファイルが処理されます。

オプション

リポジトリファイルをどのように処理するかを指定するオプションです。次のオプションを指定できます。

-list -help

オプションの詳細については，「(2)　リポジトリ管理ツールの機能詳細」を参照してください。

リポジトリファイル名およびオプションの指定を省略した場合，リポジトリ管理ツールの指定形式を出力します。

(b)　終了コード

リポジトリ管理ツールの終了コードを次の表に示します。

表34‒1　リポジトリ管理ツールの終了コード

終了コード

意味

0

正常終了

1

エラーが発生

2

回復不能エラーが発生

(c)　注意事項

リポジトリ管理ツールを使用するときの注意事項を次に示します。

リポジトリファイル名は，.repを付けて指定する必要があります。

複数のオペランドを指定する場合は，各オペランドを空白またはタブで区切ります。

複数のリポジトリファイル名を指定できる個所には，ワイルドカード（*）が使用できます。

-helpオプションを指定した場合，そのほかのオプションやリポジトリファイル名の指定は無視されます。

オプションで使用する文字は，英大文字と英小文字は等価とみなされます。

リポジトリファイル名，および翻訳単位名で使用する文字は，英大文字と英小文字が等価とみなされます。

(2)　リポジトリ管理ツールの機能詳細

(a)　翻訳単位情報の表示

形式

cbl2krep リポジトリファイル名1 … -list

機能

指定したリポジトリファイル中の翻訳単位の情報を標準出力に出力します。ただし，標準出力に出力されるのは，指定したリポジトリファイル内の定義情報だけです。継承したクラスやインタフェースのプロパティ情報，およびメソッド情報は出力されません。

オペランド

リポジトリファイル名1

表示したいリポジトリファイルを指定します。

-list

リポジトリファイル中の翻訳単位の情報を標準出力に出力します。

-listオプションを指定したときに出力されるクラス定義の翻訳単位情報の内容を次の図に，関数定義の翻訳単位情報の表示を「図34‒12　-listオプションを指定したときに出力される関数定義の翻訳単位情報の内容」に示します。

図34‒11　-listオプションを指定したときに出力されるクラス定義の翻訳単位情報の内容

リポジトリファイルヘッダ情報

リポジトリファイル名，リポジトリファイルの生成時刻（YYYY-MM-DD 年-月-日，HH:MM:SS 時:分:秒），およびリポジトリファイルを生成したコンパイラ名（バージョン（VV-RR）を含む）が表示されます。コンパイラ名の（X）は，COBOL2002の識別記号を示します。詳細は「付録M.2　このマニュアルでの表記」を参照してください。リポジトリファイル名はコマンドラインに指定した名前で表示されます。

生成時刻

リポジトリファイル内の翻訳単位情報の生成時刻（YYYY-MM-DD 年-月-日，HH:MM:SS 時:分:秒）が表示されます。

継承クラス・インタフェース情報

リポジトリ段落に指定した翻訳単位名のうち，INHERITS句に指定したクラス名およびインタフェース名が出力されます。括弧内には，翻訳単位の種別が出力されます。

参照翻訳単位情報

リポジトリ段落に指定した翻訳単位名のうち，INHERITS句に指定していない翻訳単位名が出力されます。括弧内には，翻訳単位の種別が出力されます。

プロパティ情報

クラス定義に指定したオブジェクトプロパティの情報（プロパティ名，参照（GET）／更新（SET）種別，データの属性情報）が出力されます。プロパティ情報は，ファクトリオブジェクトとインスタンスオブジェクトとで別々に出力されます。出力される項目がない場合は，「None」が出力されます。出力される属性情報については，「属性情報の詳細」に示します。

メソッド情報

クラス定義に指定したメソッドの情報（メソッド名，引数／返却項目の情報）が出力されます。メソッド情報は，ファクトリオブジェクトとインスタンスオブジェクトとで別々に出力されます。出力される項目がない場合は，「None」が出力されます。

図34‒12　-listオプションを指定したときに出力される関数定義の翻訳単位情報の内容

リポジトリファイルヘッダ情報

リポジトリファイル名，リポジトリファイルの生成時刻（YYYY-MM-DD 年-月-日，HH:MM:SS 時:分:秒），およびリポジトリファイルを生成したコンパイラ名（バージョン（VV-RR）を含む）が表示されます。コンパイラ名の（X）は，COBOL2002の識別記号を示します。詳細は「付録M.2　このマニュアルでの表記」を参照してください。リポジトリファイル名はコマンドラインに指定した名前で表示されます。

参照翻訳単位情報

リポジトリ段落に指定した翻訳単位名が出力されます。括弧内には，翻訳単位の種別が出力されます。

関数情報

関数定義の情報（関数名，引数／返却項目の情報）が出力されます。

属性情報の詳細

データ項目の種類と出力される属性情報または引数／返却項目の情報の対応を次の表に示します。

表34‒2　データ項目の種類と属性情報または引数／返却項目の情報

データ項目の種類

出力される属性情報または引数／返却項目の情報

固定長集団項目

−

可変長集団項目

−

日本語集団項目

GROUP-USAGE NATIONAL

数字編集項目

−

英数字編集項目

−

日本語編集項目

−

外部10進項目

USAGE DISPLAY

ただし，SIGN句の属性情報がある場合，SIGN句の属性情報に従って次のどれかが表示されます。

USAGE DISPLAY SIGN IS LEADING

USAGE DISPLAY SIGN IS LEADING SEPARATE

USAGE DISPLAY SIGN IS TRAILING SEPARATE

内部10進項目

USAGE COMP-3

外部浮動小数点項目

USAGE DISPLAY

内部浮動小数点項目

USAGE COMP-1

USAGE COMP-2

アドレスデータ項目／ポインタ項目

USAGE ADDRESS

指標データ項目

USAGE INDEX

2進項目

USAGE COMP

USAGE COMP-5

USAGE COMP-X

ブール項目

USAGE BIT

USAGE DISPLAY

英字／英数字項目

USAGE DISPLAY

日本語項目

USAGE NATIONAL

オブジェクト参照データ項目

OBJECT REFERENCE

（インタフェース名／[FACTORY OF] ACTIVE CLASS／[FACTORY OF] クラス名 [ONLY] 指定ありの場合，その指定も出力されます）

（凡例）

−：属性情報なし

(b)　オプション概略の一覧

形式

cbl2krep -help

機能

オプションの概略を一覧表示します。

(3)　リポジトリ管理ツール使用時のエラーメッセージ

(a)　エラーメッセージの形式

リポジトリ管理ツールが出力するメッセージの形式を，次に示します。

形式

cbl2krep : error エラー番号: メッセージ内容

このマニュアルでは，リポジトリ管理ツールが出力するエラーメッセージを，次の形式で記載します。

エラー番号

メッセージ内容

（要因）

エラーが返される要因を示す。

（S）

システムの処置を示す。

（P）

プログラム作成者の処置を示す。

エラーメッセージの内容を次に示します。

(b)　エラーメッセージの内容

リポジトリ管理ツールが出力するメッセージのエラー番号およびメッセージ内容を，次に示します。

0001

ファイル‘******’はオープンできません。

0002

ファイル‘******’の読み込みでI/Oエラーが発生しました。

0003

ファイル‘******’の書き込みでI/Oエラーが発生しました。

（要因）

リポジトリファイルの書き込みでI/Oエラーが発生した。次の要因が考えられる。

カレントフォルダがネットワークフォルダのとき，ネットワーク障害が発生している。

ディスクの空きがない。または，ディスク障害が発生している。

（S）

cbl2krepの実行を中止する。

（P）

何度かコンパイルを試みる。

コンピュータの管理者に問い合わせる。

0004

ファイル‘******’はリポジトリファイルではありません。

0005

リポジトリファイル‘******’は，対象マシンが異なるので参照できません。

0006

リポジトリファイル‘******’は壊れています。

0007

‘******’という名前の翻訳単位はリポジトリに存在しません。

0008

‘******’という名前の翻訳単位が複数のリポジトリに存在します。

0009

論理番号‘******’で論理エラーが発生しました。

（要因）

cbl2krepの実行で，内部的に論理エラーが発生した。

（S）

cbl2krepの実行を中止する。

（P）

当社保守員に連絡する。

0010

メモリ不足で続行できません。

（要因）

cbl2krepが稼働するメモリが足りない。

（S）

cbl2krepの実行を中止する。

（P）

削除できる資源を削除して再実行する。

0011

不正なオプション‘******’が指定されています。

0012

オプション‘******’にパラメタがありません。

0013

オプション‘******’が長すぎます。

0014

このバージョンのcbl2krepではリポジトリファイル‘******’はアクセスできません。

0017

‘******’という名前のクラスはリポジトリファイルに存在しません。

0018

‘******’という名前のインタフェースはリポジトリファイルに存在しません。

0019

オプション‘******’にパラメタは指定できません。

0020

リポジトリファイルが指定されていません。

0023

他のプログラムでシステムの制限までファイルをオープンしているので，cbl2krepでファイルをオープンすることができません。

（要因）

ほかのプログラムで，システムの制限までファイルを開いている。

（S）

cbl2krepの実行を中止する。

（P）

ほかのプログラムで使用しているファイルを閉じる。

0025

ファイル‘******’は存在しません。

34.5　リポジトリファイルの生成に関連するコンパイラオプション

リポジトリファイルの生成に関連するコンパイラオプションについて説明します。

-Repository,Genオプション

-Repository,Genオプションを指定した場合，ソースファイルからオブジェクトファイルを生成しないで，リポジトリファイルだけを生成します。詳細は，「34.3.2　リポジトリファイルの単独生成」を参照してください。

-Repository,Supオプション

-Repository,Supオプションを指定した場合，コンパイル時にリポジトリファイルが更新されません。ただし，リポジトリファイルが存在しない場合は，-Repository,Supオプションの指定に関係なく，リポジトリファイルが新規に生成されます。

-Repository,Supオプションを指定した場合は，コンパイルによってオブジェクトファイルが生成されます。

-RepositoryCheckオプション

-RepositoryCheckオプションを指定した場合，同じソースファイル中の翻訳単位の定義とリポジトリファイル中の情報に相違があるとき，コンパイル時にKCCC3301C-Wの警告メッセージが出力されます。このとき，リポジトリファイルは更新されません。

-RepositoryCheckオプションによって警告メッセージが出力される例を，次に示します。

-RepositoryCheckオプションを指定した場合，FILE1.cblのクラスDRINKの定義情報と，FILE1.repのクラスDRINKの情報に相違があるため，警告メッセージが出力されます。

このとき，FILE1.repは更新されません。

おのおののコンパイラオプションを指定した場合，コンパイル時にリポジトリファイルが更新されるかどうかを，次に示します。

指定するコンパイラオプション

インタフェースの情報（シグニチャ）に変更あり

インタフェースの情報（シグニチャ）に変更なし

オプションなし

○

×

-Repository,Genオプションを指定

○

○

-Repository,Supオプションを指定

×

×

-RepositoryCheckオプションを指定

×

×

（凡例）

○：リポジトリファイルが更新される

×：リポジトリファイルが更新されない

35　実行可能ファイルとDLLの作成

この章では，プログラムをコンパイルして作成したオブジェクトファイルをリンクして，実行可能ファイルやDLLを作成する方法について説明します。

35.1　実行可能ファイルの作成方法

実行可能ファイルとは，一つ以上のプログラムによって構成され，制御プログラムから直接呼び出して実行できるファイルのことです。

ここでは，ccbl2002コマンドを使って，COBOLプログラムから実行可能ファイルを作成したり，Cプログラムのオブジェクトファイルなどとリンクする方法について，説明します。

35.1.1　コンパイルとリンクを同時に実行する方法

ccbl2002コマンドを使用すると，COBOLプログラムのコンパイルとリンクを同時に実行して，実行可能ファイルを生成できます。

ccbl2002コマンドの詳細については，「33.　COBOLソースの作成とコンパイル」を参照してください。

ccbl2002コマンドを使って実行可能ファイルを生成する例を，次に示します。

(1)　一つのCOBOLプログラムから実行可能ファイルを生成する

一つのCOBOLプログラムをコンパイル，リンクして実行可能ファイルを生成する例を，次に示します。

ソースファイル名称：test01.cbl

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST01.
                :
       PROCEDURE DIVISION.
                :
           STOP RUN.

ccbl2002コマンドの指定

COBOLプログラム"test01.cbl"に-Main,Systemオプションを指定し，実行可能ファイル名称に"test02.exe"を指定します。

ccbl2002 -Main,System test01.cbl -OutputFile test02.exe

上記のコマンドを実行すると，実行可能ファイル"test02.exe"が生成されます。

(2)　複数のCOBOLプログラムから実行可能ファイルを生成する

複数のCOBOLプログラムをコンパイル，リンクして実行可能ファイルを生成する例を，次に示します。

ccbl2002コマンドの指定

主プログラムである"test01.cbl"に-Main,Systemオプションを指定し，副プログラムである"test02.cbl"には何も指定しないでccbl2002コマンドを実行します。

ccbl2002 -Main,System test01.cbl test02.cbl -OutputFile test03.exe

上記のコマンドを実行すると，実行可能ファイル"test03.exe"が生成されます。

(3)　COBOLプログラムとCプログラムの混在した実行可能ファイルを生成する

COBOLプログラムとCプログラムが混在する実行可能ファイルを作成する場合，CプログラムをあらかじめCコンパイラでコンパイルし，オブジェクトファイルを生成しておく必要があります。

ccbl2002コマンドの指定

COBOLプログラム"test01.cbl"と，あらかじめ作成しておいたCプログラムのオブジェクトファイル"test02.obj"を指定します。

ccbl2002 -Main,System test01.cbl test02.obj -OutputFile test03.exe

(4)　COBOLプログラムと標準ライブラリをリンクして実行可能ファイルを生成する

標準ライブラリとは，オブジェクトファイルから構成され，ライブラリ管理ツールLIBによって作成されたライブラリです。標準ライブラリを使用すると，複数のオブジェクトファイルを一つにまとめて管理できます。

ライブラリ管理ツールLIBについては「38.2　ライブラリ管理ツール」を参照してください。

ccbl2002コマンドを使って，オブジェクトファイルのリンクと同様に標準ライブラリをリンクできます。

標準ライブラリを使用した実行可能プログラムを作成する例を次に示します。

この場合，ccbl2002コマンドで標準ライブラリに取り込みたいCOBOLプログラムのオブジェクトファイル（.obj）を生成しておき，libコマンドで標準ライブラリとしてリンクします。そのあと，ccbl2002コマンドで実行可能ファイル（main1.exe）を生成します。

ccbl2002 SAMPLE1.cbl -Compile,NoLink
ccbl2002 SAMPLE2.cbl -Compile,NoLink
ccbl2002 SAMPLE3.cbl -Compile,NoLink
lib SAMPLE1.obj SAMPLE2.obj SAMPLE3.obj /OUT:SAMPLE.lib
ccbl2002 -Main,System MAIN1.cbl SAMPLE.lib -OutputFile main1.exe

なお，開発マネージャを使用して標準ライブラリをリンクすることもできます。この場合は，次の手順で実行可能ファイルを作成してください。

開発マネージャの標準ライブラリのプロジェクトを作成する。

1.で作成したプロジェクトをビルドする。

開発マネージャで実行可能ファイルのプロジェクトを作成する。

2.で生成された標準ライブラリをオプションの「ライブラリの指定」または「ソースファイルの追加」でプロジェクトに追加する。

4で作成したプロジェクトをビルドする。

標準ライブラリをリンクした実行可能ファイルが作成されます。

なお，開発マネージャの操作方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

使用する機能によって必要となるライブラリ

標準ライブラリを構成するソースが次の機能を使用している場合，標準ライブラリをリンクしている実行可能プログラムのリンク時に，関連するライブラリを指定する必要があります。ただし，開発マネージャで作成した標準ライブラリをリンクする場合は，これらのライブラリを指定する必要はありません。

機能

ライブラリ

OLE2オートメーション機能を使用していて，-TDInfオプションを指定した場合

cbl2kgul.lib

整列併合機能を使用する場合

libmsort.lib（Windows(x86) COBOL2002の場合）

libnsort64.lib（Windows(x64) COBOL2002の場合）

COBOL85 Version 4.0以前の整列併合機能を使っているオブジェクトファイルがある場合

libnsort.lib※

通信節での画面データの送受信・帳票データの送信機能を使用する場合（XMAP3）

x3mwdr32.lib（Windows(x86) COBOL2002の場合）

x3mwdr64.lib（Windows(x64) COBOL2002の場合）

-XMAP,LinePrint（XMAP3での書式印刷機能）オプションを指定した場合

x3klib32.lib※

-CompatiM7（MIOS7 COBOL85互換）オプションを指定した場合

jcm7lib.lib※

データコミュニケーション機能を使用していて，-OpenTP1オプションを指定した場合

libmcf.lib

注※

Windows(x86) COBOL2002で有効です。

35.1.2　コンパイルとリンクを別々に実行する方法

COBOLプログラムが複数ある場合，あらかじめccbl2002コマンドでオブジェクトファイルを作成しておき，そのあとccbl2002コマンドやLINKコマンドでオブジェクトファイルをリンクして実行可能ファイルを生成できます。

(1)　ccbl2002コマンドによるリンク方法

ccbl2002コマンドでコンパイルとリンクを別々に実行する方法を，次に示します。

ccbl2002コマンドの指定

まず，COBOLプログラム"test01.cbl"および"test02.cbl"をコンパイルし，オブジェクトファイルを生成します。コンパイルだけを実行し，リンクを実行しない場合は，ccbl2002コマンドに-Compile,NoLinkオプションを指定します。

ccbl2002 -Main,System test01.cbl -Compile,NoLink
ccbl2002 test02.cbl -Compile,NoLink

次に，生成された"test01.obj"および"test02.obj"をccbl2002コマンドを使用してリンクします。

ccbl2002 test01.obj test02.obj -OutputFile test03.exe

上記のコマンドを実行すると，実行可能ファイル"test03.exe"が生成されます。

(2)　LINKコマンドによるリンク方法

ccbl2002コマンドでCOBOLプログラムからCOBOLオブジェクトファイルを生成したあと，リンカを使用することで実行可能ファイルを作成できます。

リンクの方法を以下に示します。

LINKコマンドを実行する。

次にマニフェストを埋め込む。

リンカについては，「38.1　リンカ」を参照してください。LINKコマンドの実行については，「35.1.2　コンパイルとリンクを別々に実行する方法」の「(2)　LINKコマンドによるリンク方法」の「(a)　LINKコマンドの指定」を参照してください。

マニフェストの埋め込みについては，「35.1.2　コンパイルとリンクを別々に実行する方法」の「(2)　LINKコマンドによるリンク方法」の「(b)　マニフェストの埋め込み方法」を参照してください。

(a)　LINKコマンドの指定

リンカを使用して，COBOLプログラムを含む実行可能ファイルおよびDLLを作成するときは，リンカの引数に次のライブラリを指定する必要があります。

必須ライブラリ

GUIモードの実行可能ファイルを作成する場合

cbl2k_32.lib

cbl2klg.lib

msvcrt.lib

kernel32.lib

vcruntime.lib

ucrt.lib

CUIモードの実行可能ファイルを作成する場合

cbl2k_32.lib

cbl2klc.lib

msvcrt.lib

kernel32.lib

vcruntime.lib

ucrt.lib

DLLを作成する場合

cbl2k_32.lib

cbl2kdl.lib

msvcrt.lib

kernel32.lib

vcruntime.lib

ucrt.lib

使用する機能によって必要となるライブラリ

COBOLプログラムで使用する機能によって，リンク時に，関連するライブラリを指定する必要があります。

使用する機能とライブラリについては，「35.1.1　コンパイルとリンクを同時に実行する方法」の「(4)　COBOLプログラムと標準ライブラリをリンクして実行可能ファイルを生成する」を参照してください。

LINKコマンドに指定する引数

LINKコマンドに必要なパラメタを指定する場合，次のパラメタは必ず指定しなければなりません。

GUIモードの実行可能ファイルを作成の場合

/ENTRY:WinMainCRTStartup

/NODEFAULTLIB

CUIモードの実行可能ファイルを作成の場合

/ENTRY:mainCRTStartup

/NODEFAULTLIB

DLLを作成の場合（Windows(x86) COBOL2002の場合）

/ENTRY:_DllMainCRTStartup@12

/NODEFAULTLIB

DLLを作成の場合（Windows(x64) COBOL2002の場合）

/ENTRY:_DllMainCRTStartup

/SUBSYSTEM:{CONSOLE|WINDOWS}

/NODEFAULTLIB

LINKコマンドの引数には，/NODEFAULTLIBを指定してください。

これによる，次に示す/DEFAULTLIBオプションの扱いについて説明します。

/DEFAULTLIB:kernel32.lib

/DEFAULTLIB:uuid.lib

/DEFAULTLIB:MSVCRT

/DEFAULTLIB:OLDNAMES

kernel32.libがライブラリの検索対象から除外されますが，kernel32.libは明示的にリンクされるので，リンケージの結果に影響はありません。

/NODEFAULTLIB:oldnames.libを指定した場合，oldnames.libの指定（/DEFAULTLIB:oldnames.lib）だけが無効になります。kernel32.lib，uuid.lib，およびmsvcrt.libは，COBOL2002の環境に含まれるため，リンケージは正常に終了します。

COBOL2002では，LINKコマンド（LINK.exe）の実行時のパラメタを取得しません。/VERBOSEオプションを指定すると，リンカの進行状況を確認できます。

使用例

上記の場合，次の手順で実行可能ファイルを作成します。

ccbl2002コマンドで，test01.cblからtest01.objを生成します。

　ccbl2002 -Compile,NoLink -Main,System test01.cbl

Cコンパイラで，test02.cからtest02.objを生成します。

リンカで，GUIモードの実行可能ファイルを生成します。

　LINK TEST01.obj TEST02.obj cbl2k_32.lib cbl2klg.lib

　　　　　　　　　　　　　　/out:TEST01.exe

　　　　　　　　　　　　　　/ENTRY:WinMainCRTStartup

　　　　　　　　　　　　　　msvcrt.lib kernel32.lib

　　　　　　　　　　　　　　vcruntime.lib ucrt.lib

(b)　マニフェストの埋め込み方法

LINKコマンドを実行すると，使用するC実行時ライブラリのバージョンやリンカオプションの指定によって，実行可能ファイル（.exe），またはDLLファイル（.dll）のほかにマニフェストファイル（.manifest）が生成されることがあります。マニフェストファイルには，使用するC実行時ライブラリの情報やUAC情報などが登録されていて，プログラムを実行する場合に必要です。

生成されたマニフェストファイルの情報（マニフェスト）は，MTコマンドを使用して，対応する実行可能ファイル，またはDLLファイル中に埋め込んで使用してください。埋め込まれていない場合，プログラム実行時にC実行時ライブラリのローディングエラーになることがあります。

MTコマンドの使用例を以下に示します。

MTコマンドに指定するパラメタ

MTコマンドを使用してマニフェストを埋め込む場合，以下のパラメタを指定します。

-manifest マニフェストファイル名
-outputresource:出力ファイル名[;[#]リソースID]

出力ファイル名

実行可能ファイル名，またはDLLファイル名を指定します。

リソースID

リソースが実行可能ファイルの場合：１

リソースがDLLファイルの場合：2

なお，リソースIDの指定を省略した場合は1が仮定されます。

MTコマンドの使用例

実行可能ファイルの場合

LINKコマンドを使用して実行可能ファイルTEST01.exeを生成した場合，マニフェストファイルTEST01.exe.manifestが生成されます。TEST01.exe中にマニフェストを埋め込む場合のコマンド例を，以下に示します。

MT -manifest TEST01.exe.manifest -outputresource:TEST01.exe;#1

DLLファイルの場合

LINKコマンドを使用してDLLファイルDLLSUB.dllを生成した場合，マニフェストファイルDLLSUB.dll.manifestが生成されます。DLLSUB.dll中にマニフェストを埋め込む場合のコマンド例を，以下に示します。

MT -manifest DLLSUB.dll.manifest -outputresource:DLLSUB.dll;#2

35.1.3　コンパイルとリンクを実行する場合の注意事項

コンパイルとリンクを同時に実行する場合，および別々に実行する場合の注意事項について説明します。

(1)　COBOLプログラムとCプログラムをリンクする場合の注意事項

COBOLプログラムとCプログラムをリンクする場合は，C実行時ライブラリに，マルチスレッドに対応したダイナミックリンクライブラリを使用する必要があります。

(2)　標準ライブラリを使用する場合の注意事項

次のオプションを使用する場合で，ccbl2002コマンドで実行可能ファイルを作成する場合は，実行可能ファイルと標準ライブラリ作成時に，同じオプションを指定する必要があります。

-XMAP,LinePrint（Windows(x86) COBOL2002の場合），-CompatiM7（Windows(x86) COBOL2002の場合），-OpenTP1（データコミュニケーション機能の使用と同時に使用する場合）

テストデバッガ，カバレージを使用する場合は，実行可能ファイルと標準ライブラリのプログラム情報ファイルが共に参照できるようにする必要があります。プログラム情報ファイルの出力先の詳細については，マニュアル「COBOL2002　操作ガイド」のテストデバッガで使用するファイルの説明を参照してください。

実行可能プログラムを作成する場合，標準ライブラリに含まれているプログラムを，すべて動的リンクで呼び出している場合は，標準ライブラリを指定してもリンクできません。

(3)　オブジェクトファイルを別環境でリンクする場合の注意事項

COBOLプログラムのオブジェクトファイルをコピーして，別環境でリンクする場合，オブジェクトファイルだけでなく，EXPORT名称ファイル（.cbd）もコピーする必要があります。

COBOLプログラムのオブジェクトファイルを用いて別環境でリンクする場合で，オブジェクトファイルの生成時に次のオプションを指定したときは，リンク時にも同じオプションを指定する必要があります。

-XMAP,LinePrint（Windows(x86) COBOL2002の場合），-CompatiM7（Windows(x86) COBOL2002の場合），-OpenTP1（データコミュニケーション機能の使用と同時に使用する場合）

(4)　マニフェストのUAC情報を変更する場合の注意事項

ccbl2002コマンドを使用して実行可能ファイルを作成するとき，COBOL2002コンパイラは埋め込むマニフェストにUAC情報を指定するセクションを挿入します。既定のアクセス許可レベルはasInvokerです。このアクセス許可レベルを変更したいときは，-Linkコンパイラオプションに-MANIFESTUACリンカオプションを指定してアクセス許可レベルの値を設定してください。-MANIFESTUACリンカオプションの詳細については，「38.1.3　オプション」の「(14)　-MANIFESTUAC〔:｛NO｜UACフラグメント｝〕」を参照してください。

管理者のアクセス許可レベルで実行するように指定する例を次に示します。

ccbl2002 -Main,System TEST01.cbl -OutputFile TEST02.exe
-Link -MANIFESTUAC:level='requireAdministrator'

(5)　ccbl2002コマンドによるリンク時にエラーが発生した場合

ccbl2002コマンドまたはccblコマンドから呼び出すLINKコマンドやMTコマンドは，出力ファイルがOSやウィルスチェッカなどから一時的に共有されることが原因で，エラーになることがあります。この場合，時間をおいて再コンパイルしてください。時間をおいても問題が解決しないときは，次のどちらかの方法で対処してください。

環境変数CBLLINKINTERVALで，対象ファイルへのアクセス間隔を変更した状態にして再コンパイルしてください。なお，環境変数CBLLINKINTERVALについては，「33.6.3　コンパイラ環境変数の詳細」の「(12)　CBLLINKINTERVAL」を参照してください。

ccbl2002コマンドに-ManifestFileExtオプションを指定して，マニフェストの埋め込みを抑止した状態で再コンパイルしてください。なお，-ManifestFileExtオプションについては，「33.5.10　リンクの設定」の「(13)　-ManifestFileExtオプション」を参照してください。

(6)　実行可能ファイル，DLLファイルの名称の注意事項

実行可能ファイル，またはDLLファイルの名称に「;」および「@」は指定しないでください。作成する実行可能ファイル，またはDLLファイルの名称に「;」および「@」が含まれていると，MTコマンドでエラーとなりマニフェストの埋め込みに失敗します。

35.2　DLLの作成方法

35.2.1　DLLの作成

DLL（ダイナミックリンクライブラリ）とは，副プログラムだけで構成され，実行可能ファイル中のプログラムから呼ばれることで実行できるファイルのことです。ここでは，拡張子が（.dll）のファイルをDLLと呼びます。

DLLを作成する方法は，実行可能ファイルの生成と同じです。ここでは，DLLの作成方法のうち，実行可能ファイルの生成と異なる部分について説明します。

なお，Windows(x64) COBOL2002の場合は「-Dll,Stdcall」と「Dll,Cdecl」を「-Dll」に読み替えてください。

(1)　DLLを作成する

ccbl2002コマンドでCOBOLプログラムからDLLを作成する場合は，-Dll,Stdcallまたは-Dll,Cdeclオプションを指定します。コンパイルとリンクを別々にccbl2002コマンドでする場合は，コンパイル時，リンク時共に-Dll,Stdcallまたは-Dll,Cdeclオプションを指定します。

次に，DLLを作成する例を示します。

ソースファイル名称：TEST02.CBL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST02.
       PROCEDURE DIVISION.
           DISPLAY '--- TEST02  START ---'.
           DISPLAY '--- TEST02    END ---'.

ccbl2002コマンドの指定

COBOLプログラム"test02.cbl"と-Dll,Stdcallまたは-Dll,Cdeclオプションを指定し，-OutputFileオプションにDLL名称"test02.dll"を指定します。

ccbl2002 -Dll,Stdcall test02.cbl -OutputFile test02.dll

上記のコマンドを実行すると，DLLファイル"test02.dll"が生成されます。

注意事項

見出し部にINITIAL句がないプログラムに対して-Dll,Stdcallまたは-Dll,Cdeclオプションだけを指定した場合，生成されるDLLは，初期化属性を持ちません。このため，DLLが繰り返し呼び出されても，次の情報が初期状態に戻されないで，前の状態を保持します。

（情報が保持される項目）

プログラムに関連するファイルや報告書の状態・画面節（SCREEN SECTION），画面節（WINDOW SECTION），通信節，サブスキーマ節で使用された資源の状態

作業場所節，報告書節，画面節（SCREEN SECTION），画面節（WINDOW SECTION），ファイル節，サブスキーマ節，通信節の内容

PERFORM文に対する制御機構

ALTER文で設定したGO TO文

-Dll,Stdcallまたは-Dll,Cdeclオプションを指定してコンパイルするプログラム中でEXTERNAL句を使用する場合，DYNAMIC指定のEXTERNAL句だけが使用できます。

(2)　呼び出し時にDLLを初期化する

ccbl2002コマンドに，-Dll,Stdcallまたは-Dll,Cdeclオプションと合わせて，-DllInitオプションを指定すると，生成されたDLLは初期化属性プログラムとなり，そのDLLが呼び出されるたびに，次の情報が初期状態に戻されます。

初期化属性のプログラムの詳細については，「18.4.1　プログラム属性」を参照してください。

(3)　注意事項

LINKコマンドを使用してDLLファイルを作成する場合，DLLファイルにLINKコマンドが生成したマニフェストファイルを埋め込む必要があります。

詳細は，「35.1.2　コンパイルとリンクを別々に実行する方法」の「(2)　LINKコマンドによるリンク方法」を参照してください。

Windows(x86) COBOL2002の場合，STDCALL呼び出し規約のCプログラムを動的なリンクで呼び出したいときは，プログラム名は装飾名を付けてエクスポートする必要があります。エクスポートには次の方法があります。

LINKコマンドの/DEFオプションにモジュール定義ファイル（defファイル）を指定する

LINKコマンドの/EXPORTオプションを指定する

Cソースファイル内でエクスポートすることを明示する

STDCALL呼び出し規約のプログラム名の装飾やプログラムのエクスポートについては，MSDN（Microsoft Developer Network）などのドキュメントを参照してください。なお，COBOLプログラムの場合，COBOLコンパイラがプログラム名でエクスポートするため，リンク時に明示する必要はありません。

35.3　DLLを呼び出す実行可能ファイルの作成方法

DLLを呼び出す実行可能ファイルを作成するときに必要なインポートライブラリ，および-StdCallオプションとstdcall呼び出し指示ファイル（.cbw）について説明します。

35.3.1　インポートライブラリの指定

DLLを呼び出すプログラムから実行可能ファイルを生成する場合，静的なリンクでDLLを呼び出すには，ccbl2002コマンドにインポートライブラリを指定する必要があります。

なお，Windows(x64) COBOL2002の場合は「-Dll,Stdcall」と「Dll,Cdecl」を「-Dll」に読み替えてください。

DLLの呼び出しについては，「18.6　DLLに含まれるプログラムの呼び出し」を参照してください。

(1)　静的なリンクの場合

静的にリンクする実行可能ファイルを作成する場合は，ccbl2002コマンドにインポートライブラリを指定します。

ccbl2002コマンドの指定例を，次に示します。

使用例

ccbl2002コマンドの指定

ccbl2002コマンドで-Dll,Stdcallまたは-Dll,Cdeclオプションを指定して，"test02.cbl"に対するDLL "test02.dll"を生成します。このとき，インポートライブラリ"test02.lib"も同時に生成されます。

ccbl2002 -Dll,Stdcall test02.cbl -OutputFile test02.dll

主プログラム"test01.cbl"に対し-Main,Systemオプションを指定し，"test02.dll"作成時に生成されたインポートライブラリ"test02.lib"を指定します。

ccbl2002 -Main,System test01.cbl test02.lib -OutputFile test03.exe

上記のコマンドを実行すると，DLLファイル"test02.dll"に静的にリンクする実行可能ファイル"test03.exe"が生成されます。

(2)　動的なリンクの場合

動的なリンクで実行可能ファイルを作成する場合には，インポートライブラリは必要ありません。

(3)　DLLからほかのDLLを呼び出す場合

DLLからほかのDLLを呼び出す場合も，実行可能ファイルと同様に，静的リンクの場合は呼び出し元プログラムのインポートライブラリをすべて指定する必要があります。また，動的リンクの場合はインポートライブラリの指定は不要です。

35.3.2　-StdCallオプションとstdcall呼び出し指示ファイル（Windows(x86) COBOL2002で有効）

stdcall呼び出し規約のプログラムを呼び出す場合，呼び出す側の呼び出し規約もstdcallにする必要があります。呼び出すプログラム側で呼び出し規約をstdcallにするには，COBOLソース中に指定する方法（CALL-CONVENTION句）と，stdcall呼び出し指示ファイルを使用する方法の2種類があります。

呼び出し属性をCOBOLソース中に指定する方法

呼び出し規約をCOBOLソース中に指定する方法です。環境部のEXTERNAL-PROGRAM SECTIONのCALL-CONVENTION段落で指定します。

指定方法の詳細については，マニュアル「COBOL2002　言語　拡張仕様編」　「25.2.1　プログラム間連絡機能の環境部」，および「18.4.2　呼び出し規約を参照してください。

呼び出し属性をstdcall呼び出し指示ファイルで指定する方法

stdcall呼び出し指示ファイル（.cbw）は，COBOLプログラムからstdcall呼び出し規約で呼び出すDLLのプログラム名を登録しておくためのファイルです。このファイル中に記述したプログラムは，COBOLプログラムからstdcall規約で呼び出されます。

この方法は，呼び出し規約を言語仕様でサポートする前に使用していた方法です。このため，特に理由がない場合は，呼び出し属性をCOBOLソース中に指定する方法を使用することを推奨します。

(1)　コンパイル方法

作成したstdcall呼び出し指示ファイルを有効にするためには，コンパイル時に-StdCallオプションを指定する必要があります。

-StdCallオプションを指定すると，stdcall呼び出し指示ファイルがあれば使用されます。また，-StdCallオプションの指定がなければ，stdcall呼び出し指示ファイルがあっても無視されます。

(2)　stdcall呼び出し指示ファイルの規則

stdcall呼び出し指示ファイルの作成規則

stdcall呼び出し指示ファイル名は，ソースファイル名.cbwとし，ソースファイルと同じフォルダに格納しておく必要があります。※

注※

-StdCallFileオプションを使用すれば，任意のフォルダに格納されている任意の名称のstdcall呼び出し指示ファイルを指定できます。

stdcall呼び出し指示ファイルの記述規則

stdcall呼び出し指示ファイルには，呼び出すDLLのプログラム名をテキストエディタを使用して記述します。このときの規則を次に示します。

プログラム名を複数記述する場合，プログラム名は改行して記述するか，または空白で区切って記述します。

ファイルの中にはコメントを1行単位に記述できます。コメントは，//の横に続けて記述します。

プログラム名の構成規則に反した文字を指定した場合，結果は保証しません。

stdcall呼び出し指示ファイル中にプログラム名が記述されていない場合，stdcall呼び出し指示ファイルがないものとして扱われます。

プログラム名を160バイト以上記述した場合，先頭から160バイトまでが有効となります。ただし，160バイト目と161バイト目が日本語となるときは，先頭から159バイトまでが有効となります。

-Compati85,Syntaxオプションを指定して，プログラム名を30バイト以上記述した場合，先頭から30バイトまでが有効となります。

プログラム名の変換規則に対する処理はされないため，プログラム名は変換規則適用後の文字で記述する必要があります。

プログラム名中の文字に対しては，COBOLの語の等価規則は適用されません。

.cbwファイルの記述例を次に示します。

（例）

----+----1----+----2----+----3----+----
プログラム名
//コメント
        プログラム名
  //  コメント
プログラム名  プログラム名  プログラム名
    :

-Compati85,Syntaxオプションを指定している場合で，プログラム名を30バイト以上記述したときは，先頭から30バイトまでがプログラム名として有効となります。

(3)　stdcall呼び出し指示ファイルの使用例

stdcall呼び出し指示ファイルを使用してプログラムをコンパイルする例を，次に示します。

使用例

（DLLMAIN.cbl）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. DLLMAIN.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 DLLMODUL PIC X(7) VALUE 'DLLSUB2'.
       PROCEDURE DIVISION.
      *
      *** DLLモジュール CALL(定数呼び出し)
           CALL 'DLLSUB1'.
      *
      *** DLLモジュール CALL(一意名呼び出し)
           CALL DLLMODUL.
      *
           STOP RUN.

（DLLSUB1.cbl）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. DLLSUB1.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       PROCEDURE DIVISION.
      *
      * STOP 定数文の実行
           STOP 01.
      *
           EXIT PROGRAM.

（DLLSUB2.cbl）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. DLLSUB2.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       PROCEDURE DIVISION.
      *
      * STOP 定数文の実行
           STOP 02.
      *
           EXIT PROGRAM.

COBOLプログラム"DLLSUB1.cbl"，"DLLSUB2.cbl"をそれぞれ-Dll,Stdcallオプションを指定してコンパイルし，DLLを作成します。

ccbl2002 DLLSUB1.cbl -Dll,Stdcall -OutputFile DLLSUB1.dll
ccbl2002 DLLSUB2.cbl -Dll,Stdcall -OutputFile DLLSUB2.dll

主プログラム"DLLMAIN.cbl"と同じフォルダにstdcall呼び出し指示ファイル"DLLMAIN.cbw"を作成し，-StdCallオプションを指定してコンパイルします。このとき，DLLSUB1を静的リンクするために，インポートライブラリDLLSUB1.libを指定します。

ccbl2002 -Main,System DLLMAIN.cbl -StdCall DLLSUB1.lib
         -OutputFile DLLMAIN.exe

DLLMAIN.cbwの記述内容

// DLLSUB1.dllとDLLSUB2.dllを.cbwファイルに登録
  DLLSUB1 DLLSUB2

35.4　リンカパスの切り替え機能

リンカパスの切り替え機能の概要，および使用時の注意事項について説明します。

35.4.1　機能概要

リンカパスの切り替え機能は，COBOL2002コンパイラから呼び出すLINK.exe，RC.exe，およびMT.exeのパスを切り替える機能です。

この機能は，次の環境変数を使用して，環境変数に設定されたパス名でそれぞれのコマンドをCOBOL2002コンパイラから呼び出します。

CBLLINKER=LINKコマンドのパス

CBLRESOURCECOMPILER=RCコマンドのパス

CBLMANIFESTTOOL=MTコマンドのパス

なお，各環境変数の詳細は，「33.6.3　コンパイラ環境変数の詳細」の「(11)　CBLLINKER」，「(13)　CBLMANIFESTTOOL」，および「(16)　CBLRESOURCECOMPILER」を参照してください。

これらの環境変数の設定がない場合，COBOL2002コンパイラはCOBOL2002のインストールフォルダ¥bin¥SDK，およびWindows SDKのbinへのパスの下のコマンドを絶対パス名で呼び出します。

環境変数CBLLINKER，環境変数CBLRESOURCECOMPILER，および環境変数CBLMANIFESTTOOLを設定した場合，-Detailsオプションを指定すると，COBOL2002コンパイラでリンクするとき，実行するコマンド名を以下の形式で出力します。

形式

環境変数CBLRESOURCECOMPILERに設定されているパス名:
環境変数CBLLINKERに設定されているパス名:
環境変数CBLMANIFESTTOOLに設定されているパス名:

使用例

コンパイラから呼び出すリンカをVisual Studioのリンカに切り替えるときの例を次に示します。

1. Windowsのプログラム一覧にある［COBOL2002］下のメニューから［COBOLコマンドプロンプト for COBOL2002］を選びます。

2. コマンドプロンプト上で，Visual Studioの環境設定バッチ（vcvarsall.bat）を起動して，Visual Studioのリンカを使用するために必要な環境変数を設定します。

なお，Visual Studioの環境設定バッチの引数などの使用方法については，Visual Studioのリファレンスなどで確認してください。

3. 環境変数を設定します。

環境変数CBLLINKER，環境変数CBLRESOURCECOMPILER，および環境変数CBLMANIFESTTOOLを設定します。

設定例を次に記します。

（例）

set CBLLINKER=Microsoft Visual Studio 2022のbinへのパス¥link.exe
set CBLRESOURCECOMPILER=Windows SDKのbinへのパス¥rc.exe
set CBLMANIFESTTOOL=Windows SDKのbinへのパス¥mt.exe

4. ccbl2002コマンドによってリンクします。

（例）

35.4.2　リンカパスの切り替え機能使用時の注意事項

開発マネージャでプログラムを開発するとき，この機能を使用する場合は，Visual Studioの環境設定バッチで設定される環境変数と値を，開発マネージャの起動前にシステム環境変数に設定するか，またはVisual Studioのコマンドプロンプト上から開発マネージャを起動してください。

36　プログラムの実行

この章では，コンパイル・リンクによって作成したCOBOLプログラムを実行する方法について説明します。

36.1　実行可能ファイルの起動方法

COBOL2002で作成したプログラムを実行する方法を，以下に示します。

形式

実行可能ファイル名称 〔実行可能ファイルの引数〕

実行可能ファイル名称

実行可能ファイル名称は，原始プログラムをコンパイル時に-OutputFileオプションで指定したファイル名です。-OutputFileオプションを指定しなかったときのファイル名称は，ソースファイル名に拡張子.exeを付けた名称になります。

-OutputFileオプションの詳細は，「33.5.10　リンクの設定」の「(10)　-OutputFileオプション」を参照してください。

実行可能ファイルの引数

指定した引数は，原始プログラム中のPROCEDURE DIVISIONのUSING指定の引数，またはCBLARGVサービスルーチンなどによって取り込めます。実行可能ファイルの引数を複数指定するときは，それぞれを空白で区切ります。引数の受け取り方法の詳細は，「16.　COBOLの実行単位」を参照してください。

実行方法には次のような方法があります。

エクスプローラで実行可能ファイル（.exe）のアイコンをダブルクリックする。

コマンドプロンプト，またはWindowsの「ファイル名を指定して実行」ダイアログボックスに，形式に記載されているように実行可能ファイル（.exe）を入力する。

開発マネージャの［実行］コマンドを使用する。

実行支援を起動して実行する。

開発マネージャ，実行支援を利用した実行方法については，マニュアル「COBOL2002　操作ガイド」を参照してください。

なお，実行支援で生成するプログラム別実行環境ファイル（.cbr）は，実行ファイルと同じフォルダに，同じ名称（拡張子は除く）で保存する必要があります。

注意事項

プログラムの実行時に，プログラムが実行できる十分な仮想メモリがない場合，「指定したプログラムは実行されません。」というメッセージが出力されます。この場合，Windowsの仮想メモリを大きくしてください。

36.2　プログラムの実行環境の設定

36.2.1　実行時環境変数の設定方法

実行時の環境は実行時環境変数で設定します。

実行時環境変数は，次のどちらかの方法で設定します。

システムに従った環境変数の設定方法

実行支援を使用した環境変数の設定方法

(1)　システムに従った環境変数の設定方法

コマンドプロンプトまたはWindowsシステムの環境変数から，次の形式で設定します。

形式

環境変数=環境変数の値

(a)　注意事項

空白を含むフォルダ名やファイル名を環境変数の値に指定するときは，引用符（ " ）で囲まないでください。

環境変数の値の長さは，次の表に示す範囲内でシステムとして有効な値を指定してください。

表36‒1　 環境変数の値の長さの範囲

環境変数名

値の長さの範囲

範囲外の長さを指定した場合

CBLTDEXEC

CBLLDLL

1〜32,766バイト

COBOLプログラム実行時に有効な環境変数とみなされません。

上記以外の環境変数

1〜1,024バイト

実行環境ファイル（.cbr）からの環境変数の読み込み，および環境変数へのアクセス機能で，値にメタキャラクタ（"%変数名%"の形式）が含まれているときは，次の規則に従います。

メタキャラクタに環境変数名が指定されると，メタキャラクタの部分はその環境変数の現在の値と置き換えられます。置き換えの規則は，コマンドインタプリタがメタキャラクタを扱うときの規則と同じです。

メタキャラクタに指定された環境変数がなかった場合，メタキャラクタの記述は置き換えられずにそのまま残ります。

メタキャラクタを置き換えた結果，環境変数の値の長さが32,766バイトを超えた場合，または置き換えが正常に終了しなかった場合は，置き換え前の環境変数の値が登録されます。

（例）次の環境変数が指定されている場合

CBLL1=test1.dll
CBLL2=test2.dll
CBLLDLL=test3.dll;test4.dll

1.正常に置き換えられる例

CBLLDLL=%CBLLDLL%;%CBLL1%;%CBLL2%;test5.dll;test6.dll
↓
CBLLDLL=test3.dll;test4.dll;test1.dll;test2.dll;test5.dll;test6.dll

2.環境変数が見つからないので，置き換えられない例

CBLLDLL=%CBLLDLL%;%CBLL3%;test5.dll
↓
CBLLDLL=test3.dll;test4.dll;%CBLL3%;test5.dll

(2)　実行支援を使用した環境変数の設定方法

実行支援を使用して，実行時環境変数を設定できます。

詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

(3)　実行時環境変数の規則

実行時環境変数の規則を，次に示します。

環境変数の値にYESを指定する場合，大文字と小文字は等価とみなされます。

システム環境変数と実行支援での環境変数で，異なる値を設定した場合の優先順位を次に示します。

プログラム別実行環境ファイル（実行支援で設定する.exeファイルと同じ名称の.cbrファイル）

共通実行環境ファイル（環境変数CBLCOMCBRで指定するファイル）

コマンドプロンプトやコントロールパネルで設定した環境変数

36.2.2　実行時環境変数の一覧

実行時環境変数の一覧を，次に示します。

(1)　一般

環境変数名

指定する内容

CBLABNCODE

CBLABNサービスルーチンの引数をCOBOL2002アプリケーションの終了コードにするかどうか

CBLCOMCBR

システム共通の実行環境でプログラムを実行するときの実行環境ファイル名

CBLEXVALUE

EXTERNAL句の指定のあるデータ項目の初期値を指定する

CBLLANG

動作する言語環境（文字コード）を指定する

CBLLDLL

動的なリンクで実行時にダイナミックリンクするDLLの名称

CBLLPROGDLL

DLL自動ロード機能を使うかどうか

CBLPGMSEARCHTRC

プログラム検索トレースファイル名を指定する

CBLPGMSEARCHTRC_SIZE

プログラム検索トレースファイル名を切り替えるサイズを指定する

CBLPRELOAD

プレロードリストファイル名を指定する

CBLUNIENDIAN

用途がNATIONALの項目に対するUnicodeのバイトオーダを指定する

CBLUPSI

外部スイッチの状態

CBL_BATCH

COBOL2002アプリケーションの終了と同時にプロセスを終了させるかどうか

CBL_SYSERR

実行時エラーメッセージの出力先ファイル名

(2)　少量データ

環境変数名

指定する内容

CBLDATE

ACCEPT文，CURRENT-DATE関数，MOVE文（日付と時刻用）でシステムから受け取る西暦年月日

CBLDAY

ACCEPT文でシステムから受け取る通算日付

CBL_STOPNOADV

CUIモードでSTOP　定数文を実行したとき，メッセージIDと定数1の直後の改行文字を出力するかどうか

CBL_SYSIN

FROM SYSIN指定のACCEPT文での入力ファイル名

CBL_SYSOUT

UPON SYSOUT指定のDISPLAY文での出力ファイル名

CBL_SYSPUNCH

UPON SYSPUNCH指定のDISPLAY文での出力ファイル名

CBL_SYSSTD

FROM SYSSTD指定のACCEPT文での入力ファイル名

(3)　ファイル

環境変数名

指定する内容

CBLCSVCHAR

-NumCsvオプションを指定してCSV編成ファイルを数値として読み込むとき，無視する文字列

CBLCSVINIT

CSV編成ファイルのREAD文実行時に，セルと対応しない未使用の基本項目を初期化するかどうか

CBLD_ファイル名

ファイル単位に入出力を指示するオプション

CBLEUDCFUNC

外字を有効にするため内部的に発行しているEnableEUDC関数の扱いの指定

CBLFSYNC

ファイルクローズ時のディスク書き込み保証を適用するかどうか

CBLF_ファイル名

印刷機能を利用したとき，スプールに登録される印刷文書名称の指定

CBLGDIINTERVAL

GDIモード印刷でINTERVAL指定がないとき，実行支援の印刷書式に設定した字間隔を使用するかどうか

CBLGDIWMSG

GDIモード印刷機能を使用する場合に，警告メッセージの出力を抑止するかどうか

CBLIOMESSAGE

ファイル入出力文でのエラー情報出力機能を使用するかどうか

CBLISAMDL

既存の索引ファイルに対してOPEN OUTPUTを実行したとき，旧ファイルを削除後，新規に作成するかどうか

CBLISAMLARGE※

実行単位中のすべてのISAMによる索引編成ファイルに対してラージファイル形式を適用するかどうか

CBLPRTEXCHR

CBLP_ファイル名を設定してESC/Pモード印刷機能を利用するプリンタへ外字を出力するとき，ベンダ定義文字を外字として出力する

CBLP_ファイル名

ESC/Pモード印刷機能を利用するプリンタへ，Windows上で作成した外字を登録する

CBLRDBDATAERR

HiRDBによる索引編成ファイルで，レコード中の保証されないデータをエラーとして検出するかどうか

CBLRDBILWAIT

HiRDBによる索引編成ファイルで，内部的に発行されるSELECTに対して排他オプションを付けるかどうか

CBLRDBOPURGE

HiRDBによる索引編成ファイルの全データを削除する際に，PURGE TABLEを使用するかどうか

CBLRDBROWVALCONSTRUCTOR

HiRDBによる索引編成ファイルで，内部発行SELECTで行値構成子を使用する「内部発行されるSQL文で行値構成子を使用する機能」を使用するかどうか

CBLTEXTSUPPRESSBOM

テキスト編成ファイルでのUnicodeシグニチャ出力を切り替える

CBLTEXTWRITESPACE

テキスト編成ファイルに対するWRITE文またはREWRITE文で，レコード末尾からの連続する半角空白文字をファイルに書き出す

CBLX_外部装置名※

書式印刷するときの印刷サービス名称

CBL_BTRPGSZ※

Btrieve（Pervasive.SQL）による索引編成ファイルのページサイズ

CBL_RDBCOMMIT

HiRDBによる索引編成ファイルのトランザクション管理をするかどうか

CBL_RECLOCKMAX

相対編成ファイルでLOCK MODE句にMANUALを指定したとき同時に施錠できるレコード数

CBL_SYSCSVIN

FROM SYSCSV指定のACCEPT文での入力ファイル名

CBL_SYSCSVOUT

UPON SYSCSV指定のDISPLAY文での出力ファイル名

CBL_外部装置名

ファイル入出力での入出力ファイル名

注※

Windows(x86) COBOL2002で有効です。

(4)　画面

環境変数名

指定する内容

CBLACTWIN

COBOLアプリケーションの出力するコンソールおよび画面機能のウィンドウをDISPLAY文のメッセージ出力のタイミングでアクティブにするかどうか

CBLATTRIBUTE

画面節（WINDOW SECTION）のERASE ATTRIBUTE文で指定したフィールドに重ねて表示してあるけい線，および属性を消去するかどうか

CBLAUTOCLEAR

画面機能でのデータ入力時の動作変更

CBLENTERCHK

ACCEPT文やREPLY文実行時，画面節（WINDOW SECTION）のENTER-CHECK句指定項目がデータ未入力の場合，WINDOW-STATUS特殊レジスタへの値設定

CBLFEP

-JPN,Alnum，または-JPN,V3JPNオプション指定時に，カーソル移動によって自動的に日本語入力に切り替えるかどうか

CBLIMEPOS

画面機能で，日本語をフィールドに直接入力するかどうか

CBLJCPOPENDKEY

JCPOPUPサービスルーチンの終了キーの拡張

CBLM7ENDKEY

MIOS7の終了キーを，［Alt］+［F1］〜［Alt］+［F8］から［Shift］+［F1］〜［Shift］+［F8］に変更する

CBLNOCLOSE

COBOLプログラム実行中の強制中断を抑止するかどうか

CBLONLYNUM

環境変数CBLAUTOCLEARでの画面動作の変更を，画面節（WINDOW SECTION）の数字項目，および数字編集項目だけに限定するかどうか

CBLOVERFLOW

画面節（WINDOW SECTION）入力時に，自動カーソル位置づけを抑止するかどうか，およびオーバフローをチェックするかどうか

CBLSETFIELD

画面節（WINDOW SECTION）のSET文でフィールドの属性を変更するとき，それまでSET文で変更していた属性を初期化するかどうか

CBLUNDERDOT

画面機能で，入力および入出力フィールドにピリオド（.）を表示するかどうか

CBLUPDOWNMOVE

画面機能（画面節（WINDOW SECTION））でのACCEPT文，またはREPLY文実行時，［↑］キー，［↓］キーの動作を変更するかどうか

(5)　画面（XMAP）

環境変数名

指定する内容

CBLPRNTID

画面機能での送信先プリンタに対する仮想端末名

CBLPRNT_xxx

画面機能で送信先がプリンタのときの仮想端末名

CBLTERMID

画面機能での送信先ディスプレイに対する仮想端末名

CBLTERMSHAR

複数プログラムでの仮想端末共有

CBLTERM_xxx

画面機能で送信先がディスプレイのときの仮想端末名

(6)　整列併合

環境変数名

指定する内容

CBLSORTSIZE

整列処理で使用するメモリサイズ

CBLSORTWORK

整列処理用の作業用ファイルのフォルダ名

(7)　拡張機能

環境変数名

指定する内容

CBLOPS

MIOS7 COBOL85互換のために複数の環境変数を指定する

CBLSQLCOMMOD

ODBCインタフェースを使用してデータベースに接続する場合のコミットモードを設定する

CBLSQLCURUSE

ODBCインタフェース機能を使用した場合にカーソルオプションの設定を変更する

CBLSQLDYNAMIC

ODBCインタフェース機能の動的SQLで内部的に発行するODBC APIを変更する

CBLSQLLOGINTIMEOUT

ODBCインタフェースを使用した場合にODBCオプションのSQL_LOGIN_TIMEOUTの値を指定する

CBLSQLQUERYTIMEOUT

ODBCインタフェースを使用した場合にODBCオプションのSQL_QUERY_TIMEOUTの値を指定する

CBLSQLROWCOUNT

ODBCインタフェースを使用した場合に影響行数が0のときにSQLCODEに100を設定する

CBLSQLSUPPRESSMSG

ODBCインタフェースを使用した場合に実行時メッセージの出力を抑止するかどうか

CBLSQLWMSG

ODBCインタフェースを使用した場合に警告メッセージの出力を抑止するかどうか

(8)　デバッグ

環境変数名

指定する内容

CBLABNLST

異常終了時要約情報リストの出力先

CBLDDUMP

異常終了時のデータ領域ダンプの出力先

CBLDATADUMPFILE

CBLDATADUMPサービスルーチンによるデータ領域ダンプの出力先

CBLEXCEPT

プログラムの実行で例外が発生したときの動作

CBLPRMCHKW

-DebugCompatiオプション指定時，またはテストデバッグ時のプログラム間整合性チェックを緩和するかどうか

CBLTDEXEC

プログラム実行時にテストデバッガを起動するかどうか

CBL_FLSRVDUMP

COBOL入出力サービスルーチンのデバッグ情報を出力するファイル名

(9)　イベントログ

環境変数名

指定する内容

CBLSYSLOG

イベントログファイル出力機能を使用するかどうか

CBLSYSLOGLVL

イベントログファイル出力機能での出力対象イベントの種類

CBLSYSLOGSRV

イベントログファイル出力機能でのイベント出力先のコンピュータ名

(10)　オブジェクト指向

環境変数名

指定する内容

CBLGCINTERVAL

前回のガーベジコレクションを終了してから，次のガーベジコレクションを開始するまでのメモリ使用量（ガーベジコレクションの実行間隔）

CBLGCSTART

ガーベジコレクタの開始条件となる，インスタンスオブジェクトの生成によるメモリ使用量の累積値

36.2.3　一般

(1)　CBLABNCODE

CBLABNサービスルーチンの実行時，サービスルーチンの引数をプログラムの終了コードに反映させたい場合に指定します。

詳細は，「30.4.3　CBLABN」を参照してください。

(2)　CBLCOMCBR

システムで共通な実行環境でプログラムを実行したい場合，共通実行環境ファイル名を指定します。共通実行環境ファイル名には，実行支援で作成した.cbrファイルを絶対パスで指定します。

この環境変数には，複数のファイル名を指定できません。また，この環境変数に指定した共通実行環境ファイル中のCBLCOMCBRは無効となります。

なお，共通実行環境ファイルに加えて，プログラム別に実行環境を設定したい場合は，実行支援で.exeファイルと同じ名称の実行環境ファイルを作成します。詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

(3)　CBLEXVALUE

EXTERNAL句指定のあるデータ項目にNULLを設定して，領域を初期化します。この環境変数の指定は，作業場所節で定義しているデータ項目に対して有効となります。

詳細は，「4.2.2　外部属性（EXTERNAL句）」を参照してください。

(4)　CBLLANG

動作する言語環境（文字コード）を指定します。

詳細は，「28.4.2　実行」を参照してください。

(5)　CBLLDLL

ダイナミックリンクするDLLの名称を指定します。

詳細は，「18.6.2　DLLに含まれるプログラムの呼び出し方法」を参照してください。

(6)　CBLLPROGDLL

DLL自動ロード機能を使用する場合，YESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「18.6.2　DLLに含まれるプログラムの呼び出し方法」を参照してください。

(7)　CBLPGMSEARCHTRC

次のトレース情報を出力するファイル名を指定します。

動的なリンクによるプログラム呼び出し時のDLLの検索情報

プレロード時のDLLのロード情報

詳細は，「18.6.4　動的なリンクのプログラム検索トレース機能」を参照してください。

(8)　CBLPGMSEARCHTRC_SIZE

プログラム検索トレースファイル名を切り替えるサイズを指定します。

詳細は，「18.6.4　動的なリンクのプログラム検索トレース機能」を参照してください。

(9)　CBLPRELOAD

実行単位内で最初に実行されるCOBOLプログラムの起動時に，動的なリンクで検索対象となるDLL名称を記述したプレロードリストのファイル名を指定します。

詳細は，「18.6.3　動的なリンクのプレロード機能」を参照してください。

(10)　CBLUNIENDIAN

用途がNATIONALの項目に対するUnicodeのバイトオーダを指定します。

詳細は，「28.4.2　実行」を参照してください。

(11)　CBLUPSI

外部スイッチの状態を，8個の0と1で指定します。

詳細は，「16.2.4　外部スイッチ」の「(2)　外部スイッチの設定方法」を参照してください。

(12)　CBL_BATCH

COBOLアプリケーションの終了（STOP RUN文の実行または実行時エラーの発生）と同時にプロセスを終了させたい場合に1を指定します。1以外を指定したかまたはこの環境変数を指定しない場合は，コンソールウィンドウのシステムメニューの［閉じる］を選んでプロセスを終了させなければなりません。

この環境変数は，CUIモードでの実行時，およびコンソールウィンドウが出力されていない場合には意味を持ちません。

なお，この環境変数の使い方については，「30.4.6　CBLEXEC」も参照してください。

(13)　CBL_SYSERR

実行時エラーメッセージの出力先ファイル名を指定します。ファイル名はドライブ名からの絶対パス名で指定します。拡張子の種類や拡張子を付けるかどうかは任意です。CBL_SYSERRの指定形式は次のようになります。

形式

CBL_SYSERR=ファイル名〔+〕

＋を指定した場合：追加モードで出力されます。

CBL_SYSERRを指定した場合の実行時エラーメッセージの出力先を次に示します。

ファイル名の指定

データの出力先

GUIモード

CUIモード

CBL_SYSERR=stdin〔+〕

ファイル名「stdin」

CBL_SYSERR=stdout〔+〕

ファイル名「stdout」

標準出力※

CBL_SYSERR=stderr〔+〕

ファイル名「stderr」

標準エラー出力※

CBL_SYSERR=syslog〔+〕

ファイル名「syslog」

CBL_SYSERR=

　上記以外のファイル名〔+〕

環境変数CBL_SYSERRで指定した名称のファイル

注

CUIモードのときに，標準出力（stdout），および標準エラー出力（stderr）を指定する場合は，英小文字で指定してください。「STDOUT」のように英大文字で指定した場合，物理ファイル名として扱われます。

注※

追加モードは無視されます。

36.2.4　少量データ

(1)　CBLDATE

システムから受け取る西暦年月日を，yyyymmdd（yyyyは西暦の年，mmは月，ddは日）の8けたの形式で指定します。

詳細は，「10.2.4　日付や時刻を取得するACCEPT文」の「(2)　ACCEPT文で取得する日付の変更」を参照してください。

(2)　CBLDAY

ACCEPT文でシステムから受け取る西暦年，および通年日をyyyyddd（yyyyは西暦の年，dddは通年日）の7けたの形式で設定します。

詳細は，「10.2.4　日付や時刻を取得するACCEPT文」の「(2)　ACCEPT文で取得する日付の変更」を参照してください。

(3)　CBL_STOPNOADV

CUIモードのCOBOLプログラムでSTOP定数文を実行した場合，実行時メッセージIDと，定数の直後の改行文字の出力を抑止したい場合，YESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「10.2.6　STOP文」を参照してください。

(4)　CBL_SYSIN

FROM SYSIN指定時のACCEPT文で入力ファイル名を指定します。

詳細は，「10.2.3　外部からのデータを入力するACCEPT文」の「(1)　標準転記によるACCEPT文」を参照してください。

(5)　CBL_SYSOUT

UPON SYSOUT指定時のDISPLAY文で出力ファイル名を指定します。

詳細は，「10.2.5　DISPLAY文によるデータの出力」を参照してください。

(6)　CBL_SYSPUNCH

UPON SYSPUNCH指定時のDISPLAY文で出力ファイル名を指定します。

詳細は，「10.2.5　DISPLAY文によるデータの出力」を参照してください。

(7)　CBL_SYSSTD

FROM SYSSTD指定時のACCEPT文で入力ファイル名を指定します。

詳細は，「10.2.3　外部からのデータを入力するACCEPT文」の「(1)　標準転記によるACCEPT文」を参照してください。

36.2.5　ファイル

(1)　CBLCSVCHAR

-NumCsvオプションを指定してCSV編成ファイルの入出力をする場合，無視したい文字列を指定します。

規則

環境変数CBLCSVCHARに複数の文字列を指定する場合は，各文字列をセミコロン（;）で区切ります。

詳細は，「6.8.5　セルデータを数値として入出力する機能」の「(3)　数値として入力するとき，不要な文字列を無視する機能」を参照してください。

(2)　CBLCSVINIT

CSVファイルのREAD文実行時に，セルと対応しない未使用の基本項目を初期化する場合に指定します。

詳細は，「6.8.7　入力時の未使用項目の初期化機能」を参照してください。

(3)　CBLD_ファイル名

入出力動作を指示する下記のオプションをファイル単位に指定します。

規則

複数のオプションを指定するときは各オプションをコロン（：）で区切ります。

環境変数CBLD_ファイル名は，OPEN文を実行するごとに環境変数の値が参照されます。

ここで指定するファイル名はSELECT句で指定したファイル名に対応します。ただし，ファイル名内のハイフン（-）は下線（_）に置き換えて指定します。

背反するオプションを同時に指定した場合，あとから指定したオプションが有効となります。

設定例

（例1）

（COBOLでの記述例）

SELECT A-FILE ASSIGN TO SYS000.

（環境変数の設定例）

CBLD_A_FILE=ISAMDL:NOISAMPREV

（例2）

背反するオプションを同時に指定した場合，あとから指定したオプションが有効となります。

CBLD_A_FILE=ISAMDL:NOISAMDL

上記の指定をした場合，最初の"ISAMDL"は無効となり，あとに設定した"NOISAMDL"が有効となります。

(a)　ISAMDL／NOISAMDL

ISAMDLは，索引編成ファイルでOPENモードがOUTPUTの場合，既存のファイルを削除して再生成します。NOISAMDLは，ファイルの削除はしません。省略時はNOISAMDLが仮定されます。

(b)　ISAMPREV／NOISAMPREV

ISAMPREVは，索引編成ファイルでSTART文の指定がLESS，LESS THAN OR EQUAL，およびLASTの場合，あとに続くNEXT指定のREAD文でキーの降順に呼び出します。NOISAMPREVは，START文の指定に関係なく，NEXT指定のREAD文はキーの昇順に呼び出します。省略時はISAMPREVが仮定されます。

(c)　SAMAADV／NOSAMAADV

SAMAADVは，ADVANCING指定を書かないWRITE文にAFTER ADVANCING 1 LINEを仮定します。NOSAMAADVはこれを仮定しません。省略時はNOSAMAADVが仮定されます。

SAMAADVとSAMBADVを同時に指定した場合は，あとに設定した方が有効となります。

(d)　SAMBADV／NOSAMBADV

SAMBADVは，ADVANCING指定を書かないWRITE文にBEFORE ADVANCING 1 LINEを仮定します。NOSAMBADVはこれを仮定しません。省略時はNOSAMBADVが仮定されます。

SAMAADVとSAMBADVを同時に指定した場合は，あとに設定した方が有効となります。

(e)　BTMODIFY／NOBTMODIFY（Windows(x86) COBOL2002で有効）

BTMODIFYは，Btrieve（Pervasive.SQL）による索引編成ファイルの主レコードキーに対し，変更可能モードが設定されている物理ファイルをオープンできるようにします。このオプション設定時には次の注意が必要です。

BTMODIFYを指定した場合でも，実際に主レコードキーの変更はできない。

BTMODIFYを指定した場合でも，COBOLで作成されるファイルの主レコードキーは変更不可モードとなる。

なお，省略時はNOBTMODIFYが仮定されます。

(f)　CSVQUOTE／NOCSVQUOTE

CSVQUOTEは，CSV編成ファイルのWRITE文でセルの内容を出力するとき，データを引用符（ " ）で囲みます。NOCSVQUOTEは，引用符を付けません。省略時はCSVQUOTEが仮定されます。

NOCSVQUOTEを指定した場合の詳細は，「6.8　CSV編成ファイル（表計算プログラムファイル）」を参照してください。

(g)　CSVWRITESPACE／NOCSVWRITESPACE

CSVWRITESPACEは，CSV編成ファイルのWRITE文で，出力するレコードの基本項目のデータの最後の空白文字を出力します。NOCSVWRITESPACEは，データの最後の空白文字を出力しません。なお，省略時はNOCSVWRITESPACEが仮定されます。

CSVWRITESPACEを指定した場合の詳細は，「6.8.8　データの後の空白文字を出力する機能」を参照してください。

(h)　CSVTABSEPARATED／NOCSVTABSEPARATED

CSVTABSEPARATEDは，CSVファイル入出力機能でセルデータをタブ文字区切りで入出力します。NOCSVTABSEPARATEDはセルデータにコンマ（,）区切りで入出力します。なお，省略時はNOCSVTABSEPARATEDが仮定されます。

CSVTABSEPARATEDを指定した場合の詳細は，「6.8.9　セルデータをタブ文字区切りで入出力する機能」を参照してください。

(i)　SAMPADV／NOSAMPADV

SAMPADVは，OPEN文の実行後，最初に実行されるAFTER ADVANCING PAGE指定のWRITE文についての行制御を有効にします。NOSAMPADVは，行制御を無効にします。省略時はSAMPADVが仮定されます。このオプション設定時には次の注意が必要です。

SAMPADVおよびNOSAMPADVは，順編成ファイル，テキスト編成ファイルの印刷機能，書式印刷機能，および報告書作成機能※に対して有効となります。

LINAGE句が指定されている場合，SAMPADVおよびNOSAMPADVの指定は無効となります。

注※

報告書作成機能のGENERATE文は，内部的にWRITE文を使用するため，このオプションが有効になります。

(j)　FSYNC／NOFSYNC／WDISK

強制的にディスク書き込みをするかしないかを指定します。

FSYNCを指定した場合，プログラムの終了時，またはCLOSE文の実行終了時に，COBOLプログラムの環境部のファイル記述項で指定したファイル名のファイルに対して，強制的なディスク書き込みを適用します。

WDISKを指定した場合，WRITE文，REWRITE文，またはDELETE文の実行終了時に，COBOLプログラムの環境部のファイル記述項で指定したファイル名のファイルに対して，強制的なディスク書き込みを適用します。

NOFSYNCを指定した場合は，ディスクへの書き込み保証が適用されません。

FSYNC，NOFSYNC，WDISKのどれかを同時に指定した場合は，あとに指定した方が有効となります。また，FSYNC，NOFSYNC，WDISKのどれも指定しない場合は，環境変数CBLFSYNCの指定に従います。

ファイルのディスク書き込み保証機能の詳細については，「14.1　ファイルのディスク書き込み保証」を参照してください。

(k)　ISAMLARGE／NOISAMLARGE（Windows(x86) COBOL2002で有効）

ISAMLARGEは，ISAMによる索引編成ファイルにラージファイル入出力機能を有効にします。NOISAMLARGEは，ISAMによる索引編成ファイルにラージファイル入出力機能を使用しないで通常の入出力とします。省略時はNOISAMLARGEが仮定されます。詳細は，「6.11　ラージファイル入出力機能」を参照してください。

(l)　TEXTWRITESPACE／NOTEXTWRITESPACE

テキスト編成ファイルに対するWRITE文またはREWRITE文で，レコード末尾からの連続する半角空白文字をファイルに書き出したい場合，TEXTWRITESPACEを指定します。テキスト編成ファイルに対するWRITE文またはREWRITE文で，レコード末尾からの連続する半角空白文字を削除したい場合は，NOTEXTWRITESPACEを指定します。詳細については，「6.7.5　レコード末尾の空白文字を出力する機能」を参照してください。

(m)　TEXTSUPPRESSBOM／NOTEXTSUPPRESSBOM

テキスト編成ファイルにUnicodeシグニチャを出力しない場合，TEXTSUPPRESSBOMを指定します。Unicodeシグニチャを出力する場合，NOTEXTSUPPRESSBOMを指定します。

詳細については，「28.5.2　入出力機能」の「(1)　テキスト編成ファイル」を参照してください。

(n)　RDBOPURGE／NORDBOPURGE

HiRDBによる索引編成ファイルで，出力モードでファイルを開く場合，すでにファイル内に存在するレコードを高速で削除するとき，RDBOPURGEを指定してください。レコードを高速で削除しない場合，NORDBOPURGEを指定してください。

詳細については，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(5)　その他の拡張機能」を参照してください。

(4)　CBLEUDCFUNC

GDIモード印刷およびESC/Pモード印刷のOPEN文で，外字を有効にするため内部的に発行しているEnableEUDC関数の扱いを変更したいときに指定します。

詳細は，「8.2.6　外字の有効化」を参照してください。

(5)　CBLFSYNC

プロセス内のすべてのファイルに対して，クローズ時のディスクへの書き込み保証を適用したいときにYESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「14.1.2　ファイルクローズ時のディスク書き込み保証の指定方法」および「13.7　COBOL入出力サービスルーチンでのディスク書き込み保証」を参照してください。

(6)　CBLF_ファイル名

COBOLのGDI印刷機能およびESC/P印刷機能を使用した場合に，スプールに登録される印刷文書名称を指定します。

詳細は，「8.2.5　印刷文書名称」の「(2)　ユーザ指定の印刷文書名称」を参照してください。

(7)　CBLGDIINTERVAL

GDIモード印刷機能を使用する場合に，CHARACTER TYPE IS INTERVAL句が出現しない間の項目の字間隔に対して，実行支援の印刷書式に設定した字間隔を適用したいときにYESを指定します。ただし，CHARACTER TYPE句の指定がまったくないレコードに対しては，環境変数CBLGDIINTERVALの指定に関係なく，実行支援の印刷書式に設定した字間隔が適用されます。なお，環境変数CBLGDIINTERVALにYESを指定した場合の詳細については，「8.4.2　出力形態とレコード形式」の「(2)　CHARACTER TYPE句指定での印刷」の「(e)　環境変数CBLGDIINTERVALを使用した出力例」を参照してください。

YES以外の値を指定したときは，無効となります。

(8)　CBLGDIWMSG

GDIモード印刷機能を利用してプリンタ出力する場合に，警告メッセージの出力を抑止したいときにYESを指定します。指定しなかったときや，YES以外の値を指定したときは，警告メッセージを出力します。

(9)　CBLIOMESSAGE

ファイル入出力文でのエラー情報出力機能を使用したい場合に，この環境変数を指定します。指定可能な値を次に示します。

(a)　STATUS90

ファイル管理記述項にFILE STATUS句の指定がある場合に，入出力文の実行で入出力状態値が90となるエラーが発生したとき，該当する実行時メッセージを出力してプログラムの実行を継続します。ただし，出力するメッセージのレベルはI（お知らせ）となります。

この環境変数については，「6.3.4　ファイル入出力文でのエラー情報出力機能」を参照してください。

(10)　CBLISAMDL

既存の索引ファイルに対してOPEN OUTPUTを実行した場合，旧ファイルを削除後，ファイルを新しく作成したいときにYESを指定します。指定しなかったときや，YES以外の文字を指定したときは，NOが仮定されます。このとき，既存のファイルに対しての追加書きとなります。

(11)　CBLISAMLARGE（Windows(x86) COBOL2002で有効）

実行単位中のすべてのISAMによる索引編成ファイルでラージファイル入出力を可能にするときにYESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「6.11　ラージファイル入出力機能」を参照してください。

(12)　CBLPRTEXCHR

環境変数CBLP_ファイル名を指定してESC/Pモードプリンタに外字を出力する場合で，ベンダ定義文字を外字として出力したい場合に指定します。

詳細は，「8.5.3　外字の出力方法」の「(2)　ベンダ定義文字の外字出力」を参照してください。

(13)　CBLP_ファイル名

Windows上で作成した外字を，そのままのコードでESC/Pモードプリンタに出力する場合に指定します。

詳細は，「8.5.3　外字の出力方法」の「(1)　ユーザ定義文字の外字出力」を参照してください。

(14)　CBLRDBDATAERR

HiRDBによる索引編成ファイルで，レコード中に保証されないデータが含まれていないかをチェックする場合にYESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(5)　その他の拡張機能」の「(b)　データチェック機能」を参照してください。

(15)　CBLRDBILWAIT

HiRDBによる索引編成ファイルで，ファイルを入力モードで開いたときに排他オプションを設定する場合にYESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(4)　HiRDBによる索引編成ファイル固有のファイル共用」を参照してください。

(16)　CBLRDBOPURGE

HiRDBによる索引編成ファイルで，出力モードでファイルを開く場合，すでにファイル内にあるレコードを高速で削除したいときにYESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(5)　その他の拡張機能」の「(a)　出力ファイルの高速オープン機能」を参照してください。

(17)　CBLRDBROWVALCONSTRUCTOR

HiRDBによる索引編成ファイルで，内部発行SELECTで行値構成子を使用する，内部発行されるSQL文で行値構成子を使用する機能を有効にするときに，YESを指定します。

詳細は，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(5)　その他の拡張機能」にある「(c)　内部発行されるSQL文で行値構成子を使用する機能」を参照してください。

(18)　CBLTEXTSUPPRESSBOM

テキスト編成ファイルにUnicodeシグニチャを出力しない場合に指定します。

詳細は，「28.5.2　入出力機能」の「(1)　テキスト編成ファイル」を参照してください。

(19)　CBLTEXTWRITESPACE

テキスト編成ファイルに対するWRITE文またはREWRITE文で，レコード末尾からの連続する半角空白文字をファイルに書き出したい場合に指定します。

詳細は，「6.7.5　レコード末尾の空白文字を出力する機能」を参照してください。

(20)　CBLX_外部装置名（Windows(x86) COBOL2002で有効）

書式印刷機能を使用したプリンタ出力するときの印刷サービス名称を指定します。

詳細は，「8.6　XMAP3による印刷（Windows(x86) COBOL2002で有効）」を参照してください。

(21)　CBL_BTRPGSZ（Windows(x86) COBOL2002で有効）

Btrieve（Pervasive.SQL）による索引編成ファイルのページサイズを指定します。

詳細は，「6.10.4　使用できる機能と制限事項」を参照してください。

(22)　CBL_RDBCOMMIT

HiRDBによる索引編成ファイルでCOMMIT文，ROLLBACK文によってRDBアクセスのトランザクションを管理する場合に指定します。

詳細は，「6.9.5　HiRDBによる索引編成ファイル固有の機能と相違点」の「(1)　トランザクション管理機能」を参照してください。

(23)　CBL_RECLOCKMAX

相対編成ファイルで，LOCK MODE句にMANUALが指定されたとき，同時に施錠できるレコード数を指定します。

詳細は，「7.2.2　レコードレベルのファイル共用」を参照してください。

(24)　CBL_SYSCSVIN

FROM SYSCSV指定のACCEPT文でアクセスするCSVファイルを，絶対パス名で指定します。

詳細は，「付録D.1　ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス」を参照してください。

(25)　CBL_SYSCSVOUT

UPON SYSCSV指定のDISPLAY文でアクセスするCSVファイルを，絶対パス名で指定します。

詳細は，「付録D.1　ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス」を参照してください。

(26)　CBL_外部装置名

ファイル入出力での入出力ファイル名を指定します。

詳細は，「6.2.2　環境変数指定」を参照してください。

36.2.6　画面

(1)　CBLACTWIN

COBOLアプリケーションの出力するコンソールおよび画面機能のウィンドウを，DISPLAY文がメッセージを出力するタイミングでアクティブにしたい場合にYESを指定します。YES以外の値を指定したときは，無効となります。

(2)　CBLATTRIBUTE

画面節（WINDOW SECTION）のERASE ATTRIBUTE文で指定したフィールドに重ねて表示されているけい線や属性を消去しない場合にYESを指定します。YES以外の値を指定したときは，無効となります。

（例）

次のようなデータ項目を画面に表示する場合，環境変数CBLATTRIBUTEを指定するときと指定しないときでは，次のように動作が異なります。

       01 GAMEN1.
         02 DATA1 LINE 2 COLUMN 5 THRU 20
                  RULE OVER UNDER
                  COLOR YELLOW REVERSE.
         02 DATA2 PIC X(5) LINE 2 COLUMN 10
                  COLOR BLUE
                  VALUE 'ABCDE'.

CBLATTRIBUTE=YESの場合

CBLATTRIBUTE=YES以外の場合

注意事項

けい線や属性は，フィールドの左端より左側から，フィールドの右端より右側の範囲に設定されている必要があります。これ以外の範囲にけい線や属性が設定されている場合，環境変数CBLATTRIBUTEでの動作は保証しません。

（例）

フィールドのデータ項目

  PIC X(5) LINE 5 COLUMN 5 VALUE 'ABCDE'.

正しく表示されるけい線の例

  LINE 5 COLUMN 4 THRU 11 RULE OVER UNDER.

表示が保証されないけい線の例

  LINE 5 COLUMN 5 THRU 11 RULE OVER UNDER.
  LINE 5 COLUMN 4 THRU 10 RULE OVER UNDER.

(3)　CBLAUTOCLEAR

画面節（SCREEN SECTIONおよびWINDOW SECTION）の入力文の動作を変更します。環境変数CBLAUTOCLEARにYESを指定すると，カーソルが移動したフィールドが選択状態となります。

YES以外の値を指定したときは，無効となります。

次に，画面節（SCREEN SECTIONおよびWINDOW SECTION）での環境変数CBLAUTOCLEARの機能を説明します。

(a)　画面節（SCREEN SECTIONおよびWINDOW SECTION）での共通の動作

環境変数CBLAUTOCLEARにYESを指定した場合，フィールドに入力制御が渡ると，カーソルはフィールド全体を選択した状態になります。これを選択状態といいます。

フィールドが選択状態のままでデータを入力すると，入力前のデータの内容がクリアされ，入力したデータが格納されます。なお，環境変数CBLAUTOCLEARにYES以外を指定した場合，入力されたデータは，入力前のデータに上書きされて格納されます。

（例）

CBLAUTOCLEARにYESを指定した場合

入力前のフィールド："ABCDE" ←"F"を入力

入力後のフィールド："F "

CBLAUTOCLEARにYES以外を指定した場合

入力前のフィールド："ABCDE" ←"F"を入力

入力後のフィールド："FBCDE"

フィールドが選択状態のときにデータを入力すると，選択状態は解除されます。

フィールドが選択状態で［BackSpace］キー，［Insert］キー，または［Delete］キーを押した場合，［End］キーが押されたものとして動作します。このとき，カーソルの選択状態は解除されます。

(b)　画面節（WINDOW SECTION）固有の動作

環境変数CBLAUTOCLEARにYESを指定した場合，ACCEPT文で，データの入力待ちになる前の処理（指定した項目の行，カラム位置に表示されているデータをクリアする）を抑止します。

なお，環境変数CBLAUTOCLEARにYESを指定しないでACCEPT文を実行した場合，入力待ちになる前に，ACCEPT文で指定した項目の行，カラム位置に表示されているデータを，ACCEPT文で指定した項目の属性（例えば，英数字項目のときは空白文字）でクリアします。環境変数CBLAUTOCLEARにYESを指定すると，ACCEPT文で指定した項目の行，カラム位置に表示されているデータはクリアされません。

また，このとき，データの入力をしないで空送信しても，ACCEPT文で指定した項目のデータの内容は変わりません。

フィールドが選択状態で，［←］キーを押した場合，前方のフィールドにカーソルが移動します。

フィールドが選択状態で，［→］キーを押した場合，後方のフィールドにカーソルが移動します。

次に，画面節（WINDOW SECTION）で環境変数CBLAUTOCLEARにYESを指定した例を示します。

       WINDOW SECTION.
         01 GAMEN FIELD TYPE I-O.
           02 DATA1 PIC X(10) LINE 1 COLUMN 1
                              VALUE 'aaaaaaaaaa'.
           02 DATA2 PIC X(10) LINE 1 COLUMN 1
                              VALUE 'bbbbbbbbbb'.
           02 DATA3 PIC 9(10) LINE 1 COLUMN 1
                              VALUE 1234567890.

（例1）

（例2）

（例3）

(c)　画面節（SCREEN SECTION）固有の動作

フィールドが選択状態で，［←］キー，または［→］キーを押した場合，データはクリアされないで，選択状態が解除されます。

次に，画面節（SCREEN SECTION）で環境変数CBLAUTOCLEARにYESを指定した例を示します。

       WORKING-STORAGE SECTION.
         01 AAA PIC X(10) VALUE 'aaaaaaaaaa'.
         01 BBB PIC X(10) VALUE 'bbbbbbbbbb'.
         01 CCC PIC 9(10) VALUE 1234567890.
       SCREEN SECTION.
         01 GAMEN.
           02 DATA1 PIC X(10) LINE 1 COLUMN 1 USING AAA.
           02 DATA2 PIC X(10) LINE 1 COLUMN 1 USING BBB.
           02 DATA3 PIC 9(10) LINE 1 COLUMN 1 USING CCC.

（例1）

（例2）

（例3）

（例4）

（例5）

(4)　CBLENTERCHK

ACCEPT文，またはREPLY文の実行時，画面節（WINDOW SECTION）のENTER-CHECK句を指定した項目にデータの入力がなかったときに，WINDOW-STATUS特殊レジスタへ値を設定したい場合にYESを指定します。YESを指定した場合，WINDOW-STATUS特殊レジスタには「02」が設定されます。YES以外の値を指定したときは，無効となります。

なお，ENTER-CHECK句を指定した項目が複数ある場合，それらすべての項目に対してデータの入力がなかったときだけ，「02」が設定されます。

(5)　CBLFEP

-JPN,Alnumオプションまたは-JPN,V3JPNオプション指定時，画面節（SCREEN SECTIONおよびWINDOW SECTION）でカーソルを日本語項目に移動した場合，自動的に日本語入力に切り替えたいときにYESを指定します。YES以外の値を指定したときは，無効となります。

なお，この機能を有効にするには，実行支援の画面環境で「日本語入力のオン／オフを自動的に切り替える」という設定をしておく必要があります。実行支援の設定については，マニュアル「COBOL2002　操作ガイド」を参照してください。

(6)　CBLIMEPOS

画面節（SCREEN SECTIONおよびWINDOW SECTION）で，フィールドに日本語を直接入力したい場合にYESを指定します。YES以外の値を指定したときは，無効となります。

(7)　CBLJCPOPENDKEY

JCPOPUPサービスルーチンの終了キーを追加したい場合にYESを指定します。

YES以外の値を指定したときは，無効となります。

詳細は，「30.5.3　JCPOPUP」を参照してください。

(8)　CBLM7ENDKEY

MIOS7で使用する終了キー（［I］〜［VIII］キー）の互換キーを，変更したい場合にYESを指定します。YESを指定した場合，互換キーの組み合わせが［Alt］+［F1］キー〜［Alt］+［F8］キーから，［Shift］+［F1］キー〜［Shift］+［F8］キーに変更されます。

YES以外の値を指定したときは，無効となります。

(9)　CBLNOCLOSE

ウィンドウのシステムメニュー，およびタイトルバーの［閉じる］ボタンを非活性 にしたいときにYESを指定します。これによって，COBOLプログラムの実行中にウィンドウを閉じて強制的にプログラムを中断できなくなります。

YES以外の値を指定したときは，無効となります。

(10)　CBLONLYNUM

環境変数CBLAUTOCLEARにYESを指定した場合の入力動作の変更を，画面節（WINDOW SECTION）の数字項目，および数字編集項目だけに限定したい場合，YESを指定します。

環境変数CBLAUTOCLEARの機能については，「(3)　CBLAUTOCLEAR」を参照してください。

YES以外の値を指定したときは，無効となります。

また，この環境変数はCBLAUTOCLEARにYESが指定されていない場合，無効となります。

(11)　CBLOVERFLOW

画面節（WINDOW SECTION）でのデータ入力時，カーソルが自動的に移動する機能を抑止し，けたあふれチェックをしたい場合，YESを指定します。

CBLOVERFLOWにYESを指定すると，入力フィールドまたは更新フィールドの最後の文字が入力されても，カーソルが自動的に次のフィールドに移動しなくなります。また，最後の文字を入力した状態から続けて文字を入力すると，オーバフローのエラーメッセージが出力されます。

YES以外の値を指定したときは，無効となります。

(12)　CBLSETFIELD

画面節（WINDOW SECTION）のSET文でフィールドの属性を変更する場合，それまでにSET文で変更した属性をクリアしたいときにYESを指定します。

YES以外の値を指定したときは，無効となります。

（例）

CBLSETFIELD=YESの場合

CBLSETFIELD=YES以外の場合

(13)　CBLUNDERDOT

画面節（SCREEN SECTIONおよびWINDOW SECTION）で，入力，および入出力フィールドにピリオド（.）を表示したい場合は，YESを指定します。YES以外の値を指定したときは，無効となります。

(14)　CBLUPDOWNMOVE

画面節（WINDOW SECTION）のACCEPT文，またはREPLY文実行時，［↑］キー，［↓］キーの動作を変更する環境変数です。

通常，この環境変数を指定していない場合，［↑］キー，［↓］キーを操作すると，現在のフィールドの前フィールド，または次フィールドにカーソルが位置づけられます。この環境変数を指定した場合，カーソルは下方向に位置する，入力，および入出力フィールドの先頭入力位置にカーソルが位置づけられます。YES以外の値を指定したときは，無効となります。

環境変数CBLUPDOWNMOVEを指定した場合，カーソルの動作例を次に示します。なお，ここで扱っているフィールドはすべて数字項目を扱う入力フィールドとします。

（例1）

［↓］キーを押す

カーソルは下に向かって移動します。この場合，真下より左方向に入力フィールドがあるため，そのフィールドの先頭入力位置にカーソルが位置づけられます。

（例2）

［↓］キーを押す

カーソルは下に向かって移動します。この場合，真下より左方向に入力フィールドがないため，左端から最初に位置する入力フィールドの先頭入力位置に，カーソルが位置づけられます。

（例3）

［↓］キーを押す

現在，カーソルの位置より下方向に入力フィールドがないため，画面上部に位置する入力フィールドの位置に，カーソルが位置づけられます。

36.2.7　画面（XMAP）

(1)　CBLPRNTID

通信節による画面機能でSYMBOLIC TERMINAL句の指定を省略した場合，送信先プリンタの仮想端末名を指定します。

詳細は，「12.1.4　プリンタに対する帳票出力」の「(4)　送信先の設定方法」を参照してください。

(2)　CBLPRNT_xxx

通信節による画面機能でSYMBOLIC TERMINAL句を指定した場合，送信先がプリンタのときの仮想端末名を指定します。

詳細は，「12.1.4　プリンタに対する帳票出力」の「(4)　送信先の設定方法」を参照してください。

(3)　CBLTERMID

通信節による画面機能でSYMBOLIC TERMINAL句の指定を省略した場合，送受信先がディスプレイのときの仮想端末名を指定します。

詳細は，「12.1.2　画面に対する入出力」の「(7)　送受信先の設定方法」を参照してください。

(4)　CBLTERMSHAR

複数プログラム間で一つの仮想端末を共有する場合，YESを指定します。YES以外の値を指定したときは，無効となります。

詳細は，「12.1.3　仮想端末の共用」を参照してください。

(5)　CBLTERM_xxx

通信節による画面機能でSYMBOLIC TERMINAL句を指定した場合，送受信先がディスプレイのときの仮想端末名を指定します。

詳細は，「12.1.2　画面に対する入出力」の「(7)　送受信先の設定方法」を参照してください。

36.2.8　整列併合

(1)　CBLSORTSIZE

整列処理で外部ファイルを使用するとき，整列機能が確保するメモリサイズをキロバイト単位で指定します。8けたの符号なし整数で設定します。

詳細には，「11.3.1　整列処理のメモリサイズ」を参照してください。

(2)　CBLSORTWORK

整列処理するときの作業用ファイルのパスプレフィクスを指定します。

詳細は，「11.2.2　整列作業用ファイル」を参照してください。

36.2.9　拡張機能

(1)　CBLOPS

MIOS7 COBOL85互換のための環境変数です。CBLOPSにYESを指定すると，次に示す環境変数のすべてにYESが指定されたものとして動作します。

YES以外の値を指定したときは，無効となります。

CBLISAMDL

CBLGDIWMSG

CBLFEP

CBLIMEPOS

CBLENTERCHK

CBLUNDERDOT

CBLJCPOPENDKEY

CBLUPDOWNMOVE

CBLAUTOCLEAR

(2)　CBLSQLCOMMOD

ODBCインタフェースを使ってCONNECT文でデータベースに接続するとき，コミットモードを設定するかどうかを設定します。CBLSQLCOMMODに設定する値によって，CONNECT文でデータベースに接続するときの動作は異なります。

形式

CBLSQLCOMMOD=｛DEFAULT｜AUTO｜MANUAL｝

DEFAULT

コミットモードが設定されません。デフォルトモード（自動コミットモード）で接続します。

AUTO

自動コミットモードが設定されて接続します。

MANUAL

手動コミットモードが設定されて接続します。

なお，この環境変数の設定を指定しなかったときには，MANUALが仮定されます。

(3)　CBLSQLCURUSE

ODBCインタフェース機能を使用した場合にカーソルオプションの設定を変更します。

形式

CBLSQLCURUSE=DYNAMIC

DYNAMIC

ODBCドライバのスクロール機能の動的カーソルを使用するように設定します。この環境変数の指定がない場合は，ODBCカーソルライブラリの静的カーソルを使用するようにODBCオプションを設定します。DYNAMIC以外の値を指定した場合の結果は，保証しません。

詳細は，「23.2.9　カーソルオプションの設定」を参照してください。

(4)　CBLSQLDYNAMIC

ODBCインタフェース機能の動的SQLで内部的に発行するODBC APIを変更したい場合に指定します。

詳細は，「23.2.11　動的SQLのODBC API関数発行の変更」を参照してください。

(5)　CBLSQLLOGINTIMEOUT

ODBCインタフェースを使ってODBCオプションのSQL_LOGIN_TIMEOUTに設定するタイムアウト秒数を指定します。

詳細は，「23.2.8　タイムアウト秒数の設定」を参照してください。

(6)　CBLSQLQUERYTIMEOUT

ODBCインタフェースを使ってODBCオプションのSQL_QUERY_TIMEOUTに設定するタイムアウト秒数を指定します。

詳細は，「23.2.8　タイムアウト秒数の設定」を参照してください。

(7)　CBLSQLROWCOUNT

ODBCインタフェースを使って埋め込みSQL文のDELETE文，INSERT文，またはUPDATE文実行によって影響を受けた行数が0行の場合，SQLCODE変数に100を設定したいときにYESを指定します。

詳細は，「23.2.4　SQL文のエラー処理」を参照してください。

(8)　CBLSQLSUPPRESSMSG

ODBCインタフェースを使って埋め込みSQL文の実行時，エラーが発生したときに出力されるKCCC8002R-Sのメッセージ出力を抑止したい場合，8002を指定します。

詳細は，「23.2.4　SQL文のエラー処理」を参照してください。

(9)　CBLSQLWMSG

ODBCインタフェースを使用してデータベースにアクセスする場合，警告メッセージの出力を抑止したいときにYESを指定します。指定しなかったときや，YES以外の値を指定したときは，警告メッセージを出力します。

詳細は，「23.2.4　SQL文のエラー処理」を参照してください。

36.2.10　デバッグ

(1)　CBLABNLST

異常終了時要約情報リストの出力先を指定します。

詳細は，「37.2　異常終了時要約情報リスト」を参照してください。

(2)　CBLDDUMP

異常終了時のデータ領域ダンプの出力先を指定します。詳細については，「37.3　データ領域ダンプリスト」を参照してください。

(3)　CBLDATADUMPFILE

CBLDATADUMPサービスルーチンによるデータ領域ダンプの出力先を指定します。詳細は「37.3.2　データ領域ダンプリストの出力先」を参照してください。

(4)　CBLEXCEPT

この環境変数にTHROWを指定すると，-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかを指定したプログラムの実行中に，例外が発生した場合，COBOLのデバッグ情報を出力して上位プログラムへ例外コードをスローします。詳細は，「37.7.3　COBOL実行時ライブラリが検出する例外」を参照してください。

(5)　CBLPRMCHKW

形式

CBLPRMCHKW=｛YES｜NOCHK｝

YES

テストデバッグ中のプログラム間整合性エラーを警告化します。

NOCHK

-DebugCompatiオプション指定時でもプログラム間整合性チェックはしません。

プログラム間の引数および返却項目に関するエラーがあることがわかっているが，異常終了させないでテストデバッグまたはプログラムを実行したいときに指定する環境変数です。

詳細は，「37.4.2　整合性チェックの警告エラー出力」を参照してください。

(6)　CBLTDEXEC

プログラムの開始と同時に，次のテストデバッガの機能を連動させるときに指定します。この環境変数は，デバッグの対象となるプログラムを起動する前に指定しておく必要があります。

GUIモードのテストデバッガ

カバレージ採取

カウント

プログラムからの連動実行の詳細は，マニュアル「COBOL2002　操作ガイド」を参照してください。

なお，OpenTP1から起動されるプログラムなど，プログラムがWindowsのサービス機能から起動された場合，リモートデスクトップ接続などでリモートアクセスしたクライアントからではなく，サーバ上でデバッグ操作をしてください。

形式

CBLTDEXEC=｛TD｜CV 〔引数〕｜CN 〔引数〕｝

TD引数

GUIモードのテストデバッグを連動実行します。

CV引数

カバレージ採取を連動実行します。

CN引数

カウントを連動実行します。

(7)　CBL_FLSRVDUMP

COBOL入出力サービスルーチンのデバッグ情報を出力するファイル名を指定します。詳細は，「13.5.2　インタフェース領域のダンプ出力」を参照してください。

36.2.11　イベントログ

(1)　CBLSYSLOG

イベントログファイル出力機能を有効にする場合，EVLOGを指定します。

詳細は，「10.5.2　イベントの出力」を参照してください。

(2)　CBLSYSLOGLVL

イベントログファイル出力機能で，DISPLAY文によるイベントの種類を指定します。

詳細は，「10.5.3　イベントの出力内容」の「(2)　イベントの種類の指定方法」を参照してください。

(3)　CBLSYSLOGSRV

イベントログファイル出力機能で，イベントログを出力するコンピュータ名を指定します。

詳細は，「10.5.4　イベントの出力先」の「(2)　出力先の指定方法」を参照してください。

36.2.12　オブジェクト指向

(1)　CBLGCINTERVAL

前回のガーベジコレクションの終了時から，インスタンスオブジェクトの生成によってメモリ使用量がどれだけ増加するとガーベジコレクションを開始するかを指定します。

規則

指定できるバイト数の値は，0〜2,147,483,647です。この値以外が指定されたときは，65,535バイトが仮定されます。

環境変数CBLGCINTERVALを指定しなかった場合は，65,535バイトが仮定されます。

指定できる値のけた数は，10けた以内です。10けたを超えているときは，65,535バイトが仮定されます。

指定例

ガーベジコレクションの実行間隔を32,768バイトにする例を次に示します。

set CBLGCINTERVAL=32768

注意事項

この環境変数の指定値を大きく設定した場合，メモリ資源を多く使用しますが，実行性能は向上する傾向にあります。指定値を小さく設定した場合，実行性能は向上しませんがメモリ資源を節約できます。アプリケーションの性質や環境を考慮に入れて指定してください。

(2)　CBLGCSTART

ガーベジコレクタの開始条件である，インスタンスオブジェクトの生成によるメモリ使用量の累積値を指定します。メモリ使用量の累積が，指定された値以上になったときガーベジコレクションが実行されます。

規則

指定できるバイト数の値は，0〜2,147,483,647です。この値以外が指定されているときは，524,288バイトが仮定されます。

環境変数CBLGCSTARTを指定しなかった場合は，524,288バイトが仮定されます。

指定できる値のけた数は，10けた以内です。10けたを超えているときは，524,288バイトが仮定されます。

指定例

ガーベジコレクションの開始条件のメモリ使用量を65,536バイトにする例を次に示します。

set CBLGCSTART=65536

注意事項

この環境変数の指定値を大きく設定した場合，メモリ資源を多く使用しますが，実行性能は向上する傾向にあります。指定値を小さく設定した場合，実行性能は向上しませんがメモリ資源を節約できます。アプリケーションの性質や環境を考慮に入れて指定してください。

第13編　デバッグ

37　アプリケーションデバッグ機能

この章では，プログラムの実行時にデバッグ用のリスト出力や各種のチェックをする機能について説明します。

37.1　デバッグ機能の種類と概要

アプリケーションデバッグ機能とは，プログラムの実行時に各種のエラーチェックをしたり，異常終了時やエラー発生時にデバッグに役立つリストを出力したりする機能です。

アプリケーションデバッグ機能を使うためには，デバッグ用のコンパイラオプションの指定が必要です。アプリケーションデバッグの各機能と指定するコンパイラオプションとの対応を次に示します。

表37‒1　アプリケーションデバッグ機能と指定するコンパイラオプション

機能

指定するコンパイラオプション

異常終了時要約情報リストの出力

-DebugInf，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれか（ただし，リスト中にトレースバック情報もあわせて出力するためには-DebugInf,Traceオプションの指定が必要）

データ領域ダンプリストの出力

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれか

プログラム間整合性チェック

-DebugCompati

添字，部分参照範囲外チェック

-DebugCompati

データ例外検出機能

-DebugData

テストデバッグ機能

-TDInf

カバレージ機能

-CVInf

添字の繰り返し回数の範囲外チェック

-DebugRange

デバッグ行の利用

-DebugLine

注

-TDInfオプションを指定したプログラムをテストデバッガでデバッグするとき，-DebugCompatiオプションの指定有無に関係なく，プログラム間の引数および返却項目に関するエラーをチェックします。

また，-TDInfオプションはテストデバッガのためにゼロによる除算チェックなど，最適化に影響を与えるオブジェクトコードを生成します。これによって，-TDInfオプションを指定することで，異常終了時要約情報リストなどの行番号／欄の情報が変化する場合があります。行番号／欄の情報を常に正しく保つためには，-Optimize,0オプションを指定してください。

37.2　異常終了時要約情報リスト

COBOL2002では，プログラムが異常終了した場合に原因を究明するための情報を，異常終了時要約情報リストとして出力できます。

異常終了時要約情報リストを出力するには，COBOLプログラムのコンパイル時に-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかのオプションを指定してください。

ただし，COBOLプログラム実行時の初期処理，または終了処理中にエラーが発生した場合は，異常終了時要約情報リストが出力されない場合があります。

37.2.1　異常終了時要約情報リストの内容

異常終了時要約情報リストに出力される情報を，次に示します。

なお，次の説明中の「行番号」とは，コンパイルリストに示された行番号のことを指します。

最終実行文情報

異常終了したプログラムの名称※，コンパイル日時，行番号，欄が出力されます。

注※

プログラムの名称には，プログラムの種類によって次のどれかが表示されます。

関数名

クラス名／メソッド名

プログラム名

呼び出し元プログラムトレース

CALL文またはINVOKE文で呼び出されたプログラム（内側のプログラムと最外側のプログラムの呼び出しも含む）で異常終了した場合，呼び出し元のプログラムの名称※とCALL文またはINVOKE文の行番号が出力されます。

注※

プログラムの名称には，プログラムの種類によって次のどれかが表示されます。

関数名

クラス名／メソッド名

プログラム名

例外種別

例外の種別とその意味が出力されます。例外種別については，「37.7　COBOLが検出するハードウェア例外およびソフトウェア例外」を参照してください。

トレースバック情報（-DebugInf,Traceオプション指定時だけ出力）

異常終了するまでに実行の対象となったプログラムの名称※と行番号が出力されます。詳細は，「37.2.2　トレースバック表示」を参照してください。

注※

プログラムの名称には，プログラムの種類によって次のどれかが表示されます。

関数名

メソッド名

プログラム名

環境変数情報

異常終了時の実行時環境変数の名称と指定値が出力されます。環境変数情報については，「37.2.3　環境変数情報表示」を参照してください。

出力例

異常終了時要約情報リストの出力例を，次に示します。

1.異常終了時要約情報リストの先頭に出力されるリストヘッダの内容を次に示します。

COBOL2002

COBOL2002を示します。

（X）

COBOL2002の識別記号を示します。詳細は「付録M.2　このマニュアルでの表記」を参照してください。

VV-RR

COBOL2002のバージョン番号を示します。

YYYY-MM-DD

異常終了したプログラムの実行日付（年-月-日）を示します。

HH:MM:SS

異常終了したプログラムの実行時刻（時:分:秒）を示します。

2.-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかのオプションを指定した場合，最終実行文情報，およびCALL文またはINVOKE文のトレース情報が出力されます。

3.-DebugInf,Traceオプションを指定した場合，トレースバック情報が出力されます。

4.-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかのオプションを指定した場合，環境変数情報を出力します。

なお，1行が79カラムを超える場合は，改行します。

注意事項

最適化によって，最終実行文情報の行番号に数行のずれが発生したり，0になることがあります。正しい行番号／欄の情報を出力するには，コンパイル時に-Optimize,0オプションを指定して最適化を抑止する必要があります。

37.2.2　トレースバック表示

-DebugInf,Traceオプションを指定してコンパイルしたプログラムでは，異常終了時要約情報リストにトレースバック情報が出力されます。

トレースバック情報には，異常終了するまでに実行の対象となったプログラムの名称と次の行番号※が出力されます。

PROCEDURE DIVISIONまたはENTRY文の行番号※

実行された手続きの名称が書かれた行の行番号※

IF文などで分岐したあと，最初に実行した文の行番号※

出力される行番号※は1プログラム当たり最大240個です。

注※

行番号は，コンパイルリストに示された番号です。

トレースバック情報は，次の例の点線で示した矢印のように追跡して出力されます。この例では，プログラムSUBPRG1は実行済みであってもトレースバック情報の対象にはなりません。

（トレースバック情報出力範囲の例）

37.2.3　環境変数情報表示

COBOLプログラム異常終了時に有効な環境変数を出力します。異常終了の要因に環境変数の設定値が関係すると考えられる場合，環境変数情報からその値を容易に求められます。

出力する環境変数を次に示します。

COBOLプログラム実行に関係する可能性のある実行時環境変数※

システム環境変数PATH，LIB

注※

"CBL"，"COBOL"で始まる環境変数名が出力対象となります。このため，COBOL2002実行時に内部的に設定されている環境変数も出力される場合があります。

37.2.4　異常終了時要約情報リストの出力先

異常終了時要約情報リストの出力先は，環境変数CBLABNLSTで指定します。

環境変数の指定例を次に示します。

形式

set CBLABNLST=C:¥users¥abend.lst

規則

ファイルは，ドライブ名からの絶対パス名で指定します。

指定したファイルがすでにある場合は，ファイルの最後にリストが追加されます。ファイルがない場合は，ファイルが新規に作成されます。

複数のプロセスから同時に一つのファイルに対して異常終了時要約情報リストを出力した場合，動作は保証しません。このため，環境変数CBLABNLSTで指定する異常終了時要約情報リストの出力先は，プロセスごとに異なるファイルとなるようにしてください。

環境変数CBLABNLSTの指定がない場合，GUIモードのときはCOBOL2002が出力するコンソール画面に，CUIモードのときは標準エラー（stderr）に，異常終了時要約情報リストが出力されます。

また，環境変数に値を設定していない場合（"CBLABNLST="だけを指定した場合），ファイルは出力されません。

37.2.5　プログラム混在時のリストの内容

次のように種類の異なるプログラムが混在していると，出力される異常終了時要約情報リストの内容が異なります。

デバッグ用オプション（-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，または-DebugRange）を指定したプログラムと指定しないプログラムが混在している場合

COBOL以外のプログラムが混在している場合

プログラムが混在している場合に出力される異常終了時要約情報リストの内容を次に示します。

表37‒2　プログラム混在時の異常終了時要約情報リストの内容

異常終了したプログラム

異常終了前の状態

-DebugInf,Trace指定のプログラムがすでに動作している

デバッグ用オプション指定のプログラムがすでに動作している

デバッグ用オプション指定のプログラムがまだ動作していない

デバッグ用オプションのどれかを指定したプログラム

○※1

×

×

-DebugInf,Traceを指定したプログラム

○

○

○

デバッグ用オプション指定のないプログラム，またはCなどの他言語プログラム

×※1

×※2

リストは出力されない。

（凡例）

○：異常終了時要約情報リスト中にトレースバック情報を含む

×：異常終了時要約情報リスト中にトレースバック情報を含まない

注※1

リストは，異常終了したプログラムよりも前に制御が渡っている-DebugInf,Trace指定のプログラムから出力されます。

注※2

リストは，異常終了したプログラムよりも前に制御が渡っている-DebugInf，-DebugCompati，-DebugData，-TDInf，-CVInf，または-DebugRange指定のプログラムから出力されます。

37.3　データ領域ダンプリスト

COBOL2002では，プログラムが異常終了したとき，またはCBLDATADUMPサービスルーチンを呼び出したときのデータ領域の状態を，データ領域ダンプリストとして出力できます。

データ領域ダンプリストを出力するには，COBOLプログラムのコンパイル時に-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかのオプションを指定してください。データ領域ダンプリストには，どれかのオプションが指定されているプログラムの情報が出力されます。

COBOLプログラムの翻訳時に-SrcList,xxxxx,DataLocオプション※を指定して，コンパイルリスト（原始プログラムリスト）にデータ項目の相対位置を表示させた場合，データ領域中の各データ項目の相対位置がわかるため，データ領域を効率良く参照できます。

注※

xxxxxには，OutputAll，CopyAll，CopySup，NoCopyのどれかを指定します。

なお，相対位置の表示については，「33.5.13　リスト出力の設定」の「(1)　-SrcListオプション」および「付録E.2　リストの見方」の「(4)　相対位置表示時の原始プログラムリスト」を参照してください。

37.3.1　データ領域ダンプリストの内容

(1)　データ領域ダンプの出力条件

データ領域ダンプの出力の対象となるプログラムを次に示します。

1回以上実行され，かつ，異常終了の時点，またはCBLDATADUMPサービスルーチン実行の時点で，CANCEL文で取り消されていないプログラム

1回以上実行された利用者定義関数

異常終了した時点，またはCBLDATADUMPサービスルーチン実行の時点で動作中のメソッド

異常終了したメソッド，またはCBLDATADUMPサービスルーチン実行時に動作中のメソッドを含むクラス

(2)　出力される内容

データ領域ダンプリストに出力される情報を次に示します。

異常終了したプログラム，またはCBLDATADUMPサービスルーチンを呼び出すプログラムが実行されるまでに1度以上実行されたCOBOLプログラム名※1と，定義されているデータの内容※2

注※1

プログラムの名称には，プログラムの種類によって次のどれかが表示されます。

関数名

クラス名／メソッド名

プログラム名

注※2

実行が終了したプログラムの局所場所節（LOCAL-STORAGE SECTION）は出力されない

実行が終了したINITIAL属性プログラムの作業場所節（WORKING-STORAGE SECTION）は出力されない。

EXTERNAL句を指定したファイル名とレコード領域の内容

EXTERNAL句を指定したデータ名とデータの内容

EXTERNAL指定のファイル名およびデータ名は，外部属性を持ち，COBOL実行単位内で一つの領域を共用するため，特定のプログラムには所属しません。このため，EXTERNAL句を指定したファイル名とレコード領域およびEXTERNAL句を指定したデータ名とデータの内容は，定義されたプログラムのコンパイラオプション※指定の有無に関わらず表示されます。ただし，コンパイラオプション※を指定したプログラムが一つも実行されていない場合，EXTERNAL句を指定したファイル名とレコード領域およびEXTERNAL句を指定したデータ名とデータの内容は表示されません。

注※

コンパイラオプションは次のどれかです。

-DebugInf, -DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRange

これらのリストは，それぞれの領域の先頭を0としたデータの相対的な位置と内容をダンプ形式で出力したものです。

(3)　出力例

(a)　プログラムで定義されたデータ領域の出力例

注

同一内容の行が続く場合は，「LINE(S)位置　SAME AS ABOVE」が表示されます。

このリスト中のプログラム名は，PROGRAM-ID段落に書かれたプログラム名です。

(b)　EXTERNAL句を指定したファイルのレコード領域の出力例

このリスト中のファイル名は，SELECTの直後に書かれたファイル名です。

(c)　EXTERNAL句を指定したデータ領域の出力例

このリスト中のデータ名は，EXTERNAL句を指定した01レベルのデータ名を示します。位置と内容の部分は，データの先頭を0とした相対的な位置と内容をダンプ形式で示したものです。

37.3.2　データ領域ダンプリストの出力先

データ領域ダンプの出力先は，環境変数CBLDDUMPまたは環境変数CBLDATADUMPFILEが存在する場合に指定されたファイルに出力します。

プログラム異常終了時

環境変数CBLDDUMP

CBLDATADUMPサービスルーチン使用時

環境変数CBLDATADUMPFILE

環境変数の指定方法を次に示します。

(1)　プログラム異常終了時

set CBLDDUMP=C:¥users¥data.dmp

(2)　CBLDATADUMPサービスルーチン使用時

set CBLDATADUMPFILE=C:¥users¥data.dmp

ファイルは，ドライブ名からの絶対パス名で指定します。

指定したファイルがすでにある場合は，ファイルの最後にリストが追加されます。ファイルがない場合は，ファイルが新規に作成されます。

環境変数の指定がない場合，および環境変数に値を設定していない場合（"CBLDDUMP="または"CBLDATADUMPFILE="だけを指定した場合），リストは出力されません。

37.4　プログラム間整合性チェック

引数および返却項目を利用してプログラム間の連絡をする場合，呼び出し元プログラムと呼び出し先プログラムの引数および返却項目の形式が異なると，プログラムが異常終了したり，不正な動作をしたりすることがあります。COBOL2002では，-DebugCompatiまたは-TDInfオプションを指定すれば，プログラム間の引数および返却項目の整合性をチェックできます。

なお，COBOL2002では，プログラム間整合性チェックよりも，例外名EC-PROGRAM-ARG-MISMATCHでの引数と返却項目の適合チェックの使用を推奨します。引数と返却項目の適合チェックの詳細は，マニュアル「COBOL2002　言語　標準仕様編」　「10.7　引数と返却項目の適合」を参照してください。

37.4.1　整合性チェックの内容

-DebugCompatiまたは-TDInfオプションを指定すると，次の項目についてプログラム間の整合性をチェックできます。

引数の長さ

引数の個数

引数の属性（BY REFERENCE，BY CONTENT，BY VALUE）

返却項目の長さ

コンパイラオプションと整合性チェックの関係

呼び出し元プログラム，呼び出し先プログラムのコンパイル時に指定したオプションと，整合性チェックの関係を次に示します。

呼び出し先

呼び出し元

-DebugCompati

-TDInf

-DebugCompati，-TDInfなし

-DebugCompati

○

△

×

-TDInf

△

△

×

-DebugCompati，-TDInfなし

×

×

×

（凡例）

○：整合性チェックが行われる

△：テストデバッガを使用したデバッグ時だけ，整合性チェックが行われる

×：整合性チェックは行われない

規則

プログラム間の整合性チェックに関する規則を次に示します。

整合性チェックでプログラム間で受け渡す引数および返却項目に矛盾がある場合は，メッセージが出力され，プログラムが異常終了します。

ただし，-DebugCompatiオプションの指定がないプログラムをテストデバッグする場合は，環境変数CBLPRMCHKWにYESを指定すると処理を続行できます。また，環境変数CBLPRMCHKWにNOCHKを指定すると，-DebugCompatiオプション指定時およびテストデバッグ時に，プログラム間整合性チェックで不整合があってもエラーとしないで，処理を続行できます。詳細は，「37.4.2　整合性チェックの警告エラー出力」を参照してください。

整合性をチェックするのは，CALL文でCOBOLプログラムを呼び出すときで，実行時にチェックします。

CALL定数で内側のプログラムを呼び出す場合，-DebugCompatiオプションまたは-TDInfオプションの指定がないときも，翻訳時に整合性をチェックします。

COBOLプログラムとCプログラムとの間のチェックはしません。

引数が可変長項目のとき，引数の長さはチェックしません。

-Main,System，-Main,V3オプションを指定したプログラムに対しては，引数の長さ，引数の個数をチェックしません。

-SimMainオプションを指定した実行可能ファイルで，最初に制御が渡るプログラムでの引数チェックはしません。

BY VALUE指定の浮動小数点項目は，送り出し側作用対象と受け取り側作用対象で同じ属性でなければなりません。属性が異なる場合，整合性チェックでエラーとなります。

-DebugCompatiオプションを指定すると，一部の例外名に対するTURN指令が無効となります。詳細は「21.8.2　例外検出での注意事項」の「(4)　コンパイラオプションとの関連性」を参照してください。

引数が動的長基本項目の場合，送り出し側作用対象と受け取り側作用対象がともに動的長基本項目で，かつその字類が一致しなければなりません。また，LIMIT指定が双方に指定されている場合は，その値が一致していなければなりません。

37.4.2　整合性チェックの警告エラー出力

プログラム間の引数および返却項目に矛盾があっても，整合性エラーとしないでテストデバッグを実行したい場合，環境変数CBLPRMCHKWを指定します。

形式

CBLPRMCHKW=｛NOCHK｜YES｝

規則

環境変数CBLPRMCHKWにNOCHKを指定した場合

プログラム間の引数および返却項目について，整合性がチェックされません。この場合，プログラム間の引数および返却項目に不整合があっても異常終了しないで，メッセージも出力されません。

-DebugCompatiまたは-DebugRangeオプションを指定したプログラムでも，プログラム間の引数および返却項目に不整合があっても異常終了しないで，メッセージも出力されません。ただし，プログラム間の引数および返却項目の整合性チェック以外のチェック（繰り返し回数の範囲チェックなど）は，実行されます。

環境変数CBLPRMCHKWにYESを指定した場合

-DebugCompatiおよび-DebugRangeオプションを指定しないプログラムのテストデバッグ中に，プログラム間の引数および返却項目に関するエラーが発生したときには，警告メッセージが出力され実行が継続されます。

-DebugCompatiまたは-DebugRangeオプションを指定したプログラムでは，環境変数CBLPRMCHKWにYESを指定しても無効となり，エラー発生時にはメッセージが出力され異常終了します。

YES，またはNOCHK以外の文字を指定した場合は，この環境変数の指定は無効になります。

注意事項

この環境変数を指定した場合，引数および返却項目の矛盾した領域に対して不当な値を設定したり，不当な領域を参照したりすると，異常終了やシステムダウンすることがあります。また，引数および返却項目に次のような矛盾があるプログラム間で，データを受け渡しする場合はプログラムの見直しが必要です。

・RETURNING指定ありと，指定なしが混在している

・USING指定のデータ項目数が異なる

・データ項目の長さが8バイトを超えるデータと8バイト以下のデータとで受け渡しする

この環境変数の指定は，引数が不一致の場合のCOBOLの動作を保証するものではありません。

この環境変数の指定は，プログラムの呼び出し規約がstdcall呼び出し規約プログラムの呼び出しでは使用できません。stdcall呼び出し規約プログラムでは，引数を完全に一致させる必要があるため，引数が不一致の場合，Windowsでリンクエラーとなります。

37.5　添字，指標の繰り返し回数，制御変数チェック

37.5.1　デバッグオプションとの関連性

-DebugCompatiまたは-DebugRangeオプションを指定してコンパイルしたプログラムの実行時，次のエラーが検出されると，メッセージが出力され，実行が中止します。

なお，-DebugCompatiオプションおよび-DebugRangeオプションについては，「33.5.9　デバッグの設定」の「(3)　-DebugCompatiオプション」および「(7)　-DebugRangeオプション」を参照してください。

(1)　-DebugCompatiオプション指定時

表操作で使用する添字または指標名が指す表要素が表の範囲外である。

部分参照の指定がデータ項目の範囲外である。

プログラム間で整合性が取れていない。

(2)　-DebugRangeオプション指定時

表操作で使用する添字または指標名の値が各次元の繰り返し回数の範囲外である。

部分参照の指定がデータ項目の範囲外である。

37.5.2　注意事項

-DebugCompatiまたは-DebugRangeオプションを指定すると，一部の例外名に対するTURN指令が無効となります。詳細は「21.8.2　例外検出での注意事項」の「(4)　コンパイラオプションとの関連性」を参照してください。

COBOL2002では，-DebugCompatiまたは-DebugRangeオプションよりも，例外名EC-BOUND-REF-MOD，またはEC-BOUND-SUBSCRIPTでの，添字，指標の繰り返し回数，制御変数チェックの使用を推奨します。

37.6　データ例外検出機能

-DebugDataオプションを指定してコンパイルしたプログラムを実行したとき，格納値とデータ項目の属性とがチェックされます。チェックされるのは，次の外部または内部10進項目です。格納値がデータ項目の属性と矛盾している場合，データ例外エラーとなります。

転記の送り出し側作用対象（受け取り側作用対象が2進項目の場合だけ）

算術式の作用対象

比較の作用対象

添字

部分参照の最左端位置と長さ

データ例外が検出されると，エラーメッセージが出力され，プログラムが異常終了します。

-DebugData,ValueHexオプションを指定してコンパイルしたプログラムを実行した場合，データ例外が検出されると，出力されるエラーメッセージにデータ項目の属性と矛盾している格納値が16進数で表示されます。

37.7　COBOLが検出するハードウェア例外およびソフトウェア例外

37.7.1　ハードウェア例外およびソフトウェア例外とは

例外は，プログラムの実行状態が異常になった場合に発生します。PCのアーキテクチャでは，命令実行中の異常事態を検知するためにCPU内部で発生させる割り込みのことを特に例外と呼び，CPU外部の要因で引き起こされる割り込みとは区別します。この例外にはCPUが検知するハードウェア例外とソフトウェアによって発行されるソフトウェア例外があります。

37.7.2　アプリケーションエラー

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeオプションのどれも指定しないでコンパイルしたプログラムの実行でハードウェア例外やソフトウェア例外が発生した場合，OSがアプリケーションエラーのダイアログボックスを表示します。代表的なアプリケーションエラーと対処法を「表37‒3　代表的なアプリケーションエラー」に示します。

アプリケーションエラーが発生した場合は，次の手順で発生している例外種別および発生個所を調べてください。

-DebugInfまたは-DebugInf,Traceオプションを指定して再度コンパイルと実行をする

異常終了時要約情報リストで発生している例外種別および発生個所を調べる

発生個所がCALL文を指している場合は，その呼び出し先プログラムも調査の対象としてください。

表37‒3　代表的なアプリケーションエラー

例外名称（例外コード）

意味と対処方法

アクセス違反

（0xc0000005）

（原因）アクセスが許されていないメモリに読み書きしようとした。

（対処）このエラーは主に次の要因で発生する。これに該当しないかを確認する。

呼び出し元プログラムと呼び出し先プログラムで，引数の属性，長さ，または数が一致していない

表操作で使用する添字または指標の値がOCCURSで定義した範囲を超えた

部分参照でデータ項目の領域を超えて参照した

アドレス名に不正なアドレスが入っている状況で，ADDRESSED句付きで定義されたデータ名を参照した

可変長項目のDEPENDING ONに指定されたデータ項目に不当な値が入っている状態で，その可変長項目，またはその従属項目を参照した

1.〜3.の場合，-DebugRangeを指定してコンパイル・実行することで，そのエラーであることおよび発生個所を特定できる。

ゼロ除算

（0xc0000094）

（原因）ゼロで除算しようとした（被除数，除数ともに浮動小数点データでない場合）。

（対処）ゼロによる除算が発生しないようにプログラムを変更する。

スタックオーバフロー

（0xc00000fd）

（原因）プログラムが使用するスタックサイズが，プログラムで許されたスタックの上限を超えた。再帰属性プログラム，メソッド，および利用者定義関数で，次の場合に発生しやすくなる。

局所場所節のデータ定義の合計サイズが大きい

大量に再帰呼び出しがある

連絡節のデータ定義の合計サイズが大きい

BY CONTENT，BY VALUEが仮定される関数の引数に大きなデータ項目がある

（対処）プログラムのスタックの上限は，-STACKオプションで変更できる。このオプションで変更してから再リンクして，スタックの上限を変更する。-STACKオプションについては，「38.1.3　オプション」を参照のこと。

COBOLプログラムが使用するスタック領域については，「31.3　COBOLプログラムが使用するスタック領域」を参照のこと。

37.7.3　COBOL実行時ライブラリが検出する例外

(1)　例外種別の出力

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeオプションのどれかを指定してコンパイルしプログラムを実行した場合に例外が発生すると，COBOLがこれを検知し，実行時メッセージ，および異常終了時要約情報リストで例外種別を出力します。この情報によって，どのような例外が発生したか，および例外がどの実行文で発生しているかを把握できます。

実行時メッセージ，および異常終了時要約情報リストに表示される例外種別とその意味を次に示します。

表37‒4　実行時メッセージ，および異常終了時要約情報リストに表示される例外種別

例外種別

意味

RUNTIME ERROR

COBOL実行時エラーが発生した。

CBLABN

CBLABNサービスルーチンが呼び出された。

EXCEPTION_ACCESS_VIOLATION

「表37‒3　代表的なアプリケーションエラー」の「アクセス違反」を参照

EXCEPTION_INT_DIVIDE_BY_ZERO

「表37‒3　代表的なアプリケーションエラー」の「ゼロ除算」を参照

EXCEPTION_INT_OVERFLOW

整数演算の結果，最上位ビットのキャリーアウトが発生した。

EXCEPTION_FLT_DENORMAL_OPERAND

浮動小数点演算で使用している作用対象に異常があり，その値が小さ過ぎるため，標準の浮動小数点値として表せない。

EXCEPTION_FLT_DIVIDE_BY_ZERO

浮動小数点値を浮動小数点値0で割ろうとした。

EXCEPTION_FLT_INEXACT_RESULT

浮動小数点演算の結果を10進小数として正確に表せない。

EXCEPTION_FLT_OVERFLOW

浮動小数点演算の指数の値が，対応する型の上限値を超えている。

EXCEPTION_FLT_UNDERFLOW

浮動小数点演算の指数の値が，対応する型の下限値を超えている。

EXCEPTION_FLT_STACK_CHECK

浮動小数点演算の結果，スタックのオーバフローまたはアンダーフローが発生した。

EXCEPTION_FLT_INVALID_OPERATION

この表にないすべての浮動小数点例外を表す。

EXCEPTION_PRIV_INSTRUCTION

現在のマシンモードでは実行できない演算命令を実行しようとした。

STATUS_NONCONTINUABLE_EXCEPTION

実行を続行できない例外の発生後，実行を続行しようとした。

(2)　プロセスの終了

異常終了時要約情報リストを出力後，プロセスは終了コード1で終了します。

ただし，環境変数CBLEXCEPT=THROWを指定したときはシステムが返す値が設定されます。

(3)　例外発生時の動作を指定する実行時環境変数CBLEXCEPT

形式

CBLEXCEPT=THROW

規則

この環境変数にTHROWを指定すると，デバッグ用コンパイラオプション-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeのどれかを指定したプログラムの実行中に例外が発生した場合，例外コードを上位プログラムにスローします。

このとき，異常終了時要約情報リストを出力し，終了方法は上位の制御プログラムの終了処理に依存します。

例えば，デバッグ環境を構築できない環境でシステム例外発生時のデバッグをする場合に指定します。

この環境変数を指定したときの動作を次に示します。

COBOLプログラムがメインでないアプリケーションやGUIプログラムでは，この環境変数を指定しても，有効となりません。

CBLDBGINFサービスルーチンを呼び出した場合は，例外コードを上位プログラムにスローしません。

THROWを指定した場合，ハードウェア例外やソフトウェア例外が発生して異常終了したとき，WindowsシステムのWindows エラー報告（WER）の設定などによって，クラッシュダンプが出力されることがあります。

クラッシュダンプからシステム例外発生時点のスタックトレースなどを参照するために有用なコンテキスト情報のアドレスが実行時メッセージ中に出力されます。

また，上位プログラムのユーザープログラムに例外処理があれば，そちらに制御が移ります。

なお，ミドルソフトなどでこの例外処理を実装している場合もありますので，異常終了時の出力情報を確認してください。

この環境変数を指定しても実行性能への影響はありません。

37.7.4　注意事項

COBOLプログラムがメインでないアプリケーションでは，-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeを指定しても，ハードウェア例外およびソフトウェア例外の発生時にアプリケーションエラーになり，異常終了時要約情報リストは出力されません。

COBOL以外のプログラムで上記の例外が発生した場合，異常終了時の結果が保証されないときがあります。詳細については，「19.1　C言語との連携」を参照してください。

-Main,Systemまたは-Main,V3オプションを指定してコンパイルしたCOBOL主プログラムでスタックオーバフローが発生した場合は，-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，または-DebugRangeオプションの有無に関係なく，アプリケーションエラーとなります。

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRangeを指定してコンパイルしたCOBOLプログラムに1回以上制御が渡ったあとでなければ，異常終了時要約情報リストは出力されません。

37.8　DISPLAY文による一意名の16進ダンプ表示

DISPLAY文での表示では，英数字項目に印字不可能文字が設定されている場合や，2進項目にPICTURE句のけた数を超えて値が格納されている場合には，内容を確認できないことがあります。このような場合に，一意名の格納値を16進ダンプ表示すると，一意名の内容を確認できます。

一意名の格納値をバイト単位で16進ダンプ表示するときは，DISPLAY文にIN DATA DUMPを指定します。

DISPLAY文の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」を参照してください。

各データ属性を16進ダンプ表示したときの表示例を次の表に示します。

表37‒5　データ属性を16進ダンプ表示したときの表示例

データ属性

16進ダンプ表示の例

格納されている定数値

表示形式

集団項目，英字項目，英数字項目，英数字編集項目

'ABCD'

41424344

日本語項目，日本語編集項目

N'あいう'

82a082a282a4

外部10進項目

+123

313233

内部10進項目

+123

123c

数字編集項目

+12.3

2b31322e33

2進項目，COMP-X項目，アドレス名，アドレスデータ項目，ポインタ項目

値10(H'0000000A')が4バイトの領域に格納されている場合

ビッグエンディアンの場合

0000000a

リトルエンディアンの場合

0a000000

外部浮動小数点項目

+0.25E+0

2b322e35452d3031

内部浮動小数点項目

+0.25E+0

ビッグエンディアンの場合

3e800000

リトルエンディアンの場合

0000803e

外部ブール項目

B'010'

303130

内部ブール項目

B'010'

40

37.9　テストデバッグ機能

テストデバッガは，TDコマンドなどでプログラムの実行を制御しながらプログラムをテストしたり，デバッグしたりする機能です。テストデバッガで，プログラムの実行を実行文単位に中断し，データ項目に対して値を表示，代入，比較してデバッグできます。また，未完成のプログラムをテストできます。

テストデバッガには，GUIモードとバッチモードの二つの方法があります。

GUIモードでは，ウィンドウに表示されたプログラムの動きを確認しながら，マウスやキーボードの操作によって，対話的にテストしたり，デバッグしたりできます。TDコマンドも入力できます。

バッチモードでは，あらかじめ，実行したいTDコマンドをファイルにまとめて記述しておき，そのファイルを入力して起動することによって，一括してテストデバッグを実行する方法です。コマンドプロンプトに，TDコマンドを記述したファイルを指定した起動コマンドを入力すると，ファイルに記述されたTDコマンドを一括して実行します。一度実行を開始すれば，利用者の操作を必要としないので，効率良く大量のプログラムがテストできます。

テストデバッグ機能の詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

37.9.1　デバッグ機能

プログラムを実行しながら次の操作ができます。

実行プログラムの中断

プログラムの実行を実行文単位に中断し，データの代入などができます。

実行の制御

設定した中断点などに基づき実行できます。機能の概要についてはマニュアル「COBOL2002　操作ガイド」を参照してください。

データの操作

COBOLプログラムのデータに対して，値の表示，値の代入，比較ができます。

37.9.2　テスト機能

未完成のプログラムを単体でテストできます。呼び出し元のプログラム，呼び出し先のプログラム，ファイル，またはDC（データコミュニケーション）を，TDコマンドによってシミュレーションできます。

37.10　カバレージ機能

カバレージを使用して，テスト終了後，C0メジャー，C1メジャー，未実行文情報などのカバレージ情報を集計して表示できます。カバレージ情報を確認することでテストの進捗状況や性能を数値で把握できます。カバレージには，テストの進捗状況を定量的に表すカバレージ情報，文の実行回数をカウントするカウント情報の表示機能があります。

カバレージには，GUIモード，バッチモードの二つの方法があります。

GUIモードでは，ウィンドウのメニューからカバレージの機能を操作できます。

バッチモードでは，コマンドプロンプトから入力するコマンドの指示によって，カバレージの機能を操作できます。プログラムからカバレージを連動実行させ，一括してカバレージの蓄積およびカウント情報を表示することもできます。一度実行を開始すれば，利用者の操作を必要としないので，効率良く大量のプログラムのカバレージ情報の蓄積ができます。

カバレージ機能の詳細については，マニュアル「COBOL2002　操作ガイド」を参照してください。

37.10.1　カバレージ情報の表示

カバレージ情報は，テストによって実行された手続き文の割合です。計画したテスト内容に従って，プログラムに記述した手続き文がテスト実行されたかどうかを把握でき，テスト工程の進捗度を判定できます。

実行されたテストプログラムの文はカバレージ情報としてプログラム情報ファイルに記憶されます。プログラム情報ファイルに蓄積されたカバレージ情報は，次の形式で表示できます。

翻訳単位ごとに実行された文の割合を，文・分岐・呼び出し文ごとに示す。

ソース原文を表示して実行が済んだ文と実行されていない文を示す。

原始プログラムの修正によって変更された差分に対するカバレージ情報を示す。

さらに，蓄積したカバレージ情報をクリアする，別の環境で蓄積したカバレージ情報をマージするなどの機能があります。

37.10.2　カウント情報の表示

テスト実行させたプログラムの文の実行回数を表示します。繰り返し実行される文の実行回数や，呼び出すプログラムの実行回数も計測できるため，プログラムの実行性能を把握できます。このカウント情報を基にして，改善の施策を検討できます。

第14編　リンカとリソースコマンド

38　リンカ，ライブラリ管理ツール，リソースコンパイラ

この章では，リンカ，ライブラリ管理ツール，リソースコンパイラの使い方とモジュール定義ファイルの作成方法について説明します。この章に記載していない各コマンドのオプションは，COBOL2002のコンパイルおよび実行での動作を保証しません。

この章は，Microsoftが提供するソフトウェアの仕様記述を，日立製作所が翻訳し，修正または変更を行ったものです。それらの翻訳，修正および変更に関して，Microsoftは，レビューも承認も行っていませんし，変更内容に責任を負うものでもありません。また，翻訳，修正，変更に伴って誤りが含まれたとしてもMicrosoftは責任を負いません。

38.1　リンカ

38.1.1　機能の概要

リンカ（LINKコマンド）は，複数のオブジェクトファイル，ライブラリファイル，リソースファイルを連結して，Windows上で動作する実行可能ファイル，DLLを作成するものです。

38.1.2　コマンドラインの形式

LINKコマンドの形式を次に示します。

形式

LINK OBJファイル名 〔LIBファイル名〕 〔オプション〕

OBJファイル名

オブジェクトファイル（.obj），およびリソースファイル（.res）の並びを指定します。ただし，リソースファイルの指定は任意です。

LIBファイル名

ライブラリファイルの並びを指定します。

オプション

リンカオプションの並びを指定します。リンカオプションについては，「38.1.3　オプション」を参照してください。

指定規則

コマンドライン上には，コマンド名以降であればどこにでもコマンドファイルを指定できます。ファイル名の先頭には@を付けて指定します。コマンドファイルを指定すると，ファイルの中身がコマンドライン上に展開され，コマンドの一部となります。

（例）

LINK @OBJECT.lst -MAP @LIBRARY.lst -OUT:TEST.exe

OBJファイル名，LIBファイル名，リンカオプションの指定順序は任意です。ただし，OBJファイルは指定した順番に結合されます。

コマンドラインの区切り記号には，空白およびタブが使用できます。コマンドファイル内では，空白，タブ，セミコロン（;）および改行文字が使用できます。セミコロン（;）から改行文字までの指定は無効となり，コマンドファイル内にコメントを記述するために使用します。

OBJファイル名，LIBファイル名にはワイルドカード（*）が使用できます。

ファイル名は，必ず拡張子を付けて指定します。

リンカオプションは英大文字，英小文字のどちらで指定しても同じ扱いとなります。また，ハイフン（-）の代わりにスラント（/）で始めることもできます。

背反するオプションを指定した場合の動作は，各オプションの詳細を参照してください。

38.1.3　オプション

リンカ（LINKコマンド）で使用できるオプションを次に示します。

表38‒1　リンカオプション一覧

オプション名

機能

参照先

Windows(x86) COBOL2002

Windows(x64) COBOL2002

-ALLOWBIND

DLLをバインドできないことを指定します

(1)　-ALLOWBIND:NO

○

○

-DEF

モジュール定義ファイル(.def)をリンカ（LINKコマンド）に渡します

(2)　-DEF:モジュール定義ファイル名

○

○

-DEFAULTLIB

外部参照を解決するときに指定したライブラリを検索します

(3)　-DEFAULTLIB:ライブラリ名

○

○

-DLL

DLLを作成します

(4)　-DLL

○

○

-ENTRY

開始アドレスを設定します

(5)　-ENTRY:シンボル名

○

○

-EXPORT

関数をエクスポートします

(6)　-EXPORT:名前〔,@順序番号〔,NONAME〕〕

○

○

-FORCE

未解決または複数定義のシンボルがある場合でもリンクを強制的に終了させ，有効な実行可能ファイルDLLファイルを生成します

(7)　-FORCE〔:｛MULTIPLE｜UNRESOLVED｝〕

○

○

-HEAP

ヒープサイズをバイト単位で設定します

(8)　-HEAP:仮想メモリサイズ〔,実メモリサイズ〕

○

○

-IMPLIB

デフォルトのインポートライブラリ名をオーバーライドします

(9)　-IMPLIB:インポートライブラリ名

○

○

-INCLUDE

シンボルを明示的に参照します

(10)　-INCLUDE:シンボル名

○

○

-LARGEADDRESSAWARE

アプリケーションが2ギガバイトを超えるアドレスをサポートしていることを指定します

(11)　-LARGEADDRESSAWARE

○

○

-LIBPATH

環境変数LIBに先行して検索したいライブラリパスを指定します

(12)　-LIBPATH:ライブラリのパス

○

○

-MANIFEST

リンカがマニフェストファイルを生成することを指定します。

(13)　-MANIFEST〔:EMBED〔,ID=リソースID〕〕

○

○

-MANIFESTUAC

マニフェストファイルに組み込むUAC情報を指定します。

(14)　-MANIFESTUAC〔:｛NO｜UACフラグメント｝〕

○

○

-MAP

マップファイルを作成します

(15)　-MAP〔:ファイル名〕

○

○

-MAPINFO

指定した情報をマップファイルに格納します

(16)　-MAPINFO:EXPORTS

○

○

-NODEFAULTLIB

外部参照を解決するときにすべてのライブラリ，または，指定したデフォルトのライブラリを無視します

(17)　-NODEFAULTLIB〔:ライブラリ名〕

○

○

-ORDER

指定された順序でCOMDATをイメージに取り込みます

(18)　-ORDER:@ファイル名

○

○

-OUT

出力ファイル名を指定します

(19)　-OUT:出力ファイル名

○

○

-STACK

スタックサイズをバイト単位で設定します

(20)　-STACK:仮想メモリサイズ〔,実メモリサイズ〕

○

○

-SUBSYSTEM

OSに対して，実行可能ファイル(.exe)の実行方法を指定します

(21)　-SUBSYSTEM:｛CONSOLE｜WINDOWS｝

○

○

-VERBOSE

リンカ（LINKコマンド）の進行状況メッセージを出力します

(22)　-VERBOSE〔:｛LIB｜UNUSEDLIBS｝〕

○

○

-VERSION

バージョン番号を割り当てます

(23)　-VERSION:バージョン番号〔.リビジョン番号〕

○

○

-?

オプションの概略一覧を表示します

(24)　-?

○

○

（凡例）

○：オプションあり

(1)　-ALLOWBIND:NO

対象のDLLをBINDコマンドにバインドさせないための情報を，DLLヘッダに設定するためのオプションです。

(2)　-DEF:モジュール定義ファイル名

モジュール定義ファイル（.def）を指定するためのオプションです。ファイル名は拡張子を付けて指定します。-DEFオプションは一つだけ指定できます。モジュール定義ファイルについては，「38.4　モジュール定義ファイル」を参照してください。

(3)　-DEFAULTLIB:ライブラリ名

コマンドライン上のオブジェクトファイルやライブラリだけで解決できなかった外部参照の検索先ライブラリを指定するためのオプションです。同じライブラリ名が-NODEFAULTLIBオプションにも指定されている場合は，-NODEFAULTLIBオプションが優先されます。

(4)　-DLL

ダイナミックリンクライブラリ（DLL）を作成するためのオプションです。

(5)　-ENTRY:シンボル名

実行モジュールの入口点を指定するためのオプションです。シンボル名にはOSが最初に制御を渡すプログラム（スタートアッププログラム）の名前を指定します。

OSが最初に呼び出すプログラムは，次の呼び出し規約でなければなりません。

Windows(x86) COBOL2002の場合

stdcall

Windows(x64) COBOL2002の場合

fastcall

例えば，アセンブラプログラムが主プログラムの場合などで，ユーザ自身がスタートアッププログラムを作成したときに，-ENTRYオプションを指定します。

注意事項

COBOLプログラムが主プログラムとなるアプリケーションを作成する場合，またはCOBOLのDLLアプリケーションを作成する場合は，次のように入口点を指定してください。

コンソールアプリケーションの場合

-ENTRY:mainCRTStartup

WINDOWSアプリケーションの場合

-ENTRY:WinMainCRTStartup

DLLの場合

Windows(x86) COBOL2002の場合

-ENTRY:_DllMainCRTStartup@12

Windows(x64) COBOL2002の場合

-ENTRY:_DllMainCRTStartup

ただし，これらの指定は，LINKコマンドで直接COBOLプログラムをリンクする場合だけ必要になります。ccbl2002コマンド，および開発マネージャを使用する場合は，リンカオプションでの入口点の指定は必要ありません。

また，LINKコマンドでCOBOLプログラムをリンクする場合は，-ENTRYオプションの代わりに，-SUBSYSTEMオプションでも入口点を指定できます。指定形式を次に示します。

コンソールアプリケーションの場合

-SUBSYSTEM:CONSOLE

WINDOWSアプリケーションの場合

-SUBSYSTEM:WINDOWS

これらのオプションを指定すると，指定に応じて適切な入口点が仮定されます。

(6)　-EXPORT:名前〔,@順序番号〔,NONAME〕〕

名前をエクスポートするためのオプションです。このオプションはモジュール定義ファイルのEXPORTS文と同じです。

@順序番号（1〜65,535）を指定すると，名前ではなく番号で関数を呼び出せます。この呼び出しの方がより速く関数を呼び出せます。

順序番号のあとにNONAMEを付けると，名前はエクスポートされないため，順序番号による呼び出しだけができるようになります。

(7)　-FORCE〔:｛MULTIPLE｜UNRESOLVED｝〕

外部シンボルの未解決エラーや外部シンボルの多重定義エラーが発生しても，強制的に実行可能ファイルを生成させるためのオプションです。

MULTIPLEを指定すると，外部シンボルの定義が重複していても出力ファイルを作成します。

UNRESOLVEDを指定すると，未定義の外部シンボルがあっても出力ファイルを作成します。

引数を省略すると，MULTIPLEとUNRESOLVEDの両方が仮定されます。

(8)　-HEAP:仮想メモリサイズ〔,実メモリサイズ〕

ローカルヒープのサイズを変更するためのオプションです。仮想メモリ上の上限サイズと，1回で割り当てられる実メモリの上限サイズをバイト単位で指定します。

仮想メモリサイズのデフォルト値は1メガバイトです。また，指定した値は4バイト単位に切り上げられます。このオプションは，モジュール定義ファイルのHEAPSIZE文と等価です。

(9)　-IMPLIB:インポートライブラリ名

リンカ（LINKコマンド）の出力するインポートライブラリの名称を指定するためのオプションです。省略時は，主出力ファイルである実行可能ファイル名の拡張子を.libに変えて作成されます。

(10)　-INCLUDE:シンボル名

指定したシンボルを含むオブジェクトファイルを強制的に取り込むためのオプションです。

(11)　-LARGEADDRESSAWARE

生成される実行可能ファイルが，2ギガバイトを超えるアドレスを取り扱えるようにするためのオプションです。Windows(x64) COBOL2002の場合は，このオプションは既定で有効になります。

(12)　-LIBPATH:ライブラリのパス

環境変数LIBに先行して検索したいライブラリパスを指定するためのオプションです。入力する-LIBPATHオプションごとに一つのフォルダを指定します。複数のフォルダを指定する場合は，フォルダごとに-LIBPATHオプションを指定します。リンカ（LINKコマンド）は，指定された順にフォルダを検索します。

(13)　-MANIFEST〔:EMBED〔,ID=リソースID〕〕

リンカがマニフェストファイルを生成することを指定するためのオプションです。

EMBEDを指定すると，リンク時に実行可能ファイルまたはDLLファイルにマニフェストファイルを埋め込むことができます。リソースIDには，実行可能ファイルの場合は1を，DLLファイルの場合は2を指定します。IDパラメタを省略すると，-DLLオプションが指定されている場合は2が，それ以外の場合は1が既定値として設定されます。

-MANIFESTオプションを指定して，-MANIFESTUACオプションと-DLLオプションのどちらも指定していない場合，ユーザアカウント制御（UAC）レベルがasInvokerに設定されているマニフェストに既定のUACフラグメントが挿入されます。ユーザアカウント制御（UAC）レベルの詳細については，「(14)　-MANIFESTUAC〔:｛NO｜UACフラグメント｝〕」を参照してください。

-MANIFESTオプションを指定すると，マニフェストファイルの名前は，出力ファイルの名前と同じになり，ファイル名に.manifest が追加されます。例えば，出力ファイルの名前がMyFile.exeの場合，マニフェストファイル名はMyFile.exe.manifestになります。

(14)　-MANIFESTUAC〔:｛NO｜UACフラグメント｝〕

ユーザアカウント制御（UAC）情報をプログラムマニフェストに組み込むかどうかを指定するオプションです。

-MANIFESTUAC

既定のUAC情報をプログラムマニフェストに組み込みます。

既定値として，level値はasInvokerが，uiAccess値はfalseが設定されます。

-MANIFESTUAC:NO

UAC情報をプログラムマニフェストに組み込みません。

-MANIFESTUAC:UACフラグメント

UACフラグメントを指定すると，指定した値のUAC情報をプログラムマニフェストに組み込みます。

UACフラグメントは次の形式で指定します。

-MANIFESTUAC:level=｛'asInvoker'｜'highestAvailable'｜'requireAdministrator'｝

値

意味

asInvoker［既定値］

アプリケーションを開始したプロセスと同じアクセス許可レベルで実行します。［管理者として実行］を選択すると，アプリケーションをより高いアクセス許可レベルに昇格させることができます。

highestAvailable

可能な限り高いアクセス許可レベルで実行します。使用できる最も高いアクセス許可レベルが，開始したプロセスのレベルより高い場合は，資格情報の入力が求められます。

requireAdministrator

管理者のアクセス許可レベルで実行します。アプリケーションを開始するユーザは管理者グループのメンバである必要があります。開始したプロセスが管理者のアクセス許可レベルで実行されない場合は，資格情報の入力が求められます。

-MANIFESTUAC:uiAccess=｛'true'｜'false'｝

アプリケーションがユーザインタフェースの保護レベルをバイパスし，入力をデスクトップ上のアクセス許可レベルの高いウィンドウ（例えば，オンスクリーンキーボード）にアクセスできるようにする場合はtrue，それ以外の場合はfalseを指定します。既定値はfalseです。trueの設定は，ユーザインタフェースのユーザ補助アプリケーションでだけで行います。

また，次の形式で指定すると，level値およびuiAccess値の指定を１ステップで行うことができます。

-MANIFESTUAC:"level=｛'asInvoker'｜'highestAvailable'｜'requireAdministrator'｝ uiAccess=｛'true'｜'false'｝"

-MANIFESTUACオプションを複数指定した場合は，最後に入力したオプションが優先されます。

(15)　-MAP〔:ファイル名〕

マップファイルを生成するためのオプションです。ファイル名を指定しなかった場合は，主出力ファイルである実行可能ファイル名の拡張子を.mapに変えて作成されます。

マップファイルは，プログラムやデータが実行可能プログラムやDLL中のどこに配置されたか，それらはどのライブラリのどのオブジェクトファイルから取り込まれたものかを示す情報を含んでいるリストファイルです。外部シンボル単位にそれらの情報が出力されます。さらに，-MAPINFO:EXPORTSオプションを指定することで，マップファイルの中にエクスポート情報を加えることもできます。

(16)　-MAPINFO:EXPORTS

-MAPオプションで生成されるマップファイルの中にエクスポート情報を加えるためのオプションです。

(17)　-NODEFAULTLIB〔:ライブラリ名〕

指定されたライブラリをデフォルトライブラリの検索対象から除くためのオプションです。ライブラリ名を指定しなかった場合は，すべてのデフォルトライブラリが検索対象から除かれます。

複数のデフォルトライブラリを検索対象から除外するためには，除外するライブラリごとに-NODEFAULTLIBオプションを繰り返し指定します。

(18)　-ORDER:@ファイル名

実行可能ファイル内に配置する関数の順序を指定するためのオプションです。@ファイルには，1行に一つの関数の割合で関数名を記述します。コマンドファイルと同様に，行内の有効カラムの終わりをセミコロン（;）で指定でき，その後ろにコメントを書けます。このオプションを使用するには，オブジェクトファイル内のすべての関数に，必要なCOMDATレコードが生成されていることが必要です。必要なCOMDATレコードがない場合は，オプションは無効になり，関数は参照された順番に配置されます。

(19)　-OUT:出力ファイル名

主出力である実行可能ファイル，DLLファイルの名称を指定するためのオプションです。このオプションの指定がなく，モジュール定義ファイルにも出力ファイルが指定されていなければ，最初のOBJファイルの拡張子を.exe，または.dllに変えた名前で出力ファイルが作成されます。

(20)　-STACK:仮想メモリサイズ〔,実メモリサイズ〕

プログラムのスタックのサイズを変更するためのオプションです。仮想メモリ上の上限サイズと，1回で割り当てられる実メモリの上限サイズをバイト単位で指定します。

仮想メモリサイズのデフォルト値は1メガバイト，実メモリサイズのデフォルト値は4キロバイトに設定されます。

このオプションは，モジュール定義ファイルのSTACKSIZE文と等価です。

(21)　-SUBSYSTEM:｛CONSOLE｜WINDOWS｝

OSに，実行可能ファイル（.exe）の実行方法を指定するためのオプションです。

CONSOLEを指定すると，コンソールを必要とするプログラム（コンソールプログラム）を作成します。コンソールプログラムには，OSからコンソールが与えられます。

WINDOWSを指定すると，コンソールを必要としないプログラム（ウィンドウプログラム）を作成します。

-SUBSYSTEMオプションを指定すると，-ENTRYオプションを指定しなくても，実行可能プログラムの入口点にCOBOLで使用できるスタートアッププログラムが設定されます。

なお，ccbl2002コマンド，および開発マネージャを使用する場合は，-SUBSYSTEMオプションを指定しないでください。

(22)　-VERBOSE〔:｛LIB｜UNUSEDLIBS｝〕

リンクプロセスの情報を詳しく表示するためのオプションです。

リンクされるオブジェクトファイルの名称，使用するライブラリの名称，リンクの各フェーズなどが表示されます。

LIBを指定すると，検索されたライブラリだけの進行状況メッセージが表示されます。表示される情報は，ライブラリ検索の進行状況，各ライブラリおよびオブジェクト名(絶対パス)，そのライブラリで解決されたシンボル，ならびにそのシンボルを参照しているオブジェクトの一覧です。

UNUSEDLIBSを指定すると，イメージの作成時に使用されていないライブラリファイルに関する情報が表示されます。

(23)　-VERSION:バージョン番号〔.リビジョン番号〕

プログラムのバージョンを主出力ファイルに設定するためのオプションです。バージョン番号，リビジョン番号とも，0〜65,535の整数を指定します。デフォルトは0.0です。

(24)　-?

オプションの概略一覧を表示するオプションです。

38.1.4　リソースファイル

リンカ（LINKコマンド）は，リソースファイル（.res）をオブジェクトファイルの形式に変換し，オブジェクトファイルと同様に扱います。したがって，リソースコンパイラ（RCコマンド）の出力したリソースファイルをオブジェクトファイルと同様に指定すれば，リソースを実行可能ファイルにリンクできます。

38.1.5　ダイナミックリンク機能

ダイナミックリンク機能とは，未解決の名前を定義している実行可能ファイルを実行時に動的にロードして名前を解決する機能です。この動的にロードしてリンクできるファイルをDLL（ダイナミックリンクライブラリ）といいます。メモリ中にロードされたDLLは複数のプロセスで共用できるので，メモリを有効活用できます。

ここでは，ダイナミックリンクを実現する上で必要なエクスポート，インポートの機能について説明します。

(1)　エクスポート

エクスポートとは，名前をほかの実行可能ファイルから参照できるように公開することです。リンカ（LINKコマンド）は，その名前の定義を含む実行可能ファイルのエクスポートテーブルにその名前を登録します。

名前のエクスポートは，モジュール定義ファイルのEXPORTS文，またはリンカ（LINKコマンド）の-EXPORTオプションでできます。ただし，COBOL2002では，DLL関数に対してコンパイラがその名前を自動的にエクスポートするため，EXPORTS文または-EXPORTオプションで明示的にエクスポートする必要はありません。

(2)　インポート

インポートとは，プログラムで参照する名前が同一実行可能ファイル内で定義されているものではなく，ほかの実行可能ファイルでエクスポートされている名前であることを宣言することです。

名前のインポートは，リンカ（LINKコマンド）の-INCLUDEオプションで行います。

(3)　ダイナミックリンク動作

インポートされた名前を参照するプログラムの実行時，その名前をエクスポートしているDLLがロードされます。このときローダで，エクスポート情報とインポート情報によって名前が解決されます。

(4)　エクスポートファイル

エクスポートファイル（.exp）は，ライブラリ管理ツール（LIBコマンド）とリンカ（LINKコマンド）の間のインタフェースとして使用されるファイルです。COBOL2002を使ってプログラムを作成する場合は，エクスポートファイルを直接使用することはありません。

(5)　インポートライブラリ

インポートライブラリ（.lib）は，インポートの手間を軽減するためのものです。リンク時に，ほかのライブラリと同様にインポートライブラリを指定することで，外部名をインポートできます。

インポートライブラリは，DLLの作成時に，DLLファイル名の拡張子を.libに変更した名称で生成されます。

38.1.6　ライブラリの検索

インポート宣言された名前以外の外部参照が，指定したオブジェクトファイルだけでは解決できない場合，ライブラリが検索されます。検索の手順を次に示します。

コマンドライン上のライブラリを左から順に取り出し，それぞれ次の操作をします。

(a) ライブラリが絶対パスで指定されている場合

そのライブラリに該当する外部名があるかどうかをチェックします。あれば検索を終了します。

(b) ライブラリ名だけが指定されている場合

ライブラリのパス（-LIBPATHオプションで指定されたパス，および環境変数LIBに指定されたパス）を順に検索して該当するライブラリを見つけます。そして，そのライブラリに外部名があるかどうかをチェックします。あれば検索を終了します。ライブラリのパスは，まず-LIBPATHオプションに指定されたパスをオプションの指定順に検索し，そのあとに環境変数LIBに指定されたパスを順に検索します。

1.の操作で見つからない場合，-DEFAULTLIBオプションに指定されたデフォルトライブラリと，オブジェクトファイル内で定義されているデフォルトライブラリに対して(a)(b)の操作をします。

1.2.の操作で見つからない場合は，外部参照未解決のためエラーとします。

注意事項

リンカ（LINKコマンド）では，外部名はすべて英大文字と英小文字が区別されます。

38.1.7　戻り値

リンカ（LINKコマンド）の戻り値は次のとおりです。

戻り値

意味

0

正常終了した。

0以外

エラーが発生した。リンク終了の原因となったエラーの番号が，戻り値として返される。

38.2　ライブラリ管理ツール

38.2.1　機能の概要

ライブラリ管理ツール（LIBコマンド）は，Windowsのライブラリとそのライブラリ内のオブジェクトファイルを管理するためのツールで，次の機能を持ちます。

ライブラリの新規作成

ライブラリ内のオブジェクトファイルの追加・変更

複数のライブラリの結合

ライブラリ内のオブジェクトファイルの削除

ライブラリからのオブジェクトファイルの取り出し

インポートライブラリの生成

38.2.2　コマンドラインの形式

LIBコマンドの形式を次に示します。

形式

LIB 〔OBJファイル名〕 〔LIBファイル名〕 〔オプション〕

OBJファイル名

オブジェクトファイル（.obj）の並びを指定します。

LIBファイル名

ライブラリファイルの並びを指定します。

オプション

オプションの並びを指定します。オプションについては，「38.2.3　オプション」を参照してください。

指定規則

コマンドライン上には，コマンド名以降であればどこにでもコマンドファイルを指定できます。コマンド名の先頭には@を付けて指定します。コマンドファイルを指定すると，ファイルの中身がコマンドライン上に展開され，コマンドの一部となります。

（例）

LIB @OBJECT.lst -OUT:TEST.lib

コマンドラインの区切り記号には，空白およびタブが使用できます。コマンドファイル内では，空白，タブ，セミコロン（;）および改行文字が使用できます。セミコロン（;）から改行文字までの指定は無効となり，コマンドファイル内にコメントを記述するために使用します。

OBJファイル名，LIBファイル名にはワイルドカード（*）が使用できます。

ファイル名は必ず拡張子を付けて指定します。

オプションは英大文字，英小文字のどちらで指定しても同じ扱いとなります。また，ハイフン（-）の代わりにスラント（/）で始めることもできます。

背反するオプションを二つ以上指定した場合，最後に指定したオプションが有効となります。

38.2.3　オプション

ライブラリ管理ツール（LIBコマンド）で使用できるオプションを次に示します。

表38‒2　ライブラリ管理ツールオプション一覧

オプション名

機能

参照先

Windows(x86) COBOL2002

Windows(x64) COBOL2002

-DEF

インポートライブラリを作成するためのモジュール定義ファイル(.def)を指定します

(1)　-DEF:モジュール定義ファイル

○

○

-EXPORT

エクスポートを指定します

(2)　-EXPORT:入口点名〔,@順序番号〔,NONAME〕〕

○

○

-EXTRACT

ライブラリメンバの抽出を指定します

(3)　-EXTRACT:オブジェクトファイル名

○

○

-INCLUDE

シンボルを追加します

(4)　-INCLUDE:シンボル

○

○

-LIBPATH

環境変数LIBに先行して検索したいライブラリパスを指定します

(5)　-LIBPATH:ライブラリのパス

○

○

-LIST

ライブラリメンバのリストを表示します

(6)　-LIST

○

○

-NODEFAULTLIB

デフォルトライブラリを無視します

(7)　-NODEFAULTLIB〔:ライブラリ名〕

○

○

-OUT

出力ファイル名を指定します

(8)　-OUT:出力ファイル名

○

○

-REMOVE

ライブラリからオブジェクトを削除します

(9)　-REMOVE:オブジェクトファイル名

○

○

-VERBOSE

処理の進行状況を詳しく表示します

(10)　-VERBOSE

○

○

-?

オプションの概略一覧を表示します

(11)　-?

○

○

（凡例）

○：オプションあり

(1)　-DEF:モジュール定義ファイル

モジュール定義ファイル（.def）からインポートライブラリを生成するためのオプションです。ファイル名は拡張子を付けて指定します。モジュール定義ファイル（.def）は一つだけ指定できます。モジュール定義ファイルについては，「38.4　モジュール定義ファイル」を参照してください。

ライブラリ管理ツール（LIBコマンド）は，モジュール定義ファイル内のLIBRARY文，EXPORTS文だけを参照し，それ以外は無視します。

(2)　-EXPORT:入口点名〔,@順序番号〔,NONAME〕〕

入口点の名前をエクスポートするためのオプションです。これは，モジュール定義ファイルのEXPORTS文と同じです。

@順序番号（1〜65,535）を指定すると，名前ではなく番号で関数を呼び出せます。この呼び出しの方がより速く関数を呼び出せます。

順序番号のあとにNONAMEを付けると，名前はエクスポートされないため，順序番号による呼び出しだけができるようになります。

(3)　-EXTRACT:オブジェクトファイル名

ライブラリ内からオブジェクトファイルを取り出すためのオプションです。

取り出されたオブジェクトファイルは，取り出し元のライブラリに残ります。

-REMOVEオプションを同時に指定すると，取り出されたオブジェクトファイルはライブラリ内から削除されます。この場合，必ず-EXTRACTオプションを先に指定しなければなりません。

(4)　-INCLUDE:シンボル

指定されたシンボルをシンボルテーブルに追加するためのオプションです。

-DEFオプション指定時に，通常は取り込まれないライブラリオブジェクトを追加する場合に使用します。

(5)　-LIBPATH:ライブラリのパス

環境変数LIBに先行して検索したいライブラリパスを指定するためのオプションです。入力する-LIBPATHオプションごとに一つのフォルダを指定します。複数のフォルダを指定する場合は，フォルダごとに-LIBPATHオプションを指定します。ライブラリ管理ツール（LIBコマンド）は，指定された順にフォルダを検索します。

(6)　-LIST

ライブラリ内のオブジェクトファイルのリストを表示するためのオプションです。

(7)　-NODEFAULTLIB〔:ライブラリ名〕

外部参照を解決するときに，検索するライブラリリストからデフォルトライブラリを除くためのオプションです。

ライブラリ名を指定しなかった場合は，すべてのデフォルトライブラリが検索対象から除かれます。

複数のデフォルトライブラリを検索対象から除外するためには，除外するライブラリごとに-NODEFAULTLIBオプションを繰り返し指定します。

(8)　-OUT:出力ファイル名

出力ファイルの名称を指定するためのオプションです。-EXTRACTオプションを指定した場合，このオプションは必ず指定しなければなりません。

(9)　-REMOVE:オブジェクトファイル名

オブジェクトファイルをライブラリから削除するためのオプションです。

(10)　-VERBOSE

ライブラリの処理に関する追加情報を表示するためのオプションです。

(11)　-?

オプションの概略一覧を表示するためのオプションです。

38.2.4　各種機能の使い方

「38.2.1　機能の概要」で示したLIBの各機能を使うためのコマンドラインの指定方法について説明します。

(1)　ライブラリの新規作成

一つ以上のオブジェクトファイルから一つのライブラリを作成します。

LIB OBJファイル … OBJファイル 〔-OUT:LIBファイル〕

-OUTオプションを省略した場合は，最初に指定したOBJファイルの拡張子を.libに変更したファイル名で作成されます。

(2)　ライブラリ内のオブジェクトファイルの追加・変更

ライブラリ内で一つ以上のオブジェクトファイルを追加・変更します。

LIB LIBファイル OBJファイル … OBJファイル
    〔-OUT:LIBファイル〕

指定したオブジェクトファイルがライブラリ内にない場合，そのオブジェクトファイルが新規に追加されます。

指定したオブジェクトファイルがライブラリ内にある場合，そのオブジェクトファイルが指定したオブジェクトファイルで更新されます。

元のライブラリをそのまま残したい場合は，新規に作成するライブラリの名称を-OUTオプションで指定します。

(3)　複数のライブラリの結合

複数のライブラリを結合して一つのライブラリを生成します。

LIB LIBファイル … LIBファイル 〔-OUT:LIBファイル〕

元のライブラリをそのまま残したい場合は，新規に作成するライブラリの名称を-OUTオプションで指定します。

(4)　ライブラリ内のオブジェクトファイルの削除

ライブラリ内のオブジェクトファイルを削除します。

LIB LIBファイル -REMOVE:OBJファイル 〔-OUT:LIBファイル〕

元のライブラリをそのまま残したい場合は，新規に作成するライブラリの名称を-OUTオプションで指定します。

(5)　ライブラリからのオブジェクトファイルの取り出し

ライブラリ内のオブジェクトファイルを取り出して，ディスク上にオブジェクトファイルを生成します。元のライブラリは変更されません。

LIB LIBファイル -EXTRACT:OBJファイル -OUT:OBJファイル

(6)　インポートライブラリの生成

モジュール定義ファイル（.def）からインポートライブラリを生成します。

モジュール定義ファイル内のEXPORTS文のエクスポート名とLIBRARY文のDLLファイル名からインポート情報を作成し，インポートライブラリを生成します。

LIB -DEF:DEFファイル 〔LIBファイル…〕〔OBJファイル…〕〔-OUT:LIBファイル〕

インポートライブラリの生成の際，エクスポートファイル（.exp）も同時に生成されます。このエクスポートファイルは，リンカ（LINKコマンド）のための中間ファイルであり，ユーザが使用することはありません。

38.2.5　戻り値

ライブラリ管理ツール（LIBコマンド）の戻り値は次のとおりです。

戻り値

意味

0

正常終了した。

0以外

エラーが発生した。LIBの終了の原因となったエラーの番号が，戻り値として返される。

38.3　リソースコンパイラ

38.3.1　機能の概要

アプリケーションプログラム中でアイコンを使用する場合，次の手順でアイコンのリソースをアプリケーションプログラムに組み込む必要があります。

リソースエディタを使ってリソースデータファイル（アイコンデータファイル）を作成する。

アプリケーションで使用するリソースを記述したリソース定義ファイル（.rc）を作成する。

リソースコンパイラ（RCコマンド）を使ってリソース定義ファイルをコンパイルし，リソースファイルを作成する。

アプリケーションのリンク時に，このリソースファイルをオブジェクトファイルと同様に指定してリンクする。

リソースコンパイラ（RCコマンド）は，リソース定義ファイル（.rc）とその中で指定されたリソースデータファイルを入力し，そのオブジェクトファイルであるリソースファイル（.res）を生成するツールです。

生成されたリソースファイルは，ほかのオブジェクトファイルと同様にリンカのコマンドラインに指定することでアプリケーションプログラムに組み込めます。

38.3.2　コマンドラインの形式

RCコマンドの形式を次に示します。

形式

RC 〔オプション〕 RCファイル名

オプション

オプションの並びを指定します。オプションについては，「38.3.3　オプション」を参照してください。

RCファイル名

入力となるリソース定義ファイルの名称を指定します。拡張子を付けて指定しなければなりません。

なお，リソース定義ファイルの内容については，「38.3.5　リソース定義ファイルとCOBOLで使用するリソース定義文」を参照してください。

指定規則

リソース定義ファイル名にはワイルドカード（*）を指定できません。

オプションは英大文字，英小文字のどちらで指定しても同じ扱いとなります。また，ハイフン（-）の代わりにスラント（/）で始めることもできます。

38.3.3　オプション

リソースコンパイラ（RCコマンド）で使用できるオプションを次に示します。

表38‒3　リソースコンパイラオプション一覧

オプション名

機能

参照先

Windows(x86) COBOL2002

Windows(x64) COBOL2002

-d

シンボルを定義します

(1)　-d シンボル

○

○

-fo

出力リソースファイル名を指定します

(2)　-fo RESファイル名

○

○

-i

環境変数INCLUDEの検索パスを追加します

(3)　-i INCLUDE検索パス

○

○

-l

デフォルトの言語IDを16進数で指定します

(4)　-l コードページ番号

○

○

-n

文字列テーブルのすべての文字列にNULLを追加します

(5)　-n

○

○

-u

シンボルの定義を取り消します

(6)　-u シンボル

○

○

-v

進行状況のメッセージを表示します

(7)　-v

○

○

-x

環境変数INCLUDEを無視します

(8)　-x

○

○

-?または-h

オプションの概略一覧を表示します

(9)　-?または-h

○

○

（凡例）

○：オプションあり

(1)　-d シンボル

プリプロセサのシンボルを定義するためのオプションです。

(2)　-fo RESファイル名

生成されるリソースファイル名称を指定するためのオプションです。このオプションを指定しなかった場合は，リソース定義ファイル名の拡張子を.resに変更した名称でリソースファイルが生成されます。

(3)　-i INCLUDE検索パス

環境変数INCLUDEの検索対象パスに先行して検索するパスを指定するオプションです。

(4)　-l コードページ番号

翻訳のためのデフォルトの言語を指定するためのオプションです。言語は，コードページ番号で指定してください。

注意事項

コードページとは，Windowsが多国語対応のアプリケーション開発を容易にするために用意した文字コードの体系です。各国の言語ごとにページという単位で区分されています。

(5)　-n

文字列テーブルのすべての文字列を，NULL文字（X'00'）で終了する文字列にするためのオプションです。

(6)　-u シンボル

プリプロセサのシンボルの定義を取り消すためのオプションです。

(7)　-v

処理過程のレポートを表示するためのオプションです。

(8)　-x

環境変数INCLUDEを無視するためのオプションです。

(9)　-?または-h

オプションの概略一覧を表示するためのオプションです。

38.3.4　戻り値

リソースコンパイラ（RCコマンド）の戻り値は次のとおりです。

戻り値

意味

0

正常終了した。

1

エラーが発生した。

38.3.5　リソース定義ファイルとCOBOLで使用するリソース定義文

リソース定義ファイルは，リソースコンパイラ（RCコマンド）の入力となるファイルであり，アプリケーションプログラムで使用するリソース（アイコン）の定義を記述したものです。リソースは，リソース定義文で定義します。COBOLアプリケーションの作成で使用されるリソース定義文を，次に示します。

(1)　ICON文

ICON文は，アイコンの形を定義するビットマップを指定する文です。

構文

リソース名 ICON ファイル名

リソース名

リソースを識別するための一意名または整数値（1〜65,535）を指定します。

ファイル名

リソースデータファイル（アイコンデータファイル）を指定します。カレントフォルダにないときは，絶対パス名で指定します。絶対パス名は引用符（"）で囲んでも囲まなくてもかまいません。ただし，空白を含む場合は必ず引用符（"）で囲まなければなりません。

使用例

アイコンビットマップtest.icoで，アイコンリソースtestを定義します。

test ICON ¥users¥test.ico

注意事項

アイコンリソースは複数のイメージを含むことができます。

38.4　モジュール定義ファイル

モジュール定義ファイル（.def）は，ファイル名称，属性，エクスポート，システムの条件など，実行可能ファイルやDLLの特性を記述するファイルです。

リンカ（LINKコマンド）は，リンク時にこのファイルを参照し，このファイルに従った実行可能ファイル，DLLを作成します。また，ライブラリ管理ツール（LIBコマンド）でインポートライブラリを生成する場合にもこのファイルを使用します。

COBOL2002では，ユーザはモジュール定義ファイルを意識しなくてもアプリケーションプログラムを生成できます。このモジュール定義ファイルは，リンカオプションのデフォルト値を変更するときや，外部名のエクスポートをするときに使用します。

ここではモジュール定義ファイルを記述するときの規則について説明します。

38.4.1　モジュール定義ファイルの記述規則

モジュール定義ファイルを記述するときの規則を次に示します。

キーワードは，すべて英大文字で記述します。

キーワードおよび引数の間，ならびに引数および引数の間は，空白，タブ，または改行文字で区切ります。

コメントを記述するときは，セミコロン（;）と改行文字の間に記述します。また，モジュール定義文と同じ行には記述できません。

NAME文またはLIBRARY文を記述するときは，ほかのどの文よりも前に記述しなければなりません。また，NAME文とLIBRARY文は同時には記述できません。

空白やセミコロン（;）を含むファイル名は，引用符（"）で囲まなければなりません。

EXPORTS文は，同じモジュール定義ファイル内で複数回使用できます。また，複数の引数を指定できます。複数の引数を指定する場合は，それぞれの引数を一つ以上の空白，タブ，または改行文字で区切らなければなりません。

38.4.2　モジュール定義文

記述できるモジュール定義文を次に示します。

NAME文：実行可能ファイル名の定義

LIBRARY文：DLLファイル名の定義

STACKSIZE文：実行時に使用するスタックサイズの上限の定義

HEAPSIZE文：実行時に使用するヒープサイズの上限の定義

EXPORTS文：外部定義名のエクスポート宣言

VERSION文：実行可能モジュールのバージョンの定義

(1)　NAME文

NAME 〔実行可能ファイル名〕

NAME文は，実行可能ファイルを作成することを指示する文であり，同時に実行可能ファイルの名称を定義します。

実行可能ファイル名を省略した場合は，出力ファイル名はリンカ（LINKコマンド）の-OUTオプションの指定に従います。拡張子を省略した場合は.exeが仮定されます。

（例）実行可能ファイルTEST.exeを作成します。

NAME TEST

このNAME文は，ほかのどの文よりも前に記述しなければなりません。また，LIBRARY文と同時には指定できません。

NAME文は，-DLLオプションを同時に指定しないときのリンカ（LINKコマンド）の-OUTオプションと等価です。

(2)　LIBRARY文

LIBRARY 〔DLLファイル名〕

LIBRARY文は，DLLファイルの名称を定義します。

DLLファイル名を省略した場合は，出力ファイル名はリンカ（LINKコマンド）の-OUTオプションの指定に従います。拡張子を省略した場合は.dllが仮定されます。

（例）DLLファイルTEST.dllを作成します。

LIBRARY TEST

このLIBRARY文は，ほかのどの文よりも前に記述しなければなりません。また，NAME文と同時には指定できません。

LIBRARY文は，リンカ（LINKコマンド）の-OUTオプションと等価です。

DLLファイル名を作成するときは，リンカ（LINKコマンド）の-DLLオプションの設定が必要です。

(3)　STACKSIZE文

STACKSIZE 仮想メモリサイズ〔,実メモリサイズ〕

STACKSIZE文は，プログラムの実行時に使用できるスタックサイズの上限を定義するための文です。この文で，仮想メモリサイズの上限と，1回で割り当てられる実メモリサイズの上限を定義します。

（例）スタックサイズの上限を160,000バイトにします。

STACKSIZE 160000

STACKSIZE文は，リンカ（LINKコマンド）の-STACKオプションと等価です。

(4)　HEAPSIZE文

HEAPSIZE 仮想メモリサイズ〔,実メモリサイズ〕

HEAPSIZE文は，プログラムの実行時に使用できるヒープサイズの上限を定義するための文です。この文で，仮想メモリサイズの上限と，1回で割り当てられる実メモリサイズの上限を定義します。

（例）ヒープサイズの上限を80,000バイトにします。

HEAPSIZE 80000

HEAPSIZE文は，リンカ（LINKコマンド）の-HEAPオプションと等価です。

(5)　EXPORTS文

EXPORTS エクスポート名〔=実外部名〕〔@順序番号〔NONAME〕〕
      〔エクスポート名〔=実外部名〕〔@順序番号〔NONAME〕〕〕
      〔…〕

EXPORTS文は，プログラム中の外部名をエクスポートするための文です。

実外部名を省略した場合，エクスポート名と実外部名は同じとみなされます。

@順序番号（1〜65,535）を指定すると，名前ではなく番号で関数を呼び出せます。順序番号のあとにNONAMEを付けると，名称はエクスポートされないため，順序番号による呼び出しだけができるようになります。

（例）外部名_COMSUB1をCBLSUB1としてエクスポートします。

EXPORTS CBLSUB1=_COMSUB1

EXPORTS文はリンカ（LINKコマンド）の-EXPORTオプションと等価です。

(6)　VERSION文

VERSION バージョン番号〔.リビジョン番号〕

VERSION文は，実行可能ファイル，DLLのヘッダにバージョン番号を設定するための文です。

VERSION文はリンカ（LINKコマンド）の-VERSIONオプションと等価です。

38.4.3　モジュール定義文とリンカオプションとの関係

次のモジュール定義文には，それぞれ等価のリンカオプションがあります。

NAME文

HEAPSIZE文

LIBRARY文

EXPORTS文

STACKSIZE文

VERSION文

これらのモジュール定義文と等価のリンカオプションを同時に指定した場合，リンカオプションの指定が優先します。また，モジュール定義文と等価のリンカオプションを共に省略した場合は，リンカオプションのデフォルト値が適用されます。

優先順位は次のような順番で適用されます。

リンカオプションでの指定内容

モジュール定義文での指定内容

リンカオプションのデフォルト値

第15編　64bitアプリケーションの作成

39　64bitアプリケーションの作成

この章では，Windows(x64) COBOL2002について説明します。

39.1　Windows(x64) COBOL2002について

Windows(x64) COBOL2002では，Windows(x86) COBOL2002と比べて呼び出し規約の変更，およびポインタサイズの64bit化に対応しています。ここでは，Windows(x86) COBOL2002とWindows(x64) COBOL2002について，相違を説明します。

39.1.1　使用できない機能

Windows(x64) COBOL2002とWindows(x86) COBOL2002では，使用できる機能が異なります。

Windows(x86) COBOL2002の機能のうち，Windows(x64) COBOL2002で使用できない機能について説明します。

(1)　機能

Windows(x64) COBOL2002では使用できない機能を次に示します。

表39‒1　Windows(x64) COBOL2002で使用できない機能

機能名

説明

XMAP3を使用した書式印刷機能

書式と行データを重ね合わせる印刷（書式オーバレイ印刷）や，印刷制御付きの行データを印刷します。

リモートファイルアクセス機能

接続されているほかのWindowsやUNIX上にある，ISAMを使用する索引編成ファイルにアクセスします。

Visual Basicとの連携機能

Visual Basicプログラムから，DLLとして作成されたCOBOLプログラムを呼び出します。

(2)　ファイル編成

Windows(x64) COBOL2002では使用できないファイル編成を次に示します。

Btrieve（Pervasive.SQL）による索引編成ファイル

(3)　MIOS7 COBOL85 互換機能

Windows(x64) COBOL2002では，MIOS7 COBOL85との互換機能を有効にする-CompatiM7オプションは使用できません。しかし，-CompatiM7オプションを指定しなくても有効となる機能は使用できます。使用できる機能を次に示します。

(a)　言語仕様

-CompatiM7オプションを指定しなくても使用できる言語仕様を，次に示します。

環境部の入出力管理記述項(I-O-CONTROL)

APPLY FILE-SHARE句※

環境部のファイル管理記述項

相対編成ファイルに対するSYMBOLIC KEY句

ISAMによる索引編成ファイルに対するSYMBOLIC KEY句

注※

-IgnoreAPPLY,FILESHAREオプション指定時は，覚え書きとみなします。

(b)　実行時環境変数

-CompatiM7オプションを指定しなくても使用できる実行時環境変数を，次に示します。

CBLM7ENDKEY

CBLOPS

39.1.2　Windows(x64) COBOL2002固有の言語仕様

Windows(x64) COBOL2002では，Windows(x86) COBOL2002と比べて呼び出し規約の変更，およびポインタサイズの64bit化に対応しました。そのため，Windows(x64) COBOL2002に対応するCOBOL2002の言語仕様にもWindows(x86) COBOL2002と比べて一部変更があります。

Windows(x64) COBOL2002固有の言語仕様について説明します。

(1)　呼び出し規約のfastcallへの限定

Windows(x64) COBOL2002では，呼び出し規約がfastcallに限定されます。ほかの呼び出し規約を指定することはできません。fastcall呼び出し規約については，「18.4.2　呼び出し規約」の「(3)　fastcall呼び出し規約（Windows(x64) COBOL2002で有効）」を参照してください。

(a)　言語仕様

Windows(x64) COBOL2002では使用できない呼び出し規約の指定に関する言語仕様を，次に示します。

表39‒2　使用できない呼び出し規約の指定に関する言語仕様

言語仕様

指定

環境部の特殊名段落（SPECIAL-NAMES）

SPECIAL-NAMESの機能名のCDECL／STDCALL／PASCAL指定

環境部の外部プログラム節（EXTERNAL-PROGRAM SECTION）

EXTERNAL-PROGRAM SECTIONの指定

CALL-CONVENTION段落の指定

これらの言語仕様を指定した場合，コンパイラはfastcall呼び出し規約で処理し，指定された言語仕様を覚え書きとする警告エラーを出力します。

(b)　コンパイラオプション

Windows(x64) COBOL2002では使用できない，呼び出し規約の指定に関するコンパイラオプションを次に示します。

もし，これらのコンパイラオプションを指定した場合は，コンパイラは指定を無視して処理を続けます。

-StdCallオプション

-StdCallFileオプション

-Dllオプションのサブオプション{Stdcall|Cdecl}※

注※

-Dllオプションのサブオプションの指定だけが無効になります。

(2)　アドレス系データを表現するデータ項目

長さが8バイトになるアドレス系データを表現するデータ項目を，次に示します。これらの項目の自然な境界は8バイトです。SYNCHRONIZED句を指定してけた詰めする場合は，8バイト境界になります。

アドレス名

アドレスデータ項目

ポインタ項目

OLEオブジェクト参照項目

バリアントデータ項目

指標名

指標データ項目

オブジェクト参照データ項目

既定義オブジェクト参照

ADDRESS OF指定で指定した一意名のアドレス

連絡節でのBY REFERENCE指定のデータ項目

SYNCHRONIZED句については，マニュアル「COBOL2002　言語　標準仕様編」　「9.16.80　SYNCHRONIZED句」を参照してください。

けた詰めについては，マニュアル「COBOL2002　言語　標準仕様編」　「4.4.1(7)　実行用コードの効率を高めるための項目のけた詰め」を参照してください。

(3)　長さを返す組み込み関数の戻り値

返却値のサイズが8バイト2進になる組み込み関数を，次に示します。

LENGTH関数

LENGTH-OF-VARIANT関数

LENGTH OF指定で生成されるデータ領域

COUNT-CHAR関数

LENGTH-OF-SUBSTRING関数

LENGTH関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.32　LENGTH関数」を参照してください。

LENGTH-OF-VARIANT関数については，マニュアル「COBOL2002　言語　標準仕様編」　「11.34　LENGTH-OF-VARIANT関数」を参照してください。

COUNT-CHAR関数については，マニュアル「COBOL2002　言語　拡張仕様編」　「23.2.1　COUNT-CHAR関数」を参照してください。

LENGTH-OF-SUBSTRING関数については，マニュアル「COBOL2002　言語　拡張仕様編」　「23.2.3　LENGTH-OF-SUBSTRING関数」を参照してください。

39.1.3　Windows(x64) COBOL2002各機能の固有仕様

各機能の固有仕様について説明します。

(1)　サービスルーチンの引数でのハンドル項目

引数のハンドル項目サイズが8バイト2進になるサービスルーチンを，次に示します。

表39‒3　引数のハンドル項目サイズが8バイト2進になるサービスルーチン

サービスルーチン名

参照先

CBLHANDLEサービスルーチン

30.4.7　CBLHANDLE

サービスルーチンを使ったOLE2オートメーションクライアント機能※

付録D.2　サービスルーチンを使ったOLE2オートメーションクライアント機能

バイトストリーム入出力サービスルーチン

15.　バイトストリーム入出力サービスルーチン

注※

この機能は日立COBOL85からの古い仕様です。OLE2オートメーションクライアント機能を使用する場合は，「25.　OLE2オートメーション機能」に書いてある方法を使用してください。

(2)　インタフェース領域中のアドレス格納領域

インタフェース領域中のアドレス格納領域が8バイトになるサービスルーチンを，次に示します。

COBOL入出力サービスルーチン

なお，Windows(x64) COBOL2002では，アドレス格納領域が自然な境界の8バイトになるように，アドレス格納領域の直前に明示的な境界の調整領域を追加しました。領域については，「13.3.2　インタフェース領域の形式」を参照してください。

(3)　併合処理のメモリサイズについて

併合処理のメモリサイズについては，アドレス格納領域として使うサイズがWindows(x64) COBOL2002では8バイトになります。併合処理で使用するメモリサイズの計算式については，「11.3.2　併合処理のメモリサイズ」を参照してください。

39.2　COBOLソースの作成とコンパイル

Windows(x64) COBOL2002でのCOBOLソースのコンパイル方法は，Windows(x86) COBOL2002と同じです。しかし，Windows(x64) COBOL2002とWindows(x86) COBOL2002では使用できるコンパイラオプションの一部が違います。

詳細については「33.　COBOLソースの作成とコンパイル」を参照してください。

39.2.1　使用できないコンパイラオプション

Windows(x64) COBOL2002では使用できないコンパイラオプションについて説明します。

(1)　最終生成物の種類（プロジェクトの種類）のコンパイラオプション

最終生成物※の種類（開発マネージャでは，プロジェクトの種類）を設定するコンパイラオプションのうち，Windows(x64) COBOL2002では使用できないコンパイラオプションを次に示します。

注※

最終生成物とは，コンパイラが最終的に生成する実行可能ファイル，DLL，または標準ライブラリのことを示します。

表39‒4　Windows(x64) COBOL2002で使用できない最終生成物の種類のコンパイラオプション

コンパイラオプション

説明

-Dll,｛Stdcall｜Cdecl｝

DLL形式のオブジェクトファイルを出力します。DLL属性はstdcall，またはcdeclです。

(2)　製品連携のコンパイラオプション

他製品との連携を設定するコンパイラオプションのうち，Windows(x64) COBOL2002では使用できないコンパイラオプションを次に示します。

表39‒5　Windows COBOL2002で使用できない製品連携のコンパイラオプション

コンパイラオプション

説明

-IsamExtend〔,Zone〕

Btrieve（Pervasive.SQL）による索引編成ファイルを使用します。

-XMAP,LinePrint

書式印刷機能を使用して，順編成ファイルをプリンタに出力します。

(3)　リンクのコンパイラオプション

リンクを設定するコンパイラオプションのうち，Windows(x64) COBOL2002では使用できないコンパイラオプションを次に示します。

表39‒6　Windows(x64) COBOL2002で使用できないリンクのコンパイラオプション

コンパイラオプション

説明

-StdCall

stdcall呼び出し指示ファイルを有効にします。

-StdCallFile .cbwファイル名

stdcall呼び出し指示ファイル名を指定します。

(4)　移行のコンパイラオプション

他システムとの移行を設定するコンパイラオプションのうち，Windows(x64) COBOL2002では使用できないコンパイラオプションを次に示します。

表39‒7　Windows(x64) COBOL2002で使用できない移行のコンパイラオプション

コンパイラオプション

説明

-CompatiM7

MIOS7 COBOL85との互換機能を有効にします。

39.3　プログラムの実行

ここでは，プログラムの実行について説明します。

39.3.1　プログラムの実行環境の設定

プログラムの実行環境の設定について説明します。

(1)　実行時環境変数の設定方法

Windows(x64) COBOL2002での実行時環境変数の設定方法は，Windows(x86) COBOL2002と同じです。詳細については，「36.2.1　実行時環境変数の設定方法」を参照してください。

(2)　実行時環境変数の一覧

ここでは，Windows(x64) COBOL2002では使用できない実行時環境変数について説明します。

なお，Windows(x64) COBOL2002で使用できない実行時環境変数を指定した場合は，指定した実行時環境変数は無視されて，処理が続行されます。

(a)　ファイル

ファイルの実行時環境変数のうち，Windows(x64) COBOL2002では使用できない実行時環境変数を次に示します。

表39‒8　Windows(x64) COBOL2002で使用できないファイルの実行時環境変数

実行時環境変数

指定する内容

CBLX_外部装置名

書式印刷するときの印刷サービス名称

CBL_BTRPGSZ

Btrieveによる索引編成ファイルのページサイズ

39.3.2　プログラムの実行時の注意事項

Windows(x64) COBOL2002でのプログラム実行時の注意事項を次に示します。

Windows(x64) COBOL2002で作成したアプリケーションからCALL文またはCBLEXECサービスルーチンを使用して，Windows(x86) COBOL2002で作成した実行可能ファイルを呼び出せます※。ただし，Windows(x64) COBOL2002で作成したアプリケーションからはWindows(x86) COBOL2002で作成したDLLに含まれるプログラムは呼び出せません。

注※

Windows(x64) COBOL2002とWindows(x86) COBOL2002がインストールされた環境で実行してください。

39.4　実行可能ファイルとDLLの作成

Windows(x64) COBOL2002での実行可能ファイルとDLLの作成の詳細については，「35.　実行可能ファイルとDLLの作成」を参照してください。

39.4.1　実行可能ファイルとDLLの作成の注意事項

Windows(x64) COBOL2002での実行可能ファイルとDLLの作成の注意事項を次に示します。

Windows(x86) COBOL2002のオブジェクトファイル（.obj），およびライブラリファイル（.lib）は，COBOL2002で作成したオブジェクトとリンクできません。

付録

付録A　前バージョンからの変更点

ここでは，COBOL2002の適用OSのサポート終了に関する変更について説明します。

Windows COBOL2002 04-70からWindows COBOL2002 05-00への変更一覧

Windows COBOL2002 04-70からWindows COBOL2002 05-00への変更内容を次に示します。

次に示す適用OSが対象外となりました。

・Microsoft Windows 7 Professional 日本語版(32ビット版)

・Microsoft Windows 7 Enterprise 日本語版(32ビット版)

・Microsoft Windows 7 Ultimate 日本語版(32ビット版)

・Microsoft Windows 7 Professional 日本語版(64ビット版)

・Microsoft Windows 7 Enterprise 日本語版(64ビット版)

・Microsoft Windows 7 Ultimate 日本語版(64ビット版)

・Windows 8.1 Pro 日本語版(32ビット版)

・Windows 8.1 Enterprise 日本語版(32ビット版)

・Windows 8.1 Pro 日本語版(64ビット版)

・Windows 8.1 Enterprise 日本語版(64ビット版)

・Windows 10 Pro 日本語版(32ビット版)

・Windows 10 Enterprise 日本語版(32ビット版)

・Microsoft Windows Server 2008 R2 Standard 日本語版

・Microsoft Windows Server 2008 R2 Enterprise 日本語版

・Microsoft Windows Server 2008 R2 Datacenter 日本語版

・Microsoft Windows Server 2012 Standard 日本語版

・Microsoft Windows Server 2012 Datacenter 日本語版

・Microsoft Windows Server 2012 R2 Standard 日本語版

・Microsoft Windows Server 2012 R2 Datacenter 日本語版

・Microsoft Windows Server 2016 Standard 日本語版

・Microsoft Windows Server 2016 Datacenter 日本語版

付録B　COBOL85および旧バージョンのCOBOL2002からの移行性と互換性

ここでは，COBOL85製品および旧バージョンのCOBOL2002からの移行性と互換性について説明します。

この節での製品の表記を次の表に示します。

表B‒1　 製品の表記

この節での表記

製品

COBOL85製品

COBOL85

OOCOBOL

COBOL85版Cosminexus連携

COBOL85版XML連携

COBOL85

COBOL85

COBOL85 Run Time System

OOCOBOL

OOCOBOL

OOCOBOL Run Time System

COBOL85版Cosminexus連携

COBOL adapter for Cosminexus

COBOL 拡張 Server Run Time System for Cosminexus

COBOL85版XML連携

COBOL adapter for XML

COBOL 拡張 Run Time System for XML

COBOL adapter for XML developer's kit

COBOL2002 V1

COBOL2002（バージョン01-00以降02-00未満）

COBOL2002 V2

COBOL2002（バージョン02-00以降03-00未満）

COBOL2002 V3

COBOL2002（バージョン03-00以降04-00未満）

COBOL2002 V4

COBOL2002（バージョン04-00以降05-00未満）

COBOL2002 V5

COBOL2002（バージョン05-00以降）

付録B.1　COBOL2002 V5への移行性と互換性

COBOL2002 V5への移行性と互換性について説明します。

なお，次の機能を使用しているプログラムは，Windows COBOL2002 V4/V5への移行性はありません。

OLE2オートメーションサーバ機能

CGIプログラム作成支援機能

EURを使用した通信節による帳票出力機能

Windows(x86) COBOL2002からWindows(x64) COBOL2002への移行時には，移行前に32bitアプリケーションと64bitアプリケーションの相違について確認してください。64bitアプリケーションについては，「39.　64bitアプリケーションの作成」を参照してください。

(1)　COBOL85，COBOL2002の旧バージョンで作成したファイルの移行性

COBOL85およびWindows(x86) COBOL2002 V1/V2/V3/V4で作成したファイルのWindows(x86) COBOL2002 V5への移行性を次の表に示します。

表B‒2　 Windows(x86) COBOL2002 V5への移行性

対象ファイル

移行元システム

ファイル種別

拡張子

Windows(x86) COBOL2002 V4

Windows(x86) COBOL2002 V3

Windows(x86) COBOL2002 V2

Windows(x86) COBOL2002 V1

COBOL85

COBOLソースファイル

.cblほか

○

○

○

○

○

プログラム情報ファイル

.cbpほか

△

△

△

△

×

画面定義ファイル

.wdf

○

○

○

○

○

ファイル定義ファイル

.flf

○

○

○

○

○

レコード定義ファイル

.rdf

○

○

○

○

○

実行環境ファイル

.cbr

△

△

△

△

×

stdcall呼び出し指示ファイル

.cbw

○

○

○

○

○

プログラムテンプレートファイル

.cet

○

○

○

○

○※1

COBOLエディタ設定ファイル

.cex

○

○

−

−

−

DLLファイル

.dll

○

○

○

△

×

実行可能ファイル

.exe

○

○

○

△

×

ライブラリファイル

.lib

△

△

△

△

×

オブジェクトファイル

.obj

○

○

○

△

×

プロジェクトファイル

.pmi

△

△

△

△

△※2

プロジェクトマスタファイル

.hmf

△

△

△

△

△※3

印刷書式情報ファイル

.prt

△

△

△

△

×

ブラウズデータファイル

.brd

−

−

−

−

−

OLE定義ファイル

.odf

−

−

−

−

−

CGI環境ファイル

.env

−

−

−

−

−

パッケージ情報ファイル

.pkg

○

○

○

○

○※3

プロジェクト情報ファイル

.hmp

△

△

△

△

△※3

COBOLサービスルーチンファイル

.svw

○

○

○

○

○※3

ユーザキーワードファイル

.usw

○

○

○

○

○※3

TDコマンド格納ファイル

(サブコマンド格納ファイル)

.tdiほか

○

○

○

○

×

リポジトリファイル

.rep

○

○

○

○

−

COBOLアクセス用Bean

.java

○

○

○

○

○

EJB関連Javaソースファイル

.java

○

○

○

○

○

XMLアクセス用データ定義ファイル

.cbl

○

○

○

○

−

XMLアクセスルーチンファイル

（COBOL副プログラム）

.cbl

○

○

○

○

−

文書型定義(DTD)ファイル

.cbl

○

○

○

○

−

XMLドキュメントファイル

.xml

○

○

○

○

−

データ定義(DDF)ファイル

.cxd

○

○

○

○

−

カタログファイル

.cxc

○

○

○

○

−

（凡例）

○：移行できる

△：一部移行性あり（詳細は，「(2)　ファイルの移行性の注意事項」を参照してください）

×：移行できない

−：移行先または移行元で未サポートのファイル

注※1

COBOL85 03-01以降にサポートしたファイルです。

注※2

COBOL85 06-00未満でサポートしていたファイルです。なお，COBOL85 06-00以降は，拡張子".hmf"になります。

注※3

COBOL85 06-00以降にサポートしたファイルです。

Windows(x86) COBOL2002およびWindows(x64) COBOL2002 V1/V2/V3/V4で作成したファイルのWindows(x64) COBOL2002 V5への移行性を次の表に示します。

表B‒3　Windows(x64) COBOL2002 V5への移行性

対象ファイル

移行元システム

ファイル種別

拡張子

Windows(x64) COBOL2002 V4

Windows(x64) COBOL2002 V3

Windows(x64) COBOL2002 V2

Windows(x64) COBOL2002 V1

Windows(x86) COBOL2002

COBOLソースファイル

.cblほか

○

○

○

○

○

プログラム情報ファイル

.cbpほか

△

△

△

△

×

画面定義ファイル

.wdf

○

○

−

−

○

ファイル定義ファイル

.flf

○

○

−

−

○

レコード定義ファイル

.rdf

○

○

−

−

○

実行環境ファイル

.cbr

△

△

△

△

△

stdcall呼び出し指示ファイル

.cbw

−

−

−

−

−

プログラムテンプレートファイル

.cet

○

○

○

○

○

COBOLエディタ設定ファイル

.cex

○

○

−

−

○

DLLファイル

.dll

○

○

○

△

×

実行可能ファイル

.exe

○

○

○

△

×

ライブラリファイル

.lib

△

△

△

△

×

オブジェクトファイル

.obj

○

○

○

△

×

プロジェクトファイル

.pmi

○

○

○

○

△

プロジェクトマスタファイル

.hmf

○

○

○

○

△

印刷書式情報ファイル

.prt

△

△

△

△

△

ブラウズデータファイル

.brd

−

−

−

−

−

OLE定義ファイル

.odf

−

−

−

−

−

CGI環境ファイル

.env

−

−

−

−

−

パッケージ情報ファイル

.pkg

○

○

○

○

○

プロジェクト情報ファイル

.hmp

○

○

○

○

△

COBOLサービスルーチンファイル

.svw

○

○

○

○

○

ユーザキーワードファイル

.usw

○

○

○

○

○

TDコマンド格納ファイル

(サブコマンド格納ファイル)

.tdiほか

○

○

○

○

○

リポジトリファイル

.rep

○

○

○

○

×

COBOLアクセス用Bean

.java

○

○

○

○

○

EJB関連Javaソースファイル

.java

○

○

○

○

○

XMLアクセス用データ定義ファイル

.cbl

○

○

○

−

△

XMLアクセスルーチンファイル

（COBOL副プログラム）

.cbl

○

○

○

−

△

文書型定義(DTD)ファイル

.cbl

○

○

○

−

○

XMLドキュメントファイル

.xml

○

○

○

−

○

データ定義(DDF)ファイル

.cxd

○

○

○

−

○

カタログファイル

.cxc

○

○

○

−

○

（凡例）

○：移行できる

△：一部移行性あり（詳細は，「(2)　ファイルの移行性の注意事項」を参照してください）

×：移行できない

−：移行先または移行元で未サポートのファイル

(2)　ファイルの移行性の注意事項

(a)　プログラム情報ファイル（.cbpほか）の移行での注意事項

蓄積されているカバレージ情報は，プログラム情報ファイルを消さないで再コンパイルすることで引き継げます。再生成したプログラム情報ファイルにカバレージ情報を蓄積するようにしてください。

(b)　実行環境ファイル（.cbr），印刷書式情報ファイル（.prt）の移行での注意事項

実行環境ファイル（.cbr），印刷書式情報ファイル（.prt）を作成したときのOSやマシン環境※が異なる場合は，実行環境ファイルの印刷書式と印刷書式情報ファイルを再設定してください。印刷書式情報には，OSとマシン固有の情報が含まれます。

注※

JP1/ServerConductor/Deployment ManagerやHitachi Compute Systems Manager Deployment Manager Plug-inのディスク複製インストール機能，および仮想化プラットフォームが提供するイメージファイル化による複製機能を使用する場合も含みます。

(c)　DLLファイル（.dll），実行可能ファイル（.exe），ライブラリファイル（.lib），オブジェクトファイル（.obj）の移行での注意事項

複数プログラムで外部属性を持つ（EXTERNAL句指定のある）同一のファイルを使用する場合，Windows COBOL2002 01-00でコンパイルしたプログラムと，Windows COBOL2002 01-01以降でコンパイルしたプログラムを混在させているときは，外部属性を持つ同一のファイルを使用するプログラムをすべて再コンパイルしてください。

Windows(x86) COBOL2002 V1で作成したDLLファイル，実行可能ファイルは，プログラムを構成するすべてのDLLファイル，実行可能ファイルをそのまま使用する場合，再コンパイルしなくても移行できます。

ただし，次の個所に日本語などの多バイト文字を使用している場合，プログラムを構成するDLLファイル，実行可能ファイルを一つでも再コンパイルするときは，すべてのDLLファイル，実行可能ファイルを再コンパイルしてください。

プログラム名／クラス名／インタフェース名／関数名

XML連携機能のインタフェース名

Windows COBOL2002 V1で作成したライブラリファイルやオブジェクトファイルで，ISAMによる索引ファイル入出力機能や，次の個所に日本語などの多バイト文字を使用している場合は，再コンパイルしてください。

プログラム名／クラス名／インタフェース名／関数名

XML連携機能のインタフェース名

Windows COBOL2002で作成した日本語などの多バイト文字を使用した名称のDLLファイルは，再コンパイルしてライブラリファイル（.lib）を再生成してください。再生成したライブラリファイル（.lib）で再リンクしてください。

(d)　XMLアクセス用データ定義ファイル（.cbl），XMLアクセスルーチンファイル（.cbl）の移行での注意事項

Windows(x86) COBOL2002 XML連携機能で生成したXMLアクセスルーチンおよびXMLアクセス用データ定義を移行する場合に注意事項があります。詳細については，マニュアル「COBOL2002　XML連携機能ガイド」の「64bit版COBOL2002　XML連携機能の制限事項」を参照してください。

(e)　プロジェクトファイル（.pmi），プロジェクトマスタファイル（.hmf），プロジェクト情報ファイル（.hmp）の移行での注意事項

COBOL85またはWindows(x86) COBOL2002で作成した次のファイルで，SEWB+/CONSTRUCTIONまたはSEWB+基本開発環境セットのプログラム定義ファイルをソースファイルとして登録したものは，Windows COBOL2002 V4/V5への移行はできません。

プロジェクトファイル（.pmi）

プロジェクトマスタファイル（.hmf）

プロジェクト情報ファイル（.hmp）

付録B.2　OOCOBOLからの移行性

OOCOBOLからの移行性はありません。

付録B.3　COBOL85版Cosminexus連携の移行性と互換性

COBOL85版Cosminexus連携の移行性と互換性について説明します。

COBOL2002 Cosminexus連携機能で生成したCOBOLアクセス用Bean（.java）は，COBOL85版Cosminexus連携で使用できません。

COBOL85版Cosminexus連携で生成したCOBOLアクセス用BeanをCOBOL2002 Cosminexus連携機能向けに再生成する場合，COBOLアクセス用Beanを使用しているJavaプログラムも再コンパイルしてください。

COBOL2002 Cosminexus連携機能では，setterで不当データを設定した際に発生する例外の発生個所が変わります。例外の発生個所を次に示します。

COBOL85版Cosminexus連携：callメソッド

COBOL2002 Cosminexus連携機能：setterメソッド

setterとcallCOBOLを同じtry-catchでキャッチしている場合，COBOL85版Cosminexus連携では，setterで発生したエラーかcallCOBOLで発生したエラーか区別できませんが，COBOL2002 Cosminexus連携機能では区別できます。

Javaプログラムの変更例を次に示します。

（変更前）

　　　　:
　　　try {
　　　　bean.setP_name("");
　　　　bean.setP_address("");
　　　　callCOBOL();
　　　} catch ( J2CBException e ) {
　　　　: /* setter,callCOBOLどちらかで発生したエラー */
　　　}

（変更後）

　　　　:
　　　try {
　　　　bean.setP_name("");
　　　　bean.setP_address("");
　　　} catch ( J2CBException e ) {
　　　　: /* setterで発生したエラー */
　　　}
　　　try {
　　　　callCOBOL();
　　　} catch ( J2CBException e ) {
　　　　: /* callCOBOLで発生したエラー */
　　　}

setterの引数にCOBOL引数定義と対応しないオブジェクトを指定した場合※1，COBOL85版Cosminexus連携とCOBOL2002 Cosminexus連携機能で動作が異なります。

COBOL85版Cosminexus連携：callCOBOLメソッドで予期しないエラーとなるか，例外にならないで続行※2することがあります。

COBOL2002 Cosminexus連携機能：setterメソッドで例外となります。「J2CByyy2014」のメッセージが出力されます。メッセージの詳細については，マニュアル「COBOL2002　Cosminexus連携機能ガイド」を参照してください。

COBOL85版Cosminexus連携で稼働済みのJavaプログラムをCOBOL2002環境に移行する場合，このケースに該当しないか確認してください。該当する場合は，COBOLで定義した属性に対応するオブジェクトを，setterの引数に指定してください。

注※1

USAGE COMP-1（単精度浮動小数点項目）で定義した引数に，Stringオブジェクトで値を設定しようとした場合などです。

COBOLで定義した属性に対応するオブジェクトの一覧については，COBOLアクセス用Bean生成ツールの「ステップ2/3画面」を参照してください。COBOLアクセス用Bean生成ツールについては，マニュアル「COBOL2002 Cosminexus連携機能ガイド」を参照してください。

注※2

例えば，小数点のない2進2バイトのデータ項目にsetterで値を設定する場合，setterの引数には通常Shortオブジェクトを指定します。しかし，setterの引数にIntegerオブジェクトを指定すると，誤った値が設定されることがあります。

例外発生時の例外情報コードで，COBOL85版Cosminexus連携と異なるコードがあります。

付録B.4　COBOL85版XML連携の移行性と互換性

COBOL85版XML連携の移行性と互換性について説明します。

COBOL85版XML連携はCOBOL2002と連携して使用できません。

COBOL85版XML連携で作成したファイルの移行性を次の表に示します。

表B‒4　COBOL85版XML連携に関係するファイルのCOBOL2002 V4/V5への移行性

対象ファイル

移行先システム

ファイル種別

拡張子

Windows(x86) COBOL2002 V4/V5

Windows(x64) COBOL2002 V4/V5

XMLアクセス用データ定義ファイル

.cbl

○

×

XMLアクセスルーチンファイル（COBOL副プログラム）

.cbl

○

×

文書型定義（DTD）ファイル

.xmlまたは.dtd

○

○

XMLドキュメントファイル

.xml

○

○

データ定義（DDF）ファイル

.cxd

○

○

カタログファイル

.cxc

○

○

（凡例）

○：移行できる

×：移行できない

付録B.5　機能ごとの移行性と互換性に関する注意事項

(1)　浮動小数点演算の結果に関する注意事項

異なるプラットフォームへ移行する場合，浮動小数点演算の精度の違いによって，移行元システムと結果差異が発生することがあります。浮動小数点数として妥当な値でも，異なるプラットフォームへ移行する場合は浮動小数点演算の精度の違いによる誤差に注意してください。

浮動小数点演算の精度の違いによる誤差が発生する条件を次に示します。

被べき数（底）またはべき数（指数）が浮動小数点項目や浮動小数点数字定数である場合

べき数（指数）が整数でない定数や整数項目でないべき乗演算を使用する場合

次のどれかの組み込み関数を使用する場合

ACOS関数

ASIN関数

ATAN関数

COS関数

LOG関数

LOG10関数

RANDOM関数

SIN関数

SQRT関数

SUM関数（引数に浮動小数点項目，除算またはべき乗が含まれる算術式を指定した場合）

TAN関数

ANNUITY関数

PRESENT-VALUE関数

(2)　実行可能ファイルまたはDLLファイル作成時の注意事項

インストール先の変更点

COBOL2002 V4以降，COBOL85または旧バージョンのCOBOL2002からインストール先が変更されています。

バッチファイルなどで環境変数PATHとLIBを個別に設定している場合や，対象ファイルを絶対パス名で参照している場合，設定値の修正が必要です。

リンカやライブラリのインストール先

COBOL2002 V3では，同梱するVisual Studioのリンカなどのインストール先を変更しています。また，COBOL2002 V4/V5では，COBOL2002のインストーラがWindows SDKに含まれるマニフェストツールおよびC/C++インポートライブラリをインストールしなくなりました。

表B‒5　リンカやライブラリのインストール先

対象ファイル

対象システム

インストール先

リンカ，ライブラリ管理ツール，リソースコンパイラ

COBOL2002 V1/V2/V3※1

<COBOL2002インストールフォルダ>¥BIN

COBOL2002 V3※2/V4/V5

<COBOL2002インストールフォルダ>¥BIN¥SDK

マニフェストツール

COBOL2002 V1/V2

<COBOL2002インストールフォルダ>¥BIN

COBOL2002 V3

<COBOL2002インストールフォルダ>¥BIN¥SDK

COBOL2002 V4/V5

Windows SDKインストール先のMTコマンドがあるフォルダ

C/C++インポートライブラリ

COBOL2002 V1/V2/V3※1

<COBOL2002インストールフォルダ>¥LIB

COBOL2002 V3※2

<COBOL2002インストールフォルダ>¥LIB¥SDK

COBOL2002 V4/V5

Windows SDKインストール先のインポートライブラリがあるフォルダ※3

注※1

Windows(x64) COBOL2002 03-00の場合だけです。

注※2

Windows(x64) COBOL2002 03-00を除きます。

注※3

詳細については，「付録J　環境変数の設定」を参照してください。

ISAMライブラリのインストール先

移行元のOSがWindows Vista未満，またはWindows Server 2008未満の場合はインストール先が変更となります。

COBOL2002で同梱するISAMのインストール先はCOBOL2002インストールフォルダと同じ階層です。

COBOL2002のインストール先をデフォルトにしたときの，同梱するISAMのインストール先を次に示します。

Windows(x86) COBOL2002の場合：

32bit OSの場合：%ProgramFiles%¥ISAM

64bit OSの場合：%ProgramFiles(x86)%¥ISAM

Windows(x64) COBOL2002の場合：%ProgramFiles%¥ISAM64

(3)　Windows(x86) COBOL2002 01-03未満のCOBOL2002 Cosminexus連携機能を移行する場合の注意事項

(a)　COBOLアクセス用Beanをjavacでコンパイルする場合の注意事項

javacコマンドで，Windows(x86) COBOL2002 01-03未満で生成したCOBOLアクセス用Beanに対し-Xlintオプションを指定すると，次に示す警告メッセージが出力されます。

警告: [serial] 直列化可能なクラス yyy には，serialVersionUID が定義されていません。

注

yyyは，COBOLアクセス用Beanとして生成したパッケージ名.クラス名を示します。

この警告メッセージは無視することができ，生成したクラスの実行動作を保証します。

(b)　ライブラリの常駐化に関する注意事項

デフォルトオプション指定では，COBOL UAP呼び出し後，COBOL UAPライブラリをアンロードしないように変更しています。メモリ資源の面から，使用頻度が少ないライブラリをアンロードしたい場合は，loadingruleオプションおよび環境変数CBLJ2CBSTAYLIBで，COBOL UAPライブラリのロード／アンロードを制御してください。

付録C　Windows OS固有の注意事項

WindowsでCOBOL2002を使用するときの注意事項を次に示します。

付録C.1　管理者権限についての注意事項

UAC機能が有効な場合，管理者ユーザとしてサインインしても，アプリケーションの実行権限は標準権限に下げられます。例えば，管理者権限を必要とするアプリケーションを起動しようとすると，システムは，昇格ダイアログボックスを表示して，ユーザの確認を求めます。この場合，ユーザが実行を許可すると，アプリケーションは管理者権限で実行されます。または，管理者権限で実行するためにプログラムやコマンドのプロパティを変更するか，「管理者として実行」で実行するなどの操作が必要です。

管理者権限についての注意事項を次に示します。

(1)　プログラムを管理者権限で実行する場合の注意事項

管理者権限でプログラムを実行する場合，起動時にWindowsのユーザアカウント制御（UAC）の昇格ダイアログボックスが表示されます。また，ユーザが作成したバッチファイル内など，呼び出し元で設定した環境変数は，呼び出し先の管理者権限で動作するプロセスには引き継がれません。

これらを回避する場合は，呼び出し元のプログラムを管理者権限で実行してください。その際，次の点に注意してください。

呼び出し元から呼ばれるすべてのプログラムは管理者権限で動作することになります。セキュリティの面で問題がないかどうか確認してください。

標準権限のコマンドプロンプトから管理者権限のプログラムを起動した場合，管理者権限のプログラムから標準権限のコマンドプロンプトで設定した環境変数にアクセスできません。コマンドプロンプトも管理者権限で起動してください。バッチファイルを使用する場合は，特に注意してください。

開発マネージャやCOBOLエディタなどを管理者権限で実行させている場合，標準権限で動作するエクスプローラからファイルをドラッグ＆ドロップできません。

(2)　テストデバッガおよびカバレージ使用時の注意事項

テストデバッガおよびカバレージで，次に示す操作を標準権限（Administratorsグループのユーザ含む）で実行する場合，注意が必要です。

連動実行のテストデバッガでデバッグする場合

管理者権限を設定したプログラムをデバッグ対象にする場合

次に示す方法で実行してください。

連動実行のテストデバッガでデバッグする場合

Administratorsグループのユーザの場合は，テストデバッガおよびデバッグ対象プログラムを管理者権限で実行してください。

それ以外のユーザの場合は，テストデバッガおよびデバッグ対象プログラムを，管理者権限で実行するか，「グローバルオブジェクトの作成」権限を追加してから標準権限で実行してください。

「グローバルオブジェクトの作成」権限は，コントロールパネルの［管理ツール］から［ローカルセキュリティポリシー］を使用して，実行するユーザに追加してください。

管理者権限を設定したプログラムをデバッグ対象にする場合

テストデバッガおよびカバレージを管理者権限で実行してください。

テストデバッガおよびカバレージを開発マネージャから呼び出す場合は，開発マネージャを管理者権限で実行してください。

テストデバッガ，カバレージまたは開発マネージャを標準権限（Administratorsグループのユーザ含む）で実行すると，デバッグ対象プログラムの起動に失敗します。

テストデバッガおよびカバレージを管理者権限で実行した場合は，デバッグ対象プログラムも管理者権限で動作します。標準権限で実行した場合は，デバッグ対象プログラムも標準権限で動作します。しかし，テストデバッガおよびカバレージを標準権限で実行した場合は，Windowsリソース保護（WRP）の影響を受けるため，管理者権限で実行したときと実行結果が変わることがあります。そのため，運用時と同じ権限でテストデバッガおよびカバレージを実行してください。

(3)　ISAMによる索引編成ファイル使用時の注意事項

プログラムでISAMによる索引編成ファイルを使用する場合は，管理者権限で実行してください。管理者権限がない場合，ISAMによる索引編成ファイルにアクセスすると実行時エラーになります。

(4)　ISAMユティリティに関する注意事項

使用するISAMユティリティによって，管理者権限での実行が必要かどうかが変わります。ISAMユティリティと管理者権限について説明します。

(a)　管理者権限での実行が必要なISAMユティリティ

管理者権限での実行が必要なISAMユティリティを次に示します。

Windows(x86) COBOL2002の場合

オプション情報の設定ユティリティ

islckextコマンド

islckclearコマンド

islckclearLコマンド

Windows(x64) COBOL2002の場合

オプション情報の設定ユティリティ

islckext64コマンド

islckclear64コマンド

(b)　原則，管理者権限での実行が必要なISAMユティリティ

原則，管理者権限での実行が必要なISAMユティリティを次に示します。

Windows(x86) COBOL2002の場合

定義ファイルの作成ユティリティ

レコード内容の表示ユティリティ

iscpyコマンド

isersコマンド

isrenコマンド

isprtコマンド

Windows(x64) COBOL2002の場合

定義ファイルの作成ユティリティ

レコード内容の表示ユティリティ

iscpy64コマンド

isers64コマンド

isren64コマンド

isprt64コマンド

ただし，セキュリティ上の問題で，管理者権限で実行できない場合は，コントロールパネルの［管理ツール］から［ローカルセキュリティポリシー］を使用して，標準権限にグローバルオブジェクトの作成権限を追加したユーザで実行してください。

グローバルオブジェクトの作成権限がないユーザで，これらのISAMユティリティを標準権限で実行した場合，定義ファイルの作成ユティリティ以外のISAMユティリティはエラーとなります。表示されるエラーメッセージを次の表に示します。

項番

ISAMユティリティ

エラーメッセージ

1

レコード内容の表示ユティリティ

isprtコマンド

KAIU001-E ＩＳＡＭアクセス関数エラーが発生しました。（isopen）

2

iscpyコマンド

isersコマンド

KAIU001-E ＩＳＡＭアクセス関数エラーが発生しました。（normal,5）

3

isrenコマンド

KAIU001-E ＩＳＡＭアクセス関数エラーが発生しました。（isrename,1010）

注意

これらのメッセージは，ISAMファイルにアクセス権がない場合にも表示されます。

また，管理者権限で起動したコマンドプロンプトでもエラーの原因を確認できます。次に示すコマンドを実行し，表示される関数エラー情報を確認してください。

Windows(x86) COBOL2002の場合

ismdmpntコマンド（ラージファイル形式の場合ismdmpntLコマンド）

Windows(x64) COBOL2002の場合

ismdmpnt64コマンド

該当する時間にiserrno=ESYSERR,issyserr=5,syserrknd=13のエラー情報が表示されている場合，グローバルオブジェクトの作成権限がないユーザで，これらのISAMユティリティを標準権限で実行したことを示します。

ismdmpntコマンドまたはismdmpnt64コマンドの表示例

[01]14/08/01; 12:00:00; procno = 2760; thrdno = 2392 (ISAMファイル名)
(ISAM関数): iserrno=ESYSERR,iserrcd = 00000113 ,issyserr = 00000005,syserrknd = 00000013

なお，定義ファイルの作成ユティリティは，ISAMファイルの作成先にすでにISAMファイルが存在する場合，アクセス権などの属性情報が引き継がれます。

(c)　標準権限で実行できるISAMユティリティ

標準権限で実行できるISAMユティリティを次に示します。

Windows(x86) COBOL2002の場合

キーの追加／削除／再構築ユティリティ

ファイルの検証ユティリティ

ファイルの圧縮ユティリティ

ファイルの変換ユティリティ

ファイルの抽出ユティリティ

ファイルの移行ユティリティ

キー定義情報の表示ユティリティ

iskeydefコマンド

iskeymntコマンド

isconvコマンド

ischkコマンド

isextコマンド

isinfoコマンド

iscondコマンド

isshiftコマンド

isgendefコマンド

Windows(x64) COBOL2002の場合

キーの追加／削除／再構築ユティリティ

ファイルの検証ユティリティ

ファイルの圧縮ユティリティ

ファイルの変換ユティリティ

ファイルの抽出ユティリティ

ファイルの移行ユティリティ

キー定義情報の表示ユティリティ

iskeydef64コマンド

iskeymnt64コマンド

isconv64コマンド

ischk64コマンド

isext64コマンド

isinfo64コマンド

iscond64コマンド

isshift64コマンド

なお，ファイル／レコード定義は，ISAMファイルを生成する際にISAMユティリティを使用しますが，ISAMファイルは標準権限で生成できるため，ファイル／レコード定義は，標準権限，管理者権限のどちらでも起動できます。

(d)　ISAMユティリティを管理者権限だけで使用できるようにする方法

ISAMユティリティを<ISAMのインストールフォルダ>※¥Bin¥Compatフォルダに格納されているISAMユティリティと置き換えることで，ISAMユティリティを管理者権限だけで使用できます。なお，置き換え前のISAMユティリティに戻すことができるように，作業前に置き換え前のISAMユティリティをバックアップしておくことを推奨します。

ISAMユティリティを置き換える手順を次に示します。

管理者権限のあるユーザであることを確認する。

コマンドプロンプトを管理者権限に権限昇格して起動する。

<ISAMのインストールフォルダ>※¥Bin¥Compatフォルダに移動する。

cd <ISAMのインストールフォルダ>※¥Bin¥Compat

ISAMユティリティを実行していないことを確認する。

xcopyコマンドでCompatフォルダ内のexeファイルを直上のBinフォルダへコピーする。

xcopy *.exe ..¥ /y

サインアウトする。

注※

ISAMのインストールフォルダは，デフォルトでは次のとおりです。

32bit版：

C:¥Program Files¥Hitachi¥ISAM

64bit版：

C:¥Program Files¥Hitachi¥ISAM64

付録C.2　ファイル格納先についての注意事項

(1)　ファイルダイアログボックスで格納する場合

開発マネージャ，COBOLエディタ，実行支援などで編集したファイルを格納する場合，インストール直後の状態では，ファイルダイアログボックスで表示される格納先はCOBOL2002インストールフォルダに位置付けられています。そのまま格納しようとするとWindowsリソース保護（WRP）によって失敗※しますので，別の場所を指定してください。Windowsリソース保護（WRP）については，各OSのヘルプなどを参照してください。

注※

管理者権限で実行した場合を除きます。

付録C.3　文字コードについての注意事項

COBOL2002のコンポーネント（コンパイラ，実行時ライブラリ，開発ツール）やCOBOL2002またはCOBOL85で作成したプログラムで使用するフォルダ名，ファイル名，プログラムへの入力文字列，および環境変数に指定できる文字は，シフトJISの範囲だけです。JIS X0213の第3水準漢字，および第4水準漢字を含むUnicodeの文字は使用できません。

第3水準漢字，および第4水準漢字の文字を含んだフォルダやファイル名などを入力した場合，システムが第3水準漢字，および第4水準漢字の文字を”?”などに変換し，意図しない値になりますので，注意してください。

付録C.4　実行可能ファイルの実行権限についての注意事項

Windows(x86) COBOL2002 02-00以降またはWindows(x64) COBOL2002で作成したアプリケーションは，標準権限，管理者権限のどちらでも実行できます。

ただし，アプリケーションを実行する場合の実行権限について，次の注意事項があります。

COBOLプログラムからCALL文またはCBLEXECサービスルーチンで実行可能ファイルを実行する場合は，呼び出し元と同じ権限で実行します。例えば，標準権限のアプリケーションから管理者権限のアプリケーション（実行可能ファイル）をCALL文で呼び出した場合，KCCC0137R-Sのメッセージが出力され，システムから返されたエラー番号に740（管理者権限のないユーザから呼び出された）が示されます。このとき，プログラム互換性アシスタント（PCA）に登録され，再度実行した場合はエラーにならない場合があります※。ただし，プログラム互換性アシスタント（PCA）に登録された標準権限のアプリケーションから管理者権限のアプリケーションの呼び出しをCOBOL2002では保証しません。

ISAMによる索引ファイル入出力機能を使用する場合，管理者権限で実行してください。セキュリティ上の問題で管理者権限で実行できない場合は，コントロールパネルの［管理ツール］から［ローカルセキュリティポリシー］を使用して，標準権限にグローバルオブジェクトの作成権限を追加したユーザで実行してください。

注※

プログラム互換性アシスタント（PCA）が自動的に回避策を適用する機能は無効となっていて，継続的にエラーとなることがあります。

アプリケーションの権限の設定方法，およびプログラム互換性アシスタント（PCA）については，各OSのヘルプなどを参照してください。

管理者権限を設定する例

実行可能ファイルのリンク時，-MANIFESTUACリンカオプションで実行可能ファイルのアクセス許可レベルの値を指定します。

ccbl2002 -Main,System test01.cbl -Link -MANIFESTUAC:level='requireAdministrator'

付録C.5　実行時の注意事項

実行時の注意事項を次に示します。

Windows(x86) COBOL2002 02-00以降またはWindows(x64) COBOL2002で作成したアプリケーションは，デフォルトで内部マニフェストを埋め込んでいます。

外部マニフェストファイル※よりも内部マニフェストの情報が優先されるため，内部マニフェストを埋め込んだアプリケーションに対して，外部マニフェストファイルの設定内容は有効となりません。

注※

実行可能ファイル名の後ろに「.manifest」を付加したファイルで，権限属性などを定義できます。

Windows(x86) COBOL2002 02-00以降またはWindows(x64) COBOL2002で作成したアプリケーションを，「プロパティ」ダイアログボックスで実行権限を設定したあと，別のフォルダに移動した場合は，再度実行可能ファイルの「プロパティ」ダイアログボックスで，管理者権限を設定する必要があります。詳細は，各OSのヘルプなどを参照してください。

アプリケーションでファイル入出力機能などを使用する場合，Windowsリソース保護（WRP）によって，Windowsリソース（OSファイル，フォルダなど）が保護されるので，ファイルの出力先の指定に注意が必要です。Windowsリソース保護（WRP）については，各OSのヘルプなどを参照してください。

リンカのインストール先フォルダについては，「付録J　環境変数の設定」を参照してください。

付録D　日立COBOL85からの古い仕様

ここでは，COBOL85で作成したプログラムを移行するために用意されている機能について説明します。

COBOL2002で新規にプログラムを作成する場合は，これらの機能を使用しないで，同じ機能を持つほかの機能を使用してください。

付録D.1　ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス

ACCEPT文，DISPLAY文を使用して，CSVファイルにデータを入出力する方法について説明します。

なお，ACCEPT／DISPLAY文を使用したCSVファイルへのアクセス方法では，一つの実行単位で一つのCSVファイルしか扱えません。そのため，通常はREAD／WRITE文を使用してCSV編成ファイルとして入出力する方法を推奨します。CSV編成ファイルの入出力方法については，「6.8　CSV編成ファイル（表計算プログラムファイル）」を参照してください。

(1)　CSVデータの読み込み

環境変数CBL_SYSCSVINで割り当てたCSVファイルのデータを，ACCEPT文を実行することで1行ずつ（改行文字まで）読み込めます。読み込まれた1行は，コンマ（,）で区切られたデータ（セル）ごとにユーザが定義したデータ領域に格納されます。

ACCEPT文の形式

ACCEPT 一意名 FROM 呼び名※

注※

呼び名は，環境部の特殊名段落で，SYSCSVに関連づけておく必要があります。詳細は，マニュアル「COBOL2002　言語　拡張仕様編」　「17.3.1　環境部（SPECIAL-NAMES）（CSVファイル入出力機能）」を参照してください。

CSVファイルの割り当て

ACCEPT文で入力するCSVファイルは，環境変数CBL_SYSCSVINに絶対パス名で指定しておきます。環境変数の指定例を次に示します。

CBL_SYSCSVIN=C:¥dir¥file1.csv

規則

環境変数CBL_SYSCSVINにファイルが割り当てられていない場合，最初のACCEPT文実行時に実行時メッセージが出力され，プログラムの実行が中止されます。

CSVファイルから読み込まれた1行中の各セルは，一意名に従属する基本項目に先頭から1対1対応で格納されます。セルの個数が基本項目の個数より多い場合，対応しないセルは無視されます。セルの個数が基本項目の個数より少ない場合，対応しない基本項目の値は，ACCEPT文の実行前の状態から変更されません。

セルは，英数字項目の転記規則に従って一意名のデータ項目に格納されます。

入力データにダブルコーテーション（"）が含まれない場合，コンマまたは改行文字（X'0D0A'）を区切り文字としてデータが入力されます。

入力データにダブルコーテーションが含まれる場合，次の規則に従ってデータが入力されます。

1. コンマの直後がダブルコーテーションの場合，次のダブルコーテーションの直前までをデータとして扱う。

2. コンマの直後がダブルコーテーションでない場合，データ中に含まれるダブルコーテーションは文字データとして扱う。

(2)　CSVデータの書き込み

環境変数CBL_SYSCSVOUTで割り当てたファイルに，DISPLAY文を実行することでCSV形式のデータを1行ずつ書き出せます。各行は，ユーザが定義したデータ領域の値にコンマを付けた形式で書き出されます。書き出されたファイルは，表計算プログラムのCSVファイルとなります。

DISPLAY文の形式

DISPLAY 一意名 UPON 呼び名※

注※

呼び名は，環境部の特殊名段落で，SYSCSVに関連づけておく必要があります。詳細は，マニュアル「COBOL2002　言語　拡張仕様編」　「17.3.1　環境部（SPECIAL-NAMES）（CSVファイル入出力機能）」を参照してください。

CSVファイルの割り当て

DISPLAY文で出力するCSVファイルは，環境変数CBL_SYSCSVOUTに絶対パス名で指定しておきます。環境変数の指定例を次に示します。

CBL_SYSCSVOUT=C:¥dir¥file2.csv

規則

環境変数CBL_SYSCSVOUTにファイル名が割り当てられていない場合，最初のDISPLAY文実行時に実行時メッセージが出力され，プログラムの実行が中止されます。

データは，一意名または一意名に従属する基本項目のそれぞれの値にコンマを付けてデータを引用符で囲み，さらに終端に改行文字を付けて出力されます。

セルデータの最後に空白文字がある場合，その空白は出力されません。

付録D.2　サービスルーチンを使ったOLE2オートメーションクライアント機能

ここでは，サービスルーチンを使ってOLE2オートメーションクライアント機能を使用する方法について説明します。

なお，通常OLE2オートメーションクライアント機能を使用する場合は，「25.2　OLE2オートメーションクライアント機能」に示す方法を使用してください。

(1)　サービスルーチンの一覧

OLE2オートメーションクライアント機能を使用するためにCOBOL2002が用意しているサービスルーチンの種類を次に示します。なお，サービスルーチンは，表中の呼び出し順序に従って呼び出す必要があります。

表D‒1　サービスルーチンの種類

呼び出し順序

サービスルーチン

機能

1

CBLOLE2INIT

OLE2を初期設定する。

2

CBLCREATEOBJ

操作したいOLE2サーバのOLEオブジェクトを生成する。

CBLGETOBJ

操作したいOLE2サーバのOLEオブジェクトを取得する。

3

CBLGETPROPERTY

OLE2サーバのOLEプロパティの値を取得する。

CBLPUTPROPERTY

OLE2サーバのOLEプロパティに値を設定する。

CBLMETHODCALL

OLE2サーバのOLEメソッドを操作する。

CBLVARIANTINF

VARIANT値の属性を調べる。

CBLSETCBLITEM

VARIANT値からCOBOLデータ項目に変換する。

CBLSETVARIANT

COBOLデータ項目からVARIANT値に変換する。

4

CBLOLE2UNINIT

OLE2を終了させる。

なお，各サービスルーチンの「戻り値」に記されているエラーコード値の内容については，「(3)　エラーコード値」を参照してください。

(2)　サービスルーチンの詳細

サービスルーチンの詳細を以下に示します。

なお，使用例のプログラムをWindows(x64) COBOL2002で使用する場合は，読み替えが必要です。

使用例の記述（Windows(x86) COBOL2002で使用）

01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.

読み替えの記述（Windows(x64) COBOL2002で使用）

01 ARG1 PIC 9(18) USAGE COMP VALUE ZERO.

(a)　CBLOLE2INIT

OLE2の初期値を設定するサービスルーチンです。

形式

CALL 'CBLOLE2INIT' USING BY VALUE 引数1
                   BY REFERENCE 引数2.

引数

引数1には，4バイト※の2進項目で0を設定します。このサービスルーチンを呼び出したあとに，引数1の値を書き換えないでください。

引数2は，次の集団項目を要求します。

       01 引数2.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

4バイトの2進項目で0を設定します。

注※

Windows(x64) COBOL2002の場合は8バイトに読み替えてください。

戻り値

正常：0

上記以外：エラーコード値

注意事項

CBLOLE2INITサービスルーチンは，次のサービスルーチンより先に呼び出されている必要があります。

CBLCREATEOBJ

CBLVARIANTINF

CBLGETOBJ

CBLSETCBLITEM

CBLGETPROPERTY

CBLSETVARIANT

CBLPUTPROPERTY

CBLOLE2UNINIT

CBLMETHODCALL

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMINIT.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLOLE2INIT' USING BY VALUE ARG1
                              BY REFERENCE PRMINIT.

(b)　CBLCREATEOBJ

OLE2サーバのOLEオブジェクトを生成します。

形式

CALL 'CBLCREATEOBJ' USING BY VALUE 引数1
                          BY REFERENCE 引数2 引数3.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2は，このサービスルーチンが生成したOLE2サーバのOLEオブジェクトを格納する領域です。この領域はアドレスデータ項目で設定します。サービスルーチンの発行時は0を設定します。

       01 引数2 USAGE ADDRESS.

次のサービスルーチンを呼び出す場合，この領域と同じ領域を先に設定しておく必要があります。

・CBLGETPROPERTY

・CBLPUTPROPERTY

・CBLMETHODCALL

設定しないでこれらのサービスルーチンを呼び出した場合の結果は保証しません。

引数3は，次の集団項目を要求します。

       01 引数3.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.

項目の説明

4バイトの2進項目で0を設定します。

3.で指定する領域がポイントする領域の長さを，4バイトの2進項目で設定します。

OLE2サーバのクラス名を指定します。この領域は，アドレスデータ項目で定義します。この領域がポイントする領域は，次のような基本項目です（xx：クラス名を格納するのに必要なバイト数）。

    01 データ名 PIC X(xx).

戻り値

正常：0

上記以外：エラーコード値

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMCREATEOBJ.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 CLSLENG PIC 9(9) COMP VALUE 17.
        02 CLSNAMEPTR USAGE ADDRESS.
       01 CLASSNAME PIC X(17) VALUE 'Excel.Application'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMOBJ = ZERO.
           COMPUTE CLSNAMEPTR = FUNCTION ADDR(CLASSNAME).
           CALL 'CBLCREATEOBJ'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ PRMCREATEOBJ.

(c)　CBLGETOBJ

OLE2サーバのOLEオブジェクトをファイルから取得する場合，またはすでにOLE2サーバが起動している場合に，そのOLE2サーバのOLEオブジェクトを取得するサービスルーチンです。

形式

CALL 'CBLGETOBJ' USING BY VALUE 引数1
                 BY REFERENCE 引数2 引数3.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2は，このサービスルーチンが取得したOLE2サーバのOLEオブジェクトを格納する領域です。この領域はアドレスデータ項目で設定します。サービスルーチンの発行時は0を設定します。

       01 引数2 USAGE ADDRESS.

次のサービスルーチンを呼び出す場合，この領域と同じ領域を設定して呼び出す必要があります。設定しないで呼び出した場合の結果は保証しません。

・CBLGETPROPERTY

・CBLPUTPROPERTY

・CBLMETHODCALL

引数3は，次の集団項目を要求します。

Windows(x86) COBOL2002の場合

       01 引数3.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名1 PIC 9(9) USAGE COMP.        … 2.
         02 データ名2 USAGE ADDRESS.              … 3.
         02 データ名3 PIC 9(9) USAGE COMP.        … 4.
         02 データ名4 USAGE ADDRESS.              … 5.

Windows(x64) COBOL2002の場合

       01 引数3.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名1 PIC 9(9) USAGE COMP.        … 2.
         02 データ名2 USAGE ADDRESS.              … 3.
         02 データ名3 PIC 9(9) USAGE COMP.        … 4.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名4 USAGE ADDRESS.              … 5.

項目の説明

4バイトの2進項目で0を設定します。

3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

取得したいOLEオブジェクトが含まれているファイルの絶対パス名，およびファイル名を格納した領域のポインタを指定します。この領域は，アドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です（xx：ファイル名を格納するのに必要なバイト数）。

01 データ名 PIC X(xx).

5.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

OLE2サーバのクラス名を格納した領域のポインタを指定します。この領域はアドレスデータ項目で定義します。この領域がポイントする領域は，次のような基本項目です（xx：クラス名を格納するのに必要なバイト数）。

    01 データ名 PIC X(xx).

戻り値

正常：0

上記以外：エラーコード値

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMGETOBJ.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 FILELENG PIC 9(9) USAGE COMP VALUE 16.
        02 FILENAMEPTR USAGE ADDRESS.
        02 CLSLENG PIC 9(9) USAGE COMP VALUE 11.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.※
        02 CLSNAMEPTR USAGE ADDRESS.
       01 FILENAME PIC X(16) VALUE 'c:¥temp¥data.xls'.
       01 CLASSNAME PIC X(11) VALUE 'Excel.Sheet'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMOBJ = ZERO.
           COMPUTE FILENAMEPTR = FUNCTION ADDR(FILENAME).
           COMPUTE CLSNAMEPTR = FUNCTION ADDR(CLASSNAME).
           CALL 'CBLGETOBJ'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ PRMGETOBJ.

注※

Windows(x64) COBOL2002では追加してください。

(d)　CBLGETPROPERTY

OLE2サーバのOLEオブジェクトのOLEプロパティの値を取得するサービスルーチンです。

形式

CALL 'CBLGETPROPERTY' USING BY VALUE 引数1
                      BY REFERENCE 引数2 引数3 引数4.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2には，CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成・取得したOLE2サーバのOLEオブジェクトを格納している領域を指定します。

       01 引数2 USAGE ADDRESS.

この領域は，アドレスデータ項目で必ず指定してください。

引数3は，このサービスルーチンが，OLE2サーバのOLEプロパティから取得したVARIANT値のアドレスを設定します。初期値としては0を設定します。

       01 引数3 USAGE ADDRESS.

この値は，CBLSETCBLITEMサービスルーチンでCOBOLのデータ項目に設定できます。

引数4は，次の集団項目を要求します。

       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.

項目の説明

4バイトの2進項目で0を設定します。

3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

OLE2サーバのOLEプロパティおよびそれまでのコンテナ，コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また，この領域はアドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です（xx：文字列を格納するのに必要なバイト数）。

    01 データ名 PIC X(xx).

戻り値

正常：0

上記以外：エラーコード値

注意事項

3.で指定した領域がポイントする文字列の中で，ピリオドで区切られているいちばん右側の文字列がOLEプロパティと判断されます。また，これ以外はすべてコレクションまたはコンテナと判断されます。

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMGETPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43)VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1). Value'.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLGETPROPERTY'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ
                                   PRMVARIANT
                                   PRMGETPROPERTY.

(e)　CBLPUTPROPERTY

OLE2サーバのOLEオブジェクトのOLEプロパティに値を設定するサービスルーチンです。

形式

CALL 'CBLPUTPROPERTY' USING BY VALUE 引数1
                    BY REFERENCE 引数2 引数3 引数4.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2には，CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成，取得したOLE2サーバのOLEオブジェクトを格納した領域を指定します。

  01 引数2 USAGE ADDRESS.

この領域は，アドレスデータ項目で必ず指定してください。

引数3は，このサービスルーチンがOLE2サーバのOLEプロパティに設定するVARIANT値のアドレスを設定します。初期値としては0を設定します。

  01 引数3 USAGE ADDRESS.

この領域は，アドレスデータ項目で定義します。

この値は，設定するCOBOLのデータ項目をあらかじめCBLSETVARIANTサービスルーチンによってVARIANT値に変換しておきます。

引数4は，次の集団項目を要求します。

       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.

項目の説明

4バイトの2進項目で0を設定します。

3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

OLE2サーバのOLEプロパティおよびそれまでのコンテナ，コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また，この領域はアドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です（xx：文字列を格納するのに必要なバイト数）。

    01 データ名 PIC X(xx).

戻り値

正常：0

上記以外：エラーコード値

注意事項

3.で指定した領域がポイントする文字列の中で，ピリオドで区切られているいちばん右側の文字列がOLEプロパティと判断されます。また，これ以外はすべてコレクションまたはコンテナと判断されます。

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMPUTPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43) VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1).Value'.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT =
                 (CBLSETVARIANTサービスルーチンで
                  変換したVARIANT値).
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLPUTPROPERTY' USING
                BY VALUE ARG1
                BY REFERENCE PRMOBJ
                             PRMVARIANT
                             PRMPUTPROPERTY.

(f)　CBLMETHODCALL

OLE2サーバのOLEオブジェクトのOLEメソッドを操作するサービスルーチンです。

形式

CALL 'CBLMETHODCALL' USING BY VALUE 引数1
          BY REFERENCE 引数2 引数3 引数4.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2には，CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成，取得したOLE2サーバのOLEオブジェクトを格納した領域を指定します。

       01 引数2 USAGE ADDRESS.

この領域は，アドレスデータ項目で必ず指定してください。

引数3は，このサービスルーチンがOLE2サーバのOLEメソッドから返される値を設定するVARIANT値のアドレスを設定します。

       01 引数3 USAGE ADDRESS.

この領域はアドレスデータ項目で定義します。OLEメソッドが値を返さない場合は0を設定します。

引数4は，次の集団項目を要求します。

Windows(x86) COBOL2002の場合

       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.
        02 データ名3 PIC 9(9) USAGE COMP.        … 4.
        02 データ名4 USAGE ADDRESS.              … 5.

Windows(x64) COBOL2002の場合

       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.
        02 データ名3 PIC 9(9) USAGE COMP.        … 4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名4 USAGE ADDRESS.              … 5.

項目の説明

4バイトの2進項目で0を設定します。

3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

パラメタを含む該当するメソッド，およびそれまでのコンテナ，コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また，この領域はアドレスデータ項目で定義します。

この領域がポイントする領域は次のような基本項目です（xx：文字列を格納するのに必要なバイト数）。

  01 データ名 PIC X(xx).

この領域は，OLEメソッドに引数を指定する場合に，3.で指定した領域中のOLEメソッドの文字列にパラメタを含めて指定するのではなく，VARIANT値の配列として指定するとき，5.で指定する引数の配列テーブルのエントリ数を設定します。

3.で指定する領域中のメソッドの文字列にパラメタを含める場合，またはOLEメソッドにパラメタがない場合は0を設定します。4バイトの2進項目で設定します。

この領域は，OLEメソッドに引数を指定する場合に，3.で指定する領域中のOLEメソッドの文字列にパラメタを含めて指定するのではなく，VARIANT値の配列として指定するとき，引数の配列テーブルのアドレスを設定します。

この領域がポイントする配列テーブルは次のような集団項目です。

このとき，6.で指定する領域がポイントするVARIANT値は，あらかじめCOBOLのデータ項目をCBLSETVARIANTサービスルーチンで変換しておいてください。3.で指定する領域中のOLEメソッドの文字列にパラメタを含める場合，またはOLEメソッドにパラメタがない場合は0を設定します。

戻り値

正常：0

上記以外：エラーコード値

注意事項

(a)

引数4の3.がポイントする文字列の中で，ピリオドで区切られているいちばん右側の文字列がOLEメソッドと判断されます。これ以外はすべてコレクションまたはコンテナと判断されます。

括弧で囲まれている場合は，そのOLEメソッドにパラメタが含まれていると判断され，引数4の5.で指定した配列テーブルは無視されます。

複数のパラメタを指定する場合は「，」で区切らなければなりません。

(b)

引数4の3.がポイントする文字列のOLEメソッドにパラメタを含めた場合，このサービスルーチンは次のように仮定します。

「'」または「"」で囲まれているパラメタは文字列とする。

0〜9と小数点のピリオドから構成される数値は倍精度浮動小数点とする。

(c)

パラメタの属性が(b)の方法で設定する仮定値と異なる場合は，引数4の5.にVARIANT値の配列テーブルポインタを設定してOLEメソッドのパラメタを指定してください。

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMMETHODCALL.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 48.
        02 STRINGNAMEPTR USAGE ADDRESS.
        02 VARTBLCNT PIC 9(9) USAGE COMP VALUE ZERO.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.※
        02 VARTBLPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(48) VALUE
          'InputBox(''Please Input Data'',
      -   '''COBOL InputBox'')'.
      *     :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE VARTBLPTR = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLMETHODCALL'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ
                                   PRMVARIANT
                                   PRMMETHODCALL.

注※

Windows(x64) COBOL2002では追加してください。

(g)　CBLVARIANTINF

CBLGETPROPERTY，CBLMETHODCALL，およびCBLSETVARIANTサービスルーチンが得るVARIANT値の属性を取得するサービスルーチンです。CBLVARIANTINFは，取得した属性の値によってCBLSETCBLITEMサービスルーチンでの処理を選択するのに使用します。

形式

CALL 'CBLVARIANTINF' USING BY VALUE 引数1
                     BY REFERENCE 引数2 引数3 引数4.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2には，属性を取得するVARIANT値を設定します。

       01 引数2 USAGE ADDRESS.

引数3には，VARIANT値から取得した属性値が設定されます。

       01 引数3 PIC 9(9) USAGE COMP.

4バイトの2進項目で定義します。初期値としては0を設定します。

この領域に返される属性値を次に示します。

0：Empty値を表します。数値としては0，文字列としては長さが0であることを表します。COBOL2002では対応するデータ項目はありません。

1：Null値を表します。有効な数値や文字列を持たないことを示します。値が0やEmpty値とは異なります。COBOL2002では対応するデータ項目はありません。

2：整数型（Integer）を表します。COBOL2002では符号付き2バイト2進項目を表します。

3：長整数型（Long）を表します。COBOL2002では符号付き4バイト2進項目を表します。

4：単精度浮動小数点数型（Single）を表します。COBOL2002では単精度内部浮動小数点項目を表します。

5：倍精度浮動小数点数型（Double）を表します。COBOL2002では倍精度内部浮動小数点項目を表します。

6：通貨型（Currency）を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は，英数字項目を指定します。

7：日付型（Date）を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は，21バイトの英数字項目を指定します。

8：文字列型を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は，英数字項目を指定します。

引数4は，次の集団項目を要求します。

       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

4バイトの2進項目で0を設定します。

戻り値

正常：0

上記以外：エラーコード値

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMVARTYPE PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMGETPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43) VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1).Value'.
       01 PRMVARIANTINF.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLGETPROPERTY'
                 USING BY VALUE ARG1
                       BY REFERENCE PRMOBJ
                                    PRMVARIANT
                                    PRMGETPROPERTY.
           CALL 'CBLVARIANTINF'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMVARTYPE
                                   PRMVARIANTINF.

(h)　CBLSETCBLITEM

CBLGETPROPERTYまたはCBLMETHODCALLサービスルーチンで取得したVARIANTの値を指定したCOBOLのデータ項目に変換し，設定するサービスルーチンです。

形式

CALL 'CBLSETCBLITEM' USING BY VALUE 引数1
                           BY REFERENCE 引数2 引数3.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2は，変換前のVARIANT値を設定します。

       01 引数2 USAGE ADDRESS.

引数3は，次の集団項目を要求します。

       01 引数3.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.

項目の説明

4バイトの2進項目で0を設定します。

COBOLデータ項目に設定するVARIANT値の属性値を設定します。4バイトの2進項目で設定します。

この領域に設定する値を次に示します。

2：整数型（Integer）を表します。3.の領域がポイントする領域は次のような基本項目です。

  01 データ名 PIC S9(4) USAGE COMP.

3：長整数型（Long）を表します。3.の領域がポイントする領域は次のような基本項目です。

  01 データ名 PIC S9(9) USAGE COMP.

4：単精度浮動小数点数型（Single）を表します。3.の領域がポイントする領域は次のような基本項目です。

  01 データ名 COMP-1.

5：倍精度浮動小数点数型（Double）を表します。3.の領域がポイントする領域は次のような基本項目です。

  01 データ名 COMP-2.

6：通貨型（Currency）を表します。3.の領域がポイントする領域は次のような集団項目です（xx：文字列を格納するのに必要なバイト数）。

  01  データ名1.
    02  データ名2 PIC 9(9) USAGE COMP. … 4.
    02  データ名3 PIC X(xx).     … 5.

4.には，5.の領域長を設定します。このサービスルーチンを正常に終了した場合，5.の領域に格納された文字列長が設定されます。5.の領域に文字列が格納できなかった場合は，5.の領域として必要な文字列長が設定され，エラーとなります。

7：日付型（Date）を表します。3.の領域がポイントする領域は"6：通貨型"と同様な集団項目です。

8：文字列型を表します。3.の領域がポイントする領域は"6：通貨型"と同様な集団項目です。

変換後の値を設定するCOBOLデータ項目領域のポインタです。アドレスデータ項目で定義します。この領域がポイントする領域については2.を参照してください。

戻り値

正常：0

上記以外：エラーコード値

変換規則

VARIANT値の属性とCOBOLデータ項目の属性とが異なる場合，変換はされません。

注意事項

変換できないCOBOLのデータ項目を指定した場合，エラーとなります。

事前にCBLVARIANTINFサービスルーチンで設定するVARIANT値を把握してから使用してください。

通貨型，日付型の場合，COBOL2002では文字列として設定します。

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMSETCBLITEM.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 VARTYPE PIC 9(9) USAGE COMP VALUE 8.
        02 CBLITEMPTR USAGE ADDRESS.
       01 CBLITEM.
        02 ITEMLENG PIC 9(9) USAGE COMP VALUE 255.
        02 ITEMSTRING PIC X(255).
           :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = VARIANT値.
           COMPUTE CBLITEMPTR = FUNCTION ADDR(CBLITEM).
           CALL 'CBLSETCBLITEM'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMSETCBLITEM.

(i)　CBLSETVARIANT

CBLPUTPROPERTYまたはCBLMETHODCALLサービスルーチンでCOBOLのデータ項目を設定するため，VARIANT値に変換するサービスルーチンです。

形式

CALL 'CBLSETVARIANT' USING BY VALUE 引数1
                           BY REFERENCE 引数2 引数3.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2には，このサービスルーチンが生成した変換後のVARIANT領域のアドレスを設定します。

この領域はアドレスデータ項目で定義します。また，初期値として0を設定します。

       01 引数2 USAGE ADDRESS.

引数3は，次の集団項目を要求します。

       01 引数3.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.

項目の説明

4バイトの2進項目で0を設定します。

VARIANT値に変換するCOBOLデータ項目の領域の属性値を設定します。4バイトの2進項目で設定します。

この領域に設定する値を次に示します。

0：Empty値を設定します。3.の領域がポイントする領域には0を設定します。

1：Null値を設定します。3.の領域がポイントする領域には0を設定します。

2：符号付き2バイト2進項目を表します。3.の領域がポイントする領域は次のような基本項目です。

       01 データ名 PIC S9(4) USAGE COMP.

3：符号付き4バイト2進項目を表します。3.の領域がポイントする領域は次のような基本項目です。

       01 データ名 PIC S9(9) USAGE COMP.

4：単精度内部浮動小数点を表します。3.の領域がポイントする領域は次のような基本項目です。

       01 データ名 USAGE COMP-1.

5：倍精度内部浮動小数点を表します。3.の領域がポイントする領域は次のような基本項目です。

       01 データ名 USAGE COMP-2.

6：通貨型（Currency）を表します。3.の領域がポイントする領域は次のような集団項目です（xx：文字列を格納するのに必要なバイト数）。

       01 データ名1.
        02 データ名2 PIC 9(9) USAGE COMP. … 4.
        02 データ名3 PIC X(xx).     … 5.

4.には，5.の文字列のバイト数を設定します。

5.は文字列を格納します。

7：日付および時間（Date／Time）を表します。3.の領域がポイントする領域は"6：通貨型"と同様な集団項目です。

       01 データ名 PIC X(21).

8：文字列型（英数字項目）を表します。3.の領域がポイントする領域は"6：通貨型"と同様な集団項目です

変換するCOBOLデータ項目の領域のポインタです。アドレスデータ項目で定義します。この領域がポイントする領域については2.を参照してください。

戻り値

正常：0

上記以外：エラーコード値

注意事項

通貨型，日付型の場合，COBOL2002では文字列として設定します。

例えば，サーバがExcelの場合，日付型の設定では99/2/26 10:30という形式で設定してください。

使用例

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMSETVARIANT.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 CBLTYPE PIC 9(9) USAGE COMP VALUE 8.
        02 CBLITEMPTR USAGE ADDRESS.
       01 CBLITEM.
        02 ITEMLENG PIC 9(9) USAGE COMP VALUE 15.
        02 ITEMSTRING PIC X(15) VALUE 'OLE2 Automation'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE CBLITEMPTR = FUNCTION ADDR(CBLITEM).
           CALL 'CBLSETVARIANT'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMSETVARIANT.

(j)　CBLOLE2UNINIT

OLE2を終了させるサービスルーチンです。このサービスルーチンでは，CBLCREATEOBJやCBLGETOBJが生成したOLEオブジェクトや取得したOLEオブジェクトを終了できません。その場合は，このサービスルーチンを発行する前に，CloseやQuitなどOLE2オートメーションサーバ機能の終了メソッドを呼び出しておいてください。

また，このサービスルーチンを発行したあと，次のサービスルーチンを呼び出してはなりません。

CBLCREATEOBJ

CBLVARIANTINF

CBLGETOBJ

CBLOLE2UNINIT

CBLGETPROPERTY

CBLSETCBLITEM

CBLPUTPROPERTY

CBLSETVARIANT

CBLMETHODCALL

形式

CALL 'CBLOLE2UNINIT' USING BY VALUE 引数1
                           BY REFERENCE 引数2.

引数

引数1には，CBLOLE2INITで設定した引数1を指定します。

引数2は，次の集団項目を要求します。

       01 引数2.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

4バイトの2進項目で0を設定します。

注意事項

COBOLで作成したOLE2サーバに対して，このサービスルーチンを呼び出さないでください。

(3)　エラーコード値

OLE2オートメーションクライアント機能で使用するサービスルーチンが正常終了した場合，RETURN-CODE特殊レジスタに0が戻されます。

サービスルーチンが異常終了した場合は，次のエラーコード値のどれかが戻されます。

表D‒2　エラーコード値

エラーコード値

エラーの内容

10

引数の値がNULLである。

13

ファイル名の拡張子がない。

14

プログラムIDが異なっている。

15

ファイル名，クラス名の指定が共にない。

18

Dispatchポインタが取得できなかった。

19

数値を構成する要素に誤りがある。

20

BSTR文字列を確保できなかった。

21

未サポートのVARIANTタイプが設定されている。

22

文字列を格納する領域が，文字列長よりも長い。

23

不当な日付が指定されている。

24

クラス名の指定がない。

25

サーバオブジェクトポインタが指定されていない。

26

OLEプロパティの指定がない。

27

OLEメソッドの指定がない

28

COBOLデータ項目の指定がない。

29

OLEプロパティに引数が指定されている。

30

引数VARIANTテーブルの指定がない。

31

VARIANT値とCOBOLデータ項目の型が不一致である。

32

設定できないVARIANT値が指定されている。

33

指定されたキーがオープンできない。

34

指定されたキーの値が取得できない。

35

指定されたキーがクローズできない。

その他の番号

OLEのシステムエラーが発生した。10進数のエラーコード値から，OLE関連のマニュアルでエラー状態を調べて対策する。

(4)　注意事項

OLE2オートメーションクライアント機能全般に関する注意事項について説明します。

OLE2オートメーションインタフェース機能とOLE2オートメーションクライアント機能で使用するサービスルーチンを，同じプログラム中で同時に使用してはいけません。

多くのOLEオブジェクト参照データ項目を連続して初期化すると，リソース不足になることがあります。

付録E　コンパイルリスト

付録E.1　リストの出力

コンパイラが出力するリストの種類と出力方法について説明します。

(1)　コンパイルリストの種類

(a)　情報リスト

プログラム情報やエラー総数などのコンパイル時の情報を要約して出力したものです。

(b)　原始プログラムリスト

コンパイル時に入力した原始プログラムを出力したものです。相互参照情報やコンパイル時にエラーが検出されたときのエラーメッセージなども出力されます。

(c)　エラーリスト

コンパイルエラーのエラーレベルやエラーメッセージを出力したものです。

(2)　リストの出力方法

(a)　コンパイラオプションの指定

COBOLプログラムをコンパイルしてコンパイルリストを出力するオプションを次に示します。これらのコンパイラオプションを指定しない場合，コンパイルリストを出力しません。

-SrcList,NoCopy

COPY文で複写した登録集原文の内容を原始プログラムリスト中に展開しません。

-SrcList,CopySup

SUPPRESS指定のあるCOPY文で複写した登録集原文の内容は原始プログラムリスト中に展開しません。SUPPRESS指定のないCOPY文の場合はすべて展開します。

-SrcList,CopyAll

COPY文で複写した登録集原文の内容をすべて原始プログラムリスト中に展開します。

-SrcList,OutputAll

COPY文の指定や条件翻訳，LISTING指令にかかわらず，強制的にすべてのソース原文をコンパイルリストに展開します。SUPPRESS指定のあるCOPY文の場合も展開します。

-SrcList,xxxxx,NoFalsePath

条件翻訳結果の無効行はコンパイルリストに出力しません。

xxxxxには，CopyAll，CopySup，NoCopyのどれかを指定します。

-SrcList,xxxxx,DataLoc

コンパイルリスト（原始プログラムリスト）にデータ項目の相対位置と長さ（バイト）を16進数で表示します。相対位置は，データ部のファイル節／作業場所節／局所場所節の各節の先頭からの位置を表示します。

xxxxxには，OutputAll，CopyAll，CopySup，NoCopyのどれかを指定します。

NoCopy，CopySup，CopyAll，およびOutputAllサブオプションは，同時には指定できません。同時に指定した場合，最後に指定したオプションが有効になります。

NoFalsePathサブオプションは，その他のオプションと同時に指定する必要があります。ただし，OutputAllサブオプションと同時に指定した場合は，すべての行が出力されるため，NoFalsePathサブオプションは意味を持ちません。

DataLocサブオプション指定時にSレベル／Uレベルのコンパイルエラーが発生した場合，DataLocサブオプションの指定があっても相対位置は表示しません。

DataLocサブオプションを指定する場合，OutputAll，CopyAll，CopySup，NoCopyのどれかと同時に指定する必要があります。指定がない場合は，コンパイルエラーとなります。

(b)　コンパイルリストの出力先

情報リストと原始プログラムリストはコンパイルリストファイル（.lst）に出力されます。

また，エラーリストは標準エラー出力（stderr）に出力されます。

(3)　コンパイルリストの出力に関連する翻訳指令

コンパイルリストの出力に関連する翻訳指令について，説明します。

(a)　LISTING指令

LISTING指令は，コンパイルリストにソースを出力するかどうかを指定します。

>>LISTING ON

この行以降のソースをコンパイルリストに出力します。

>>LISTING OFF

この行の次行以降のソースをコンパイルリストに出力しません。

なお，LISTING指令の行そのものは，ON／OFFの状態に関係なく，常にコンパイルリストに出力されます。

LISTING指令の例を次に示します。下線部分は，コンパイルリストに出力されません（出力されない行は詰められます）。

（例1）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       01 A PIC X(10).
       >>LISTING ON
       01 B PIC X(10).
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

上記のプログラムを-SrcList,CopyAllオプションを指定してコンパイルした場合，次のようなコンパイルリストが出力されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       >>LISTING ON
       01 B PIC X(10).
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

コンパイルリストへの出力がOFFの状態でも，LISTING OFFの行は出力されます。LISTING OFFが出力される例を次に示します。

（例2）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       01 A PIC X(10).
       >>LISTING OFF       ←この行は出力される
       01 B PIC X(10).
       >>LISTING ON
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

上記のプログラムを-SrcList,CopyAllオプションを指定してコンパイルした場合，次のようなコンパイルリストが出力されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE2.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       >>LISTING OFF
       >>LISTING ON
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

LISTING指令を含むCOBOLプログラム（登録集原文）をCOPY文で複写した場合，LISTING指令の効果は登録集原文の終わりで終了し，複写元のプログラムのCOPY文が持つLISTING指令の状態に戻ります。COPY文の言語仕様については，マニュアル「COBOL2002　言語　標準仕様編」　「3.2.2　COPY文」を参照してください。

原始プログラム（SAMPLE1.CBL）中のCOPY文で，LISTING指令を含むCOBOLプログラム（登録集原文　SAMPLE2.CBL）を複写した場合の例を次に示します。

（例3）

原始プログラムSAMPLE1.CBL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       COPY SAMPLE2.
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

登録集原文 SAMPLE2.CBL

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       01 A PIC X(10).

登録集原文複写後のプログラム

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       COPY SAMPLE2.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       >>LISTING OFF
       01 A PIC X(10).
       PROCEDURE DIVISION.  ←この行以降は出力される

           DISPLAY 'OK'.

上記のプログラムを-SrcList,CopyAllオプションを指定してコンパイルした場合，次のようなコンパイルリストが出力されます。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       COPY SAMPLE2.
C1     DATA DIVISION.
C1     WORKING-STORAGE SECTION.
C1     >>LISTING OFF
       PROCEDURE DIVISION.

           DISPLAY 'OK'.

(b)　PAGE指令

PAGE指令は，コンパイルリストの改ページを指定します。PAGE指令のコンパイルリストでの効果は，固定形式正書法の改ページ標識「/」と同じです。

PAGE指令の例を次に示します。

（例）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       >>PAGE   ←この行から改ページする
       DATA DIVISION.
       WORKING-STORAGE SECTION.

コンパイルリスト

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.

（この位置で改ページ）

       >>PAGE
       DATA DIVISION.
       WORKING-STORAGE SECTION.

(c)　LISTING指令およびPAGE指令の共通規則

このシステムでは，翻訳処理の最後にLISTING指令およびPAGE指令が処理されます。そのため，条件翻訳の無効行（条件翻訳の結果，コンパイル対象とならなかった行）にLISTING指令またはPAGE指令が現れた場合，これらの指令は無効となります。

LISTING指令およびPAGE指令が条件翻訳の無効行にある場合の例を次に示します。

（例）

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE1.
       ENVIRONMENT DIVISION.
       >>DEFINE ABC 123
       >>IF ABC  = 123
      *>  コメント
       >>ELSE
         >>PAGE          ←この>>PAGEは効果がない
         >>LISTING OFF   ←この>>LISTING OFFは効果がない
       >>END-IF
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       PROCEDURE DIVISION.

付録E.2　リストの見方

リストのヘッダと各リストの見方について説明します。

(1)　リストのヘッダ

リストの先頭に出力されるヘッダの出力形式を次に示します。

図E‒1　ヘッダの出力形式

COBOL2002：COBOL2002であることの記述

（ｃ）：COBOL2002の識別記号

識別記号については「付録M.2　このマニュアルでの表記」を参照

VV-RR：COBOL2002のバージョン番号

CCC・・・CCC：リストの名称（「情報リスト」または，「原始プログラムリスト」）

YYYY-MM-DD：コンパイル日付（年-月-日）

HH:MM:SS：コンパイル時刻（時:分:秒）

(2)　情報リスト

情報リストの出力形式を次に示します。リスト1行当たりのカラム数は80カラムです。

図E‒2　情報リストの出力形式

プログラム名

a.

IDENTIFICATION DIVISIONの行番号

b.

最外側の原始プログラムのPROGRAM-ID段落で指定した名称

c.

PROGRAM-ID段落で指定されたプログラム属性

出力内容は，INITIAL／RECURSIVEのどちらかとなります。

PROGRAM-ID段落でプログラム属性を指定していない場合は出力されません。

スタックコンパイル機能（連続コンパイル機能）を使用している場合，最外側のプログラム定義が複数ある場合があります。この場合，プログラム名は1行に一つずつ出力されます。

クラス名

a.

IDENTIFICATION DIVISIONの行番号

b.

CLASS-ID段落で指定した名称

c.

CLASS-ID段落で指定した属性

出力内容は，FINALだけとなります。

属性が指定されていない場合は，出力されません。

スタックコンパイル機能（連続コンパイル機能）を使用している場合，クラス定義が複数ある場合があります。この場合，クラス名は1行に一つずつ出力されます。

インタフェース名

a.

IDENTIFICATION DIVISIONの行番号

b.

INTERFACE-ID段落で指定した名称

スタックコンパイル機能（連続コンパイル機能）を使用している場合，インタフェース定義が複数ある場合があります。この場合，インタフェース名は1行に一つずつ出力されます。

関数名

a.

IDENTIFICATION DIVISIONの行番号

b.

FUNCTION-ID段落で指定した名称

スタックコンパイル機能（連続コンパイル機能）を使用している場合，関数定義が複数ある場合があります。この場合，関数名は1行に一つずつ出力されます。

入力ファイル名：コンパイラに入力したファイルの名称

エラー総数：発生したエラーの総数

ただし，メッセージ番号9000番台以降を除きます。また，Uレベル（回復不能）エラーの個数を含みます。

エラー総数が0以外の場合，Wレベル，Sレベルが必ず表示されます。

　　Wレベル：警告エラーの個数

　　Sレベル：重大エラーの個数

情報提示レベルのメッセージが発生した場合，Iレベルが表示されます。

　　Iレベル：情報提示レベルのメッセージ

オプション：コンパイル時に有効となったコンパイラオプション

オプションは，1行に一つずつ出力されます。ただし，80カラムを超えた場合は，次の行に出力されます。

入力ソース枚数：入力した原始プログラムのレコード枚数

主入力：主入力のレコード枚数

登録集：登録集のレコード枚数

記述項：データ名の個数

文：手続き部の文の個数

ただし，「文」には，ELSE，END動詞は含みません。また，EXEC SQL 〜 END-EXECは1文として数えます。

登録集原文名

行番号：COPY文が記述されている原始プログラム中の行番号

登録集原文名：COPY文で取り込む登録集原文が格納されているファイルの名称

リポジトリファイル名

行番号：構成節中でクラス名／インタフェース名が指定された行番号

リポジトリファイル名：取り込んだリポジトリファイル名（絶対パス）

サブスキーマ情報

行番号：サブスキーマ名が記述されている原始プログラム中の行番号

サブスキーマ名：サブスキーマ名

スキーマ名：スキーマ名

ファイル情報

行番号：入出力処理で使用するファイルを定義している行番号

ファイル名：ファイル記述項で指定したファイル名

編成：ファイル編成

S：順編成ファイル

SX：XMAP3のプリンタだけを使用する順編成ファイル

Sx：実行時にXMAP3のプリンタ，または順編成ファイルの使用を指定できるファイル

I：索引編成ファイル

R：相対編成ファイル

T：テキスト編成ファイル

SR：整列用ファイル

CV：CSV編成ファイル

RB：HiRDBによる索引編成ファイル

アクセス：ファイルのアクセス法

SEQ：順アクセス

RAN：乱アクセス

DYN：動的アクセス

OPEN種別：ファイルオープンの目的の種別

I：INPUT

O：OUTPUT

I-O：I-O

E：EXTEND

外部プログラム名

CALL文で呼び出す外部プログラムの名称

80カラムを超えた場合は，次の行に出力されます。

コンパイラ内部で生成したCALL文の外部プログラム名は出力されません。

また，スタックコンパイルの場合は，翻訳グループ内で解決済みの外部プログラム名は出力されません。

内部プログラム名

a.

内部プログラム（最外側のプログラム以外のプログラム）のIDENTIFICATION DIVISIONの行番号

b.

内部プログラムのPROGRAM-ID段落で指定したプログラム名

80カラムを超えた場合は，次の行に出力されます。

c.

内部プログラムのPROGRAM-ID段落で指定されたプログラム属性

PROGRAM-ID段落でプログラム属性が指定されていない場合は出力されません。

内部プログラムが複数ある場合，内部プログラム名は1行に一つずつ出力されます。

ここで表示される内容および形式は，1.のプログラム名と同じです。

ファクトリメソッド名

a.

ファクトリメソッドのIDENTIFICATION DIVISIONの行番号

b.

ファクトリメソッドのMETHOD-ID段落で指定したメソッド名

c.

METHOD-ID段落で指定した属性

出力内容は，FINAL／OVERRIDE／GET PROPERTY／SET PROPERTYとなります。ただし，SET PROPERTY／GET PROPERTYは，ほかの属性と同時に指定できません。

また，メソッド名だけの場合は，何も出力されません。

クラスを継承している場合，スーパクラスのファクトリメソッド名は出力されません。また，インタフェースを継承している場合，継承されているインタフェースのメソッド名は出力されません。

インスタンスメソッド名

a.

インスタンスメソッドのIDENTIFICATION DIVISIONの行番号

b.

インスタンスメソッドのMETHOD-ID段落で指定したメソッド名

c.

METHOD-ID段落で指定した属性

出力内容は，FINAL／OVERRIDE／GET PROPERTY／SET PROPERTYとなります。ただし，SET PROPERTY／GET PROPERTYは，ほかの属性と同時に指定できません。

また，メソッド名だけの場合は，何も出力されません。

クラスを継承している場合，スーパクラスのファクトリメソッド名およびインスタンスメソッド名は出力されません。また，インタフェースを継承している場合，継承されているインタフェースのメソッド名は出力されません。

インタフェース定義中のメソッド情報

a.

インタフェース定義中のメソッドのIDENTIFICATION DIVISIONの行番号

b.

インタフェース定義中のMETHOD-ID段落で指定したメソッド名

c.

METHOD-ID段落で指定された属性

出力内容は，GET PROPERTY／SET PROPERTYのどちらかとなります。

また，メソッド名だけの場合は，何も出力されません。

関数名

呼び出している利用者定義関数の名称

注意事項

該当する定義がソース中にない場合，情報リストにその部分は出力されません。

SQL情報（SQL構文内の実行文の数）は出力されません。

ファイル／レコード定義の展開をするCOPY文の場合も，登録集原文の情報は出力されません。

プログラム名などが長くなった場合には，次の行に折り返して出力されます。折り返した場合には，前行の開始位置と同じ位置から開始します。また，行番号は，折り返した行には出力されません。

全角文字が折り返しの境界にわたった場合，その全角文字は，次の行に出力されます。

(3)　原始プログラムリスト

原始プログラムリストの出力形式を次に示します。リスト1行当たりのカラム数は134カラムです。ただし，自由形式正書法のソースの場合，またはコンパイラ環境変数CBLFIXEDFORMLINE=255が有効な場合はソースの1行の長さによって，307カラムまで拡張されます。

図E‒3　原始プログラムリストの出力形式

行番号

COPY文で複写した原始プログラムの行番号が昇順に並ばない場合，この原始プログラムに対してコンパイラが生成した行番号が出力されます。EXEC SQL〜END-EXECの間もコンパイラが生成した行番号が出力されます。また，入力した原始プログラムの行番号が昇順になっていない部分についても，新しい行番号を生成します。これらの行番号は，該当する行の左にゼロサプレス右寄せで出力されます。

D

翻訳指令（Compiler Directive）に関する情報

X

条件翻訳の結果，無効になる行に出力されます。

CP

COPY文で複写した原始プログラムの種別

Cn

COPY文で複写した原始プログラムが展開された行に出力されます。

「n」は1〜9の整数で，COPY文の入れ子レベルを示します。入れ子レベルが10以上のときは「C*」が出力されます。

F

PREFIXING指定またはSUFFIXING指定のCOPY文の行に出力されます。

COPY文によって展開された行は，通常とCOPY文と同じようにCnを出力します。

DB

サブスキーマによって展開された原始プログラムの行に出力されます。

F

ファイル／レコード定義によって展開された原始プログラムの行に出力されます。

N

プログラムと文の入れ子レベル

プログラムの入れ子レベルは，IDENTIFICATION DIVISIONとEND PROGRAMの行に英字A〜Zの順番で出力されます。Zを超えたときは「#」が出力されます。また，プログラムだけでなく，END METHOD，END FACTORY，END CLASS，END OBJECT，END FUNCTIONのように，IDENTIFICATION DIVISIONと対になるものには，すべて出力されます。

文の入れ子レベルは1〜9の整数で出力されます。10以上のときは「*」が出力されます。1行中に複数の文があって入れ子のレベルが異なるときは，先頭の文の入れ子レベルが出力されます。

相互参照

定義／参照している行の参照情報コード

参照情報コードとその意味については，リストの上段で説明しています。

行番号が「，」で区切ってあるときは行中の1データ名が複数行で参照されていることを示し，「；」で区切ってあるときは行中に複数個のデータ名が記述してあることを示します。

次に相互参照情報の見方の例を示します。

(a)1002行（定義側）

YEARSというデータ名は，行番号1500中の2か所と行番号1600および行番号1800で参照されています。参照している行番号を','で区切って表示されます。

(b)1800行（参照側）

YEARSとMTH-PAMは，それぞれ行番号1002と1102で定義されています。これら二つは別名称なので，';'で区切って表示されます。

エラーメッセージ

エラーが発生したとき，その直後にエラーメッセージとエラーのカラムの位置が出力されます。カラムの位置は「？」で表示されます。

COBOL特殊レジスタ

使用したCOBOL特殊レジスタが原始プログラムの次に出力されます。特殊レジスタを使用しているファイル名とプログラム名も出力されます。

既定義オブジェクト

既定義オブジェクトのSELFまたはEXCEPTION-OBJECTの相互参照情報が出力されます。

注意事項

9000番台以降のメッセージは，原始プログラムリスト中に出力されません。

SQL文のエラー情報と相互参照情報は出力されません。

Uレベル（回復不能）エラー発生時は，リストが最後まで出力されない場合があります。

スタックコンパイル機能（連続コンパイル機能）を使用している場合，すべてのプログラムが連続して出力されます。

(4)　相対位置表示時の原始プログラムリスト

(a)　原始プログラムリストの内容

-SrcList,xxxxx,DataLocオプション※1指定時，原始プログラムリストの原文の前に相対位置と長さを表示します。COBOLプログラムの実行で異常終了時に出力されるデータ領域ダンプリスト※2と，原始プログラムリストに表示される相対位置を付き合わせることで，プログラムの異常終了時のデータ項目内容を効率良く参照できます。

注※1

xxxxxは，OutputAll，CopyAll，CopySup，NoCopyのどれかを指定してください。

注※2

データ領域ダンプリストについては，「37.3　データ領域ダンプリスト」を参照してください。

データロケーションを表示した場合，リスト1行当たりのカラム数は161カラムです。ただし，自由形式正書法のソースの場合，またはコンパイラ環境変数CBLFIXEDFORMLINE=255が有効な場合はソースの1行の長さによって，334カラムまで拡張されます。

相対位置表示時の原始プログラムリストの出力形式を次に示します。

図E‒4　相対位置表示時の原始プログラムリストの出力形式

出力される原始プログラムリストの内容を次に示します。なお，次に示す内容以外のものは，「(3)　原始プログラムリスト」を参照してください。

相対位置

この行には，データ項目の相対位置（バイト）を16進数で表示します。相対位置は，データ部のファイル節／作業場所節／局所場所節に定義されたデータ項目に表示します。

長さ

この行には，データ項目の長さ（バイト数）を16進数で表示します。

O

OCCURS句を含むデータ名またはその従属項目を表します。

V

相対位置が可変となるデータ名を表します。

0〜7

内部ブール項目の場合にビット位置を表示します。

注意事項

条件名，定数名，指標名およびアドレス名に対しては，相対位置および長さは表示しません。

コンパイル時にSレベルまたはUレベルのコンパイルエラーが発生した場合，-SrcList,xxxxx,DataLocオプションの指定があっても相対位置は表示しません。

(b)　データ領域ダンプリストの出力対象

相対位置をコンパイルリストに表示するにあたり，翻訳単位ごとのデータ領域ダンプリストの出力対象を次の表に示します。なお，コンパイルリストに表示する相対位置は，データ領域ダンプリストに表示されるデータ項目に対して表示します。

表E‒1　翻訳単位ごとのデータ領域ダンプリスト出力対象

節

翻訳単位

プログラム定義

関数定義

インタフェース定義

クラス定義

メソッド定義

ファクトリ定義

オブジェクト定義

メソッド定義

ファイル節

FILE SECTION

○

○

−

○

○

−

作業場所節

WORKING-STORAGE SECTION

○

○

−

○

○

−

局所場所節

LOCAL-STORAGE SECTION

○

○

−

−

−

○

連絡節

LINKAGE SECTION

×

×

−

−

−

×

サブスキーマ節

SUBSCHEMA SECTION

×

×

−

−

−

−

通信節

COMMUNICATION SECTION

×

×

−

×

×

−

報告書節

REPORT SECTION

×

×

−

×

×

−

画面節

SCREEN SECTION

×

×

−

×

×

−

画面節

WINDOW SECTION

×

×

−

×

×

−

（凡例）

○：データ領域ダンプリストに表示される

×：データ領域ダンプリストに表示されない

−：節を指定できない

(c)　データ種別ごとの相対位置表示の可否

データ種別ごとの各節での相対位置の表示の可否を次の表に示します。

表E‒2　データ種別ごとの各節での相対位置の表示の可否

データ種別

指定された句やデータ名

ファイル節※

作業場所節※

局所場所節

データ記述項

データ名がFILLER

○

○

○

ADDRESSED句のアドレス名

−

×

×

ADDRESSED句を含むデータ名

−

○

○

INDEXED句の指標名

×

×

×

EXTERNAL句

○

○

−

GLOBAL句

○

○

○

JUSTIFIED句

○

○

○

OCCURS句

○

○

○

OCCURS句を含むデータ名の従属項目

○

○

○

可変反復データ項目に続くデータ項目

○

○

○

PROPERTY句

○

○

○

REDEFINES句

○

○

○

RENAMES句

○

○

○

SAME AS句を含むデータ名

○

○

○

SAME AS句を含むデータ名の従属項目

△

△

△

SYNCHRONIZED句

○

○

○

TYPE句を含むデータ名

○

○

○

TYPE句を含むデータ名の従属項目

△

△

△

TYPEDEF句

○

○

○

アドレスデータ項目

USAGE ADDRESS

○

○

○

指標データ項目

USAGE INDEX

○

○

○

オブジェクト参照データ項目

USAGE OBJECT REFERENCE

−

○

○

OLEオブジェクト参照データ項目

USAGE OBJECT REFERENCE OLE

−

○

−

バリアントデータ項目

USAGE VARIANT

−

○

−

ポインタ項目

USAGE POINTER

○

○

○

外部ブール項目

USAGE DISPLAY

○

○

○

内部ブール項目

USAGE BIT

○

○

○

2進項目など

その他のUSAGE句

○

○

○

独立データ項目

77レベルのデータ名

−

○

○

定数名

78レベルのデータ名

×

×

×

条件名

88レベルのデータ名

×

×

×

（凡例）

○：相対位置を表示できる

△：従属項目はコンパイルリストに表示されないため，従属項目の相対位置を参照したい場合は，「(d)　データ項目ごとの相対位置の見方」の「TYPE句／SAME AS句を含むデータ名の従属項目」を参照のこと

×：相対位置を表示できない

−：節に指定できない

注※

クラス定義の場合は，データ部先頭からの相対位置となります。

(d)　データ項目ごとの相対位置の見方

OCCURS句を含むデータ名の従属項目

OCCURS句を含むデータ名の従属項目については，基本データ項目と同様に節の先頭からの相対位置を16進数で表示します。また，OCCURS句を含むデータ名およびその従属項目であることを示す「O」を相対位置の左側に表示します。

OCCURS句を含むデータ名が集団項目の場合の相対位置の表示を次に示します。

なお，要素の相対位置については，次の計算式で求めてください。

計算式

表中のデータ名の相対位置=参照するデータ名の相対位置の値※＋（参照する表要素のその次元での出現番号−1）×表の1要素の長さ

注※

　　相対位置に「O」の表示があるデータ名

図E‒5　OCCURS句を含むデータ名の従属項目の相対位置の表示

O

OCCURS句を含むデータ名またはその従属項目を表します。

例：「データ名：DATA312」の3番目の要素の場合

表中のデータ名の相対位置=（0x0000001d）＋（3−1）×（0x0000000f）

=（0x0000003b）

=59バイト

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x0000003b）（59バイト）目の内容を5バイト参照することで，「データ名：DATA312」の3番目の内容を確認できます。

OCCURS句を含むデータ名が基本項目の場合の相対位置の表示を次に示します。

図E‒6　OCCURS句を含むデータ名が基本項目の場合の相対位置の表示

例：「データ名：DATA31」の3番目の要素の場合

表中のデータ名の相対位置=（0x00000018）＋（3−1）×（0x00000005）

=（0x00000022）

=34バイト

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x00000022）（34バイト）目の内容を5バイト参照することで，「データ名：DATA31」の3番目の要素の内容を確認できます。

可変反復データ項目に続くデータ項目

可変反復データ項目に続くデータ項目は，繰り返し回数によって長さが可変となります。そのため，可変反復データ項目に続くデータ項目の相対位置も可変となります。この可変反復データ項目に続くデータ項目の相対位置は，定義された節の先頭からの相対位置ではなく，最初に現れたデータ項目を0とした相対位置を16進数で表示します。また，相対位置が可変となるデータ名であることを示す「V」を，相対位置の左側に表示します。

相対位置が可変となるデータ名が基本項目の場合の相対位置の表示を次に示します。

図E‒7　相対位置が可変となるデータ名が基本項目の場合の相対位置の表示

V

相対位置が可変となるデータ名には「V」を表示します。

制御変数

DEP1に5を設定しているので，繰り返し回数は5回で計算します。

要素の相対位置については，次の計算式で求めてください。

計算式

相対位置が可変となるデータ名※1の相対位置=DEPENDING ON指定があるOCCURS句を含むデータ名※2の相対位置の値＋プログラムが異常終了した時点の表の繰り返し回数の値※3×表の1要素の長さ※4＋参照するデータ名の相対位置の値

注※1

　　相対位置に「V」の表示があるデータ名

注※2

　　相対位置に「O」の表示があるデータ名

注※3

　　OCCURS〜DEPENDING ONに指定されたデータ名に設定した値

注※4

　　相対位置に「O」の表示があるデータ名の長さ

例：「データ名：DATA33」の場合

可変反復データ項目に続くデータ名の相対位置=（0x00000010）＋5×（0x0000000f）＋（0x0000000a）

=（0x00000065）

=101バイト

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x00000065）（101バイト）目の内容を10バイト参照することで，「データ名：DATA33」の内容を確認できます。

相対位置が可変となるデータ名がOCCURS句を含んでいる場合の相対位置の表示を次に示します。

図E‒8　相対位置が可変となるデータ名がOCCURS句を含んでいる場合の相対位置の表示

O，V

相対位置が可変となるデータ名がOCCURS句を含んでいる場合は，「O」と「V」を表示します。

制御変数

DEP1に5を設定しているので，繰り返し回数は5回で計算します。

要素の相対位置については，次の計算式で求めてください。

計算式

相対位置が可変となるデータ名※1の相対位置=DEPENDING ON指定があるOCCURS句を含むデータ名※2の相対位置の値＋プログラムが異常終了した時点の表の繰り返し回数の値※3×表の1要素の長さ※4＋参照するデータ名の相対位置の値＋（参照する表要素のその次元での出現番号−1）×表の1要素の長さ※5

注※1

　　相対位置に「O」と「V」の表示があるデータ名

注※2

　　相対位置に「O」の表示があるDEPENDING ON指定があるOCCURS句を含むデータ名

注※3

　　OCCURS〜DEPENDING ONに指定されたデータ名に設定した値

注※4

　　相対位置に「O」の表示があるDEPENDING ON指定があるOCCURS句を含むデータ名の長さ

注※5

　　相対位置に「O」と「V」の表示があるOCCURS句を含むデータ名の長さ

例：「データ名：DATA332」の場合

相対位置が可変となるデータ名の相対位置=（0x00000010）＋5×（0x0000000f）＋（0x0000000f）＋（3−1）×（0x0000000a）

=（0x0000007e）

=126バイト

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x0000007e）（126バイト）目の内容を5バイト参照することで，「データ名：DATA332」の内容を確認できます。

内部ブール項目

内部ブール項目については，相対位置としてビット位置も表示します。そのため，（）内に16進数でバイト位置を，［］内にビット位置を10進数でそれぞれ表示します。また，長さはビット数を16進数で表示します。

内部ブール項目の相対位置の表示を次に示します。

図E‒9　内部ブール項目の相対位置の表示

0〜7

［］内にビット位置を10進数で表示します。

長さ

ビット数を16進数で表示します。

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x00000010）（16バイト）目の内容を1バイト参照することで，「データ名：DATA3」または「データ名：DATA31」のビット値を確認できます。

EXTERNAL句を含むレコード記述項

EXTERNAL句を含むレコード記述項は，レコードの先頭の相対位置を0として表示します。

EXTERNAL句を含むレコード記述項の相対位置の表示を次に示します。

図E‒10　EXTERNAL句を含むレコード記述項の相対位置の表示

相対位置

レコード先頭の相対位置を0として表示します。

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

EXTERNAL句を含むレコード記述項は，レコードの先頭から内容を参照できます。

クラス定義のファイル節／作業場所節

クラス定義のファクトリ／オブジェクト定義中のファイル節／作業場所節の各データ項目の相対位置は，各節の先頭からの値ではなく，データ部先頭からの値になります。

クラス定義のファイル節／作業場所節の相対位置の表示を次に示します。

図E‒11　クラス定義のファイル節／作業場所節の相対位置の表示

相対位置

データ部先頭からの値になります。

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

クラス定義の場合は，コンパイルリストでデータ部の先頭からの相対位置を表示しているため，データ領域ダンプリストも領域の先頭からの相対位置で参照できます。

TYPE句／SAME AS句を含むデータ名の従属項目

TYPE句またはSAME AS句を含むデータ名の従属項目は，コンパイルリストに表示されません。そのため，従属項目の相対位置を参照したい場合は，ユーザ自身でTYPE句またはSAME AS句を含むデータ名の従属項目の相対位置を求めてください。

TYPE句／SAME AS句の定義がある原始プログラムリストを次に示します。

図E‒12　TYPE句／SAME AS句の定義がある原始プログラムリスト

従属項目

TYPEDEF句を含むデータ名の従属項目を示します。

TYPE句を含むデータ名の従属項目

暗黙的にTYPEDEF句を含むデータ名の従属項目が展開されます。ただし，SAME AS句もTYPE句と同様にコンパイルリストには表示されません。

TYPE句を含む「データ名：BDAT2」の従属項目は，TYPEDEF句を含むデータ名の従属項目である三つのデータ名（"ADAT1"/"ADAT2"/"ADAT3"）になります。TYPEDEF句で定義したときの相対位置は，TYPEDEF句を含むデータ名の相対位置を0として表示します。そのため，TYPE句を含むデータ名の従属項目となるデータ名の相対位置は，次の計算式で求めてください。

計算式

参照するTYPE句を含むデータ名の従属項目であるデータ名の相対位置=TYPE句を含むデータ名の相対位置＋参照するTYPEDEF句を含むデータ名の従属項目の相対位置

例：「データ名：ADAT3」の場合

「データ名：ADAT3」の相対位置=（0x0000005）＋（0x0000000a）

=（0x0000000f）

=15バイト

上記の図に対応したデータ領域ダンプリストの内容を次に示します。

データ領域ダンプリストの<WORKING-STORAGE SECTION>の先頭から（0x0000000f）（15バイト）目の内容を5バイト参照することで，「データ名：ADAT3」の内容を確認できます。

(5)　エラーリスト

エラーリストの出力形式を次に示します。リスト1行当たりのカラム数は80カラムです。

図E‒13　エラーリストの出力形式

エラーがある原始プログラムのファイル名

COPY文で入力したプログラムにエラーがあるときは，そのファイル名が出力されます。

エラーがある原始プログラム内の行番号（原始プログラムの先頭行からの相対行数）

メッセージ番号

エラーレベルの種類

I：情報提示レベルのメッセージ

W：警告エラー

S：重大エラー

U：回復不能エラー

エラーメッセージの本文

付録F　COBOLで使用するファイル

付録F.1　COBOL2002で使用するファイル

COBOL2002で使用するファイルの一覧を，次に示します。

表F‒1　COBOL2002で使用するファイル

拡張子

ファイル種別

内容

出力元

入力先

.bkf

バックアップファイル

プロジェクトマスタファイルのバックアップ情報を格納するファイル。

マネージャ

マネージャ

.cbc

COPY関連づけファイル

COPYプログラム変更時に再コンパイルするかどうかを認識するための情報を格納するファイル。

コンパイラ

マネージャ

.cbe

2項関係情報ファイル

データの受け渡しに関係する2項関係情報を格納するファイル。

コンパイラ

COBOL2002 Professional Tool Kit（データ影響波及分析）

.cbd

EXPORTS名称ファイル

モジュール定義ファイルを作成するための情報を格納するファイル。

コンパイラ

コンパイラ

マネージャ

.cblほか※1

COBOLソースファイル

COBOL原始プログラムを格納するファイル。

−

コンパイラ

.cbl※4

XMLアクセス用データ定義

XMLドキュメントへのアクセスに必要なCOBOLのデータ定義を格納するファイル。

XMLアクセス用COBOLソース生成コマンド

コンパイラ

.cbl※4

XMLアクセス用ステータス定義

XMLアクセスルーチンのステータス名称を定義する登録集原文。

−

コンパイラ

.cbl※4

XMLアクセスルーチン

XMLドキュメントにアクセスするCOBOL副プログラムを格納するファイル。

XMLアクセス用COBOLソース生成コマンド

コンパイラ

.cbl※2※3

COBOL UAP引数定義ファイル

Cosminexus連携機能から呼び出したいCOBOL UAP引数を定義したファイル。

−

Cosminexus連携機能

.cbo

オブジェクト関連づけファイル

リンク時に必要なオブジェクトの情報を取得するためのファイル。

コンパイラ

マネージャ

.cbp

プログラム情報ファイル

テストデバッグ情報やカバレージ情報を格納するファイル。-TDInfまたは-CVInfオプションを指定してコンパイルしたときに出力される。

コンパイラ

コンパイラ，テストデバッガ

.cbr

実行環境ファイル

設定した実行環境を記憶しておくファイル。

実行支援

実行支援，ライブラリ

.cbs

擬似プログラム用プログラム情報ファイル

-SimMain，-SimSub，-SimIdentのどれかのオプションを指定してコンパイルしたときに出力されるプログラム情報ファイル。

コンパイラ

テストデバッガ

.cbw※5

stdcall呼び出し指示ファイル

DLLファイル中のstdcall呼び出し規約のプログラムを呼び出すとき，呼び出すプログラムの名称を登録するためのファイル。

−

コンパイラ

.cet

プログラムテンプレートファイル

プログラムテンプレートを格納するファイル。

−

エディタ

.cex

COBOLエディタ設定ファイル

COBOLエディタのカスタマイズ情報を保存するファイル。

エディタ

エディタ

.class※3

Cosminexus上Java実行ファイル

Cosminexus連携機能を呼び出すJava実行ファイル。

−

Cosminexus連携機能

.cll

カバレージ情報リストファイル

カバレージ情報をリスト形式にして格納するファイル。

カバレージ

−

.cnl

カウント情報リストファイル

カウント情報をリスト形式にして格納するファイル。

カバレージ

−

.cno

実行結果出力ファイル（カウント情報の表示）

プログラムからの連動実行によるカウント情報を表示するとき，実行結果とトラブルシュート情報を出力するファイル。

カバレージ

−

.cvo

実行結果出力ファイル（カバレージ情報の蓄積）

プログラムからの連動実行によるカバレージ情報を蓄積するとき，実行結果とトラブルシュート情報を出力するファイル。

カバレージ

−

.cxc※4

カタログファイル

公開識別子とファイルの対応づけを定義するファイル。

−

XMLアクセス用COBOLソース生成コマンド

XMLアクセス用実行時ライブラリ

.cxd※4

XMLデータ定義ファイル

XMLドキュメントの要素とCOBOLのデータ構造とのマッピングを記述したファイル。

−

XMLアクセス用COBOLソース生成コマンド

.def

モジュール定義ファイル

名前，属性，システムの条件など，実行可能ファイルやDLLの特性を記述したファイル。

コンパイラ

リンカ

.dll※7

DLLファイル

DLL（ダイナミックリンクライブラリ）を格納するファイル。

リンカ

COBOL2002情報抽出ツール

.drf

または

.drl※8

データレコードファイル

索引順編成ファイルで，実際にレコードを格納しているファイル。

ISAM

ISAM

.dtd※4または.xml※4

XML文書型定義ファイル

XMLドキュメントのマークづけ要素とその構造を定義したファイル。

−

XMLアクセス用COBOLソース生成コマンド

.exe※7

実行可能ファイル

コンパイル，リンクをして実行可能になったプログラムを格納するファイル。

リンカ

COBOL2002情報抽出ツール

.exp

EXPORTファイル

リンカが生成するエクスポートライブラリの出力ファイル。

リンカ

−

.flf

ファイル定義ファイル

ファイル定義の情報を格納するファイル。

F/R定義

F/R定義

.hmf

プロジェクトマスタファイル

プロジェクトマスタに関する情報を格納するファイル。

マネージャ

マネージャ

.hmp

プロジェクト情報ファイル

プロジェクトマスタから出力したプロジェクトの情報を格納するファイル。

マネージャ

マネージャ

.html

または

.csv

ソース解析情報ファイル

COBOLソースを解析した結果を出力するファイル。

マネージャ

マネージャ

.java※3

COBOLアクセス用Bean（Javaソースファイル）

Cosminexus連携機能が出力するCOBOLアクセス用Beanを格納するファイル。

Cosminexus連携機能

−

.java※3

EJB関連Javaソースファイル

Cosminexus連携機能が出力するEJB用ホームインタフェース，リモートインタフェース，Enterprise Beanを格納するファイル。

Cosminexus連携機能

−

.k01

または

.l01※8

主キーファイル

索引順編成ファイルで，主レコードキーでレコードを検索するためのファイル。

ISAM

ISAM

.k02〜.k99

または

.l02〜.l99※8

副キーファイル

索引順編成ファイルで，副レコードキーでレコードを検索するためのファイル。

ISAM

ISAM

.kdf

または

.kdl※8

キー定義ファイル

索引順編成ファイルで，データファイルとキーファイルとの対応を表すデータを格納するファイル。

ISAM，

F/R定義

ISAM

.lib

ライブラリファイル

ライブラリを格納するファイル。ライブラリには，オブジェクトプログラムのライブラリである標準ライブラリと，DLLの関数情報を保持するインポートライブラリがある。

リンカ，

LIBコマンド

COBOL2002情報抽出ツール

.lst

コンパイルリストファイル

コンパイルリストを格納するファイル。-SrcListオプションを指定してコンパイルしたときに出力される。

コンパイラ

−

.obj

オブジェクトファイル

コンパイルの結果であるオブジェクトプログラムを格納するファイル。

コンパイラ

リンカ，COBOL2002情報抽出ツール

.pkg

パッケージ情報ファイル

起動条件など，ツールの情報を格納するファイル。

マネージャ

マネージャ

.prt

印刷書式情報ファイル

印刷書式情報を格納するファイル。

実行支援

実行支援，ライブラリ

.rc

リソース定義ファイル

COBOLプログラムで使用するリソースの情報を記述したファイル。

コンパイラ

リンカ

.rdf

レコード定義ファイル

レコード定義の情報を格納するファイル。

F/R定義

F/R定義

.rep※6

リポジトリファイル

プログラム定義，関数定義，クラス定数，およびインタフェース定義の中で規定された情報を格納するファイル。

コンパイラ

コンパイラ

.res

リソースファイル

リソース定義ファイルをリソースコンパイラでコンパイルした結果生成されるオブジェクトファイル。

リンカ

リンカ

.sai

ソース解析情報ファイル

COBOLソースを解析した情報を出力するファイル。

コンパイラ

COBOL2002 Professional Tool Kit（COBOLソース解析）

.svw

COBOLサービスルーチンファイル

COBOLエディタでキーワードとして有効にするサービスルーチンを登録するファイル。

エディタ

エディタ

.tag

タグファイル

タグジャンプ情報を格納するファイル。

エディタ

エディタ

.tdi

TDコマンド格納ファイル（中断点情報）

中断点情報のTDコマンドを格納するファイル。-TestCmd,Fullまたは-TestCmd,Breakオプションを指定してコンパイルしたときに出力される。

コンパイラ

テストデバッガ

.tds

TDコマンド格納ファイル（シミュレーション情報）

使用するシミュレーション情報のTDコマンドを格納するファイル。-TestCmd,Simオプションを指定してコンパイルしたときに出力される。

コンパイラ

テストデバッガ

.usw

ユーザキーワードファイル

COBOLエディタで，予約語，サービスルーチン名以外でキーワードとする語句を登録するファイル。

エディタ

エディタ

.wdf

画面定義ファイル

画面定義の情報を格納するファイル。

画面定義

画面定義

.xml※3

デプロイ情報（DDファイル）

Cosminexus連携機能が出力するEJB用デプロイ情報を格納するファイル。

Cosminexus連携機能

−

（凡例）

−：該当しない

注

出力元，入力先欄の略称の意味は次のとおりです。

マネージャ：開発マネージャ

エディタ：COBOLエディタ

ライブラリ：実行時ライブラリ

ISAM：ISAMユティリティ

F/R定義：ファイル／レコード定義

LIBコマンド：ライブラリ管理ツールLIB

注※1

目的に応じて次の拡張子を使用します。

固定形式正書法で書かれた原始プログラムをコンパイルする場合

.cbl，.cob，.ocb，または環境変数CBLFIXで指定した拡張子

自由形式正書法で書かれた原始プログラムをコンパイルする場合

.cbf，.ocf，または環境変数CBLFREEで指定した拡張子

注※2

目的に応じて次の拡張子を使用します。

固定形式正書法で書かれたCOBOL引数定義ファイルの場合

.cbf，または環境変数CBLFIXで指定した拡張子を除く，すべての拡張子

自由形式正書法で書かれたCOBOL引数定義ファイルの場合

.cbf，または環境変数CBLFREEで指定した拡張子

注※3

Cosminexus連携機能で使用します。Cosminexus連携機能の詳細は，マニュアル「COBOL2002　Cosminexus連携機能ガイド」を参照してください。

注※4

XML連携機能で使用します。XML連携機能の詳細は，マニュアル「COBOL2002　XML連携機能ガイド」を参照してください。

注※5

Windows(x86) COBOL2002で有効です。

注※6

Windows(x86) COBOL2002で作成したファイルは，Windows(x64) COBOL2002では使用できません。Windows(x64) COBOL2002で再コンパイルしてから使用してください。

注※7

Windows(x86) COBOL2002で作成した実行可能ファイルまたはDLLファイルは，Windows(x64) COBOL2002では使用できません。しかし，Windows(x64) COBOL2002で作成した実行可能ファイルまたはDLLファイルからCALL文またはCBLEXECサービスルーチンを使用して，Windows(x86) COBOL2002で作成した実行可能ファイルを呼び出せます。ただし，あらかじめWindows(x86) COBOL2002をインストールしてください。

注※8

Windows(x64) COBOL2002では使用できません。

また，.kdlはファイル／レコード定義では出力されません。

付録F.2　COBOLプログラムの実行時に必要なファイル

COBOLプログラムの実行時に必要なファイルの一覧を，次に示します。

表F‒2　COBOLプログラムの実行時に使用するファイル

拡張子

ファイル種別

ファイルが必要な条件

.cbr

実行環境ファイル

実行支援で実行環境を設定した場合

.dll※1

DLLファイル

COBOLプログラムを実行可能ファイルとして作成した場合

.exe※1

実行可能ファイル

COBOLプログラムをDLLとして作成した場合

.drf（.drl※2）

データレコードファイル

ISAMによる索引編成ファイルを使用する場合

（　）内はラージファイル入出力機能を使用する場合

.kdf（.kdl※2）

キー定義ファイル

.k01（.l01※2）

主キーファイル

.k02〜.k99

（.l02〜.l99※2）

副キーファイル

.prt

印刷書式情報ファイル

GDI印刷を使用する場合

注※1

Windows(x86) COBOL2002で作成した実行可能ファイルまたはDLLファイルは，Windows(x64) COBOL2002では使用できません。しかし，Windows(x64) COBOL2002で作成した実行可能ファイルまたはDLLファイルからCALL文またはCBLEXECサービスルーチンを使用して，Windows(x86) COBOL2002で作成した実行可能ファイルを呼び出せます。ただし，あらかじめ，Windows(x86) COBOL2002をインストールしてください。

注※2

Windows(x86) COBOL2002で有効です。

付録G　コンパイラの制限値

コンパイラの制限値，限界値を次に示します。

表G‒1　コンパイラの制限値，限界値

区分

項目

制限値，限界値

全般規定

語の長さ

31文字

英数字定数，日本語文字定数の長さ

1〜160文字※16

固定小数点数字定数のけた数

1〜18けた※11

浮動小数点数字定数のけた数

仮数部1〜16けた

指数部2けた

単精度浮動小数点数字定数の値の範囲（絶対値）

約10-37.9以上約1038.5以下，または0

倍精度浮動小数点数字定数の値の範囲（絶対値）

約10⁻³⁰⁸以上約10³⁰⁸以下，または0

連結式で連結できる定数の長さ

2〜1,024文字

基本機能

作業場所節のデータ項目の長さ

16,777,215バイト（クラス定義）

1,073,741,823バイト（上記以外）

局所場所節のデータ項目の長さ

1,073,741,823バイト

ファイル節のデータ項目の長さ

16,777,191バイト※1（クラス定義のファイル節FD記述項）

1,073,741,799バイト※1（上記以外のファイル節FD記述項）

65,535バイト（ファイル節SD記述項）

連絡節のデータ項目の長さ

16,777,215バイト（BY VALUE,RETURNING項目）

1,073,741,823バイト（上記以外）

上記以外の節のデータ項目の長さ

16,777,215バイト

1レコードに含まれる可変長項目の制御変数

100個

PICTURE文字列の長さ

30文字※15

作業場所節の英字項目のけた数

16,777,215けた（クラス定義）

1,073,741,823けた（上記以外）

局所場所節の英字項目のけた数

1,073,741,823けた

ファイル節の英字項目のけた数

16,777,191バイト※1（クラス定義のファイル節FD記述項）

1,073,741,799バイト※1（上記以外のファイル節FD記述項）

65,535バイト（ファイル節SD記述項）

連絡節の英字項目のけた数

16,777,215けた（BY VALUE,RETURNING項目）

1,073,741,823けた（上記以外）

上記以外の英字項目のけた数

16,777,215けた

外部10進，内部10進項目のけた数

18けた※12

2進項目のけた数

18けた

外部浮動小数点数字項目のけた数

仮数部1〜16けた

指数部2けた

作業場所節の英数字，英数字編集項目のけた数

16,777,215けた（クラス定義）

1,073,741,823けた（上記以外）

局所場所節の英数字，英数字編集項目のけた数

1,073,741,823けた

ファイル節の英数字，英数字編集項目のけた数

16,777,191バイト※1（クラス定義のファイル節FD記述項）

1,073,741,799バイト※1（上記以外のファイル節FD記述項）

65,535バイト（ファイル節SD記述項）

連絡節の英数字，英数字編集項目のけた数

16,777,215けた（BY VALUE,RETURNING項目）

1,073,741,823けた（上記以外）

上記以外の英数字，英数字編集項目のけた数

16,777,215けた

数字編集項目のけた数

249けた

（数字は18けた以内※14）

ブール項目のけた数

2,034けた

日本語項目のけた数

16,383けた

動的長基本項目のLIMITに指定できる値

英数字項目の場合

16,777,214けた

日本語項目の場合

16,382けた

外部浮動小数点数字項目の値の範囲（絶対値）

約10-37.9以上約1038.5以下，または0

条件文の入れ子

1,000重

うちPERFORM文の入れ子

100重

PERFORM文のVARYING指定で変化させられる一意名の数

7個（AFTER指定の数は6個以内）

EVALUATE文の入れ子

50重

GO TO DEPENDING文の一意名のけた数

9けた

STOP文の定数の長さ

160文字※16

ACCEPT文で一度に転送できるデータのサイズ

114バイト（FROM CONSOLE指定時）

COPY文の入れ子

20重

原文名の長さ

31文字※2

仮原文の原文語

1〜322文字

演算結果を保証する算術式の中間結果のけた数

30けた※13

算術式に含まれる算術演算子

100個

作業場所節※3の節の合計サイズ

16,777,215バイト（クラス定義）

1,073,741,823バイト（上記以外）

局所場所節の節の合計サイズ

1,073,741,823バイト

ファイル節※3※4の節の合計サイズ

16,777,215バイト（クラス定義）

1,073,741,823バイト（上記以外）

その他の節（連絡節を除く）の合計サイズ

16,777,215バイト

算術式中に含まれる算術演算子

100個

表操作機能

作業場所節のOCCURS句の整数2の値，添字の値，部分参照の値

16,777,215（クラス定義）

1,073,741,823（上記以外）

局所場所節のOCCURS句の整数2の値，添字の値，部分参照の値

1,073,741,823

ファイル節のOCCURS句の整数2の値，添字の値，部分参照の値

16,777,191（クラス定義のファイル節FD記述項）

1,073,741,799（上記以外のファイル節FD記述項）

65,535（ファイル節SD記述項）

連絡節のOCCURS句の整数2の値，添字の値，部分参照の値

16,777,215（BY VALUE,RETURNING項目）※5

1,073,741,823（上記以外）

上記外の節のOCCURS句の整数2の値，添字の値，部分参照の値

16,777,215

OCCURS句に指定できる指標名の数

12個

OCCURS句に定義した指標名に設定できる最大値

10けた（クラス定義以外の作業場所節，クラス定義以外のファイル節FD記述項，局所場所節，BY VALUE／RETURNING項目以外の連絡節）

9けた（BY VALUE／RETURNING項目の連絡節および上記以外の節）

OCCURS句の次元数

7次元

OCCURS KEYの個数

12個

SEARCH文の入れ子

15重

入出力機能

RECORD CONTAINS CHARACTERS句で指定できる値

16,777,191※1

（クラス定義のファイル節FD記述項）

1,073,741,799※1

（上記以外のファイル節FD記述項）

65,535

（ファイル節SD記述項）

BLOCK CONTAINS句で指定できる値

16,777,191※1

（クラス定義のファイル節FD記述項）

1,073,741,799※1

（上記以外のファイル節FD記述項）

WRITE ADVANCINGで指定できる整数

0〜99

RECORD KEY句で指定できるキーの最大長

255バイト

ALTERNATE RECORD KEY句で指定できるキーの最大長

255バイト

ALTERNATE RECORD KEY句で指定できるキーの個数

98個

LINAGE句で指定できる整数

1〜32,767

LINAGE FOOTINGで指定できる整数

0〜32,767

LINAGE TOPで指定できる整数

0〜32,767

LINAGE BOTTOMで指定できる整数

0〜32,767

RECORD IS VARYING句のFROMに指定できる整数

1〜16,777,191※1

（クラス定義のファイル節FD記述項）

1〜1,073,741,799※1

（上記以外のファイル節FD記述項）

1〜65,535

（ファイル節SD記述項）

RECORD IS VARYING句のTOに指定できる整数

1〜16,777,191※1

（クラス定義のファイル節FD記述項）

1〜1,073,741,799※1

（上記以外のファイル節FD記述項）

1〜65,535

（ファイル節SD記述項）

ファイルのブロック長に指定できる値

1〜16,777,191※1

（クラス定義）

1〜1,073,741,799

（上記以外）

CSV編成ファイルのREAD／WRITE文で扱える基本項目の最大数

Windows(x86) COBOL2002の場合

2,729個（-NumCsvオプション指定ありの場合）

5,459個（-NumCsvオプション指定なしの場合）

Windows(x64) COBOL2002の場合

2,047個（-NumCsvオプション指定ありの場合）

4,094個（-NumCsvオプション指定なしの場合）

ASSIGN句のデータ名1に指定できるデータ項目の最大長

32,767バイト

プログラム間連絡機能

プログラム名，利用者定義関数名，クラス名，インタフェース名，メソッド名の長さ

31文字（定数指定でない場合）

プログラム名，メソッド名を定数指定する場合の長さ

160バイト※17

-Main,V3オプションで引数を受け取るときに指定できる最大長

100バイト

FD EXTERNAL句の数（プログラム単位，実行時単位）

255個

01 EXTERNAL句の数（外部属性）

実行単位内で32,767個

プログラム単位で32,767個※6

入れ子のプログラムの個数

65,535個

入れ子のプログラムのネストの深さ

255レベル

ENTRY文の個数

32,767個

stdcall呼び出し規約にするプログラムの個数（CALL 一意名がある場合）

1,700個※7

CALL文，INVOKE文のBY VALUE，BY CONTENT，RETURNINGに指定されたデータ項目のサイズ

16,777,215バイト

利用者定義関数の引数として指定されたデータ項目のサイズ（ただし，対応する仮引数にBY VALUEが指定または仮定される場合，および返却値だけ）

16,777,215バイト

整列併合機能

SORT文，MERGE文の入力ファイル数

12個

整列併合用キーの指定個数

64個

整列併合用キーのサイズの合計

4,080バイト

整列併合用レコードのサイズ

65,535バイト

データベースアクセス機能

SQL文の長さ

65,528バイト※9

SQL文で参照する埋め込み変数の長さ

COBOL2002のデータ項目と同じ

SQL文で記述する語，定数の長さ

COBOL2002の語，定数と同じ

オブジェクト指向機能

クラス定義中に記述可能なメソッドの数

65,530※8

報告書作成機能

PAGE LIMIT句に指定できる値

999

（-CompatiV3指定時は，9,999）

LINE NUMBER句に指定できる値

999（-CompatiV3指定時は，9,999）

COLUMN句に指定できる値

RECORD句がない時：133−印刷項目のサイズ+ 1

RECORD句がある時：RECORD句に指定した最大レコード長−印刷項目のサイズ+ 1

注：CODE句を指定したときは，指定した文字定数のサイズ分だけ印刷項目の配置位置が右端にずれるので，その分COLUMN句に指定できる制限値も少なくなります

その他

コンパイル可能なソース行数

999,999行

手続き名の個数

1,048,575個

ファイルの数

255個

自由形式正書法での1行のバイト数

255バイト

COPY文PREFIXING指定およびSUFFIXING指定に指定できる語の長さ

30文字

一つの実行単位が使用できるスタックサイズの上限

システムのスタックサイズの設定値に依存

COBOL2002で扱えるファイル名の長さの上限

パス名を含めて255バイト※10

注

ソース行数以外の制限値は独立していないため，すべての制限値が同時に適用されるとは限りません。

注※1

索引ファイルは，割り当てるファイルによって次のようになります。

ISAMを使用する場合：65,503バイト

Btrieve（Pervasive.SQL）による索引編成ファイルを使用する場合：ページサイズに依存する。

詳細は，「6.10.4　使用できる機能と制限事項」の「(2)　物理的制限事項」を参照してください。

HiRDBによる索引編成ファイルを使用する場合：1,073,741,799バイト

ただし，CREATE TABLE定義の指定に依存する。

詳細は，「6.9　HiRDBによる索引編成ファイル」を参照してください。

注※2

-V3Recまたは-CompatiV3オプション（VOS3 COBOL85互換のオプション）を指定した場合，先頭の8文字だけが有効となります。

注※3

-MultiThreadオプション指定時，ファイル節，作業場所節の合計の上限は，16,777,215バイトとなります。

注※4

ファイル節の合計サイズは，次のように計算します。

Σ（各記述項のレコード長＋24+α）

α：レコード間の境界調整で生じる遊びバイト

レコード間は8バイト境界調整される。

注※5

添字の値，および部分参照の値の場合，上限は1,073,741,823となります。

注※6

ただし，プログラム単位では，アドレスデータ項目の個数や連絡節の01レベルデータ項目の個数によって，上記の最大数まで指定できないことがあります。

注※7

次のプログラム数の合計値です。

外部プログラム節で，STDCALLまたはPASCALに関連づけたプログラム

stdcall呼び出し指示ファイル(.cbw)に指定したプログラム

stdcall呼び出し規約のDLL中の内側のプログラム

注※8

クラス定義に含まれるファクトリ定義，オブジェクト定義のデータ記述項にPROPERTY句が指定されている場合は次のようになります。

クラス定義中に記述可能なメソッドの数

= 65,530 - （SET,GET指定がないPROPERTY句の数）×2 - （SET,GET指定があるPROPERTY句の数）

注※9

SQL文の長さは，次の項目の合計値になります。

SQL文を構成する語，定数の長さ（「EXEC SQL」と「END-EXEC」は含めない）

語と定数の間は，分離符の空白文字1バイトを加算する。

（語と定数の間に，注記行や複数の空白文字があっても，常に空白文字1バイトとして扱う）

ただし，動的SQLの長さは，コンパイラではチェックしません。

注※10

パス名を含めないファイル名の長さの上限も255バイトです。

使用できるファイル名の長さが機能により個別に規定されている場合は，その長さが上限となります。

また，指定されたファイル名は内部的に絶対パス名に変換することがありますが，このとき内部的に処理できる絶対パス名の長さの上限は，260バイトです。

注※11

-MaxDigits38オプションを指定した場合，けた数は1〜38けたとなります。

注※12

-MaxDigits38オプションを指定した場合，けた数の上限は38けたとなります。

注※13

-IntResult,DecFloat40オプションを指定した場合，けた数は40けたとなります。

注※14

-MaxDigits38オプションの指定がある場合，数字は38けた以内となります。

注※15

-MaxDigits38オプションを指定したとき，PICTURE文字列の長さは60文字となります。

注※16

-LiteralExtend,Alnumオプションを指定したとき，英数字定数の長さは1〜8,191文字（バイト）となります。

注※17

-LiteralExtend,Alnumオプションを指定した場合，プログラム名およびメソッド名を定数指定するときの長さは，1〜1,024文字（バイト）となります。

付録H　入出力状態の値

入出力状態の値が表す内容を，次に示します。

表H‒1　入出力状態の値

条件

入出力状態の値

順編成ファイル，相対編成ファイル，

索引編成ファイルの場合

HiRDBによる索引編成ファイルの場合

COBOL入出力サービスルーチンの場合

成功

00

入出力文の実行が成功した。その入出力動作に関しては，これ以上情報がない。

○

○

02

入出力文の実行は成功したが，重複キーが検出された。

READ文で読み込んだレコードキーの参照キーの値が，その索引での次のレコードの参照キーと等しい。

REWRITE文，またはWRITE文によって指定されたレコードの副レコードキーの値が，すでにファイルにある。ただし，この副レコードキーは重複した値が許されているので，誤りではない。

×

×

04

READ文の実行は成功した。しかし，処理したレコードの長さが，そのファイルのファイル固有属性に従っていない（テキスト編成ファイルだけ）。

または，CSV編成ファイルから入力した一つのセルの文字列長が，入力領域より長い。

−

×

05

OPEN文の実行は成功した。しかし，OPEN文を実行したとき，参照した不定ファイルはない。OPEN文のモードが入出力両用，または拡張ならば，ファイルは生成される。

○

（入力モードの場合だけ）

×

07

入出力文の実行は成功した。ただし，REEL／UNIT指定のCLOSE文で参照したファイルが非リール／ユニットの媒体上にある（順編成ファイルだけ）。

−

×

ファイル終了

10

順アクセスのREAD文を実行しようとしたが，次のレコードがない。次の場合のどちらかである。

ファイルの終わりに達した。

存在しない不定入力ファイルに対して，順アクセスのREAD文を初めて実行しようとした。

○

○

（1.の場合だけ）

14

相対編成ファイルに対して順アクセスのREAD文を実行しようとしたが，相対レコード番号の有効けた数がそのファイルの相対キーデータ項目のサイズよりも大きい（相対編成ファイルだけ）。

−

○

（相対編成ファイルの場合だけ）

無効キー

21

順アクセスで，順序誤りがあった。成功したREAD文と次のREWRITE文の間で主レコードキーの値が変更されたか，またはWRITE文の実行時に主レコードキーの値が昇順になっていない（索引編成ファイルだけ）。

○

×

22

重複キーがあった。

すでにレコードがある位置に，重ねてWRITE文でレコードを書き出そうとした（相対編成ファイルだけ）。

WRITE文，またはREWRITE文で索引編成ファイルに書き出そうとしたレコードの主レコードキー，または副レコードキーの値が，すでにファイル中にある。ただし，この副レコードキーには，DUPLICATESが指定されていない（索引編成ファイルだけ）。

○

（2.の場合だけ）

○

（相対編成ファイルで1.の場合だけ）

23

次の場合のどちらかである（相対編成ファイル，および索引編成ファイル）。

物理ファイル中に存在しないレコードをランダムに呼び出そうとした。

存在しない不定入力ファイルに対してSTART文，または乱アクセスのREAD文を，実行しようとした。

○

○

（相対編成ファイルの場合だけ）

24

次の場合のどれかである。

COBOLの外部で定義されたファイルの区域外に書き出そうとした。区域の定め方は，作成者が決める（相対編成ファイル，および索引編成ファイル）。

順アクセスのWRITE文を実行しようとしたが，そのレコードの相対レコード番号の有効けた数がそのファイルの相対キーデータ項目より大きい（相対編成ファイルだけ）。

乱アクセスのWRITE文を実行しようとしたが，その相対レコード番号が0以下である（相対編成ファイルだけ）。

○

（1.の場合だけ）

○

（相対編成ファイルの場合だけ）

永続誤り

30

永続誤りがある。次のどれかである。

順固定長ファイルから入力した最後のレコードの長さが，レコード長より短い。

順固定長ファイルに標準入力（stdin）を割り当てた場合，入力したレコードの長さがレコード長より短い（最大レコード長と最小レコード長の範囲外の値が設定されている）。

相対可変長ファイルのレコード領域が破壊されている。

相対編成ファイルのスロットが破壊されている。有効，無効レコードの識別ができない。

入出力両用モードで開かれたテキスト編成ファイルに対してREAD文を実行したが，入力したテキスト行がプログラム中で定義したレコード領域より長い。

特定のファイルを指定し，OPEN文が成功したが，そのあと入出力矛盾が発生した（ファイル破壊を検出した場合など）。

相対編成ファイルで，最大レコード長および最小レコード長の範囲を超えている。

ファイル位置指示子が不定となっている。例えば，COMMIT文，ROLLBACK文の実行によってファイル位置指示子が有効なレコードを指していない。

○

（相対編成ファイルで，3.，4.の場合だけ）

34

区域外書き出しによる永続誤りがある。

COBOLの外部で定義されたファイルの区域外にレコードを書き出そうとした（順編成ファイルだけ）。

−

○

35

次の場合のどちらかである。

不定ファイルでないファイルがないとき，INPUT指定，I-O指定，またはEXTEND指定を持つOPEN文を実行しようとしたことによる永続誤りがある。

ISAMによる索引編成ファイルで，指定した物理ファイルと実行時環境変数CBLISAMLARGE，またはCBLD_ファイル名で指定したファイルの形式が異なっている。

○

（1の場合だけ）

○

（1の場合だけ）

37

OPEN文を実行しようとしたが，指定されたファイルが，そのOPEN文で指定されたモードを使えない。

次の場合のどれかである。

EXTEND指定，またはOUTPUT指定が指定されていたが，そのファイルでは出力動作が使えない。

I-O指定が指定されていたが，そのファイルでは，入出力両用モードで開かれている順編成ファイル／相対編成ファイル／索引編成ファイルに対して許される入出力動作が使えない。

INPUT指定が指定されたが，そのファイルでは入力動作が使えない。

OUTPUT指定以外が指定されたが，書式印刷機能でプリンタの出力動作が使えない。

×

○

（1.，2.，および3.の場合だけ）

38

施錠して閉じたファイルに対して，OPEN文を実行しようとしたことによる永続誤りがある。

○

×

39

ファイル固有属性とプログラム中で指定した属性との間で矛盾が検出されたため，OPEN文が不成功になった。

×

○

論理誤り

41

開かれているファイルにOPEN文を実行しようとした。

○

○

42

開かれていないファイルにCLOSE文を実行しようとした。

○

○

43

順アクセスで，DELETE文，またはREWRITE文を実行する前に，関連するファイルに対して実行された最後の入出力文が，成功したREAD文でない。

○

○

44

次のどちらかの条件で，区域外書き出しが起こった。

関連するファイル名のRECORD IS VARYING句によって許される最大のレコードより大きい，または最小のレコードより小さいレコードを書き出そうとした，または書き換えようとした。

レコードを書き換えようとしたが，そのレコードは，書き換えられるレコードと同じサイズでない。

○

（1.の場合だけ）

○※1

46

入力モードまたは入出力両用レコードで開かれたファイルに順アクセスのREAD文を実行しようとしたが，有効な次のレコードがない。次の場合のどれかである。

先行するSTART文が不成功であった。

先行するREAD文が，ファイル終了条件によって不成功であった。

先行するREAD文が，ファイル終了条件を引き起こした。

○

○

（1.は相対編成ファイルの場合だけ）

47

入力モード，または入出力両用モードで開かれていないファイルに，READ文，またはSTART文を実行しようとした。

○

○

48

正しいオープンモードでは開かれていないファイル結合子に対して，WRITE文を実行しようとした。次の場合のどちらかである。

順アクセス法の場合，拡張モードや出力モードで開かれていないファイル結合子にWRITE文を実行しようとした。

動的アクセス法や乱アクセス法の場合，入出力両用モード，出力モード，または拡張モードで開かれていないファイル結合子にWRITE文を実行しようとした。

○

○

49

入出力両用モードで開かれていないファイルに，DELETE文，またはREWRITE文を実行しようとした。

○

○

作成者規定

90

入出力文の実行時，実行できない状態になった。

次のどれかである。

入出力に必要なメモリが不足した。

ファイルにフォルダが指定された。

CBL_外部装置名で示される環境変数がない。

1プロセス内でオープンできるファイル数の上限を超えた。

CLOSE文実行時，バッファに残っていた内容をファイルに書き出すとき，大容量の記憶ファイルの許容範囲を超えた。

ファイル名指定に誤りがある。

同時に施錠できるレコード数の上限を超えた。

索引編成ファイルに対して2GB以上のファイル入出力を実行した。※2

ノーマルファイル形式の索引編成ファイルに対して2GB以上のファイル入出力を実行した。※3

ラージファイルに対応したISAMがインストールされていない。※3

ISAMのライブラリが検索パス上に存在しない。

ライブラリロード中にエラーが発生した。

環境変数CBLEUDCFUNCにERRORSTOPを指定した環境で，GDIモード印刷またはESC/Pモード印刷のOPEN文を実行時にEnableEUDC関数がエラーを返した。

○※⁴

○※⁵

92

入出力文の妥当でない使い方によって実行が不成功になった。

レコード長がDEPENDING ON指定で指定されている場合，指定されたデータ名中の値が数字以外である。

レコード番号が処理できる最大値を超えた（相対編成ファイルだけ）。

開かれていないファイルにUNLOCK文を実行しようとした。

○

（1.，および3.の場合だけ）

○※⁶

93

次の場合のどちらかである。

OPEN文を実行しようとしたが，該当ファイルまたは該当ファイル中のレコードはすでに使用されている。

書式印刷機能を使用するとき，プリンタはすでに使用されている。

×

○

（1.の場合だけ）

98

該当せず。

出力モード指定，または不定ファイルに対応する入出力両用，拡張モード指定のOPEN文を実行しようとしたが，ファイルがなかった。

×

99

入出力文（OPEN文，CLOSE文を除く）を実行しようとしたが，該当レコードはすでに使用されている。

×

○

（凡例）

○：標準仕様と同じ

×：値は返されない

−：該当しない

注※1

2.，および次の場合に該当する。

ファイルオープン時に指定した最大のレコードより大きい，または最小のレコードより小さいレコードを書き出そうとした，または書き換えようとした。

注※2

Windows(x64) COBOL2002で有効です。

注※3

Windows(x86) COBOL2002で有効です。

注※4

1.〜6.，および次の場合に該当する。

副レコードキーの個数が，98を超えている。

データが不正である。

HiRDBシステムがデッドロックやタイムアウトなどのエラーを検知した。

注※5

1.，2.，4.，5.，6.，7.，および次の場合に該当する。

サービスルーチンに指定したパラメタインタフェース領域に誤りがある。

サービスルーチンで取り扱えないファイル名を指定した。

COBOL実行時ライブラリが組み込まれていない。

入出力のためのシステム関数でエラーが発生した。

注※6

2.，3.，および次の場合に該当する。

指定できないファイル編成，およびアクセス法でCBLSTARTサービスルーチンを実行した。

指定できないファイル編成，およびアクセス法でNEXT指定のCBLREADサービスルーチンを実行した。

指定できないファイル編成，およびアクセス法でKEY指定のCBLREADサービスルーチンを実行した。

指定できないファイル編成でCBLDELETEサービスルーチンを実行した。

順ファイルに対してLOCK MODE MANUALの指定をした。

開かれていないファイルに対してCBLWDISKサービスルーチンを実行した。

付録I　COBOL85とCOBOL2002のコンパイラオプションの対応

COBOL85のccblコマンドと，COBOL2002のccbl2002コマンドでの，コンパイラオプションの対応関係を，次に示します。

項番

ccblコマンドの

オプション名

ccbl2002コマンドの

オプション名

機能

1

-Ad※1※5

−

OLE2サーバの生成形態をインプロセスサーバに指定する。

-Ax※5

−

OLE2サーバの生成形態をアウトオブプロセスサーバに指定する。

-Ag※2※5

−

OLE2サーバの生成時，レジストリに登録する（xxxxxには，DllまたはExeを指定する）。

2

-Ai

-NumAccept

ACCEPT文に数字項目を指定できるようにする。

3

-B1

-Bin1Byte

1バイトの2進項目を有効にする（PICTURE句の指定で2けたまでは1バイトとして扱う）。

4

-Bb

-BigEndian,Bin

2進データ項目をビッグエンディアン形式で処理する。

-Fb

-BigEndian,Float

浮動小数点データ項目をビッグエンディアン形式で処理する。

5

-Bt※5

-IsamExtend

Btrieve（Pervasive.SQL）による索引編成ファイルを使用する。

6

-Bz※5

-IsamExtend,Zone

Btrieve（Pervasive.SQL）による索引編成ファイルを使用する場合で，レコードキーに外部10進項目が指定されたときに，外部10進属性として処理する。

7

-C1

-Compile,CheckOnly

コンパイル時，オブジェクトファイル，実行可能ファイルおよびDLLを出力しない。

-C2

-Compile,NoLink

コンパイル時，実行可能ファイルおよびDLLを出力しない。

8

-Ch

-V3Spec

VOS3 COBOL85に対するCOBOL2002固有の構文をチェックする。

-Cg

-V3Spec,CopyEased

VOS3 COBOL85に対するCOBOL2002固有の構文をチェックする。ただし，COPY文，REPLACE文の一部のエラーチェックをしない。

9

-Ci

-NumCsv

CSV編成ファイルで，セルデータを数値として入出力できるようにする。

10

-Cm

-StdMIA,13

MIA1.3仕様の範囲外チェックをする。

-Cy

-StdMIA,14

MIA1.4仕様の範囲外チェックをする。

-Cu

-Std85,High

JIS仕様の範囲外チェックをする。

-Cj

-Std85,High,Obso

JIS仕様の範囲外と廃要素をチェックする。

-Cv

-Std85,Middle

JIS仕様の中位集合範囲外（上位集合，JIS仕様の範囲外）チェックをする。

-Cw

-Std85,Low

JIS仕様の下位集合範囲外（中位集合，上位集合，JIS仕様の範囲外）チェックをする。

-Cr

-Std85,Report

JIS仕様の報告書作成機能をチェックする。

11

-Cp※5

-StdCall

stdcall呼び出し指示ファイルを有効にする。

12

-Cs

-MainNotCBL

すべて副プログラムとして作成する。

13

-Ct

-V3ConvtName

VOS3 COBOL85からのソースファイル互換のため，COPY文の原文名定数中の'¥'と'@'を変換する。

14

-d

-DebugLine

デバッグ行を有効にする。

15

-Dl※1※5

-Dll,Stdcall

DLLの形式をstdcall呼び出し形式に指定する。

-Dc※1※3※5

-Dll,Cdecl

DLLの形式をcdecl呼び出し形式に指定する。

16

-Dz

-MinusZero

10進項目で負の符号を持つゼロを正の符号を持つゼロに変換する。

17

-Ec

-Switch,EBCDIC

字類条件をEBCDICに指定する。

-Ek

-Switch,EBCDIK

字類条件をEBCDIKに指定する。

−

-Switch,xxxxx,Unprintable

英数字の照合順序を指定したコードに切り替える。また，1バイトで印字できないコードも，照合順序として固有の文字位置に割り付ける（xxxxxには，EBCDICまたはEBCDIKを指定する）。

−

-Switch,xxxxx,noApplyJpnItem

日本語項目を-Switchオプションの適用対象外とする（xxxxxには，EBCDICまたはEBCDIKを指定する）。

18

-F8

-Cblctr

CBL-CTR特殊レジスタを使用できるようにする。

19

-Fd

-DefFile

生成する.defファイル名を指定する。

20

-Fi

-IconFile

アイコンファイル名を指定する。

21

-Fr

-ResrcFile

生成するリソース定義ファイル名を指定する。

22

-Fw※5

-StdCallFile

stdcall呼び出し指示ファイル名を指定する。

23

-Gm

-SimMain

主プログラムをシミュレーションする。

-Gs

-SimSub

副プログラムをシミュレーションする。

24

-H8

-H8Switch

HITAC8000シリーズの仕様でコンパイルする。

25

-Hd

-IgnoreLCC

行送り制御文字を無視する。

26

-Hf

-V3Rec,Fixed

メインフレーム（VOS3）の固定長レコード形式のプログラムを，VOS3の日本語文字の扱いに合わせてコンパイルする。

-Hv

-V3Rec,Variable

メインフレーム（VOS3）の可変長レコード形式のプログラムを，VOS3の日本語文字の扱いに合わせてコンパイルする。

27

−

-V3RecFCSpace

空白に関する機能キャラクタの扱いをメインフレームと同等にする。

28

−

-V3RecEased,QuoteCheck

-V3Recオプション指定時の仕様チェックを緩和する（定数の分離符のチェック）。

−

-V3RecEased,WordCheck

-V3Recオプション指定時の仕様チェックを緩和する（語またはPICTURE文字列の制限値のチェック）。

29

-I3

−

80386用のマシン語を使用する。

-I4

−

80486用のマシン語を使用する。

30

-Ks※5

-XMAP,LinePrint

書式印刷機能を使用して，順編成ファイルをプリンタに出力する。

31

-Lg

-Lib,GUI

GUIモードの実行時ライブラリをリンクする。

-Lc

-Lib,CUI

CUIモードの実行時ライブラリをリンクする。

32

-M1

-CmAster

1カラム目が'*'の行を注記行とする。

33

-M7※5

-CompatiM7

MIOS7 COBOL85との互換機能を有効にする。

34

-Mc

-UscoreStart

先頭が下線のCALL定数を指定できるようにする。

35

-Md

-CmDol

7カラム目が'$'の行を注記行とする。

36

-Mw

-Main,System

先頭の最外側プログラムを主プログラムとして作成する。引数の形式は，システム固有のargc，argv形式とする。

-Mh

-Main,V3

先頭の最外側プログラムを主プログラムとして作成する。引数の形式は，メインフレーム（VOS3）形式とする。

37

-Mt

-MultiThread

マルチスレッド対応COBOLプログラムを作成する。

38

-Na

-JPN,Alnum

日本語項目，日本語編集項目，および日本語文字定数をそれぞれ英数字項目，英数字編集項目，および英数字定数として扱う。

39

-Nb

-JPN,V3JPN

LENGTH関数の引数，STRING文，UNSTRING文，INSPECT文を除く日本語項目，日本語編集項目，および日本語文字定数をそれぞれ英数字項目，英数字編集項目，および英数字定数として扱う。

−

-JPN,V3JPNSpace

-CompatiV3オプション指定時に，日本語項目，日本語編集項目，および日本語文字定数をそのままの属性で扱う。

40

-o

-OutputFile

生成する実行可能ファイル名，またはDLLファイル名を指定する。

41

-O0

-Optimize,0

コンパイル時，最適化をしない。

-O1

-Optimize,1

コンパイル時，文の中で閉じた最適化をする。

-O2

-Optimize,2

コンパイル時，広域的な最適化をする。

-O3

-Optimize,3

コンパイル時，広域的な最適化をし，10進項目を2進項目に変換する。

42

-Od※4

-SQLDisp

埋め込みSQL文に用途（USAGE句）が表示用（DISPLAY）のデータ項目を指定できるようにする。

43

-Oi

-SQL,ODBC

埋め込みSQL文をODBCで使用できるようにする。

−

-SQL,ODBC,NoCont

埋め込みSQL文をODBCで使用できるようにする。SQL構文内の浮動継続指示子を有効としない。

44

-Ot

-OpenTP1

OpenTP1を使用したデータコミュニケーション機能を使用できるようにする。

45

-P1

-SrcList,NoCopy

コンパイルリストに情報を出力する。すべてのCOPY文の展開を抑止する。

-P2

-SrcList,CopySup

コンパイルリストに情報を出力する。プログラムにSUPPRESS指定があるときだけ，COPY文の展開を抑止する。

-P3

-SrcList,CopyAll

コンパイルリストに情報を出力する。SUPPRESS指定を無視して，すべてのCOPY文を強制的に展開する。

−

-SrcList,OutputAll

コンパイルリストに情報を出力する。

COPY文のSUPPRESS指定，翻訳指令を無視して，すべての情報を出力する。

−

-SrcList,xxxxx,NoFalsePath

コンパイルリストに情報を出力するとき，条件翻訳の無効行を出力しない（xxxxxには，CopyAll，CopySup，またはNoCopyを指定する）。

−

-SrcList,xxxxx,DataLoc

コンパイルリスト（原始プログラムリスト）にデータ項目の相対位置と長さを表示する（xxxxxには，OutputAll，CopyAll，CopySup，またはNoCopyを指定する）。

46

-Pu

-LowerAsUpper

定数指定のCALLに指定された英小文字を英大文字に変換してプログラムを呼び出す。

47

-Rd

-RDBTran

COMMIT文／ROLLBACK文をHiRDBによる索引編成ファイルに対して適用する。

48

-S1

-StdVersion,1

第1次規格の解釈でコンパイルする。

-S2

-StdVersion,2

第2次規格の解釈でコンパイルする。

49

-T1

-DebugInf

異常終了時，エラー要約情報を出力する。

-T2

-DebugInf,Trace

異常終了時，エラー要約情報およびトレースバック情報を出力する。

-T3

-DebugCompati

実行時に次のチェックをする。

添字，指標名の繰り返し回数の範囲外チェック

プログラム間整合性チェック

-T4

-DebugData

データ例外を検出する。

−

-DebugData,ValueHex

データ例外検知機能でデータ例外が検出された場合，出力されるエラーメッセージにデータ項目の属性と矛盾している格納値を16進数で表示します。

-T5

-TDInf

テストデバッグ情報を出力する。

-T6

-CVInf

カバレージ情報を出力する。

-T7

-DebugRange

添字，指標名の繰り返し回数について，次元ごとの範囲外チェックをする。

-Tt

-TestCmd,Full

中断点情報，シミュレーション情報のTDコマンドをTDコマンド格納ファイルに出力する。

-Tb

-TestCmd,Break

中断点情報のTDコマンドをTDコマンド格納ファイルに出力する。

-Ts

-TestCmd,Sim

シミュレーション情報のTDコマンドをTDコマンド格納ファイルに出力する。

50

-Un

-EquivRule,NotExtend

拡張コード文字と標準コード文字を等価とみなさない。

-Ue

-EquivRule,NotAny

拡張コード文字と標準コード文字を等価とみなさない。さらに，標準コードの英大文字と標準コードの英小文字も等価とみなさない。

-Vv

-EquivRule,StdCode

拡張コード文字と標準コード文字を等価とみなさない。さらに，日本語文字定数中に標準コードの空白を書いてもエラーとしない。

51

-v

-Details

コンパイラオプションの詳細情報を出力する。

52

-V3

-CompatiV3

VOS3 COBOL85との互換機能を有効にする。

53

-Va

-CBLVALUE

環境変数CBLVALUEを有効にする。

54

-Vb指定なし※1

-DllInit

DLLを初期化する。

55

-Vx

-BinExtend

2進データ項目に指定できる初期値を拡張する。

56

-Wl

-Link

リンカに渡すオプションを指定する。

57

-Ws

-ScreenSpeed

画面の表示速度を重視する。

58

-X5

-Comp5

COMP-5を指定できるようにする。

59

-Xb

-DigitsTrunc

転記文で上位けたを切り捨てる。

60

-Xc

-DoubleQuote

引用符（ " ）を分離符とみなしてコンパイルする。

61

-Xo

-TruncCheck

転記でのデータ切り捨てをチェックする。

62

-Xr

-SQL,XDM

埋め込みSQL文をXDM/RDで使用できるようにする。

63

-?

-Help｜-?

コマンドのヘルプを出力する。

64

−

-SimIdent

副プログラム（一意名CALL文）をシミュレーションする。

65

−

-Std2002,OutRange

COBOL2002規格仕様をチェックする。

−

-Std2002,Obso

COBOL2002規格仕様の廃要素をチェックする。

−

-Std2002,Archaic

COBOL2002仕様の古典的要素をチェックする。

66

−

-Compati85,IoStatus

入出力状態1x，2xに対する処理をPC COBOL85と同様にする。

−

-Compati85,Linage

LINAGE値が不正なときの処理をPC COBOL85と同様にする。

−

-Compati85,Call

CALL文のON EXCEPTION，またはON OVERFLOW指定の無条件文を実行するエラーの条件をPC COBOL85と同様にする。

−

-Compati85,Power

べき乗演算の精度，エラー時の処理をPC COBOL85と同様にする。

−

-Compati85,Syntax

コンパイル時の解釈をPC COBOL85と同様にする。

−

-Compati85,IDParag

見出し部の構文チェックを緩和する。

−

-Compati85,RsvWord

PC COBOL85の予約語と同じ範囲でコンパイルする。

−

-Compati85,NoPropagate

プログラムへの伝播を抑止し，オブジェクトファイルサイズを縮小する。

−

-Compati85,All

-Compati85オプションのすべてのサブオプションを仮定する。

67

−

-ErrSup,I

Iレベルエラーの出力を抑止する。

−

-ErrSup,W

Wレベルエラーの出力を抑止する。

68

−

-Repository,Gen

コンパイル時，リポジトリファイルだけを出力する。

−

-Repository,Sup

リポジトリファイルがすでにある場合，更新しない。

69

−

-RepositoryCheck

翻訳グループ中の定義と外部リポジトリ中の情報に相違があるかどうかをチェックする。

70

−

-Define

コンパイル時に有効となる，翻訳変数名とその値を定義する。

71

−

-OldForm

PC COBOL85のオプションを指定する。

72

−

-UniObjGen

シフトJISのCOBOLソースからUnicodeのオブジェクトを生成する。

−

-UniEndian,Little

シフトJISで記述された日本語文字定数をUTF-16LEに変換する。

−

-UniEndian,Big

シフトJISで記述された日本語文字定数をUTF-16BEに変換する。

73

−

-MaxDigits38※6

数字項目および数字定数に指定できる最大けた数を18けたから38けたに拡張する。

74

−

-IntResult,DecFloat40※6

算術演算の中間結果の表現形式を40けたの10進浮動小数点形式にする。

75

−

-DynamicLink,Call

定数指定のCALL文で，静的にリンクされていないプログラムを動的にリンクして実行する。

76

−

-VOSCBL,OccursKey

メインフレーム互換機能を有効にする。OCCURS句のKEY IS指定のデータ名の名前の有効範囲を，そのOCCURS句のある記述項または，それに従属する記述項とする。

−

-VOSCBL,ReportControl

メインフレーム互換機能を有効にする。制御脚書きの印刷中に改ページが起こったとき，ページ頭書きでSOURCE句によって制御用データ項目を参照している場合，その制御用データ項目の値を元の値で参照する。

−

-VOSCBL,DataComm

メインフレーム互換機能を有効にする。データコミュニケーション機能の通信記述項で，次のどちらかに該当するときの初期値を，メインフレーム（VOS3/VOS1）のXDM/DCCMデータコミュニケーション機能を使用する場合の値とする。

通信記述項の句の指定を省略している。

通信文の実行前に，通信記述項の句に指定されたデータ名に初期値を設定していない。

−

-VOSCBL,RedefinesData

メインフレーム互換機能を有効にする。REDEFINES句の右辺のデータ名が未定義のとき，直前の同一レベル番号のデータ名をREDEFINES句の右辺として仮定する。

−

-VOSCBL,AssignDataToDevice

ASSIGN句のデータ名を外部装置名とみなす。

−

-VOSCBL,EvaluateWhenOther

EVALUATE文でWHEN OTHER指定の直前の無条件文を省略した際にCONTINUE文を仮定する。

77

−

-LiteralExtend,Alnum

英数字定数と定数指定のプログラム名の長さを拡張する。

78

−

-ManifestFileExt

マニフェストファイルを実行可能ファイル／DLLに埋め込まず，外部マニフェストファイルとする。

79

−

-IgnoreAPPLY,FILESHARE

APPLY FILE-SHARE句を覚え書きとみなす。

80

−

-PortabilityCheck,Literal

メインフレームと動作が異なる可能性がある定数にお知らせメッセージを出力する。

−

-PortabilityCheck,Numeric

メインフレームと動作が異なる可能性がある数字項目，浮動小数点定数にお知らせメッセージを出力する。

81

−

-SpaceAsZero

外部10進項目中に空白文字があるとき，ゼロとみなして比較，演算，転記を実行する。

82

−

-CheckUninitData

データ項目の初期化漏れをチェックする。

83

−

-FunctionECSup,CodeConvErr

変換エラーが発生しても例外条件を成立させない。

（凡例）

−：対応するコンパイラオプションがない

注※1

ccbl2002コマンドで-DllInitオプションと-Dll,Stdcall，または-Dll,Cdeclを同時に指定すると，ccblコマンドで-Vbオプションを指定しないで-Dl，または-Dcオプションを指定した場合と同じ動作となります。

注※2

-OldFormオプションで-Agオプションだけを指定した場合，-Agオプションは無効となります。-Agオプションを指定したい場合は，-Adオプションまたは-Axオプションを同時に指定してください。

注※3

-OldFormオプションで-Dcオプションだけを指定した場合，-Dcオプションはオプション指定エラーとなります。-Dcオプションを指定したい場合は，-Dlオプションを同時に指定してください。

また，-Dcオプションだけを指定して-Detailsオプションまたは-SrcListオプションでオプションを表示した場合，-Dll,Cdeclオプションが表示されます。

注※4

-OldFormオプションで-Odオプションだけを指定した場合，-Odオプションは無効となります。-Odオプションを指定したい場合は，-Oiオプションを同時に指定するか，-SQL,ODBCオプションを指定してください。

また，-Odオプションだけを指定して-Detailsオプションまたは-SrcListオプションでオプションを表示した場合，-SQLDispオプションは表示されません。

注※5

Windows(x86) COBOL2002で有効です。

注※6

Windows(x64) COBOL2002で有効です。

付録J　環境変数の設定

COBOL2002を正常に動作させるためには，環境変数とフォルダを次のように設定する必要があります。

環境変数PATH

実行可能ファイル（.exe）とDLL（.dll）を検索するフォルダの順序を指定します。環境変数PATHに，次のフォルダを追加します。

日立共通DLLのインストール先

COBOL2002のインストールフォルダ¥bin

COBOL2002のインストールフォルダ¥bin¥SDK

Windows SDKのbin

環境変数LIB

LINKコマンド，LIBコマンドで使用するライブラリのフォルダの順序を指定します。

環境変数LIBに，次のフォルダを追加します。

COBOL2002のインストールフォルダ¥lib

COBOL2002のインストールフォルダ¥lib¥SDK

Windows SDKのlib

環境変数CBLLIB※

登録集原文を検索するフォルダを設定します。環境変数CBLLIBにCOBOL2002のインストールフォルダ¥copyを追加します。

注※

XML連携機能を使用する場合，環境変数CBLLIBにCOBOL2002のインストールフォルダ¥copyを設定する必要があります。

ただし，COBOL2002のコンポーネントおよびコマンドでは，その中で使用するコマンドやユーザプログラムを実行する前に，必要な環境変数が設定されます。したがって，上記の環境変数をユーザが設定しない場合でも，COBOL2002のコンポーネントおよびコマンドで使用するコマンドやユーザプログラムは正しく動作します。

ここでは，COBOL2002のコンポーネントおよびコマンドが行う環境設定やカスタマイズの方法について説明します。

付録J.1　コンポーネントおよびコマンドでの環境設定

COBOL2002のコンポーネントおよびコマンドは，その中で使用するコマンドやユーザプログラムを実行する前に必要な環境変数を設定します。これによって環境変数PATHや環境変数LIBなどの環境変数が設定されていなくても，コンポーネントおよびコマンドで使用するコマンドや実行するユーザプログラムは正しく動作します。

表J‒1　コンポーネントおよびコマンドの環境設定

環境変数

設定内容

PATH

システムの環境変数PATHの値の先頭に「日立共通DLLのインストール先，COBOL2002のインストールフォルダ¥bin，COBOL2002のインストールフォルダ¥bin¥SDK，Windows SDKのbinへのパス」を付加した値に変更する。

PATH=日立共通DLLのインストール先;COBOL2002のインストールフォルダ¥bin;COBOL2002のインストールフォルダ¥bin¥SDK;Windows SDKのbinへのパス;%PATH%

LIB

システムの環境変数LIBの値の先頭に「COBOL2002のインストールフォルダ¥lib，COBOL2002のインストールフォルダ¥lib¥SDK，Windows SDKのlibへのパス」を付加した値に変更する。

LIB=COBOL2002のインストールフォルダ¥lib;COBOL2002のインストールフォルダ¥lib¥SDK;Windows SDKのlibへのパス;%LIB%

CBLLIB

環境変数CBLLIBの値の先頭に「COBOL2002のインストールフォルダ¥copy」を付けた値を設定する。

CBLLIB=COBOL2002のインストールフォルダ¥copy;%CBLLIB%

環境設定を行うのはコマンドやユーザプログラムを実行するコンポーネントおよびコマンドです。

環境設定対象のコンポーネントおよびコマンドと設定する環境変数を次に示します。

表J‒2　環境設定対象のコンポーネント

コンポーネント

環境変数

PATH

LIB

CBLLIB

GUIモードのテストデバッガ

○

○

−

GUIモードのカバレージ

○

○

−

COBOLエディタ

○

○

○

開発マネージャ

○

○

○

ファイル／レコード定義

○

○

−

実行支援

○

○

−

（凡例）

○：変更する

−：変更しない

表J‒3　環境設定対象のコマンド

コマンド

環境変数

PATH

LIB

CBLLIB

cblbuild2kコマンド

○

○

○

cbltd2kコマンド

○

○

−

cblcn2kコマンド

△

△

−

cblcv2kコマンド

△

△

−

（凡例）

○：変更する

△：連動実行を除き，変更する

−：変更しない

なお，「ANCHORID=KANKYOUSETTEITAISYOUKONPO【参照元】表G-2【E】」と「ANCHORID=KANKYOUSETTEITAISYOUKOMANDO【参照元】表G-3【E】」にないコンポーネントおよびコマンドでは，環境設定は行いません。

付録J.2　環境設定のカスタマイズ

COBOL2002のコンポーネントおよびコマンドでする環境設定の内容は，カスタマイズできます。環境設定をカスタマイズするための環境変数を次に示します。

表J‒4　カスタマイズ用の環境変数

環境変数

説明

CBL2KENV_PATH

環境変数PATHに設定したフォルダとは異なるフォルダを設定する場合に使用する。

CBL2KENV_LIB

環境変数LIBに設定したフォルダは異なるフォルダを設定する場合に使用する。

CBL2KENV_CBLLIB

環境変数CBLLIBに設定したフォルダとは異なるフォルダを設定する場合に使用する。

(1)　環境変数CBL2KENV_PATH

COBOL2002のコンポーネントおよびコマンドを実行している間，環境変数PATHの値を任意のフォルダに置き換えたい場合，環境変数CBL2KENV_PATHを使います。この環境変数には，実行可能ファイルなどを検索するフォルダを設定します。フォルダを複数指定する場合は，セミコロン（;）で区切って指定します。ここで指定された値はチェックされません。

（例）

PATH=COBOL2002のインストールフォルダ¥bin;C:¥WINNT¥system32;C:¥WINNT

既存のパスを上記のパスに置き換えたい場合は，次のように指定します。

set CBL2KENV_PATH=C:¥WINNT¥system32;C:¥WINNT

実行支援や開発マネージャのプロジェクト設定ダイアログボックスでは，環境変数CBL2KENV_PATHを指定しても有効になりません。

注意事項

環境変数CBL2KENV_PATHを指定した場合，COBOL2002のコンポーネントおよびコマンドでは，環境変数PATHに設定された内容が無効となります。そのため，環境変数CBL2KENV_PATHに，Windowsのシステムフォルダを指定する必要があります。

COBOL2002のインストールフォルダ¥binを指定する必要はありません。

(2)　環境変数CBL2KENV_LIB

COBOL2002のコンポーネントおよびコマンドを実行している間，環境変数LIBの値を任意のフォルダに置き換えたい場合，環境変数CBL2KENV_LIBを使います。環境変数CBL2KENV_LIBには，ライブラリを検索するフォルダを設定します。フォルダを複数指定する場合は，セミコロン（;）で区切って指定します。検索するフォルダがない場合，%を指定します。ここで指定された値はチェックされません。

（例）

LIB=COBOL2002のインストールフォルダ¥lib;C:¥Libと置き換えたい場合，1.のように指定します。

LIB=COBOL2002のインストールフォルダ¥libと置き換えたい場合，2.のように指定します。

set CBL2KENV_LIB=C:¥Lib      … 1.
set CBL2KENV_LIB=%           … 2.

実行支援や開発マネージャのプロジェクト設定ダイアログボックスで環境変数CBL2KENV_LIBを指定しても有効になりません。

注意事項

環境変数CBL2KENV_LIBに，COBOL2002のインストールフォルダ¥libを指定する必要はありません。

(3)　環境変数CBL2KENV_CBLLIB

COBOL2002のコンポーネントおよびコマンドを実行している間，環境変数CBLLIBの値を任意のフォルダに置き換えたい場合，環境変数CBL2KENV_CBLLIBを使います。環境変数CBL2KENV_CBLLIBには，登録集原文を検索するフォルダを設定します。フォルダを複数指定する場合は，セミコロン（;）で区切って指定します。検索するフォルダがない場合，%を指定します。ここで指定された値はチェックされません。

（例）

CBLLIB=COBOL2002のインストールフォルダ¥copy;C:¥Includeと設定したい場合，1.のように指定します。

CBLLIB=COBOL2002のインストールフォルダ¥copy と設定したい場合，2.のように指定します。

set CBL2KENV_CBLLIB=C:¥Include      … 1.
set CBL2KENV_CBLLIB=%               … 2.

実行支援や開発マネージャのプロジェクト設定ダイアログボックスで環境変数CBL2KENV_CBLLIBを指定しても有効になりません。

注意事項

環境変数CBL2KENV_CBLLIBに，COBOL2002のインストールフォルダ¥copyを指定する必要はありません。

付録J.3　環境変数設定時およびカスタマイズ時の注意事項

コンポーネントおよびコマンドの環境設定やカスタマイズは，コンポーネントおよびコマンドの起動中だけ有効になります。エクスプローラなどからユーザプログラムを起動した場合は有効になりません。

付録K　COBOLコマンドプロンプト

COBOLコマンドプロンプトは，COBOL2002のコマンドやユーザプログラムを正しく実行するために必要な環境変数が設定されたコマンドプロンプトです。

付録K.1　COBOLコマンドプロンプトの起動と終了

(1)　起動方法

Windowsのプログラム一覧にある［COBOL2002］下のメニューから［COBOLコマンドプロンプト for COBOL2002］を選びます。

COBOLコマンドプロンプトの画面例を次に示します。

起動時のフォルダは，COBOL2002のインストールフォルダとなります。

(2)　終了方法

COBOLコマンドプロンプトのシステムメニューの［閉じる］を選びます。

付録K.2　COBOLコマンドプロンプトの環境変数の状態

COBOLコマンドプロンプト中の環境変数は，次のように設定されています。また，このCOBOLコマンドプロンプトの環境変数はカスタマイズできます。環境設定のカスタマイズの詳細については，「付録J　環境変数の設定」の「付録J.2　環境設定のカスタマイズ」を参照してください。

表K‒1　コマンドプロンプトの環境設定

環境変数

設定内容

PATH

システムの環境変数PATHの値の先頭に「日立共通DLLのインストール先，COBOL2002のインストールフォルダ¥bin，COBOL2002のインストールフォルダ¥bin¥SDK」を付加した値に変更する。

PATH=日立共通DLLのインストール先;COBOL2002のインストールフォルダ¥bin;COBOL2002のインストールフォルダ¥bin¥SDK;%PATH%

LIB

システムの環境変数LIBの値の先頭に「COBOL2002のインストールフォルダ¥lib，COBOL2002のインストールフォルダ¥lib¥SDK」を付加した値に変更する。

LIB=COBOL2002のインストールフォルダ¥lib;COBOL2002のインストールフォルダ¥lib¥SDK;%LIB%

CBLLIB※

環境変数CBLLIBの値の先頭に「COBOL2002のインストールフォルダ¥copy」を付けた値を設定する。

CBLLIB=COBOL2002のインストールフォルダ¥copy;%CBLLIB%

注※

「COBOL2002 Net Client Runtime」，および「COBOL2002 Net Server Runtime」で使用できるCOBOLコマンドプロンプトでは設定されません。

環境変数の値の設定が正しく行われていない場合，環境変数が追加されない状態でコマンドプロンプトが起動されます。起動されたコマンドプロンプトには，環境変数の設定に失敗した内容を示すメッセージが表示されます。環境変数に設定されている指定を減らすか，または環境設定のカスタマイズを行ってください。その後，再度COBOLコマンドプロンプトを実行してください。

付録L　トラブルシュートに有効な資料

COBOL2002のCOBOLプログラムで障害が発生した場合，調査に有効な資料について説明します。トラブルシュートに有効な資料を次の表に示します。

表L‒1　トラブルシュートに有効な資料一覧

資料名

概要説明

資料の参照先

コンパイラメッセージ

COBOLプログラムのコンパイル時に出力されるエラーメッセージです。

マニュアル「COBOL2002　メッセージ」

コンパイルリスト

コンパイラが出力するリストです。次の情報が含まれます。

情報リスト（コンパイル時に指定されたCOBOL2002のコンパイラオプションを含む）

原始プログラムリスト

エラーリスト（コンパイル時のエラーメッセージのリスト）

付録E　コンパイルリスト

実行時メッセージ

COBOLプログラムの実行時に出力されるエラーメッセージです。

マニュアル「COBOL2002　メッセージ」

異常終了時要約情報リスト

COBOLプログラムが異常終了したときに出力されるリストです。

異常終了したCOBOLプログラムの名称や行番号，異常終了するまでのトレース情報が出力されます。

37.2　異常終了時要約情報リスト

データ領域ダンプリスト

COBOLプログラムが異常終了したとき，またはCBLDATADUMPサービスルーチンを呼び出したときのデータ領域の状態が出力されるリストです。

異常終了するまでに実行されたCOBOLプログラムのファイル節，作業場所節，局所場所節のダンプが出力されます。

37.3　データ領域ダンプリスト

プログラム検索トレースファイル

動的なリンクによる呼び出しで，呼び出し先プログラムの検索トレースが出力されるファイルです。

18.6.4　動的なリンクのプログラム検索トレース機能

情報抽出ツール出力結果リスト

COBOL2002情報抽出ツールが出力するリストです。ツール実行時に指定する入力ファイルに対応した情報が出力されます。

マニュアル「COBOL2002　操作ガイド」

環境変数の設定情報

COBOLプログラムを実行するときに設定されている環境変数の情報です。

36.2　プログラムの実行環境の設定

メイクファイル

COBOLプログラムのコンパイルやリンケージの方法を記述したファイルです。バッチファイルなどで代用している場合もあります。

Microsoftのドキュメント

プロセスダンプ

ダンプが出力された時点でのプロセス情報が出力されます。プロセス情報には，実行可能ファイルやDLLファイルの情報，スタックやヒープなどメモリの内容が含まれます。

Microsoftのドキュメント

付録L.1　資料採取の準備

資料を採取するには，COBOLプログラム開発の開始からシステム運用の開始までの各作業工程のコンパイル前や，実行前に準備が必要です。COBOLプログラム開発の開始からシステム運用の開始までの作業の流れを次の図に示します。

図L‒1　COBOLプログラム開発の開始からシステム運用の開始までの作業の流れ

(1)　開発環境のマシンでの準備

(a)　開発中のプログラムのコンパイル前の準備

テスト用に，開発中のCOBOLプログラムをコンパイル・リンケージする前に，コンパイル時に指定するコンパイラオプションを確認してください。コンパイラオプションについては，「33.5　コンパイラオプション」を参照してください。

コンパイラオプションに-SrcListオプションを指定することで，コンパイルリストを出力できます。データ部のデータ項目の相対位置，および登録集原文を含んだコンパイルリストを出力するために，-SrcList,CopyAll,DataLocオプションを指定することをお勧めします。

コンパイラオプションに，次のどれかのデバッグオプションを指定することで，COBOLプログラムが異常終了したときに異常終了時要約情報リストやデータ領域ダンプリストを出力できます。

-DebugInf，-DebugInf,Trace，-DebugCompati，-DebugData，-TDInf，-CVInf，-DebugRange

開発中は，-DebugDataオプションや，-DebugRangeオプションを指定することをお勧めします。なお，テストデバッグ機能を使用する場合は-TDInfオプション，カバレージ機能を使用する場合は-CVInfオプションをコンパイラオプションに指定してください。

メイクファイルやコンパイルリストは障害調査に有効な資料なので，開発後も保管してください。

(b)　開発中のプログラムの実行前の準備

コンパイル・リンケージで作成したCOBOLプログラムをテスト・デバッグする前に，実行時環境変数の設定を確認してください。実行時環境変数については，「36.2　プログラムの実行環境の設定」を参照してください。

実行時エラーメッセージは，環境変数CBL_SYSERRに出力先ファイルを指定して，ファイルに出力することをお勧めします。

環境変数CBL_SYSERRの指定がない場合，実行時エラーメッセージは，COBOLプログラムの動作モードがGUIモードのときはCOBOL2002が出力するコンソール画面に，CUIモードのときは標準エラー出力（stderr）に出力されます。

異常終了時要約情報リストは，環境変数CBLABNLSTに出力先ファイルを指定して，ファイルに出力することをお勧めします。

環境変数CBLABNLSTの指定がない場合，異常終了時要約情報リストは，COBOLプログラムの動作モードがGUIモードのときはCOBOL2002が出力するコンソール画面に，CUIモードのときは標準エラー出力（stderr）に出力されます。

データ領域ダンプリストは，環境変数CBLDDUMPに出力先ファイルを指定して，ファイルに出力することをお勧めします。

環境変数CBLDDUMPの指定がない場合，および環境変数に出力先ファイルを指定していない（"CBLDDUMP="だけを指定した）場合，データ領域ダンプリストは出力されません。

プログラム検索トレースファイルは，環境変数CBLPGMSEARCHTRCに出力先ファイルを指定して，ファイルに出力することをお勧めします。プログラム検索トレースファイルは，動的なリンクによる呼び出しで，呼び出し先が見つからないなど期待する動作にならない場合の調査に有効です。

環境変数CBLPGMSEARCHTRCの指定がない場合，プログラム検索トレースファイルは出力されません。

プロセスダンプは必須ではありませんが，領域破壊などによってプログラムが期待する動作にならない場合の調査に有効なので出力することお勧めします。プロセスダンプは，次の方法で出力できます。

出力方法

説明

Windowsのタスクマネージャを使用する

この方法は，対話形式で操作できる場合に有効です。終了しないプログラムに対するプロセスダンプも出力できます。

レジストリにプロセスダンプを出力するための設定を追加する

この方法は，再現性の低い障害に対して，プロセスダンプを出力したい場合に有効です。事前に設定しておくことで，プログラムがシステム例外によって異常終了した場合にプロセスダンプが出力できます。

Microsoftなどから提供されるツールを使用する

ツールの仕様に従います。

ここでは，レジストリにプロセスダンプを出力するための設定を追加する方法について説明します。レジストリを変更する場合の注意点を次に示します。

レジストリに誤った設定をした場合，Windowsシステムに対して重大な問題を引き起こすおそれがあるため，誤った設定をしないように注意してください。

レジストリにプロセスダンプを出力するための設定を追加した場合は，すべてのアプリケーションプログラムでの障害時にプロセスダンプが出力されるようになります。

プロセスダンプを出力する場合，その分ディスク容量が圧迫されます。プロセスダンプの出力先には，十分なディスク領域が確保されている出力先フォルダを設定してください。

プロセスダンプを出力する場合の設定手順を次に示します。

レジストリエディタ（regedit.exe）を起動する

次のレジストリキーを選択する

HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows¥Windows Error Reporting¥LocalDumps

手順2.のレジストリキーに対して，次の値を追加する

値名が作成済みの場合は，データだけ変更してください。

値名

レジストリキーのデータの種類

値名へ割り当てられるデータ

DumpCount

DWORD(32bit)値

（REG_DWORD）

プロセスダンプの出力回数を指定する。指定した回数を超えた場合，古いプロセスダンプを削除して出力する。

DumpFolder

展開可能な文字列値

（REG_EXPAND_SZ）

プロセスダンプの出力先フォルダを絶対パスで指定する。ファイル名は指定できない。

DumpType

DWORD（32bit）値

（REG_DWORD）

プロセスダンプの種類として「2」を指定する。次の値が指定できる。

0：カスタムダンプ

1：ミニダンプ

2：フルダンプ

Windowsサービスの「Windows Error Reporting Service」が起動されていない場合は，起動する

COBOLプログラム実行時は，環境変数CBLEXCEPTにTHROWを指定する

(c)　実行環境で使用するプログラムのコンパイル前の準備

実行環境で使用するCOBOLプログラムをコンパイル・リンケージする前に，コンパイル時に指定するコンパイラオプションを確認してください。コンパイラオプションについては，「33.5　コンパイラオプション」を参照してください。

テスト用に指定していたコンパイラオプションを解除してリコンパイルします。デバッグオプションを指定する場合は，-DebugInfオプションだけ指定することをお勧めします。

-DebugInfオプション以外のデバッグオプションを指定した場合，実行性能に影響があります。デバッグオプションは，十分に性能評価した上で指定してください。

-SrcListオプションは，生成されるオブジェクトに影響しません。コンパイルリストを出力するため，実行環境で使用するCOBOLプログラムをコンパイルする場合も，-SrcListオプションは指定してください。

メイクファイルやコンパイルリストは障害調査に有効な資料なので，システム稼働後も保管してください。

(d)　実行環境で使用するプログラムの実行前の準備

コンパイル・リンケージで作成したCOBOLプログラムを実行環境に導入する前に，実行時環境変数の設定を確認してください。実行時環境変数については，「36.2　プログラムの実行環境の設定」を参照してください。

プログラム検索トレースファイルの出力は実行性能に影響するため，実行環境では環境変数CBLPGMSEARCHTRCの指定を解除してください。

(2)　実行環境のマシンでの準備

システムの運用を開始する前に，マシン環境を確認してください。

開発環境のマシンと，実行環境のマシンが同じフォルダ構成になっているか確認してください。フォルダ構成が異なる場合，パスを指定している環境変数は，実行環境のマシンのフォルダ構成に合わせて値を変更してください。

開発環境のマシンと，実行環境のマシンでOSが異なる場合，COBOL2002のリリースノートやマニュアルを参照し，使用している機能が実行環境のマシンのOSでもサポートされていることを確認してください。

付録L.2　障害発生時の対処

障害発生時は，採取した資料を基に原因を調査してください。各資料の説明は，COBOL2002のマニュアルやMicrosoftのサイトなどを参照してください。

付録L.3　注意事項

実行時メッセージの行番号を基にコンパイルリストから調査する場合は，コンパイルリストと異常終了時要約情報リストのコンパイル日付が一致していることを確認してください。

付録L.4　障害事例

過去に多く発生した障害事例を次に示します。

(1)　コンパイル時のトラブル

項番

現象

原因

対策

1

ODBCインタフェース機能で，埋め込みSQLにDB固有の構文（WITH （ROWLOCK，UPDLOCK）指定やSCOPE_IDENTITY()関数など）を記述すると，コンパイル時にKCCC3800C-Sエラーとなりました。

埋め込みSQLにDB固有の構文は使用できません。

ODBCインタフェース機能では，マニュアル「COBOL2002　言語　拡張仕様編」　「9.　データベースアクセス機能」に記載している構文だけが使用できます。次のどちらかの方法で対策してください。

動的SQLを使用する。

HiRDBやOracleを使用している場合は，ODBC経由ではなくプリコンパイラを使用する。

2

コンパイル時に，算術演算でKCCC4355C-Iエラーとなりました。

一つの算術文に複数の算術式を記述したことで中間結果が30けたを超えました。

複数記述された算術式は複数の算術文に分割してください。

このとき，データ項目の整数部のけた数，小数部のけた数は，算術式の値を格納できるけた数で定義してください。

(2)　実行時のトラブル

項番

現象

原因

対策

1

CALL文による動的なリンクでの呼び出しでKCCC0003R-Sエラーとなりました。

次の原因が考えられます。

環境変数CBLLDLLに，呼び出し先プログラムを含むDLLが指定されていない。

環境変数CBLLPROGDLL指定時に，呼び出し先プログラム名とDLL名が一致していない。

呼び出し先プログラムが，DLLからエクスポートされていないため，指定されたDLLに呼び出し先プログラムが存在しない。

原因ごとの対策を次に示します。

環境変数CBLLDLLの指定が正しいか確認する。

呼び出し先プログラムのプログラム名とDLL名が一致しているか確認する。呼び出し先プログラム名にハイフン（-）を含む場合，DLL名もハイフン（-）のままの名称とする（下線（_）に置き換えない）。

呼び出し先プログラムを含むDLLのエクスポート情報を参照し，呼び出し先プログラムがエクスポートされていることを確認する。呼び出し先プログラムがエクスポートされていない場合，エクスポートするようにプログラムまたはメイクファイルを修正する。DLLでエクスポートされているシンボル名は次の方法で確認できる。

・COBOL2002情報抽出ツールにDLLファイルを指定して実行する。

・/EXPORTSオプションを指定したdumpbinコマンド※にDLLファイルを指定して実行する。

2

CALL文による動的なリンクでの呼び出しでKCCC0131R-Sエラーとなりました。

ロード対象DLLにリンクされた，ほかのDLLがロードできません。

DLLをロードするには，ロード対象DLLにリンクされたすべてのDLLが存在し，かつ，環境変数PATHにこれらのDLLへのパスが指定されていなければなりません。環境変数PATHに，すべての必要なパスが指定されているか確認してください。

ロード対象DLLにリンクされたDLLは次の方法で確認できます。

COBOL2002情報抽出ツールにロード対象DLLを指定して実行する。

/DEPENDENTSオプションを指定したdumpbinコマンド※にロード対象DLLを指定して実行する。

3

COBOLプログラムが正常終了したあとの終了コードが0以外になりました。

戻り値を持たないプログラムを呼び出しています。

COBOLプログラムが正常終了した場合，RETURN-CODE特殊レジスタの値がプログラムの終了コードになります。

プログラム実行中にC言語などで作成された戻り値を持たない（void型）プログラムを呼び出した場合，RETURN-CODE特殊レジスタの値は不定となります。この状態でプログラムを終了すると，プログラムの終了コードは不定となります。

この場合，プログラムを終了する直前に，明示的にRETURN-CODE特殊レジスタの値を設定してください。

4

COBOLプログラムが終わらないため，タスクマネージャから強制終了したが，原因がわかりませんでした。

次の原因が考えられます。

PERFORM文などの反復処理の終了条件が真にならない。

ACCEPT文やSTOP文で応答待ちになっている。

実行中の処理を特定し，原因を取り除いてください。

実行中の処理は次の手順で特定できます。

タスクマネージャで調査対象のプロセスを選択し，右クリックでダンプファイルの作成を選択する。

COBOL2002情報抽出ツールに，手順1.で作成したダンプファイル（プロセスダンプ）を指定して実行する。

手順2.で出力した情報抽出ツール出力結果リストの実行中プログラムの情報から，実行中プログラムの処理を特定する。なお，コンパイル時にデバッグオプションの指定がない場合，実行中プログラムの行番号は特定できない。

注※

dumpbinコマンドは，Visual Studio，およびCOBOL2002で提供しています。

付録M　このマニュアルの参考情報

このマニュアルを読むに当たっての参考情報を示します。

付録M.1　関連マニュアル

このマニュアルの関連マニュアルを次に示します。必要に応じてお読みください。

COBOL2002　操作ガイド　（4010-1J-801）

COBOL2002　言語　標準仕様編　（4010-1J-804）

COBOL2002　言語　拡張仕様編　（4010-1J-805）

COBOL2002　Cosminexus連携機能ガイド　（4010-1J-806）

COBOL2002　Javaプログラム呼び出し機能ガイド　（4010-1J-807）

COBOL2002　XML連携機能ガイド　（4010-1J-808）

COBOL2002　メッセージ　（4010-1J-809）

COBOL2002 Professional製品 導入ガイド　（4010-1J-815）

TP1/COBOL adapter for Cosminexus　ユーザーズガイド　（3020-3-B08）

索引順編成ファイル管理 ISAM　（3020-3-D88）

ソートマージ　（3020-3-N73）

Hitachi Code Converter（Windows(R)編）　（3020-7-359）※¹

XMAP3 Version 5 画面・帳票サポートシステム XMAP3 概説　（3020-7-511）

XMAP3 Version 5 画面・帳票サポートシステム XMAP3 開発ガイド　（3020-7-512）

XMAP3 Version 5 画面・帳票サポートシステム XMAP3 プログラミングガイド　（3020-7-513）

XMAP3 Version 5 画面・帳票サポートシステム XMAP3 実行ガイド　（3020-7-514）

HiRDB Version 10 解説（3020-6-551）※2

HiRDB Version 10 コマンドリファレンス（Windows(R)用）（3020-6-559）※3

HiRDB Version 10 UAP開発ガイド（3020-6-560）※4

HiRDB Version 10 SQLリファレンス（3020-6-561）※5

HiRDB Version 10 メッセージ（3020-6-562）

注※1

このマニュアルでは，「コード変換ライブラリのマニュアル」と表記しています。

注※2

このマニュアルでは，「HiRDBの解説マニュアル」と表記しています。

注※3

このマニュアルでは，「HiRDBのコマンドリファレンスマニュアル」と表記しています。

注※4

このマニュアルでは，「HiRDBのUAP開発ガイドマニュアル」と表記しています。

注※5

このマニュアルでは，「HiRDBのSQLリファレンスマニュアル」と表記しています。

付録M.2　このマニュアルでの表記

このマニュアルでは，マイクロソフト製品の名称を次のように表記しています。

マニュアルでの表記

製品名

Excel

Microsoft Excel

MSMQ

Microsoft Message Queuing Server

MS-DOS

Microsoft MS-DOS

SQL Server

Microsoft SQL Server

Visual Basic

Microsoft Visual Basic

Visual Studio

Microsoft Visual Studio

Windows

Windows 10(x64)

Windows 10 Pro 日本語版(64ビット版)

Windows 10 Enterprise 日本語版(64ビット版)

Windows 11

Windows 11 Pro 日本語版

Windows 11 Enterprise 日本語版

Windows Server 2019

Windows Server 2019 Standard 日本語版

Windows Server 2019 Datacenter 日本語版

Windows Server 2022

Windows Server 2022 Standard 日本語版

Windows Server 2022 Datacenter 日本語版

Microsoft Windows Vista Business 日本語版(32ビット版)，Microsoft Windows Vista Enterprise 日本語版(32ビット版)，Microsoft Windows Vista Ultimate 日本語版(32ビット版)，Microsoft Windows Vista Business 日本語版(64ビット版)，Microsoft Windows Vista Enterprise 日本語版(64ビット版)，およびMicrosoft Windows Vista Ultimate 日本語版(64ビット版)をWindows Vistaと表記しています。

Microsoft Windows Server 2008 Standard 32-bit 日本語版，Microsoft Windows Server 2008 Enterprise 32-bit 日本語版，Microsoft Windows Server 2008 Standard 日本語版，およびMicrosoft Windows Server 2008 Enterprise 日本語版をWindows Server 2008と表記しています。

このマニュアル中では，「このシステム」と表現している場合，「COBOL2002」を示しています。

また，このマニュアルは，製品種別によって相違点があります。本文中での製品種別ごとの表記を次に示します。

マニュアルでの表記

該当する

製品の形名

WindowsまたはWindows COBOL2002

Windows(x86)またはWindows(x86) COBOL2002

P-2636-2354

P-2436-5354

P-2636-3354

P-2436-6354

P-2636-4354

P-2636-7354

Windows (x64)またはWindows (x64) COBOL2002

P-2936-2354

P-2936-5354

P-2936-6354

P-2936-7354

また，このマニュアルでは各製品を次のように表記しています。

マニュアルでの表記

製品名

Pervasive.SQL

Pervasive.SQL

Pervasive.SQL 2000

XMAP3

XMAP3 Server

XMAP3 Developer Version 5

XMAP3 Server Runtime Version 5

XMAP3 Client Runtime Version 5

Windows SDK

Windows SDK for Windows 11

XMAP3の製品を区別する必要がある場合は，それぞれの製品名称を表記しています。

日立COBOL2002のことを日立COBOL2002，または単にCOBOL2002と表記しています。

日立COBOL85のことを日立COBOL85，または単にCOBOL85と表記しています。また，プラットフォームを明確にする必要がある場合は，「PC COBOL85」「VOS3 COBOL85」のように表記しています。

Enterprise JavaBeansをEJBと表記しています。

特に断り書きがない場合，プログラム定義，関数定義，およびメソッド定義を総称して「プログラム」と表記しています。

リストのヘッダ部に表示されるCOBOL2002の識別記号を次のように表記しています。識別記号以外については，「付録E.2　リストの見方」を参照してください。

識別記号（ｃ）

内容

Xと表示された場合

Windows(x86) COBOL2002であることを示します。

Eと表示された場合

Windows(x64) COBOL2002であることを示します。

コンパイラオプションの説明では，次の表記を使用します。

「XXXオプション」，または単に「XXX」とオプション名が表記されている場合

XXXオプションについて，サブオプションの組み合わせを含む，すべての場合を意味します。

「XXX,YYYオプション」，または単に「XXX,YYY」とサブオプションを含めたオプション名が表記されている場合

XXX,YYYオプションだけの場合を意味します。

「XXXコンパイラオプション」と表記されている場合

リンカオプションなど，ほかのオプションと明確に区別する必要がある場合を意味します。

（例1）

「-Compileオプション」または「-Compile」と記載している場合，-Compileオプションのサブオプションの組み合わせすべて（-Compile,CheckOnly／-Compile,NoLink）を意味します。

（例2）

「-Compile,CheckOnlyオプション」または「-Compile,CheckOnly」と記載している場合，-Compile,CheckOnlyだけを意味します。

付録M.3　KB（キロバイト）などの単位表記について

1KB（キロバイト），1MB（メガバイト），1GB（ギガバイト），1TB（テラバイト）はそれぞれ1,024バイト，1,024²バイト，1,024³バイト，1,024⁴バイトです。

付録N　用語解説

（記号）

-Mainオプションが指定されたプログラム

アプリケーションの主プログラム（main関数を持つプログラム）となるCOBOLプログラムのこと。COBOL2002では，-Main,Systemまたは-Main,V3オプションを指定してコンパイルすると，-Mainオプションが指定されたプログラムを作成できる。

（英字）

BASEクラス（BASE class）

COBOL2002で使用できる標準クラス。BASEクラスには，オブジェクトの生成や初期化などのメソッドが定義されている。BASEクラスのサブクラスならば，どのクラスでもBASEクラスの機能が利用できる。

BOM（バイトオーダマーク）

ファイルの先頭に付加された，Unicodeの表現形式を表す情報。

COBOL2002では，テキスト編成ファイルに対してこの情報を付加する。本文中では，Unicodeシグニチャと表記する。

C0メジャー情報

全体の実行文の数に対する実行済み文の数の割合を示す情報。

C1メジャー情報

全体の分岐の数に対する実行済みの分岐の数の割合を示す情報。

COBOL2002 Developer Professional

COBOL2002 Net DeveloperとCOBOL2002 Professional Tool Kitを一つにしたプログラムプロダクトのこと。Windowsの稼働環境に応じて，次の2製品がある。

COBOL2002 Developer Professional（32bit版）

COBOL2002 Developer Professional(64)（64bit版）

このマニュアルでは，上記の製品を総称して，COBOL2002 Developer Professionalと表記する。

CSV編成ファイル

CSV（Comma Separated Value）形式でデータが記述されたファイルのこと。表計算プログラムファイルともいう。

CSV形式とは，表計算プログラムやリレーショナルデータベースでデータを扱えるテキストデータの形式をいう。データの区切りをコンマ（,），レコードの区切りを改行で表す。レコードは可変長形式になる。コンマで区切られた個々のデータは，セルと呼ばれる。

HTML（Hyper Text Markup Language）

インターネット経由で閲覧できるWebページを作成するための言語。テキストファイル中にタグと呼ばれる制御文字を埋め込むと，文字書式の設定や画像の埋め込み，ほかのページへのリンクなどを表現できる。

IVS（Ideographic Variation Sequence/Selector）

漢字を表すUnicodeの直後にVariation Selectorと呼ばれるコードを付加し，漢字の「異体字」を表現する方法のこと。

COBOL2002では，用途がDISPLAYおよびNATIONALの項目で使用する。

OLEオブジェクト

OLE2オートメーション機能を使用するときの操作の対象。OLEオブジェクトは，OLEプロパティとOLEメソッドを持つ。

OLEオブジェクト参照データ項目

USAGE句で用途はOLEオブジェクト参照（OBJECT REFERENCE OLE）と指定されたデータ項目。インスタンス化されたOLEオブジェクトを指すポインタを格納する。

OLEプロパティ

OLEオブジェクトの状態または属性。

OLEメソッド

OLEオブジェクトに対する操作。

S1メジャー情報

全体の呼び出し文（CALL文，OLEメソッド操作を除くINVOKE文）の数に対する実行済みの呼び出し文の数の割合を示す情報。

SELF

メッセージの受け手のオブジェクトを参照するための名前のこと。SELFが参照するオブジェクトをSELFオブジェクトという。メソッド中で使用されるSELFは，そのメソッドの呼び起こし対象のオブジェクト自身のことを表す。

SUPER

SELFと同様に，メッセージの受け手のオブジェクトを参照するための名前のこと。SUPERは，INHERITS句が指定されたクラスのメソッド実装定義中だけで使用できる。SUPERが参照するオブジェクトは，SELFが参照するオブジェクトだが，メソッドの検索方法がSELFの場合と異なる。メソッド実装定義中にSUPERを指定すると，そのメソッド実装定義が含まれるクラスのスーパクラスを起点に，メソッドが検索される。

TDコマンド

テストデバッグで使用するコマンド。

UAC（User Account Control）

管理者ユーザとしてサインインしても，既定ではアプリケーションの実行権限は標準権限に下げられる。管理者権限を必要とするアプリケーションを起動しようとすると，システムは昇格ダイアログボックスを表示して，ユーザの確認を求める。ユーザが実行を許可した場合だけ，アプリケーションは管理者権限で実行されることになる。これによって，ユーザが知らない間に悪意のあるソフトウェアをインストールされたり，システム設定を変更されたりすることを防止できる。

UCS-2（Universal multi-octet Character Set 2）

符号化文字集合の一つの形式。1文字を2バイトで表現する。

COBOL2002では，用途がDISPLAYおよびNATIONALの項目でサポートする。

UCS-4（Universal multi-octet Character Set 4）

符号化文字集合の一つの形式。1文字を4バイトで表現する。

COBOL2002では，用途がDISPLAYおよびNATIONALの項目でUCS-4の範囲をサポートする。

Unicode

1バイトでは表現できない文字セットを含めあらゆる文字セットをサポートした文字コード。代表的な符号化文字集合としてUCS-2，UCS-4がある。代表的なエンコーディングスキーマとしてUTF-8，UTF-16がある。

COBOL2002では，UCS-4の範囲（UCS-2の範囲を含む）をサポートする。

本文中では，符号化文字集合，およびエンコーディングスキーマを文字コードと表記する。

Unicodeシグニチャ

Unicodeの表現形式（UTF-16LE／UTF-16BE／UTF-8），またはそれを識別するための情報。

UTF-16(16-bit UCS Transformation Format)

エンコーディングスキーマの一つの形式。一つのコード単位を2バイトとし，1文字を1コード単位（2バイト），または2コード単位（4バイト）で表現する。UTF-16では2バイトのコード単位の1バイト目を先に書くビッグエンディアン形式（UTF-16BE）と1バイト目を後に書くリトルエンディアン形式（UTF-16LE）がある。

COBOL2002では，用途がNATIONALの項目でUCS-4の範囲（UCS-2の範囲を含む）をサポートする。

UTF-8（8-bit UCS Transformation Format）

エンコーディングスキーマの一つの形式。ASCII文字を1バイト，日本語文字を3〜8バイト，半角かたかなを3バイトで表現する。

COBOL2002では，用途がDISPLAYの項目で使用する。

WRP（Windows Resource Protection）

Windowsシステムの安定性，および信頼性を向上させるための機能。特定のOSファイル，フォルダ，レジストリ キーなど，Windowsの読み取り専用リソースを保護する。

（ア行）

アプリケーションの主プログラム

main関数を持つプログラムのこと。

COBOL2002では，-Main,Systemまたは-Main,V3オプションを指定してコンパイルすると，アプリケーションの主プログラムとなるCOBOLプログラムを作成できる。また，他言語で作成したアプリケーションの主プログラムから，COBOLプログラムを呼び出して利用することもできる。

入れ子のプログラム

原始プログラムが入れ子構造になっている場合の，内側のプログラムのこと。内側のプログラム，または内部プログラムともいう。

インスタンスオブジェクト（instance object）

あるクラスに属するオブジェクトのこと。「BASEクラス」のファクトリオブジェクトのメソッド「NEWクラス」の呼び起こしによって生成され，実行単位の終了か，ガーベジコレクションによって消滅させられる。

インスタンスデータ

インスタンスオブジェクトが独自に持つデータのこと。インスタンスメソッドによって操作される。

インスタンスメソッド

インスタンスデータを操作するためのメソッド。

インタフェース（interface）

メッセージの送り手から見えるオブジェクトの部分のこと。

例えば，現金支払い機を一つのオブジェクトとすると，「引き出し」「預け入れ」などのメニューがインタフェースに当たり，そのサービスを実現するための内部的な仕組みが実装に当たる。インタフェースは，メソッド原型の集合である。つまり，どのようなメソッド原型を持つかによって，オブジェクトが持つインタフェースの型が決まる。インタフェースは，クラスとは別に定義できる。

内側のプログラム

原始プログラムが入れ子構造になっている場合の，内側のプログラムのこと。入れ子のプログラム，または内部プログラムともいう。

埋め込み型SQL

COBOLソースファイル中に直接埋め込まれたSQL文のこと。埋め込み型SQLを使うと，COBOLプログラムでデータベースへアクセスする機能が使用できる。

オブジェクト（object）

データとそのデータを操作するメソッド（手続き）を一体化させたモジュール。オブジェクトは，ある特定の仕事を受け持ち，所定のメッセージに対してメソッドを動作させることで問題を処理する。オブジェクト指向のプログラムでは，オブジェクト同士がメッセージをやり取りすることによって，問題が処理される。

オブジェクト参照データ項目

オブジェクトを参照するためのデータ。オブジェクト参照は，データ項目に，USAGE IS OBJECT REFERENCE句を指定したもの。

オブジェクト指向（Object Orientation）

現実にある「もの」（オブジェクト）同士のやり取りをモデル化し，それをそのままコンピュータの世界でも実現しようとする考え方のこと。

オブジェクトの消滅（object destruction）

ファクトリオブジェクト，インスタンスオブジェクトを使用できない状態にすること。ファクトリオブジェクトは実行単位の終了によって消滅させられる。また，インスタンスオブジェクトは，実行単位の終了か，ガーベジコレクションによって自動的に消滅させられる。

オブジェクトの生成（object creation）

オブジェクトを使用できる状態にすること。オブジェクトはプログラムの実行時に生成される。COBOL2002のオブジェクト指向機能では，「BASEクラス」のファクトリオブジェクトのメソッド「NEWメソッド」を呼び起こすことでオブジェクトが生成される。

オブジェクトプロパティ（object property）

データ項目にPROPERTY句を書くか，METHOD-IDにPROPERTY指定を書くと，そのデータ項目は別のクラスやプログラムから直接参照できるようになる。このデータ項目は，オブジェクト中のほかの属性（INVOKE文による呼び起こしによってだけ参照される）に対して，特性（オブジェクトプロパティ）であると宣言される。

オプション

コンパイラやコマンドへの動作を指示するためのもの。

（カ行）

ガーベジコレクション（garbage collection）

実行単位のどこからも参照されなくなったオブジェクトを，COBOL2002のオブジェクト指向機能が検索し，自動的に消滅させる仕組みのこと。

外部スイッチ

ハードウェアまたはソフトウェアの装置であって，作成者によって定義，命名され，二者択一の状態のどちらかであることを示すために使用される。

外部プログラム

原始プログラムが入れ子構造になっている場合の，最も外側のプログラムのこと。このマニュアルでは，外部プログラムのことを最外側のプログラムと呼ぶ。

外部変数

C言語で，関数外で宣言され，どの関数からでも参照できる変数（グローバル変数）のこと。外部変数は，プログラム実行中に常に同じ場所に配置され，値を保持し続ける。

カウント情報

プログラム中の文の実行回数をカウントして数値で表したもの。

型（type）

ある集合の中の個々を，何によって識別するかを明示するもの。例えば，プログラムを構成する要素をデータごとに識別する場合は，データ型となる。

活性化されるプログラム

CALL文の対象となるプログラムで，実行時に呼び出し元プログラムと組み合わされて1個の実行単位となる。このマニュアルでは，活性化されるプログラムのことを呼び出し先のプログラムと呼ぶ。

活性化するプログラム

CALL文を実行してほかのプログラムを呼ぶプログラム。このマニュアルでは，活性化するプログラムのことを呼び出し元のプログラムと呼ぶ。

カバレージ情報

テストの進捗状況を数値で表したもので，C0メジャー情報，C1メジャー情報，S1メジャー情報，およびこれらの差分情報がある。

カプセル化（encapsulation）

データとそのデータを操作するメソッドから成るオブジェクトを，外部から隠ぺいすること。カプセル化によって個々のオブジェクトの独立性が高まり，データまたはプログラム間の相互依存性が減少するので，ほかのデータやモジュールへの影響を心配しないで，処理内容の変更や修正ができるようになる。

環境変数

コンパイラ環境へのオプションを変数として設定や実行可能ファイルおよびその実行環境へのオプションを変数として設定しておくもの。

管理者権限

管理者ユーザおよびビルトイン管理者（Administratorアカウント）に与えられる権限。

管理者ユーザ

WindowsのAdministratorsグループに属するアカウント。ビルトイン管理者（Administratorアカウント）とは区別される。

既定義オブジェクト参照

COBOL2002のオブジェクト指向機能で，言語仕様としてあらかじめ定義された一意名のことで，SELF，SUPER，NULL，およびEXCEPTION-OBJECTがある。それぞれは決まったオブジェクトを参照する。

共通例外処理

COBOL2002で新しく追加された新機能の例外処理のこと。

クラス（class）

ある共通の性質を持つオブジェクトを一つのグループにまとめて定義したもの。クラスでは，それに属するオブジェクトのデータフォーマットおよびメソッドを定義することで，そのクラスに属するオブジェクトの型を規定する。

継承（inheritance）

スーパクラスから，その性質（メソッド）をサブクラスが受け継ぐ仕組みのこと。COBOL2002のオブジェクト指向機能では，INHERITS句を指定することでスーパクラスから，その性質を継承できる。一つのクラスの性質を継承することを単純継承という。これに対して，複数のスーパクラスの性質を継承することを多重継承という。また，多重継承の結果，同じクラスを重複して継承することをダイヤモンド継承という。

コンパイル

原始プログラムを翻訳すること。

COBOLプログラムのコンパイルは，ccbl2002コマンド，またはcblbuild2kコマンドで実行する。

（サ行）

最外側のプログラム

原始プログラムが入れ子構造になっている場合の，最も外側のプログラムのこと。外部プログラムともいう。

サブクラス（subclass）

クラスの階層関係の中で，継承する側のクラスのこと。

差分カバレージ情報

原始プログラムの修正によって影響を受けた部分に対するカバレージ情報。

サロゲート

UTF-16の拡張で，2つのコード単位（4バイト）で1文字を表す機能。この2つのコード単位の組み合わせのことをサロゲートペアと呼ぶ。

COBOL2002では，用途がNATIONALの項目で使用する。

実行可能プログラム

呼び出し元プログラムと呼び出し先プログラムをコンパイル，リンクし，一つの実行できるプログラムにしたもの。

実行時要素

プログラム定義，メソッド定義，および関数定義の総称。このマニュアルでは，実行時要素のことをプログラムと呼ぶ。

昇格ダイアログボックス

WindowsのUACで表示されるダイアログボックス。アプリケーションの実行権限を管理者権限に昇格しようとする場合，ユーザに権限昇格の確認を求めるダイアログボックス。

スーパクラス（superclass）

クラスの階層関係の中で，継承される側のクラスのこと。

ストアドプロシージャ

コンパイルしたSQL文を，コマンドとしてサーバに登録したもの。実行時にSQL文を解析する通常の方法に比べ，実行速度が高速で，ネットワークにかかる負荷も小さい。

制御プログラム

このシステムのOS（オペレーティングシステム）のことを指す。

（タ行）

ダイヤモンド継承（repeated inheritance，diamond inheritance）

多重継承の結果，同じクラスを直接的または間接的に重複して継承すること。

多重継承（multiple inheritance）

複数のクラスをスーパクラスとして継承すること。

単純継承（simple inheritance）

一つのクラスをスーパクラスとして継承すること。

単体テスト

プログラム（コンパイル）単位のテスト。

強い型付け

STRONG指定のあるTYPEDEF句によってデータ型を宣言すること。

定数長拡張機能

英数字定数の定数長を拡張できるようにする機能。英数字定数の長さの限界値を160文字（バイト）から8,191文字（バイト）に拡張できる。

定数長を拡張するプログラムのコンパイル時には，-LiteralExtend,Alnumコンパイラオプションを指定する。

適合（conformance）

メッセージの送り先のオブジェクトが適切かどうかを調べるための概念。適合は，オブジェクトが持つインタフェースに基づいてチェックされる。あるインタフェースBを持つオブジェクトに対するメッセージが，別のインタフェースAを持つオブジェクトでも対応できる場合，インタフェースAはインタフェースBに適合しているという。インタフェースAがインタフェースBに適合する場合，インタフェースBに適合するインタフェース型のオブジェクトが使用できれば，インタフェースAに適合するインタフェース型のオブジェクトも使用できる。適合は，コンパイル時または実行時にチェックされる。これによって，オブジェクトの誤用が避けられるだけでなく，同じメッセージを異なるクラスのオブジェクトに送れるようになる。

動的長基本項目（dynamic-length elementary item）

実行時に長さを変更できるデータ項目（英数字項目または日本語項目）のこと。DYNAMIC LENGTH句で定義する。動的長基本項目に新しい値が格納されると，項目の長さは自動的に調整される。

動的長基本項目は格納する値によって長さが変わる。想定以上にデータ項目の長さが長くなることを防ぐため，データ項目の最大長はLIMITで指定できる。

登録集原文

COBOLプログラム中でよく利用される標準化した手続き，ファイル記述，レコード記述，または完全な一つのプログラムなどを，コンパイルするプログラムとは別のファイルに登録したもの。

（ナ行）

内部プログラム

原始プログラムが入れ子構造になっている場合の，内側のプログラムのこと。このマニュアルでは，内部プログラムのことを内側のプログラム，または入れ子のプログラムと呼ぶ。

日本語EUC

UNIX系OSで標準的に使われる文字コードの一つ。ASCII文字を1バイト，半角かたかなを2バイト，日本語文字を2バイトや3バイトで表現する。

ノーマルファイル形式

2GB未満のファイルサイズまで操作できる形式の索引順編成ファイルのこと。使用できるファイルシステムは，FAT，FAT32およびNTFSである。

（ハ行）

バイトオーダ

2バイト以上のデータの記録を行なう順序のこと。例えば，0x1234のデータを0x1234のように最上位のバイトから順番に記録する方式をビッグエンディアン，0x3412のように最下位のバイトから順番に記録する方式をリトルエンディアンという。2バイトのUTF-16は，バイトオーダを意識する。

バリアントデータ項目

USAGE句で用途はバリアント（VARIANT）と指定されたデータ項目。INVOKE文やSET文で使用するVARIANT値を指すポインタを格納するためのデータ領域。

標準クラス

COBOL2002のオブジェクト指向機能で，言語仕様としてあらかじめ定義されたクラスのこと。BASEクラスがある。

標準権限

標準ユーザに与えられる権限。故意に，または誤ってシステムに変更を加える許可を持たない。

標準ユーザ

WindowsのUsersグループに属するアカウント。

表要素

表中の繰り返す項目の組に属する1個のデータ項目。

ビルド

プロジェクトに登録されたソースファイルや定義ファイルから実行可能ファイルを生成する方法。ビルドの対象となるファイルは，変更のあったファイルだけである。

ファクトリオブジェクト

一つのクラス中のすべてのオブジェクトが共有するデータ（ファクトリデータ）とそれを操作するためのメソッド（ファクトリメソッド）から成るオブジェクト。ファクトリオブジェクトは，実行単位の開始によって生成され，実行単位が終了すると消滅させられる。

ファクトリデータ

一つのクラス中のすべてのオブジェクトが共有するデータのこと。ファクトリメソッドによって操作される。

ファクトリメソッド

ファクトリデータを操作するためのメソッド。

プログラム

プログラム定義，メソッド定義，および関数定義の総称。実行時要素ともいう。

プロジェクト

実行可能ファイル，ダイナミックリンクライブラリ（DLL），または標準ライブラリを作成するための資源を一括して管理するための概念。一つのプロジェクトは，一つの実行可能ファイル，DLL，または標準ライブラリに対応している。

ポリモルフィズム（polymorphism）

一般的には，ある一つの指示に対して異なるさまざまな動作をとれる特徴を指す。オブジェクト指向では，同じメッセージでも受け取るオブジェクトのクラスが異なれば，動作が異なる特徴のことをいう。

（マ行）

マルチスレッド

プログラム内の仕事を，スレッドという単位に分けて実行する方式。複数のプログラムを並列に実行できる。

見た目幅

Unicode機能の組み込み関数で使用する，文字の見た目の幅。半角文字の幅は1，全角文字の幅は2として扱う。

Unicode機能の組み込み関数で，文字を見た目幅で数える場合に使用する。

メインフレーム

大規模な業務システムなどに用いられる汎用大型コンピュータ。

メソッド（method）

オブジェクトで使用できるインタフェース（メソッド原型という）とそのサービスの実装を定義した手続きのこと。オブジェクト間のやり取りは，すべてメソッドを通して行われる。メソッドには，ファクトリメソッドおよびインスタンスメソッドの2種類がある。

メソッド原型（method prototype）

メソッドを定義する際，メソッドで使用できるインタフェースを定義した部分。メソッド原型は，メソッド名と，パラメタおよび戻り値から成る。

メソッドの呼び起こし（method invocation）

オブジェクトに対してメソッドを呼び起こすこと。COBOL2002では，INVOKE文によってメソッドを呼び起こす。

メッセージ（message）

オブジェクトに対して送られる要求のこと。メッセージは，「受け手」「メソッド」「パラメタ」から成る。COBOL2002のオブジェクト指向機能では，INVOKE文によってメッセージをオブジェクトに送り，適切なメソッドを呼び起こす。

（ヤ行）

呼び出し先プログラム

CALL文の対象となるプログラムで，実行時に呼び出し元プログラムと組み合わされて1個の実行単位となる。活性化されるプログラムともいう。

呼び出し元プログラム

CALL文を実行してほかのプログラムを呼ぶプログラム。活性化するプログラムともいう。

弱い型付け

STRONG指定のないTYPEDEF句によってデータ型を宣言すること。

（ラ行）

ラージファイル形式

2GBを超えて操作できる形式の索引順編成ファイルのこと。使用できるファイルシステムはNTFSである。

リポジトリ段落（repository）

構成節中に指定する。リポジトリ段落に指定したクラス名，インタフェース名，および利用者定義関数名は，そのリポジトリ段落を含んでいるプログラム定義，クラス定義，インタフェース定義，または関数定義中で有効となる。

リポジトリファイル（repository file）

クラス定義，インタフェース定義，および関数定義の定義情報を格納するファイル。コンパイル対象のソースファイルごとに生成する。

例外処理

手続き文の実行中に発生したエラーに対して処理する機能のこと。

索引

記号

_beginthreadex[1]

_endthreadex[1]

.bkf〔バックアップファイル〕[1]

.cbc〔COPY関連づけファイル〕[1]

.cbd〔EXPORTS名称ファイル〕[1]

.cbe〔2項関係情報ファイル〕[1]

.cbf[1]、[2]

.cbl[1]、[2]

.cbl〔COBOL UAP引数定義ファイル〕[1]

.cbl〔COBOLソースファイル〕[1]

.cbl〔XMLアクセス用ステータス定義〕[1]

.cbl〔XMLアクセス用データ定義〕[1]

.cbl〔XMLアクセスルーチン〕[1]

.cbo〔オブジェクト関連づけファイル〕[1]

.cbp[1]

.cbp〔プログラム情報ファイル〕[1]

.cbr〔実行環境ファイル〕[1]

.cbs[1]

.cbs〔擬似プログラム用プログラム情報ファイル〕[1]

.cbw[1]、[2]、[3]

.cbw〔stdcall呼び出し指示ファイル〕[1]

.cet〔プログラムテンプレートファイル〕[1]

.cex〔COBOLエディタ設定ファイル〕[1]

.class〔Cosminexus上Java実行ファイル〕[1]

.cll〔カバレージ情報リストファイル〕[1]

.cnl〔カウント情報リストファイル〕[1]

.cno〔実行結果出力ファイル（カウント情報の表示）〕[1]

.cob[1]、[2]、[3]

.csv〔ソース解析情報ファイル〕[1]

.cvo〔実行結果出力ファイル（カバレージ情報の蓄積）〕[1]

.cxc〔カタログファイル〕[1]

.cxd〔XMLデータ定義ファイル〕[1]

.def[1]、[2]、[3]

.def〔モジュール定義ファイル〕[1]

.dll[1]

.dll〔DLLファイル〕[1]

.drf〔データレコードファイル〕[1]

.drl〔データレコードファイル〕[1]

.dtd〔XML文書型定義ファイル〕[1]

.exe[1]

.exe〔実行可能ファイル〕[1]

.exp〔エクスポートファイル〕[1]

.flf〔ファイル定義ファイル〕[1]

.hmf[1]

.hmf〔プロジェクトマスタファイル〕[1]

.hmp〔プロジェクト情報ファイル〕[1]

.html〔ソース解析情報ファイル〕[1]

.java〔COBOLアクセス用Bean（Javaソースファイル）〕[1]

.java〔EJB関連Javaソースファイル〕[1]

.k01〔主キーファイル〕[1]

.k02〜.k99〔副キーファイル〕[1]

.kdf〔キー定義ファイル〕[1]

.kdl〔キー定義ファイル〕[1]

.l01〔主キーファイル〕[1]

.l02〜.l99〔副キーファイル〕[1]

.lib[1]

.lib〔ライブラリファイル〕[1]

.lst[1]

.lst〔コンパイルリストファイル〕[1]

.obj[1]

.obj〔オブジェクトファイル〕[1]

.ocb[1]、[2]、[3]

.ocf[1]、[2]、[3]

.pkg〔パッケージ情報ファイル〕[1]

.prt〔印刷書式情報ファイル〕[1]

.rc[1]、[2]、[3]、[4]

.rc〔リソース定義ファイル〕[1]

.rdf〔レコード定義ファイル〕[1]

.rep[1]

.rep〔リポジトリファイル〕[1]

.res[1]、[2]

.res〔リソースファイル〕[1]

.sai〔ソース解析情報ファイル〕[1]

.svw〔COBOLサービスルーチンファイル〕[1]

.tag〔タグファイル〕[1]

.tdi〔TDコマンド格納ファイル（中断点情報）〕[1]

.tds〔TDコマンド格納ファイル（中断点情報）ファイル（シミュレーション情報）〕[1]

.usw〔ユーザキーワードファイル〕[1]

.wdf〔画面定義ファイル〕[1]

.xml〔XML文書型定義ファイル〕[1]

.xml〔デプロイ情報（DDファイル）〕[1]

%変数名%[1]

-?[1]、[2]、[3]、[4]、[5]

-ALLOWBIND[1]

-BigEndian[1]

-BigEndian,Bin[1]

-Bin1Byte[1]

-BinExtend[1]

-Cblctr[1]

-CBLVALUE[1]

-CheckUninitData[1]

-CmAster[1]

-CmDol[1]

-Comp5[1]

-Compati85[1]

-CompatiM7[1]

-CompatiV3[1]、[2]

-Compile[1]

-CVInf[1]、[2]

-d[1]

-DebugCompati[1]、[2]

-DebugData[1]、[2]

-DebugInf[1]、[2]

-DebugInf,Trace[1]

-DebugLine[1]、[2]

-DebugRange[1]、[2]

-DEF[1]、[2]

-DEFAULTLIB[1]

-DefFile[1]

-Define[1]

-Defineオプション[1]

-Details[1]

-DigitsTrunc[1]

-Dll[1]

-DLL[1]

-DllInit[1]

-DoubleQuote[1]

-DynamicLink[1]

-ENTRY[1]

-EquivRule[1]

-ErrSup[1]

-EXPORT[1]、[2]

-EXTRACT[1]

-fo[1]

-FORCE[1]

-FunctionECSup,CodeConvErr[1]

-h[1]

-H8Switch[1]

-HEAP[1]

-Help[1]、[2]

-i[1]

-IconFile[1]

-IgnoreAPPLY,FILESHARE[1]

-IgnoreLCC[1]

-IMPLIB[1]

-INCLUDE[1]、[2]

-IntResult,DecFloat40[1]

-IsamExtend[1]

-JPN[1]

-l[1]

-LARGEADDRESSAWARE[1]

-Lib[1]

-Lib,CUI[1]

-Lib,GUI[1]、[2]

-LIBPATH[1]、[2]

-Link[1]

-LIST[1]

-LiteralExtend[1]

-LowerAsUpper[1]

-Main[1]

-Main,System[1]

-Main,V3[1]

-MainNotCBL[1]、[2]、[3]、[4]

-Mainオプションが指定されたプログラム[1]

-MANIFEST[1]

-ManifestFileExt[1]

-MANIFESTUAC[1]

-MAP[1]

-MAPINFO[1]

-MaxDigits38[1]

-MinusZero[1]

-MultiThread[1]、[2]

-n[1]

-NODEFAULTLIB[1]、[2]

-NumAccept[1]、[2]、[3]

-NumCsv[1]

-OldForm[1]

-OpenTP1[1]

-Optimize[1]

-Optimize,0[1]

-Optimize,1[1]

-Optimize,2[1]

-Optimize,3[1]

-ORDER[1]

-OUT[1]、[2]

-OutputFile[1]

-PortabilityCheck[1]

-RDBTran[1]

-RDBTranオプションの指定とCOMMIT／ROLLBACK文の扱い[1]

-REMOVE[1]

-Repository[1]

-Repository,Gen[1]、[2]

-Repository,Sup[1]

-RepositoryCheck[1]、[2]

-ResrcFile[1]

-ScreenSpeed[1]

-SimIdent[1]

-SimMain[1]

-SimSub[1]

-SpaceAsZero[1]

-SQL[1]

-SQLDisp[1]

-SrcList[1]

-SrcList,CopyAll[1]

-SrcList,CopySup[1]

-SrcList,NoCopy[1]

-SrcList,OutputAll[1]

-SrcList,xxxxx,DataLoc[1]

-SrcList,xxxxx,NoFalsePath[1]

-STACK[1]

-Std2002[1]

-Std85[1]

-StdCall[1]

-StdCallFile[1]

-StdMIA[1]

-StdVersion[1]

-SUBSYSTEM[1]

-Switch[1]

-TDInf[1]、[2]

-TestCmd[1]

-TruncCheck[1]

-u[1]

-UniEndian[1]

-UniEndianオプション指定時の注意事項[1]

-UniEndianオプションと実行時環境変数CBLUNIENDIANの関係[1]

-UniObjGen[1]

-UniObjGenオプション指定時の注意事項[1]

-UniObjGenオプションと実行時環境変数CBLLANGの関係[1]

-UniObjGenオプションと-UniEndianオプションの関係[1]

-UscoreStart[1]

-v[1]

-V3ConvtName[1]

-V3ConvtNameオプションを指定したときの原文名定数の扱い[1]

-V3Rec[1]

-V3RecEased[1]

-V3RecFCSpace[1]

-V3Spec[1]

-VERBOSE[1]、[2]

-VERSION[1]

-VOSCBL[1]

-x[1]

-XMAP[1]

-XMAP,LinePrint[1]

数字

10進項目の2進項目化[1]

16進英数字定数[1]

1バイトの2進項目[1]

1文字入力する[1]

1文字を出力する[1]

2020のキーボードと106日本語キーボードとの対応表[1]

2項関係情報ファイル[1]

40けた10進浮動小数点形式[1]

64bitアプリケーションの作成[1]

9xの入出力状態[1]

A

ADD文[1]

AND[1]

ANSI（アメリカ規格）[1]

APIの合致レベル[1]

APPLY FORMS-NAME句[1]

APPLY FORMS-OVERLAY句[1]、[2]

argc[1]

argv[1]

AS[1]

ASCII[1]

ASSIGN句[1]

B

BASEクラス[1]

BEGIN DECLARE SECTION[1]

BOM[1]

BTMODIFY[1]

Btrieve（Pervasive.SQL）による索引編成ファイル[1]、[2]、[3]、[4]

BY CONTENT[1]

BY REFERENCE[1]

BY VALUE[1]

C

C0メジャー情報[1]

C1メジャー情報[1]

CALL[1]

CALL定数[1]、[2]

CALL文[1]、[2]

CALL文で直接システム関数を呼び出し[1]

CALL-CONVENTION段落[1]

CANCEL文[1]

CANCEL文実行後のプログラムの状態[1]

CBL_BATCH[1]

CBL_BTRPGSZ[1]、[2]

CBL_FLSRVDUMP[1]、[2]

CBL_RDBCOMMIT[1]、[2]

CBL_RDBSYS[1]

CBL_RECLOCKMAX[1]、[2]

CBL_STOPNOADV[1]、[2]

CBL_SYSCSVIN[1]、[2]、[3]

CBL_SYSCSVOUT[1]、[2]

CBL_SYSERR[1]

CBL_SYSIN[1]、[2]

CBL_SYSOUT[1]

CBL_SYSPUNCH[1]

CBL_SYSSTD[1]、[2]

CBL_UNINITDATA_BREAKOFF[1]

CBL_外部装置名[1]

CBL2KENV_CBLLIB[1]

CBL2KENV_LIB[1]

CBL2KENV_PATH[1]

cbl2krep[1]

CBLABN[1]

CBLABNCODE[1]

CBLABNLST[1]、[2]

CBLACTWIN[1]

CBLADTRM[1]

CBLARGC[1]

CBLARGV[1]

CBLATTRIBUTE[1]

CBLAUTOCLEAR[1]

CBLBELL[1]

cblbuild2kコマンド[1]、[2]

CBLCLOSE[1]、[2]

CBLCNSL[1]

CBLCNVERRORINFO[1]

CBLCOMCBR[1]

CBLCOPT[1]

CBLCOPT2002[1]、[2]

CBLCREATEOBJ[1]

CBLCSVCHAR[1]、[2]

CBLCSVINIT[1]、[2]

CBLCUR[1]

CBLD_ファイル名[1]

CBLDATADUMP[1]

CBLDATADUMPFILE[1]、[2]

CBLDATE[1]、[2]

CBLDAY[1]、[2]

CBLDBGINF[1]、[2]

CBLDDUMP[1]、[2]

CBLDELETE[1]、[2]

CBLDLTRM[1]

CBLEND[1]

CBLENDサービスルーチンによる終了[1]

CBLENTERCHK[1]

CBLERRMAX[1]

CBLEUDCFUNC[1]、[2]

CBLEXCEPT[1]

CBLEXEC[1]

CBLEXVALUE[1]、[2]

CBLF_ファイル名[1]、[2]

CBLFEP[1]

CBLFIX[1]、[2]、[3]

CBLFIXEDFORMLINE[1]

CBLFREE[1]、[2]、[3]

CBLFSYNC[1]、[2]、[3]

CBLGCINTERVAL[1]、[2]

CBLGCSTART[1]、[2]

CBLGDIINTERVAL[1]

CBLGDIWMSG[1]

CBLGET[1]

CBLGETOBJ[1]

CBLGETPROPERTY[1]

CBLGINT[1]、[2]

CBLHANDLE[1]

CBLIMEPOS[1]

CBLINITVALUE[1]

CBLINPUTDLG[1]

CBLIOMESSAGE[1]

CBLISAMDL[1]

CBLISAMLARGE[1]

CBLJCPOPENDKEY[1]

CBLLANG[1]

CBLLDLL[1]

CBLLIB[1]、[2]、[3]、[4]

CBLLINKER[1]

CBLLINKINTERVAL[1]

CBLLPROGDLL[1]

CBLM7ENDKEY[1]

CBLMANIFESTTOOL[1]

CBLMESSAGE[1]

CBLMETHODCALL[1]

CBLMQCLOSE[1]

CBLMQCREATE[1]

CBLMQDELETE[1]

CBLMQLOCATE[1]

CBLMQOPEN[1]

CBLMQRECEIVEMSG[1]

CBLMQSENDMSG[1]

CBLNCNV[1]

CBLNCNVサービスルーチン〔Unicode機能〕[1]

CBLNOCLOSE[1]

CBLOLE2INIT[1]

CBLOLE2UNINIT[1]

CBLONLYNUM[1]

CBLOPEN[1]、[2]

CBLOPS[1]

CBLOVERFLOW[1]

CBLP_ファイル名[1]、[2]

CBLPGMSEARCHTRC[1]

CBLPGMSEARCHTRC_SIZE[1]

CBLPIDIR[1]

CBLPRELOAD[1]

CBLPRMCHKW[1]

CBLPRNT_xxx[1]、[2]

CBLPRNTID[1]、[2]

CBLPRTEXCHR[1]、[2]

CBLPUT[1]

CBLPUTPROPERTY[1]

CBLRDBDATAERR[1]、[2]

CBLRDBILWAIT[1]

CBLRDBOPURGE[1]

CBLRDBROWVALCONSTRUCTOR[1]

CBLREAD[1]、[2]

CBLREP[1]、[2]

CBLRESOURCECOMPILER[1]

CBLREWRITE[1]、[2]

CBLSETCBLITEM[1]

CBLSETFIELD[1]

CBLSETTITLE[1]

CBLSETVARIANT[1]

CBLSGET[1]

CBLSORTSIZE[1]、[2]

CBLSORTWORK[1]、[2]

CBLSQLCOMMOD[1]、[2]

CBLSQLCURUSE[1]

CBLSQLDYNAMIC[1]

CBLSQLERROR[1]

CBLSQLLOGINTIMEOUT[1]

CBLSQLQUERYTIMEOUT[1]

CBLSQLROWCOUNT[1]

CBLSQLSETOPT[1]

CBLSQLSUPPRESSMSG[1]

CBLSQLWMSG[1]

CBLSTART[1]、[2]

CBLSTMCLOSE[1]

CBLSTMCREATE[1]

CBLSTMOPEN[1]

CBLSTMREAD[1]

CBLSTMWRITE[1]

CBLSYSLOG[1]

CBLSYSLOGLVL[1]

CBLSYSLOGSRV[1]

CBLSYSREP[1]

CBLTAB[1]、[2]

CBLTDEXEC[1]

CBLTERM_xxx[1]、[2]

CBLTERMID[1]、[2]

CBLTERMSHAR[1]、[2]

CBLTEXTSUPPRESSBOM[1]

CBLTEXTWRITESPACE[1]

CBLUBIT[1]

CBLUNDERDOT[1]

CBLUNIENDIAN[1]

CBLUNINITDATA_OUTRESULTLIST[1]

CBLUNINITDATA_OUTRESULTLISTDIR[1]

CBLUNLOCK[1]、[2]

CBLUPDOWNMOVE[1]

CBLUPSI[1]、[2]

CBLV3UNICODE[1]

CBLVALUE[1]、[2]

CBLVARIANTINF[1]

CBLWDISK[1]、[2]

CBLWRITE[1]、[2]

CBLX_外部装置名[1]、[2]

CBLXMAPERROR[1]

CBL-CTR特殊レジスタ[1]

ccbl2002コマンド[1]、[2]

ccbl2002コマンドに指定するオプション列[1]

ccbl2002コマンドのヘルプ[1]

ccblコマンド[1]、[2]

ccblコマンドに指定するオプション列[1]

cdecl呼び出し規約[1]

CHARACTER TYPE句[1]、[2]

cl[1]

CLOSE[1]

COBOL2002 Developer Professional[1]、[2]

COBOL2002 Net Client Runtime[1]

COBOL2002 Net Client Suite[1]

COBOL2002 Net Developer[1]

COBOL2002 Net Server Runtime[1]

COBOL2002 Net Server Suite[1]

COBOL2002 V5への移行性と互換性[1]

COBOL2002仕様[1]

COBOL2002情報抽出ツール[1]

COBOL2002で追加された機能[1]

COBOL2002でのオブジェクト指向機能[1]

COBOL2002の概要[1]

COBOL2002の機能[1]

COBOL2002の構成[1]

COBOL85および旧バージョンのCOBOL2002からの移行性と互換性[1]

COBOL85形式のコンパイラオプション[1]

COBOL85とCOBOL2002のコンパイラオプションの対応[1]

COBOL85版Cosminexus連携の移行性と互換性[1]

COBOL85版XML連携の移行性と互換性[1]

COBOL UAP引数定義ファイル[1]

COBOLアクセス用Bean[1]

COBOLエディタ[1]

COBOLエディタ設定ファイル[1]

COBOLエラー詳細情報[1]

COBOLからCを呼ぶときの規則[1]

COBOL言語で使用できるJava言語のデータ型[1]

COBOL原始プログラムのコンパイル[1]

COBOL原始プログラムの正書法[1]

COBOLコマンドプロンプト[1]

COBOLコマンドプロンプトの環境変数の状態[1]

COBOLコマンドプロンプトの起動と終了[1]

COBOLサービスルーチンファイル[1]

COBOL実行環境の終了方法[1]

COBOL実行単位の終了[1]

COBOL主プログラム[1]

COBOL主プログラムと副プログラム[1]

COBOLソースの作成[1]

COBOLソースファイル[1]、[2]

COBOLで使用するファイル[1]

COBOL入出力サービスルーチン[1]

COBOL入出力サービスルーチンが対応している機能[1]

COBOL入出力サービスルーチンで出力されるエラーメッセージ番号[1]

COBOL入出力サービスルーチンでのディスク書き込み保証[1]

COBOL入出力サービスルーチンでの複数レコード施錠[1]

COBOL入出力サービスルーチンのインタフェース[1]

COBOL入出力サービスルーチンの使用例[1]

COBOL入出力サービスルーチンの制限事項[1]

COBOL入出力サービスルーチンを使用するときの注意事項[1]

COBOLの概要[1]

COBOLの実行環境を終了させる[1]

COBOLの実行単位[1]

COBOLのデータ項目とCプログラムの型の対応[1]、[2]

COBOLの特長[1]

COBOL副プログラム[1]

COBOLプログラムが使用するスタック領域[1]

COBOLプログラムからCプログラムを呼び出す方法[1]

COBOLプログラム間で値を返す場合の規則[1]

COBOLプログラムのデータ型とVisual Basicでの宣言[1]

COBOLプログラムのモード[1]

COLUMN句[1]

COMMIT[1]、[2]

COMMON[1]

COMPUTE文[1]

COMP-5[1]

CONNECT[1]

CONTINUE文[1]

COPY関連づけファイル[1]

COPY登録集[1]

COPY文による登録集原文の取り込み[1]

COPY文のREPLACING指定およびREPLACE文の作用対象[1]

COPY文の指定形式[1]

CORRESPONDING指定[1]

Cosminexus上Java実行ファイル[1]

Cosminexus連携機能[1]、[2]

CREATEOBJメソッド[1]

CRT STATUS句[1]

CSVQUOTE[1]

CSVTABSEPARATED[1]、[2]

CSVWRITESPACE[1]、[2]

CSVファイルへのアクセス[1]

CSV編成ファイル[1]、[2]、[3]

CSV編成ファイルに数値データとして有効な文字の種類[1]

CSV編成ファイルのファイル編成とレコード形式[1]

CUIモード[1]

CUIモードのユーザプログラム[1]

CからCOBOLを呼ぶときの規則[1]

C言語との連携[1]

Cソースファイルのコンパイル[1]

CプログラムからCOBOLプログラムを呼び出す方法[1]

Cプログラムでの64bitアプリケーションの作成[1]

Cプログラムの型とCOBOLでの宣言[1]

D

DBMS[1]

DCシミュレーション[1]

DDファイル[1]

DEALLOCATE PREPARE[1]

DECLARE CURSOR[1]

DEFINED条件[1]

DEFINE指令[1]

DELETE[1]

DISCONNECT[1]

DISPLAY文によるデータの出力[1]

DIVIDE文[1]

DLL[1]、[2]

DLL検索フォルダ[1]

DLL自動ロード機能[1]

DLLに含まれるプログラムの呼び出し[1]

DLLに含まれるプログラムの呼び出し方法[1]

DLLの概要[1]

DLLの作成[1]

Dllの属性をcdeclにする[1]

Dllの属性をfastcallにする[1]

Dllの属性をstdcallにする[1]

DLLファイル[1]

DML情報エリアの詳細[1]

E

EBCDIC[1]

EBCDIK[1]

EC-ALL[1]、[2]

EC-ARGUMENT[1]

EC-ARGUMENT-FUNCTION[1]

EC-ARGUMENT-IMP[1]

EC-BOUND[1]

EC-BOUND-ODO[1]

EC-BOUND-REF-MOD[1]

EC-BOUND-SUBSCRIPT[1]

EC-DATA[1]

EC-DATA-PTR-NULL[1]

EC-FLOW[1]

EC-FLOW-GLOBAL-EXIT[1]

EC-FLOW-GLOBAL-GOBACK[1]

EC-FLOW-IMP[1]

EC-FLOW-RELEASE[1]

EC-FLOW-RETURN[1]

EC-FLOW-USE[1]

EC-I-O[1]

EC-I-O-AT-END[1]

EC-I-O-EOP[1]

EC-I-O-EOP-OVERFLOW[1]

EC-I-O-IMP[1]

EC-I-O-INVALID-KEY[1]

EC-I-O-LINAGE[1]

EC-I-O-LOGIC-ERROR[1]

EC-I-O-PERMANENT-ERROR[1]

EC-OO[1]

EC-OO-CONFORMANCE[1]

EC-OO-EXCEPTION[1]

EC-OO-IMP[1]

EC-OO-METHOD[1]

EC-OO-NULL[1]

EC-OO-RESOURCE[1]

EC-OO-UNIVERSAL[1]

EC-OVERFLOW[1]

EC-OVERFLOW-STRING[1]

EC-OVERFLOW-UNSTRING[1]

EC-PROGRAM[1]

EC-PROGRAM-ARG-MISMATCH[1]

EC-PROGRAM-CANCEL-ACTIVE[1]

EC-PROGRAM-IMP[1]

EC-PROGRAM-NOT-FOUND[1]

EC-PROGRAM-RECURSIVE-CALL[1]

EC-PROGRAM-RESOURCES[1]

EC-RAISING[1]

EC-RAISING-NOT-SPECIFIED[1]

EC-RANGE[1]

EC-RANGE-INSPECT-SIZE[1]

EC-RANGE-INVALID[1]

EC-RANGE-PERFORM-VARYING[1]

EC-RANGE-SEARCH-INDEX[1]

EC-RANGE-SEARCH-NO-MATCH[1]

EC-SIZE[1]

EC-SIZE-EXPONENTIATION[1]

EC-SIZE-OVERFLOW[1]

EC-SIZE-TRUNCATION[1]

EC-SIZE-UNDERFLOW[1]

EC-SIZE-ZERO-DIVIDE[1]

EC-SORT-MERGE[1]

EC-SORT-MERGE-IMP[1]

EC-SORT-MERGE-RELEASE[1]

EC-SORT-MERGE-RETURN[1]

EC-USER[1]

EC-USER-[1]

EC-USER-（ユーザ定義例外名）[1]

EJB関連Javaソースファイル[1]

END DECLARE SECTION[1]

ESC/Pモード印刷[1]

ESC/Pモード印刷を利用したプリンタへの出力例[1]

EVALUATE指令[1]

EVALUATE指令の例[1]

EVALUATE文[1]

EXCEPTION-FILE関数[1]

EXCEPTION-LOCATION関数[1]

EXCEPTION-OBJECT[1]

EXCEPTION-STATEMENT関数[1]

EXCEPTION-STATUS関数[1]

EXECUTE[1]

EXECUTE IMMEDIATE[1]

EXIT文[1]

EXIT文，GOBACK文のRAISING指定による例外の伝播[1]

EXPORTS文[1]

EXPORTS名称ファイル[1]

EXPORTファイル[1]

EXTERNAL句[1]、[2]

EXTERNAL句を用いたデータの共用[1]

EXTERNAL属性チェック[1]

F

fastcall呼び出し規約[1]

FETCH[1]

FILE STATUS句[1]

FLAG-85指令[1]

FSYNC[1]、[2]

G

GDIモード印刷[1]

GetCurrentThreadId[1]

GETOBJメソッド[1]

GET PROPERTY[1]

GETプロパティメソッド[1]

GLOBAL句[1]

GOBACK文[1]

GOBACK文による終了[1]

GO TO文[1]

GUIモード[1]、[2]

GUIモードのユーザプログラム[1]

H

HEAPSIZE文[1]

HiRDBによる索引編成ファイル[1]

HTML[1]

I

ICON文[1]

IF指令[1]

IF指令の使用例[1]

IF文[1]

IMPLEMENTS句[1]

INHERITS句[1]

INITIALIZE文[1]

INITIAL句[1]

INSERT[1]

INSPECT文[1]

INTERFACE-ID[1]

ISAM[1]、[2]

ISAMDL[1]

ISAMLARGE[1]

ISAMPREV[1]

ISAMによる索引編成ファイルでのラージファイル入出力機能[1]

ISAMユティリティ[1]

ISO（国際規格）[1]

IVS[1]

J

java[1]

javac[1]

javah[1]

Javaアプリケーションサーバ[1]

Javaインタプリタ[1]

Javaクラス[1]

Java言語[1]

Java言語とCOBOL言語のデータ型の対応[1]

Javaソースファイル[1]

Javaソースファイルのコンパイル[1]

Javaソースプログラムの作成[1]

Javaとの連携[1]

Javaの文字列型をCOBOLで使用する方法[1]

Javaバイトコードファイル[1]

Javaプログラム[1]

JavaプログラムからCOBOLプログラムを呼び出す方法[1]

JCPOPUP[1]

JIS（日本工業規格）[1]

JIS仕様[1]

JXBSAID[1]

L

LIB[1]、[2]、[3]

LIBRARY文[1]

LINE句[1]

LISTING指令[1]、[2]

M

MIA仕様[1]

MIAバージョン1.3仕様を範囲外チェック[1]

MIAバージョン1.4仕様の範囲外チェック[1]

MOVE文[1]

MSMQアクセス機能[1]

MSMQアクセス機能（Unicode機能）[1]

MSMQアクセスサービスルーチン[1]

MSMQアクセスサービスルーチンの一覧[1]

MSMQアクセスサービスルーチンのインタフェース[1]

MSMQアクセスサービスルーチンの実行順序[1]

MSMQアクセスサービスルーチンの使用例[1]

MSMQの概要[1]

MULTIPLY文[1]

N

NAME文[1]

NEWメソッド[1]

NOBTMODIFY[1]

NOCSVQUOTE[1]、[2]

NOCSVTABSEPARATED[1]

NOCSVWRITESPACE[1]

NOFSYNC[1]、[2]

NOISAMDL[1]

NOISAMLARGE[1]

NOISAMPREV[1]

NOSAMAADV[1]

NOSAMBADV[1]

NOSAMPADV[1]

NOTEXTSUPPRESSBOM[1]

NOTEXTWRITESPACE[1]

O

ODBC SQLデータ型に対応したCOBOLのデータ記述[1]

ODBCインタフェース[1]、[2]

ODBCインタフェース機能[1]、[2]、[3]、[4]

ODBCインタフェース機能が動作する環境[1]

ODBCドライバ[1]

ODBCの合致レベル[1]

ODBCメッセージ[1]

ODBCレコード定義生成[1]

OLE2オートメーション機能[1]

OLE2オートメーション機能（Unicode機能）[1]

OLE2オートメーションクライアント機能[1]、[2]、[3]

OLE2オートメーションサーバ機能[1]

OLEアプリケーションの終了[1]

OLEオブジェクト[1]

OLEオブジェクト参照データ項目[1]

OLEオブジェクトの解放[1]

OLEオブジェクトの生成と取得[1]

OLEプロパティ[1]

OLEメソッド[1]

OLEメソッドが返すOLEオブジェクトを利用した参照[1]

OLEメソッドとOLEプロパティの操作[1]

OOCOBOLからの移行性[1]

OPEN[1]

OpenTP1[1]、[2]、[3]

OPEN文〔CSV編成ファイル〕[1]

OR[1]

P

PAGE指令[1]、[2]

PATH[1]、[2]

PCA[1]

PDCANCEL[1]

PDSWAITTIME[1]

PERFORM文[1]

PERFORM文の実行範囲[1]

PREPARE[1]

PRINTER[1]

PROPAGATE指令[1]、[2]

PROPERTY句[1]

R

RAISE文[1]

RAISING LAST指定[1]

RAISING指定[1]

RAISING指定による例外オブジェクトの伝播[1]

RDBの列のデータ型とCOBOLのデータ記述[1]

READ INTO[1]

READ文〔CSV編成ファイル〕[1]

READ文〔テキスト編成ファイル〕[1]

RECURSIVE句[1]

RELEASE文[1]

RESUME文[1]

RETURNING[1]

RETURN文[1]

RETURN-CODE特殊レジスタ[1]、[2]

REWRITE文〔テキスト編成ファイル〕[1]

ROLLBACK[1]、[2]

S

S1メジャー情報[1]

SAMAADV[1]

SAMBADV[1]

SAME AS句[1]

SAMPADV[1]

SEARCH文[1]

SELECT[1]

SELECT句[1]

SELF[1]

SET CONNECTION[1]

SET LAST EXCEPTION TO OFF[1]

SET PROPERTY[1]

SETプロパティメソッド[1]

SET文[1]、[2]、[3]

SORT[1]

SORT-CORE-SIZE[1]

SORT-FILE-SIZE[1]

SORT-MESSAGE[1]

SORT-MODE-SIZE[1]

SORT-RETURN[1]

SOURCE FORMAT指令[1]

SOURCE FORMAT指令による正書法の切り替え[1]

SQL[1]

SQLCA[1]

SQLCODE変数[1]、[2]

SQLCODE変数の値と意味[1]

SQLSTATE[1]

SQLエラーコード[1]

SQL宣言節[1]

SQLの合致レベル[1]

SQL文[1]

SQL文でエラーが発生した場合の対処方法[1]

SQL文のエラー処理[1]

SQL文の実行順序[1]

SQL連絡領域SQLCA[1]

STACKSIZE文[1]

stdcall[1]、[2]、[3]

stdcall呼び出し規約[1]、[2]

stdcall呼び出し指示ファイル[1]、[2]、[3]、[4]

stdcall呼び出し指示ファイルの作成規則[1]

stderr[1]、[2]、[3]

stdin[1]、[2]、[3]

stdout[1]、[2]、[3]

STOP RUN文による終了[1]

STOP文[1]

STRING文[1]

STRONG指定[1]

SUBTRACT文[1]

SUPER[1]

SYMBOLIC TERMINAL句の指定[1]、[2]

SYSPRT[1]

System指定メインプログラム[1]

T

TDコマンド[1]

TDコマンド格納ファイル[1]

TDコマンド格納ファイル（シミュレーション情報）[1]

TDコマンド格納ファイル（中断点情報）[1]

TEXTSUPPRESSBOM[1]

TEXTWRITESPACE[1]

TP1サーバ用Cosminexus連携機能[1]

TURN指令[1]、[2]

TURN指令と対象の例外名[1]

TURN指令と対象の例外名（EC-I-O例外名）[1]

TURN指令によるチェック[1]

TURN指令のチェックがON[1]

TURN指令の有効範囲[1]

TYPEDEF句[1]

U

UAC[1]

UCS-2[1]

UCS-4[1]

Unicode[1]

Unicode機能[1]

Unicode機能での制限事項[1]

Unicode機能の概要[1]

Unicode機能のサポート範囲[1]

Unicode機能の詳細[1]

Unicode機能の前提条件[1]

Unicodeシグニチャ[1]

Unicodeに対応する機能[1]

UNSTRING文[1]

UPDATE[1]

UPSI-0[1]

UPSI-1[1]

UPSI-2[1]

UPSI-3[1]

UPSI-4[1]

UPSI-5[1]

UPSI-6[1]

UPSI-7[1]

USAGE句項目の指定[1]

USE手続き[1]

USE文[1]

UTF-16[1]

UTF-8[1]

V

V3指定メインプログラム[1]

VALUE句のないデータ項目の初期値[1]

VARIANT値とCOBOLデータのやり取り[1]

VARIANTデータ項目[1]

VERSION文[1]

Visual BasicからCOBOLを呼び出すときの規則[1]

Visual Basicとの連携[1]

W

WDISK[1]、[2]

Webシステム連携機能[1]

WHENEVER[1]

Windows(x64) COBOL2002では使用できない機能[1]

Windows(x64) COBOL2002では使用できないコンパイラオプション[1]

Windows(x64) COBOL2002では使用できない実行時環境変数[1]

Windows(x64) COBOL2002では使用できないファイル編成[1]

Windows OS固有の注意事項[1]

Windowsリソース保護[1]

WITH DUPLICATES指定[1]

WRITE FROM[1]

WRITE文〔CSV編成ファイル〕[1]

WRITE文〔テキスト編成ファイル〕[1]

WRP[1]、[2]

X

XDM/RD[1]

XDM/SD[1]

XDM/SDプログラムのテスト方法の制限事項[1]

XDMによるデータベース操作シミュレーション機能[1]

XMAP3[1]

XMLアクセス用ステータス定義[1]

XMLアクセス用データ定義[1]

XMLアクセスルーチン[1]

XMLデータ定義ファイル[1]

XML文書型定義ファイル[1]

XML連携機能[1]

あ

アイコン[1]

アイコンデータファイル[1]

アイコンのリソース[1]

値渡し[1]

あとに指定した方のオプションが有効となる場合[1]

アドレスデータ項目を使った引数の受け取り[1]

アプリケーションデバッグ機能[1]

アプリケーションの主プログラム[1]、[2]、[3]

アプリケーションプログラムを起動する[1]

暗黙的なプロパティメソッド[1]

い

異常終了[1]

異常終了時要約情報リスト[1]、[2]、[3]

移植性の良いプログラムの作成[1]

一意名指定のCALL文[1]

一般規則[1]

イベントログファイル出力機能[1]

入れ子のプログラム[1]

印刷サービス名称[1]

印刷サービス名称の指定[1]

印刷書式情報ファイル[1]

印刷書式番号[1]、[2]

印刷制御付き[1]

印刷文書名称[1]

インスタンスオブジェクト[1]、[2]

インスタンスオブジェクトの消滅[1]

インスタンスオブジェクトの生成[1]

インスタンス定義[1]

インスタンスデータ[1]

インスタンスメソッド[1]

インスタンスメソッドの呼び起こし[1]

インタフェース[1]、[2]、[3]

インタフェースエリアの詳細[1]

インタフェース定義[1]

インタフェースとクラスの適合[1]

インタフェースの実装[1]

インタフェースの定義[1]

インタフェースの利用[1]

インタフェース部分だけを作成した翻訳単位のコンパイル[1]

インタフェース領域[1]

インタフェース領域の形式[1]

インタフェース領域のダンプ出力[1]

インタフェースを使ったオブジェクトの使用[1]

インポート[1]

インポートライブラリ[1]、[2]

インポートライブラリの生成[1]

う

ウィンドウハンドル[1]

受け取り側作用対象[1]

内側のプログラム[1]、[2]

埋め込みSQL宣言節[1]

埋め込みSQL文[1]、[2]、[3]

埋め込みSQL文を使ったCOBOLプログラムの作成[1]

埋め込み型SQL[1]

埋め込み変数[1]

埋め込み例外宣言[1]

上書き（WRITE）モード[1]

え

英小文字[1]

英字項目[1]、[2]

英数字項目[1]、[2]

英数字定数の分離符[1]

英数字編集項目[1]、[2]

エイリアス[1]

エクスポート[1]

エクスポートファイル[1]

エラーコード値[1]

エラー発生後に検出した例外に対して例外チェックが無効な場合の動作[1]

エラー表示画面[1]、[2]

エラーメッセージの形式〔リポジトリ管理ツール〕[1]

エラーメッセージの内容〔リポジトリ管理ツール〕[1]

エラーリスト[1]、[2]

演算強さの軽減[1]

演算の中間結果[1]

お

送り出し側作用対象[1]

同じオプションを重複して指定した場合の規則[1]

オブジェクト[1]

オブジェクト関連づけファイル[1]

オブジェクト参照データ項目[1]

オブジェクト参照の適合チェック[1]

オブジェクト指向[1]、[2]

オブジェクト指向機能[1]、[2]

オブジェクト指向機能でのマルチスレッド対応[1]

オブジェクト指向でのインタフェース[1]

オブジェクト指向による継承[1]

オブジェクト指向による適合[1]

オブジェクト指向によるポリモルフィズム[1]

オブジェクト指向の紹介[1]

オブジェクトの構造[1]

オブジェクトの消滅[1]

オブジェクトの生成[1]

オブジェクトビュー[1]

オブジェクトファイル[1]、[2]、[3]、[4]

オブジェクトファイルの追加・変更[1]

オブジェクトファイルの取り出し[1]

オブジェクトプロパティ[1]、[2]

オプション[1]

オプション（ライブラリ管理ツール）[1]

オプション（リソースコンパイラ）[1]

オプション（リンカ）[1]

オプション概略の一覧[1]

オプション指定項[1]

オプションの打ち消し指定[1]

オプションを指定することによって，仮定されるオプション[1]

オプションを指定すると，ほかのオプションが無効となる場合[1]

オプション〔コンパイラ〕[1]

か

カーソルオプション[1]

カーソル宣言[1]

カーソルを移動する[1]

ガーベジコレクション[1]、[2]

外字[1]

開発環境のコンポーネント[1]

開発マネージャ[1]、[2]

開発マネージャからデバッガを起動する場合[1]

開発マネージャを使用した場合の登録集原文の検索順序[1]

回復可能メッセージ[1]

外部スイッチ[1]、[2]、[3]

外部スイッチの参照方法[1]

外部スイッチの初期化[1]

外部スイッチの変更[1]

外部属性（EXTERNAL句）[1]

外部属性を持つデータ項目の共用[1]

外部プログラム[1]

外部変数[1]

外部リポジトリ[1]

外部リポジトリに関連したコンパイルエラー発生時の対処方法[1]

カウント情報[1]

カウント情報リストファイル[1]

書き換え（ERASE）モード[1]

各実行単位の施錠形式[1]、[2]

拡張コード文字[1]

拡張子[1]

拡張子による検索順序[1]

拡張子による正書法の指定[1]

仮想端末の共用[1]

仮想端末名[1]、[2]

仮想端末名の仮定値を指定する環境変数[1]、[2]

仮想端末名を指定する環境変数[1]、[2]

型[1]

カタログファイル[1]

活性化されるプログラム[1]

活性化するプログラム[1]

活性状態[1]

カバレージ[1]

カバレージ情報[1]、[2]

カバレージ情報リストファイル[1]

カプセル化[1]、[2]

可変長項目のあとに固定長項目[1]

画面節（SCREEN SECTION）による画面機能[1]

画面節（SCREEN SECTIONおよびWINDOW SECTION）[1]

画面節（WINDOW SECTION）による画面機能[1]

画面定義[1]

画面定義ファイル[1]

画面データの送受信先[1]

画面に対する入出力[1]

画面入出力機能[1]

画面の座標指定[1]

画面の種類と構成[1]、[2]

画面の定義[1]

画面の表示モード[1]

環境設定のカスタマイズ[1]

環境変数[1]、[2]

環境変数CBL2KENV_CBLLIB[1]

環境変数CBL2KENV_LIB[1]

環境変数CBL2KENV_PATH[1]

環境変数CBLLIB[1]

環境変数LIB[1]

環境変数PATH[1]

環境変数指定[1]

環境変数設定時およびカスタマイズ時の注意事項[1]

環境変数の設定[1]

環境変数の取り扱い[1]

環境変数へのアクセス[1]

関数定義[1]

管理者権限[1]

管理者権限についての注意事項[1]

管理者ユーザ[1]

管理情報インタフェース領域[1]

き

キー数[1]

キー属性の指定[1]

キー定義ファイル[1]

キーの機能[1]、[2]

キー比較条件[1]

キーボードからの入力[1]

規格の互換性をチェックする翻訳指令[1]

擬似プログラム用プログラム情報ファイル[1]、[2]

既定義オブジェクト参照[1]

既定義オブジェクトを使用したメソッドの呼び起こし[1]

機能ごとの移行性と互換性に関する注意事項[1]

基本機能〔Unicode機能〕[1]

基本的な内部操作手続き文[1]

キュー[1]

キューイング[1]

旧形式のオプション[1]

キューの種類[1]

キューのパス名[1]

キューのパス名を検索する[1]

キューのパス名を検索するコーディングの例[1]

キューのラベル[1]

キューをオープンする[1]

キューをクローズする[1]

キューを削除する[1]

キューを削除するコーディングの例[1]

キューを作成する[1]

キューを作成するコーディングの例[1]

境界[1]

行制御出力[1]

共通式の削除[1]

共通実行環境ファイル[1]

共通属性プログラム[1]

共通例外処理[1]、[2]、[3]、[4]

共通例外処理に対応している機能[1]

共通例外処理の概要[1]

共通例外処理の機能[1]

共通例外処理の使用例[1]

共通例外処理の注意事項[1]

共通例外の仕組み[1]

共通例外の宣言手続き[1]

共有可能属性[1]

共有可能属性の初期値[1]

共有不可能属性[1]

共有不可能属性の初期値[1]

共用モード[1]

局所場所節[1]、[2]

局所場所節のデータ領域[1]

局所名[1]

く

空白文字，表意定数SPACE，および転記の空白詰めの文字コード[1]

組み込み関数[1]

組み込み関数を使用した例外情報の参照[1]

クラス[1]、[2]

クラス定義[1]、[2]

クラス同士またはインタフェース同士の適合[1]

け

警告音を鳴らす[1]

継承[1]、[2]、[3]

継承の使い方[1]

現行コネクションの変更の例[1]

原始プログラムの作成規則[1]

原始プログラムリスト[1]、[2]

原始文操作機能[1]

原文名[1]

原文名定数[1]

こ

構造型データベース[1]

構造型データベース（XDM/SD）操作シミュレーション[1]

構造化例外処理使用時の注意事項[1]

高速メッセージ[1]

構文規則[1]

コード変換失敗時の動作[1]

コード変換ライブラリ[1]

固定形式拡張子[1]

固定形式正書法[1]、[2]、[3]、[4]

古典的要素[1]

異なった文字集合間の比較[1]

コピー伝播[1]

コマンド行に指定した引数の個数[1]

コマンド行に指定した引数の内容[1]

コマンド行に指定する引数の形式[1]

コマンド行へのアクセス[1]

コマンドファイルを使った引数の指定方法[1]

固有情報エリアの詳細[1]

コンソールウィンドウ[1]

コンパイラ[1]

コンパイラオプション[1]、[2]、[3]

コンパイラオプションの一覧[1]

コンパイラオプションの一般規則[1]

コンパイラオプションの詳細情報[1]

コンパイラオプションの優先順位[1]

コンパイラ環境変数[1]、[2]

コンパイラ環境変数の一覧[1]

コンパイラの起動方法[1]

コンパイラの制限値[1]

コンパイラ付属機能[1]

コンパイル[1]、[2]、[3]

コンパイル時の主な入出力ファイル[1]

コンパイル時の制限事項[1]

コンパイル時の入出力の流れ[1]

コンパイルリスト[1]

コンパイルリストに関連する翻訳指令[1]

コンパイルリストの出力形式を指定する[1]

コンパイルリストの出力先[1]

コンパイルリストの出力に関連する翻訳指令[1]

コンパイルリストファイル[1]

コンパイル〔Unicode機能〕[1]

コンポーネントおよびコマンドでの環境設定[1]

コンポーネントの種類[1]

さ

サーバの最大待ち時間の設定[1]

サービスルーチン[1]

サービスルーチンの種類[1]

サービスルーチンを使ったOLE2オートメーションクライアント機能[1]

サービスルーチンを使った引数の受け取り[1]

再帰属性プログラム[1]

再帰呼び出し[1]

再帰呼び出しの例[1]

再コンパイル[1]、[2]

最終実行文情報[1]

最終生成物の種類（プロジェクトの種類）の設定[1]

最新例外状態[1]

最新例外状態のクリア[1]

再生成[1]、[2]

最外側のプログラム[1]、[2]

最適化機能[1]

最適化のレベル[1]、[2]

作業場所節[1]

作業場所節のデータ領域[1]

索引編成ファイル[1]

索引編成ファイルでのレコードの検索基準の相違[1]

索引編成ファイルに対するOPENモード[1]

サブオプション[1]

サブクラス[1]

差分カバレージ情報[1]

サロゲート[1]

算術演算機能[1]

算術演算機能の特徴[1]

算術文[1]

参照渡し[1]

し

識別子[1]

シグニチャ[1]

実行可能ファイル[1]、[2]、[3]、[4]

実行可能ファイルの起動方法[1]

実行可能ファイルの作成単位[1]

実行可能ファイルの実行権限についての注意事項[1]

実行可能ファイルの指定[1]

実行可能ファイル名の指定方法[1]

実行可能プログラム[1]

実行環境のコンポーネント[1]

実行環境ファイル[1]

実行結果出力ファイル（カウント情報の表示）[1]

実行結果出力ファイル（カバレージ情報の蓄積）[1]

実行される宣言手続き[1]

実行時エラーメッセージの出力先[1]

実行支援[1]

実行時環境変数[1]

実行時環境変数CBLLANGとCBLUNIENDIANの関係[1]

実行時環境変数で行制御を操作する方法[1]

実行時環境変数の一覧[1]

実行時環境変数の一覧〔64bitアプリケーションの作成〕[1]

実行時のカーソルの位置づけ[1]

実行時の制限事項[1]

実行時の注意事項[1]

実行時の動的割り当て[1]

実行時要素[1]

実行状態を示すコード[1]、[2]

実行時ライブラリ[1]

実行単位[1]

実行単位の終了方法[1]

実行方式[1]

実行〔Unicode機能〕[1]

実装インタフェースの適合チェック[1]

指標の繰り返し回数[1]

シフトJISで入出力する情報[1]

シフトJIS範囲外の文字[1]

シミュレーション情報[1]

ジャーナリング[1]

主／副プログラムシミュレーションで生成する擬似プログラム用プログラム情報ファイル[1]

自由形式拡張子[1]

自由形式正書法[1]、[2]、[3]、[4]

自由形式正書法で書かれたCOBOL原始プログラム[1]

自由形式正書法で指定できないコンパイラオプション[1]

自由形式のソース原文や登録集原文[1]

従来形式の例外処理[1]、[2]

終了キー[1]、[2]

終了キーとコードとの対応（1バイトコード）[1]

終了キーとコードとの対応（2バイトコード）[1]

終了コード[1]、[2]、[3]、[4]、[5]

主画面[1]、[2]

主キーファイル[1]

主プログラムシミュレーション機能[1]

主プログラムとして動作させる場合[1]

順序の比較[1]

順編成ファイル[1]

障害調査支援のコンポーネント[1]

昇格ダイアログボックス[1]

条件式[1]

条件式の評価の流れ[1]

条件分岐文[1]

条件変数[1]

条件翻訳結果のコンパイルリスト[1]

条件翻訳に関連する翻訳指令[1]

条件翻訳の利用[1]

照合順序[1]

小数点以下のけた数[1]

使用する文[1]、[2]

使用するメモリサイズ[1]

仕様チェックオプションを複数指定した場合[1]

使用できるファイル[1]

使用できるファイル形式[1]

使用できるファイルの種類[1]

使用できるファイル編成[1]

情報リスト[1]、[2]

少量入出力[1]

初期化属性プログラム[1]

初期化漏れチェック機能[1]

初期状態[1]

書式オーバレイ[1]

処理時間の短縮[1]

処理速度の速いプログラムの作成[1]

字類条件[1]

字類条件の判断基準と文字の大小関係[1]

新規作成[1]

新機能[1]

す

数字項目のけた拡張機能[1]

数字項目の定義や演算を工夫[1]

数字項目の入力方式[1]

数字項目の表示形式[1]

数字編集項目[1]、[2]

数字編集項目の入力方式[1]

数値の内部表現を意識したコーディング[1]

スーパクラス[1]

スキーマ定義[1]

スタックコンパイル機能[1]

スタック領域に配置されるデータ[1]

スタック領域のサイズ変更方法[1]

ストアドプロシージャ[1]、[2]

スレッドごとに環境変数を設定する[1]

スレッドごとに固有の出力ファイル名称を付ける[1]

スレッド識別子[1]

スレッド識別子の値[1]、[2]

スレッドを起動する関数[1]

せ

制御プログラム[1]

制御変数[1]

制御文字[1]

整合性チェック[1]

整合性チェックの警告エラー出力[1]

正書法[1]、[2]

正書法の決定の優先順位[1]

正書法の異なるプログラム間の複写[1]

静的なリンク[1]、[2]

静的に行う方法によるプログラムの例[1]

製品体系[1]

西暦日付の変更[1]

整列作業用ファイル[1]

整列処理のメモリサイズ[1]

整列併合機能[1]、[2]

セル[1]

セルデータを数値として入出力する[1]

セルデータをタブ文字区切りで入出力する機能[1]

宣言手続きからの復帰[1]

前バージョンからの変更点[1]

そ

送受信間の物理マップ[1]、[2]

送受信先の設定方法[1]

送信先の設定方法[1]

相対位置表示時の原始プログラムリスト[1]

相対編成ファイル[1]

添字[1]、[2]、[3]

ソース解析情報ファイル[1]、[2]

ソース原文の正書法を決定する翻訳指令[1]

ソース単位の定義によって記述できるデータ定義の種別[1]

ソースの作成方法[1]

ソースファイルとリポジトリファイルの関係[1]

ソースファイルの拡張子と正書法の種類の対応[1]

ソースファイル名[1]

ソースファイル名と拡張子[1]

そとPERFORM[1]

そとPERFORM文のインライン展開[1]

ソフトウェア例外[1]

た

第1次規格[1]、[2]

第2次規格[1]、[2]

第3次規格[1]、[2]

第4次規格[1]、[2]

ダイアログボックスから入力された文字列を受け取る[1]

大域属性（GLOBAL句）[1]

大域名[1]

大域名と局所名の有効範囲[1]

タイトルバー[1]

ダイナミックリンク機能[1]

ダイナミックリンク動作[1]

ダイナミックリンクライブラリ[1]、[2]

タイムアウト秒数の設定[1]

ダイヤモンド継承[1]

互いに参照し合う翻訳単位のコンパイル[1]

タグファイル[1]

他言語とのプログラム間連絡[1]

多重継承[1]

タブ文字[1]

単一レコード施錠[1]

単純継承[1]

単体テスト[1]

ダンプリスト[1]

ち

致命的例外[1]

中間結果[1]

中間結果のけた数[1]

中断点情報[1]

帳票データの送信先[1]

帳票の定義[1]

重複キー[1]

つ

通算日付の変更[1]

通常属性プログラム[1]

通常の入出力との互換性（ラージファイル入出力機能）[1]

通信節による画面機能[1]

強い型付け[1]

強く型付けされた項目[1]

て

定義の種類[1]

定義別のコンパイル方法とリポジトリファイル[1]

定数指定[1]

定数指定のCALL文[1]

定数指定の引数[1]

定数長拡張機能[1]

定数の畳み込み[1]

ディスク書き込みオプション[1]

ディスク書き込み保証[1]

データ有無コード[1]

データ型の定義と参照[1]

データ項目の型の対応[1]

データコミュニケーション機能[1]

データコミュニケーション機能の概要[1]

データコミュニケーション機能を使用したCOBOLプログラムの例[1]

データソースの管理[1]

データ属性の種類[1]

データ転記文[1]

データ転送[1]

データの後の空白文字を出力する機能[1]

データの入力方式[1]

データの比較[1]

データの表示形式[1]

データベースアクセス機能[1]

データベース管理システム[1]

データベース操作機能[1]

データベース操作シミュレーション[1]

データベース操作シミュレーション機能[1]

データベース操作文で内部的に展開されるCALL文[1]

データベース操作文で内部的に展開されるCALL文の引数[1]

データ名指定[1]

データ領域[1]

データ領域ダンプの出力条件[1]

データ領域ダンプリスト[1]

データ領域ダンプリストの出力先[1]

データ領域の種類[1]

データ例外検出機能[1]

データレコードファイル[1]

適合[1]、[2]

適合チェック[1]

テキスト編成ファイル[1]

テキスト編成ファイルのUnicodeシグニチャ出力の切り替え機能[1]

テキスト編成ファイルのファイル編成とレコード形式[1]

テストデバッガ[1]

手続き部見出しのRAISING指定[1]

手続き文[1]

手続き分岐[1]

デバッグ環境のコンポーネント[1]

デバッグ機能の種類と概要[1]

デバッグ行[1]

デバッグ情報[1]

デバッグ情報が出力されるタイミング[1]

デバッグ情報の出力例[1]

デバッグ情報の取得[1]

デバッグ情報へ出力されるインタフェース領域の種類[1]

デフォルトの印刷文書名称[1]

デプロイ情報[1]

伝播によって検出した例外に対して例外チェックが無効な場合の動作[1]

と

動的SQL[1]

動的長基本項目[1]

動的なリンク[1]、[2]

動的なリンクのプレロード機能[1]

動的なリンクのプログラム検索トレース機能[1]

動的に行う方法によるプログラムの例[1]

登録集環境変数[1]、[2]

登録集検索フォルダ[1]

登録集原文[1]、[2]、[3]、[4]

登録集原文の検索順序[1]

登録集原文の正書法[1]

登録集原文のファイル形式[1]

登録集原文ファイルの検索[1]

登録集名[1]、[2]

特殊レジスタ[1]

トラブルシュートに有効な資料[1]

トランザクション[1]、[2]

トランザクション管理機能[1]

トランザクション分離レベル[1]

取り消し後の呼び出し[1]

取り消し対象のプログラム[1]

取り消しで解放される資源[1]

取り消しの実行順序[1]

トレースオプション[1]

トレースバック情報[1]、[2]

ドロー[1]、[2]

な

内部プログラム[1]

内容渡し[1]

に

日本語EUC[1]

日本語項目[1]、[2]

日本語定数[1]

日本語編集項目[1]、[2]

日本語文字データの転記，比較[1]

日本語を含む原始プログラム[1]

入出力エラー[1]

入出力エラー処理[1]

入出力機能〔Unicode機能〕[1]

入出力状態[1]

入出力状態の値[1]、[2]

入出力データの変換[1]

入出力の流れ[1]

入力時の未使用項目の初期化機能[1]

入力文字とコード[1]

の

ノーマルファイル形式 [1]

は

ハードウェア例外[1]

配信不能メッセージ[1]

排他モード[1]

バイトオーダ[1]

バイトオーダマーク[1]

バイトストリーム入出力サービスルーチン[1]

バイトストリーム入出力サービスルーチンの概要[1]

バイトストリーム入出力サービスルーチンの説明[1]

背反関係にあるサブオプション同士を指定した場合[1]

廃要素[1]、[2]

バックアップファイル[1]

パッケージ情報ファイル[1]

パネル定義[1]、[2]

パラメタ[1]

パラメタインタフェース領域[1]

バリアントデータ項目[1]

範囲外チェック[1]、[2]、[3]

半角かたかな[1]

ひ

比較する項目の長さ[1]

引数の受け取り[1]

引数の受け取り方法[1]、[2]

引数の受け渡し[1]、[2]

引数の受け渡しの規則[1]

引数の受け渡しの種類[1]

引数の整合性チェック[1]

引数の引き渡し方法[1]

引数を値渡しで受け取る[1]

引数を値渡しで引き渡す[1]

引数を一括して取得する方法[1]

引数を個別に取得する方法[1]

引数をポインタ型で受け取る[1]

引数をポインタ型で引き渡す[1]

非致命的例外[1]

ビッグエンディアン形式[1]、[2]

日付や時刻を取得するACCEPT文[1]

ビットデータ[1]

表計算プログラムファイル[1]

表示速度を重視する[1]

表示モード[1]

標準エラー出力[1]、[2]、[3]

標準クラス[1]

標準権限[1]

標準コード文字[1]

標準出力[1]、[2]、[3]

標準転記によるACCEPT文[1]

標準入出力[1]

標準入力[1]、[2]、[3]

標準ユーザ[1]

標準ライブラリ[1]、[2]

表操作[1]

表要素[1]

ビルド[1]、[2]

ビルドとリビルド[1]

ふ

ファイル／レコード定義[1]

ファイル書き込み時のディスク書き込み保証の指定方法[1]

ファイル格納先についての注意事項[1]

ファイル共用[1]

ファイル共用を省略した場合の処理[1]

ファイルクローズ時のディスク書き込み保証の指定方法[1]

ファイルシェア[1]

ファイル属性の整合性チェック[1]

ファイル定義ファイル[1]

ファイル入出力機能[1]

ファイル入出力文でのエラー情報出力機能[1]

ファイルの移行性の注意事項[1]

ファイルの検索順序[1]

ファイルのディスク書き込み保証[1]

ファイルの排他・共用の区別[1]、[2]

ファイルの割り当て[1]

ファイル編成とレコード形式[1]

ファイルレベルのファイル共用[1]

ファイル割り当ての共通規則[1]

ファクトリオブジェクト[1]、[2]

ファクトリ定義[1]

ファクトリデータ[1]

ファクトリメソッド[1]

ファクトリメソッドの呼び起こし[1]

ファンクションキー入力結果の取得[1]

フォルダによる検索順序[1]

不活性状態[1]

副キーファイル[1]

複数レコード施錠[1]

副プログラムシミュレーション機能[1]

副プログラムとして動作させる場合[1]

復帰コードの値[1]

復帰コードの規則[1]

復帰コードの参照方法[1]

復帰コードの設定方法[1]

物理ファイル名[1]

物理マップ名[1]、[2]

浮動継続指示子[1]

負の符号を持つゼロ[1]

不変式のループ外移動[1]

不要な小数点[1]

プライマリスレッド[1]

プリンタ出力の識別[1]

プリンタに対する帳票出力[1]

プリンタへのアクセス[1]

プリンタへの出力と割り当て方法[1]

プログラミング上の留意点[1]

プログラム[1]

プログラムが異常終了した場合の終了コード[1]

プログラムからの連動実行[1]

プログラム間整合性チェック[1]

プログラム間の引数と返却項目[1]

プログラム間連絡[1]

プログラム原文領域[1]

プログラム互換性アシスタント[1]

プログラム実行時呼び出し関係に依存するスタック領域の消費量[1]

プログラム情報ファイル[1]、[2]、[3]、[4]

プログラム属性[1]

プログラム定義[1]、[2]

プログラム定義だけのコンパイル[1]

プログラムテンプレートファイル[1]

プログラムとファイル割り当ての関係[1]

プログラムのコンパイルと実行〔HiRDBによる索引編成ファイル〕[1]

プログラムの実行[1]

プログラムの実行環境の設定[1]

プログラムの実行環境の設定〔64bitアプリケーションの作成〕[1]

プログラムの実行状態[1]

プログラムの実行〔64bitアプリケーションの作成〕[1]

プログラムの取り消し[1]

プログラムの呼び出し[1]、[2]

プログラム名[1]

プロジェクト[1]

プロジェクト情報ファイル[1]

プロジェクトの概念と定義方法[1]

プロジェクトの種類[1]

プロジェクトマスタファイル[1]、[2]

ブロックカーソル[1]

へ

併合処理のメモリサイズ[1]

ヘッダの出力形式[1]

ヘッダファイル[1]

ヘルプ機能[1]

ヘルプ機能（オプション表示）[1]

返却項目[1]

ほ

報告書作成機能[1]、[2]

ポップアップ画面[1]

ポップアップ画面入出力機能[1]

ポップアップブロックカーソル画面[1]

ポリモルフィズム[1]、[2]、[3]

翻訳グループ[1]

翻訳グループを構成する定義の種類[1]

翻訳指令[1]

翻訳単位[1]

翻訳単位情報の表示[1]

翻訳単位の考え方[1]

翻訳変数名[1]

ま

マニフェストの埋め込み方法[1]

マニュアルの種類[1]

マルチスレッド[1]、[2]

マルチスレッド環境下でのファクトリデータ[1]

マルチスレッド環境下でのメソッドの実行[1]

マルチスレッド環境での実行[1]

マルチスレッド対応COBOLプログラム[1]、[2]

マルチスレッド対応COBOLプログラムが対応している機能[1]

マルチスレッド対応COBOLプログラムの開始と終了[1]

マルチスレッド対応COBOLプログラムの概要[1]

マルチスレッド対応COBOLプログラムのコンパイル[1]

マルチスレッド対応COBOLプログラムの生成[1]

マルチスレッド対応COBOLプログラムのデバッグ[1]、[2]

マルチスレッド対応COBOLプログラムをGUIモードで使用する方法[1]

マルチスレッド対応COBOLプログラムを使用する上での注意事項[1]

み

見た目幅[1]

め

明示的なプロパティメソッド[1]

明示的な例外の引き起こし[1]

メインファイルを指定する[1]

メインフレーム[1]、[2]

メインプログラムなし[1]

メソッド[1]

メソッド原型[1]

メソッド原型定義[1]

メソッド定義[1]

メソッドに渡す引数[1]

メソッドの検索[1]

メソッドの呼び起こし[1]、[2]、[3]

メソッド名[1]

メソッド呼び起こしの適合[1]

メタキャラクタ[1]

メッセージ[1]、[2]

メッセージクラス[1]

メッセージの配信方法[1]

メッセージの優先順位[1]

メッセージのラベル[1]

メッセージパッシング[1]、[2]

メッセージを受信する[1]

メッセージを受信するコーディングの例[1]

メッセージを送信する[1]

メッセージを送信するコーディングの例[1]

メモリサイズ[1]

メモリサイズと処理時間[1]

も

モードの決定方法[1]

文字コードについての注意事項[1]

文字コードを変換するプログラム例[1]

文字の大小関係[1]

文字幅を整えた文字列の出力[1]

モジュール定義ファイル[1]、[2]、[3]、[4]

モジュール定義ファイルの記述規則[1]

モジュール定義文[1]

モジュール定義文とリンカオプションとの関係[1]

文字列操作文[1]

文字列の出力[1]

戻り値[1]、[2]、[3]

戻り値の受け渡し[1]、[2]

戻り値の使い方[1]

ゆ

有効けた数[1]

ユーザキーワードファイル[1]

ユーザ指定の印刷文書名称[1]

ユーザポップアップHELP画面[1]

ユーザポップアップHELP機能[1]

よ

用途DISPLAYと用途NATIONALとの間の変換[1]

呼び出し規約[1]

呼び出し先プログラム[1]

呼び出してはいけないサービスルーチン[1]

呼び出し元プログラム[1]

呼び出し元プログラムトレース[1]

弱い型付け[1]

弱く型付けされた項目[1]

ら

ラージファイル形式 [1]

ラージファイル入出力機能[1]

ラージファイル入出力機能でのファイルの共用[1]、[2]

ラージファイル入出力機能の概要[1]

ラージファイル入出力機能の制限事項[1]

ライブラリ[1]、[2]、[3]

ライブラリ管理ツール[1]、[2]

ライブラリ管理ツールオプション[1]

ライブラリの結合[1]

ライブラリの検索[1]

ライブラリの指定[1]

ライブラリファイル[1]、[2]

り

リストの出力[1]

リストの見方[1]

リソースコンパイラ[1]、[2]

リソースコンパイラオプション[1]

リソース定義ファイル[1]、[2]、[3]、[4]、[5]

リソース定義文[1]

リソースデータファイル[1]

リソースファイル[1]、[2]、[3]、[4]

リトルエンディアン形式[1]

リビルド[1]

リポジトリ管理ツール[1]

リポジトリ管理ツール使用時のエラーメッセージ[1]

リポジトリ管理ツールの終了コード[1]

リポジトリ段落[1]

リポジトリ段落でほかの翻訳単位を参照する場合のコンパイル[1]

リポジトリ段落を指定したソースファイルのコンパイル方法[1]

リポジトリファイル[1]、[2]、[3]

リポジトリファイルとリポジトリ段落の関係[1]

リポジトリファイルに格納される情報[1]

リポジトリファイルの管理[1]

リポジトリファイルの検索[1]

リポジトリファイルの参照方法[1]

リポジトリファイルの生成[1]

リポジトリファイルの生成に関連するコンパイラオプション[1]

リポジトリファイルの生成方法[1]

リポジトリファイルの単独生成[1]

リポジトリファイルを使用するCOBOLプログラム開発の概要[1]

リポジトリファイルを使用するCOBOLプログラムの作成手順[1]

リポジトリファイル〔CBLREP〕[1]

リポジトリファイル〔CBLSYSREP〕[1]

リポジトリファイル〔-Repository,Gen〕[1]

リモートファイルアクセス機能[1]、[2]

利用者定義関数[1]、[2]

利用者定義関数の参照[1]

利用者定義関数の注意事項[1]

利用者定義関数の引数と返却項目[1]

利用者定義関数の引数の扱い[1]

利用者定義例外名[1]

リレーショナルデータベース[1]

リレーショナルデータベース（XDM/RD）操作シミュレーション[1]

リレーショナルデータベース（XDM/RD）操作シミュレーション機能[1]

リンカ[1]、[2]、[3]

リンカオプション[1]、[2]、[3]

リンクの指定[1]

リンケージを行わない[1]

る

ループの削除[1]

れ

例外[1]、[2]

例外オブジェクト[1]、[2]

例外が検出される文[1]

例外が検出される文の詳細[1]

例外検出での注意事項[1]

例外種別[1]

例外情報の参照[1]

例外処理[1]、[2]

例外処理に関連する翻訳指令[1]

例外処理の動作[1]

例外宣言[1]

例外チェックが無効な場合の動作[1]

例外の検出条件[1]

例外の自動伝播[1]

例外の致命度[1]

例外の伝播[1]

例外名[1]

例外名の一覧[1]

例外名のレベル[1]

例外を受け取れないプログラムに例外を伝播させた場合の動作[1]

例外を検出する組み込み関数[1]

レコード施錠[1]

レコード単位アクセスモード[1]

レコード定義ファイル[1]

レコードの検索基準[1]

レコード末尾の空白文字を出力する機能[1]

レコードレベルのファイル共用[1]

連続コンパイル機能[1]

連絡節のデータ領域[1]

ろ

論理演算[1]