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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.09.2006, 11:12   #1  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
А что если вот так исправить метод new в SysQueryRun. Какие минусы? Что не будет работать, если запрос через X++ - понятно. Что не будет, если получится много ExistJoin - понятно. Что еще? Есть что-нить глобально неправильное? Будет ли работать в простейших случаях?
X++:
public void new(anytype _p1)
{
    // custom RLS, OIP, 05.09.06 -->
    int                     i,j,k;
    QueryBuildRange         r;
    QueryBuilddatasource    ds;
    QueryBuilddatasource    childDS;
    QueryBuilddatasource    restrictDS;
    Query                   q;
    SysRecordLevelSecurity  RLSTable;
    Query                   restriction;
    userGroupId             groupId;
    userGroupList           groupList;
    // custom RLS, OIP, 05.09.06 <--
    if (_p1)
    {
        super (_p1);

        if (this.args() &&
            !this.args().caller() &&
            typeOf(_p1) == Types::Class &&
            !SysdictClass::isEqualOrSuperClass(classidget(_p1), classNum(Query)))
        {
            this.args().caller(_p1);
        }

        // custom RLS, OIP, 05.09.06 -->
        q = this.query();
        {
            for(i=1; i<= q.dataSourceCount(); i++)
            {
                ds = q.dataSourceNo(i);
                while select RLSTable
                    where RLSTable.tabId == ds.table()
                    join groupList
                    where   groupList.groupId == RLSTable.groupId &&
                            groupList.userId  == curUserId()
                {
                    if(RLSTable.restriction != conNull() &&
                       sysQuery::isPackedOk(RLSTable.restriction))
                    {
                        restriction = new QueryRun(RLSTable.restriction).query();
                        if(restriction.dataSourceCount()>1)
                        {
                            for(j=2;j<= restriction.dataSourceCount();j++)
                            {
                                restrictDS = restriction.dataSourceNo(j);
                                if (!SysQuery::tableOccurrence(q, restrictDS.table(), q.dataSourceCount()))
                                {
                                    childDS = ds.addDataSource(restrictDS.table());
                                    childDS.relations(true);
                                    childDS.joinMode(JoinMode::ExistsJoin);
                                    childDS.fetchMode(QueryFetchMode::One2One);
                                }
                                else
                                {
                                    childDS = q.dataSourceTable(restrictDS.table());
                                }
                                for(k=1;k<=restrictDS.rangeCount();k++)
                                {
                                    r = restrictDS.range(k);
                                    SysQuery::findOrCreateRange(childDs, r.field()).value(r.value());
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    // custom RLS, OIP, 05.09.06 <--

    loadLastUsedQuery   = true;
    saveQueryPrUser     = true;
    allowSave           = true;
    allowAddRange       = QueryAllowAdd::AllFields;
    allowAddSorting     = QueryAllowAdd::AllFields;
    showSorting         = true;
}
По-крайней мере все выглядит красиво.
если например настроил RLS на VendTable (в форме Запросы в РЛС приджойнил скажем RContractTable с критерием по Ответственному лицу равным "ИИИ" - у нас таких поставщиков 2) и везде, во всех формах на основе VendTable и отчетах только эти 2 поставщика отображаются. И даже лукап по поставщикам тоже только этих двух отображает.

PS Это пока самая первая версия кода. Там еще много чего можно исправлять. Поэтому интересует лишь возможность именно такого подхода.

Последний раз редактировалось oip; 06.09.2006 в 12:42.
Теги
faq, rls, законченный пример, полезное, права доступа на уровне записей (rls), связанная таблица, связанные сущности

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Gustav: Unsorted, или Записки DAX-дилетанта - II Gustav DAX Blogs 39 20.05.2009 15:34
Как проверить наличие хотя бы одной записи в подчиненной таблице. demon46 DAX: Программирование 5 07.03.2008 09:41
RLS в Axapta 3.0 Peter Savintsev DAX: Функционал 0 14.07.2003 10:55
Торможение Аксапты - правда или так и должно?. ddadream DAX: Функционал 4 06.05.2003 09:53
[AXAPTA] Пересчет себестоимости. - Неужели это и должно быть так долго?? andrue DAX: Функционал 4 14.08.2002 19:49
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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