2016-04-08 13 views
0

Varolan hesapları Vat ve Kayıt numarasıyla güncellemem gereken bir senaryo var. Sistemde 30 binin üzerinde hesap var. CRM SDK API'sini kullanarak güncellemeye çalışıyorum ancak gerçek güncellemeyi nasıl gerçekleştireceğimi öğrenmek için mücadele ediyorum. KDV numarası ve kayıtları bana bir e-tabloda karşılık gelen numaralar ile verildi. Lütfen hesapların zaten CRM'de olduğuna dikkat edin. Bu nedenle, KDV ve Kayıt numarasıyla doğru hesabı güncellemem gerekiyor. Bunu CRM'de nasıl yapabilirim? aşağıda benim kodunda tavsiye lütfen:CRM Dynamics 2013 SDK Güncelleştirmeler 2 Değerle

public static void UpdateAllCRMAccountsWithVATAndRegistrationNumber(IOrganizationService service) 
     { 
      QueryExpression qe = new QueryExpression(); 
      qe.EntityName = "account"; 
      qe.ColumnSet = new ColumnSet("account", "new_vatno", "new_registrationnumber"); 
      qe.Criteria.AddCondition("accountnumber", ConditionOperator.In,"TA10024846", "TA10028471", "TA20014015", "TA4011652", "TA4011557"); 

      EntityCollection response = service.RetrieveMultiple(qe); 

      foreach (var acc in response.Entities) 
      { 
       acc.Attributes["new_vatno"] = //this is where I am struggling to figure out how I am gong to match the records up, 
       acc.Attributes["new_registrationnumber"] = //this is where I am struggling to figure out how I am gong to match the records up, 

       service.Update(acc); 
      } 


     } 

ben doğru kayıtlarını güncellemek sağlamak için gidiyorum nasıl. Bir e-tabloda hesaplar için KDV ve kayıt numaraları var, lütfen aşağıdaki örnek resme bakın. Buradan haberdar olabilir miyim lütfen. Teşekkürler.

SpreadSheet With Accounts with the vat numbers and registration numbers

cevap

0

Bir sözlüğüne elektronik tablodan KDV güncellemeleri listesini yük olur ve sonra belleğe CRM den 30 k setini yükleyin. Sonra onları eşleştirip güncellemeleri yapmak için ExecuteMultipleRequest kullanıyorum. Alternatif olarak, hesap numaralarını kullanarak CRM'yi sorgulayabilirsiniz (eğer liste yeterince küçükse). 30k kayıt kümesinde yapılacak binlerce güncellemede bulunduğunuz varsayımı yaptım. Not: Hesap Kayıt boyutu çok büyük ve belleğe yüklenemediyse, hesap sorguları yapmanız gerekir. Çünkü başarısız bağlı getirilen varlık Güncellenmesi

public class VatInfo 
{ 
    public string RegistrationNumber; 
    public string TaxNumber; 

    public static Dictionary<string, VatInfo> GetVatList() 
    { 
     //TODO: Implement logic to load CSV file into a list. Dictionary key value should be Account Number   
     throw new NotImplementedException(); 
    } 
} 


public class UpdateVatDemo 
{ 
    public const int maxBatchSize = 100; 

    public static void RunVatUpdate(IOrganizationService conn) 
    { 

     var vats = VatInfo.GetVatList(); 

     var pagingQuery = new QueryExpression("account"); 
     pagingQuery.ColumnSet = new ColumnSet("accountnumber"); 

     Queue<Entity> allEnts = new Queue<Entity>(); 

     while (true) 
     { 

      var results = conn.RetrieveMultiple(pagingQuery); 

      if (results.Entities != null && results.Entities.Any()) 
       results.Entities.ToList().ForEach(allEnts.Enqueue); 

      if (!results.MoreRecords) break; 

      pagingQuery.PageInfo.PageNumber++; 
      pagingQuery.PageInfo.PagingCookie = results.PagingCookie; 

     } 

     ExecuteMultipleRequest emr = null; 

     while (allEnts.Any()) 
     { 
      if (emr == null) 
       emr = new ExecuteMultipleRequest() 
       { 
        Settings = new ExecuteMultipleSettings() 
        { 
         ContinueOnError = true, 
         ReturnResponses = true 
        }, 
        Requests = new OrganizationRequestCollection() 
       }; 

      var ent = allEnts.Dequeue(); 

      if (vats.ContainsKey(ent.GetAttributeValue<string>("accountnumber"))) 
      { 
       var newEnt = new Entity("account", ent.Id); 
       newEnt.Attributes.Add("new_vatno", vats[ent.GetAttributeValue<string>("accountnumber")].TaxNumber); 
       newEnt.Attributes.Add("new_registrationnumber", vats[ent.GetAttributeValue<string>("accountnumber")].RegistrationNumber); 
       emr.Requests.Add(new UpdateRequest() { Target = newEnt }); 
      } 


      if (emr.Requests.Count >= maxBatchSize) 
      { 
       try 
       { 
        var emResponse = (ExecuteMultipleResponse) conn.Execute(emr); 

        foreach (
         var responseItem in emResponse.Responses.Where(responseItem => responseItem.Fault != null)) 
         DisplayFault(emr.Requests[responseItem.RequestIndex], 
          responseItem.RequestIndex, responseItem.Fault); 

       } 
       catch (Exception ex) 
       { 
        Console.WriteLine($"Exception during ExecuteMultiple: {ex.Message}"); 
        throw; 
       } 

       emr = null; 
      } 


     } 

    } 

    private static void DisplayFault(OrganizationRequest organizationRequest, int count, 
     OrganizationServiceFault organizationServiceFault) 
    { 
     Console.WriteLine(
      "A fault occurred when processing {1} request, at index {0} in the request collection with a fault message: {2}", 
      count + 1, 
      organizationRequest.RequestName, 
      organizationServiceFault.Message); 
    } 

} 
+0

Teşekkür @Nicknow, ben bunun doğru oldukça farklı bir yaklaşım kullanarak elde başarmışlardır. Cevabımı aşağıya bakın. – Papi

+0

@papi - cevabınız yanlıştır, derleme yapmayacağınız ve yapamayacağınız şeyi yapamayacağınız kötü bir koddur. Cevabınızı doğru düşünen herkes yanlış yönlendirilmekte. Derleme yapsa bile, orijinal varlık nesnesini güncelleştirme çağrısında CRM sunucusuna geri göndermek iyi bir uygulama değildir, yalnızca kimliği ve kirli alanları göndermeniz gerekir. Ayrıca, kodunuz çok verimsiz olur. – Nicknow

+0

Yapıcı eleştiri için teşekkürler. Önerdiğin yaklaşımı deneyeceğim. – Papi

0

: Burada

kaba temel çözüm için kodu (Minimal hata işleme yöntemi bölmek gerekir, test ve orada değil) 'dir null olmayacak olan varlık devletinin.

getirilen varlıkları güncellemek için, yukarı yeni bir varlık gerekir: Aşağıdaki

foreach (var acc in response.Entities) 
     { 
      var updateAccount = new Entity("account") { Id = acc.Id }; 
      updateAccount .Attributes["new_vatno"] = null; //using null as an example. 
      updateAccount .Attributes["new_registrationnumber"] = null; 
      service.Update(acc); 
     } 
-1

Kod ben righy başardı gösterir. forst açıklamama izin ver. Kayıtlarımı ayrı bir SQL tablosuna aktardım, kodumda bu tabloyu bellekte bir listeye okudum, sonra da güncellenmesi gereken CRM hesaplarını sorgularım, sonra her hesaptan sonra dönüyorum ve CRM'deki hesap numarasının eşleşip eşleşmediğini kontrol ediyorum. eğer maç benim sql veritabanından hesap numarası, o zaman hiçbir ilgili Reg güncelleme ve Kdv hayır, aşağıdaki kod bakınız:

List<Sheet1_> crmAccountList = new List<Sheet1_>(); 

      //var crmAccount = db.Sheet1_.Select(x => x).ToList().Take(2); 
      var crmAccounts = db.Sheet1_.Select(x => x).ToList(); 


      foreach (var dbAccount in crmAccounts) 
      { 
       CRMDataObject modelObject = new CRMDataObject() 
       { 
        ID = dbAccount.ID, 
        Account_No = dbAccount.Account_No, 
        Tax_No = dbAccount.Tax_No.ToString(), 
        Reg_No = dbAccount.Reg_No 
        //Tarsus_Country = dbAccount.Main_Phone 
       }; 

      } 

      var officialDatabaseList = crmAccounts; 

      foreach (var crmAcc in officialDatabaseList) 
      { 
       QueryExpression qe = new QueryExpression(); 
       qe.EntityName = "account"; 
       qe.ColumnSet = new ColumnSet("accountnumber", "new_vatno", "new_registrationnumber"); 
       qe.Criteria.AddCondition("accountnumber", ConditionOperator.In,'list of account numbers go here' 

    EntityCollection response = service.RetrieveMultiple(qe); 

       foreach (var acc in response.Entities) 
       { 
        if (crmAcc.Account_No == acc.Attributes["accountnumber"].ToString()) 
        { 
         //acc.Attributes["new_vatno"] = crmAcc.VAT_No.ToString(); 
         acc.Attributes["new_registrationnumber"] = crmAcc.Reg_No.ToString(); 

         service.Update(acc); 
        } 

       } 
      } 
İlgili konular