S/4HANAでテーブル参照時にCDS ビューにリダイレクトされる

# はじめに
<!-- 発端や概要を記載 -->
SAP ERP6.0からS/4 HANAになって大幅にデータモデルが変わり、
例えば、従来のSAP ERP 6.0では在庫データや品目データをそれぞれのテーブル（MKPF、MSEG、MARD など）で管理していたところ、S/4HANAではそれらをまとめてMATDOCという新しいテーブルで管理するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/a1485f7a-3bc9-4278-b73d-68cd78927412.png)
画像引用元
https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/sap-s-4hana-inventory-management-tables-new-simplified-data-model-nsdm/ba-p/13497469

S/4 HANAでは、在庫系テーブルがMATDOCに変わったことで、いままでの在庫系テーブルを参照する際は割り当てられたCDS viewへリダイレクトされる仕組みになっています。
※CDS viewはS/4HANA内で作成されるViewであり、HANAのインメモリ機能を最大限に活用する設計で極めて高速に動作するものです。詳しくは下記ブログに記載されています。https://qiita.com/Yanagawa_Yoshihisa/items/d1b601a9f37101b4fde0

ECC6.0からS/4HANA環境になっても、いままでの在庫系のテーブルはDDIC 定義およびデータベースオブジェクトとして引き続き存在しており、ハイブリッドテーブル(MARC, MARD, MCHBなど)については品目マスタの属性を保存するために使用されています。
>2206980 - Material Inventory Managment: change of data model in S/4HANA
All below mentioned tables of the SAP ERP 6.0 product do still exist in S/4HANA as DDIC definition as well as database object and the hybrid tables will still be used to store the material master data attributes. For compatibility reasons there are Core Data Service (CDS) Views assigned as proxy objects to all those tables ensuring that each read access to one of the mentioned tables below still returns the data as before in SAP ERP 6.0.The CDS Views do the on-the-fly aggregation of actual stock quantities from the new MM-IM data model and join the master data attributes from the material master data table. <b>Hence all customer coding reading data from those tables will work as before because each read access to one of the tables will get redirected in the database interface layer of NetWeaver to the assigned CDS view. </b>Write accesses to those tables have to be adjusted.

では、在庫系のテーブルの1つであるMARDHを参照してみて、CDS viewにリダイレクトされるかをSAP ERP6.0、S4HANAの環境で、ABAPレイヤ(Tr-cd:SE16)、DBレイヤ(Tr-cd:ST05)に分けて、実機で見てみました。

※確認した環境
SAP:SAP ERP6.0 EHP6     DB:ASE 16
SAP:S/4HANA2023 FPS01   DB:HANA2.0 SPS07

# SAP ERP6.0環境で在庫系テーブル(MARDH)参照
Tr-cd:SE16(ABAPレイヤ)からデータ件数確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/8269de16-a45b-4dee-a88c-67cd3f85e065.png)

Tr-cd:ST05(DBレイヤ)のSQL結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/5844f361-7f4f-4b50-8582-b93abfab6d0d.png)

⇒SAP ERP6.0環境でTr-cd:SE16からMARDHのデータ件数を確認したときのSQLを見るとリダイレクトはされず、MARDH(テーブル)にデータを取得しにいっていることが確認できます。

```SQL
SELECT TOP 1 COUNT_BIG(*) AS "c0" FROM "MARDH" WHERE "MANDT" = ?;
```

# S/4 HANA環境で在庫系テーブル(MARDH)参照
Tr-cd:SE16(ABAPレイヤ)からデータ件数確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/a7061955-9c32-4511-b358-b0987776f609.png)

Tr-cd:ST05(DBレイヤ)のSQL結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/e56b71df-c6de-47c8-840e-f7a113c75896.png)

⇒S/4 HANA化後の環境で、Tr-cd:SE16(ABAPレイヤ)からMARDHに対して検索をかけた場合のSQLをTr-cd:ST05(DBレイヤ)から確認するとCDS viewにリダイレクトされていることが確認できました。
```SQL
SELECT COUNT(*) FROM /* Redirected table: MARDH */ "NSDM_V_MARDH" "MARDH" WHERE "MANDT" = ?
```

S/4HANA環境でTr-cd:SE16から確認したMARDHのエントリ数33040件はMARDHの件数ではなく、実際はリダイレクト先のCDS viewであるNSDM_V_MARDHの件数です。
勘違いしないように注意が必要です。

このように、S/4HANA環境ではテーブルを参照するとCDS Viewにリダイレクトされることがあるため、例えばSAP ERP6.0上で作成したABAPプログラムで、テーブルのデータを内部テーブルに INSERT する処理がある場合、リダイレクト先のCDS viewの件数が多く、そのデータを載せるのに想定以上のメモリを消費するケースもあります。
このようなケースを回避するため、S/4 HANA化に合わせたプログラムの改修が必要です。

# おわりに
誰かの参考になれば幸いです。