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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.06.2007, 19:53   #1  
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).
Теги
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, время: 21:51.