Help us understand the problem. What is going on with this article?

【SAPUI5】OData(6) SAPでのODataサービスの作り方 開発編-2

概要

前回の記事では、Entity Typeの定義とODataサービスの有効化を行いました。
今回は、データを取得するためのコードを書いていきます。
※引き続き以下のページの画面ショットを引用させていただきます
OData and SAP Netweaver Gateway. Part II. Create your first OData Service
OData and SAP Netweaver Gateway. Part III. Query Options in OData Service URI
OData and SAP Netweaver Gateway. Part IV. Association and Navigation in OData Service

※OData関連の投稿一覧は以下の記事をご参照ください。
【SAPUI5】OData(1) ODataとは

ステップ

  1. Entity Set(複数データ)を取得するためのメソッドを定義
  2. Entity(単一データ)を取得するためのメソッドを定義
  3. 明細用のメソッドを定義
  4. Associationの定義

1. Entity Set(複数データ)を取得するためのメソッドを定義

Entity Setを定義したときに、Service Implementationフォルダの配下に自動的にCreate, Deleteなどの操作が登録されてます。登録時点ではガラだけなので、これらに対して実装を登録します。
image.png

"GetEntitySet(QUery)"の上で右クリックして、"Go to ABAP Workbench"を選択するとData Provider Class(DPC)の拡張クラスへナビゲートされます。このクラスは、ODataサービスを登録したときに同時に登録されたものです。
image.png

"~_GET_ENTITYSET"というメソッドを選択して、"Redefine"(再定義)を押します。(~の部分はEntity Typeが入ります)
デフォルトのコードをクリアして、コードを入力します。簡単にするために10件のデータを取得するだけです。

  SELECT * UP TO 10 ROWS FROM ekko INTO CORRESPONDING FIELDS OF TABLE et_entityset.

SAP Gateway Client(Tr:/IWFND/GW_CLIENT)で実行すると、10件のデータが返ってきます。
URI: /sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet
image.png

2. Entity(単一データ)を取得するためのメソッドを定義

続いて、1件のEntityを取得するためのメソッドを定義します。データを1件だけ取得するためには、以下のようにURIでキーを指定する必要があります。
/sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet(‘4500002012’).
メソッドでは、キーを判断してデータを取得します。

さきほどと同様の手順で"GetEntity(Read)"の上で右クリックして、DPCの拡張クラスへ移動します。またはTr:SE24でクラスを直接開いてもOKです。
"~_GET_ENTITY"というメソッドを再定義します。

DATA : ls_key_tab LIKE LINE OF it_key_tab,
lv_ebeln TYPE ekko-ebeln.

* IT_KEY_TABに伝票番号(Ebeln)が指定されていたらその値を取得
READ TABLE it_key_tab INTO ls_key_tab
WITH KEY name = 'Ebeln'. " Case sensitive
IF sy-subrc EQ 0.
  lv_ebeln = ls_key_tab-value.
ENDIF.

* 1件のPOを取得
SELECT SINGLE * FROM ekko INTO CORRESPONDING FIELDS OF er_entity
WHERE ebeln = lv_ebeln.

it_key_tabという引数に、クエリから渡されたパラメータが入っています。
it_key_tabの中身は以下のようになっています。

name value
Ebeln ‘4500002012’

SAP Gateway Client(Tr:/IWFND/GW_CLIENT)で実行すると、1件のデータが返ってきます。
URI: /sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet(‘4500002012’)
image.png

GET_ENTITYメソッドが呼ばれるか、GET_ENTITYSETが呼ばれるかはSAP Netweaver Gatewayが判断してくれます。キーを1件だけ指定した場合は、GET_ENTITYが呼ばれます。

3. 明細用のメソッドを定義

同様にして、POItem取得用のメソッドを定義します。サンプルコードは以下のようになります。

GET_ENTITYSET

DATA: 
  ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
  lv_ebeln TYPE ebeln.

* キー(伝票番号)を取得
READ TABLE it_key_tab WITH KEY name = 'Ebeln' INTO ls_key_tab.
IF sy-subrc = 0.
  lv_ebeln = ls_key_tab-value.
ENDIF.

* キーが指定されている場合、伝票番号を指定して取得
IF lv_ebeln IS NOT INITIAL. 
  SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF TABLE et_entityset
  WHERE ebeln = lv_ebeln.
ELSE.

* 指定されていない場合は10件の明細を取得
  SELECT * UP TO 10 ROWS FROM ekpo INTO CORRESPONDING FIELDS OF TABLE et_entityset.

ENDIF.

GET_ENTITY

DATA: 
  ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
  lv_ebeln TYPE ebeln,
  lv_ebelp TYPE ebelp.

* キー(伝票番号)を取得
READ TABLE it_key_tab INTO ls_key_tab WITH KEY name = 'Ebeln' .
IF sy-subrc = 0.
  lv_ebeln = ls_key_tab-value.
ENDIF.

* キー(明細番号)を取得
READ TABLE it_key_tab INTO ls_key_tab WITH KEY name = 'Ebelp' .
IF sy-subrc = 0.
  lv_ebelp = ls_key_tab-value.
ENDIF.

* PO明細の1行を取得
SELECT SINGLE * FROM ekpo INTO CORRESPONDING FIELDS OF er_entity
WHERE ebeln = lv_ebeln
AND ebelp = lv_ebelp.

明細の場合、キーが伝票番号と明細番号の2つになります。それぞれをit_key_tabから取得します。

4. Associationの定義

ここで登場するのはAssociation, Navigation Property, Association Setです。

Association

AssociationはEntity同士の関係を定義するものです。POの場合、ヘッダの伝票番号と明細の伝票番号でひもづいていて、ヘッダ:明細は1:Nになる、という関係を持っています。

Navigation Property

Navigation PropertyはあるEntityからほかのEntityへリンクする際、どのAssociationを使うのかを定義するものです。以下の図に示すように、Navigation PropertyはEntity Setの属性です。
image.png

Association Set

AssociationがEntity同士の関係を表すのに対して、Association SetはEntity Set同士の関係を表します。
image.png

実装

Associationフォルダの上で右クリックし、"Create"を選択します。
以下の情報を入力します。

  • Associationの名前
  • ひもづけるEntityの名前(左側が主、右側が従)
  • カーディナリティ
  • Navigation Propertyの名前(Create related Navigation Propertyにチェック)

image.png

次の画面でEntity同士をひもづけるキーを入力します。
image.png

次の画面ではAssociation Setの名前を入力します。
image.png

Navigation Property, Association, Association Setが以下のように登録されます。
image.png

ODataサービスを変更したら、都度有効化します。

metadataを確認

SAP Gateway Clientでmetadataを見てみると、Navigation Property, Association, Association Setが確認できます。
image.png
image.png

データを取得してみる

Associationを定義したことにより、クエリの結果がどのように変わるか見てみましょう。
URI: /sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet(‘4500002012’)
image.png

結果にHeadToItemNavへのリンクが追加されています。Navigation Propertyを設定したことにより、「Itemにナビゲーションできますよ」という情報が返ってきたのです。
次に、その情報そのままURIとして入力してみます。
URI: /sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet(‘4500002012’)/HeadToItemNav
image.png

すると、ヘッダにひもづく明細データが返ってきます。ここで返ってくるのは明細データだけで、ヘッダは返ってきません。
ヘッダと明細両方返したい場合は、クエリオプション$expandを使います。(クエリオプションについてはこちらを参照)

URI: /sap/opu/odata/sap/ZGW_PO_SRV/POHeaderSet(‘4500001729’)?$expand=HeadToItemNav
image.png

まとめ

  • 単一データを取得するのか、複数データを取得するのかによって異なるメソッドの実装が必要
  • メソッドはDPCの拡張クラスに実装する
  • Associationで2つのEntityの関連を定義する

関連記事

OData(5) SAPでのODataサービスの作り方 開発編-1
OData(7) ODataを使ったSAPUI5アプリケーションの作り方 準備編

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away