Как получить идентификатор пользователя, который запустил отчет?
при выполнении отчета в MSCRM 2011 у вас есть два варианта источников данных: SQL или Fetch.
в журналах выполнения SSRS пользователь, запустивший отчет, всегда является учетной записью службы.
при использовании fetch в журнале выполнения отчета имеется параметр CRM_FullName, содержащий полное имя пользователя, запустившего отчет.
при использовании источника SQL параметр CRM_FullName отсутствует. Откуда мне знать, кто вел отчет? Должно быть способ узнать, так как фильтрованные представления знают, кто я.
3 ответов
на самом деле нет способа найти эту информацию. При создании отчета для MSCRM используется соединитель с именем "соединитель данных MSCRM". Это можно увидеть в столбце AdditionnalInfo представления ExecutionLogs3 экземпляра службы SSRS. При использовании этого соединителя и попытке показать отчет вам будет предложено ввести имя пользователя и пароль. Вот где все становится интересным.
отчет фактически не ожидает имя пользователя / пароль! На самом деле, он ожидает получить systemuserid (guid) в качестве имени пользователя и organizationid (guid) в качестве пароля. Затем он выполняет поиск параметров базы данных организации в базе данных MSCRM_CONFIG. Затем он переходит в базу данных организации и просто делает set context_info SYSTEMUSERID
. Наконец, filteredviews вызывают функцию с именем ' [dbo].[fn_FindUserGuid]', который возвращает нужное значение. Именно так работают отфильтрованные представления при подключении в качестве учетной записи службы.
Как вы могли ожидать, мы не можем знать пользователь, который запустил отчет, потому что приглашения имени пользователя и пароля в SSRS никогда не регистрируются нигде (для вопросов безопасности, возможно).
лучший вариант, который я нашел для регистрации, кто запустил отчет, - это фактически создать хранимую процедуру, которая сделает оператор select на отфильтрованных представлениях (или любых таблицах, как есть), а затем войти в отдельную таблицу оператор, параметры процедуры и context_info(). Затем в SSRS я вызываю эту функцию вместо перехода к фильтрованные представления напрямую.
ответ отредактирован, чтобы включить получение полного имени пользователя, если используется источник sql.
-
зарегистрируйте параметр UserID со значением по умолчанию
=пользователь!Имя пользователя
-
использовать следующий запрос в наборе данных
выберите DomainName, FullName
от SystemUserBase
WHERE (DomainName = @UserID)
-
затем использовать
=поля!Полное имя.Значение
в своем докладе.
в CRM пользовательские данные хранятся в таблице SystemUserBase, а столбец DomainName является фактическим Домен\Имя Пользователя хранится в пользователе!Идентификатор отчета. Если вы предпочитаете использовать представления, используйте FilteredSystemUser вместо SystemUserBase таблица.
для fetchxml попробуйте следующее: Оператор operator= 'eq-userid' означает равный текущему пользователю.
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
<entity name='team'>
<attribute name='name' />
<attribute name='businessunitid' />
<attribute name='teamid' />
<order attribute='name' descending='false' />
<link-entity name='teammembership' from='teamid' to='teamid' visible='false' intersect='true'>
<link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='user'>
<attribute name='fullname' />
<attribute name='systemuserid'/>
<filter type='and'>
<condition attribute='systemuserid' operator='eq-userid' />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>
затем в отчете вы можете использовать следующий код в выражении, чтобы получить полное имя пользователя
=Первый(Поля!user_fullname.Значение, "GetUserData")
где набор данных называется GetUserData
будет ли достаточно имени пользователя? т. е. вы можете просто использовать что-то вроде
="Generated by " & User!UserID
?