ABAP新语法

发布时间 2023-09-05 14:35:31作者: SAPダメ人間
*&---------------------------------------------------------------------*
*& Report ZAXYT_FI_0905
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZAXYT_FI_0905.

*--- 1. 変数定義

*変数の定義
*<ABAP7.4より前>
*・変数はプログラムやルーチンの先頭でまとめて定義する
*・宣言時に型の定義が必要
DATA L_STR TYPE STRING.
L_STR = 'hello'.

*<ABAP7.4以降>
*・変数は使いたい場所で宣言すればよい
*・コンパイラが型を判断してくれる

DATA(L_STR) = 'hello'.

*メソッド呼び出し時の引数
*メソッドから受け取る引数も、DATAを使用してその場で定義できます。
*一方、汎用モジュールではDATAを利用した引数の定義はできませんでした。残念!

CALL METHOD CL_RECA_DATE=>GET_CURRENT_DATE
  EXPORTING
    ID_TIMEZONE  = SY-ZONLO
  IMPORTING
    ED_TIME      = DATA(L_TIME)
    ED_DATE      = DATA(L_DATE)
    ED_TIMESTAMP = DATA(L_TIMESTAMP).


*---  2. 内部テーブルの操作
*内部テーブルをループしてワークエリアに読み込むとき、
*内部テーブルの型を参照して自動的にワークエリアを作ることができます。
DATA(L_MTART) = 'ROH'.
SELECT MATNR, MTART
  FROM MARA
  INTO TABLE @DATA(ITAB_MARA)
  WHERE MTART = @L_MTART.

LOOP AT ITAB ASSIGNING FIELD-SYMBOL(<FS_MARA>).
  WRITE: / <FS_MARA>-MATNR, <FS_MARA>-MTART.
ENDLOOP.

*指定した行を読み込む方法
*<ABAP7.4より前>
*・内部テーブルを読み込む際はインデックス、
*またはキーを指定してワークエリアに行を格納する
DATA: WA_MARA LIKE LINE OF ITAB_MARA.
READ TABLE ITAB_MARA INTO W_MARA INDEX 1.
READ TABLE ITAB_MARA INTO W_MARA WITH KEY MATNR = 'BRICK002'.


" インデックスを指定
WA_MARA = ITAB_MARA[ 1 ].
" キーを指定
WA_MARA = ITAB_MARA[ MATNR = 'BRICK002' ].
*<ABAP7.4以降>
*・インデックスやキーを指定して直接行にアクセスできる
" インデックスを指定
WA_MARA = ITAB_MARA[ 1 ].
" キーを指定
WA_MARA = ITAB_MARA[ MATNR = 'BRICK002' ].

*データが読み込めない場合、例外CX_SY_ITAB_LINE_NOT_FOUNDが発生します。
*ABAP7.4 SP8からは、例外が発生しないようにOPTIONALまたはDEFAULTを指定できるようになりました(VALUE #と組み合わせること)。
*OPTIONALを指定した場合は、READ TABLEで対象の行がなかった場合と同じように初期値が返されます。
WA_MARA = VALUE #( ITAB_MARA[ MATNR = 'BRICK002b' ] OPTIONAL ).

*内部テーブルへの値の設定
*直接値を設定する
*<ABAP7.4より前>
*・ワークエリアで値を編集し、それを内部テーブルに格納する

DATA: LR_SEL_MARA TYPE RANGE OF MTART,
      WA_SEL_MARA LIKE LINE OF LR_SEL_MARA.

WA_SEL_MARA-SIGN = 'I'.
WA_SEL_MARA-OPTION = 'EQ'.
WA_SEL_MARA-LOW = 'ROH'.
APPEND WA_SEL_MARA TO LR_SEL_MARA.
WA_SEL_MARA-LOW = 'HAWA'.
APPEND WA_SEL_MARA TO LR_SEL_MARA.
*
*<ABAP7.4以降>
*・VALUEを使って内部テーブルに値を直接入れることができる
*
*構文その1: VALUE <型> ((行データ1) (行データ2)...)
*型を明示的に指定する方法です。
TYPES: T_SEL_MARA TYPE RANGE OF MTART.
DATA(LR_SEL_MARA2) = VALUE T_SEL_MARA(
    ( SIGN = 'I' OPTION = 'EQ' LOW = 'ROH')
    ( SIGN = 'I' OPTION = 'EQ' LOW = 'HAWA')
 ).
*
*構文その2: VALUE # ((行データ1) (行データ2)...)
*テーブルの型が設定先の変数から推測できる場合はこちらの構文が使えます。
DATA: LR_SEL_MARA3 TYPE RANGE OF MTART.
LR_SEL_MARA3 = VALUE #(
    ( SIGN = 'I' OPTION = 'EQ' LOW = 'ROH')
    ( SIGN = 'I' OPTION = 'EQ' LOW = 'HAWA')
 ).

*sign, optionが共通の場合、次のような書き方もできます。
LR_SEL_MARA3 = VALUE #(
    SIGN = 'I' OPTION = 'EQ' ( LOW = 'ROH') ( LOW = 'HAWA')
 ).

*特定の行のインデックスを取得する(line_index)
*<ABAP7.4より前>
*・READ TABLEなどで行を読み込み、sy-tabixを取得する
DATA: L_INDEX TYPE SY-TABIX.

READ TABLE ITAB_MARA TRANSPORTING NO FIELDS WITH KEY MATNR = 'BRICK002'.
L_INDEX = SY-TABIX.

*<ABAP7.4以降>
*・line_index命令でインデックスを取得できる
L_INDEX = LINE_INDEX( ITAB_MARA[ MATNR = 'BRICK002' ] ).

*指定した行が存在するかどうかを確認する(line_exists)
*<ABAP7.4より前>
*・READ TABLEして、sy-subrcの値で判断する
READ TABLE ITAB_MARA TRANSPORTING NO FIELDS WITH KEY MATNR = 'BRICK002'.
IF SY-SUBRC = 0.
  "存在する場合の処理
ELSE.
  "存在しない場合の処理
ENDIF.

*<ABAP7.4以降>
*・line_exists命令で判断できる
*
*line_existsはブール値を返します。
*ABAP7.4から、IF条件の結果がtureのときは
*if <変数> = abap_trueという風にabap_trueを書かなくてもよくなったので、
*  以下のような簡潔な書き方ができます。
IF LINE_EXISTS( ITAB_MARA[ MATNR = 'BRICK002' ] ).
  "存在する場合の処理
ELSE.
  "存在しない場合の処理
ENDIF.

*--- 3. 型変換
*サブルーチンで受け取った引数を汎用モジュールに渡すとき、
*汎用モジュールの型に合わせるために中間変数を定義したことはないでしょうか?
*
*<ABAP7.4より前>
*・中間変数に引数を格納して型変換し、汎用モジュール等に渡す

DATA: IM_TEXT(50) TYPE C,
      L_STR       TYPE STRING, "中間変数
      L_XSTR      TYPE XSTRING.

IM_TEXT = 'Hello'.
L_STR = IM_TEXT.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    TEXT   = L_STR
  IMPORTING
    BUFFER = L_XSTR.

*<ABAP7.4以降>
*・CONV命令で直接型を変換できる
*・VALUEと同じく、型を明示的に指定する方法と#で暗黙的に指定する方法がある
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    TEXT   = CONV STRING( IM_TEXT ) "明示的に型を指定
  IMPORTING
    BUFFER = L_XSTR.

*--- 4. 文字列操作
*文字列結合
*<ABAP7.4より前>
*・CONCATENATEで文字列を結合
*・結合する文字列の中にクォーテーション(')を使いたい場合、エスケープする必要がある
DATA: IM_COMMENT(10) TYPE C,
      L_OUT          TYPE STRING.

IM_COMMENT = 'Hello!'.
CONCATENATE 'He said' '''' IM_COMMENT '''' INTO L_OUT SEPARATED BY SPACE.

*<ABAP7.4以降>
*・||で囲った中にリテラルや変数を直接書き込むことができる
*・変数は{}で囲む
L_OUT = |He said '{ IM_COMMENT }'|.
L_OUT2 = |Date: { SY-DATUM } Time: { SY-UZEIT }|.

*Alpha変換
*Alpha変換とは、内部書式(前ゼロつき)と外部書式(前ゼロなし)の変換のことです。
*
*<ABAP7.4より前>
*・汎用モジュール'CONVERSION_EXIT_ALPHA_INPUT'/'CONVERSION_EXIT_ALPHA_OUTPUT'を使って変換する
DATA: LV_INPUT TYPE EBELN.
DATA: LV_OUTPUT TYPE EBELN.

LV_INPUT = 12345.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    INPUT  = LV_INPUT
  IMPORTING
    OUTPUT = LV_OUTPUT. "0000012345

*<ABAP7.4以降>
*・|{ <変数> ALPHA = IN / OUT }|で変換できる
DATA: LV_INPUT TYPE EBELN.
DATA: LV_OUTPUT TYPE EBELN.

LV_INPUT = 12345.
LV_OUTPUT =  |{ LV_INPUT ALPHA = IN }|.                     "0000012345

*--- おわりに
*ここで紹介した以外にも、ABAP7.4で登場した構文は色々あります。
*以下のブログがよくまとまっていておすすめなので興味のある方は読んでみてください。
*ABAP 7.40 Quick Reference