Microsoft CRM Интеграция: Импорт Siebel Email attachments (C# и MS Transact SQL код)

 

Игорь Кудряшов

Alba Spectrum Technologies

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

 

Microsoft CRM – это ответ Microsoft Business Solutions на потребность рынка CRM для средних и даже небольших компаний.  Microsoft CRM имеет очень агрессивную цену.  Мы знаем случаи когда клиент менял CRM, такую как Siebel на Microsoft CRM.

 

 

Целью нашей сегодняшней статьи будет являться импорт электронных писем, сохраненных в файловой системе утилитой переноса данных из CRM Siebel в базу данных MS CRM. Каждое сообщение представлено отдельным файлом в каталоге, заданном для импорта. Для осуществления процедур импорта мы будем использовать custom SQL table, созданную в MS SQL Server 2000:

 

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CrmAttachImporter]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[CrmAttachImporter]

GO

 

CREATE TABLE [dbo].[CrmAttachImporter] (

                [Id]  uniqueidentifier ROWGUIDCOL  NOT NULL ,

                [CrmActivityGuid] [varchar] (50) NOT NULL ,

                [MsgFileName] [varchar] (2000) NOT NULL

) ON [PRIMARY]

GO

 

            Небольшие пояснения к этой таблице – ее цель хранить соответствие GUID существующей CRM activity и имени файла с вложением (e-mail сообщения), который надо присоединить к данному acitivty. В поле CrmActivityGuid мы будем хранить GUID существующего Activity, а в поле MsgFileName – имя файла вложения в исходном каталоге импорта.

            Конфигурационный файл для нашей утилиты будет выглядеть следующим образом:

 

<config>

                <connectionString>provider=SQLOLEDB;Initial Catalog=Albaspectrum;Data Source=MSSQL1;User Id=sa;Password=sa;</connectionString>

                <msgFolder>data</msgFolder>

                <tableName>CrmAttachImporter</tableName>

                <activityGuidColumn>CrmActivityGuid</activityGuidColumn>

                <msgFileNameColumn>MsgFileName</msgFileNameColumn>

</config>

 

            Здесь мы описываем строку соединения к MS SQL Server, путь к сообщениям в файловой системе, имя таблицы для хранения соответствия CRM Activity GUID и имен файлов, имена колонок в таблице, необходимых для осуществления процедуры импорта.

            Для контроля процесса импорта мы будем использовать свободно распространяемую библиотеку для ведения лог-журнала для .NET log4net. С ней  можно ознакомиться по адресу http://logging.apache.org/log4net/

            Рассмотрим метод сканирования входного каталога потенциальных файлов-вложений:

                public void scanFolder() {

                                log = LogManager.GetLogger(typeof(AttachImporter));

                                DOMConfigurator.Configure(new FileInfo("log.config"));

 

                                try {

                                                DirectoryInfo dirInfo = new DirectoryInfo(msgFolder);

                                                FileInfo[] files = dirInfo.GetFiles();

                                                Hashtable emails = new Hashtable();

                                                               

                                                foreach (FileInfo fileInfo in files) {

                                                                log.Debug("Analizing file: " + fileInfo.Name);

 

                                                                Guid activityId = GetActivityIdByFileName(fileInfo.Name);

 

                                                                if (! activityId.ToString().Equals(new Guid().ToString())) {

                                                                                emails.Add(activityId, fileInfo.DirectoryName + @"\" + fileInfo.Name);

 

                                                                                Console.WriteLine("Marked for import: " + fileInfo.Name);

                                                                                log.Debug("Marked for import: " + fileInfo.Name);

                                                                }

                                                                else {

                                                                                Console.WriteLine("Not found in activity import list: " + fileInfo.Name);

                                                                                log.Debug("Not found in activity import list: " + fileInfo.Name);

                                                                }

                                                }

 

                                                ProcessMessages(emails);

                                }

                                catch (Exception e) {

                                                Console.WriteLine(e.Message + "\r\n" + e.StackTrace);

                                }

                }

 

Центральным местом в данном методе является проверка на существование соответствия в таблице импорта CRM Activity GUID и имени файлов в каталоге импорта:

                private Guid GetActivityIdByFileName(string fileName) {

                                //create the database connection

                                OleDbConnection conn = new OleDbConnection(connectionString);

 

                                conn.Open();

 

                                //create the command object and store the sql query

                                OleDbCommand command = conn.CreateCommand();

 

                                command.CommandText = "SELECT " + activityGuidColumn + ", " + msgFileNameColumn + " FROM " + tableName + " WHERE UPPER(LTRIM(RTRIM(" + msgFileNameColumn + "))) = UPPER(LTRIM(RTRIM(?)))";

 

                                log.Debug("Preview checking SQL query: " + command.CommandText);

                                log.Debug("Using file name: " + fileName);

               

                                command.Parameters.Add(new OleDbParameter(msgFileNameColumn, fileName));

 

                                //create the datareader object to connect to table

                                OleDbDataReader reader = command.ExecuteReader();

 

                                if (reader.Read()) {

                                                Guid activityGuid = new Guid(reader.GetString(0));

 

                                                reader.Close();

                                                conn.Close();

 

                                                return activityGuid;

                                }

                                else {

                                                reader.Close();

                                                conn.Close();

 

                                                return new Guid();

                                }

                }

 

Построенный хеш сообщений, подлежащих импорту, передается как параметр методу, исполняющему непосредственный импорт вложений в MS CRM:

                private void ProcessMessages(Hashtable emails)

                {

                                try

                                {

                                                log.Debug("Start importing process");

 

                                                CRMConnector crmConnector = new CRMConnector();

 

// Connect to CRM DB

crmConnector.SetCrmConfigPath(Environment.SystemDirectory + "/Albaspectrum/MSCRMGateway.xml");

crmConnector.SetCrmContentType(Environment.SystemDirectory + "/Albaspectrum/ContentType.txt");

crmConnector.Connect(log);

 

                                                if (emails != null) {

                                                                ICollection keys = emails.Keys;

                                                                int attCounter = 0;

           

                                                foreach (Guid o in keys) {

                                                                                string attName = (string)(emails[o]);

 

crmConnector.AddAttachmentToActivity(o, attName, (new FileInfo(attName)).Length, attCounter);

                               

                                                                                attCounter++;

                                                                }

                                                }

 

                                                crmConnector.Close();

                                }

                                catch (Exception ex)

                                {

                                                log.Debug(ex.Message + "\n" + ex.StackTrace);

                                }

                }

 

Все необходимые классы работы с MS CRM Activity собраны в библиотеке MSCRMGateway и описаны в статьях:

 

Желаем вам удачи в процессе настройки Microsoft CRM! Если вам нужна помощь наших специалистов -  мы всегда готовы вам помочь.  Позвоните нам в Москве (095) 918-3314, (095) 918-3111 , в США: 1-866-528-0577 или пишите: help@albaspectrum.com

 

Игорь Кудряшов – ведущий разработчик в Ronix Systems

( http://www.ronix.ru ), европейском подразделении Alba Spectrum Technologies ( http://www.albaspectrum.com ), компании – партнере Microsoft Business Solutions, обслуживающей клиентов по  Российской Федерации, включая города Москва, Санкт-Петербург, Екатеринбург, Казань, Новосибирск и др.