Добрый день!
Есть отчет, который показывает количество проданных квартир поэтажно за период. Под админом все работает как надо, все поля заполняются. Но если зайти под другим пользователем, то при построении отчета поле "Этаж" пустое, хотя остальные заполняются.
В разделе "Администрирование" в "Правах доступа к группам таблиц" стоят все галки напротив нужной таблицы. В "Правах доступа к полям" напротив поля "Этаж" стоит полный доступ. В "Правах доступа по умолчанию" тоже полный доступ. Сама таблица администрируется по записям и по полям. Для всех записей полный доступ тоже стоит.
В чем может быть проблема?
Нравится
А как в SQ формируется само поле Этаж, это случаем не CustomSQLColumn? Если это так, то под админом запрос формирует выборку напрямую с таблицы tbl_, а под пользователем через представление базы данных (vw_) которое учитывает права.
Также проверьте видит ли пользователь само поле Этаж, в той таблице, где оно задается, возможно у него нет прав на чтение этого поля?
В SQ поле формируется стандартным способом. Само поле Этаж пользователи видят.
Зайдите под логином пользователя в SQL Managment Studio и сделайте Select * from vw_Название таблицы, и посмотрите, отображается ли поле в выборке.
Как альтернативный вариант поиска проблемы, словите запрос который идет в БД в момент формирования отчета под администратором и под пользователем, делается это так (см. видео про SQL Profiler). Скопируйте этот запрос под пользователем и запустите в SQL Managment Studio, это натолкнет на мысли. Если сами не справитесь, кидайте сюда запросы.
В vw таблицы поле отображается. Проверил профайлером запросы к бд, под админом просто SELECT, а под пользователем до него еще прописывается это:
exec [dbo].[tsp_ColumnsRightsEx] @objname = 'vw_House' exec [dbo].[tsp_ColumnsRightsEx] @objname = 'vw_Flats'
Что это означает?
Скорее всего вы поле "Этаж" добавляли через клиент Террасофта, с помощью "Пользовательских полей", от этого и такие махинации.
tsp_ColumnsRightsEx - хранимая процедура, которая определяет дать на чтение поля в таблице или ент ее код :
ALTER procedure [dbo].[tsp_ColumnsRightsEx] ( @objname nvarchar(776) ) as begin set nocount on if (object_id('tempdb..#resultEx') is not null) drop table [#resultEx] create table #resultEx( FieldName nvarchar(128), RightsLevel int ) declare @AdminUnitName sysname DECLARE Admin_Cursor CURSOR FOR SELECT AdminUnitName FROM tbl_UserAdminUnit WHERE UserName = SYSTEM_USER OPEN Admin_Cursor FETCH NEXT FROM Admin_Cursor into @AdminUnitName WHILE @@FETCH_STATUS = 0 BEGIN insert into #resultEx exec [tsp_ColumnsRights] @objname, @AdminUnitName, 1 FETCH NEXT FROM Admin_Cursor into @AdminUnitName END CLOSE Admin_Cursor DEALLOCATE Admin_Cursor select FieldName, min(RightsLevel) as RightsLevel from #resultEx group by FieldName -- 0 -- deny -- 1 -- read -- 2 -- full end
Попробуйте в разделе Администрирование, дать Полный доступ на эти поля, и кстати вы проверяли это под несколькими пользователями не администраторами?
А что можно увидеть в этой процедуре?
На Администрировании полный доступ стоит. Проверял под несколькими пользователями, под всеми не выводится, кроме админа. А может быть поле пользовательским, если его нет в Настройках -> Пользовательские поля? И это поле везде нормально отображается под всеми пользователями, и в конфигураторе все прописано по стандарту, думаю это не пользовательское поле. В чем еще может быть проблема?
Добрый день!
Очень интересно посмотреть, как повел бы себя отчет при снятии признака с таблицы "Администрируется по полям" :smile:
Дмитрий, какой результат профайлинга под пользователем при запуске отчета?
Отключил администрирование по полям, под пользователем поле все равно не выводится, вот отчет профайлера.
Под всеми пользователями (в т.ч. и админом):
SELECT [tbl_House].[Name] AS [HouseNumber], [tbl_Flats].[CountOfRoomsID] AS [CountOfRoomsID], COUNT(CAST([tbl_Flats].[ID] AS VARCHAR(38))) AS [ID], SUM([tbl_Opportunity].[Amount]) AS [Amount], [tbl_Flats].[Floor] AS [Floor], [tbl_Opportunity].[ID] AS [OpportunityID], [tbl_CountOfRooms].[Name] AS [NumOfRooms] FROM [dbo].[vw_House] AS [tbl_House] LEFT OUTER JOIN [dbo].[vw_Flats] AS [tbl_Flats] ON [tbl_Flats].[HouseID] = [tbl_House].[ID] LEFT OUTER JOIN [dbo].[vw_Opportunity] AS [tbl_Opportunity] ON [tbl_Opportunity].[FlatsID] = [tbl_Flats].[ID] LEFT OUTER JOIN [dbo].[tbl_CountOfRooms] AS [tbl_CountOfRooms] ON [tbl_CountOfRooms].[ID] = [tbl_Flats].[CountOfRoomsID] WHERE(NOT [tbl_Flats].[Floor] IS NULL AND [tbl_Flats].[ModifiedOn] >= '12.07.2012' AND [tbl_Flats].[ModifiedOn] < '25.09.2012') GROUP BY [tbl_House].[Name], [tbl_Flats].[CountOfRoomsID], [tbl_Flats].[Floor], [tbl_Opportunity].[ID], [tbl_CountOfRooms].[Name]
Получается запросы к базе одинаковы под всеми пользователями, но поле все равно не отображается.
Дмитрий, а какой результат выполнения запроса под администратором и пользователем прямо на уровне базы?
Если под пользователем в поле будет NULL, то у пользователя нем прав на записи, которые задействованы в выводе значения в поле.
Я установил, что проблема в отчете. Создал простой отчет из одного поля, и все вывелось. Но не могу выяснить в чем проблема моего отчета. Из-за чего такое может происходить? Сервисы прилагаю.
Дмитрий, протестировать Ваш отчет весьма проблематично при отсутствии всех сервисов, на которые ссылается отчет.
Сказать, в какую сторону следует искать причину, весьма сложно. Предоставьте обезличенную копию базы в поддержку, мы посмотрим, в чем проблема.
К сожалению предоставить копию базы в ближайшее время не представляется возможным. Может быть, посмотрите посредством удаленного подключения?
Дмитрий, дело в том, что компонент FastReport является сторонним продуктом, функционал которого используется для построения отчетов в Terrasoft. С ходу на подключении, боюсь, будет сложно определить, что может привести к такой ситуации.
Поэтому вижу два варианта решения:
1. Доставить при возможности копию базы
2. Создать этот же отчет с нуля по аналогии. То есть, Вы уже точно знаете, что вывод только данного поля к проблеме не приводит. Поэтому пошагово добавьте вывод остальных элементом отчета, попутно проверяя, как он будет выводится под пользователями системы.
Все вопрос закрыт, сделал методом топора)
Создал новое аналогичное поле и скопировал туда значения