ABAP New open SQL:SQL関数拡張(1) on ABAP 7.50

ABAP New open SQLSQL関数拡張(1) on ABAP 7.50

今回は、「SQL関数拡張(1) on ABAP 7.50」ということで、CONCAT()を使った例を示す。
購買伝票明細EKPOを使って、
購買伝票番号と購買伝票の明細番号の文字列結合と、
プラントと保管場所の文字列結合をしてみる。
そして、区切り文字として「-」を付加する。

購買伝票番号と購買伝票の明細番号は両方とも必須項目なのでシンプルになるが、
プラントと保管場所については保管場所が任意項目のため、
プラントのみの場合は区切り文字として「-」を取るようにする。

早速SELECT文を...

L085:  SELECT
L086:      CONCAT( CONCAT( ti0~ebeln,'-' ),ti0~ebelp ) AS c1,
L087:      CASE
L088:        WHEN ti0~werks = @space AND ti0~lgort = @space THEN @space
L089:        WHEN ti0~werks <> @space AND ti0~lgort = @space THEN ti0~werks
L090:        WHEN ti0~werks = @space AND ti0~lgort <> @space THEN CONCAT( '     ', ti0~werks )
L091:        ELSE CONCAT( CONCAT( ti0~werks,'-' ),ti0~lgort ) END AS c2,
L092:      ti0~werks,
L093:      ti0~lgort
L094:    FROM ekpo AS ti0
L095:    ORDER BY
L096:      ti0~ebeln,
L097:      ti0~ebelp
L098:    INTO TABLE @DATA(lt_data).

購買伝票番号と購買伝票の明細番号はL086に記述している。
SQL関数は入れ子にして使うことも可能である。
3個以上の項目を結合するときはこんな感じ。

プラントと保管場所はL087-L091に記述している。
プラントは必須項目であるが今回は任意項目として記述してみた。
よって4通りのパターンがあるためそれぞれ記述している。
L092-L093は参考として素のデータを出力している。

今回気づいたのだが、
「INTO TABLE〜」は最後の行に書く必要がある。(エラーで有効化できなかった)
ABAP 7.50になって、ABAP CDSの文法を意識しているのかもしれない。
(近々アップロード済みのソースを修正します)→修正しました。2017-10-18


L001:*&---------------------------------------------------------------------*
L002:*& Report Y_SQL_CONSOLE
L003:*&---------------------------------------------------------------------*
L004:*&
L005:*&---------------------------------------------------------------------*
L006:REPORT y_sql_console.
L007:
L008:*-----------------------------------------------------------------------
L009:* グローバル変数
L010:*-----------------------------------------------------------------------
L011:DATA gv_subrc TYPE sy-subrc.
L012:
L013:*-----------------------------------------------------------------------
L014:* 選択画面
L015:*-----------------------------------------------------------------------
L016:*
L017:DATA gv_char1 TYPE char10.
L018:TYPES gtrt_char1 LIKE RANGE OF gv_char1.
L019:SELECT-OPTIONS s_char1 FOR gv_char1.
L020:*
L021:DATA gv_char2 TYPE char10.
L022:TYPES gtrt_char2 LIKE RANGE OF gv_char2.
L023:SELECT-OPTIONS s_char2 FOR gv_char2.
L024:*
L025:DATA gv_numc1 TYPE numc08.
L026:TYPES gtrt_numc1 LIKE RANGE OF gv_numc1.
L027:SELECT-OPTIONS s_numc1 FOR gv_numc1.
L028:*
L029:DATA gv_numc2 TYPE numc08.
L030:TYPES gtrt_numc2 LIKE RANGE OF gv_numc2.
L031:SELECT-OPTIONS s_numc2 FOR gv_numc2.
L032:*
L033:DATA gv_dats1 TYPE dats.
L034:TYPES gtrt_dats1 LIKE RANGE OF gv_dats1.
L035:SELECT-OPTIONS s_dats1 FOR gv_dats1.
L036:*
L037:DATA gv_dats2 TYPE dats.
L038:TYPES gtrt_dats2 LIKE RANGE OF gv_dats2.
L039:SELECT-OPTIONS s_dats2 FOR gv_dats2.
L040:*
L041:DATA gv_tims1 TYPE tims.
L042:TYPES gtrt_tims1 LIKE RANGE OF gv_tims1.
L043:SELECT-OPTIONS s_tims1 FOR gv_tims1.
L044:*
L045:DATA gv_tims2 TYPE tims.
L046:TYPES gtrt_tims2 LIKE RANGE OF gv_tims2.
L047:SELECT-OPTIONS s_tims2 FOR gv_tims2.
L048:
L049:*-----------------------------------------------------------------------
L050:* 主処理
L051:*-----------------------------------------------------------------------
L052:START-OF-SELECTION.
L053:  PERFORM start_of_selection
L054:    USING
L055:      s_char1
L056:      s_char2

L057:      s_numc1
L058:      s_numc2

L059:      s_dats1
L060:      s_dats2

L061:      s_tims1
L062:      s_tims2

L063:    CHANGING
L064:      gv_subrc.
L065:
L066:*-----------------------------------------------------------------------
L067:* サブルーチン
L068:*-----------------------------------------------------------------------
L069:FORM start_of_selection
L070:    USING
L071:      urt_char1 TYPE gtrt_char1
L072:      urt_char2 TYPE gtrt_char2
L073:      urt_numc1 TYPE gtrt_numc1
L074:      urt_numc2 TYPE gtrt_numc2
L075:      urt_dats1 TYPE gtrt_dats1
L076:      urt_dats2 TYPE gtrt_dats2
L077:      urt_tims1 TYPE gtrt_tims1
L078:      urt_tims2 TYPE gtrt_tims2
L079:    CHANGING
L080:      cv_subrc TYPE sy-subrc.
L081:*-----------------------------------------------------------------------
L082:* ここに、SQL文を書いてね☆
L083:* 格納する内部テーブルは、lt_dataにしてね☆
L084:* lt_dataをインライン定義すると、楽ちんだ☆
L085:  SELECT
L086:      CONCAT( CONCAT( ti0~ebeln,'-' ),ti0~ebelp ) AS c1,
L087:      CASE
L088:        WHEN ti0~werks = @space AND ti0~lgort = @space THEN @space
L089:        WHEN ti0~werks <> @space AND ti0~lgort = @space THEN ti0~werks
L090:        WHEN ti0~werks = @space AND ti0~lgort <> @space THEN CONCAT( '     ', ti0~werks )
L091:        ELSE CONCAT( CONCAT( ti0~werks,'-' ),ti0~lgort ) END AS c2,
L092:      ti0~werks,
L093:      ti0~lgort
L094:    FROM ekpo AS ti0
L095:    ORDER BY
L096:      ti0~ebeln,
L097:      ti0~ebelp
L098:    INTO TABLE @DATA(lt_data).
L099:*-----------------------------------------------------------------------
L100:  TRY.
L101:      cl_salv_table=>factory(
L102:        IMPORTING
L103:          r_salv_table = DATA(lo_alv)
L104:        CHANGING
L105:          t_table  = lt_data ).
L106:    CATCH cx_salv_msg INTO DATA(lx_salv_msg).
L107:      cv_subrc = 8.
L108:      RETURN.
L109:  ENDTRY.
L110:  DATA(lo_functions) = lo_alv->get_functions( ).
L111:  lo_functions->set_all( ).
L112:  DATA(lo_selections) = lo_alv->get_selections( ).
L113:  lo_selections->set_selection_mode(
L114:  EXPORTING
L115:  value = if_salv_c_selection_mode=>multiple ).
L116:  lo_alv->display( ).
L117:
L118:  cv_subrc = 0.
L119:ENDFORM.


(2)はあるのかな(笑)


検索キーワード
ABAP
ABAP 7.5
ABAP 7.50
SQL
Open SQL
New Open SQL
SAP HANA
Code to Data
Code Pushdown
CASE文
SQL関数
CONCAT()

以上