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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.03.2008, 17:41   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
SysRecordLevelSecurityWizard: Настройка RLS для неотображаемой таблицы
ПРОБЛЕМА:

Необходимо для заданной группы прав настроить RLS на таблицу "Коды журналов ОС", которой нет в списке таблиц, отображаемых в Мастере. Таблица "Коды журналов ОС" в нашем сильноэксклюзивном приложении от компании GMCS называется GM_RAssetJournalName.

РЕЦЕПТ:

1. Открываем форму "Доступ на уровне записей" (SysRecordLevelSecurity), до которой предварительно добираемся по меню Ax 3.0: Администрирование \Настройки \Контроль доступа \Доступ на уровне записей.

2. Находясь в гриде, жмем Ctrl+N и создаем при помощи Мастера запись для заданной группы и какой-нибудь произвольной таблицы, которая нам не нужна, но которая видна в списке Мастера, например, "Модели учета" - RAssetStandardTable (она видна в раскрытом узле "СНГ Основные средства" после включения опции "Показать все таблицы").

3. Закончив шаги Мастера, выходим из формы "Доступ на уровне записей", не настраивая для созданной записи никаких фильтров (т.е. не пользуемся кнопкой "Запрос").

4. В таблице SysRecordLevelSecurity в нужной записи меняем код "ненужной" таблицы на код требуемой таблицы любым удобным способом - вручную (через Обозреватель таблицы или средствами СУБД) или при помощи элементарного джоба:
X++:
static void Job_UpdateRLSrecord(Args _args)
{
    SysRecordLevelSecurity sysRLS;
    ;
    ttsbegin;

    select forupdate sysRLS
        where sysRLS.companyId == curExt()
           && sysRLS.groupId == '<наша группа прав>'
           && sysRLS.tabId == tablenum(RAssetStandardTable);

    sysRLS.tabId = tablenum(GM_RAssetJournalName);
    sysRLS.update();

    ttscommit;
}
5. Снова открываем форму "Доступ на уровне записей", находим нужную запись - видим в колонке "Название таблицы", что таблица благополучно поменялась.

6. Нажимаем кнопку "Запрос" и выполняем требуемую настройку фильтра для нашей таблицы.

7. "Захардкодиваем" код нашей таблицы в метод buildTableTree формы SysRecordLevelSecurityWizard. Это необходимо для того, чтобы возможные последующие настройки RLS для данной группы прав не снесли нашу, с таким трудом вживленную, таблицу. Для этого меняем условие в IF - тупо, зато быстро, расширяя его на ИЛИ с нашей таблицей:
c
X++:
if (dictTable &&
    dictTable.allowSecuritySetup() &&
    (dictTable.tableGroup() == TableGroup::Main ||
     tableSelection.selection() ||
     tableIds.in(tableId)) &&
     (domainAccess || SysRecordLevelSecurityWizard::tableAllowed(tableId)))
на
X++:
if (
   (dictTable &&
    dictTable.allowSecuritySetup() &&
    (dictTable.tableGroup() == TableGroup::Main ||
     tableSelection.selection() ||
     tableIds.in(tableId)) &&
     (domainAccess || SysRecordLevelSecurityWizard::tableAllowed(tableId)))
   ||
   tableId == tablenum(GM_RAssetJournalName)
   )
Подобным образом надо будет расширять условие при добавлении в RLS каждой новой неотображаемой таблицы. Если таких таблиц станет много и надоест каждый раз править метод, то, может, будет иметь смысл вставить в условие глобальный макрос, расширяемый по мере необходимости, или читать коды "исключительных" таблиц из какой-нибудь специальной настроечной таблицы.

ИСТОЧНИКИ (ВДОХНОВЕНИЯ):

Еще по поводу QueryBuildRange()
Коды аналитики
Старый 24.03.2008, 18:49   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Аналог excel'ной функции TRIM
В Excel есть замечательная функция рабочего листа TRIM (в русской версии - СЖПРОБЕЛЫ). Она не только удаляет ведущие и концевые пробелы, как это делают функции strLTrim и strRTrim в X++ (или LTrim и RTrim в VBA, Oracle и т.д.), но и оставляет между словами только по одному пробелу, например:
Код:
TRIM(" Доход   за   первый    квартал   ") равняется "Доход за первый квартал".
Сегодня я понял, что чувствую себя в Аксапте очень неуютно без подобной функции. И, поскольку ничего подходящиего ни среди системных функций, ни среди методов класса Global я не нашёл, то слепил свою собственную:
X++:
static str trimLikeExcel(str _sourceString)
{
    // имитация табличной функции TRIM из Excel
    // удаляем пробелы до тех пор, пока между словами не останется только по одному пробелу
    str strTmp;
    int lenPrev, lenCurr;
    ;

    strTmp = strLRTrim(_sourceString);
    lenCurr = strLen(strTmp);
    do
    {
        lenPrev = lenCurr;
        strTmp = strReplace(strTmp, '  ', ' '); // многократная замена 2-х пробелов на 1
        lenCurr = strLen(strTmp);
    }
    while (lenCurr != lenPrev);

    return strTmp;
}
Функцию можно поместить в класс Global или в какой-нибудь собственный класс-набор статических методов (а-ля "персональный Global").

Кстати, имеющаяся в VBA и Oracle функция Trim действует не более, чем как метод класса Global strLRTrim (т.е. просто выполняет оба действия - "левое" и "правое" - одновременно). Пробелы же между словами, которых может быть более одного, она не трогает.

Коллеги, возможно, кто-то видит не столь очевидную, но более эффективную, комбинацию иных текстовых функций для достижения такого же результата - пожалуйста, делитесь соображениями, с удовольствием послушаю.
Теги
excel, rls, полезное, blog, axapta

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Generate XML Documentation Files for a project - DAX 2009 Blog bot DAX Blogs 0 08.08.2008 19:06
dax-lessons: Active directory in Axapta Blog bot DAX Blogs 0 27.08.2007 23:00
Kashperuk Ivan: AxPaint - make your DAX look cool :) Blog bot DAX Blogs 0 26.06.2007 21:00
Kashperuk Ivan: (DAX 3.0) SysExportDialog form extension Blog bot DAX Blogs 1 15.05.2007 19:16
Kashperuk Ivan: Two very useful projects for DAX Blog bot DAX Blogs 0 20.04.2007 01:14

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:31.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.