こんにちは、ベテランCOBOLプログラマーの〇〇(あなたの名前)です。
今回は、モダンCOBOL(COBOL2002以降)で開発をしていると、誰もが一度は「あれ?なんでこれエラーになるんだ?」と首をかしげるであろう、ちょっとした落とし穴についてお話しします。
それは、「NATIONAL項目に数字を直接MOVEできない」という制約です。
「え?数字なんだから普通にMOVEできるんじゃないの?」と思ったあなた、ごもっともです。しかし、そこにはCOBOLが持つ「型の安全性」と「文字コード化け防止」という重要な思想が隠されているのです。
1. 導入: なぜこのTipsが重要なのか?
COBOLで国際化対応や多言語対応を進める上で、Unicode文字を扱うNATIONAL項目は避けて通れません。しかし、通常の数字項目や数値リテラル(例:123)を直接NATIONAL項目にMOVEしようとすると、コンパイルエラーになってしまいます。
このエラーは、開発中に頻繁に遭遇する可能性があり、その理由を知らないと解決に時間がかかってしまいます。この知識を身につけることで、モダンCOBOLでの開発をスムーズに進め、意図しない文字化けを防ぐことができるようになります。
2. 基礎知識: NATIONAL項目と文字コード
まずは、このテーマを理解するために必要な基礎知識を整理しましょう。
- NATIONAL項目 (PIC N USAGE NATIONAL)
- これは、Unicode文字を扱うためのデータ項目です。従来のCOBOLではShift_JISやEUC-JPといった特定の文字コードで文字を扱っていましたが、世界中のあらゆる言語に対応するためにはUnicodeが必須となります。
- NATIONAL項目は、通常、UTF-16などのUnicodeエンコーディングで文字を内部的に保持します。
- 数字リテラルと数字項目 (PIC 9)
- 数字リテラルとは、プログラムコード中に直接記述された数字のことです(例:
MOVE 123 TO ...の123)。 - 数字項目 (PIC 9) は、数値計算を目的としたデータ項目です。これらは内部的に数値として扱われ、文字コードとは直接関係ありません。
なぜ直接MOVEできないのか?
数字リテラルや数字項目は「数値」であり、NATIONAL項目は「Unicode文字」です。これらはデータとしての型が全く異なります。COBOLは、この型違いによる意図しない変換や文字化けを防ぐために、数値からNATIONAL項目への直接的なMOVEを許可していません。
例えば、「123」という数字をNATIONAL項目にMOVEしようとした時、システムは「123」をそのままUnicodeの文字「’1’」「’2’」「’3’」に変換すべきなのか、それとも全く別のUnicodeコードポイントに変換すべきなのか、判断に迷います。このような曖昧さをなくすために、明示的な変換が求められるのです。
3. 実装/解決策: FUNCTION NATIONAL-OF を使おう!
では、どのようにすれば数字をNATIONAL項目に転記できるのでしょうか?
その答えは、組み込み関数 FUNCTION NATIONAL-OF を使うことです。
FUNCTION NATIONAL-OF は、引数に与えられたデータを「文字データ」と解釈し、それをNATIONAL項目が扱うUnicode形式(通常はUTF-16)に変換してくれます。
論理的な流れとしては、以下のようになります。
1. 数字(例: 123)を、まず「文字としての数字」(例: ‘123’)として認識させる。
2. その「文字としての数字」を、FUNCTION NATIONAL-OF がUnicode形式に変換する。
3. 変換されたUnicode形式のデータをNATIONAL項目に転記する。
4. サンプルプログラム
以下のサンプルプログラムで、FUNCTION NATIONAL-OF の使い方を確認してみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. NATNUMMOV.
DATA DIVISION.
WORKING-STORAGE SECTION.
————————————————————–
- 01 数字項目:通常の数字を保持する項目です。
————————————————————–
01 WS-NUM PIC 9(5) VALUE 12345.
————————————————————–
- 01 文字項目:数字を文字として保持する項目です。
- FUNCTION NATIONAL-OFはこのような項目も変換できます。
————————————————————–
01 WS-NUM-STR PIC X(5) VALUE ‘67890’.
————————————————————–
- 01 NATIONAL項目:Unicode文字を保持する項目です。
————————————————————–
01 WS-NAT-NUM PIC N(5) USAGE NATIONAL.
01 WS-NAT-NUM-FROM-STR PIC N(5) USAGE NATIONAL.
PROCEDURE DIVISION.
MAIN-LOGIC SECTION.
DISPLAY ‘— NATIONAL項目への数値転記テスト —‘.
- — 良い例:FUNCTION NATIONAL-OF を使う —
- 数字項目(WS-NUM)の値をNATIONAL項目(WS-NAT-NUM)へ転記します。
- FUNCTION NATIONAL-OF を通すことで、数字がUnicode文字に正しく変換されます。
MOVE FUNCTION NATIONAL-OF(WS-NUM) TO WS-NAT-NUM.
DISPLAY ‘WS-NUM (数字項目): ‘ WS-NUM.
DISPLAY ‘WS-NAT-NUM (NATIONAL項目, FUNCTION NATIONAL-OF経由): ‘ WS-NAT-NUM.
DISPLAY ‘————————————‘.
- 文字項目(WS-NUM-STR)の値をNATIONAL項目へ転記します。
- こちらも FUNCTION NATIONAL-OF を通すことで、文字がUnicode文字に正しく変換されます。
MOVE FUNCTION NATIONAL-OF(WS-NUM-STR) TO WS-NAT-NUM-FROM-STR.
DISPLAY ‘WS-NUM-STR (文字項目): ‘ WS-NUM-STR.
DISPLAY ‘WS-NAT-NUM-FROM-STR (NATIONAL項目, FUNCTION NATIONAL-OF経由): ‘ WS-NAT-NUM-FROM-STR.
DISPLAY ‘————————————‘.
- — 悪い例(コンパイルエラーになります!) —
- 下記の行は、数値リテラルを直接NATIONAL項目にMOVEしようとしているため、
- コンパイルエラーが発生します。
- 実際にコンパイルする際は、コメントアウトを外さないでください。
- MOVE 123 TO WS-NAT-NUM.
- 下記の行は、数字項目を直接NATIONAL項目にMOVEしようとしているため、
- コンパイルエラーが発生します。
- 実際にコンパイルする際は、コメントアウトを外さないでください。
- MOVE WS-NUM TO WS-NAT-NUM.
DISPLAY ‘※注意:数値リテラルや数字項目を直接NATIONAL項目にMOVEすると’.
DISPLAY ‘ コンパイルエラーになります(上記コメントアウト部分参照)。’.
DISPLAY ‘ 必ず FUNCTION NATIONAL-OF を使いましょう。’.
DISPLAY ‘————————————‘.
STOP RUN.
このプログラムを実行すると、FUNCTION NATIONAL-OF を使った転記は正しく行われ、結果が表示されます。コメントアウトされた部分を有効にしてコンパイルしようとすると、コンパイラがエラーを報告するはずです。
5. 応用・注意点: 現場で役立つ補足情報
- 型の安全性と文字コード化けの防止
この制約は、COBOLが「型の安全性」を重視している証拠です。安易な暗黙的変換を許さず、プログラマに明示的な変換を促すことで、意図しないデータ破壊や文字コード化けを防いでいます。特に国際化対応では、文字コードの扱いは非常にデリケートなので、この厳格なルールは非常に重要です。
- モダンCOBOLの標準的な挙動
この制約は、COBOL2002以降の標準的な挙動です。古いCOBOL環境ではNATIONAL項目自体が存在しないか、あるいは異なる挙動をする可能性もありますが、現代のCOBOL開発ではこのルールが基本となります。
- 逆のパターン: NATIONAL項目から数字項目へ
NATIONAL項目に入っている「文字としての数字」を、通常の数字項目に転記して数値計算に使いたい場合は、FUNCTION NUMVAL や FUNCTION NUMVAL-C といった組み込み関数を利用します。これらの関数は、NATIONAL形式の文字を数値に変換してくれます。
- エラーメッセージ
コンパイラによってエラーメッセージは異なりますが、「型不一致」「互換性のないデータ型」といった内容が表示されるはずです。このエラーに遭遇したら、「数字をNATIONAL項目に直接MOVEしようとしているな」とピンとくるようになれば、あなたはもう初心者卒業です!
モダンCOBOLでの開発において、NATIONAL項目の扱いは非常に重要です。今回の知識をしっかりと身につけて、より堅牢で国際化に対応したCOBOLプログラムを開発していきましょう!

コメント