今日は、CDHDR:変更文書ヘッダを利用して、xxxx年xx月xx日 xx時xx分xx秒以降に登録・変更があった
購買発注伝票のデータを取得します。
サブクエリはあまりなじみがないと思いますが、ちょっと書いてみました。
サブクエリ自体は、ABAP7.3以前からあるので、今回のSELECT文はClassic Open SQLでも記述可能です。
一般的には、CDHDR:変更文書ヘッダより、対象の購買伝票番号を取得して、一旦内部テーブルに格納して、
for all entriesで取得したりするんだと思うけれど、
非ABAP出身者としてはfor all entriesがどうにも好きになれなくて、、、
内部的には、for all entries行分のSELECT文を発行して、UNIONで繋げているそうなので、
パフォーマンス的にあまり褒められた方法ではないようです。
コードとしても、SELECT文を実行する直前で、
for all entriesの内部テーブルのデータ有無をチェックする必要があったり、
美意識の問題なんだと思うんだけれど、業務ロジックとは無関係のコードを書くのが気が進まないです。
あと、New Open SQLで、for all entriesは廃止になりました。
(ABAP7.4でもClassic Open SQLで書けばいいんだけれどね)
L084: SELECT L085: t0~*, L086: t1~* L087: FROM ekpo AS t0 L088: INNER JOIN ekko AS t1 L089: ON t1~ebeln = t0~ebeln L090: WHERE EXISTS ( L091: SELECT * FROM cdhdr AS t2 L092: WHERE t2~objectclas = 'EINKBELEG' L093: AND ( t2~udate > '20170101' L094: OR ( t2~udate = '20170101' L095: AND t2~utime >= '101030' ) ) L096: AND t2~objectid = t0~ebeln ) L097: ORDER BY L098: t0~ebeln, L099: t0~ebelp L100: INTO TABLE @DATA(lt_data).
結合条件は、L089、L096です。
L091~L096のサブクエリは集合関数も使えるので、
MAX()等を上手に使えば、最後に更新した日付時刻なんかも、一発で取得できます。
あと、L097~L099のソートですが、ソートテーブルより速いです。(多分、Non HANAであっても)
少しプログラムを改変しました。(20171018)
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:DATA gv_char1 TYPE char10. L017:TYPES gtrt_char1 LIKE RANGE OF gv_char1. L018:SELECT-OPTIONS s_char1 FOR gv_char1. L019: L020:DATA gv_char2 TYPE char10. L021:TYPES gtrt_char2 LIKE RANGE OF gv_char2. L022:SELECT-OPTIONS s_char2 FOR gv_char2. L023: L024:DATA gv_numc1 TYPE numc08. L025:TYPES gtrt_numc1 LIKE RANGE OF gv_numc1. L026:SELECT-OPTIONS s_numc1 FOR gv_numc1. L027: L028:DATA gv_numc2 TYPE numc08. L029:TYPES gtrt_numc2 LIKE RANGE OF gv_numc2. L030:SELECT-OPTIONS s_numc2 FOR gv_numc2. L031: L032:DATA gv_dats1 TYPE dats. L033:TYPES gtrt_dats1 LIKE RANGE OF gv_dats1. L034:SELECT-OPTIONS s_dats1 FOR gv_dats1. L035: L036:DATA gv_dats2 TYPE dats. L037:TYPES gtrt_dats2 LIKE RANGE OF gv_dats2. L038:SELECT-OPTIONS s_dats2 FOR gv_dats2. L039: L040:DATA gv_tims1 TYPE tims. L041:TYPES gtrt_tims1 LIKE RANGE OF gv_tims1. L042:SELECT-OPTIONS s_tims1 FOR gv_tims1. L043: L044:DATA gv_tims2 TYPE tims. L045:TYPES gtrt_tims2 LIKE RANGE OF gv_tims2. L046:SELECT-OPTIONS s_tims2 FOR gv_tims2. L047: L048:*----------------------------------------------------------------------- L049:* 主処理 L050:*----------------------------------------------------------------------- L051:START-OF-SELECTION. L052: PERFORM start_of_selection L053: USING L054: s_char1 L055: s_char2 L056: s_numc1 L057: s_numc2 L058: s_dats1 L059: s_dats2 L060: s_tims1 L061: s_tims2 L062: CHANGING L063: gv_subrc. L064: L065:*----------------------------------------------------------------------- L066:* サブルーチン L067:*----------------------------------------------------------------------- L068:FORM start_of_selection L069: USING L070: urt_char1 TYPE gtrt_char1 L071: urt_char2 TYPE gtrt_char2 L072: urt_numc1 TYPE gtrt_numc1 L073: urt_numc2 TYPE gtrt_numc2 L074: urt_dats1 TYPE gtrt_dats1 L075: urt_dats2 TYPE gtrt_dats2 L076: urt_tims1 TYPE gtrt_tims1 L077: urt_tims2 TYPE gtrt_tims2 L078: CHANGING L079: cv_subrc TYPE sy-subrc. L080:*----------------------------------------------------------------------- L081:* ここに、SQL文を書いてね☆ L082:* 格納する内部テーブルは、lt_dataにしてね☆ L083:* lt_dataをインライン定義すると、楽ちんだ☆ L084: SELECT L085: t0~*, L086: t1~* L087: FROM ekpo AS t0 L088: INNER JOIN ekko AS t1 L089: ON t1~ebeln = t0~ebeln L090: WHERE EXISTS ( L091: SELECT * FROM cdhdr AS t2 L092: WHERE t2~objectclas = 'EINKBELEG' L093: AND ( t2~udate > '20170101' L094: OR ( t2~udate = '20170101' L095: AND t2~utime >= '101030' ) ) L096: AND t2~objectid = t0~ebeln ) L097: ORDER BY L098: t0~ebeln, L099: t0~ebelp L100: INTO TABLE @DATA(lt_data). L101:*----------------------------------------------------------------------- L102: TRY. L103: cl_salv_table=>factory( L104: IMPORTING L105: r_salv_table = DATA(lo_alv) L106: CHANGING L107: t_table = lt_data ). L108: CATCH cx_salv_msg INTO DATA(lx_salv_msg). L109: cv_subrc = 8. L110: RETURN. L111: ENDTRY. L112: DATA(lo_functions) = lo_alv->get_functions( ). L113: lo_functions->set_all( ). L114: DATA(lo_selections) = lo_alv->get_selections( ). L115: lo_selections->set_selection_mode( L116: EXPORTING L117: value = if_salv_c_selection_mode=>multiple ). L118: lo_alv->display( ). L119: L120: cv_subrc = 0. L121:ENDFORM.
検索キーワード
ABAP
ABAP 7.4
ABAP 7.40
ABAP 7.5
ABAP 7.50
SQL
Open SQL
New Open SQL
Classic Open SQL
SAP HANA
Code to Data
Code Pushdown
INNER JOIN
サブクエリ
EXISTS句
集合関数
以上