WRITE命令の構文ルール、利用方法、各種オプションについて解説しています。
WRITE命令は、内容自体は理解しやすく構文も簡単ですが、出力位置の指定方法などに独特なコツとツボが存在します。また、WRITE命令1つで一覧画面を作ることができる分、出力位置の指定や書式の設定方法など、かなり詳細なプログラミング知識が必要になってきます。
「WRITE命令の基本」に観点を絞って整理していきたいと思います。
構文ルール:WRITE命令
WRITE (データオブジェクト or リテラル).
もっとも基本的な形です。WRITE命令は、(データオブジェクト or リテラル)の内容を、一覧ページに書き込みます。ここで指定するデータオブジェクトは基本どのデータ型でもOKです。フィールドシンボルも指定することができます。
さっそく以下のサンプルで動作を確認してみます。
サンプルコード:WRITE命令
DATA:
OUTPUT1 TYPE i.
PARAMETERS:
INPUT1 TYPE i,
INPUT2 TYPE i.
OUTPUT1 = INPUT1 * INPUT2.
WRITE OUTPUT1.
上記コード、「INPUT1」に100を、「INPUT2」に20を入れて実行した結果が以下の画面が表示されます。

非常に簡単な処理です。
文字の長さは、データ型の長さによって自動的に指定されます。
さらにもう一つ、サンプルコードを確認していきます。
DATA:
OUTPUT1 TYPE i,
10000 TYPE i VALUE `10000`.
PARAMETERS:
INPUT1 TYPE i,
INPUT2 TYPE i.
OUTPUT1 = INPUT1 * INPUT2.
WRITE : OUTPUT1,
10000.
変数を1つ追加してみました。すると、

横並びで2つ追加されます。ここで、重要なのは、WRITE命令をこれから解説するオプションを利用しない場合(デフォルトで利用する場合)、出力形式や表示位置が自動的に指定されてしまうという点です。
したがって、実際のプログラムでWRITE命令がオプションなしで利用されるのはかなりのレアケースといっても過言ではないでしょう。
ここからは、実践編として利用されるWRITE命令のオプションを解説していきます。
WRITE AT
WRITE AT 位置(長さ) データオブジェクト.
「AT」オプションにより、出力位置を指定することができます。どこから、どれぐらいの桁長で出力するかを指定します。さっそく、サンプルコードを見てみましょう。
サンプルコード:WRITE AT
DATA:
A TYPE i,
B TYPE i.
A = 1234.
B = 456.
WRITE A.
WRITE AT 100(3) B.
最後の1行が、ATオプションを利用しています。画面の1番左から、100文字分の位置に「3文字」でWRITEします。

WRITE AT命令では、この位置を探すのが結構難しいのです。例えば、
WRITE A.
WRITE AT 5(3) B.
としてしまうと、データオブジェクトAの位置と被ってしまいます。(その場合、上書きされます。)

帳票系のプログラムは、この点に気を付けて細かくテストしてあげるのが重要であるといえます。
WRITE /
WRITE /(データオブジェクト).
WRITEの直後にスラッシュ "/" を入れると、次の行に出力されます。
DATA:
A TYPE i,
B TYPE i.
A = 1234.
B = 456.
WRITE A.
WRITE AT /5(3) B.
上記のコードを実行した結果がこちらです。

また、WRITE ATに続くオペランド部分には、変数を指定することもできます。すなわち、
WRITE AT /5(3) B.
を
WRITE AT /POSITION(LENGTH) B.
のように指定することが可能です。
改行前が空白文字の場合
"/" を用いる場合の注意点は、改行をする前の行がブランクの場合です。
改行をする前の行がブランクの場合は、"/" を記述しても改行されません。"/" は、「改行する」というよりも「ブランクの行に出力する」という意味でとらえておくとよいでしょう。
したがって、以下のサンプルコードを実行した結果は以下のように表示されることになります。
DATA:A TYPE c,
B TYPE i,
C TYPE i.
C = 123.
A = ` `.
B = 456.
WRITE C.
WRITE A.
WRITE AT /5(3) B.

WRITE命令の基本形は以上です。基本を理解していれば、応用的な知識も比較的楽に理解できると思いますので、このページの内容をしっかり理解しておきましょう。