Как получить идентификатор пользователя, который запустил отчет?

при выполнении отчета в 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.

  1. зарегистрируйте параметр UserID со значением по умолчанию

    =пользователь!Имя пользователя

  2. использовать следующий запрос в наборе данных

    выберите DomainName, FullName

    от SystemUserBase

    WHERE (DomainName = @UserID)

  3. затем использовать

    =поля!Полное имя.Значение

в своем докладе.

в 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 ?