前回の続きで今回はリレーションの子レコードを作成します。
普通のRDB(Relational Database)だと、子レコードに親レコードのIDを記憶して、子レコードのユニークIDを作成すれば完成なんだけど、Dataverseだと、この親レコードのIDが一意識別子という特別なキーなのでなかなかうまくいかないんですよね。
まず、親レコードのIDを渡すことを考えます。
親レコードの一意識別子をギャラリーコントロールで子レコードの登録画面に渡したとします。
ボタンのonSelectイベントに下記のようなコードを書きます。
Navigate(子レコードの登録画面,ScreenTransition.None,{親レコード:テスト親テーブル})
それから、子レコードを作成するPower Automateのフローを作成します。
この中で、親レコードの一意識別子の値を子レコードの一意識別子の項目に代入します。
で、実行すると次のようなエラーがでます。
URL was not parsed due to an ODataUnrecognizedPathException. Resource not found for the segment provided in the URL.
型が違うのでしょう。
ということで、まず、Power Automateのアクションでリレーションを設定するアクションを探します。
行を関連付ける、というアクションでリレーションシップの設定ができます。
行IDとは一意識別子のテキストの値でよさそうです。
関連付けにはOData IDもしくは完全なURLとあり、例が見切れています。ということはなんとかしてOData IDを取得することができれば、リレーションが設定できそうです。
ということで組んでみたフロー。
フローを大きく2つに分けました。
1つはリレーションなしに子レコードを作成するフロー。
2つ目は子レコードが作成されたときにリレーションを設定しに行くフロー。(上の図)
2つ目のフローについて説明すると、トリガーを行が”作成”されたときにすることによって、その行の行IDが取れるようにしました。
その行IDを使って作成された子レコードの情報を取得します。
そして、”行を関連付ける”アクションでリレーションを設定します。
しかし、この方法だと、親レコードの行IDがどうしても取得できず、子テーブルに親レコードの行IDを格納する項目を作成、子レコードの作成時に親レコードのIDをバックアップ(図ではGUID_back)を行い、それを利用するというなんともトリッキーな方法になってしましました。
これで一応動きます。
でも、親レコードのIDのバックアップが子レコードに存在するなんてなんとも格好悪いですよね。
ということで、出来上がったフローを眺めます。
で、思う事はもしかして”行を関連付ける”アクションは子レコード作成時に移動できないか、と。
これが完成形です。
最後に”行を関連付ける”アクションを使用する際に分かりにくかった点を挙げます。
1. 子レコードの親IDに値をセットするイメージでしたが、”行を関連付ける”アクションでは親テーブルを指定します。
2. リレーションシップはリレーションシップの設定をした時の”リレーションシップ名”を選びます。