!--a11y-->

相対位置は、すでに一覧に書き込まれた出力を参照します。相対位置指定には、自動的に行われるものもあります。位置を指定しないで WRITE を使用すると、出力は前の出力の後に、空白列で区切られて表示されます。現在の行に十分なスペースがないときには、改行されます。位置を指定しない ULINE 命令と SKIP 命令は、改行を生成します。
相対位置を指定するためには、SY-COLNO および SY-LINNO システム項目を、絶対位置で説明されている命令、または以下で説明する相対位置指定の命令と共に使用します。
改行を生成するには、WRITE または ULINE の AT オプションにスラッシュを使用するか、NEW-LINE 命令を使用します。
NEW-LINE.
この命令は、次の出力の位置を新しい行に指定します。SY-COLNO の値は 1 に設定され、SY-LINNO の値は 1 増加します。この命令は、最後の改行以降、画面に出力が書き込まれた場合にのみ実行されます。NEW-LINE は空白行を生成しません。空白行を生成するには、SKIP 命令を使用します ( 参照: 空白行の生成) 。
自動改行は、NEW-PAGE 命令とイベントの開始に発生します。
WRITE 出力の位置を、前の WRITE 出力と同じ列に指定することができます。WRITE 命令の書式オプション UNDER を以下のように使用します。
WRITE <f> UNDER <g>.
項目 <g> が開始する列と同じ列から <f> の出力が開始されます。この命令は現在のページに限定されません。つまり、<g> が同じページに出力されることはありません。

縦方向の位置はマニュアルで修正する必要があります。既存の出力は上書きされます。
参照項目 <g> は、オフセットなどの指定を含め、対応する WRITE 命令と同一に書き込む必要があります ( 参照: データオブジェクトのオフセット値の指定) 。<g> がテキストシンボル ( 参照: テキストシンボル) である場合、テキストシンボルの番号から参照項目が決定されます。
RESERVE 命令で定義された行のブロックの最初の行に次の出力行を設定する ( 参照: 改ページのプログラミング) には、BACK 命令を以下のように使用します。
RESERVE.
.....
BACK.
BACK が RESERVE の後に続く場合、後続の出力は、RESERVE の後に書き込まれた最初の行に表示されます。この命令を使用して、たとえば、ループ内で出力を書き込んだ後で、特定の行に戻ることができます。
最初の例では、ユーザ定義ページヘッダを使用して、列単位の一覧を生成する方法を示します。

REPORT
demo_list_position_relative_1 NO STANDARD PAGE HEADING
LINE-SIZE 80 LINE-COUNT 7.
DATA: h1(10) TYPE c VALUE
' Number',
h2(10) TYPE c VALUE
' Square',
h3(10) TYPE c VALUE
' Cube',
n1 TYPE i, n2 TYPE i, n3 TYPE i,
x TYPE i.
TOP-OF-PAGE.
x = sy-colno + 8. POSITION x. WRITE h1.
x = sy-colno + 8. POSITION x. WRITE h2.
x = sy-colno + 8. POSITION x. WRITE h3.
x = sy-colno + 16. POSITION x. WRITE sy-pagno.
ULINE.
START-OF-SELECTION.
DO 10 TIMES.
n1 = sy-index. n2 = sy-index ** 2. n3 = sy-index ** 3.
NEW-LINE.
WRITE: n1 UNDER h1,
n2 UNDER h2,
n3 UNDER
h3.
ENDDO.
このプログラムでは 2 ページから成る一覧が生成されます。ユーザ定義ページヘッダで、列ヘッダの位置は SY-COLNO システム項目と POSITION 命令を使用して相対的に指定されます。実際の一覧出力の位置は、WRITE 命令の UNDER オプションを使用して、ヘッダ行項目の下に指定されます。改行は、NEW-LINE を使用して指定されます。出力は以下のようになります。

個々の項目のそれぞれの出力位置は、ABAP デフォルト設定の文字列表示から左寄せとして、数値項目表示から右寄せとして取り込まれます。行端揃えに影響を与えるには、WRITE 命令の書式オプション LEFT-JUSTIFIED 、RIGHT-JUSTIFIED 、および CENTERED を使用します ( 参照: 書式オプション) 。
次の例では、RESERVE の後に続く BACK 命令の影響を示します。

REPORT
demo_list_position_relative_2
NO STANDARD PAGE HEADING LINE-SIZE
40.
DATA x TYPE i.
WRITE 'Some numbers:'
NO-GAP.
x = sy-colno.
ULINE AT
/(x).
RESERVE 5 LINES.
DO 5 TIMES.
WRITE / sy-index.
ENDDO.
x = sy-colno.
BACK.
WRITE AT x '
<- Start of Loop'.
このプログラムでは以下の出力が生成されます。

最初の 2 行が表示された後で、RESERVE 命令が使用されます。次の 5 行は 1 つのブロックとして定義されます。BACK の後の出力は、このブロックの最初の行に書き込まれます。最初の行に下線を付け、最後の WRITE 出力位置を指定するために、SY-COLNO システム項目がどのように使用されるかに留意してください。