AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2010, 12:11   #1  
Prophetic is offline
Prophetic
Участник
 
113 / 15 (1) ++
Регистрация: 08.12.2009
Что делает RLS с связанными запросами в отчете
Доброго времени суток всем.

Столкнулся с проблемой RLS. Имеется простой отчет, в ds у которого указан query по таблице CustTable. По этой таблице есть ограничения по RLS.
В initQuery записано:

X++:
   qbds.addRange(fieldnum(CustInvoiceTable, RecId)).value(queryValue(_recId));
Соответственно получается следующее:
до применения RLS было вот так:

Код:
SELECT * FROM CustInvoiceTable WHERE ((RecId = 5637168581)) JOIN * FROM CustInvoiceLine WHERE CustInvoiceTable.RecId = CustInvoiceLine.ParentRecId
После применения RLS:
Код:
SELECT * FROM CustInvoiceTable WHERE ((((5637168581) ......
RecId пропадает, и в отчёт попадают все записи. Подскажите, пожалуйста, где копать.

DAX 4.0
Старый 09.02.2010, 14:46   #2  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
621 / 453 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
Че-то не очень ясно пока, где что.
РЛС на КастТабле?
Из нее строится подзапрос через отдельную кверю?

РЛС работает как фильтр записей, их как будто нет в таблице, на другую логику не влияет.
То есть, если в КастТабл 10 записей, а после РЛС 2, то отработает по двум

Нужно видеть, код, и к чему применен метод использования РЛС
(для квери он по умолчанию вкл, для селекта выкл - есть методы вкл/выкл)
Старый 09.02.2010, 17:11   #3  
Prophetic is offline
Prophetic
Участник
 
113 / 15 (1) ++
Регистрация: 08.12.2009
Цитата:
Сообщение от BOAL Посмотреть сообщение
Че-то не очень ясно пока, где что.
РЛС на КастТабле?
Да.

Цитата:
Из нее строится подзапрос через отдельную кверю?
Нет (или я логики не понял). Попробую ещё раз пояснить. Есть отчет, который печатает счет, данные берутся из журнала "Накладная с произвольным текстом", в котором в качестве Query указана упомянутая таблица. Дальше конечно же идет связь с CustInvoiceLine, но это это сейчас не важно.
Главное, что при инициализации отчета на CustTable накладывается Range программным путём. RecId для значения берется из аргументов отчета:
X++:
qbds = this.query().datasourceTable(TableNum(CustInvoiceTable));
qbds.addRange(fieldnum(CustInvoiceTable, RecId)).value(queryValue(_recId));
Далее работает стандартный набор методов отчета.


Цитата:
РЛС работает как фильтр записей, их как будто нет в таблице, на другую логику не влияет.
То есть, если в КастТабл 10 записей, а после РЛС 2, то отработает по двум
В том и дело, что у меня отбирается одна запись для извлечения информации из нее, она не должна попадать под действие RLS.

Цитата:
Нужно видеть, код, и к чему применен метод использования РЛС
Только наложение Range. Другого кода я не нашел.

Цитата:
(для квери он по умолчанию вкл, для селекта выкл - есть методы вкл/выкл)
Методы для вкл/выкл не вызываются.

Где покопать?

Последний раз редактировалось Prophetic; 09.02.2010 в 17:19.
Старый 09.02.2010, 18:49   #4  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
621 / 453 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть)
Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс?

Куда копать - вырубить рлс, проверить, что без него все ок
Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт
За это сообщение автора поблагодарили: Prophetic (1).
Старый 11.02.2010, 14:16   #5  
Prophetic is offline
Prophetic
Участник
 
113 / 15 (1) ++
Регистрация: 08.12.2009
Цитата:
Сообщение от BOAL Посмотреть сообщение
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть)
Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс?

Куда копать - вырубить рлс, проверить, что без него все ок
Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт
Наверное, нужно уточнить, что отчет не стандартный, по-сути, печатная форма документа, в шапку которого попадает информация из выделенной строки в журнале CustInvoiceTrans (соответственно, в отчет передается recId), и табличной части (приходит по join, но это нас сейчас не волнует).
Если RLS не включено, то все работает.

Вот как выглядит запрос после применения RLS (я еще добавил пустой Range в Query запроса, а в методе init добавляется значение этого Range):
X++:
SELECT * FROM CustInvoiceTable WHERE (((CustInvoiceTable.JuridicalPersonId!="XXXXXXXX") && (CustInvoiceTable.JuridicalPersonId!="XXXXXXXX")) OR 
(RecId = 5637147356)) JOIN * FROM CustInvoiceLine WHERE 
CustInvoiceTable.RecId = CustInvoiceLine.ParentRecId
На чит похоже? Или так и должно быть?
Старый 12.02.2010, 09:46   #6  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
621 / 453 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
нет у меня общего понимания все равно.
нет исходного кода, который генерит этот запрос в итоге, нет запроса самого РЛС, чтоб понять, чему и как он мешает.
Я обычно проверяю не просмотром запроса в переводе для сиквела, а просмотром самой Квери (в виде дерева запроса).
Старый 12.02.2010, 10:43   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,324 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Итак, по пунктам.
1. Берем чела, у которого нет в правах рлса (Admin). Он смотрит отчет - у него должно все быть как надо (проверка на то, что нет проблем в самом отчете)
2. Берем чела, которого есть RLS и у которого есть проблемы в отчете. Смотрим запрос в RLS и запрос в отчете. Исходя из правила:

- 2 Range, наложенных на одно и тоже поле дают условие по ИЛИ
- 2 Range, наложенных на разные поля дают условие по И

в результирующем запросе, который будет отправлен в БД - делаем выводы - что у нас наложилось.
3. В вашем случае смотрим RLS на таблицу CustInvoiceTable по полям JuridicalPersonId и RecId. Если RLS по какому-то из этих полей наложен, то в результате у Вас выполнится условие ИЛИ - по значению из RLS и по значению из кода
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Prophetic (1).
Старый 12.02.2010, 10:56   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Prophetic Посмотреть сообщение
Вот как выглядит запрос после применения RLS...
я так понимаю не устраивает вас то, что к условиям RLS на JuridicalPersonId ваше условие на RecId добавилось через OR. По логики, нужно бы через AND. Так?

1) Почему это произошло? По всей видимости для реализации RLS, система использует расширенный синтаксис задания range, причём добаляет это условие в range по RecId. Т.е когда вы добавляете своё собственно условие на RecId, в нём уже сидит условие от RLS. Но дело в том, что если последовательно добавлять range на одно и тоже поле, то условия будут добавляться через ИЛИ. Так устроен range.

2) Что делать? Можно попробовать следующее:
Вариант №1. Для позиционирования на нужной записи использовать какой-нибудь другой ключ, не RecId.
Вариант №2. Для добавления своего условия по RecId использовать расширенный синтаксис, но добавлять это условие не на RecId, а на какое-нибудь другое поле.
Вариант №3. Для добавления своего условия по RecId не добавлять новый range, а изменить существующий. Те вместо addRange использовать findRange.

P.S.: Опередили
За это сообщение автора поблагодарили: Prophetic (1).
Старый 12.02.2010, 13:35   #9  
Prophetic is offline
Prophetic
Участник
 
113 / 15 (1) ++
Регистрация: 08.12.2009
С этим вопросом практически всё понятно.
Благодарю всех за ответы.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Gustav: Unsorted, или Записки DAX-дилетанта - II Gustav DAX Blogs 39 20.05.2009 15:34
Особенности настройки RLS на склад DreamCreator DAX: Администрирование 0 19.02.2009 17:59
Динамические контролы в отчете основанные на display-методе petr DAX: Программирование 19 18.09.2006 15:29
Проблема с RLS и SecurityKey. oip DAX: Программирование 3 22.12.2005 17:26
dialog в отчёте gaenar DAX: Программирование 6 14.04.2005 11:15
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:40.