ABAP New open SQL:FOR ALL ENTRIES + BINARY SEARCHから逃れたい

ABAP New open SQL:FOR ALL ENTRIES + BINARY SEARCHから逃れたい

SAPが、Code Pushdownと言おうが、
SAPが、Code to Dataと言おうが、
データーベース様には迷惑をかけられない!!!
データーベースはそっとしておきたい!!
(本音では)データーベースを信じてはいけない!
だって、BSEGで先輩たちに怒られ続けたから。

こんなところでしょうか?

だから、ITABにせっせとマスタ情報を溜め込む。
FOR ALL ENTRIESを使って。
いつしかFOR ALL ENTRIESを使うために。
準備をして、準備をして、確認して、確認して、えいっ!!てね。
業務ロジックに無関係のコードがたくさん生まれる。
データの並び順に細心の注意を払って。
そしてBINARY SEARCHを使うために下準備を念入りに。

時代は流れてHANAでABAPが動く。
ちょっと前でもORA10。

もうやめようよって思います。
SAPがCode Pushdownって言う遥か前から、一般(非ABAP)と同じようにデータベースにおまかせしようよ。
そう思います。
昔々ORA7とかの頃は信じてはいけなかったかもしれないけれど、もう信じようよ。

っというわけで、FOR ALL ENTRIES。
数年前にSAPトレーニングを受講したときは、New Open SQLで書き換えできないのはFOR ALL ENTRIESだけ、あとはRANGE TABLEを含めてすべて書き換え可能と教わりました。
先日、逃げ回っていたFOR ALL ENTRIESのヘルプを見たら、サンプルコードがNew Open SQLで書かれていました。それと同時に、制約事項もたくさん書かれていました。やっぱり、いろいろ気にしなければいけないことが多いのね。

そこで、これまた先日見つけた必殺技。
「WITH句 + SELECT〜FROM @ITAB」
これ行けます。
FOR ALL ENTRIESはすべて「WITH句 + SELECT〜FROM @ITAB」で書き換え可能です。そして、使うための下ごしらえもほぼ不要。HANA に一時テーブルという仕組みがあったことを改めて思い出しました。そういえば、HANA Infomation Viewの途中を覗き見するときに、知らないうちに使っていたよな。ABAP 7.52から追加されたWITH句もHANAでは一時テーブルが動いていると考えると辻褄が合うと思います。

プログラムの説明
3種類の方法で、外見上の振る舞いが同じになるように、実装しています。
A:PERFORM START_OF_SELECTION_LOOP1 "FOR ALL ENTRIES IN句を使用してテキスト情報を取得
  コード量(ロジック部分のみ):256行
  従来型の実装です。
  トランザクションデータを使ってFOR ALL ENTRIES IN句でマスタデータをフィルタし取得します。
  BINARY SEARCHでマスタ情報を特定して、各種名称を補完します。
  FOR ALL ENTRIES IN句の直前で、ブランクチェック、SORT命令DELETE命令による重複削除します。
  BINARY SEARCHの手前で、SORT命令による並び替えをします。

B:PERFORM START_OF_SELECTION_LOOP2 "WITH句 + SELECT〜FROM @ITABを使用してテキスト情報を取得
  コード量(ロジック部分のみ):224行
  今回のテーマです。
  WITH句の前半で、トランザクションデータの重複削除します。
  後半でINNER JOINすることでマスタデータのフィルタ取得および、並び替えをします。
  BINARY SEARCHでマスタ情報を特定して、各種名称を補完します。
  直前の、ブランクチェック、SORT命令DELETE命令による重複削除は不要です。
  BINARY SEARCHの手前の並び替えはORDER BY句で行います。

C:PERFORM START_OF_SELECTION_JOIN "テーブルJOINでテキスト情報を取得
  コード量(ロジック部分のみ):62行
  本来あるべき姿
  マスタ情報は、SELECT文のJOIN句で表結合します。

パフォーマンスについて
  約4万件取得で、いずれも0.06~0.07secでした。
 JOINによるパフォーマンス悪化を懸念する人がいると思います。
  以前、単一トランザクションテーブルに対して、約30のマスタテーブルをJOIN句結合しました。
  パフォーマンス悪化は無かったです。(1秒以内で処理終了していました)
 データベースの並列実行に対するパフォーマンス悪化を懸念する人がいると思います。
  数年前に測定したところ、感覚値として50並列位すると、処理時間が1.5倍程度になります。
 個人的には、有り余るSAP HANAのパフォーマンスを遊ばせるのは、エンドユーザの利益と相反すると思います。

ソースコード保守性
 Cの「テーブルJOINでテキスト情報を取得」が圧倒的大差で、コード量が少なくなります。
 (256行→62行:なんと1/4以下!!!)
 コード量が少ないと、バグの入り込む余地が大幅に減ります。
 影響範囲についても、そもそもコード量全体が少ないので、問題にはならないと思います。
 SELECT文については、「情報処理技術者ITパスポート試験」でも出題するので、
 苦手な人は、ご自身のバリューを保つため、勉強しましょう。(むちゃぶり!!?ですか?)

*&---------------------------------------------------------------------*
*& Report SQL_CONSOLE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT 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_LOOP1                "FOR ALL ENTRIES IN句を使用してテキスト情報を取得
*  PERFORM START_OF_SELECTION_LOOP2                "WITH句を使用してテキスト情報を取得
*  PERFORM START_OF_SELECTION_JOIN                 "テーブルJOINでテキスト情報を取得
    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_LOOP1
    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.
*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_START TYPE TIMESTAMPL.       "タイムスタンプデータ取得開始
  GET TIME STAMP FIELD LDF_TIMESTAMP_START.       "タイムスタンプデータ取得開始
*-----------------------------------------------------------------------
* Please write the SQL statement here ☆
* Set the internal table to be stored to LDT_DATA ☆
* Inline definition of LDT_DATA is fun ☆
  TYPES:
    BEGIN OF LTS_DATA,                            "一覧データ
      EBELN TYPE EKPO-EBELN,                      "購買伝票番号
      EBELP TYPE EKPO-EBELP,                      "購買伝票の明細番号
      EKORG TYPE EKKO-EKORG,                      "購買組織
      EKOTX TYPE T024E-EKOTX,                     "購買組織テキスト
      EKGRP TYPE EKKO-EKGRP,                      "購買グループ
      EKNAM TYPE T024-EKNAM,                      "購買グループテキスト
      BUKRS TYPE EKKO-BUKRS,                      "会社コード
      BUTXT TYPE T001-BUTXT,                      "会社コードまたは会社の名称
      MATNR TYPE EKPO-MATNR,                      "品目コード
      TXZ01 TYPE EKPO-TXZ01,                      "テキスト (短)
      WERKS TYPE EKPO-WERKS,                      "プラント
      NAME1 TYPE T001W-NAME1,                     "名称
      LGORT TYPE EKPO-LGORT,                      "保管場所
      LGOBE TYPE T001L-LGOBE,                     "保管場所テキスト
      MENGE TYPE EKPO-MENGE,                      "購買発注量
      MEINS TYPE EKPO-MEINS,                      "発注単位
    END OF LTS_DATA,
    LTT_DATA TYPE STANDARD TABLE OF LTS_DATA,     "一覧データ

    BEGIN OF LTS_T024E,                           "購買組織
      EKORG TYPE T024E-EKORG,                     "購買組織
      EKOTX TYPE T024E-EKOTX,                     "購買組織テキスト
    END OF LTS_T024E,
    LTT_T024E TYPE STANDARD TABLE OF LTS_T024E,   "購買組織

    BEGIN OF LTS_T024,                            "購買グループ
      EKGRP TYPE T024-EKGRP,                      "購買グループ
      EKNAM TYPE T024-EKNAM,                      "購買グループテキスト
    END OF LTS_T024,
    LTT_T024 TYPE STANDARD TABLE OF LTS_T024,     "購買グループ

    BEGIN OF LTS_T001,                            "会社コード
      BUKRS TYPE T001-BUKRS,                      "会社コード
      BUTXT TYPE T001-BUTXT,                      "会社コードまたは会社の名称
    END OF LTS_T001,
    LTT_T001 TYPE STANDARD TABLE OF LTS_T001,     "会社コード

    BEGIN OF LTS_T001W,                           "プラント/支店
      WERKS TYPE T001W-WERKS,                     "プラント
      NAME1 TYPE T001W-NAME1,                     "名称
    END OF LTS_T001W,
    LTT_T001W TYPE STANDARD TABLE OF LTS_T001W,   "プラント/支店

    BEGIN OF LTS_T001L,                           "保管場所
      WERKS TYPE T001L-WERKS,                     "プラント
      LGORT TYPE T001L-LGORT,                     "保管場所
      LGOBE TYPE T001L-LGOBE,                     "保管場所テキスト
    END OF LTS_T001L,
    LTT_T001L TYPE STANDARD TABLE OF LTS_T001L.   "保管場所

  DATA:
    LDT_DATA  TYPE LTT_DATA,                      "一覧データ
    LDT_DATA1 TYPE LTT_DATA,                      "一覧データ:作業用

    LDT_T024E TYPE LTT_T024E,                     "購買組織
    LDS_T024E LIKE LINE OF LDT_T024E,             "購買組織
    LDT_T024  TYPE LTT_T024,                      "購買グループ
    LDS_T024  LIKE LINE OF LDT_T024,              "購買グループ
    LDT_T001  TYPE LTT_T001,                      "会社コード
    LDS_T001  LIKE LINE OF LDT_T001,              "会社コード
    LDT_T001W TYPE LTT_T001W,                     "プラント/支店
    LDS_T001W LIKE LINE OF LDT_T001W,             "プラント/支店
    LDT_T001L TYPE LTT_T001L,                     "保管場所
    LDS_T001L LIKE LINE OF LDT_T001L.             "保管場所

  SELECT
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP,                                 "購買伝票の明細番号
      EKKO~EKORG,                                 "購買組織
      EKKO~EKGRP,                                 "購買グループ
      EKKO~BUKRS,                                 "会社コード
      EKPO~MATNR,                                 "品目コード
      EKPO~TXZ01,                                 "テキスト (短)
      EKPO~WERKS,                                 "プラント
      EKPO~LGORT,                                 "保管場所
      EKPO~MENGE,                                 "購買発注量
      EKPO~MEINS                                  "発注単位
    FROM EKPO                                     "購買伝票明細
    INNER JOIN EKKO                               "購買伝票ヘッダ
       ON EKKO~EBELN = EKPO~EBELN                 "購買伝票番号
    ORDER BY
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP                                  "購買伝票の明細番号
    INTO CORRESPONDING FIELDS OF TABLE @LDT_DATA. "一覧データ
  IF SY-SUBRC <> 0.
    POF_SUBRC = 4.
    RETURN.
  ENDIF.

  CLEAR LDT_DATA1.                                "一覧データ:作業用
  LDT_DATA1 = LDT_DATA.                           "一覧データ:作業用
  SORT LDT_DATA1 ASCENDING BY                     "一覧データ:作業用
      EKORG.                                      "購買組織
  DELETE ADJACENT DUPLICATES FROM LDT_DATA1 COMPARING"一覧データ:作業用
      EKORG.                                      "購買組織
  IF LDT_DATA1 IS NOT INITIAL.                    "一覧データ:作業用
    SELECT
        T024E~EKORG,                              "購買組織
        T024E~EKOTX                               "購買組織テキスト
      FROM T024E                                  "購買組織
      FOR ALL ENTRIES IN @LDT_DATA1               "一覧データ:作業用
      WHERE T024E~EKORG = @LDT_DATA1-EKORG        "購買組織
      INTO TABLE @LDT_T024E.                      "購買組織
    IF SY-SUBRC = 0.
      SORT LDT_T024E ASCENDING BY                 "購買組織
          EKORG.                                  "購買組織
      DELETE ADJACENT DUPLICATES FROM LDT_T024E COMPARING"購買組織
          EKORG.                                  "購買組織
    ENDIF.
  ENDIF.

  CLEAR LDT_DATA1.                                "一覧データ:作業用
  LDT_DATA1 = LDT_DATA.                           "一覧データ:作業用
  SORT LDT_DATA1 ASCENDING BY                     "一覧データ:作業用
      EKGRP.
  DELETE ADJACENT DUPLICATES FROM LDT_DATA1 COMPARING"一覧データ:作業用
      EKGRP.
  IF LDT_DATA1 IS NOT INITIAL.                    "一覧データ:作業用
    SELECT
        T024~EKGRP,                               "購買グループ
        T024~EKNAM                                "購買グループテキスト
      FROM T024                                   "購買グループ
      FOR ALL ENTRIES IN @LDT_DATA1               "一覧データ:作業用
      WHERE T024~EKGRP = @LDT_DATA1-EKGRP         "購買グループ
      INTO TABLE @LDT_T024.                       "購買グループ
    IF SY-SUBRC = 0.
      SORT LDT_T024 ASCENDING BY                  "購買グループ
          EKGRP.                                  "購買グループ
      DELETE ADJACENT DUPLICATES FROM LDT_T024 COMPARING"購買グループ
          EKGRP.                                  "購買グループ
    ENDIF.
  ENDIF.

  CLEAR LDT_DATA1.                                "一覧データ:作業用
  LDT_DATA1 = LDT_DATA.                           "一覧データ:作業用
  SORT LDT_DATA1 ASCENDING BY                     "一覧データ:作業用
      BUKRS.
  DELETE ADJACENT DUPLICATES FROM LDT_DATA1 COMPARING"一覧データ:作業用
      BUKRS.
  IF LDT_DATA1 IS NOT INITIAL.                    "一覧データ:作業用
    SELECT
        T001~BUKRS,                               "会社コード
        T001~BUTXT                                "会社コードまたは会社の名称
      FROM T001
      FOR ALL ENTRIES IN @LDT_DATA1               "一覧データ:作業用
      WHERE T001~BUKRS = @LDT_DATA1-BUKRS         "会社コード
      INTO TABLE @LDT_T001.                       "会社コード
    IF SY-SUBRC = 0.
      SORT LDT_T001 ASCENDING BY                  "会社コード
          BUKRS.                                  "会社コード
      DELETE ADJACENT DUPLICATES FROM LDT_T001 COMPARING"会社コード
          BUKRS.                                  "会社コード
    ENDIF.
  ENDIF.

  CLEAR LDT_DATA1.                                "一覧データ:作業用
  LDT_DATA1 = LDT_DATA.                           "一覧データ:作業用
  SORT LDT_DATA1 ASCENDING BY                     "一覧データ:作業用
      WERKS.
  DELETE ADJACENT DUPLICATES FROM LDT_DATA1 COMPARING"一覧データ:作業用
      WERKS.
  IF LDT_DATA1 IS NOT INITIAL.                    "一覧データ:作業用
    SELECT
        T001W~WERKS,                              "プラント
        T001W~NAME1                               "名称
      FROM T001W                                  "プラント/支店
      FOR ALL ENTRIES IN @LDT_DATA1               "一覧データ:作業用
      WHERE T001W~WERKS = @LDT_DATA1-WERKS        "プラント
      INTO TABLE @LDT_T001W.                      "プラント/支店
    IF SY-SUBRC = 0.
      SORT LDT_T001W ASCENDING BY                 "プラント/支店
          WERKS.                                  "プラント
      DELETE ADJACENT DUPLICATES FROM LDT_T001W COMPARING"プラント/支店
          WERKS.                                  "プラント
    ENDIF.
  ENDIF.

  CLEAR LDT_DATA1.                                "一覧データ:作業用
  LDT_DATA1 = LDT_DATA.                           "一覧データ:作業用
  SORT LDT_DATA1 ASCENDING BY                     "一覧データ:作業用
      WERKS                                       "プラント
      LGORT.                                      "保管場所
  DELETE ADJACENT DUPLICATES FROM LDT_DATA1 COMPARING"一覧データ:作業用
      WERKS                                       "プラント
      LGORT.                                      "保管場所
  IF LDT_DATA1 IS NOT INITIAL.                    "一覧データ:作業用
    SELECT
        T001L~WERKS,                              "プラント
        T001L~LGORT,                              "保管場所
        T001L~LGOBE                               "保管場所テキスト
      FROM T001L                                  "保管場所
      FOR ALL ENTRIES IN @LDT_DATA1               "一覧データ:作業用
      WHERE T001L~WERKS = @LDT_DATA1-WERKS        "プラント
        AND T001L~LGORT = @LDT_DATA1-LGORT        "保管場所
      INTO TABLE @LDT_T001L.                      "保管場所
    IF SY-SUBRC = 0.
      SORT LDT_T001L ASCENDING BY                 "保管場所
          WERKS                                   "プラント
          LGORT.                                  "保管場所
      DELETE ADJACENT DUPLICATES FROM LDT_T001L COMPARING
          WERKS                                   "プラント
          LGORT.                                  "保管場所
    ENDIF.
  ENDIF.

  LOOP AT LDT_DATA ASSIGNING FIELD-SYMBOL(<LFS_DATA>)."一覧データ

    CLEAR LDS_T024E.                              "購買組織
    READ TABLE LDT_T024E WITH KEY                 "購買組織
        EKORG = <LFS_DATA>-EKORG                  "購買組織
      BINARY SEARCH
      INTO LDS_T024E.                             "購買組織
    IF SY-SUBRC = 0.
      <LFS_DATA>-EKOTX = LDS_T024E-EKOTX.         "購買組織テキスト
    ENDIF.

    CLEAR LDS_T024.                               "購買グループ
    READ TABLE LDT_T024 WITH KEY                  "購買グループ
        EKGRP = <LFS_DATA>-EKGRP                  "購買グループ
      BINARY SEARCH
      INTO LDS_T024.                              "購買グループ
    IF SY-SUBRC = 0.
      <LFS_DATA>-EKNAM = LDS_T024-EKNAM.          "購買グループテキスト
    ENDIF.

    CLEAR LDS_T001.                               "会社コード
    READ TABLE LDT_T001 WITH KEY                  "会社コード
        BUKRS = <LFS_DATA>-BUKRS                  "会社コード
      BINARY SEARCH
      INTO LDS_T001.                              "会社コード
    IF SY-SUBRC = 0.
      <LFS_DATA>-BUTXT = LDS_T001-BUTXT.          "会社コードまたは会社の名称
    ENDIF.

    CLEAR LDS_T001W.                              "プラント/支店
    READ TABLE LDT_T001W WITH KEY                 "プラント/支店
        WERKS = <LFS_DATA>-WERKS                  "プラント
      BINARY SEARCH
      INTO LDS_T001W.                             "プラント/支店
    IF SY-SUBRC = 0.
      <LFS_DATA>-NAME1 = LDS_T001W-NAME1.         "名称
    ENDIF.

    CLEAR LDS_T001L.                              "保管場所
    READ TABLE LDT_T001L WITH KEY                 "保管場所
        WERKS = <LFS_DATA>-WERKS                  "プラント
        LGORT = <LFS_DATA>-LGORT                  "保管場所
      BINARY SEARCH
      INTO LDS_T001L.                             "保管場所
    IF SY-SUBRC = 0.
      <LFS_DATA>-LGOBE = LDS_T001L-LGOBE.         "保管場所テキスト
    ENDIF.

  ENDLOOP.

*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_END TYPE TIMESTAMPL.         "タイムスタンプデータ取得終了
  GET TIME STAMP FIELD LDF_TIMESTAMP_END.         "タイムスタンプデータ取得終了
*-----------------------------------------------------------------------
  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.
  DATA(LDO_FUNCTIONS) = LDO_ALV->GET_FUNCTIONS( ).
  LDO_FUNCTIONS->SET_ALL( ).
  DATA(LDO_SELECTIONS) = LDO_ALV->GET_SELECTIONS( ).
  LDO_SELECTIONS->SET_SELECTION_MODE(
  EXPORTING
  VALUE = IF_SALV_C_SELECTION_MODE=>MULTIPLE ).

  "ヘッダ表示
  DATA(LDO_HEADER) = NEW CL_SALV_FORM_LAYOUT_GRID( ).

  DATA(LDO_H_LABEL) = LDO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ).
  LDO_H_LABEL->SET_TEXT( 'パフォーマンスデータ' ).

  DATA(LDO_H_FLOW) = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得開始' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 2 ).
  DATA LDF_UTC_START TYPE CHAR30.
  WRITE LDF_TIMESTAMP_START TIME ZONE 'JAPAN' TO LDF_UTC_START.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_START ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得終了' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 2 ).
  DATA LDF_UTC_END TYPE CHAR30.
  WRITE LDF_TIMESTAMP_END TIME ZONE 'JAPAN' TO LDF_UTC_END.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_END ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '出力件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LINES( LDT_DATA ) ).

  LDO_ALV->SET_TOP_OF_LIST( LDO_HEADER ).
  LDO_ALV->SET_TOP_OF_LIST_PRINT( LDO_HEADER ).

  LDO_ALV->DISPLAY( ).

  POF_SUBRC = 0.
ENDFORM.

*-----------------------------------------------------------------------
* SUBROUTINE
*-----------------------------------------------------------------------
FORM START_OF_SELECTION_LOOP2
    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.
*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_START TYPE TIMESTAMPL.       "タイムスタンプデータ取得開始
  GET TIME STAMP FIELD LDF_TIMESTAMP_START.       "タイムスタンプデータ取得開始
*-----------------------------------------------------------------------
* Please write the SQL statement here ☆
* Set the internal table to be stored to LDT_DATA ☆
* Inline definition of LDT_DATA is fun ☆
  TYPES:
    BEGIN OF LTS_DATA,                            "一覧データ
      EBELN TYPE EKPO-EBELN,                      "購買伝票番号
      EBELP TYPE EKPO-EBELP,                      "購買伝票の明細番号
      EKORG TYPE EKKO-EKORG,                      "購買組織
      EKOTX TYPE T024E-EKOTX,                     "購買組織テキスト
      EKGRP TYPE EKKO-EKGRP,                      "購買グループ
      EKNAM TYPE T024-EKNAM,                      "購買グループテキスト
      BUKRS TYPE EKKO-BUKRS,                      "会社コード
      BUTXT TYPE T001-BUTXT,                      "会社コードまたは会社の名称
      MATNR TYPE EKPO-MATNR,                      "品目コード
      TXZ01 TYPE EKPO-TXZ01,                      "テキスト (短)
      WERKS TYPE EKPO-WERKS,                      "プラント
      NAME1 TYPE T001W-NAME1,                     "名称
      LGORT TYPE EKPO-LGORT,                      "保管場所
      LGOBE TYPE T001L-LGOBE,                     "保管場所テキスト
      MENGE TYPE EKPO-MENGE,                      "購買発注量
      MEINS TYPE EKPO-MEINS,                      "発注単位
    END OF LTS_DATA,
    LTT_DATA TYPE STANDARD TABLE OF LTS_DATA,     "一覧データ

    BEGIN OF LTS_T024E,                           "購買組織
      EKORG TYPE T024E-EKORG,                     "購買組織
      EKOTX TYPE T024E-EKOTX,                     "購買組織テキスト
    END OF LTS_T024E,
    LTT_T024E TYPE STANDARD TABLE OF LTS_T024E,   "購買組織

    BEGIN OF LTS_T024,                            "購買グループ
      EKGRP TYPE T024-EKGRP,                      "購買グループ
      EKNAM TYPE T024-EKNAM,                      "購買グループテキスト
    END OF LTS_T024,
    LTT_T024 TYPE STANDARD TABLE OF LTS_T024,     "購買グループ

    BEGIN OF LTS_T001,                            "会社コード
      BUKRS TYPE T001-BUKRS,                      "会社コード
      BUTXT TYPE T001-BUTXT,                      "会社コードまたは会社の名称
    END OF LTS_T001,
    LTT_T001 TYPE STANDARD TABLE OF LTS_T001,     "会社コード

    BEGIN OF LTS_T001W,                           "プラント/支店
      WERKS TYPE T001W-WERKS,                     "プラント
      NAME1 TYPE T001W-NAME1,                     "名称
    END OF LTS_T001W,
    LTT_T001W TYPE STANDARD TABLE OF LTS_T001W,   "プラント/支店

    BEGIN OF LTS_T001L,                           "保管場所
      WERKS TYPE T001L-WERKS,                     "プラント
      LGORT TYPE T001L-LGORT,                     "保管場所
      LGOBE TYPE T001L-LGOBE,                     "保管場所テキスト
    END OF LTS_T001L,
    LTT_T001L TYPE STANDARD TABLE OF LTS_T001L.   "保管場所

  DATA:
    LDT_DATA  TYPE LTT_DATA,                      "一覧データ

    LDT_T024E TYPE LTT_T024E,                     "購買組織
    LDS_T024E LIKE LINE OF LDT_T024E,             "購買組織
    LDT_T024  TYPE LTT_T024,                      "購買グループ
    LDS_T024  LIKE LINE OF LDT_T024,              "購買グループ
    LDT_T001  TYPE LTT_T001,                      "会社コード
    LDS_T001  LIKE LINE OF LDT_T001,              "会社コード
    LDT_T001W TYPE LTT_T001W,                     "プラント/支店
    LDS_T001W LIKE LINE OF LDT_T001W,             "プラント/支店
    LDT_T001L TYPE LTT_T001L,                     "保管場所
    LDS_T001L LIKE LINE OF LDT_T001L.             "保管場所

  SELECT
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP,                                 "購買伝票の明細番号
      EKKO~EKORG,                                 "購買組織
      EKKO~EKGRP,                                 "購買グループ
      EKKO~BUKRS,                                 "会社コード
      EKPO~MATNR,                                 "品目コード
      EKPO~TXZ01,                                 "テキスト (短)
      EKPO~WERKS,                                 "プラント
      EKPO~LGORT,                                 "保管場所
      EKPO~MENGE,                                 "購買発注量
      EKPO~MEINS                                  "発注単位
    FROM EKPO                                     "購買伝票明細
    INNER JOIN EKKO                               "購買伝票ヘッダ
       ON EKKO~EBELN = EKPO~EBELN                 "購買伝票番号
    ORDER BY
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP                                  "購買伝票の明細番号
    INTO CORRESPONDING FIELDS OF TABLE @LDT_DATA. "一覧データ
  IF SY-SUBRC <> 0.
    POF_SUBRC = 4.
    RETURN.
  ENDIF.

  WITH
  +LDT_DATA AS ( SELECT                           "一覧データ
      LDT_DATA~EKORG                              "購買組織
    FROM @LDT_DATA AS LDT_DATA                    "一覧データ
    GROUP BY
      LDT_DATA~EKORG )                            "購買組織
  SELECT
      T024E~EKORG,                                "購買組織
      T024E~EKOTX                                 "購買組織テキスト
    FROM T024E                                    "購買組織
    INNER JOIN +LDT_DATA                          "一覧データ
       ON +LDT_DATA~EKORG = T024E~EKORG           "購買組織
    ORDER BY
      T024E~EKORG                                 "購買組織
    INTO TABLE @LDT_T024E.                        "購買組織

  WITH
  +LDT_DATA AS ( SELECT                           "一覧データ
      LDT_DATA~EKGRP                              "購買グループ
    FROM @LDT_DATA AS LDT_DATA                    "一覧データ
    GROUP BY
      LDT_DATA~EKGRP )                            "購買グループ
  SELECT
      T024~EKGRP,                                 "購買グループ
      T024~EKNAM                                  "購買グループテキスト
    FROM T024                                     "購買グループ
    INNER JOIN +LDT_DATA                          "一覧データ
       ON +LDT_DATA~EKGRP = T024~EKGRP            "購買グループ
    ORDER BY
      T024~EKGRP                                  "購買グループ
    INTO TABLE @LDT_T024.                         "購買グループ

  WITH
  +LDT_DATA AS ( SELECT                           "一覧データ
      LDT_DATA~BUKRS                              "会社コード
    FROM @LDT_DATA AS LDT_DATA                    "一覧データ
    GROUP BY
      LDT_DATA~BUKRS )                            "会社コード
  SELECT
      T001~BUKRS,                                 "会社コード
      T001~BUTXT                                  "会社コードまたは会社の名称
    FROM T001                                     "会社コード
    INNER JOIN +LDT_DATA                          "一覧データ
       ON +LDT_DATA~BUKRS = T001~BUKRS            "会社コード
    ORDER BY
      T001~BUKRS                                  "会社コード
    INTO TABLE @LDT_T001.                         "会社コード

  WITH
  +LDT_DATA AS ( SELECT                           "一覧データ
      LDT_DATA~WERKS                              "プラント
    FROM @LDT_DATA AS LDT_DATA                    "一覧データ
    GROUP BY
      LDT_DATA~WERKS )                            "プラント
  SELECT
      T001W~WERKS,                                "プラント
      T001W~NAME1                                 "名称
    FROM T001W                                    "プラント/支店
    INNER JOIN +LDT_DATA                          "一覧データ
       ON +LDT_DATA~WERKS = T001W~WERKS           "プラント
    ORDER BY
      T001W~WERKS                                 "プラント
    INTO TABLE @LDT_T001W.                        "プラント/支店

  WITH
  +LDT_DATA AS ( SELECT                           "一覧データ
      LDT_DATA~WERKS,                             "プラント
      LDT_DATA~LGORT                              "保管場所
    FROM @LDT_DATA AS LDT_DATA                    "一覧データ
    GROUP BY
      LDT_DATA~WERKS,                             "プラント
      LDT_DATA~LGORT )                            "保管場所
  SELECT
      T001L~WERKS,                                "プラント
      T001L~LGORT,                                "保管場所
      T001L~LGOBE                                 "保管場所テキスト
    FROM T001L                                    "保管場所
    INNER JOIN +LDT_DATA                          "一覧データ
       ON +LDT_DATA~WERKS = T001L~WERKS           "プラント
      AND +LDT_DATA~LGORT = T001L~LGORT           "保管場所
    ORDER BY
      T001L~WERKS,                                "プラント
      T001L~LGORT                                 "保管場所
    INTO TABLE @LDT_T001L.                        "保管場所

  LOOP AT LDT_DATA ASSIGNING FIELD-SYMBOL(<LFS_DATA>)."一覧データ

    CLEAR LDS_T024E.                              "購買組織
    READ TABLE LDT_T024E WITH KEY                 "購買組織
        EKORG = <LFS_DATA>-EKORG                  "購買組織
      BINARY SEARCH
      INTO LDS_T024E.                             "購買組織
    IF SY-SUBRC = 0.
      <LFS_DATA>-EKOTX = LDS_T024E-EKOTX.         "購買組織テキスト
    ENDIF.

    CLEAR LDS_T024.                               "購買グループ
    READ TABLE LDT_T024 WITH KEY                  "購買グループ
        EKGRP = <LFS_DATA>-EKGRP                  "購買グループ
      BINARY SEARCH
      INTO LDS_T024.                              "購買グループ
    IF SY-SUBRC = 0.
      <LFS_DATA>-EKNAM = LDS_T024-EKNAM.          "購買グループテキスト
    ENDIF.

    CLEAR LDS_T001.                               "会社コード
    READ TABLE LDT_T001 WITH KEY                  "会社コード
        BUKRS = <LFS_DATA>-BUKRS                  "会社コード
      BINARY SEARCH
      INTO LDS_T001.                              "会社コード
    IF SY-SUBRC = 0.
      <LFS_DATA>-BUTXT = LDS_T001-BUTXT.          "会社コードまたは会社の名称
    ENDIF.

    CLEAR LDS_T001W.                              "プラント/支店
    READ TABLE LDT_T001W WITH KEY                 "プラント/支店
        WERKS = <LFS_DATA>-WERKS                  "プラント
      BINARY SEARCH
      INTO LDS_T001W.                             "プラント/支店
    IF SY-SUBRC = 0.
      <LFS_DATA>-NAME1 = LDS_T001W-NAME1.         "名称
    ENDIF.

    CLEAR LDS_T001L.                              "保管場所
    READ TABLE LDT_T001L WITH KEY                 "保管場所
        WERKS = <LFS_DATA>-WERKS                  "プラント
        LGORT = <LFS_DATA>-LGORT                  "保管場所
      BINARY SEARCH
      INTO LDS_T001L.                             "保管場所
    IF SY-SUBRC = 0.
      <LFS_DATA>-LGOBE = LDS_T001L-LGOBE.         "保管場所テキスト
    ENDIF.

  ENDLOOP.

*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_END TYPE TIMESTAMPL.         "タイムスタンプデータ取得終了
  GET TIME STAMP FIELD LDF_TIMESTAMP_END.         "タイムスタンプデータ取得終了
*-----------------------------------------------------------------------
  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.
  DATA(LDO_FUNCTIONS) = LDO_ALV->GET_FUNCTIONS( ).
  LDO_FUNCTIONS->SET_ALL( ).
  DATA(LDO_SELECTIONS) = LDO_ALV->GET_SELECTIONS( ).
  LDO_SELECTIONS->SET_SELECTION_MODE(
  EXPORTING
  VALUE = IF_SALV_C_SELECTION_MODE=>MULTIPLE ).

  "ヘッダ表示
  DATA(LDO_HEADER) = NEW CL_SALV_FORM_LAYOUT_GRID( ).

  DATA(LDO_H_LABEL) = LDO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ).
  LDO_H_LABEL->SET_TEXT( 'パフォーマンスデータ' ).

  DATA(LDO_H_FLOW) = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得開始' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 2 ).
  DATA LDF_UTC_START TYPE CHAR30.
  WRITE LDF_TIMESTAMP_START TIME ZONE 'JAPAN' TO LDF_UTC_START.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_START ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得終了' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 2 ).
  DATA LDF_UTC_END TYPE CHAR30.
  WRITE LDF_TIMESTAMP_END TIME ZONE 'JAPAN' TO LDF_UTC_END.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_END ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '出力件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LINES( LDT_DATA ) ).

  LDO_ALV->SET_TOP_OF_LIST( LDO_HEADER ).
  LDO_ALV->SET_TOP_OF_LIST_PRINT( LDO_HEADER ).

  LDO_ALV->DISPLAY( ).

  POF_SUBRC = 0.
ENDFORM.

*-----------------------------------------------------------------------
* SUBROUTINE
*-----------------------------------------------------------------------
FORM START_OF_SELECTION_JOIN
    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.
*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_START TYPE TIMESTAMPL.       "タイムスタンプデータ取得開始
  GET TIME STAMP FIELD LDF_TIMESTAMP_START.       "タイムスタンプデータ取得開始
*-----------------------------------------------------------------------
* Please write the SQL statement here ☆
* Set the internal table to be stored to LDT_DATA ☆
* Inline definition of LDT_DATA is fun ☆
  TYPES:
    BEGIN OF LTS_DATA,                            "一覧データ
      EBELN TYPE EKPO-EBELN,                      "購買伝票番号
      EBELP TYPE EKPO-EBELP,                      "購買伝票の明細番号
      EKORG TYPE EKKO-EKORG,                      "購買組織
      EKOTX TYPE T024E-EKOTX,                     "購買組織テキスト
      EKGRP TYPE EKKO-EKGRP,                      "購買グループ
      EKNAM TYPE T024-EKNAM,                      "購買グループテキスト
      BUKRS TYPE EKKO-BUKRS,                      "会社コード
      BUTXT TYPE T001-BUTXT,                      "会社コードまたは会社の名称
      MATNR TYPE EKPO-MATNR,                      "品目コード
      TXZ01 TYPE EKPO-TXZ01,                      "テキスト (短)
      WERKS TYPE EKPO-WERKS,                      "プラント
      NAME1 TYPE T001W-NAME1,                     "名称
      LGORT TYPE EKPO-LGORT,                      "保管場所
      LGOBE TYPE T001L-LGOBE,                     "保管場所テキスト
      MENGE TYPE EKPO-MENGE,                      "購買発注量
      MEINS TYPE EKPO-MEINS,                      "発注単位
    END OF LTS_DATA,
    LTT_DATA TYPE STANDARD TABLE OF LTS_DATA.     "一覧データ
  DATA:
    LDT_DATA TYPE LTT_DATA.                       "一覧データ

  SELECT
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP,                                 "購買伝票の明細番号
      EKKO~EKORG,                                 "購買組織
      T024E~EKOTX,                                "購買組織テキスト
      EKKO~EKGRP,                                 "購買グループ
      T024~EKNAM,                                 "購買グループテキスト
      EKKO~BUKRS,                                 "会社コード
      T001~BUTXT,                                 "会社コードまたは会社の名称
      EKPO~MATNR,                                 "品目コード
      EKPO~TXZ01,                                 "テキスト (短)
      EKPO~WERKS,                                 "プラント
      T001W~NAME1,                                "名称
      EKPO~LGORT,                                 "保管場所
      T001L~LGOBE,                                "保管場所テキスト
      EKPO~MENGE,                                 "購買発注量
      EKPO~MEINS                                  "発注単位
    FROM EKPO                                     "購買伝票明細
    INNER JOIN EKKO                               "購買伝票ヘッダ
       ON EKKO~EBELN = EKPO~EBELN                 "購買伝票番号
    LEFT OUTER JOIN T024E                         "購買組織
       ON T024E~EKORG = EKKO~EKORG                "購買組織
    LEFT OUTER JOIN T024                          "購買グループ
       ON T024~EKGRP = EKKO~EKGRP                 "購買グループ
    LEFT OUTER JOIN T001                          "会社コード
       ON T001~BUKRS = EKKO~BUKRS                 "会社コード
    LEFT OUTER JOIN T001W                         "プラント/支店
       ON T001W~WERKS = EKPO~WERKS                "プラント
    LEFT OUTER JOIN T001L                         "保管場所
       ON T001L~WERKS = EKPO~WERKS                "プラント
      AND T001L~LGORT = EKPO~LGORT                "保管場所
    ORDER BY
      EKPO~EBELN,                                 "購買伝票番号
      EKPO~EBELP                                  "購買伝票の明細番号
    INTO TABLE @LDT_DATA.                         "一覧データ
  IF SY-SUBRC <> 0.
    POF_SUBRC = 4.
    RETURN.
  ENDIF.

*-----------------------------------------------------------------------
  DATA LDF_TIMESTAMP_END TYPE TIMESTAMPL.         "タイムスタンプデータ取得終了
  GET TIME STAMP FIELD LDF_TIMESTAMP_END.         "タイムスタンプデータ取得終了
*-----------------------------------------------------------------------
  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.
  DATA(LDO_FUNCTIONS) = LDO_ALV->GET_FUNCTIONS( ).
  LDO_FUNCTIONS->SET_ALL( ).
  DATA(LDO_SELECTIONS) = LDO_ALV->GET_SELECTIONS( ).
  LDO_SELECTIONS->SET_SELECTION_MODE(
  EXPORTING
  VALUE = IF_SALV_C_SELECTION_MODE=>MULTIPLE ).

  "ヘッダ表示
  DATA(LDO_HEADER) = NEW CL_SALV_FORM_LAYOUT_GRID( ).

  DATA(LDO_H_LABEL) = LDO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ).
  LDO_H_LABEL->SET_TEXT( 'パフォーマンスデータ' ).

  DATA(LDO_H_FLOW) = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得開始' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 2 ).
  DATA LDF_UTC_START TYPE CHAR30.
  WRITE LDF_TIMESTAMP_START TIME ZONE 'JAPAN' TO LDF_UTC_START.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_START ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得終了' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 2 ).
  DATA LDF_UTC_END TYPE CHAR30.
  WRITE LDF_TIMESTAMP_END TIME ZONE 'JAPAN' TO LDF_UTC_END.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_END ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '出力件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LINES( LDT_DATA ) ).

  LDO_ALV->SET_TOP_OF_LIST( LDO_HEADER ).
  LDO_ALV->SET_TOP_OF_LIST_PRINT( LDO_HEADER ).

  LDO_ALV->DISPLAY( ).

  POF_SUBRC = 0.
ENDFORM.

最近はこんなのを聴いています。
www.youtube.com

検索キーワード
ABAP
ABAP 7.52
SQL
Open SQL
New Open SQL
Classic Open SQL
ABAP SQL
SAP HANA
Code to Data
Code Pushdown
SAP S/4HANA
WITH
SELECT〜FROM @ITAB
FOR ALL ENTRIES IN

以上

ヘッドホン:AKG K550:イヤーパッド に悩む

イヤーパッドが劣化していて、社外品に交換して使っていました。時系列を辿ると以下の通り。

社外品イヤーパッド交換
https://www.amazon.co.jp/dp/B00XKL36V6/

ヘッドホン:AKG K550 バランス化 ?
https://daih73.hatenablog.jp/entry/2019/10/23/004534

ヘッドホン:ようやくバランス駆動で聴いてみた!
https://daih73.hatenablog.jp/entry/2019/12/04/015908

を経て、実は困った事態になっていました。左右のバランスが合っていないような気がする。

アンバランスワイヤレスの時はセパレーションが普通だったのあまり気にならなかったのですが、バランスワイヤードにすると、セパレーションが良好なので、左右が合わない。気になる。困った。

家電量販店で(笑)、どれが原因か突き止めるために、ヘッドホンのみ交換、DACのみ交換...と、探ってみると、いずれも白。そこで、イヤーパッドの付ける向きを色々変えると解消しました。ですが~腑に落ちない。店内をフラフラしていると、思いつきました。オーディオテクニカ ART MONITORの売り場に、似たようなイヤーパッドがあるじゃないか。

https://www.amazon.co.jp/dp/B016DD8HVQ

このシリーズは、1~20万円で多彩なバリエーションを展開していて、過去機種も合わせると相当数に上る。そんな中で、勘を頼りに吟味に吟味を重ねました。そういえば以前MDR-CD900STの時にもオーディオテクニカイヤーパッドを純正流用しました。何が良いって、品質が安定していて安い。今回も純正流用情報をインターネットで探しました。一つもない。付かないのかなぁ~人柱ということで購入しました。

https://www.soundhouse.co.jp/products/detail/item/240972/

ぶっつけ本番現物合わせです。

f:id:dai_h_73:20200130134351j:plain

少しヘッドホンの直径が大きいのかな?でも切った貼ったをすることなく、ギリギリ誤差の範囲内でポン付け成功しました。良いです。耳をやさしく包み込んでくれて、隙間を作らず、左右のバランスも完璧です。初めからこれにしておけば良かったなぁ~。

ヘッドホン:ようやくバランス駆動で聴いてみた!

過去日記に純A級プッシュプルBTL接続の自作計画とか書いていましたが、モダンなオーディオ環境を少し勉強しました。
アナログ回路が音質を大きく決めるのは変わりないですが、完全バランス駆動をしようとすると、DAコンバータをプラス・マイナス×右・左の合計4個用意して、それぞれの出力をバランス増幅器の入力に接続するのが理想的だそうです。また、アナログのアンバランス→バランス回路は完全対称にはならないそうです。さらにいろいろ徘徊していると、イージーな解決に至りました。

iBasso DC01を導入すればいいじゃん。
https://www.amazon.co.jp/dp/B07RTRB5MR

f:id:dai_h_73:20191204012424j:plain

そんなわけで、イージーに解決しました。

そして、DACとヘッドホンを繋ぐ電線が必要ですね。
こちらは予定通り、AKG K701バランス化?で切断した4本取りのケーブルを1.2mに切断して、自作しました。
当初、オヤイデの参考資料通りに作ったのですが、ピンアサインに誤りがありました。デファクトのAstell&Kern2.5mmとSONY ZX2 2.5mmでピンササインが異なるんです。
チップ側から
Astell&Kern2.5mm:R-:R+:L+:L-
MDR-1A 3.5mm:L+:R+:R-:L-
ちなみに、AKG K701の配線は、
L+:黄
L-:白
R+:赤
R-:黒
となっていたので、こちらも合わせました。

f:id:dai_h_73:20191204012316j:plain

で、こんな感じです。もう立派な趣味です。

f:id:dai_h_73:20191204012737j:plain

スマートフォン(NEXUS 6P)とノートパソコン(Windows10)の両方で軽く聴いてみました。ノートパソコンの方が音が良かったです。いろいろ要因はあると思うのですが、生意気にも電源容量の差なのかなと思いました。(違うかもしれないけれど)

あと意外だったのは、Bluetoothレシーバ(TT-BR06)の音が悪くないと思いました。64Ω開放型のAKG K701もなんとか音量確保できているし。
https://www.amazon.co.jp/dp/B076D42BKT

まだまだ、スマホは専用アプリをインストールしたり、ノートパソコンはASIOドライバをインストールしたり、やることがありますが、一旦ひと段落。

MDR-Z1000・AKG K701・AKG K550をバランス駆動している人は少ない(普通しねーよ)ようなので、なんちゃってレヴューとか書いちゃおうかな。

今回手に入れたセットを使って、量販店でいろいろ試聴しようかな。

こんなの聴いてます。

Chick Corea Elektric Band - Light Years (Light Years 1987.)

ヘッドホン:AKG K701 バランス化 ?

MDR-CD900STと同様、以下同文、と言うことなのですが。

AKG K701のハウジングの開け方を、インターネット検索しました。外側のアミアミを時計と反対側に回すと、開けられることが分かりました。またこの最初の部分が最難関だそうです。左側を開けて3.5mm4極ジャックを付けようと思っていましたが、最初の難関を越えることが出来ませんでした。勇気がなくて。そこで、AKG K701はシリーズ唯一配線が4本取ということで、暫定処置としてカジュアルにバランス化することにしました。

安価に入手したとは言え、勇気を振り絞ってコードを切りました。ぶった切るのって何回やっても嫌〜な感触です。根元から切るのは躊躇してしまい10cm程度残しました。

f:id:dai_h_73:20191123171212j:plain

本来は中継用3.5mmジャックを付けるべきなのでしょうが、手持ちが無いのと、手持のパネル用ジャックの裏が比較的スマートなので、配線剥き出しでそのままつけることにしました。

f:id:dai_h_73:20191123211620j:plain

f:id:dai_h_73:20191123212951j:plain

連日こういった作業をしていると、ちょろくなってきます。老眼鏡と言う新兵器が有効に効きます。いつものように、左右パンが振ってある曲で左右を確認して、ボーカルもので定位を確認して終了でした。

で、有名な話なのですが、AKG K701フルオープンエアー型なんですよね。つまり音漏れ前提ということ。だからインプレッションなんかでは、自宅用とか、電車の中で使うなと。今、自宅でこれを書きながら聴いています。やっぱりコードから解放されると、自宅内とは言え使い勝手が良くなります。稼働率も上がると思います。多分自宅内ではAKG K701一択になる予感がしています。後は、自転車移動の時にお外へ連れ出そうかな。

で、ぶった切ったケーブルの方は、3.5mm4極-2.5mm4極の、MDR-1A互換バランスケーブルにしようと思います。モガミのなんたらも買ってあったのですが、いらなくなっちゃった。

f:id:dai_h_73:20191123213313j:plain

なんか身軽になって助かります。夜洗い物とかしている時に、気持ち良く音楽が楽しめます。そして、本気で聴こうと思った時は、今後導入予定のバランス駆動ヘッドホンアンプできこうと思います。

つい先程、小学2年生の息子が、カマカマの歌をAKG K701で聴いてお布団に入りました。


Culture Club - Karma Chameleon (Official Video)

ABAP New open SQL:ACDOCA、ACDOCPから予実前年度対比月次損益計算書みたいな

最初に、
今回のソースコードは、ちょっと動かす程度ならば構いませんが、このソースコードをベースにプロジェクトで使う場合は、必ずご連絡(コメントにメールアドレスを書いてね)お願いします。
※無断使用を発見した場合は怒ります(爆)。知的所有権の類を放棄したわけではありません。


久しぶりに、ABAPネタを書きます。ヘッドホンの改造ばっかりだったものね。

さて、ABAP 7.52から、WITH句が新たにサポートされました。そのため、SELECT文の入れ子が比較的簡単に出来るようになったと感じています。
いよいよ、New Open SQL 改め ABAP SQLで、Code Pushdown時代の幕開けです。

思い起こせば...
HANA Infomation View時代は、上記の入れ子構造をカジュアルに実装できていました。
ABAP CDS Viewの時代(自身のプロジェクトアサインの都合でサンプル程度しか実装していませんが)は、ViewがViewを呼ぶため、憶測ではありますが作るViewはシンプルですがたくさん作る必要があるように感じます。
そして、ABAP Reportプログラム内のNew Open SQL改め、ABAP SQLですねぇ~。個人的には大本命と思っています。なにしろ、開発者の母集団が大きいから。
WITH句を使うことで、SORT命令、DELETE DUPLICATE~命令、FOR ALL ENTRIES IN句の組み合わせを、ほぼ撲滅できます(多分)。これについては、別途記事を書きます。

今までのABAP SQLのベーシックな動きを説明するのも良いのですが、少し色気ついて「えっ」って思って頂けるようなサンプルを遊びで作ってみました。
ただし、今ソースをベースに実プロジェクトで使う場合は無償で構いませんが必ず一報下さい。(誰も興味ないかな(爆))パフォーマンスデータが欲しいので測定をお願いすることになると思います。
※無断使用を発見した場合は怒ります(爆)。知的所有権の類を放棄したわけではありません。

簡単に、プログラムの説明を。
以下のテーブルより、期・勘定ごとに、金額を取得します。
・ACDOCA-当年度実績
・ACDOCA-前年度実績
・ACDOCP-当年度予算(年間計画)
・ACDOCP-当年度見込
縦軸:勘定
横軸:期別の金額

当年度実績については、選択画面の会計期間以下は、ACDOCA-当年度実績、会計期間を超える場合は、背景色を変えてACDOCP-見込の金額を表示します。
ACDOCPの数値を表示しているセルは、色を変えるようにしました。

※急いで作ったのでソースコードがあらびきです。ALV周りとか...通貨参照してないし...予算用勘定とか出来るけれど変換してないし...。
※テストは行っていません。Code Pushdownの雰囲気を感じてね(笑)。
会計とかよく知らないので、出てくる数字は多分ぐちゃぐちゃです。売上総利益とか計算してないし。

ABAP RESTful Programming Modelやってみたいなぁ~。
ABAP CDSやってみたいなぁ~。
お仕事ください(切実に...)

私が動かした環境(いわゆる開発機)では、ACDOCAの2年分データ(250万レコード)で、データ取得、0.1秒でした。実行ボタン押下~ALV表示までで、1秒を切っていました。
しかしながら、このロジックを、Webi等のレポーティングツールに移植するのはおそらく無理です。理由としてはパラメータクエリになってしまっているから。
そこで...実は(いやらしくも小出しにしています(笑))レポーティングツール移植可能なPure View Base(いま用語を作りました)のロジックも、以前HANA Infomation Viewで作ったことがあります。
こちらはACDOCAの2年分データ3000万レコードで0.3秒程度でした。

※Pure View Baseとは、
SELECT * FROM [Pure View Base] WHERE ~;で動くもの。

もうさ~マートは作らなくていいよ。

ABAP 7.4バージョン(ACDOCAのみ)別途書こうかな。(多少LOOP回っちゃいます)
ABAP 7.31バージョン(BKPF、BSEGのみ)は、気が向いたら書きます。(これは大分ぐるぐるLOOP回っちゃいます)

ABAP 7.52以降で動きます。
(2019-11-21:多少修正しました)

*&---------------------------------------------------------------------*
*& Report Y_CODE_PUSHDOWN
*&---------------------------------------------------------------------*
*& ACDOCA、ACDOCPから予実前年度対比月次損益計算書みたいな
*&---------------------------------------------------------------------*
REPORT Y_CODE_PUSHDOWN.

*&---------------------------------------------------------------------*
* 選択画面
*&---------------------------------------------------------------------*
PARAMETERS:
  P_RLDNR  TYPE ACDOCA-RLDNR,                     "総勘定元帳の元帳
  P_RBUKRS TYPE ACDOCA-RBUKRS,                    "会社コード
  P_GJAHR  TYPE ACDOCA-GJAHR,                     "会計年度
  P_POPER  TYPE ACDOCA-POPER,                     "会計期間
  P_CATEB  TYPE ACDOCP-CATEGORY,                  "カテゴリ予算
  P_CATEF  TYPE ACDOCP-CATEGORY.                  "カテゴリ見通

START-OF-SELECTION.
  PERFORM START_OF_SELECTION.                     "主処理

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
FORM START_OF_SELECTION.
*&---------------------------------------------------------------------*
  DATA:
    LDF_SUBRC TYPE SY-SUBRC.

  PERFORM GET_LIST                                "一覧を取得する
    USING
      P_RLDNR                                     "総勘定元帳の元帳
      P_RBUKRS                                    "会社コード
      P_GJAHR                                     "会計年度
      P_POPER                                     "会計期間
      P_CATEB                                     "カテゴリ予算
      P_CATEF                                     "カテゴリ見通
    CHANGING
      LDF_SUBRC.

ENDFORM.

*&---------------------------------------------------------------------*
* 一覧を取得する
*&---------------------------------------------------------------------*
FORM GET_LIST
    USING
      PIF_RLDNR  TYPE ACDOCA-RLDNR
      PIF_RBUKRS TYPE ACDOCA-RBUKRS
      PIF_GJAHR  TYPE ACDOCA-GJAHR
      PIF_POPER  TYPE ACDOCA-POPER
      PIF_CATEB  TYPE ACDOCP-CATEGORY
      PIF_CATEF  TYPE ACDOCP-CATEGORY
    CHANGING
      POF_SUBRC TYPE SY-SUBRC.
*&---------------------------------------------------------------------*
  SELECT COUNT( * ) FROM ACDOCA
    INTO @DATA(LDF_ACDOCA_COUNT).                 "全ACDOCA件数
  SELECT COUNT( * ) FROM ACDOCP
    INTO @DATA(LDF_ACDOCP_COUNT).                 "全ACDOCP件数
  "当年度実績:実績
  SELECT COUNT( * )
    FROM ACDOCA                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCA~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCA~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCA~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCA~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCA~RYEAR  = @PIF_GJAHR              "会計年度
      AND ACDOCA~POPER <= @PIF_POPER              "会計期間
      AND ACDOCA~BSTAT  = @SPACE                  "伝票ステータス
    INTO @DATA(LDF_ACDOCA_AC0).                   "当年度実績:実績ACDOCA件数
  "当年度実績:見通
  SELECT COUNT( * )
    FROM ACDOCP                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCP~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCP~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCP~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCP~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCP~RYEAR  = @PIF_GJAHR              "会計年度
      AND ACDOCP~POPER  > @PIF_POPER              "会計期間
    INTO @DATA(LDF_ACDOCP_AC0).                   "当年度実績:見通ACDOCP件数
  "当年度予算
  SELECT COUNT( * )
    FROM ACDOCP                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCP~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCP~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCP~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCP~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCP~RYEAR  = @PIF_GJAHR              "会計年度
    INTO @DATA(LDF_ACDOCP_PC0).                   "当年度予算ACDOCP件数
  "前年度実績
  SELECT COUNT( * )
    FROM ACDOCA                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCA~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCA~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCA~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCA~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCA~RYEAR  = @( PIF_GJAHR - 1 )      "会計年度
      AND ACDOCA~BSTAT  = @SPACE                  "伝票ステータス
    INTO @DATA(LDF_ACDOCA_AP1).                   "前年度実績ACDOCA件数

  DATA LDF_TIMESTAMP_START TYPE TIMESTAMPL.       "タイムスタンプデータ取得開始
  GET TIME STAMP FIELD LDF_TIMESTAMP_START.       "タイムスタンプデータ取得開始

  CONSTANTS LCF_ZERO TYPE FINS_VHCUR12 VALUE 0.
  WITH
  +ACDOCA AS (
  "当年度実績:実績
  SELECT
      ACDOCA~RLDNR,                               "総勘定元帳の元帳
      ACDOCA~RBUKRS,                              "会社コード
      ACDOCA~KTOPL,                               "勘定コード表
      ACDOCA~RACCT,                               "勘定コード
      ACDOCA~RHCUR,                               "会社コード通貨
      SUM( CASE ACDOCA~POPER WHEN '001' THEN ACDOCA~HSL ELSE 0 END ) AS HSL001AC0,  "当年度001期実績
      @LCF_ZERO AS HSL001PC0,                                                       "当年度001期予算
      @LCF_ZERO AS HSL001AP1,                                                       "前年度001期実績
      SUM( CASE ACDOCA~POPER WHEN '002' THEN ACDOCA~HSL ELSE 0 END ) AS HSL002AC0,  "当年度002期実績
      @LCF_ZERO AS HSL002PC0,                                                       "当年度002期予算
      @LCF_ZERO AS HSL002AP1,                                                       "前年度002期実績
      SUM( CASE ACDOCA~POPER WHEN '003' THEN ACDOCA~HSL ELSE 0 END ) AS HSL003AC0,  "当年度003期実績
      @LCF_ZERO AS HSL003PC0,                                                       "当年度003期予算
      @LCF_ZERO AS HSL003AP1,                                                       "前年度003期実績
      SUM( CASE ACDOCA~POPER WHEN '004' THEN ACDOCA~HSL ELSE 0 END ) AS HSL004AC0,  "当年度004期実績
      @LCF_ZERO AS HSL004PC0,                                                       "当年度004期予算
      @LCF_ZERO AS HSL004AP1,                                                       "前年度004期実績
      SUM( CASE ACDOCA~POPER WHEN '005' THEN ACDOCA~HSL ELSE 0 END ) AS HSL005AC0,  "当年度005期実績
      @LCF_ZERO AS HSL005PC0,                                                       "当年度005期予算
      @LCF_ZERO AS HSL005AP1,                                                       "前年度005期実績
      SUM( CASE ACDOCA~POPER WHEN '006' THEN ACDOCA~HSL ELSE 0 END ) AS HSL006AC0,  "当年度006期実績
      @LCF_ZERO AS HSL006PC0,                                                       "当年度006期予算
      @LCF_ZERO AS HSL006AP1,                                                       "前年度006期実績
      SUM( CASE ACDOCA~POPER WHEN '007' THEN ACDOCA~HSL ELSE 0 END ) AS HSL007AC0,  "当年度007期実績
      @LCF_ZERO AS HSL007PC0,                                                       "当年度007期予算
      @LCF_ZERO AS HSL007AP1,                                                       "前年度007期実績
      SUM( CASE ACDOCA~POPER WHEN '008' THEN ACDOCA~HSL ELSE 0 END ) AS HSL008AC0,  "当年度008期実績
      @LCF_ZERO AS HSL008PC0,                                                       "当年度008期予算
      @LCF_ZERO AS HSL008AP1,                                                       "前年度008期実績
      SUM( CASE ACDOCA~POPER WHEN '009' THEN ACDOCA~HSL ELSE 0 END ) AS HSL009AC0,  "当年度009期実績
      @LCF_ZERO AS HSL009PC0,                                                       "当年度009期予算
      @LCF_ZERO AS HSL009AP1,                                                       "前年度009期実績
      SUM( CASE ACDOCA~POPER WHEN '010' THEN ACDOCA~HSL ELSE 0 END ) AS HSL010AC0,  "当年度010期実績
      @LCF_ZERO AS HSL010PC0,                                                       "当年度010期予算
      @LCF_ZERO AS HSL010AP1,                                                       "前年度010期実績
      SUM( CASE ACDOCA~POPER WHEN '011' THEN ACDOCA~HSL ELSE 0 END ) AS HSL011AC0,  "当年度011期実績
      @LCF_ZERO AS HSL011PC0,                                                       "当年度011期予算
      @LCF_ZERO AS HSL011AP1,                                                       "前年度011期実績
      SUM( CASE ACDOCA~POPER WHEN '012' THEN ACDOCA~HSL ELSE 0 END ) AS HSL012AC0,  "当年度012期実績
      @LCF_ZERO AS HSL012PC0,                                                       "当年度012期予算
      @LCF_ZERO AS HSL012AP1                                                        "前年度012期実績
    FROM ACDOCA                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCA~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCA~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCA~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCA~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCA~RYEAR  = @PIF_GJAHR              "会計年度
      AND ACDOCA~POPER <= @PIF_POPER              "会計期間
      AND ACDOCA~BSTAT  = @SPACE                  "伝票ステータス
    GROUP BY
      ACDOCA~RLDNR,                               "総勘定元帳の元帳
      ACDOCA~RBUKRS,                              "会社コード
      ACDOCA~KTOPL,                               "勘定コード表
      ACDOCA~RACCT,                               "勘定コード
      ACDOCA~RHCUR                                "会社コード通貨
  UNION ALL
  "当年度実績:見通
  SELECT
      ACDOCP~RLDNR,                               "総勘定元帳の元帳
      ACDOCP~RBUKRS,                              "会社コード
      ACDOCP~KTOPL,                               "勘定コード表
      ACDOCP~RACCT,                               "勘定コード
      ACDOCP~RHCUR,                               "会社コード通貨
      SUM( CASE ACDOCP~POPER WHEN '001' THEN ACDOCP~HSL ELSE 0 END ) AS HSL001AC0,  "当年度001期実績
      @LCF_ZERO AS HSL001PC0,                                                       "当年度001期予算
      @LCF_ZERO AS HSL001AP1,                                                       "前年度001期実績
      SUM( CASE ACDOCP~POPER WHEN '002' THEN ACDOCP~HSL ELSE 0 END ) AS HSL002AC0,  "当年度002期実績
      @LCF_ZERO AS HSL002PC0,                                                       "当年度002期予算
      @LCF_ZERO AS HSL002AP1,                                                       "前年度002期実績
      SUM( CASE ACDOCP~POPER WHEN '003' THEN ACDOCP~HSL ELSE 0 END ) AS HSL003AC0,  "当年度003期実績
      @LCF_ZERO AS HSL003PC0,                                                       "当年度003期予算
      @LCF_ZERO AS HSL003AP1,                                                       "前年度003期実績
      SUM( CASE ACDOCP~POPER WHEN '004' THEN ACDOCP~HSL ELSE 0 END ) AS HSL004AC0,  "当年度004期実績
      @LCF_ZERO AS HSL004PC0,                                                       "当年度004期予算
      @LCF_ZERO AS HSL004AP1,                                                       "前年度004期実績
      SUM( CASE ACDOCP~POPER WHEN '005' THEN ACDOCP~HSL ELSE 0 END ) AS HSL005AC0,  "当年度005期実績
      @LCF_ZERO AS HSL005PC0,                                                       "当年度005期予算
      @LCF_ZERO AS HSL005AP1,                                                       "前年度005期実績
      SUM( CASE ACDOCP~POPER WHEN '006' THEN ACDOCP~HSL ELSE 0 END ) AS HSL006AC0,  "当年度006期実績
      @LCF_ZERO AS HSL006PC0,                                                       "当年度006期予算
      @LCF_ZERO AS HSL006AP1,                                                       "前年度006期実績
      SUM( CASE ACDOCP~POPER WHEN '007' THEN ACDOCP~HSL ELSE 0 END ) AS HSL007AC0,  "当年度007期実績
      @LCF_ZERO AS HSL007PC0,                                                       "当年度007期予算
      @LCF_ZERO AS HSL007AP1,                                                       "前年度007期実績
      SUM( CASE ACDOCP~POPER WHEN '008' THEN ACDOCP~HSL ELSE 0 END ) AS HSL008AC0,  "当年度008期実績
      @LCF_ZERO AS HSL008PC0,                                                       "当年度008期予算
      @LCF_ZERO AS HSL008AP1,                                                       "前年度008期実績
      SUM( CASE ACDOCP~POPER WHEN '009' THEN ACDOCP~HSL ELSE 0 END ) AS HSL009AC0,  "当年度009期実績
      @LCF_ZERO AS HSL009PC0,                                                       "当年度009期予算
      @LCF_ZERO AS HSL009AP1,                                                       "前年度009期実績
      SUM( CASE ACDOCP~POPER WHEN '010' THEN ACDOCP~HSL ELSE 0 END ) AS HSL010AC0,  "当年度010期実績
      @LCF_ZERO AS HSL010PC0,                                                       "当年度010期予算
      @LCF_ZERO AS HSL010AP1,                                                       "前年度010期実績
      SUM( CASE ACDOCP~POPER WHEN '011' THEN ACDOCP~HSL ELSE 0 END ) AS HSL011AC0,  "当年度011期実績
      @LCF_ZERO AS HSL011PC0,                                                       "当年度011期予算
      @LCF_ZERO AS HSL011AP1,                                                       "前年度011期実績
      SUM( CASE ACDOCP~POPER WHEN '012' THEN ACDOCP~HSL ELSE 0 END ) AS HSL012AC0,  "当年度012期実績
      @LCF_ZERO AS HSL012PC0,                                                       "当年度012期予算
      @LCF_ZERO AS HSL012AP1                                                        "前年度012期実績
    FROM ACDOCP                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCP~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCP~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCP~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCP~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCP~RYEAR  = @PIF_GJAHR              "会計年度
      AND ACDOCP~POPER  > @PIF_POPER              "会計期間
    GROUP BY
      ACDOCP~RLDNR,                               "総勘定元帳の元帳
      ACDOCP~RBUKRS,                              "会社コード
      ACDOCP~KTOPL,                               "勘定コード表
      ACDOCP~RACCT,                               "勘定コード
      ACDOCP~RHCUR                                "会社コード通貨
  UNION ALL
  "当年度予算
  SELECT
      ACDOCP~RLDNR,                               "総勘定元帳の元帳
      ACDOCP~RBUKRS,                              "会社コード
      ACDOCP~KTOPL,                               "勘定コード表
      ACDOCP~RACCT,                               "勘定コード
      ACDOCP~RHCUR,                               "会社コード通貨
      @LCF_ZERO AS HSL001AC0,                                                       "当年度001期実績
      SUM( CASE ACDOCP~POPER WHEN '001' THEN ACDOCP~HSL ELSE 0 END ) AS HSL001PC0,  "当年度001期予算
      @LCF_ZERO AS HSL001AP1,                                                       "前年度001期実績
      @LCF_ZERO AS HSL002AC0,                                                       "当年度002期実績
      SUM( CASE ACDOCP~POPER WHEN '002' THEN ACDOCP~HSL ELSE 0 END ) AS HSL002PC0,  "当年度002期予算
      @LCF_ZERO AS HSL002AP1,                                                       "前年度002期実績
      @LCF_ZERO AS HSL003AC0,                                                       "当年度003期実績
      SUM( CASE ACDOCP~POPER WHEN '003' THEN ACDOCP~HSL ELSE 0 END ) AS HSL003PC0,  "当年度003期予算
      @LCF_ZERO AS HSL003AP1,                                                       "前年度003期実績
      @LCF_ZERO AS HSL004AC0,                                                       "当年度004期実績
      SUM( CASE ACDOCP~POPER WHEN '004' THEN ACDOCP~HSL ELSE 0 END ) AS HSL004PC0,  "当年度004期予算
      @LCF_ZERO AS HSL004AP1,                                                       "前年度004期実績
      @LCF_ZERO AS HSL005AC0,                                                       "当年度005期実績
      SUM( CASE ACDOCP~POPER WHEN '005' THEN ACDOCP~HSL ELSE 0 END ) AS HSL005PC0,  "当年度005期予算
      @LCF_ZERO AS HSL005AP1,                                                       "前年度005期実績
      @LCF_ZERO AS HSL006AC0,                                                       "当年度006期実績
      SUM( CASE ACDOCP~POPER WHEN '006' THEN ACDOCP~HSL ELSE 0 END ) AS HSL006PC0,  "当年度006期予算
      @LCF_ZERO AS HSL006AP1,                                                       "前年度006期実績
      @LCF_ZERO AS HSL007AC0,                                                       "当年度007期実績
      SUM( CASE ACDOCP~POPER WHEN '007' THEN ACDOCP~HSL ELSE 0 END ) AS HSL007PC0,  "当年度007期予算
      @LCF_ZERO AS HSL007AP1,                                                       "前年度007期実績
      @LCF_ZERO AS HSL008AC0,                                                       "当年度008期実績
      SUM( CASE ACDOCP~POPER WHEN '008' THEN ACDOCP~HSL ELSE 0 END ) AS HSL008PC0,  "当年度008期予算
      @LCF_ZERO AS HSL008AP1,                                                       "前年度008期実績
      @LCF_ZERO AS HSL009AC0,                                                       "当年度009期実績
      SUM( CASE ACDOCP~POPER WHEN '009' THEN ACDOCP~HSL ELSE 0 END ) AS HSL009PC0,  "当年度009期予算
      @LCF_ZERO AS HSL009AP1,                                                       "前年度009期実績
      @LCF_ZERO AS HSL010AC0,                                                       "当年度010期実績
      SUM( CASE ACDOCP~POPER WHEN '010' THEN ACDOCP~HSL ELSE 0 END ) AS HSL010PC0,  "当年度010期予算
      @LCF_ZERO AS HSL010AP1,                                                       "前年度010期実績
      @LCF_ZERO AS HSL011AC0,                                                       "当年度011期実績
      SUM( CASE ACDOCP~POPER WHEN '011' THEN ACDOCP~HSL ELSE 0 END ) AS HSL011PC0,  "当年度011期予算
      @LCF_ZERO AS HSL011AP1,                                                       "前年度011期実績
      @LCF_ZERO AS HSL012AC0,                                                       "当年度012期実績
      SUM( CASE ACDOCP~POPER WHEN '012' THEN ACDOCP~HSL ELSE 0 END ) AS HSL012PC0,  "当年度012期予算
      @LCF_ZERO AS HSL012AP1                                                        "前年度012期実績
    FROM ACDOCP                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCP~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCP~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCP~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCP~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCP~RYEAR  = @PIF_GJAHR              "会計年度
    GROUP BY
      ACDOCP~RLDNR,                               "総勘定元帳の元帳
      ACDOCP~RBUKRS,                              "会社コード
      ACDOCP~KTOPL,                               "勘定コード表
      ACDOCP~RACCT,                               "勘定コード
      ACDOCP~RHCUR                                "会社コード通貨
  UNION ALL
  "前年度実績
  SELECT                                          "前年度実績
      ACDOCA~RLDNR,                               "総勘定元帳の元帳
      ACDOCA~RBUKRS,                              "会社コード
      ACDOCA~KTOPL,                               "勘定コード表
      ACDOCA~RACCT,                               "勘定コード
      ACDOCA~RHCUR,                               "会社コード通貨
      @LCF_ZERO AS HSL001AC0,                                                       "当年度001期実績
      @LCF_ZERO AS HSL001PC0,                                                       "当年度001期予算
      SUM( CASE ACDOCA~POPER WHEN '001' THEN ACDOCA~HSL ELSE 0 END ) AS HSL001AP1,  "前年度001期実績
      @LCF_ZERO AS HSL002AC0,                                                       "当年度002期実績
      @LCF_ZERO AS HSL002PC0,                                                       "当年度002期予算
      SUM( CASE ACDOCA~POPER WHEN '002' THEN ACDOCA~HSL ELSE 0 END ) AS HSL002AP1,  "前年度002期実績
      @LCF_ZERO AS HSL003AC0,                                                       "当年度003期実績
      @LCF_ZERO AS HSL003PC0,                                                       "当年度003期予算
      SUM( CASE ACDOCA~POPER WHEN '003' THEN ACDOCA~HSL ELSE 0 END ) AS HSL003AP1,  "前年度003期実績
      @LCF_ZERO AS HSL004AC0,                                                       "当年度004期実績
      @LCF_ZERO AS HSL004PC0,                                                       "当年度004期予算
      SUM( CASE ACDOCA~POPER WHEN '004' THEN ACDOCA~HSL ELSE 0 END ) AS HSL004AP1,  "前年度004期実績
      @LCF_ZERO AS HSL005AC0,                                                       "当年度005期実績
      @LCF_ZERO AS HSL005PC0,                                                       "当年度005期予算
      SUM( CASE ACDOCA~POPER WHEN '005' THEN ACDOCA~HSL ELSE 0 END ) AS HSL005AP1,  "前年度005期実績
      @LCF_ZERO AS HSL006AC0,                                                       "当年度006期実績
      @LCF_ZERO AS HSL006PC0,                                                       "当年度006期予算
      SUM( CASE ACDOCA~POPER WHEN '006' THEN ACDOCA~HSL ELSE 0 END ) AS HSL006AP1,  "前年度006期実績
      @LCF_ZERO AS HSL007AC0,                                                       "当年度007期実績
      @LCF_ZERO AS HSL007PC0,                                                       "当年度007期予算
      SUM( CASE ACDOCA~POPER WHEN '007' THEN ACDOCA~HSL ELSE 0 END ) AS HSL007AP1,  "前年度007期実績
      @LCF_ZERO AS HSL008AC0,                                                       "当年度008期実績
      @LCF_ZERO AS HSL008PC0,                                                       "当年度008期予算
      SUM( CASE ACDOCA~POPER WHEN '008' THEN ACDOCA~HSL ELSE 0 END ) AS HSL008AP1,  "前年度008期実績
      @LCF_ZERO AS HSL009AC0,                                                       "当年度009期実績
      @LCF_ZERO AS HSL009PC0,                                                       "当年度009期予算
      SUM( CASE ACDOCA~POPER WHEN '009' THEN ACDOCA~HSL ELSE 0 END ) AS HSL009AP1,  "前年度009期実績
      @LCF_ZERO AS HSL010AC0,                                                       "当年度010期実績
      @LCF_ZERO AS HSL010PC0,                                                       "当年度010期予算
      SUM( CASE ACDOCA~POPER WHEN '010' THEN ACDOCA~HSL ELSE 0 END ) AS HSL010AP1,  "前年度010期実績
      @LCF_ZERO AS HSL011AC0,                                                       "当年度011期実績
      @LCF_ZERO AS HSL011PC0,                                                       "当年度011期予算
      SUM( CASE ACDOCA~POPER WHEN '011' THEN ACDOCA~HSL ELSE 0 END ) AS HSL011AP1,  "前年度011期実績
      @LCF_ZERO AS HSL012AC0,                                                       "当年度012期実績
      @LCF_ZERO AS HSL012PC0,                                                       "当年度012期予算
      SUM( CASE ACDOCA~POPER WHEN '012' THEN ACDOCA~HSL ELSE 0 END ) AS HSL012AP1   "前年度012期実績
    FROM ACDOCA                                   "Universal Journal Entry Line Items
    INNER JOIN SKA1                               "G/L 勘定マスタ (勘定コード表)
       ON SKA1~KTOPL = ACDOCA~KTOPL               "勘定コード表
      AND SKA1~SAKNR = ACDOCA~RACCT               "G/L 勘定コード
      AND SKA1~GVTYP = @ABAP_TRUE                 "損益計算書勘定タイプ
    WHERE ACDOCA~RLDNR  = @PIF_RLDNR              "総勘定元帳の元帳
      AND ACDOCA~RBUKRS = @PIF_RBUKRS             "会社コード
      AND ACDOCA~RYEAR  = @( PIF_GJAHR - 1 )      "会計年度
      AND ACDOCA~BSTAT  = @SPACE                  "伝票ステータス
    GROUP BY
      ACDOCA~RLDNR,                               "総勘定元帳の元帳
      ACDOCA~RBUKRS,                              "会社コード
      ACDOCA~KTOPL,                               "勘定コード表
      ACDOCA~RACCT,                               "勘定コード
      ACDOCA~RHCUR                                "会社コード通貨
  )
  SELECT
      +ACDOCA~RLDNR ,                             "総勘定元帳の元帳
      +ACDOCA~RBUKRS,                             "会社コード
      @PIF_GJAHR AS GJAHR,                        "会計年度
      +ACDOCA~RACCT,                              "勘定コード
      SKAT~TXT20,                                 "G/L 勘定コードテキスト(短)
      +ACDOCA~RHCUR,                              "会社コード通貨
      SUM( +ACDOCA~HSL001AC0 ) AS HSL001AC0,      "当年度001期実績
      SUM( +ACDOCA~HSL001PC0 ) AS HSL001PC0,      "当年度001期予算
      SUM( +ACDOCA~HSL001AP1 ) AS HSL001AP1,      "前年度001期実績
      SUM( +ACDOCA~HSL002AC0 ) AS HSL002AC0,      "当年度002期実績
      SUM( +ACDOCA~HSL002PC0 ) AS HSL002PC0,      "当年度002期予算
      SUM( +ACDOCA~HSL002AP1 ) AS HSL002AP1,      "前年度002期実績
      SUM( +ACDOCA~HSL003AC0 ) AS HSL003AC0,      "当年度003期実績
      SUM( +ACDOCA~HSL003PC0 ) AS HSL003PC0,      "当年度003期予算
      SUM( +ACDOCA~HSL003AP1 ) AS HSL003AP1,      "前年度003期実績
      SUM( +ACDOCA~HSL004AC0 ) AS HSL004AC0,      "当年度004期実績
      SUM( +ACDOCA~HSL004PC0 ) AS HSL004PC0,      "当年度004期予算
      SUM( +ACDOCA~HSL004AP1 ) AS HSL004AP1,      "前年度004期実績
      SUM( +ACDOCA~HSL005AC0 ) AS HSL005AC0,      "当年度005期実績
      SUM( +ACDOCA~HSL005PC0 ) AS HSL005PC0,      "当年度005期予算
      SUM( +ACDOCA~HSL005AP1 ) AS HSL005AP1,      "前年度005期実績
      SUM( +ACDOCA~HSL006AC0 ) AS HSL006AC0,      "当年度006期実績
      SUM( +ACDOCA~HSL006PC0 ) AS HSL006PC0,      "当年度006期予算
      SUM( +ACDOCA~HSL006AP1 ) AS HSL006AP1,      "前年度006期実績
      SUM( +ACDOCA~HSL007AC0 ) AS HSL007AC0,      "当年度007期実績
      SUM( +ACDOCA~HSL007PC0 ) AS HSL007PC0,      "当年度007期予算
      SUM( +ACDOCA~HSL007AP1 ) AS HSL007AP1,      "前年度007期実績
      SUM( +ACDOCA~HSL008AC0 ) AS HSL008AC0,      "当年度008期実績
      SUM( +ACDOCA~HSL008PC0 ) AS HSL008PC0,      "当年度008期予算
      SUM( +ACDOCA~HSL008AP1 ) AS HSL008AP1,      "前年度008期実績
      SUM( +ACDOCA~HSL009AC0 ) AS HSL009AC0,      "当年度009期実績
      SUM( +ACDOCA~HSL009PC0 ) AS HSL009PC0,      "当年度009期予算
      SUM( +ACDOCA~HSL009AP1 ) AS HSL009AP1,      "前年度009期実績
      SUM( +ACDOCA~HSL010AC0 ) AS HSL010AC0,      "当年度010期実績
      SUM( +ACDOCA~HSL010PC0 ) AS HSL010PC0,      "当年度010期予算
      SUM( +ACDOCA~HSL010AP1 ) AS HSL010AP1,      "前年度010期実績
      SUM( +ACDOCA~HSL011AC0 ) AS HSL011AC0,      "当年度011期実績
      SUM( +ACDOCA~HSL011PC0 ) AS HSL011PC0,      "当年度011期予算
      SUM( +ACDOCA~HSL011AP1 ) AS HSL011AP1,      "前年度011期実績
      SUM( +ACDOCA~HSL012AC0 ) AS HSL012AC0,      "当年度012期実績
      SUM( +ACDOCA~HSL012PC0 ) AS HSL012PC0,      "当年度012期予算
      SUM( +ACDOCA~HSL012AP1 ) AS HSL012AP1       "前年度012期実績
    FROM +ACDOCA                                  "Universal Journal Entry Line Items
    LEFT OUTER JOIN SKAT                          "勘定コードマスタレコード (勘定コード表: テキスト)
       ON SKAT~SPRAS = @SY-LANGU                  "言語キー
      AND SKAT~KTOPL = +ACDOCA~KTOPL              "勘定コード表
      AND SKAT~SAKNR = +ACDOCA~RACCT              "G/L 勘定コード
    GROUP BY
      +ACDOCA~RLDNR,                              "総勘定元帳の元帳
      +ACDOCA~RBUKRS,                             "会社コード
      +ACDOCA~RACCT,                              "勘定コード
      SKAT~TXT20,                                 "G/L 勘定コードテキスト(短)
      +ACDOCA~RHCUR                               "会社コード通貨
    INTO TABLE @DATA(LDT_DATA).

  DATA LDF_TIMESTAMP_END TYPE TIMESTAMPL.         "タイムスタンプデータ取得終了
  GET TIME STAMP FIELD LDF_TIMESTAMP_END.         "タイムスタンプデータ取得終了
*-----------------------------------------------------------------------
  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.
  DATA(LDO_FUNCTIONS) = LDO_ALV->GET_FUNCTIONS( ).
  LDO_FUNCTIONS->SET_ALL( ).
  DATA(LDO_SELECTIONS) = LDO_ALV->GET_SELECTIONS( ).
  LDO_SELECTIONS->SET_SELECTION_MODE(
  EXPORTING
    VALUE = IF_SALV_C_SELECTION_MODE=>MULTIPLE ).

  "ヘッダ表示
  DATA(LDO_HEADER) = NEW CL_SALV_FORM_LAYOUT_GRID( ).

  DATA(LDO_H_LABEL) = LDO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ).
  LDO_H_LABEL->SET_TEXT( 'パフォーマンスデータ' ).

  DATA(LDO_H_FLOW) = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '全ACDOCA件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 2  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCA_COUNT ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '当年度実績:実績ACDOCA件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCA_AC0 ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '前年度実績ACDOCA件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCA_AP1 ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 5  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '全ACDOCP件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 5  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCP_COUNT ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 6  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '当年度実績:見通ACDOCP件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 6  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCP_AC0 ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 7  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '当年度予算ACDOCP件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 7  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_ACDOCP_PC0 ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 8  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得開始' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 8  COLUMN = 2 ).
  DATA LDF_UTC_START TYPE CHAR30.
  WRITE LDF_TIMESTAMP_START TIME ZONE 'UTC' TO LDF_UTC_START.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_START ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 9  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = 'タイムスタンプ(UTC)データ取得終了' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 9  COLUMN = 2 ).
  DATA LDF_UTC_END TYPE CHAR30.
  WRITE LDF_TIMESTAMP_END TIME ZONE 'UTC' TO LDF_UTC_END.
  LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_UTC_END ).

  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 10  COLUMN = 1 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = '出力件数' ).
  LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 10  COLUMN = 2 ).
  LDO_H_FLOW->CREATE_TEXT( TEXT = LINES( LDT_DATA ) ).

  LDO_ALV->SET_TOP_OF_LIST( LDO_HEADER ).
  LDO_ALV->SET_TOP_OF_LIST_PRINT( LDO_HEADER ).

  "項目テキスト
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL001AC0' )->SET_LONG_TEXT( '当年度001期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL001PC0' )->SET_LONG_TEXT( '当年度001期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL001AP1' )->SET_LONG_TEXT( '前年度001期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL002AC0' )->SET_LONG_TEXT( '当年度002期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL002PC0' )->SET_LONG_TEXT( '当年度002期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL002AP1' )->SET_LONG_TEXT( '前年度002期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL003AC0' )->SET_LONG_TEXT( '当年度003期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL003PC0' )->SET_LONG_TEXT( '当年度003期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL003AP1' )->SET_LONG_TEXT( '前年度003期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL004AC0' )->SET_LONG_TEXT( '当年度004期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL004PC0' )->SET_LONG_TEXT( '当年度004期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL004AP1' )->SET_LONG_TEXT( '前年度004期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL005AC0' )->SET_LONG_TEXT( '当年度005期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL005PC0' )->SET_LONG_TEXT( '当年度005期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL005AP1' )->SET_LONG_TEXT( '前年度005期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL006AC0' )->SET_LONG_TEXT( '当年度006期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL006PC0' )->SET_LONG_TEXT( '当年度006期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL006AP1' )->SET_LONG_TEXT( '前年度006期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL007AC0' )->SET_LONG_TEXT( '当年度007期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL007PC0' )->SET_LONG_TEXT( '当年度007期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL007AP1' )->SET_LONG_TEXT( '前年度007期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL008AC0' )->SET_LONG_TEXT( '当年度008期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL008PC0' )->SET_LONG_TEXT( '当年度008期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL008AP1' )->SET_LONG_TEXT( '前年度008期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL009AC0' )->SET_LONG_TEXT( '当年度009期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL009PC0' )->SET_LONG_TEXT( '当年度009期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL009AP1' )->SET_LONG_TEXT( '前年度009期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL010AC0' )->SET_LONG_TEXT( '当年度010期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL010PC0' )->SET_LONG_TEXT( '当年度010期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL010AP1' )->SET_LONG_TEXT( '前年度010期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL011AC0' )->SET_LONG_TEXT( '当年度011期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL011PC0' )->SET_LONG_TEXT( '当年度011期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL011AP1' )->SET_LONG_TEXT( '前年度011期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL012AC0' )->SET_LONG_TEXT( '当年度012期実績' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL012PC0' )->SET_LONG_TEXT( '当年度012期予算' ).
  LDO_ALV->GET_COLUMNS( )->GET_COLUMN( 'HSL012AP1' )->SET_LONG_TEXT( '前年度012期実績' ).

  "ACDOCPのデータセルの背景色を変える
  "特に、当年度実績の項目で、見通の値を表示しているセルの、背景色を変える
  DATA LDF_POPER TYPE ACDOCA-POPER.
  DATA LDF_LVC_FNAME TYPE LVC_FNAME.
  DATA LO_COL_TAB  TYPE REF TO CL_SALV_COLUMN_TABLE.
  INCLUDE <COLOR>.
  DATA LS_COLOR TYPE LVC_S_COLO.
  LS_COLOR-COL = COL_TOTAL.
  DO ( '012' - PIF_POPER ) TIMES.
    LDF_POPER = '013' - SY-INDEX.
    CONCATENATE 'HSL' LDF_POPER 'AC0' INTO LDF_LVC_FNAME.
    LO_COL_TAB ?= LDO_ALV->GET_COLUMNS( )->GET_COLUMN( LDF_LVC_FNAME ).
    LO_COL_TAB->SET_COLOR( LS_COLOR ).
  ENDDO.
  DO '012' TIMES.
    LDF_POPER = SY-INDEX.
    CONCATENATE 'HSL' LDF_POPER 'PC0' INTO LDF_LVC_FNAME.
    LO_COL_TAB ?= LDO_ALV->GET_COLUMNS( )->GET_COLUMN( LDF_LVC_FNAME ).
    LO_COL_TAB->SET_COLOR( LS_COLOR ).
  ENDDO.

  LDO_ALV->DISPLAY( ).

  POF_SUBRC = 0.
ENDFORM.

検索キーワード
ABAP
ABAP 7.52
SQL
Open SQL
New Open SQL
Classic Open SQL
ABAP SQL
SAP HANA
Code to Data
Code Pushdown
ACDOCA
ACDOCP
SAP S/4HANA
BPC optimized for S/4HANA
予実対比表
月別
損益計算書

以上

ヘッドホン:AKG K701 気まぐれで入手

なんとなく気になっていた「AKG K701」普通に新品で売られていた時から良い音するなぁ〜。ボリュームを上げていってもやかましい感じがしないなぁ〜。いったいどのくらいの音量にすれば良いのか迷う。でもフルオープンエアーなのでなんとなく手を出しづらい。そのため、気にはなるけれど優先順位が低かったのです。密閉型じゃ無いとお外で使えないものね。
最近のヘッドホンのバランス化とかで調べ物をするために、インターネットを徘徊していました。そしてなんとなくヤフオクやメルカリを徘徊していたら、程度が悪いがとても安価な「AKG K701」。改造のベースとしては最適。でも最近の若者は「けいおん」に登場する伝説のヘッドホンとして認知されているらしい。PerfumeCapsule中田ヤスタカも使っているらしいです。やっぱり値段が釣り上がるんだろうなぁ〜と言うことで駄目元で入札しました。

何日経過したのだろう(本当は十数分)。相場の半額以下で落札していました。

ヘッドバンドの調節ゴムが伸び伸びでしたが、動作確認してみるとなんか普通に音が出てる。いや、とても綺麗な音が出ている。いきなりバラすの勿体なくなって、今普通に聴きながらブログを書いています。

やっぱりバランス化改造はしますが、お外で使うのも、自転車外出限定とかで大丈夫かもと思っています。信号待ちで少し恥ずかしいかな?でも逃げ場所はあるわけで、それほど不快には思われないでしょう。多分。

それにしても、AKGって、なんてあっさり清らかな音を奏でるのでしょう。
低音の量感が無いって言われるけれど、これに慣れると、きちんと低音出ていると思えるし。
f:id:dai_h_73:20191118004201j:plain
f:id:dai_h_73:20191118004254j:plain
私は、本国生産原理主義者では無いのですが、さすがにこれだけ安価だと中国製ですね。でもねぇ〜違いなんて分かんないよ。

ヘッドホン:MDR-Z1000 バランス化 ?

MDR-CD900STと同様、以下同文、と言うことなのですが。

MDR-Z1000中古ですが安くなったねぇ〜。そんなのを眺めていたら勇気が湧いてきました。(再び)

まずは左側のイヤーパッドを外してハウジングを開けます。
そして、端子の付いている基板から、テスターを当たって、プラスマイナスを確認後、左右の配線を外します。
f:id:dai_h_73:20191116155854j:plain

今回は、以下の端子を使用しました。

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=6A4Y-88NB

MDR-Z1000のハウジングの穴あけ加工は一切不要でした。一応可逆性を確保したバランス化が可能です。
端子は長すぎて収まりが悪いので、ニッパー等でギリギリまで切断します。(短くします)
f:id:dai_h_73:20191116155935j:plain

私は端子を固定する前にハンダ付しましたが、端子を六角ナットで固定してから、ハンダ付した方が綺麗に仕上がると思います。っというのは、スペースの関係で六角ナットを回すことができません。そのため端子側を回転して固定することになります。都合の良い回転位置で固定するために、ねじ込む前に六角ナットの回転位置を試行錯誤することになります。やってみれば分かります。(笑)
f:id:dai_h_73:20191116160613j:plain

バランス化で不要になったパーツはこちら。
f:id:dai_h_73:20191116161349j:plain

ネジネジでコードを固定することができなくなりましたが、バランスケーブルを使用することで、バランス接続が可能になります。

取り急ぎ、3.5mm4極プラグ-2.5mm4極プラグのバランスケーブルを作って、量販店へ動作確認へ行きたいですね。
※あくまでも、他力本願です。(爆)