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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2006, 12:53   #11  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от itfs
Хорошая идея, раздвигает возможности RLS на 1 шаг по связям.
Почему на 1?

Цитата:
1. фильрт можно руками снять, надо его лочить;
Спасибо.

Цитата:
2. даже залоченный фильтр можно сбить (глюк аксапты), поэтому нужно, чтобы фильтр восстанавливался всякий раз на executeQuery().
Хм... как его можно сбить?
Цитата:
3. забавный эффект, если забыть сами RContractTable ограничить ...
Надо не забывать.

Следующая версия, исправлена возможность снятия фильтра руками. Спасибо, itfs.
X++:
public void new(anytype _p1)
{
    // custom RLS, OIP, 05.09.06 -->
    int                     i,j,k;
    QueryBuildRange         r;
    QueryBuilddatasource    ds;
    QueryBuilddatasource    childDS;
    QueryBuilddatasource    intDS;
    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);
                            intDS = restrictDS.parentDataSource();
                            if (!SysQuery::tableOccurrence(q, restrictDS.table(), q.dataSourceCount()))
                            {
                                childDS = q.dataSourceTable(intDS.table()).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 = SysQuery::findOrCreateRange(childDs, restrictDS.range(k).field());
                                r.value(restrictDS.range(k).value());
                                r.status(RangeStatus::Hidden);
                            }
                        }
                    }
                }
            }
        }
    }
    // custom RLS, OIP, 05.09.06 <--

    loadLastUsedQuery   = true;
    saveQueryPrUser     = true;
    allowSave           = true;
    allowAddRange       = QueryAllowAdd::AllFields;
    allowAddSorting     = QueryAllowAdd::AllFields;
    showSorting         = true;
}

Последний раз редактировалось oip; 07.09.2006 в 22:54.
За это сообщение автора поблагодарили: mazzy (5), anykey (1).
Теги
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, время: 00:42.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.