Отчеты
24
Дек
25

Использование аттачей рисунков из MS CRM в кастомных отчетах

Продолжаем изучение отчетов 🙂 сегодня рассмотрим пример, как динамически добавлять рисунки в отчеты. И не просто рисунки, а аттачи рисунков, сделанные в MS CRM, которые мы будем брать напрямую из БД MS CRM! А чтобы задача не была уж совсем теоретической предположим, что мы хотим вывести в отчет всех наших Контактов с их фотографиями, которые прикреплены к карточке. Чтобы отличить фотографию от любого другого прикрепленного рисунка, мы будем хранить ее в формате JPEG и в ее названии будет содержаться слово photo (например, ivanov_photo.jpeg).

Начнем…

  • Сначала создайте в CRM несколько записей Контактов с заполненными полями ФИО, Должность и Телефон. Прикрепите к этим контактам рисунки в формате JPEG, в названии которых обязательно должно содержится слово photo;
  • Откройте Visual Studio 2008. File — New — Project;
  • В области Project Types выделите Business Intelligence Project, а в области Templates выберите Report Server Project Wizard. В нижней части окна задайте по своему усмотрению местоположение исходных файлов и имя для нового проекта. ОК;
  • Появится помощник создания отчетов. Первым делом нужно задать параметры подключения к базе данных:
    • Введите имя для нового источника данных и тип сервера, к которому будем подключаться (в нашем случае это Microsoft SQL Server);
    • Нажмите кнопку Edit. Появится окно свойств подключения: в списке Server Name выберите SQL сервер, на котором у Вас расположена БД CRM. Способом аутентификации оставьте значение по умолчанию: Windows Authentication. В списке баз данных выберите основную БД MS CRM системы – <название_организации>_MSCRM.

    ОК;

  • В следующем окне в поле Query String введите SQL запрос, который вернет нам нужные данные:
    select
    	fc.fullname as fio,
    	fc.telephone1 as phone,
    	fc.jobtitle as job,
    	(
    		select top 1 documentbody
    		from filteredannotation as fa
    		where
    			1=1
    			and fa.objectid = fc.contactid
    			and fa.mimetype = 'image/pjpeg'
    			and fa.filename like '%photo%'
    		order by fa.createdby
    	) as image
    from
    	filteredcontact as fc
    

    Запрос вытаскивает следующие данные: некоторые поля из всех записей Контактов, а также для каждого из этих Контактов выбирается один рисунок (хранится в поле documentbody таблицы AnnotationBase в кодировке Base64);

  • Т.к. отчет будет представлять собой простую табличку, где каждая строка будет соответствовать одной записи из MS CRM, то в качестве типа отчета выбираем Tabular, Next;
  • Опять же, т.к. это простая таблица – переносим все поля в область Details. Два раза Finish;




  • Помощник закроется и откроется основное окно Visual Studio на вкладке Layout (где отображаются и редактируются элементы отчета). Как и было обещано он будет представлять собой простую таблицу 🙂 Но есть одно НО! Мы пока не увидим рисунков (Вы можете убедится в этом перейдя на вкладку Preview). Надо это исправить 🙂 удалите содержимое ячейки Image и перетащите туда из Toolbox’а компонент Image. Сразу же отобразится диалоговое окно с настройками, в котором задайте следующие параметры:
    • В качестве источника (Select the Image Source) укажите Database;
    • В качестве данных для формирования рисунка (Use this field) укажите поле Image;
    • Форматом (Use this MIME type) задайте image/jpeg;
    • Перейдите к закладке Size и поставьте переключатель Fit to proportional – в результате чего, рисунок буде автоматически заполнять все доступное пространство (в данном случаи это пространство ячейки), но сохраняя при этом свои пропорции;
  • Затем расширьте размер ячейки с рисунком, чтобы хоть что-нибудь можно было разобрать 🙂
  • На этом все! Можете полюбоваться отчетов на вкладке Preview. Ну, а дальше как всегда: выгружаем rdl файл, создаем новый отчет в CRM и подсовываем ему существующий файл.




Комментарии (25)
  • a33ik 24.12.2009

    Всё понятно и просто. Один вопрос. Зачем нужен следующий кусок кода:

    where
    1=1
    and…

  • slivka_83 24.12.2009

    Это чисто визуальное оформление. Для того чтобы «and» писать в начале строки, а не в конце (так удобнее читать) 🙂

  • a33ik 24.12.2009

    Зачем условие 1=1??? Оно всегда выполняется.

  • slivka_83 24.12.2009

    Ну, смотрите… берем нормальные условия:

    where
    условие1 and
    какое_то_условие2 and
    суперусловие3

    В результате чего and прыгает. Поэтому читабельность падает. Чтобы исправить переносим and в начало. Но, так не заработает:
    where
    and условие1
    and какое_то_условие2
    and суперусловие3

    поэтому вводи 1=1 в начале 🙂

  • a33ik 24.12.2009

    А почему не так:

    where
    fa.objectid = fc.contactid
    and fa.mimetype = ‘image/pjpeg’
    and fa.filename like ‘%photo%’

    Вроде как читабельность идентичная

  • slivka_83 24.12.2009

    ну, читабельность может быть, но как то все равно не по фэн-шую (типа у первого условия нет отступа) 🙂 но это уже дело вкуса/привычки

  • Катя 24.12.2009

    Спасибо!

  • R3dRav3n 24.12.2009

    а не подскажете, как установить Business Intelligence Project в 2008 VS? а то при установке 2005-го SQL создается шаблон проекта в 2005 VS, а репорты от 2008-го SQL в црмку не загружаются.

  • slivka_83 24.12.2009

    Если CRM работает с 2005 SQL то для написания отчетов необходим 2005 VS, если с 2008 SQL — то 2008 VS. И только так!

  • R3dRav3n 24.12.2009

    Жаль… А то я уже голову сломал с 2005-м бороться.

  • Анатолий 24.12.2009

    Здравствуйте.
    У меня есть несколько фото которые обзываются определенным образом: foto1.jpg, foto2.jpg, foto3.jpg и т.д. отчет прекрасно расставляет все своим образом, на если вдруг юзверь прикрепил к записи два файла с одинаковым именем например foto2.jpg, отчет выдает ошибку набора данных. Это можно как то исправить вплание обхода этой ошибки, ведь юзвери то будут все равно всегда ошибаться.
    Спасибо.

  • slivka_83 24.12.2009

    Т.е. Вам необходимо отобрать только один рисунок?
    Если так то:

    select top 1
  • Анатолий 24.12.2009

    Не совсем. Рисунков к примеру три к каждого свое имя рис1 рис2 рис3 и каждый привязывается к определенному месту в отчете например рис1 сверху рис2 в середине а рис3 снизу, все это работало и расставлялось, пока отчет в один прекрасный момент не выдал ошибку «Не удалось считать следующую строку данных для набора данных DataSet1» а в логе написал «rForNewSession(‘/NDVUNIVERSAL_MSCRM/4.0/{F4EBF8F7-1961-DF11-9218-000C2973C826}’)
    processing!ReportServer_0-18!dbc!05/24/2010-08:02:45:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Не удалось считать следующую строку данных для набора данных DataSet1., ;
    Info: Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Не удалось считать следующую строку данных для набора данных DataSet1. —> System.Data.SqlClient.SqlException: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, , >= or when the subquery is used as an expression.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
    »

    соответственно я начал искать в чем дело и обнаружил что в одной из записей прекреплено рис1 рис2 рис2 и рис3 т.е. два с одинаковыми именами, судя по всему это будет и дальше продолжаться, соответственно нужно чтобы отчет игнорировал два рис2 и выбрал из них один без разницы какой, а все остальное было бы как и до ошибки.
    Спасибо.

  • slivka_83 24.12.2009

    Ваш SQL pзапрос тличается от моего?

  • Анатолий 24.12.2009

    Да собственно по аналогии с вашим
    сущность New_ZU запрос такой:

    SELECT new_name AS adress, new_new_vri_new_zu1name AS vriplan, new_new_vri_new_zuname AS vrifact, new_szu_bild AS Sstroeniya, new_szu AS szu,
    new_new_territor_new_zuname AS place, new_map_moscow AS mapmosc, new_map_sputnik AS mapsputnik, new_map_chema AS mapchema,
    (SELECT TOP (1) documentbody
    FROM FilteredAnnotation AS fa
    WHERE (1 = 1) AND (objectid = CRMAF_New_ZU.new_zuid) AND (mimetype = ‘image/pjpeg’) AND (filename LIKE ‘%foto1%’)
    ORDER BY createdby) AS foto1,
    (SELECT TOP (2) documentbody
    FROM FilteredAnnotation AS fa
    WHERE (1 = 1) AND (objectid = CRMAF_New_ZU.new_zuid) AND (mimetype = ‘image/pjpeg’) AND (filename LIKE ‘%foto2%’)
    ORDER BY createdby) AS foto2,
    (SELECT TOP (3) documentbody
    FROM FilteredAnnotation AS fa
    WHERE (1 = 1) AND (objectid = CRMAF_New_ZU.new_zuid) AND (mimetype = ‘image/pjpeg’) AND (filename LIKE ‘%foto3%’)
    ORDER BY createdby) AS foto3,
    (SELECT TOP (4) documentbody
    FROM FilteredAnnotation AS fa
    WHERE (1 = 1) AND (objectid = CRMAF_New_ZU.new_zuid) AND (mimetype = ‘image/pjpeg’) AND (filename LIKE ‘%skm%’)
    ORDER BY createdby) AS plan1
    FROM FilteredNew_ZU AS CRMAF_New_ZU

    Все работает на одной записи до сих пор, работало на таблице до какого то времени, после того как перестало работать на одной записи — полез посмотрел в записи два файла foto2.jpg, один удалил и все дальше стало работать. А на таблице не работает до сих пор видимо где то есть еще такая ошибка но записей около 7500 все не ппроверишь, а ошибку такую в будущем все равно допустят «если конечно это имнно эта ошибка

  • slivka_83 24.12.2009

    У Вас в каждом подзапросе происходит наращивание TOP’а 🙂 Зачем? Вам нужно каждый раз написать TOP 1 🙂 и он выберит по одному файлу каждого названия fotoX 🙂

  • дмитрий 24.12.2009

    Добрый день.
    а не подскажете, как в отчете задать по умолчанию отступы полей от края страницы при печати?
    по дефолту ставит 15 мм и из-за этого некоторые отчеты не влезают на страницу при печати, хотя при просмотре всё отлично…

  • slivka_83 24.12.2009

    Добрый день.

    Поля задаются в свойстве Margin (при редактировании его в Visual Studio).
    Также их можно каждый раз менять при распечатке.

  • дмитрий 24.12.2009

    Спасибо!
    Долго не мог решить проблему с этими полями )
    Каждый раз менять при распечатке очень муторно, а теперь всё по-умолчанию стоит. Ещё раз спасибо! )

  • Павел 24.12.2009

    Добрый день. Возникла проблема. Отчет создал в VS на клиентской машине из другого домена. Из самой VS отчет формируется (запрашивает логин и пароль для коннекта, использую авторизацию SQL). Теперь когда импортирую отчет в CRM то при запуске возникает ошибка «Не удалось установить соединение с источником данных «DataSet». В логах SQL выскакивает ошибка «Login failed for user ‘{GUID}'». Причина: не найдено имя входа, соотв. переданному имени». Почему так может происходить?

  • Павел 24.12.2009

    Скорее всего это происходит потому, что в файле отчета (Report.rdl) есть строка SQL т.е. ожидается проверка подлинности SQL. А нам требуется проверка подлинности windows. Подскажите, что должно быть в данной секции при использовании проверки подлинности windows.

  • slivka_83 24.12.2009

    Добрый день.
    Необходимо использовать виндовую аутентификацию. И нельзя использовать общий источник подключения. Т.е. в каждом отчете должна быть своя виндовая строка подключения. При загрузке такого отчета в CRM, его строка подключения будет подменятся другой — CRM’ной.

    Пример корректного подключения можно посмотреть тут: http://mmcrm.ru/?p=294

  • Павел 24.12.2009

    Использую аутентификацию Windows. Из студии отчет формируется корректно. После импорта в CRM, при выполнении запрос возвращает пустой результат. Права на чтение таблиц есть, на SQL Server запрос используемый в отчете отрабатывает правильно. В чем может быть проблема?

  • slivka_83 24.12.2009

    В том что нельзя использовать в запросах для CRM таблицы (table) — только фильтрованные вьюхи (filtered…). У пользователей нет прав на чтение таблиц.

  • Павел 24.12.2009

    Оставил в запросе одно Filtered представление. Выгружаю одно поле простым запросом (SELECT Поле FROM Представление). В студии отчет заполняется, а выполняя отчет из CRM ни одной строки не выгружается, только заголовки. Пробовал формировать отчет и с учетки админа, и простого пользователя — результат один.

*

code