CDSのエンティティのキーを設定する


CDSのエンティティのキーについて色々と調査・検証してみました。結論を3行で書くと、
・プライマリフィールドは(そのままでは)キーではない。
・カスタムエンティティ作成時に自動で作成される、データ型=「一意識別子」の項目がデフォルトのキーである。
・それとは別に、一つないし複数の項目をキーとして定義できる。

前提条件
・CDSのカスタムエンティティを作成できる環境(こちらの記事を参照)

詳細手順
実験用のカスタムエンティティを作成。エンティティ名とプライマリフィールド名を指定して作成。

複数項目をキーにする調査を行うため、二つ目の項目を作成。

2つの項目「PrimaryField」と「SecondaryField」が作成されました。エンティティを保存します。
一つ目の項目「PrimaryField」は「プライマリフィールド」のラベルが付いています。最初の疑問はこれがキー項目なのか?ということでした。

実はエンティティ名称の「Z00_KeyTest」と全く同じ表示名の項目が自動で作成され、データ型に「一意識別子」が設定されています。結論を先に言うと、こちらがデフォルトのキー項目になります。

データを作成して試してみましょう。データタブから「+レコードの追加」をクリック。(実はモデル駆動型アプリを作らなくても、ExcelEditを使わなくてもこちらからデータレコードを作成できます。)

PrimaryFieldと所有者しか入力できませんが、実験には十分です。

PrimaryFieldに値を入れて「保存して閉じる」。

保存はされますが、閉じないです。。もう1件登録するため「+新規」をクリック。

もう1件、PrimaryFieldの値が同じレコードを作成して「保存して閉じる」をクリック。(閉じないので、タブの×ボタンで閉じてください。。)

エンティティのデータタブに戻ると、以下のメッセージが出ています。ここは「OK」で構いません。

データタブでデータの更新をクリック。

表示されました。PrimaryFieldがP001というレコードが2件存在します。つまり「プライマリフィールドはキーではない」という事が言えます。
PrimaryFieldには「プライマリフィールド」というタグが付いていますが(タグが付いているだけで)キー項目ではありません。全項目を表示したいので右上のビュー切替プルダウンから「すべてのフィールド」を選択。

自動で作成される「一意識別子」型の項目「Z00_KeyTest」には一意な値がセットされています。(先頭8文字が異なり、以降は同じ値です。)こちらが、キーであることを見ていきます。Excelでデータを編集しましょう。

ダウンロードされたExcelを開きます。

認証を要求されたら認証を通し、Excelが開いたら上部の「編集」をクリックすると以下のようにデータが表示されます。

後の実験をやり易くするため、2行目のP001はP002に変更しておきます。値を打ち換えて「公開」。

さて、ここからが実験の本番です。新規で行作成して1行目のP001レコードをコピーしてそのまま3行目に貼り付けます。PrimaryFieldもZ00_KeyTestも全く同じ値の状態で「公開」。
(ちなみに、Excelの2行目をコピーしてExcelの4行目に貼り付けた場合、Excelのテーブル定義の範囲がExcelの3行目までのままで、4行目がテーブルの外だと認識されますので注意が必要です。手でA4セルに値を打ち込むか、「公開」ボタンの上の「+新規」ボタンを押してテーブルの範囲をExcelの4行目まで広げる必要があります。)

キー重複のエラーになります。これは想定通り。

キー重複の判定がZ00_KeyTestで行われていることを確認するため、3行目のZ00_KeyTestのセルのみをクリアして「公開」。

このメッセージは無視して「はい」を選択。(丸ごと行コピーしたため、編集不可項目にも値が入っているのが原因です。今回の本筋には関係ないです。)

3行目の新規データが登録され、Z00_KeyTestには自動採番された値が入っています。もちろん一意な値です。

つまり「カスタムエンティティ作成時に自動で作成される、データ型=「一意識別子」の項目がデフォルトのキーである」という事が言えます。

次の実験を分かり易くするため、3行目のP001をP003に変更して「更新」します。

更新されました。Z00_KeyTestの値はそのままにPrimaryFieldが変更されました。

自動で作成される項目がキーだと、色々と扱いづらいです。自分でキーを定義できないのか?という疑問が湧いてきます。答えはYesで「キー」タブから「+キーの追加」を押してキーを定義します。

以下のような画面が開きます。

まずはPrimaryFieldをキーに設定してみます。名前を適当につけてキーフィールドとしてPrimaryFieldをチェックして「完了」。

キーが作成されました。エンティティを保存します。

キーが定義されました。

キーが思い通りに設定されたか、Excelからデータを登録して実験します。先ほど同様に、レコードを新規作成して1行目のP001をコピーして4行目に貼り付け。いったん、Z00_KeyTestもそのままの状態で「公開」。

予想通り、エラーが出ました。これはZ00_KeyTestフィールドの重複エラーです。

追加する行のZ00_KeyTestをブランクにして再度「公開」。

この警告は無視して良いので「はい」を選択。

エラーになりました。PrimaryFieldをキーに設定する前はエラーにならなかったので、PrimaryFieldがキーとして設定されたことが確認できました。つまり、成功です。

次の実験を分かり易くするため、「更新」を押してエラーを解消します。

このメッセージは「はい」を選択。

エラーが解消されました。

PrimaryFieldをが重複していなければデータを登録できることも念のため確認しましょう。P001をコピーして新規行に貼り付けて、、

PrimaryFieldをP004に打ち換え、Z00_KeyTestをブランククリアして「公開」。

この警告メッセージは無視して良いので「はい」を選択。

問題なく登録できました。

次は複数の項目をキーに設定する実験です。先に間違った手順を示します。キーの追加でSecondaryFieldをします。

エンティティを保存。

キーが複数登録されました。一つはPrimaryField、もう一つはSecondaryField。一見良さそうです。

Excelでデータを登録して確かめてみます。既存のP004行のSecondaryFieldにS001を指定し、新規行にP004/S002を指定します。新規行のZ00_KeyTestはもちろんブランクにしておきます。そして「公開」。

エラーになりました。。メッセージが不親切で分かりにくいですが、これはPrimaryFieldが重複していることによるエラーです。

ではどうすればよいか?答えは二つの項目を一つのキーに指定する、です。
まず、既存のキーは両方とも削除します。赤丸の「…」からキーを削除。(Key1にSecondaryFieldを追加する事を考えましたが、一度作成したキーは編集不可能でした。)

もう一つも削除して、、

エンティティを保存。

改めてキーを追加。ここでPrimaryFieldがとSecondaryFieldの両方をキーに含めます

エンティティを保存。

このように登録されます。

Excelに戻ってデータ登録。データを以下のように登録して「公開」。

無事に登録できました!

SecondaryFieldが単体では重複可能なことも確かめてみます。以下のようにSecondaryFieldを指定して「公開」。

無事登録できました!

PrimaryFieldとSecondaryFieldの組み合わせが重複するとエラーになる事も一応確認します。以下のようなエラーになります。

ということで、「自動作成される一意識別子の項目とは別に、一つないし複数の項目をキーとして定義できる。」という事が示されました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です