久しぶりの技術系の投稿です。
実はプロジェクトが変わりました。そして、念願(!??)のABAP CDS viewの実装の担当になりました。なのになぜ?ABAP New open SQLなのか?いろいろ実装してみたところ、トライ&エラーを繰り返すのはNew open SQLのほうがやりやすかったからです。
今回紹介するSELECT文は、ABAP CDS viewに移植可能なものとなっています。パフォーマンスについては未知数ですが、期待した動作をしています。流用するときはご一報ください。知的財産云々もありますが、パフォーマンスデータを共有したいのです。
紹介するプログラムは、以下項目を一覧取得します。
使用したSELECT文の機能要素は以下の通りです。
・WITH句による段階的ロジック
・集合関数:SUM()およびGROUP BYによる集計
・不等号条件によるテーブル自己結合
・HAVING句によるレコードフィルタ
・ORDER BY句による結果セットの並び替え
こんなところでしょうか...
なお、当プログラムは、答え合わせのために、前半はBS勘定の日次の合計金額を単純に出力していて、後半でBS勘定残高を取得しています。そして、パフォーマンスデータも取得できるようにしています。
検索項目
・台帳(必須項目) : 0L :リーディング元帳固定
・会社コード
・会計年度
・勘定コード(BS勘定)
一覧項目
・台帳
・会社コード
・会計年度
・転記日付
・勘定コード(BS勘定)
・会社通貨
・会社通貨の残高(BS残高)
参考1:
ACDOCAのBS残高を取得するには?
ACDOCAのBS残高は、会計年度が切り替わるタイミングで、転記日付初期値の期首残高レコードを作成します。そのため、転記日付2020-07-31時点のBS残高を取得しようとすると、会計年度の期首残高レコードと会計年度期首から転記日付2020-07-31の全ての仕訳明細の合計値を計算します。
従来のITABおよびABAPロジックによるループを使用した実装では、素のACDOCAのレコードを取得して、ループ処理の中で1件ずつ加算していくと思います。おそらくですがオンラインプログラムではパフォーマンスの問題で使い物にならないかもしれません。また、上手に実装しないとソースコードメンテナンスに耐えがたいプログラムになる可能性があります。
参考2:
ABAP CDS Viewの移植に関して。(私的感想)
もしかしたら、ここが最も価値ある情報かもしれません。無いかな。(笑)
実感としては、SAP標準のABAP CDS viewを使わないで開発するのは、非効率的と思いました。一方でSAP標準のABAP CDS viewを考慮した基本設計が出来る人材は稀有です。私が当機能をABAP CDS viewに移植するのに、ABAP CDS viewは都合5個作成しました。作成手順は愚直に1文字ずつSELECT文のコーディング作業となります。従来のITABおよびABAPロジックによるループを使用した実装よりはましですが、正直骨が折れました。
では、自身の中で何がベストかというと...HANA infomation viewをABAP CDS viewでラッピングする方法かなぁ~。パフォーマンスに関してはぶっちぎりで良いと思います。クライアントおよび権限実装についてはABAP CDS viewのラッピング部分で実装すれば良いと思います。Fiori like applicationや、BWを介したAnalysisOfficeへの展開も可能です。機能的には問題ないと思います。そして、HANA infomation viewのドラッグ&ドロップによる実装が群を抜いて効率が良いと思います。PoweruserによるEUCを意識しているので当然と言えば当然ですね。
少しプログラムを改変しました。(20200908)
REPORT Y_SQL_CONSOLE. *----------------------------------------------------------------------- * GLOBAL VARIABLE *----------------------------------------------------------------------- DATA GDF_SUBRC TYPE SY-SUBRC. *----------------------------------------------------------------------- * CONDITION VIEW *----------------------------------------------------------------------- DATA GDF_RBUKRS TYPE ACDOCA-RBUKRS. TYPES GTR_RBUKRS LIKE RANGE OF GDF_RBUKRS. SELECT-OPTIONS S_RBUKRS FOR GDF_RBUKRS. "会社コード DATA GDF_RACCT TYPE ACDOCA-RACCT. TYPES GTR_RACCT LIKE RANGE OF GDF_RACCT. SELECT-OPTIONS S_RACCT FOR GDF_RACCT. "勘定コード *----------------------------------------------------------------------- * START-OF-SELECTION *----------------------------------------------------------------------- START-OF-SELECTION. PERFORM START_OF_SELECTION USING S_RBUKRS[] S_RACCT[] CHANGING GDF_SUBRC. *----------------------------------------------------------------------- * SUBROUTINE *----------------------------------------------------------------------- FORM START_OF_SELECTION USING PIR_RBUKRS TYPE GTR_RBUKRS PIR_RACCT TYPE GTR_RACCT 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 ACDOCA INNER JOIN SKA1 ON SKA1~KTOPL = ACDOCA~KTOPL AND SKA1~SAKNR = ACDOCA~RACCT AND SKA1~XBILK = @ABAP_TRUE LEFT OUTER JOIN SKAT ON SKAT~SPRAS = @SY-LANGU AND SKAT~KTOPL = SKA1~KTOPL AND SKAT~SAKNR = SKA1~SAKNR FIELDS COUNT( * ) WHERE ACDOCA~RLDNR = '0L' AND ACDOCA~RBUKRS IN @PIR_RBUKRS AND ACDOCA~RACCT IN @PIR_RACCT INTO @DATA(LDF_INPUT_RECORDS). SELECT FROM ACDOCA INNER JOIN SKA1 ON SKA1~KTOPL = ACDOCA~KTOPL AND SKA1~SAKNR = ACDOCA~RACCT AND SKA1~XBILK = @ABAP_TRUE LEFT OUTER JOIN SKAT ON SKAT~SPRAS = @SY-LANGU AND SKAT~KTOPL = SKA1~KTOPL AND SKAT~SAKNR = SKA1~SAKNR FIELDS ACDOCA~RLDNR, "総勘定元帳の元帳 ACDOCA~RBUKRS, "会社コード ACDOCA~GJAHR, "会計年度 ACDOCA~BUDAT, "伝票の転記日付 ACDOCA~RACCT, "勘定コード SKA1~XBILK, "フラグ: 貸借対照表勘定 SKAT~TXT20, ACDOCA~RHCUR, "会社コード通貨 SUM( ACDOCA~HSL ) AS HSL "会社コード通貨での金額 WHERE ACDOCA~RLDNR = '0L' AND ACDOCA~RBUKRS IN @PIR_RBUKRS AND ACDOCA~RACCT IN @PIR_RACCT GROUP BY ACDOCA~RLDNR, "総勘定元帳の元帳 ACDOCA~RBUKRS, "会社コード ACDOCA~GJAHR, "会計年度 ACDOCA~BUDAT, "伝票の転記日付 ACDOCA~RACCT, "勘定コード SKA1~XBILK, "フラグ: 貸借対照表勘定 SKAT~TXT20, ACDOCA~RHCUR "会社コード通貨 ORDER BY ACDOCA~RBUKRS, "会社コード ACDOCA~RACCT, "勘定コード ACDOCA~GJAHR, "会計年度 ACDOCA~BUDAT "伝票の転記日付 APPENDING TABLE @DATA(LDT_DATA) UP TO 10000 ROWS. APPEND INITIAL LINE TO LDT_DATA. APPEND INITIAL LINE TO LDT_DATA. APPEND INITIAL LINE TO LDT_DATA. DATA LDF_TIMESTAMP_START TYPE TIMESTAMPL. "タイムスタンプデータ取得開始 GET TIME STAMP FIELD LDF_TIMESTAMP_START. "タイムスタンプデータ取得開始 WITH +ACDOCA AS ( SELECT FROM ACDOCA INNER JOIN SKA1 ON SKA1~KTOPL = ACDOCA~KTOPL AND SKA1~SAKNR = ACDOCA~RACCT AND SKA1~XBILK = @ABAP_TRUE LEFT OUTER JOIN SKAT ON SKAT~SPRAS = @SY-LANGU AND SKAT~KTOPL = SKA1~KTOPL AND SKAT~SAKNR = SKA1~SAKNR FIELDS ACDOCA~RLDNR, "総勘定元帳の元帳 ACDOCA~RBUKRS, "会社コード ACDOCA~GJAHR, "会計年度 ACDOCA~BUDAT, "伝票の転記日付 ACDOCA~RACCT, "勘定コード SKA1~XBILK, "フラグ: 貸借対照表勘定 SKAT~TXT20, ACDOCA~RHCUR, "会社コード通貨 SUM( ACDOCA~HSL ) AS HSL "会社コード通貨での金額 WHERE ACDOCA~RLDNR = '0L' AND ACDOCA~RBUKRS IN @PIR_RBUKRS AND ACDOCA~RACCT IN @PIR_RACCT GROUP BY ACDOCA~RLDNR, "総勘定元帳の元帳 ACDOCA~RBUKRS, "会社コード ACDOCA~GJAHR, "会計年度 ACDOCA~BUDAT, "伝票の転記日付 ACDOCA~RACCT, "勘定コード SKA1~XBILK, "フラグ: 貸借対照表勘定 SKAT~TXT20, ACDOCA~RHCUR ) "会社コード通貨 SELECT FROM +ACDOCA AS ACDOCA0 INNER JOIN +ACDOCA AS ACDOCA1 ON ACDOCA1~RLDNR = ACDOCA0~RLDNR "総勘定元帳の元帳 AND ACDOCA1~RBUKRS = ACDOCA0~RBUKRS "会社コード AND ACDOCA1~GJAHR = ACDOCA0~GJAHR "会計年度 AND ACDOCA1~BUDAT <= ACDOCA0~BUDAT "伝票の転記日付 AND ACDOCA1~RACCT = ACDOCA0~RACCT "勘定コード AND ACDOCA1~RHCUR = ACDOCA0~RHCUR "会社コード通貨 FIELDS ACDOCA0~RLDNR, "総勘定元帳の元帳 ACDOCA0~RBUKRS, "会社コード ACDOCA0~GJAHR, "会計年度 ACDOCA0~BUDAT, "伝票の転記日付 ACDOCA0~RACCT, "勘定コード ACDOCA0~XBILK, "フラグ: 貸借対照表勘定 ACDOCA0~TXT20, ACDOCA0~RHCUR, "会社コード通貨 SUM( ACDOCA1~HSL ) AS HSL_SUM "会社コード通貨での金額 GROUP BY ACDOCA0~RLDNR, "総勘定元帳の元帳 ACDOCA0~RBUKRS, "会社コード ACDOCA0~GJAHR, "会計年度 ACDOCA0~BUDAT, "伝票の転記日付 ACDOCA0~RACCT, "勘定コード ACDOCA0~XBILK, "フラグ: 貸借対照表勘定 ACDOCA0~TXT20, ACDOCA0~RHCUR "会社コード通貨 HAVING ACDOCA0~BUDAT IS NOT INITIAL "伝票の転記日付 ORDER BY ACDOCA0~RBUKRS, "会社コード ACDOCA0~RACCT, "勘定コード ACDOCA0~GJAHR, "会計年度 ACDOCA0~BUDAT "伝票の転記日付 APPENDING TABLE @LDT_DATA UP TO 10000 ROWS. 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_HEADER) = NEW CL_SALV_FORM_LAYOUT_GRID( ). DATA(LDO_H_LABEL) = LDO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ). LDO_H_LABEL->SET_TEXT( 'Performance data' ). DATA(LDO_H_FLOW) = LDO_HEADER->CREATE_FLOW( ROW = 2 COLUMN = 1 ). LDO_H_FLOW->CREATE_TEXT( TEXT = 'Input records' ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 2 COLUMN = 2 ). LDO_H_FLOW->CREATE_TEXT( TEXT = LDF_INPUT_RECORDS ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3 COLUMN = 1 ). LDO_H_FLOW->CREATE_TEXT( TEXT = 'Output records' ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 3 COLUMN = 2 ). LDO_H_FLOW->CREATE_TEXT( TEXT = LINES( LDT_DATA ) ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4 COLUMN = 1 ). LDO_H_FLOW->CREATE_TEXT( TEXT = 'Timestamp of start' ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 4 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 = 5 COLUMN = 1 ). LDO_H_FLOW->CREATE_TEXT( TEXT = 'Timestamp of end' ). LDO_H_FLOW = LDO_HEADER->CREATE_FLOW( ROW = 5 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_ALV->SET_TOP_OF_LIST( LDO_HEADER ). LDO_ALV->SET_TOP_OF_LIST_PRINT( LDO_HEADER ). 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.
キーワード
検索キーワード
ABAP
ABAP 7.52
New Open SQL
ABAP SQL
SAP HANA
Code to Data
Code Pushdown
SAP S/4HANA
WITH句
集合関数
SUM()
GROUP BY句
JOIN
INNER JOIN
OUTER JOIN
LEFT OUTER JOIN
不等号結合
自己結合
HAVING句
ORDER BY句
CDS view
ABAP CDS view
HANA infomation view
さて本題です。(笑)
今更ですが、感激です。
Vocal : Stevie Wonder
映画 : 蒲田行進曲に出てくる、高見知佳お気に入り!!レジェンド : スティービー・ワンダーです!!
Guiter : Nile Rodgers
Diana Ross/i'm coming out, Diana Ross/Upside down, Madona/Like a Virgin, ...ですよ!!この人一体何枚レコードを売ったのでしょうか?なにより、ファッショナブルで胡散臭いのが好きです。ニューヨークジャズ仕込みのギターテクニックも地味に凄いです。
Drum : Omar Hakim
ウェザー・リポート, マドンナ, スティング, デヴィッド・ボウイ...エレキにも明るくて、ゲロテクです!なにより、プレイ中の表情が好きです。
Bass : Nathan East
Fourplayのベースが一番好きですが、今回は地味に屋台骨を支えています。歌ってないけれど...
このステージメンバーのグラミー受賞数合計は延べ50いくのではと思います。
ファレル ウィリアムス&ナイル ロジャース&スティービー ワンダー&ダフト パンク GET LUCKY グラミー賞 リハーサル
Nile Rodgersのこの動画最高です。Funny!!
Nile Rodgers on I'm Coming Out
ネタ元はおそらくこれですね。
Diana Ross - I'm Coming Out
Guiter : Nile Rodgers
Drum : Omar Hakim
Incredible drumsolo Omar Hakim with Nile Rodgers, Chic, Paradiso 2005 Amsterdam
Bass : Nathan East
Guiter : Chuck Loebのカッティングギターも最高なのですがこれの感想は次の機会に。病死されてしまったのが悲しい。
FourPlay Java Jazz festival 2011
もう一つ
Harvey Mason: 3RD DEGREE (FOURPLAY: Harvey Mason - Chuck Loeb - Bob James - Nathan East)
参考 : Vocal : Diana Ross
イヤー凄いです。マイケルと踊っています。My babyですよ。
"Upside Down" - Michael Jackson at Diana Ross Concert (1980)
JKと踊っています。リスペクトされているんでしょう。
Jamiroquai sings Upside Down with Diana Ross 1997
大人が本気を出すと凄いなぁ~って思います。