CompoundUpdate Message (CrmService)

banner art

[Applies to: Microsoft Dynamics CRM 4.0]

Find the latest SDK documentation: CRM 2015 SDK

Works for all deployment types Works online and offline

Updates a compound entity instance (salesorder, invoice, quote or duplicaterule) and its related detail entity instance (salesorderdetail, invoicedetail, quotedetail or duplicaterulecondition).

The relevant classes are specified in the following table.

Type Class
Request CompoundUpdateRequest
Response CompoundUpdateResponse
Target TargetCompound
Entity See the following table.

The following table shows the entities and target classes for this message.

Entity Target Class
DynamicEntity TargetCompoundDynamic
duplicaterule TargetCompoundDuplicateRule
invoice TargetCompoundInvoice
quote TargetCompoundQuote
salesorder TargetCompoundSalesOrder

Remarks

To use this message, pass an instance of the CompoundUpdateRequest class as the request parameter in the Execute method.

To perform this action, the caller must have access rights on the entity instances specified in the request class. For a list of required privileges, see CompoundUpdate Privileges.

Example

This sample shows how to update a sales order object and its associated sales order details object.

[C#]
// Set up the CRM Service.
CrmAuthenticationToken token = new CrmAuthenticationToken();
// You can use enums.cs from the SDK\Helpers folder to get the enumeration for Active Directory authentication.
token.AuthenticationType = 0; 
token.OrganizationName = "AdventureWorksCycle";
 
CrmService service = new CrmService();
service.Url = "http://<servername>:<port>/mscrmservices/2007/crmservice.asmx";
service.CrmAuthenticationTokenValue = token;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;

// Retrieve the sales order details to be updated.
QueryByAttribute query = new QueryByAttribute();
query.EntityName = EntityName.salesorderdetail.ToString();
// Be aware that using AllColumns may adversely affect
// performance and cause unwanted cascading in subsequent 
// updates. A best practice is to retrieve the least amount of 
// data required.
query.ColumnSet = new AllColumns();
query.Attributes = new string[] {"salesorderid"};
query.Values = new string[] {created.Id.ToString()};
BusinessEntityCollection details = service.RetrieveMultiple(query);
salesorderdetail originalDetail = (salesorderdetail)details.BusinessEntities[0];

// Create the sales order to be updated.
salesorder salesorder = new salesorder();
salesorder.salesorderid = new Key();
salesorder.salesorderid.Value = created.Id;
salesorder.name = "New Test";

// Update the existing sales order detail.
salesorderdetail salesorderdetailUpdate = new salesorderdetail();
salesorderdetailUpdate.description = "Test 3";
salesorderdetailUpdate.salesorderdetailid = new Key();
salesorderdetailUpdate.salesorderdetailid.Value = originalDetail.salesorderdetailid.Value;

// Create the target for the request.
TargetCompoundSalesOrder target = new TargetCompoundSalesOrder();
target.SalesOrder = salesorder;
target.SalesOrderDetails = new salesorderdetail[] {salesorderdetailUpdate};

// Create the request.
CompoundUpdateRequest update = new CompoundUpdateRequest();
update.Target = target;

// Execute the request.
CompoundUpdateResponse updated = (CompoundUpdateResponse) service.Execute(update);

[Visual Basic .NET]
' Set up the CRM Service.
Dim token As New CrmAuthenticationToken()
' You can use enums.cs from the SDK\Helpers folder to get the enumeration for Active Directory authentication.
token.AuthenticationType = 0
token.OrganizationName = "AdventureWorksCycle";
 
Dim service As New CrmService()
service.Url = "http://<servername>:<port>/mscrmservices/2007/crmservice.asmx";
service.CrmAuthenticationTokenValue = token;
service.Credentials = System.Net.CredentialCache.DefaultCredentials

'Retrieve the sales order details to be updated.
Dim query As New QueryByAttribute()
query.EntityName = EntityName.salesorderdetail.ToString()
' Be aware that using AllColumns may adversely affect 
' performance and cause unwanted cascading in subsequent 
' updates.  A best practice is to retrieve the least amount of 
' data required.
query.ColumnSet = New AllColumns()
query.Attributes = New String() {"salesorderid"}
query.Values = New String() {created.Id.ToString()}
Dim details As BusinessEntityCollection = service.RetrieveMultiple(query)
Dim originalDetail As salesorderdetail = CType(details.BusinessEntities(0), salesorderdetail)

' Create the sales order to be updated.
Dim salesorder As New salesorder()
salesorder.salesorderid = New Key()
salesorder.salesorderid.Value = created.Id
salesorder.name = "New Test"

' This updates the existing sales order detail.
Dim salesorderdetailUpdate As New salesorderdetail()
salesorderdetailUpdate.description = "Test 3"
salesorderdetailUpdate.salesorderdetailid = New Key()
salesorderdetailUpdate.salesorderdetailid.Value = originalDetail.salesorderdetailid.Value

' Create the target for the request.
Dim target As New TargetCompoundSalesOrder()
target.SalesOrder = salesorder
target.SalesOrderDetails = New salesorderdetail() {salesorderdetailUpdate}

' Create the request.
Dim update As New CompoundUpdateRequest()
update.Target = target

' Execute the request.
Dim updated As CompoundUpdateResponse = CType(service.Execute(update), CompoundUpdateResponse)

See Also

Concepts

Reference

© 2010 Microsoft Corporation. All rights reserved.