|
|
#1 |
|
Участник
|
Раширенный запрос через фильтрацию записей типа ((CustTable. AccountNum== "*") || (CustTable.InvoiceAccount == "*")) система отрабатывает корректно,тот же самый запрос введенный в RLS приводит к "вылету" из системы.Возник вопрос с логикой ИЛИ:в чём противоречие в поведении системы в этих двух случаях и можно ли всё-таки пользоваться в RLS запросами подобного вида?
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
|
|
|
#2 |
|
Участник
|
RLS запросами подобного вида - пользоваться можно
попробуйте указать конкретные значения |
|
|
|
|
#3 |
|
Member
|
Да, запрос интересный. Не удивлюсь, если интерпретатору от него действительно срывает крышу.
А что вы написать хотели то? CustTable. AccountNum== "*" — это все равно, что ничего не писать.
__________________
С уважением, glibs® |
|
|
|
|
#4 |
|
Участник
|
Вместо "*" на самом деле и стоит конкретное значение. Проверили на разных SP. Стабильно нигде не работает.
В принципе найден обходной путь. Создать две группы. Для одной настроить RLS по первой половине условия, для второй - по второй. Если пользователь входит в обе группы, то условия наложатся по "ИЛИ" . |
|
|
|
|
#5 |
|
Member
|
Был неправ. Стер.
__________________
С уважением, glibs® |
|
|
|
|
#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). | |
|
|
#7 |
|
Участник
|
А зачем вообще нам указывать здесь имя датасорса ?
Если не ошибаюсь, то в расширенном Query имя датасорса можно не указывать если фильтр накладывается по его же полям. А нам это и нужно ! т.е. в нашем случае должно получиться что-то типа ((AccountNum== "XXX") || (InvoiceAccount == "XXX")) P.S. Имя датасорса необходимо указывать, если нужно указать поле из связанного датасорса. Последний раз редактировалось Logger; 06.06.2007 в 22:11. |
|
|
|
| За это сообщение автора поблагодарили: dn (1). | |
|
|
#8 |
|
Участник
|
Ещё один вопрос вдогонку:система выдаёт некорретные результаты по запросу типа - "Поле№1 == 01.01.2007..31.07.2007 || Поле№2 == 01.01.2007..31.07.2007
В чём ошибка?При работе с диапозонами необходимо пользоваться другими операндами?
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
|
|
|
#9 |
|
Участник
|
Цитата:
Установка фильтров в расширенном запросе отличается. Например для енумов прнимает только цифры. Для строк не работает знак подстановки * Попробуйте переписать при помощи >= <= () && || Это возможно. Вопрос лишь в том проглотит или нет. По идее должна, потому что в обычном запросе понимает. |
|
|
|
|
#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 Ищу работу! |
|
|
|
|
#11 |
|
Участник
|
|
|
|
|
|
#12 |
|
Member
|
((CustTable.AccountNum == "*") || (CustTable.InvoiceAccount == "*"))
Если предположить, что автору нужно ((CustTable.AccountNum == "100") || (CustTable.InvoiceAccount == "100")) , например, (речь шла о том, что нужны вроде как конкретные таки значения вместо "*") то можно попробовать !((CustTable.AccountNum != "100") && (CustTable.InvoiceAccount != "100")) Хотя тоже не идеальный вариант.
__________________
С уважением, glibs® |
|
|
|
|
#13 |
|
Участник
|
Всмысле?В разрезе правильности написания?Конечно,согласен
В разрезе наших процессов,то как раз нам включение границ не надо.
__________________
_____________________________________________-- Axapta 3.0 SP4 KR1 Build #10 for EE Ищу работу! |
|
|
|
|
#14 |
|
Member
|
Цитата:
Сообщение от donMigel
...
При работе с диапозонами необходимо пользоваться другими операндами? ... Двоеточия там не предусмотрены.
__________________
С уважением, glibs® |
|
|
|
|
#15 |
|
Участник
|
А прочли ли вы вот это?
|
|
|
| Теги |
| rls, запрос (query), ax3.0 |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Gustav: Unsorted, или Записки DAX-дилетанта - II | 39 | |||
| Расширенный фильтр в запрос или как то так | 7 | |||
| Проблема с RLS | 3 | |||
| Проблема с RLS и SecurityKey. | 3 | |||
|