2012-03-03 3 views
0

이 오류는 특정 오류와 관련이 없습니다. 내 코드가하는 일을하지 않습니다.CRM 코딩 논리 오류

다른 클래스 ("GetCustomersByGuid()")의 메소드를 초기화하는 foreach 루프 코드 블록이 있습니다. 이 방법은 하나의 고객 컬렉션 (CRM의 목록)을 다른 고객 컬렉션에 추가해야합니다. 반복되면 고객 컬렉션에 ~ 2500 값이 모두 채워집니다.

문제는 루프가 끝나면 고객 컬렉션에 하나의 고객 (컬렉션에 추가 할 목록의 마지막 고객) 만 채워집니다. MS CRM은 컬렉션 (일명 캠페인 목록에 포함 된 마케팅 목록 등)에 단 한 명의 고객 만 표시하기 때문에 여러 가지 사항을 시도했지만 행운은 없습니다.

여기 내 코드입니다. 네 생각을 말해봐. 고맙습니다!! 여기

private static void doCRMWork() 
    { 
     try 
     { 
      CRMConnectionHelper.Authenticate(); 

      Console.WriteLine("Begin."); 

      //queryCrm(); 

      const string f = @"C:\WindowsApps\CRM\crm_interface3\data\CRMGuids_HM2011_v2.txt"; 

      List<string> guids = new List<string>(); 

      using (StreamReader r = new StreamReader(f)) 
      { 
       string line; 
       while ((line = r.ReadLine()) != null) 
       { 
        guids.Add(line); 
       } 
      } 

      CustomerCollection customers = new CustomerCollection(); 

      foreach (string s in guids) 
      { 
       customers.GetCustomersByGuid(s); 
       Console.WriteLine("Customer added"); 

       //Overwriting the customer collection every loop iteration... 
      } 

      Campaign cmpn = new Campaign(); 
      cmpn.CreateCampaign("2011 Test3 Holiday Mailing"); 

      Console.WriteLine("Campaign and activity created. Press enter to continue."); 
      Console.ReadLine(); 

      cmpn.AddCustomersToCampaign(customers); 
      Console.WriteLine("Created marketing list and added customers to campaign."); 
      Console.WriteLine("End."); 
      Console.ReadLine(); 
     } 

가 GetCustomersByGUID 방법에 대한 코드입니다 :

public void GetCustomersByGuid(String GUID) 
    { 
     this.Clear(); 
     ConditionExpression condition_contact = new ConditionExpression(); 
     condition_contact.Operator = ConditionOperator.Equal; 
     condition_contact.Values = new String[] { GUID }; //Creates one-item array for current GUID 
     condition_contact.AttributeName = "contactid"; 
     FilterExpression filter_contact = new FilterExpression(); 
     filter_contact.FilterOperator = LogicalOperator.And; 
     filter_contact.Conditions = new ConditionExpression[] { condition_contact }; 
     this.AddRange(GetCrmCustomers(filter_contact, Customer.CustomerTypes.Contact)); //** 

    } 

그리고 여기 GetCrmCustomers 방법에 대한 코드입니다 :

실행 메인 Program.cs 코드

private static CustomerCollection GetCrmCustomers(FilterExpression filter, Customer.CustomerTypes customerType) 
    { 
     CustomerCollection customers = new CustomerCollection(); 
     if (customerType == Customer.CustomerTypes.Contact) 
     { 
      QueryExpression query = new QueryExpression(); 
      query.ColumnSet = new AllColumns(); 
      query.EntityName = EntityName.contact.ToString(); 
      if (filter != null) 
      { 
       query.Criteria = filter; 
      } 
      BusinessEntityCollection bc = new BusinessEntityCollection(); 
      try 
      { 
       bc = CRMInterface.crmService.RetrieveMultiple(query); 
      } 
      catch 
      { 
      } 
      if (bc.BusinessEntities != null) 
      { 
       for (int i = 0; i < bc.BusinessEntities.Length; i++) 
       { 
        //I think BusinessEntities.Length is 1 because of 'new string[] {GUID}' -- one element. 
        Console.WriteLine("i is: " + i + "and bc.BusinessEntities.Length is: " + bc.BusinessEntities.Length); 
        Customer customer = new Customer(); 
        customer.CustomerType = Customer.CustomerTypes.Contact; 
        customer.GUID = ((contact)bc.BusinessEntities[i]).contactid.Value.ToString(); 
        customer.Firstname = ((contact)bc.BusinessEntities[i]).firstname == null ? "" : ((contact)bc.BusinessEntities[i]).firstname; 
        customer.Middlename = ((contact)bc.BusinessEntities[i]).middlename == null ? "" : ((contact)bc.BusinessEntities[i]).middlename; 
        customer.Lastname = ((contact)bc.BusinessEntities[i]).lastname == null ? "" : ((contact)bc.BusinessEntities[i]).lastname; 
        customer.Suffix = ((contact)bc.BusinessEntities[i]).suffix == null ? "" : ((contact)bc.BusinessEntities[i]).suffix; 
        customer.Email = ((contact)bc.BusinessEntities[i]).emailaddress1 == null ? "" : ((contact)bc.BusinessEntities[i]).emailaddress1.Trim().ToLower(); 
        customer.Donotbulkemail = ((contact)bc.BusinessEntities[i]).donotbulkemail == null ? false : ((contact)bc.BusinessEntities[i]).donotbulkemail.Value; 
        customers.Add(customer); //*** 
        //So customers is the collection that is added to the end of the list each time. 

        //This loop is only run once in this class, but is run over and 
        //over again in the program class. 
        //It might be 

       } 
      } 
     } 
     else 
     { 
      QueryExpression query = new QueryExpression(); 
      query.ColumnSet = new AllColumns(); 
      query.EntityName = EntityName.account.ToString(); 
      query.Criteria = filter; 
      BusinessEntityCollection bc = new BusinessEntityCollection(); 
      try 
      { 
       bc = CRMInterface.crmService.RetrieveMultiple(query); 
      } 
      catch 
      { 
      } 

      if (bc.BusinessEntities != null) 
      { 
       for (int i = 0; i < bc.BusinessEntities.Length; i++) 
       { 
        Customer customer = new Customer(); 
        customer.CustomerType = Customer.CustomerTypes.Account; 
        customer.GUID = ((account)bc.BusinessEntities[i]).accountid.Value.ToString(); 
        customer.Name = ((account)bc.BusinessEntities[i]).name == null ? "" : ((account)bc.BusinessEntities[i]).name; 
        customer.Email = ((account)bc.BusinessEntities[i]).emailaddress1 == null ? "" : ((account)bc.BusinessEntities[i]).emailaddress1.Trim().ToLower(); 
        customer.Donotbulkemail = ((account)bc.BusinessEntities[i]).donotbulkemail == null ? false : ((account)bc.BusinessEntities[i]).donotbulkemail.Value; 
        customers.Add(customer); 
       } 
      } 
     } 
     return customers; 
    } 

감사 ...

+0

아 ...이게 될 수도 있습니다. 내가 지금까지 그걸 알아 채지 못한 이유는 모르겠다. 나는 그것을 시험해보고 어떤 일이 일어날 지 알려주지 ... Lol – Paul

답변

1

GetCustomersByGuid()의 첫 번째 줄은 this.Clear();입니다. 즉, 메서드가 호출 될 때마다, 즉 루프가 반복 될 때마다 모든 고객이 제거됩니다. 그런 다음 해당 메서드의 마지막 줄은 this.AddRange이지만 현재 고객 만 추가됩니다.

귀하의 방법이 doCRMWork 인 경우 this.Clear();foreach (string s in guids) 앞에 있어야한다고 생각합니다.

+0

그게 .. 나는 이것을 게시 한 직후에 나 자신을 알아 차렸다. D' oh ... 고마워! – Paul