はじめに
PowerAppsのモデル駆動の設定が面倒なのでC#からDataverseを操作してみたくなった。
今回はクラウドフロー(Power Automate)の設定情報を確認するC#のコードを動かしてみる。
前提
参照ライブラリやCreateCrmService関数の中身は以前の以下の記事を参考に
C#でDataverseに接続してテーブル一覧を表示してみた
https://qiita.com/akihiroe_/items/2db8e2634d7962ef0df7
コード
dataverseで管理されているクラウドフローはworkflowテーブル上に保持されています。このテーブルにはクラウドフロー以外の情報(レコード)も保存されており、どのような情報(レコード)かはcategory属性で判断する必要があります。実際の設定内容はclientdata属性にJSON形式で保存されています。この設定には接続情報やトリガーの情報、実際の処理の情報などが含まています。今回はトリガー部分のJSONを出力しています。
var organizationService = CreateCrmService(user, password, url);
var tableName = "workflow";
var columns = new string[] { "name", "clientdata", "category" };
QueryExpression query = new QueryExpression(tableName);
query.ColumnSet.AddColumns(columns);
ConditionExpression condition = new ConditionExpression();
condition.AttributeName = "category";
condition.Operator = ConditionOperator.Equal;
condition.Values.Add(5); // Modern Flow
FilterExpression filter = new FilterExpression();
filter.Conditions.Add(condition);
query.Criteria.AddFilter(filter);
var entities = organizationService.RetrieveMultiple(query);
foreach (var entity in entities.Entities)
{
var name = entity.GetAttributeValue<string>("name");
var clientdata = entity.GetAttributeValue<string>("clientdata");
var jsonNode = System.Text.Json.JsonDocument.Parse(clientdata);
var properties = jsonNode?.RootElement.GetProperty("properties");
var definition = properties?.GetProperty("definition");
var triggers = definition?.GetProperty("triggers");
Console.WriteLine(name);
if (triggers != null)
{
var formattedJSON = System.Text.Json.JsonSerializer.Serialize(triggers,
new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
});
Console.WriteLine(formattedJSON);
}
Console.WriteLine();
}
クラウドフローのJSONサンプル
以下はDataverseのテーブルが追加・変更・削除された場合のトリガーの情報で、subscriptionRequest/entitynameに対象のテーブル名が記載されています。
{
"行が追加、変更、または削除された場合": {
"metadata": {
"operationMetadataId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"
},
"type": "OpenApiConnectionWebhook",
"inputs": {
"host": {
"connectionName": "shared_commondataserviceforapps",
"operationId": "SubscribeWebhookTrigger",
"apiId": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps"
},
"parameters": {
"subscriptionRequest/message": 3,
"subscriptionRequest/entityname": "test_process_change",
"subscriptionRequest/scope": 4,
"subscriptionRequest/filteringattributes": "test_app_status",
"subscriptionRequest/filterexpression": "test_app_status eq 100000001"
},
"authentication": "@parameters(\u0027$authentication\u0027)"
}
}
}
おわりに
クラウドフローの情報が保存されているworkflowテーブルにはビジネスルールやビジネスフローなどいろいろな振る舞いに関する情報が保存されています。クラシックフローはxaml形式であったり、種類ごとに設定情報が保存されている属性や形式が異なる点は注意してください。
参照情報