【COBOL学習|実務向け】MOVE ALL 表意定数の正しい作法と、境界値の罠を回避する設計術

導入

COBOLの実務において、固定長項目を特定のパターンで埋める際に欠かせないのが「MOVE ALL」命令です。しかし、この便利な機能も仕様を正しく理解していないと、意図しないデータ欠損やバグを招く原因となります。特に受取り側の桁数と定数の長さが割り切れない場合の挙動は、予期せぬ帳票出力やデータ破壊に直結します。本稿では、この「MOVE ALL」を安全かつ効率的に使いこなすための勘所を解説します。

基礎知識

「ALL」は、指定したリテラル(文字列や数値)を、受取り側項目のサイズに達するまで繰り返し充填する「表意定数」の一つです。例えば「MOVE ALL ‘ABC’ TO WS-ITEM」と記述すると、WS-ITEMが10桁の場合、’ABC’が3回繰り返され、最後に’A’が付加されて’ABCABCABCA’となります。ここで重要なのは、コンパイラが「受取り側のサイズに合わせて機械的にパターンを切り詰める」という点です。

実装/解決策

実務における鉄則は、「受取り側の桁数」と「充填するパターンの長さ」の公倍数を意識することです。もしパターンが切れることを許容しない仕様であれば、事前に定数側の長さを調整するか、あるいはREDEFINES句を用いて、構造体として定義し直すアプローチが有効です。

サンプルプログラム

以下に、ALL命令の挙動と、それを安全に扱うためのサンプルコードを提示します。

IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-ALL-SAMPLE.

WORKING-STORAGE SECTION.

  • 5桁の領域に2桁のパターンをMOVEする(端数が出るケース)

01 WS-TARGET-5 PIC X(05).

  • 6桁の領域に3桁のパターンをMOVEする(きれいに収まるケース)

01 WS-TARGET-6 PIC X(06).

PROCEDURE DIVISION.

  • 1. 2桁のパターン”XY”を5桁に充填
  • 結果は “XYXYX” となる(”XY”の2文字目が切れる)

MOVE ALL “XY” TO WS-TARGET-5.
DISPLAY “5桁の結果: ” WS-TARGET-5.

  • 2. 3桁のパターン”ABC”を6桁に充填
  • 結果は “ABCABC” となる(過不足なし)

MOVE ALL “ABC” TO WS-TARGET-6.
DISPLAY “6桁の結果: ” WS-TARGET-6.

GOBACK.

応用・注意点

現場で最も注意すべきは、「日本語(漢字)などの全角文字」を扱う場合です。COBOLの仕様や実行環境(文字コード)によっては、ALL命令がバイト単位で切り詰めを行うため、文字の途中で切断され、文字化け(いわゆる「半角化け」)を起こすリスクがあります。

また、数字項目に対して「MOVE ALL ‘123’ TO WS-NUM」のように記述する場合、受取り側が数値項目(PIC 9)であれば、コンパイラによって暗黙の変換が行われることがありますが、予期せぬ動作を避けるため、必ず「MOVE ALL “123” TO WS-X(英数字項目)」として定義してから利用することを推奨します。複雑な充填が必要な場合は、ALL命令に頼らず、OCCURS句を用いたループ処理で1要素ずつセットする方が、保守性と安全性の観点からは勝る場合が多いです。

コメント

タイトルとURLをコピーしました