簡體   English   中英

事務中的 Dynamics Crm 批量更新記錄

[英]Dynamics Crm Bulk Update records in a transaction

要求

  1. 我有一個要求,我想更新帳戶中的幾個字段並為其創建聯系人,以便從 API 讀取數據。
  2. 要更新的記錄數約為 100,000,所以我想
    使用 ExecuteTransactionRequest 或 ExecuteMultipleRequest 以便我可以批量執行所有操作。

由於我希望為更新的帳戶創建聯系人記錄,因此我使用了 ExecuteTransactionRequest。

問題 -

問題是批量大小。 如果請求批量大小計數等於 500,則我添加了條件,然后執行所有請求。 但是我的批次可以包括

  • 更新帳戶請求和
  • 創建聯系請求

因此,批處理可能不是精確的 500,它可能會跳過執行請求。 如何執行此操作並確保為每個更新的帳戶正確創建聯系人記錄。

任何幫助,將不勝感激。 提前致謝

下面是我的代碼——

  var requests = new ExecuteTransactionRequest
        {
            Requests = new OrganizationRequestCollection(),
            ReturnResponses = returnResponses
        };

  foreach (var customer in customerList)
        {
            string custNo = customer.GetAttributeValue<string>("customernumber");

            // Gets customer details from another api
            var custInfo = await CustomerService.Get(custNo);

            // Update the values on customer table
             Entity cust = new Entity("account");
             cust.Id = customer.Id;
             cust["companytypecode"] = custInfo.EntityTypeCode;
             cust["companytypedescription"] = custInfo .EntityTypeDescription;
             

            var roles = custInfo.Roles.Where(c => c.RoleStatus == "ACTIVE").ToArray();
           //create contact for each account
           foreach(var role in roles)
           {
            Entity contact = new Entity("contact");
            contact["FirstName"] = role.RolePerson?.FirstName;
            contact["MiddleName"] = role.RolePerson?.MiddleNames;
            contact["LastName"] = role.RolePerson?.LastName;
            contact["AccountId"] = new EntityReference("account", customer.Id);

            CreateRequest createRequest = new CreateRequest { Target = contact };
            requests.Requests.Add(createRequest);
          }
           
            UpdateRequest updateRequest = new UpdateRequest { Target = cust };
            requests.Requests.Add(updateRequest);

            if (requests.Requests.Count == 500) // Problem is the batch size will not execute per account since it also has create request of contact. How can i make sure that each request is executed correctly
            {
                service.Execute(requests);
                requests.Requests.Clear();
            }
        }
      // For the last remaining accounts
        if (requests.Requests.Count > 0)
        {
            service.Execute(requests);

        }

謝謝你幫忙。 我用下面的解決方案解決了這個問題。 很高興得到糾正。

        EntityCollection requestsCollection = new EntityCollection();
        foreach (var customer in customerList)
        {
            string custNo= customer.GetAttributeValue<string>("customernumber");

            
            var custInfo = await businessService.Get(custNo);

            
         Entity cust = new Entity("account");
         cust.Id = customer.Id;
         cust["companytypecode"] = custInfo.EntityTypeCode;
         cust["companytypedescription"] = custInfo .EntityTypeDescription;
         requestsCollection.Entities.Add(cust);
            
       
        var roles = custInfo.Roles.Where(c => c.RoleStatus == "ACTIVE").ToArray();
       
       foreach(var role in roles)
       {
        Entity contact = new Entity("contact");
        contact["FirstName"] = role.RolePerson?.FirstName;
        contact["MiddleName"] = role.RolePerson?.MiddleNames;
        contact["LastName"] = role.RolePerson?.LastName;
        contact["AccountId"] = new EntityReference("account", customer.Id);

        requests.Entities.Add(contact);
      }

            
            if (requestsCollection.Entities.Count > 500)
            {
                
                ExecuteBulkUpdate(requestsCollection);
                requestsCollection = new EntityCollection();
                
            }
        }
private void ExecuteBulkUpdate(EntityCollection requestsCollection)
    {
        var requests = new ExecuteTransactionRequest
    {
        Requests = new OrganizationRequestCollection(),
        ReturnResponses = returnResponses
    };
        foreach (var request in requestsCollection.Entities)
        {
            if (request.Id != Guid.Empty)
            {   
                UpdateRequest updateRequest = new UpdateRequest { Target = request };
                requests.Requests.Add(updateRequest);
            }
            else
            {
                CreateRequest createRequest = new CreateRequest { Target = request };
                requests.Requests.Add(createRequest);
            }
        }

        try
        {
            var responseForCreateRecords = (ExecuteTransactionResponse)service.Execute(requests);
            
            int i = 0;
            // Display the results returned in the responses.
            foreach (var responseItem in responseForCreateRecords.Responses)
            {
                if (responseItem != null)
                    log.LogInformation(responseItem.Results["id"].ToString());
                i++;
            }
            requests.Requests.Clear();
        }
        catch (FaultException<OrganizationServiceFault> ex)
        {
            log.LogInformation("Request failed for the {0} and the reason being: {1}",
                ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
            throw;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM