Dynamics CRM 2016 SDK 新機能: メタデータ Web API その 4: グローバルオプションセット
みなさん、こんにちは。
前回に引き続き、Dynamics CRM 2016 SDK の新機能として正式版と
なった Web API について紹介します。
今回は Web API メタデータサービスの機能より、グローバルの
オプションセットメタデータ操作を紹介します。
概要
オプションセットにはグローバルオプションセットとフィールド
レベルのオプションセットがありますが、今回はグローバルの
オプションセット操作を紹介します。
オプションセットの作成
まずカスタムのグローバルオプションセットを作成します。
プログラムの実装
1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。
public async Task RunGlobalOptionSet(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.RunRelationshipMetadata(result.AccessToken)));
変更後)
Task.WaitAll(Task.Run(async () => await app.RunGlobalOptionSet(result.AccessToken)));
3. 新しく追加した RunGlobalOptionSet メソッド内に以下のコードを
追加して、グローバルオプションセットの情報を作成します。
// グローバルオプションセットの情報を作成
string globalOptionSetMeta = @"
{
'@odata.type': '#Microsoft.Dynamics.CRM.OptionSetMetadata',
'Options': [
{
'Value': 10000,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 1',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 1',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
},
{
'Value': 10001,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 2',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 1',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
}
],
'Description': {
'LocalizedLabels': [{
'Label': 'カスタムのグローバルオプションセットです。',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'カスタムのグローバルオプションセットです。',
'LanguageCode': 1041
}
},
'DisplayName': {
'LocalizedLabels': [{
'Label': 'カスタムグローバルオプションセット',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'カスタムグローバルオプションセット',
'LanguageCode': 1041
}
},
'Name': 'new_CustomOptionSet',
'OptionSetType': 'Picklist'
}";
4. 以下のコードを追加して作成要求を送信します。
// カスタムグローバルオプションセットの作成
HttpResponseMessage createRes = await httpClient.PostAsync(serviceUrl + "GlobalOptionSetDefinitions",
new StringContent(globalOptionSetMeta , Encoding.UTF8, "application/json"));
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. プログラム完了後、カスタムグローバルオプションセットが
作成されていることを確認します。
オプションセットの取得
次に作成したグローバルオプションセットを取得します。
GlobalOptionSetDefinitions は filter クエリをサポートしていないため、
詳細を取得するには MetadataId を知る必要があります。次の作業に
あたり、上記で追加したグローバルオプションセットの作成要求は
コメントアウトしておきます。
プログラムの実装
1. 上記のコードに続いて以下のコードを追加します。グローバル
オプションセットをすべてクエリしますが、MetadataId と Name
だけを取得します。
// グローバルオプションセットの取得
HttpResponseMessage optionSetRes = await httpClient.GetAsync(serviceUrl + "GlobalOptionSetDefinitions?$select=MetadataId,Name");
JToken optionSets = JObject.Parse(optionSetRes.Content.ReadAsStringAsync().Result)["value"];
2. 以下のコードを追加して、作成したグローバルオプションセットの
MetadataId を取得します。
// MetadataId の取得
var metadataId = optionSets.Where(x => (string)x["Name"] == "new_customoptionset").First()["MetadataId"];
3. 以下のコードを追加して詳細を取得します。
// 作成したカスタムグローバルオプションセットの取得
optionSetRes = await httpClient.GetAsync(serviceUrl + "GlobalOptionSetDefinitions(" + metadataId + ")");
JToken optionSet = JObject.Parse(optionSetRes.Content.ReadAsStringAsync().Result);
4. 結果を表示します。
// 詳細を表示
Console.WriteLine(optionSet);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. グローバルオプションセットの詳細が表示されます。
オプションの追加
次に作成したカスタムグローバルオプションセットに新しい
オプションを追加してみます。新規オプションの追加は
InsertOptionValue アクションを実行する必要があります。
アクションについてはこちらの記事を参照してください。
プログラムの実装
1. 上記のコードに続いて以下のコードを追加して、追加する
オプションを定義します。
// 追加するオプションの定義
string newOption = @"{
'OptionSetName': 'new_customoptionset',
'Value': 10002,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 3',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 3',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
}";
2. 以下のコードを追加して InsertOptionValue Action を実行
します。
// オプションの追加
HttpResponseMessage updateOptionRes = await httpClient.PostAsync(serviceUrl + "InsertOptionValue",
new StringContent(newOption, Encoding.UTF8, "application/json"));
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. プログラム実行完了後、オプションが追加された事を確認します。
オプションの削除
次に既存のオプションを削除してみます。オプションセットの削除は
DeleteOptionValue アクションを利用します。次の操作のため、上記で
追加したオプションの追加はコメントアウトします。
プログラムの実装
1. 以下のコードを追加して、削除するオプションを定義します。
// 削除するオプションの定義
string removeOption = @"{
'OptionSetName': 'new_customoptionset',
'Value': 10000
}";
2. 以下のコードを追加して DeleteOptionValue Action を実行
します。
// オプションの削除
HttpResponseMessage removeOptionRes = await httpClient.PostAsync(serviceUrl + "DeleteOptionValue",
new StringContent(removeOption, Encoding.UTF8, "application/json"));
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 指定したオプションが削除されていることを確認します。
グローバルオプションセットの削除
最後のカスタムグローバルオプションセットを削除します。次の
操作のために、上記で追加したオプションの削除コードはコメント
アウトしておきます。
プログラムの実装
以下のコードを追加して、削除するオプションを定義します。
// カスタムグローバルオプションセットの削除
HttpResponseMessage deleteRes = await httpClient.DeleteAsync(serviceUrl + "GlobalOptionSetDefinitions(" + metadataId + ")");
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. カスタムグローバルオプションセットが削除されていることを
確認します。
以下に今回追加したメソッドを示します。
public async Task RunGlobalOptionSet(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);
string globalOptionSetMeta = @"
{
'@odata.type': '#Microsoft.Dynamics.CRM.OptionSetMetadata',
'Options': [
{
'Value': 10000,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 1',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 1',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
},
{
'Value': 10001,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 2',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 1',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
}
],
'Description': {
'LocalizedLabels': [{
'Label': 'カスタムのグローバルオプションセットです。',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'カスタムのグローバルオプションセットです。',
'LanguageCode': 1041
}
},
'DisplayName': {
'LocalizedLabels': [{
'Label': 'カスタムグローバルオプションセット',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'カスタムグローバルオプションセット',
'LanguageCode': 1041
}
},
'Name': 'new_CustomOptionSet',
'OptionSetType': 'Picklist'
}";
// カスタムグローバルオプションセットの作成
HttpResponseMessage createRes = await httpClient.PostAsync(serviceUrl + "GlobalOptionSetDefinitions",
new StringContent(globalOptionSetMeta, Encoding.UTF8, "application/json"));
// グローバルオプションセットの取得
HttpResponseMessage optionSetRes = await httpClient.GetAsync(serviceUrl + "GlobalOptionSetDefinitions?$select=MetadataId,Name");
JToken optionSets = JObject.Parse(optionSetRes.Content.ReadAsStringAsync().Result)["value"];
// MetadataId の取得
var metadataId = optionSets.Where(x => (string)x["Name"] == "new_customoptionset").First()["MetadataId"];
// 作成したカスタムグローバルオプションセットの取得
optionSetRes = await httpClient.GetAsync(serviceUrl + "GlobalOptionSetDefinitions(" + metadataId + ")");
JToken optionSet = JObject.Parse(optionSetRes.Content.ReadAsStringAsync().Result);
// 詳細の表示
Console.WriteLine(optionSet);
// 追加するオプションの定義
string newOption = @"{
'OptionSetName': 'new_customoptionset',
'Value': 10002,
'Label': {
'LocalizedLabels': [{
'Label': 'オプション 3',
'LanguageCode': 1041
}],
'UserLocalizedLabel': {
'Label': 'オプション 3',
'LanguageCode': 1041
}
},
'Description': {
'LocalizedLabels': [],
'UserLocalizedLabel': null
}
}";
// オプションの追加
HttpResponseMessage updateOptionRes = await httpClient.PostAsync(serviceUrl + "InsertOptionValue",
new StringContent(newOption, Encoding.UTF8, "application/json"));
// 削除するオプションの定義
string removeOption = @"{
'OptionSetName': 'new_customoptionset',
'Value': 10000
}";
// オプションの削除
HttpResponseMessage removeOptionRes = await httpClient.PostAsync(serviceUrl + "DeleteOptionValue",
new StringContent(removeOption, Encoding.UTF8, "application/json"));
// カスタムグローバルオプションセットの削除
HttpResponseMessage deleteRes = await httpClient.DeleteAsync(serviceUrl + "GlobalOptionSetDefinitions(" + metadataId + ")");
}
}
まとめ
Web API のメタデータ機能紹介は今回で終わりとなりますがいかが
だったでしょうか。今後の開発では組織サービスと合わせて Web API
も是非ご検討ください。
- 中村 憲一郎
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります