Использование аттачей рисунков из 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 и подсовываем ему существующий файл.
Всё понятно и просто. Один вопрос. Зачем нужен следующий кусок кода:
where
1=1
and…
Это чисто визуальное оформление. Для того чтобы «and» писать в начале строки, а не в конце (так удобнее читать) 🙂
Зачем условие 1=1??? Оно всегда выполняется.
Ну, смотрите… берем нормальные условия:
where
условие1 and
какое_то_условие2 and
суперусловие3
В результате чего and прыгает. Поэтому читабельность падает. Чтобы исправить переносим and в начало. Но, так не заработает:
where
and условие1
and какое_то_условие2
and суперусловие3
поэтому вводи 1=1 в начале 🙂
А почему не так:
where
fa.objectid = fc.contactid
and fa.mimetype = ‘image/pjpeg’
and fa.filename like ‘%photo%’
Вроде как читабельность идентичная
ну, читабельность может быть, но как то все равно не по фэн-шую (типа у первого условия нет отступа) 🙂 но это уже дело вкуса/привычки
Спасибо!
а не подскажете, как установить Business Intelligence Project в 2008 VS? а то при установке 2005-го SQL создается шаблон проекта в 2005 VS, а репорты от 2008-го SQL в црмку не загружаются.
Если CRM работает с 2005 SQL то для написания отчетов необходим 2005 VS, если с 2008 SQL — то 2008 VS. И только так!
Жаль… А то я уже голову сломал с 2005-м бороться.
Здравствуйте.
У меня есть несколько фото которые обзываются определенным образом: foto1.jpg, foto2.jpg, foto3.jpg и т.д. отчет прекрасно расставляет все своим образом, на если вдруг юзверь прикрепил к записи два файла с одинаковым именем например foto2.jpg, отчет выдает ошибку набора данных. Это можно как то исправить вплание обхода этой ошибки, ведь юзвери то будут все равно всегда ошибаться.
Спасибо.
Т.е. Вам необходимо отобрать только один рисунок?
Если так то:
Не совсем. Рисунков к примеру три к каждого свое имя рис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 и выбрал из них один без разницы какой, а все остальное было бы как и до ошибки.
Спасибо.
Ваш SQL pзапрос тличается от моего?
Да собственно по аналогии с вашим
сущность 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 все не ппроверишь, а ошибку такую в будущем все равно допустят «если конечно это имнно эта ошибка
У Вас в каждом подзапросе происходит наращивание TOP’а 🙂 Зачем? Вам нужно каждый раз написать TOP 1 🙂 и он выберит по одному файлу каждого названия fotoX 🙂
Добрый день.
а не подскажете, как в отчете задать по умолчанию отступы полей от края страницы при печати?
по дефолту ставит 15 мм и из-за этого некоторые отчеты не влезают на страницу при печати, хотя при просмотре всё отлично…
Добрый день.
Поля задаются в свойстве Margin (при редактировании его в Visual Studio).
Также их можно каждый раз менять при распечатке.
Спасибо!
Долго не мог решить проблему с этими полями )
Каждый раз менять при распечатке очень муторно, а теперь всё по-умолчанию стоит. Ещё раз спасибо! )
Добрый день. Возникла проблема. Отчет создал в VS на клиентской машине из другого домена. Из самой VS отчет формируется (запрашивает логин и пароль для коннекта, использую авторизацию SQL). Теперь когда импортирую отчет в CRM то при запуске возникает ошибка «Не удалось установить соединение с источником данных «DataSet». В логах SQL выскакивает ошибка «Login failed for user ‘{GUID}'». Причина: не найдено имя входа, соотв. переданному имени». Почему так может происходить?
Скорее всего это происходит потому, что в файле отчета (Report.rdl) есть строка SQL т.е. ожидается проверка подлинности SQL. А нам требуется проверка подлинности windows. Подскажите, что должно быть в данной секции при использовании проверки подлинности windows.
Добрый день.
Необходимо использовать виндовую аутентификацию. И нельзя использовать общий источник подключения. Т.е. в каждом отчете должна быть своя виндовая строка подключения. При загрузке такого отчета в CRM, его строка подключения будет подменятся другой — CRM’ной.
Пример корректного подключения можно посмотреть тут: http://mmcrm.ru/?p=294
Использую аутентификацию Windows. Из студии отчет формируется корректно. После импорта в CRM, при выполнении запрос возвращает пустой результат. Права на чтение таблиц есть, на SQL Server запрос используемый в отчете отрабатывает правильно. В чем может быть проблема?
В том что нельзя использовать в запросах для CRM таблицы (table) — только фильтрованные вьюхи (filtered…). У пользователей нет прав на чтение таблиц.
Оставил в запросе одно Filtered представление. Выгружаю одно поле простым запросом (SELECT Поле FROM Представление). В студии отчет заполняется, а выполняя отчет из CRM ни одной строки не выгружается, только заголовки. Пробовал формировать отчет и с учетки админа, и простого пользователя — результат один.