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の組み合わせが重複するとエラーになる事も一応確認します。以下のようなエラーになります。
ということで、「自動作成される一意識別子の項目とは別に、一つないし複数の項目をキーとして定義できる。」という事が示されました。
1件のコメント