ABAP New open SQL:CDHDR:変更文書ヘッダを使ってデータを取得する

今日は、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句
集合関数

以上

ABAP New open SQL:少し複雑なテーブル結合をしてみる

今回は、従来(ABAP 7.3以前)では有効化エラーとなってしまうけれど、
New open SQLだから書ける!という類のテーブル結合を書いてみます。
BSEGテーブルに、勘定科目の名称を付加する。

  SELECT
      t0~bukrs,
      t0~belnr,
      t0~gjahr,
      t0~buzei,
      t0~shkzg,
      t0~dmbtr,
      t2~waers AS waers_d,
      t0~wrbtr,
      t1~waers,
      t0~hkont,
      t3~txt20
    FROM bseg AS t0
    INNER JOIN bkpf AS t1
       ON t1~bukrs = t0~bukrs
      AND t1~belnr = t0~belnr
      AND t1~gjahr = t0~gjahr
    INNER JOIN t001 AS t2
       ON t2~bukrs = t0~bukrs
    INNER JOIN skat AS t3 "注目
       ON t3~ktopl = t2~ktopl "注目
      AND t3~saknr = t0~hkont "注目
      AND t3~spras = @sy-langu
    ORDER BY
      t0~bukrs,
      t0~belnr,
      t0~gjahr,
      t0~buzei
    INTO TABLE @DATA(lt_data).

注目すべきは、
SKAT:勘定コード表: テキストとT001:会社コードの結合条件と
SKAT:勘定コード表: テキストとBSEG:会計伝票明細の結合条件
つまり、3つのテーブルにまたがる結合条件を記述しているのです。
これを、従来からある(Classic) Open SQLで書くと有効化時にエラーが発生します。


少しプログラムを改変しました。(20171018)

*&---------------------------------------------------------------------*
*& Report Y_SQL_CONSOLE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT y_sql_console.

*-----------------------------------------------------------------------
* グローバル変数
*-----------------------------------------------------------------------
DATA gv_subrc TYPE sy-subrc.

*-----------------------------------------------------------------------
* 選択画面
*-----------------------------------------------------------------------
DATA gv_char1 TYPE char10.
TYPES gtrt_char1 LIKE RANGE OF gv_char1.
SELECT-OPTIONS s_char1 FOR gv_char1.

DATA gv_char2 TYPE char10.
TYPES gtrt_char2 LIKE RANGE OF gv_char2.
SELECT-OPTIONS s_char2 FOR gv_char2.

DATA gv_numc1 TYPE numc08.
TYPES gtrt_numc1 LIKE RANGE OF gv_numc1.
SELECT-OPTIONS s_numc1 FOR gv_numc1.

DATA gv_numc2 TYPE numc08.
TYPES gtrt_numc2 LIKE RANGE OF gv_numc2.
SELECT-OPTIONS s_numc2 FOR gv_numc2.

DATA gv_dats1 TYPE dats.
TYPES gtrt_dats1 LIKE RANGE OF gv_dats1.
SELECT-OPTIONS s_dats1 FOR gv_dats1.

DATA gv_dats2 TYPE dats.
TYPES gtrt_dats2 LIKE RANGE OF gv_dats2.
SELECT-OPTIONS s_dats2 FOR gv_dats2.

DATA gv_tims1 TYPE tims.
TYPES gtrt_tims1 LIKE RANGE OF gv_tims1.
SELECT-OPTIONS s_tims1 FOR gv_tims1.

DATA gv_tims2 TYPE tims.
TYPES gtrt_tims2 LIKE RANGE OF gv_tims2.
SELECT-OPTIONS s_tims2 FOR gv_tims2.

*-----------------------------------------------------------------------
* 主処理
*-----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM start_of_selection
    USING
      s_char1
      s_char2
      s_numc1
      s_numc2
      s_dats1
      s_dats2
      s_tims1
      s_tims2
    CHANGING
      gv_subrc.

*-----------------------------------------------------------------------
* サブルーチン
*-----------------------------------------------------------------------
FORM start_of_selection
    USING
      urt_char1 TYPE gtrt_char1
      urt_char2 TYPE gtrt_char2
      urt_numc1 TYPE gtrt_numc1
      urt_numc2 TYPE gtrt_numc2
      urt_dats1 TYPE gtrt_dats1
      urt_dats2 TYPE gtrt_dats2
      urt_tims1 TYPE gtrt_tims1
      urt_tims2 TYPE gtrt_tims2
    CHANGING
      cv_subrc TYPE sy-subrc.
*-----------------------------------------------------------------------
* ここに、SQL文を書いてね☆
* 格納する内部テーブルは、lt_dataにしてね☆
* lt_dataをインライン定義すると、楽ちんだ☆
  SELECT
      t0~bukrs,
      t0~belnr,
      t0~gjahr,
      t0~buzei,
      t0~shkzg,
      t0~dmbtr,
      t2~waers AS waers_d,
      t0~wrbtr,
      t1~waers,
      t0~hkont,
      t3~txt20
    FROM bseg AS t0
    INNER JOIN bkpf AS t1
       ON t1~bukrs = t0~bukrs
      AND t1~belnr = t0~belnr
      AND t1~gjahr = t0~gjahr
    INNER JOIN t001 AS t2
       ON t2~bukrs = t0~bukrs
    INNER JOIN skat AS t3 "注目
       ON t3~ktopl = t2~ktopl "注目
      AND t3~saknr = t0~hkont "注目
      AND t3~spras = @sy-langu
    ORDER BY
      t0~bukrs,
      t0~belnr,
      t0~gjahr,
      t0~buzei
    INTO TABLE @DATA(lt_data).
*-----------------------------------------------------------------------
  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = DATA(lo_alv)
        CHANGING
          t_table  = lt_data ).
    CATCH cx_salv_msg INTO DATA(lx_salv_msg).
      cv_subrc = 8.
      RETURN.
  ENDTRY.
  DATA(lo_functions) = lo_alv->get_functions( ).
  lo_functions->set_all( ).
  DATA(lo_selections) = lo_alv->get_selections( ).
  lo_selections->set_selection_mode(
  EXPORTING
  value = if_salv_c_selection_mode=>multiple ).
  lo_alv->display( ).

  cv_subrc = 0.
ENDFORM.


検索キーワード
ABAP
ABAP 7.4
ABAP 7.40
ABAP 7.5
ABAP 7.50
SQL
Open SQL
New Open SQL
SAP HANA
Code to Data
Code Pushdown
INNER JOIN

以上

ABAP New open SQL

気まぐれですが、現在お仕事で使っているABAPについて、メモを残していこうと思います。
基本コンセプトとして、「モダンなソース」を書くように心がけようと思っています。

ABAPのバージョンも7.4になったし、
SAP提唱の「Code to Data」「Code Pushdown」(つまり、Databaaeに負荷をかける)を意識します。

私が使っている「ちょっとSQLを試し書きして動かす」ツールを紹介します。
※SAP HANA環境だと、HDB StudioのSQL Consoleが使えるから助かるんだけれど、
→TRCD:DB01っていうのがありますね。
  あれ入れるほどでもないし、Non HANA環境だと使えないし、権限設定とかいろいろ...

少しプログラムを改変しました。(20171018)
少しプログラムを改変しました。(20170926)
少しプログラムを改変しました。(20181022)
少しプログラムを改変しました。(20200908)

*&---------------------------------------------------------------------*
*& Report Y_SQL_CONSOLE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Y_SQL_CONSOLE.

*-----------------------------------------------------------------------
* GLOBAL VARIABLE
*-----------------------------------------------------------------------
DATA GDF_SUBRC TYPE SY-SUBRC.

*-----------------------------------------------------------------------
* CONDITION VIEW
*-----------------------------------------------------------------------
DATA GDF_CHAR1 TYPE CHAR10.
TYPES GTR_CHAR1 LIKE RANGE OF GDF_CHAR1.
SELECT-OPTIONS S_CHAR1 FOR GDF_CHAR1.

DATA GDF_CHAR2 TYPE CHAR10.
TYPES GTR_CHAR2 LIKE RANGE OF GDF_CHAR2.
SELECT-OPTIONS S_CHAR2 FOR GDF_CHAR2.

DATA GDF_NUMC1 TYPE NUMC08.
TYPES GTR_NUMC1 LIKE RANGE OF GDF_NUMC1.
SELECT-OPTIONS S_NUMC1 FOR GDF_NUMC1.

DATA GDF_NUMC2 TYPE NUMC08.
TYPES GTR_NUMC2 LIKE RANGE OF GDF_NUMC2.
SELECT-OPTIONS S_NUMC2 FOR GDF_NUMC2.

DATA GDF_DATS1 TYPE DATS.
TYPES GTR_DATS1 LIKE RANGE OF GDF_DATS1.
SELECT-OPTIONS S_DATS1 FOR GDF_DATS1.

DATA GDF_DATS2 TYPE DATS.
TYPES GTR_DATS2 LIKE RANGE OF GDF_DATS2.
SELECT-OPTIONS S_DATS2 FOR GDF_DATS2.

DATA GDF_TIMS1 TYPE TIMS.
TYPES GTR_TIMS1 LIKE RANGE OF GDF_TIMS1.
SELECT-OPTIONS S_TIMS1 FOR GDF_TIMS1.

DATA GDF_TIMS2 TYPE TIMS.
TYPES GTR_TIMS2 LIKE RANGE OF GDF_TIMS2.
SELECT-OPTIONS S_TIMS2 FOR GDF_TIMS2.

*-----------------------------------------------------------------------
* START-OF-SELECTION
*-----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM START_OF_SELECTION
    USING
      S_CHAR1[]
      S_CHAR2[]
      S_NUMC1[]
      S_NUMC2[]
      S_DATS1[]
      S_DATS2[]
      S_TIMS1[]
      S_TIMS2[]
    CHANGING
      GDF_SUBRC.

*-----------------------------------------------------------------------
* SUBROUTINE
*-----------------------------------------------------------------------
FORM START_OF_SELECTION
    USING
      PIR_CHAR1 TYPE GTR_CHAR1
      PIR_CHAR2 TYPE GTR_CHAR2
      PIR_NUMC1 TYPE GTR_NUMC1
      PIR_NUMC2 TYPE GTR_NUMC2
      PIR_DATS1 TYPE GTR_DATS1
      PIR_DATS2 TYPE GTR_DATS2
      PIR_TIMS1 TYPE GTR_TIMS1
      PIR_TIMS2 TYPE GTR_TIMS2
    CHANGING
      POF_SUBRC TYPE SY-SUBRC.
*-----------------------------------------------------------------------
* Please write the SQL statement here ☆
* Set the internal table to be stored to LDT_DATA ☆
* Inline definition of LDT_DATA is fun ☆
  SELECT
    FROM T001
    FIELDS *
    INTO TABLE @DATA(LDT_DATA).
*-----------------------------------------------------------------------
  TRY.
      CL_SALV_TABLE=>FACTORY(
        IMPORTING
          R_SALV_TABLE = DATA(LDO_ALV)
        CHANGING
          T_TABLE  = LDT_DATA ).
    CATCH CX_SALV_MSG INTO DATA(LDX_SALV_MSG).
      POF_SUBRC = 8.
      RETURN.
  ENDTRY.
  LDO_ALV->GET_FUNCTIONS( )->SET_ALL( ).
  LDO_ALV->GET_COLUMNS( )->SET_OPTIMIZE( ).
  LDO_ALV->GET_SELECTIONS( )->SET_SELECTION_MODE( EXPORTING VALUE = IF_SALV_C_SELECTION_MODE=>CELL ).
  LDO_ALV->DISPLAY( ).

  POF_SUBRC = 0.
ENDFORM.

おまけ
息苦しいほどタイトな演奏です。

Brian Culbertson- Back in the Day & So Good

検索キーワード
ABAP
ABAP 7.4
ABAP 7.40
ABAP 7.5
ABAP 7.50
SQL
Open SQL
New Open SQL
SAP HANA
Code to Data
Code Pushdown

以上

Windows10無償アップグレード期間終了後

日付が変わったので昨日(2017/2/26)
Windows8.1Pro→Windows10Proの無償アップグレードに成功しました。

手順
Windows8.1Proプレインストール環境にて
A:オンラインアップグレードにてWindows10Proインストール
B:インストール後ライセンス認証済みを確認
C:Windows10ProインストールUSBメモリにてクリーンインストール
  →SSD内データをパーティションごとすべて削除後クリーンインストール
D:インストール後ライセンス認証済みを確認

少し古いウルトラブックWithタッチパネルにインストールしたところ
デバイスドライバは全てWindows10標準に付いてきました。
パフォーマンスは悪くないしOS再構築は楽だし
もくろみ通りでした☆

NEXUS 7 LTE 2013 文鎮化の原因

NEXUS 7 2013がAndroid 6.xにアップデートして
再起動のループに悩まされている記事が散見しています。
そして私も再起動の無限ループに陥りました。
 
イロイロ検証したところ原因が特定できたのでここに書きます。
ちなみに、5回文鎮化しました。(汗)
 
端的に、
設定→アプリ→Googleアプリを無効にした状態で
シャットダウンすると
次回起動時から無限ループに陥ります。
 
無限ループ状態からの復帰は
システムリカバリ以外方法は無いようです。
 
NEXUS 7
無限ループ
文鎮化
Andriod 6

Apple Magic MouseをWindowsで使う

Apple Magic MouseWindowsで使う」
このネタを調べたのですがいろいろ情報が交錯しているようで
現時点の正しい情報を書きます。(試しました)
 
・誤りの情報
  ・AppleWirelessMouse.exeまたはAppleWirelessMouse64.exeを
    http://www.4shared.com/からダウンロードする必要はないです。
  ・Bluetooth 更新プログラム 1.0 for Windowsは現在ダウンロード出来ない。
 
・手順
  ・「Boot Camp サポートソフトウェア」の最新版を以下よりダウンロード
     https://support.apple.com/ja_JP/downloads
    「製品別」をクリックして検索キーワードを「bootcamp」にすると簡単に出てきます。
  ・ダウンロードしたファイルの中に
    「AppleWirelessMouse.exeまたはAppleWirelessMouse64.exe」が入っています。
  ・上記ファイルを使ってドライバインストールします。
     Windows10 64bitでMagic Mouseの「ホイール??」も動作しました。  

おまけ
日本国内ではほとんど知られていませんが私は好きです。

apple magic mouse windows10