Microsoft CRM: конверсия данных - импорт из Act!

 

Борис Макушкин

Alba Spectrum Technologies

(095) 918-3314, (095) 918-3111, help@albaspectrum.com  

 

 

Компания Best Software представляет на рынке программу управления контактами и продажами Act!. Эта система является представителем обширного семейства CRM приложений. Приспособленное к рынку CRM-систем для малого бизнеса, его главной привлекательностью является очень низкая цена по сравнению с предложениями от других поставщиков, действующих на рынке CRM-систем. Система крайне удобна в использовании, нетребовательна к ресурсам и легка в освоении. Но наступает тот момент, когда она уже не в состоянии удовлетворить растущие потребности компании и встает вопрос о внедрении «большой» CRM от одного из ведущих поставщиков. Организация проходит стадии оценки, выбора, внедрения и возникает резонный вопрос – а как быть с данными, хранящимися годами в старой системе Act! ? Крайне не хотелось бы отнимать людские ресурсы на рутинную процедуру ручного повторного ввода данных в CRM систему, которая также наверняка внесет массу ошибок в переносимые данные.

Итак, перед отделом IT компании, проводящей внедрение CRM системы встает резонный вопрос – как с наименьшими потерями, затратами и наибольшей скоростью провести миграцию данных? На этот вопрос мы и постараемся дать ответ в данной статье, рассмотрев миграцию данных из Best Software Act! в MS CRM. Итак, приступим:

1.      Сначала нам необходимо получить Act! SDK, который дает нам возможность получать доступ к данным с помощью .NET . SDK лежит в свободном доступе на сайте Best Software

2.      Установим Act! SDK на той машине, где мы будем вести разработку

3.      Мы будем применять асинхронную модель экспорта/импорта данных, то есть мы спроектируем систему из двух частей – экспорт данных в XML файл и импорт в MS CRM из этого файла

4.      Создадим программу экспорта данных из Act!. Мы будем использовать C# - для использования классов Act Framework нам понадобятся следующие сборки:

using Act.Framework;

using Act.Framework.Activities;

using Act.Framework.Companies;

using Act.Framework.ComponentModel;

using Act.Framework.Contacts;

using Act.Framework.Database;

using Act.Framework.Groups;

using Act.Framework.Histories;

using Act.Framework.Lookups;

using Act.Framework.MutableEntities;

using Act.Framework.Notes;

using Act.Framework.Opportunities;

using Act.Framework.Users;

using Act.Shared.Collections;

 

5.      Подключимся к базе данных Act!:

                        ActFramework framework = new ActFramework();

                        framework.LogOn("Act Username", "password", "SERVER”, "Database");

6.      Теперь нам надо получить названия полей в Act для составления корректного мапинга на поля MS CRM:

        private void ShowContactsFieldsDescriptions(ActFramework framework) {

                        ContactFieldDescriptor[] cFields = framework.Contacts.GetContactFieldDescriptors();

                        ContactFieldDescriptor cField;

 

                        for(int x = 0; x < cFields.Length; x++)

                        {

                                        cField = cFields[x];

 

                                        Console.WriteLine("Table Name:\t\t{0}", cField.TableName);

                                        Console.WriteLine("Column Name:\t{0}", cField.ColumnName);

                                        Console.WriteLine("Display Name:\t{0}", cField.DisplayName);

                                        Console.WriteLine("ACT Field Type:\t{0}", cField.ACTFieldType);

                                        Console.WriteLine("");

                        }

        }

7.      Получим список контактов и создадим файл, в который будут выгружены инструкции для импорта данных в MS CRM:

                        ContactList cList = framework.Contacts.GetContacts(null);

                        FileInfo t = new FileInfo("Contacts.xml");

                        StreamWriter stw = t.CreateText();

8.      Сформируем данные для экспорта:

        for (int i = 0; i < cList.Count; i++) {

                        string strContactXml = "<contact>";

 

                        ContactFieldDescriptor cField;

                        Object oValue;

 

                        // First Name

                        cField = framework.Contacts.GetContactFieldDescriptor("TBL_CONTACT.FIRSTNAME");

                        oValue = cField.GetValue(cList[i]);

                        if (oValue != null && !(oValue.ToString().Trim().Equals("")))

                                        strContactXml += "<firstname><![CDATA[" + oValue.ToString() + "]]></firstname>";

 

                        // Last Name

                        cField = framework.Contacts.GetContactFieldDescriptor("TBL_CONTACT.LASTNAME");

                        oValue = cField.GetValue(cList[i]);

                        if (oValue != null && !(oValue.ToString().Trim().Equals("")))

                                        strContactXml += "<lastname><![CDATA[" + oValue.ToString() + "]]></lastname>";

                        else

                                        strContactXml += "<lastname>" + "N/A" + "</lastname>";

 

                        // Salutation

                        cField = framework.Contacts.GetContactFieldDescriptor("TBL_CONTACT.SALUTATION");

                        oValue = cField.GetValue(cList[i]);

                        if (oValue != null && !(oValue.ToString().Trim().Equals("")))

                                        strContactXml += "<salutation><![CDATA[" + oValue.ToString() + "]]></salutation>";

 

                        // Job Title

                        cField = framework.Contacts.GetContactFieldDescriptor("TBL_CONTACT.JOBTITLE");

                        oValue = cField.GetValue(cList[i]);

                        if (oValue != null && !(oValue.ToString().Trim().Equals("")))

                                        strContactXml += "<jobtitle><![CDATA[" + Regex.Replace(oValue.ToString(), "\r\n", "<BR>") + "]]></jobtitle>";

9.      Это лишь часть данных, которые можно перенести из Act! в MS CRM – полный список слишком длинный для статьи, но вы можете составить его сами на основании схемы данных. Стоит обратить особое внимание на замену символов перевода строки на HTML тэг <BR> - это требование для хранения символьных данных в MS CRM

10. Следующим этапом будет создание программы для импорта данных в  CRM. Мы не будем подробно останавливаться на методах организации подключения к MS CRM и пр. деталях. Рассмотрим лишь основные моменты импорта. Полученный на предыдущих шагах XML файл выглядит так:

<contact><firstname><![CDATA[John]]></firstname><lastname><![CDATA[Smith]]></lastname><salutation><![CDATA[John]]></salutation><address1_line1><![CDATA[1234 W. Big River]]></address1_line1><address1_city><![CDATA[Chicago]]></address1_city><address1_stateorprovince><![CDATA[IL]]></address1_stateorprovince><address1_postalcode><![CDATA[123456]]></address1_postalcode><description><![CDATA[Toy Corporation]]></description><ownerid type="8">{4F1849C3-9184-48B5-BB09-078ED7AB2DAD}</ownerid></contact>

11.  Цикл чтения файла и создания контакта в MS CRM довольно прост:

        Microsoft.Crm.Platform.Proxy.BizUser bizUser = new Microsoft.Crm.Platform.Proxy.BizUser();

                       

        ICredentials credentials = new NetworkCredential(crmUsername, crmPassword, crmDomain);

 

        bizUser.Url = crmDir + "BizUser.srf";

        bizUser.Credentials = credentials;

        Microsoft.Crm.Platform.Proxy.CUserAuth userAuth = bizUser.WhoAmI();

 

        // CRMContact proxy object

        Microsoft.Crm.Platform.Proxy.CRMContact contact = new Microsoft.Crm.Platform.Proxy.CRMContact ();

        contact.Credentials = credentials;

        contact.Url = crmDir + "CRMContact.srf";

 

        CorrectXML("Contacts.xml", userAuth.UserId);

 

        StreamReader reader = File.OpenText("Contacts.xml");

 

        string input = null;

                       

        while ((input = reader.ReadLine()) != null)

        {

                        string strContactId = contact.Create(userAuth, input);

 

                        Console.WriteLine("Contact {0} is created", strContactId);

                        log.Debug("Contact " + strContactId + " is created");

        }

12.  В данном случае стоит остановиться только на функции CorrectXML – она производит подстановку OwnerId в XML дерево контакта:

        private void CorrectXML(string fileName, string userId) {

                        File.Move(fileName, fileName + ".old");

 

                        StreamReader reader = File.OpenText(fileName + ".old");

                        FileInfo t = new FileInfo(fileName);

                        StreamWriter writer = t.CreateText();

                       

                        string input = null;

                       

                        while ((input = reader.ReadLine()) != null)

                        {

                                        input = Regex.Replace(input, "{_REPLACE_ME_}", userId);

 

                                        writer.WriteLine(input);

                        }

                       

                        reader.Close();

                        writer.Close();

 

                        File.Delete(fileName + ".old");

        }

13.  Итак, запускаем экспорт, импорт, открываем  MS CRM и видим список контактов, перенесенный из Act! в целости и сохранности!

14.  Отдельным пунктом является перенос из Act! данных о продажах, примечаний и пр. данных – об этом в следующих статьях. Удачи!

 

Удачи в выборе и принятии решения.  В случае чего мы всегда под рукой: (095) 918-3314, (095) 918-3111

 

Борис Макушкин – ведущий программист в Alba Spectrum Technologies – Microsoft Business Solutions CRM партнере ( http://www.albaspectrum.com ), обслуживающем клиентов в городах Москва, Петербург, Ростов, Нижний Новгород, Новосибирск, Казань, Киев, Харьков.