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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2007, 11:17   #1  
donMigel is offline
donMigel
Участник
Аватар для donMigel
 
133 / 33 (2) +++
Регистрация: 31.08.2004
Адрес: Мытищи
! RLS&Расширенный запрос
Раширенный запрос через фильтрацию записей типа ((CustTable. AccountNum== "*") || (CustTable.InvoiceAccount == "*")) система отрабатывает корректно,тот же самый запрос введенный в RLS приводит к "вылету" из системы.Возник вопрос с логикой ИЛИ:в чём противоречие в поведении системы в этих двух случаях и можно ли всё-таки пользоваться в RLS запросами подобного вида?
__________________
_____________________________________________--
Axapta 3.0 SP4 KR1 Build #10 for EE
Ищу работу!
Старый 06.06.2007, 16:15   #2  
oxbacc is offline
oxbacc
Участник
 
35 / 10 (1) +
Регистрация: 31.01.2006
RLS запросами подобного вида - пользоваться можно
попробуйте указать конкретные значения
Старый 06.06.2007, 16:59   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Да, запрос интересный. Не удивлюсь, если интерпретатору от него действительно срывает крышу.

А что вы написать хотели то?

CustTable. AccountNum== "*" — это все равно, что ничего не писать.
__________________
С уважением,
glibs®
Старый 06.06.2007, 17:40   #4  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Вместо "*" на самом деле и стоит конкретное значение. Проверили на разных SP. Стабильно нигде не работает.

В принципе найден обходной путь. Создать две группы. Для одной настроить RLS по первой половине условия, для второй - по второй. Если пользователь входит в обе группы, то условия наложатся по "ИЛИ" .
Старый 06.06.2007, 19:03   #5  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Был неправ. Стер.
__________________
С уважением,
glibs®
Старый 06.06.2007, 19:53   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
На самом деле, это не совсем глюк.
Точнее глючит не ядро, а вы

Продемонстрировать это очень просто. Как уже видно, 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);
    }
}
И, для сравнения, выполните второй job:
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);
    }
}
Видим, что во втором случае выполнение приводит к ошибке времени выполнения, так как фильтр накладывается, как будно источник называется InventTable, хотя на самом деле присвоилось значение InventTable_1.

Так вот, собственно, о чем я.
Аксапта работает точно так же. Только вместо ошибки падает (это, согласен, нехорошо).

Но если передать ей правильную строку, правильно указав название источника, то все должно отработать правильно.
X++:
'(((InventTable_1.ItemId == "%1") || (InventTable_1.ItemGroupId == "%2")))'
У меня отработало.

P.S. Думаю понятно, но на всякий случай уточню, что в макросы надо подставить свои значения (существующие в базе)
За это сообщение автора поблагодарили: dn (1).
Старый 06.06.2007, 22:08   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А зачем вообще нам указывать здесь имя датасорса ?
Если не ошибаюсь, то в расширенном Query имя датасорса можно не указывать если фильтр накладывается по его же полям. А нам это и нужно !

т.е. в нашем случае должно получиться что-то типа
((AccountNum== "XXX") || (InvoiceAccount == "XXX"))

P.S. Имя датасорса необходимо указывать, если нужно указать поле из связанного датасорса.

Последний раз редактировалось Logger; 06.06.2007 в 22:11.
За это сообщение автора поблагодарили: dn (1).
Старый 02.08.2007, 13:08   #8  
donMigel is offline
donMigel
Участник
Аватар для donMigel
 
133 / 33 (2) +++
Регистрация: 31.08.2004
Адрес: Мытищи
Ещё один вопрос вдогонку:система выдаёт некорретные результаты по запросу типа - "Поле№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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от donMigel Посмотреть сообщение
Ещё один вопрос вдогонку:система выдаёт некорретные результаты по запросу типа - "Поле№1 == 01.01.2007..31.07.2007 || Поле№2 == 01.01.2007..31.07.2007
В чём ошибка?При работе с диапозонами необходимо пользоваться другими операндами?
похоже что так.
Установка фильтров в расширенном запросе отличается. Например для енумов прнимает только цифры. Для строк не работает знак подстановки *

Попробуйте переписать при помощи >= <= () && ||
Это возможно.
Вопрос лишь в том проглотит или нет.

По идее должна, потому что в обычном запросе понимает.
Старый 18.01.2008, 10:46   #10  
donMigel is offline
donMigel
Участник
Аватар для donMigel
 
133 / 33 (2) +++
Регистрация: 31.08.2004
Адрес: Мытищи
Да, уже так и сделали,запрос типа ((Поле№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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от donMigel Посмотреть сообщение
Да, уже так и сделали,запрос типа ((Поле№1 > 31\12\2006) && (Поле №2 < 17\01\2008)) || ((Поле№3 > 31\12\2006) && (Поле№4 < 17\01\2008))) работает корректно.
А вы уверены, что не <= >=

.. - это со включением границ
Старый 18.01.2008, 12:36   #12  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
((CustTable.AccountNum == "*") || (CustTable.InvoiceAccount == "*"))

Если предположить, что автору нужно ((CustTable.AccountNum == "100") || (CustTable.InvoiceAccount == "100")) , например, (речь шла о том, что нужны вроде как конкретные таки значения вместо "*") то можно попробовать

!((CustTable.AccountNum != "100") && (CustTable.InvoiceAccount != "100"))

Хотя тоже не идеальный вариант.
__________________
С уважением,
glibs®
Старый 18.01.2008, 12:48   #13  
donMigel is offline
donMigel
Участник
Аватар для donMigel
 
133 / 33 (2) +++
Регистрация: 31.08.2004
Адрес: Мытищи
Цитата:
Сообщение от belugin Посмотреть сообщение
А вы уверены, что не <= >=

.. - это со включением границ
Всмысле?В разрезе правильности написания?Конечно,согласенВ разрезе наших процессов,то как раз нам включение границ не надо.
__________________
_____________________________________________--
Axapta 3.0 SP4 KR1 Build #10 for EE
Ищу работу!
Старый 18.01.2008, 13:15   #14  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от donMigel
...
При работе с диапозонами необходимо пользоваться другими операндами?
...
По идее, в advanced query нужно писать также, как в select после where.

Двоеточия там не предусмотрены.
__________________
С уважением,
glibs®
Старый 18.01.2008, 13:32   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
А прочли ли вы вот это?
Теги
rls, запрос (query), ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Gustav: Unsorted, или Записки DAX-дилетанта - II Gustav DAX Blogs 39 20.05.2009 15:34
Расширенный фильтр в запрос или как то так Sada DAX: Программирование 7 15.01.2009 16:09
Проблема с RLS oxbacc DAX: Администрирование 3 11.04.2007 12:03
Проблема с RLS и SecurityKey. oip DAX: Программирование 3 22.12.2005 17:26

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

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

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