Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
みなさん、こんにちは。
前回に引き続き、Dynamics CRM 2016 SDK の新機能として正式版と
なった Web API について紹介します。
今回は Web API メタデータサービスの機能より、関連のメタデータ
操作を紹介します。
概要
既存の組織サービス同様、Web API を利用してメタデータを操作する
ことが可能です。サポートされる操作は多岐に渡りますが、今回は
関連の操作を紹介します。
1:N 関連の作成
まずは取引先企業と取引先担当者の間に、カスタム 1:N 関連を作成
してみます。
プログラムの実装
1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。
public async Task RunRelationshipMetadata(string accessToken)
{
// HttpClient の作成
using (HttpClient httpClient = new HttpClient())
{
// Web API アドレスの作成
string serviceUrl = serverUrl + "/api/data/v8.0/";
// ヘッダーの設定
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
}
}
2. Main メソッドの以下のコードを書き換えて、新しいメソッドを
呼ぶように変更します。
元)
Task.WaitAll(Task.Run(async () => await app.RunFieldMetadata(result.AccessToken)));
変更後)
Task.WaitAll(Task.Run(async () => await app.RunRelationshipMetadata(result.AccessToken)));
3. 新しく追加した RunRelationshipMetadata メソッド内に以下のコードを
追加して、1:N 関連の情報を作成します。
// 1:N 関連の情報を作成
string customRelationshipMeta = @"
{
'@odata.type': '#Microsoft.Dynamics.CRM.OneToManyRelationshipMetadata',
'AssociatedMenuConfiguration': {
'Behavior': 'UseCollectionName',
'Group': 'Details',
'Label': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
},
'Order': 10000
},
'CascadeConfiguration': {
'Assign': 'NoCascade',
'Delete': 'RemoveLink',
'Merge': 'Cascade',
'Reparent': 'NoCascade',
'Share': 'NoCascade',
'Unshare': 'NoCascade'
},
'ReferencedEntity': 'account',
'ReferencingEntity': 'contact',
'SchemaName': 'new_account_contacts',
'Lookup': {
'SchemaName':'new_accountId',
'DisplayName': {
'LocalizedLabels': [{
'Label': 'サンプル取引先企業',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'サンプル取引先企業',
'LanguageCode': 1041
}
}
}
}";
4. 以下のコードを追加して作成要求を送信します。
// カスタム 1:N 関連の作成
HttpResponseMessage createRes = await httpClient.PostAsync(serviceUrl + "RelationshipDefinitions",
new StringContent(customRelationshipMeta, Encoding.UTF8, "application/json"));
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. プログラム完了後、カスタム 1:N 関連が作成されて
いることを確認します。
関連の取得: システムレベル
次に作成した関連を取得します。関連はシステム全体からでも、特定
エンティティからでも取得できます。次の作業にあたり上記で追加した
1:N 関連の作成要求はコメントアウトしておきます。
プログラムの実装
1. 上記のコードに続いて以下のコードを追加します。ここではシステム
全体から特定の 1:N 関連を取得しています。
// 作成した関連をシステムレベルから取得
HttpResponseMessage relationshipRes = await httpClient.GetAsync(serviceUrl + "RelationshipDefinitions?$filter=SchemaName eq 'new_account_contacts'");
JToken relationship = JObject.Parse(relationshipRes.Content.ReadAsStringAsync().Result)["value"][0];
2. 以下のコードを追加して結果を表示します。
// 詳細を表示
Console.WriteLine(relationship);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 関連の詳細が表示されます。
関連の取得: エンティティレベル
次に取引先企業のメタデータから関連を取得します。
プログラムの実装
1. 上記のコードに続いて以下のコードを追加して、取引先企業の
メタデータ ID を取得します。
// 取引先企業エンティティの取得
HttpResponseMessage entityRes = await httpClient.GetAsync(serviceUrl + "EntityDefinitions?$select=MetadataId&$filter=LogicalName eq 'account'");
JToken entity = JObject.Parse(entityRes.Content.ReadAsStringAsync().Result)["value"][0];
2. 以下のコードを追加して関連を取得します。エンティティの
メタデータから /OneToManyRelationships ナビゲーションで
1:N 関連を取得できます。
// 関連をエンティティレベルから取得
HttpResponseMessage relationshipRes2 = await httpClient.GetAsync(serviceUrl + "EntityDefinitions(" + entity["MetadataId"] + ")/OneToManyRelationships?$filter=SchemaName eq 'new_account_contacts'");
JToken relationship2 = JObject.Parse(relationshipRes2.Content.ReadAsStringAsync().Result)["value"][0];
3. 以下のコードを追加して結果を表示します。
// 詳細を表示
Console.WriteLine(relationship2);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 関連の詳細が表示されます。
関連の削除
更新および削除も通常のレコード同様に行えます。ここでは削除の
方法を紹介します。
プログラムの実装
上記のコードに続いて以下のコードを追加します。レコードの ID に
相当するものとして、MetadataId があります。これを取得した内容から
取り出して、指定しています。
// 作成した関連の削除
HttpResponseMessage deleteRes = await httpClient.DeleteAsync(serviceUrl + "RelationshipDefinitions(" + relationship["MetadataId"] + ")");
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 作成した 1:N 関連が削除されることを確認します。
N:N 関連の作成
N:N 関連の作成も基本的には同じ手法で行いますが、以下の点が
異なります。
作成時に指定するタイプ:
"@odata.type": "Microsoft.Dynamics.CRM.ManyToManyRelationshipMetadata"
エンティティメタデータからのナビゲーション
EntityDefinitions(<MetadataId>/ManyToManyRelationships
以下に今回追加したメソッドを示します。
public async Task RunRelationshipMetadata(string accessToken)
{
// HttpClient の作成
using (HttpClient httpClient = new HttpClient())
{
// Web API アドレスの作成
string serviceUrl = serverUrl + "/api/data/v8.0/";
// ヘッダーの設定
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
// 1:N 関連の情報を作成
string customRelationshipMeta = @"
{
'@odata.type': '#Microsoft.Dynamics.CRM.OneToManyRelationshipMetadata',
'AssociatedMenuConfiguration': {
'Behavior': 'UseCollectionName',
'Group': 'Details',
'Label': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
},
'Order': 10000
},
'CascadeConfiguration': {
'Assign': 'NoCascade',
'Delete': 'RemoveLink',
'Merge': 'Cascade',
'Reparent': 'NoCascade',
'Share': 'NoCascade',
'Unshare': 'NoCascade'
},
'ReferencedEntity': 'account',
'ReferencingEntity': 'contact',
'SchemaName': 'new_account_contacts',
'Lookup': {
'SchemaName':'new_accountId',
'DisplayName': {
'LocalizedLabels': [{
'Label': 'サンプル取引先企業',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'サンプル取引先企業',
'LanguageCode': 1041
}
}
}
}";
// カスタム 1:N 関連の作成
HttpResponseMessage createRes = await httpClient.PostAsync(serviceUrl + "RelationshipDefinitions",
new StringContent(customRelationshipMeta, Encoding.UTF8, "application/json"));
// 作成した関連をシステムレベルから取得
HttpResponseMessage relationshipRes = await httpClient.GetAsync(serviceUrl + "RelationshipDefinitions?$filter=SchemaName eq 'new_account_contacts'");
JToken relationship = JObject.Parse(relationshipRes.Content.ReadAsStringAsync().Result)["value"][0];
// 詳細を表示
Console.WriteLine(relationship);
// 取引先企業エンティティの取得
HttpResponseMessage entityRes = await httpClient.GetAsync(serviceUrl + "EntityDefinitions?$select=MetadataId&$filter=LogicalName eq 'account'");
JToken entity = JObject.Parse(entityRes.Content.ReadAsStringAsync().Result)["value"][0];
// 関連をエンティティレベルから取得
HttpResponseMessage relationshipRes2 = await httpClient.GetAsync(serviceUrl + "EntityDefinitions(" + entity["MetadataId"] + ")/OneToManyRelationships?$filter=SchemaName eq 'new_account_contacts'");
JToken relationship2 = JObject.Parse(relationshipRes2.Content.ReadAsStringAsync().Result)["value"][0];
Console.WriteLine(relationship2);
// 作成した関連の削除
HttpResponseMessage deleteRes = await httpClient.DeleteAsync(serviceUrl + "RelationshipDefinitions(" + relationship["MetadataId"] + ")");
}
}
まとめ
次回はオプションセットについて紹介します。
お楽しみに!
- 中村 憲一郎
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります