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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.08.2008, 05:34   #1  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Спасибо огромное, помогло, работает и правда долго (минуты 3), но работает.
Получился вот такой метод, может кому пригодится, на качество кода не претендую:

X++:
void securitykey2utilidelements()
{
#AOT
str          path, properties;
treenode    treenode;
identifiername identifiername;
UtilIDElements    utils, utils1;
UtilElementType CurElementType;
dictionary dict;
DictSecurityKey DictSK;
SecurityKeyID SecurityKeyID;
;
    delete_from seckey2utilstable;
    while select typessubset
    {
        CurElementType = typessubset.UtilElementType;
        While Select count(recid) from utils group by id, recordtype, name
                where utils.recordType == CurElementType
        {
            select firstonly utils1 where
                utils.recordType == utils1.recordType &&
                utils.id == utils1.id &&
                utils.name == utils1.name;
            treenode = xUtilIDElements::getNode(utils1);
            If (treenode)
                {
                properties = treenode.AOTgetProperties();
                path = treenode.treeNodePath();
                identifiername = findproperty(properties, 'SecurityKey');
                ttsbegin;
                seckey2utilstable = null;
                seckey2utilstable.insert();
                if (identifiername != '')
                {
                    dict = new dictionary();
                    SecurityKeyID = dict.securityKeyName2Id(identifiername);
                    seckey2utilstable.SecurityKeyID = SecurityKeyID;
                    DictSK = new DictSecurityKey(SecurityKeyID);
                    seckey2utilstable.SecurityKeyLabel = DictSK.label();
                    seckey2utilstable.SecurityKeyName = identifiername;
                }
                seckey2utilstable.ObjectPath = path;
                seckey2utilstable.ObjectName =  utils.name;
                seckey2utilstable.ObjectNum = utils.id;
                seckey2utilstable.UtilElementType = typessubset.UtilElementType;
                seckey2utilstable.update();
                ttscommit;
                //info(strfmt( treenode.treeNodePath()) + '  /  ' + identifiername);
                }
        }
     }
}
Таблица typessubset нужна чтобы выбрать туда только те элементы из UtilElementType которые имеют SecurityKey, чтобы перебирать не все типы элементов, например элементы типа class, form, report не нужны.
Спасибо еще раз!
__________________
Может быть выйдет, а может не-е-е-ет...
Новая песня вместо штиблет..
Старый 07.08.2008, 10:52   #2  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от Qaz Qwerty Посмотреть сообщение
Спасибо огромное, помогло, работает и правда долго (минуты 3), но работает.
Ну...
1. Для таблицы UtilIdElements искать можно/достаточно либо по name либо по id. Обновление: Не прав. Фильтрацию по id в общем случае желательно избегать (см. ниже).
2. На таблице UtilIdElements есть уникальные индексы [recordType, parentId, name, utilLevel] и [recordType, parentId, id, utilLevel], а в вашей задаче все искомые узлы, как я понял, не имеют родителей. Соответственно, добавив в условия выборокк из UtilIdElements поле parentId (и удалив name либо id), получите прибавку к скорости.
3. С помощью xUtilIDElements::getNode() вы получаете узел на произвольном слое utils1.utilLevel, а не на последнем. Конечно на практике может получится, что select firstonly utils1 возвращает как раз запись с последним слоем, но все-таки надеяться на это не стоит. Использование order by utilLevel desc или info.getNode() или др. get/find node поможет, если схему не менять.
4. Встречался со случаями, когда в UtilElements отсутствовали записи для последних слоев (см. еще тут).
5. Если задачу решать через UtilElements/UtilIdElements, то можно попробовать один select для UtilElements/UtilIdElements, а не два - ну это уже имхо.

Последний раз редактировалось vallys; 19.08.2008 в 09:48.
За это сообщение автора поблагодарили: Qaz Qwerty (1).
Старый 07.08.2008, 21:15   #3  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Vallys,
1. в таблице UtilIdElements есть записи с 0 ID и разными Name, так что от пары ID-Name наверное не получится отказаться.
2. Parent действительно кажется не нужен, потому что все типы элементов, которые имеют родителя не имеют свойства SecurityKey. Спасибо что подсказали, если добавить условие ParentID = 0, то выборка действительно сокращается.
3,4 Насчет слоя... Не понятно, я же выбираю запись с любого слоя где элемент присутствует, мне слой не важен - лишь бы выбрать все элементы. Наверное что-то не догоняю, легко допускаю.
5. может быть.
Спасибо!
__________________
Может быть выйдет, а может не-е-е-ет...
Новая песня вместо штиблет..
Старый 18.08.2008, 18:49   #4  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от Qaz Qwerty Посмотреть сообщение
Vallys,
1. в таблице UtilIdElements есть записи с 0 ID и разными Name, так что от пары ID-Name наверное не получится отказаться.
2. Parent действительно кажется не нужен, потому что все типы элементов, которые имеют родителя не имеют свойства SecurityKey. Спасибо что подсказали, если добавить условие ParentID = 0, то выборка действительно сокращается.
3,4 Насчет слоя... Не понятно, я же выбираю запись с любого слоя где элемент присутствует, мне слой не важен - лишь бы выбрать все элементы. Наверное что-то не догоняю, легко допускаю.
5. может быть.
Спасибо!
Извините, что не сразу ответил...
1. Посмотрел в UtilIdElements, увидел записи с Id == 0 (например, у элементов MenuItem) и задумался... Ведь действительно элементы MenuItem якобы не имеют Id. Вообщем с Id не так все просто. Критерий Id == 0 лучше не использовать в выражении where. Например, запрос
X++:
select UtilIdElements where UtilIdElements.Id == 0
и его вариации (без использования критерия по name) никогда записей не возвращают. Если фильтровать еще и по name, то все в порядке. Подозреваю что фильтрация по Id в данном случае происходит уже на другом уровне, нежели по Name. В вашем случае добавление к Name еще и Id ничего не поменяло. Думаю, что в общем случае лучше избегать фильтрацию по Id.

3,4. Я имел в виду, что при
X++:
treenode = xUtilIDElements::getNode(utils1);
вы получаете элемент AOT на неизвестном слое. Если это, например, sys, а на слое dis этот элемент имеет другой ключ безопасности, то в результате вы получите "неправильный" ключ с более низкого слоя sys.
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
dax-dilettante: 15. System Classes \ The Global Class Blog bot DAX Blogs 0 26.09.2007 23:51
dax-lessons: Active directory in Axapta Blog bot DAX Blogs 0 27.08.2007 23:00
Denis Fedotenko: Новые поля в складских проводках Blog bot DAX: База знаний и проекты 10 24.05.2007 11:57
Дисплей метод таблицы который вызывается из ГРИДА 3oppo DAX: Программирование 10 23.05.2006 06:47

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

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

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