|
09.02.2010, 17:11 | #1 |
Участник
|
Да.
Цитата:
Из нее строится подзапрос через отдельную кверю?
Главное, что при инициализации отчета на CustTable накладывается Range программным путём. RecId для значения берется из аргументов отчета: X++: qbds = this.query().datasourceTable(TableNum(CustInvoiceTable)); qbds.addRange(fieldnum(CustInvoiceTable, RecId)).value(queryValue(_recId)); Цитата:
РЛС работает как фильтр записей, их как будто нет в таблице, на другую логику не влияет.
То есть, если в КастТабл 10 записей, а после РЛС 2, то отработает по двум Цитата:
Нужно видеть, код, и к чему применен метод использования РЛС
Цитата:
(для квери он по умолчанию вкл, для селекта выкл - есть методы вкл/выкл)
Где покопать? Последний раз редактировалось Prophetic; 09.02.2010 в 17:19. |
|
09.02.2010, 18:49 | #2 |
Участник
|
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть) Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс? Куда копать - вырубить рлс, проверить, что без него все ок Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
11.02.2010, 14:16 | #3 |
Участник
|
Цитата:
Сообщение от BOAL
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть) Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс? Куда копать - вырубить рлс, проверить, что без него все ок Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт Если 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 | #4 |
Участник
|
нет у меня общего понимания все равно.
нет исходного кода, который генерит этот запрос в итоге, нет запроса самого РЛС, чтоб понять, чему и как он мешает. Я обычно проверяю не просмотром запроса в переводе для сиквела, а просмотром самой Квери (в виде дерева запроса). |
|
12.02.2010, 10:56 | #5 |
Участник
|
я так понимаю не устраивает вас то, что к условиям 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 | #6 |
Участник
|
С этим вопросом практически всё понятно.
Благодарю всех за ответы. |
|