Ошибка логики кодирования CRM - PullRequest
0 голосов
/ 03 марта 2012

Это на самом деле не связано с конкретной ошибкой; мой код не делает то, что должен.

У меня есть блок кода - цикл foreach - который инициирует метод в другом классе ("GetCustomersByGuid ()"). Предполагается, что этот метод добавляет коллекцию клиентов из одного элемента (список в CRM) в другую коллекцию клиентов. При зацикливании он должен заполнить коллекцию клиентов всеми значениями ~ 2500.

Проблема в том, что после завершения цикла коллекция клиентов заполняется только одним клиентом - последним в списке, который будет добавлен в коллекцию. Я попробовал несколько разных вещей, но не повезло ... потому что MS CRM показывает только одного клиента в коллекции (он же маркетинговый список, который является частью кампании и т. Д. И т. Д.).

Вот мой код. Дайте мне знать, что вы думаете. Спасибо !!

Это основной код Program.cs, который выполняется:

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:

    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;
    }

Спасибо ...

1 Ответ

1 голос
/ 03 марта 2012

Ваша первая строка в GetCustomersByGuid() - this.Clear();, то есть все клиенты удаляются при каждом вызове метода, то есть при каждой итерации цикла Затем последняя строка в этом методе this.AddRange, но это добавит только текущего клиента.

Я думаю this.Clear(); должно идти до foreach (string s in guids) в вашем методе doCRMWork.

...