Upsert を使用してレコードを挿入または更新
公開日: 2017年1月
対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online
UpsertRequest メッセージを使用して、データ統合のシナリオに含まれる複雑さを減らすことができます。 データを外部システムから Microsoft Dynamics 365 に読み込むとき、大量データの統合の場合など、レコードが Dynamics 365 に既に存在するかが分からない場合があります。 このような場合、UpdateRequest または CreateRequest 操作を呼び出す必要があるかどうかが分かりません。 この結果、適切な操作を実行する前に、そのレコードが存在するかどうかを決定するために、最初にそのレコードをクエリすることになります。 現在は、新しい UpsertRequest (更新または送信) メッセージを使用して、この複雑さを減らしてデータを Dynamics 365 により効率よく読み込むことができます。
このトピックの内容
Upsert の使用
Upsert プロセスの詳細
サンプル コード
Upsert の使用
レコードが存在するかどうかが確かでない場合にのみ、UpsertRequest を使用することをお勧めします。 つまり、CreateRequest または UpdateRequest 操作を呼び出す必要があるかどうか確かでない場合です。UpsertRequest の使用は、CreateRequest の使用に比べて、パフォーマンスの低下があります。 レコードが存在しないことが確実な場合は、CreateRequest を使用します。
UpsertRequest には、Target という名前のプロパティが含まれています。 このプロパティには、UpdateRequest または CreateRequest 操作で使用されるエンティティ定義が含まれています。 これには、また、レコードが存在しない場合にそのレコードを作成できるように、CreateRequest によって要求される、対象のエンティティの種類に対するすべての属性も含まれています。
RecordCreated を確認して、レコードが作成されたかどうか判断することができます。RecordCreated は、レコードが存在せず作成された場合に true になります。 レコードが既に存在し、更新された場合は false です。Target は、存在することが判明したレコード、または作成されたレコードに対する EntityReference となります。
UpsertRequest の動作の詳細については、次のセクションを参照してください。
Upsert プロセスの詳細
次の手順では、UpsertRequest を受け取ったときの、処理ロジックについて説明します。
作成または挿入の操作ために十分なデータう付けて、UpsertRequest を送信します。
Microsoft Dynamics 365 は、ターゲット エンティティの対象となるレコードを検索します。
レコードが存在する場合は、次の手順を実行します。
見つかったレコードの ID で、ターゲット エンティティの ID プロパティを設定します。
[更新] を呼び出します。
RecordCreated を false に設定します。
更新のターゲット エンティティから EntityReference を Target の値として作成します。
UpsertResponse を返します。
レコードが存在しない場合は、次の手順を実行します。
代替キーの値をターゲット エンティティの属性にコピーします。
Create を呼び出します。
RecordCreated を true に設定します。
ターゲット エンティティの種類と Create 要求の結果得られた ID から EntityReference を、Target の値として作成します。
UpsertResponse を返します。
次の図は、UpsertRequest を受け取ったときに展開されるプロセスを示しています。
サンプル コード
Upsert を使用してレコードを挿入または更新 のサンプル ファイル ProductUpsertSample.cs には ProcessUpsert メソッドが含まれています。このメソッドは、UpsertRequest メッセージを XML ファイルのコンテンツに適用して、新しいレコードを作成するか、または既存のレコードを更新します。
public void ProcessUpsert(String Filename)
{
Console.WriteLine("Executing upsert operation.....");
XmlTextReader tr = new XmlTextReader(Filename);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(tr);
XmlNodeList xnlNodes = xdoc.DocumentElement.SelectNodes("/products/product");
foreach (XmlNode xndNode in xnlNodes)
{
String productCode = xndNode.SelectSingleNode("Code").InnerText;
String productName = xndNode.SelectSingleNode("Name").InnerText;
String productCategory = xndNode.SelectSingleNode("Category").InnerText;
String productMake = xndNode.SelectSingleNode("Make").InnerText;
//use alternate key for product
Entity productToCreate = new Entity("sample_product", "sample_productcode", productCode);
productToCreate["sample_name"] = productName;
productToCreate["sample_category"] = productCategory;
productToCreate["sample_make"] = productMake;
UpsertRequest request = new UpsertRequest()
{
Target = productToCreate
};
try
{
// Execute UpsertRequest and obtain UpsertResponse.
UpsertResponse response = (UpsertResponse)_serviceProxy.Execute(request);
if (response.RecordCreated)
Console.WriteLine("New record {0} is created!", productName);
else
Console.WriteLine("Existing record {0} is updated!", productName);
}
// Catch any service fault exceptions that Microsoft Dynamics CRM throws.
catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
{
throw;
}
}
// Prompts to view the sample_product entity records.
// If you choose "y", IE will be launched to display the new or updated records.
if (PromptForView())
{
ViewEntityListInBrowser();
}
}
関連項目
変更の追跡を使用してデータを外部システムに同期
エンティティの代替キーの定義
代替キーを使用してレコードを作成
Microsoft Dynamics 365
© 2017 Microsoft. All rights reserved. 著作権