アソシエーションビューの編集
2. アソシエーションビューの編集
アソシエーションビュー編集の流れ
① アノテーションの編集を行います。
| アノテーションの種類 | 内容 | 値 |
|---|---|---|
| @AbapCatalog.sqlViewName | ABAPディクショナリに登録される、CDSビュー名となる | ZIYYMMnnn_s4_3 |
| @AbapCatalog.compiler.compareFilter |
フィルターの評価の仕方
|
true |
| @AbapCatalog.preserveKey | 参照するテーブルのKeyをCDSビューのKeyとする | true |
| @AccessControl.authorizationCheck | ABAPから呼ばれた場合の権限チェック | #NOT_REQUIRED |
| @EndUserText.label | CDSビューの内容説明(60文字) | 任意 |
② 定義部分(データ取得元テーブル、項目定義)の編集を行います。
| 変更概要 | 変更箇所 | 変更値 |
|---|---|---|
| data_source_name |
define view ZIYYMMnnn_SAMP4_3 as select from data_source_name |
define view ZIYYMMnnn_SAMP4_3 as select from ZIYYMMnnn_SAMP4_1 |
| Association[] | association [1] | association [1..1] |
| target_data_source_name |
to target_data_source_name as _association_name |
to ZIYYMMnnn_SAMP4_2 as _table1 |
| 結合条件 |
on $projection.element_name = _association_name.target_element_name |
on $projection. student_id = _table1.student_id |
| 項目 |
{ } |
{ //ZIYYMMnnn_SAMP4_1 key student_id,_table1.class, first_name,last_name, birthday,region,city,street, location,created_at,changed_at } |
アノテーションの編集にもあった、Associationとは何かについてみてみましょう。
| Association[] | association [1] | association [1..1] |
|---|
Associationとは?
Association は、CDS (Core Data Services) で 「テーブル同士のつながり (リレーション) を定義するもの」 です。
例えば、SD(販売管理)モジュールで使われる2つのテーブル、販売伝票 (VBAK) と販売伝票明細 (VBAP) は、
VBELN (販売伝票)いう項目を使って関連しています。
このような関連をAssociationで表現することで、CDSビュー内で簡単にデータを取得できます。
AssociationとJOINの違い
関連する複数のテーブルからデータを取得する、という観点でAssociationとJOINは似ていますが、いくつかの違いがあります。
主な違いは、「データを取得するタイミング」にある為、
すぐにデータを取得したいならJOIN,
データの関連を定義しつつ、必要なときにデータを取得したいなら Associationを使う形で使い分けていきましょう。
Associationを使う目的
Associationを使うことにより、以下のメリットが考えられます。
すべての関連データを取得できる
- 通常の Association では、取得したデータから最初の1件のレコーダー」しか取れないことがありました。Association[] を使えば、「取得したレコードの全件」を取得することができます。
SQL のパフォーマンスを最適化できる
- Association[] を使うと、CDS レベルでデータの関連付けを設定できます。
- 必要なときにデータをJ結合(JOIN)して取得できるため、SQLのパフォーマンスを向上できます。
可読性が向上する
- Association[] を使えば、CDS 内で明細データを簡単に扱えます。
- SQLクエリを書く際にJOINを意識せずに済むので、CDSの設計がシンプルになります。
Association[]の、[min..max]のパターンについて
Associationを使う際に、[]の括弧の中には、
[min..max] という形式で 「この関連がいくつのデータを持つか」 を指定できます。
[min..max]の定義を明示的に指定しない場合は、暗黙的に[0..1]のパターンが指定されます。
Association[]の記述によって取得結果が変わるので、定義する際には注意しましょう。
[min..max]指定による出力例
ここでは、書籍情報のBooksテーブルと、作者情報のAuthorsテーブルの関係を例に、
各 [min..max] の各出力結果の違いについて紹介します。
前提として、以下を意識しておきましょう。
- 1冊の本には1人、または複数の著者がいます。
- ただし、著者が不明な本もあります。
[min..max]指定による出力イメージ(1/4)
著者が不明 (NULL) の場合と複数の作者を持つ場合はエラーになるので、
必ず著者が1人いる前提のときだけ使う必要があります。
[min..max]指定による出力イメージ(2/4)
[1..1] と違い、著者がいなくてもエラーにならずにデータが取得できます。
ただ、この場合、著者が複数いる場合はエラーになるため注意が必要です。
(例えば、共著者がいる場合、どちらか1人だけを取ることはできず、エラーになる)
[min..max]指定による出力イメージ(3/4)
著者が複数いても、すべて取得できるパターンがこちらです。
そして著者がいない場合も、本のデータは消えずにNULLで表示されます。
ただし、minの設定は0であり、「少なくとも1人はいる」 という保証がないため、空データ (NULL) になる可能性があります。
[min..max]指定による出力イメージ(4/4)
著者がいる本だけを取得したい場合に最適なパターンです。
ただ、著者がいない本は表示されないため、本の一覧を見たい場合は [0..*] のほうがよいです。
(チェック Ctrl + F2) を押下します。
(有効化 Ctrl + F3) を押下します。
これで、アソシエーションビューが編集されました。