|
13.03.2008, 17:41 | #1 |
Moderator
|
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; } 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) ) ИСТОЧНИКИ (ВДОХНОВЕНИЯ): Еще по поводу QueryBuildRange() Коды аналитики |
|
24.03.2008, 18:49 | #2 |
Moderator
|
Аналог excel'ной функции TRIM
В Excel есть замечательная функция рабочего листа TRIM (в русской версии - СЖПРОБЕЛЫ). Она не только удаляет ведущие и концевые пробелы, как это делают функции strLTrim и strRTrim в X++ (или LTrim и RTrim в VBA, Oracle и т.д.), но и оставляет между словами только по одному пробелу, например:
Код: TRIM(" Доход за первый квартал ") равняется "Доход за первый квартал". 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; } Кстати, имеющаяся в VBA и Oracle функция Trim действует не более, чем как метод класса Global strLRTrim (т.е. просто выполняет оба действия - "левое" и "правое" - одновременно). Пробелы же между словами, которых может быть более одного, она не трогает. Коллеги, возможно, кто-то видит не столь очевидную, но более эффективную, комбинацию иных текстовых функций для достижения такого же результата - пожалуйста, делитесь соображениями, с удовольствием послушаю. |
|
Теги |
excel, rls, полезное, blog, axapta |
|
|