Отчеты
13
Апр
6

Выгрузка/загрузка файлов из CRM

Выгрузка приаттаченых в CRM файлов в расшаренную папку с помощью плагина

Следующий пример показывает, как программно выгрузить в какую-либо общую папку прикрепленные в CRM файлы. А в качестве объекта, к которому цепляются файлы, рассмотрим примечания (также их можно прикреплять к электропочте и литературе).

  • Создайте плагин, добавьте в него ссылки на сборки из SDK и подпишите;
  • В код поместите следующий фрагмент:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.Sdk.Query;
    using Microsoft.Crm.SdkTypeProxy;
    using System.Net;
    using System.IO;
    
    namespace ClassLibrary7
    {
        public class Class1 : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                try
                {
                    // Конфигурируем CrmService
                    CrmAuthenticationToken myToken = new CrmAuthenticationToken();
                    myToken.OrganizationName = "superfirma";
                    myToken.AuthenticationType = 0;
                    CrmService service = new CrmService();
                    // Передаем учетные данные админа
                    service.Credentials = new NetworkCredential("Administrator", "1qaz@WSX", "d2008");
                    service.Url = "http://win-n22hj23d1b1/MSCrmServices/2007/CrmService.asmx";
                    service.CrmAuthenticationTokenValue = myToken;
    
                    // Запрашиваем примечание содержащее вложенный файл
                    Guid annotationId = new Guid("{db1d584f-5743-df11-8ba8-000c29f6b309}");
    
                    // Возвращаем имя файла и его содержимое
                    ColumnSet cols = new ColumnSet();
                    cols.Attributes.Add("filename");
                    cols.Attributes.Add("documentbody");
    
                    // Отправляем запрос в CrmService
                    annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols);
    
                    // Конвертируем содержимое файла из кодировки Base64 в byte'ы
                    byte[] fileBuffer = Convert.FromBase64String(annotationAttachment.documentbody);
    
                    // Загружаем содержимое приаттаченого файла в файл в папке temp
                    using (FileStream fileStream = new FileStream("C:\\inetpub\\wwwroot\\ISV\\temp\\" + annotationAttachment.filename, FileMode.OpenOrCreate))
                    {
                        byte[] fileContent = new UTF8Encoding(true).GetBytes(annotationAttachment.documentbody);
                        fileStream.Write(fileContent, 0, fileContent.Length);
                    }
    
                    // Выводим сообщение об успешной выгрузке файла
                    throw new InvalidPluginExecutionException("Файл C:\\inetpub\\wwwroot\\ISV\\temp\\" + annotationAttachment.filename + " успешно создан.");
                }
                catch (System.Web.Services.Protocols.SoapException spx)
                {
                    throw new InvalidPluginExecutionException(spx.Detail.InnerText);
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException(ex.ToString());
                }
            }
        }
    }
    

    разбор полетов:

    • Для начала мы как всегда подключаемся к CRM Services;
    • Затем запрашиваем имя файла и его содержимое по GUID’у Примечания, в качестве которого он загружен в CRM;
    • Возвращенное содержимое мы перекодируем из Base64 в байты…
    • … которые затем записываем в файл (с именем, которое мы вернули из CRM) в общедоступную папку.
  • Зарегистрируйте плагин в CRM и вызовите событие на которое он зарегистрирован.



Загрузка приаттаченых в CRM файлов из отчетов

Итак, представим себе ситуацию: Вы выводите в отчете имена приаттаченых файлов и хотите, чтобы при клике на них выводолось окно предлагающее их скачать! Реализуем…

Весь подход заключается в создании ASPX-странички, которая будет принимать GUID Примечания, содержащего вложенный файл и возвращаеть его в виде файла. А в отчете мы поместим ссылку на эту ASPX-страничку с «зашитом» в URL GUID’е. Начнем:

  • Создайте ASPX-страницу с таким кодом:
    using System;
    using System.Configuration;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.Sdk.Query;
    using Microsoft.Crm.SdkTypeProxy;
    using System.Net;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Web.Services.Protocols;
    using Microsoft.Win32;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                // Выполняем код под юзвером открывашем страницу
                using (new CrmImpersonator())
                {
                    // Проверяем что через URL передан параметр guid, иначе прекращаем выполнение
                    if (Request.QueryString["guid"] == null) return;
    
                    // Настраиваем CRM Service
                    CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, "superfirma");
                    CrmService service = new CrmService();
                    service.CrmAuthenticationTokenValue = token;
                    service.UseDefaultCredentials = true;
                    // Вытаскиваем имя СRM сервера из регистра Windows
                    service.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx";
                    // Кэшируем credentials, чтобы каждый запрос не проходил повторно аутентификацию
                    service.PreAuthenticate = true;
    
                    // Запрашиваем примечание с GUID'ом переданным через URL
                    Guid annotationId = new Guid(Request.QueryString["guid"]);
    
                    // Нам нужны следующие колонки: имя файла, содержимое файло и его тип
                    ColumnSet cols1 = new ColumnSet();
                    cols1.Attributes.Add("filename");
                    cols1.Attributes.Add("documentbody");
                    cols1.Attributes.Add("mimetype");
    
                    // Отправляем запрос в CRM Service
                    annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1);
    
                    // Перекодируем содержимое файла хранящееся в БД CRM из кодировки Base64 в byte...
                    byte[] fileContent = Convert.FromBase64String(annotationAttachment.documentbody);
                    // ... а из byte в string
                    string s = System.Text.Encoding.Default.GetString(fileContent);
                    // Обнуляем изначальный ответ и возвращяем ответ в виде файла
                    Response.ClearContent();
                    Response.AddHeader("content-disposition", "attachment; filename=" + annotationAttachment.filename);
                    Response.ContentType = annotationAttachment.mimetype;
                    Response.BinaryWrite(fileContent);
                    Response.End();
                }
            }
            catch (SoapException sexc)
            {
                throw new Exception(sexc.Detail.InnerText);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
    
        }
    }
    
  • Откройте файл web.config и внесите в него такие изменения:
    <?xml version="1.0"?>
    <configuration>
      <appSettings/>
      <connectionStrings/>
      <system.web>
        <httpModules>
          <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </httpModules>
        <identity impersonate="true"/>
        <compilation debug="true">
          <assemblies>
            <add assembly="Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="Microsoft.Crm.SdkTypeProxy, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          </assemblies>
        </compilation>
      </system.web>
    </configuration>
    
  • Теперь необходимо ее опубликовать:
    • Создайте в папке ISV новую папку;
    • Скопируйте в нее файлы .aspx, .aspx.cs, web.config и папку bin (чтобы упростить себе задачу, можете воспользоваться встроенным в VS функционалом по публикации веб-сайтов: в основном меню выполните команду Build — Publish Web Site — в диалоговом окне укажите путь к созданной папке и жмите ОК). Теперь наше ASPX-приложение доступно по такому URL: http://<сервер_CRM>/ISV/<имя_созданной_папи>/<имя_файла>.aspx?guid=<GUID>



А для тестирования создадим простой отчет… хотя не очень обычным способом 🙂 для его создания мы воспользуемся Report Builder’ом – постовляемой вместе с Reporting Services’ом приложением для создания отчетов (неплохая альтернатива Visual Studio):

  • Откройте диспетчер отчетов Reporting Services по такой URL’е:
  • http://<сервер_отчетов>/Reports
  • Щелкните по кнопке Report Builder на главной странице – начнется загрузка, установка и запуск приложения Report Builder;


  • Внешне Report Builder не сильно отличается от Visual Studio (если не считать Ribbon-панели), так что принцип работы тот же:
    • Добавьте Датасорс на SQL сервер, который Вы используете под БД MS CRM;
    • Добавьте новый Датасет с таким кодом:
      select
      	filename,
      	CAST(annotationid AS NVARCHAR(36)) annotationid
      from
      	FilteredAnnotation
      where
      	filename  is not NULL
      
    • Добавьте в отчет таблицу и поместит в качестве ее содержимого поле filename;
    • Откройте свойства поля таблицы и назначьте переход по гиперссылке при щелчке. А в качестве выражения подставьте примерно такой код:
      ="http://win-n22hj23d1b1/isv/dl/Default.aspx?guid=" + Fields!annotationid.Value

      этот код формирует URL в соответствии с шаблоно который мы задали на этапе создания ASPX-странички (http://<сервер_CRM>/<имя_созданной_папи>/<имя_файла>.aspx?guid=<GUID>);

    • Добавьте визуального форматирования для текста в ячейки, чтобы она больше напомниала гипперссылку.






  • Сохраните отчет где-нибудь на диске. Ну, а затем создайте стандартный отчет в CRM 🙂


Комментарии (6)
  • Костя 13.04.2010

    Привет, интересная статья.
    Пользователи пользуются? Какие еще интересные решения есть, расширяющие функционал системы?

  • slivka_83 13.04.2010

    Привет 🙂
    У меня нет пользователей 🙂 я в консалтинге работаю 🙂

  • Костя 13.04.2010

    Понял.
    Какие еще интересные решения есть, расширяющие функционал системы?
    Просто на словах можешь описать функционал, самому интересно в чем есть потребность

  • slivka_83 13.04.2010

    Хм… ну, например часто приходится сталкиваться к треьованием реализовать уведомления по принципу Outlook’а 🙂

  • DsA 13.04.2010

    Очень полезная статья, хотелось бы еще узнать способ для CRM 2011.

  • slivka_83 13.04.2010

    Код от CRM 4.0 будет работать в 2011 если обратится к предыдущему сервису.

    А можно так:
    http://mmcrm.ru/?p=2423
    http://mmcrm.ru/?p=5425
    http://mmcrm.ru/?p=1699

*

code