05.06.2007, 11:17 | #1 |
Участник
|
RLS&Расширенный запрос
Раширенный запрос через фильтрацию записей типа ((CustTable. AccountNum== "*") || (CustTable.InvoiceAccount == "*")) система отрабатывает корректно,тот же самый запрос введенный в RLS приводит к "вылету" из системы.Возник вопрос с логикой ИЛИ:в чём противоречие в поведении системы в этих двух случаях и можно ли всё-таки пользоваться в RLS запросами подобного вида?
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
06.06.2007, 16:15 | #2 |
Участник
|
RLS запросами подобного вида - пользоваться можно
попробуйте указать конкретные значения |
|
06.06.2007, 16:59 | #3 |
Member
|
Да, запрос интересный. Не удивлюсь, если интерпретатору от него действительно срывает крышу.
А что вы написать хотели то? CustTable. AccountNum== "*" — это все равно, что ничего не писать.
__________________
С уважением, glibs® |
|
06.06.2007, 17:40 | #4 |
Участник
|
Вместо "*" на самом деле и стоит конкретное значение. Проверили на разных SP. Стабильно нигде не работает.
В принципе найден обходной путь. Создать две группы. Для одной настроить RLS по первой половине условия, для второй - по второй. Если пользователь входит в обе группы, то условия наложатся по "ИЛИ" . |
|
06.06.2007, 19:03 | #5 |
Member
|
Был неправ. Стер.
__________________
С уважением, glibs® |
|
06.06.2007, 19:53 | #6 |
Участник
|
На самом деле, это не совсем глюк.
Точнее глючит не ядро, а вы Продемонстрировать это очень просто. Как уже видно, RLS не выдает нормальных сообщений об ошибках - она просто падает. Но эти сообщения можно посмотреть в коде. Выполните следующий Job: X++: static void Job_RLS_No_Bug(Args _args) { #define.ItemGroupId("????-????") #define.ItemId("140") Query q = new Query(); QueryBuildDataSource qbds = q.addDataSource(tableNum(InventTable), "InventTable"); QueryRun queryRun; str range = strFmt('(((InventTable.ItemId == "%1") || (InventTable.ItemGroupId == "%2")))', #ItemId, #ItemGroupId); InventTable inventTable; ; qbds.addRange(fieldNum(InventTable, RecId)).value(range); info(qbds.name()); info(qbds.toString()); queryRun = new QueryRun(q); while (queryRun.next()) { inventTable = queryRun.get(tableNum(inventTable)); info(inventTable.ItemId); } } X++: static void Job_RLS_Bug(Args _args) { #define.ItemGroupId("????-????") #define.ItemId("140") Query q = new Query(); QueryBuildDataSource qbds = q.addDataSource(tableNum(InventTable)); QueryRun queryRun; str range = strFmt('(((InventTable.ItemId == "%1") || (InventTable.ItemGroupId == "%2")))', #ItemId, #ItemGroupId); InventTable inventTable; ; qbds.addRange(fieldNum(InventTable, RecId)).value(range); info(qbds.name()); info(qbds.toString()); queryRun = new QueryRun(q); while (queryRun.next()) { inventTable = queryRun.get(tableNum(inventTable)); info(inventTable.ItemId); } } Так вот, собственно, о чем я. Аксапта работает точно так же. Только вместо ошибки падает (это, согласен, нехорошо). Но если передать ей правильную строку, правильно указав название источника, то все должно отработать правильно. X++: '(((InventTable_1.ItemId == "%1") || (InventTable_1.ItemGroupId == "%2")))' P.S. Думаю понятно, но на всякий случай уточню, что в макросы надо подставить свои значения (существующие в базе) |
|
|
За это сообщение автора поблагодарили: dn (1). |
06.06.2007, 22:08 | #7 |
Участник
|
А зачем вообще нам указывать здесь имя датасорса ?
Если не ошибаюсь, то в расширенном Query имя датасорса можно не указывать если фильтр накладывается по его же полям. А нам это и нужно ! т.е. в нашем случае должно получиться что-то типа ((AccountNum== "XXX") || (InvoiceAccount == "XXX")) P.S. Имя датасорса необходимо указывать, если нужно указать поле из связанного датасорса. Последний раз редактировалось Logger; 06.06.2007 в 22:11. |
|
|
За это сообщение автора поблагодарили: dn (1). |
02.08.2007, 13:08 | #8 |
Участник
|
Ещё один вопрос вдогонку:система выдаёт некорретные результаты по запросу типа - "Поле№1 == 01.01.2007..31.07.2007 || Поле№2 == 01.01.2007..31.07.2007
В чём ошибка?При работе с диапозонами необходимо пользоваться другими операндами?
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
17.01.2008, 14:49 | #9 |
Участник
|
Цитата:
Установка фильтров в расширенном запросе отличается. Например для енумов прнимает только цифры. Для строк не работает знак подстановки * Попробуйте переписать при помощи >= <= () && || Это возможно. Вопрос лишь в том проглотит или нет. По идее должна, потому что в обычном запросе понимает. |
|
18.01.2008, 10:46 | #10 |
Участник
|
Да, уже так и сделали,запрос типа ((Поле№1 > 31\12\2006) && (Поле №2 < 17\01\2008)) || ((Поле№3 > 31\12\2006) && (Поле№4 < 17\01\2008))) работает корректно.
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
18.01.2008, 11:43 | #11 |
Участник
|
|
|
18.01.2008, 12:36 | #12 |
Member
|
((CustTable.AccountNum == "*") || (CustTable.InvoiceAccount == "*"))
Если предположить, что автору нужно ((CustTable.AccountNum == "100") || (CustTable.InvoiceAccount == "100")) , например, (речь шла о том, что нужны вроде как конкретные таки значения вместо "*") то можно попробовать !((CustTable.AccountNum != "100") && (CustTable.InvoiceAccount != "100")) Хотя тоже не идеальный вариант.
__________________
С уважением, glibs® |
|
18.01.2008, 12:48 | #13 |
Участник
|
Всмысле?В разрезе правильности написания?Конечно,согласенВ разрезе наших процессов,то как раз нам включение границ не надо.
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
18.01.2008, 13:15 | #14 |
Member
|
Цитата:
Сообщение от donMigel
...
При работе с диапозонами необходимо пользоваться другими операндами? ... Двоеточия там не предусмотрены.
__________________
С уважением, glibs® |
|
18.01.2008, 13:32 | #15 |
Участник
|
А прочли ли вы вот это?
|
|
Теги |
rls, запрос (query), ax3.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
Gustav: Unsorted, или Записки DAX-дилетанта - II | 39 | |||
Расширенный фильтр в запрос или как то так | 7 | |||
Проблема с RLS | 3 | |||
Проблема с RLS и SecurityKey. | 3 |
|