Борис Макушкин
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 ), обслуживающем клиентов в городах Москва, Петербург, Ростов, Нижний Новгород, Новосибирск, Казань, Киев, Харьков.