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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2008, 02:42   #1  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Cool несуществующий метод SecurityKey() для таблицы UtilElements (DAX 4.0)
Вот здесь написано, что у таблицы UtilElements есть метод SecurityKey().
А DAX говорит, что этого метода нет. Но почему?
А как же тогда выбрать все объекты из utilelements или utilidelements c определенным security key?
__________________
Может быть выйдет, а может не-е-е-ет...
Новая песня вместо штиблет..
Старый 06.08.2008, 04:27   #2  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Есть несколько классов:
- SysUserSecurityReport
- SysSecurity
- SysSecurityKeyDependencies
В сумме они делают примерно то же самое, что мне надо. Буду копать.
Вот только хотелось как-нибудь попроще...
__________________
Может быть выйдет, а может не-е-е-ет...
Новая песня вместо штиблет..
Старый 06.08.2008, 04:49   #3  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Все спят, да?
Так вот, эти классы не помогут, потому что они не открывают информацию об объектах UtilElements. Дерево строят, красивое дерево... только это все security keys, а нужны объекты - таблицы, отчеты и прочее. Как же это сделать то...
__________________
Может быть выйдет, а может не-е-е-ет...
Новая песня вместо штиблет..
Старый 06.08.2008, 09:06   #4  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Ну да, спим мы, спим. Почему нет метода - сие мне неведомо. Но в плане решения задачи, я бы покопал в сторону xRef...
Старый 06.08.2008, 11:47   #5  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
Если стоит задача выбрать все объекты с определенным секьюретикеем, то можно так:
X++:
UtilElements    ue;
treenode    treenode;
#define.fltseckey("CustTables")
#define.SecurityKey("SecurityKey")
str         properties;
;
While Select ue
    where ue.recordType == UtilElementType::Table
    {
    treenode = xUtilElements::getNode(ue);
    If (treenode)
        {
        properties = treenode.AOTgetProperties();
 
        If (strscan(properties, #SecurityKey, 1, strlen(properties)))
            If (treenode.AOTgetProperty(#SecurityKey) == #fltseckey)
                info(strfmt("%1", treenode.treeNodePath()));
        }
    }
Долго работает только...
За это сообщение автора поблагодарили: _scorp_ (1).
Старый 06.08.2008, 12:47   #6  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Долго работает только...
А все что связано с таблицами Util* работает долго. Таблички ведь находятся не на SQL сервере, а в файлах слоев приложения и содержат достаточно много информации.
Старый 06.08.2008, 13:00   #7  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Dict* классы можно попробовать.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 06.08.2008, 14:29   #8  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
ну да: в таком вот виде работает гораздо быстрее:
X++:
for (i = Dictionary.tableCnt(); i; i--)
    {
    DictTable = new dicttable(Dictionary.tableCnt2Id(i));
    If (DictTable.securityKeyId() == #fltseckey)
        info(DictTable.name());
    }
#fltseckey - это в данном случае ID SecurityKey.
единственное, что не универсально. Для каждого типа - свой класс Dict*
Старый 07.08.2008, 05:34   #9  
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   #10  
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   #11  
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   #12  
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, время: 20:56.