|
06.08.2008, 02:42 | #1 |
китайский стажер
|
несуществующий метод SecurityKey() для таблицы UtilElements (DAX 4.0)
Вот здесь написано, что у таблицы UtilElements есть метод SecurityKey().
А DAX говорит, что этого метода нет. Но почему? А как же тогда выбрать все объекты из utilelements или utilidelements c определенным security key?
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
06.08.2008, 04:27 | #2 |
китайский стажер
|
Есть несколько классов:
- SysUserSecurityReport - SysSecurity - SysSecurityKeyDependencies В сумме они делают примерно то же самое, что мне надо. Буду копать. Вот только хотелось как-нибудь попроще...
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
06.08.2008, 04:49 | #3 |
китайский стажер
|
Все спят, да?
Так вот, эти классы не помогут, потому что они не открывают информацию об объектах UtilElements. Дерево строят, красивое дерево... только это все security keys, а нужны объекты - таблицы, отчеты и прочее. Как же это сделать то...
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
06.08.2008, 09:06 | #4 |
Злыдни
|
Ну да, спим мы, спим. Почему нет метода - сие мне неведомо. Но в плане решения задачи, я бы покопал в сторону xRef...
|
|
06.08.2008, 11:47 | #5 |
MCTS
|
Если стоит задача выбрать все объекты с определенным секьюретикеем, то можно так:
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 |
Участник
|
Цитата:
Долго работает только...
|
|
06.08.2008, 13:00 | #7 |
Участник
|
Dict* классы можно попробовать.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
06.08.2008, 14:29 | #8 |
MCTS
|
ну да: в таком вот виде работает гораздо быстрее:
X++: for (i = Dictionary.tableCnt(); i; i--) { DictTable = new dicttable(Dictionary.tableCnt2Id(i)); If (DictTable.securityKeyId() == #fltseckey) info(DictTable.name()); } единственное, что не универсально. Для каждого типа - свой класс Dict* |
|
07.08.2008, 05:34 | #9 |
китайский стажер
|
Спасибо огромное, помогло, работает и правда долго (минуты 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); } } } } Спасибо еще раз!
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
07.08.2008, 10:52 | #10 |
Developer
|
Цитата:
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 |
китайский стажер
|
Vallys,
1. в таблице UtilIdElements есть записи с 0 ID и разными Name, так что от пары ID-Name наверное не получится отказаться. 2. Parent действительно кажется не нужен, потому что все типы элементов, которые имеют родителя не имеют свойства SecurityKey. Спасибо что подсказали, если добавить условие ParentID = 0, то выборка действительно сокращается. 3,4 Насчет слоя... Не понятно, я же выбираю запись с любого слоя где элемент присутствует, мне слой не важен - лишь бы выбрать все элементы. Наверное что-то не догоняю, легко допускаю. 5. может быть. Спасибо!
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
18.08.2008, 18:49 | #12 |
Developer
|
Цитата:
Сообщение от 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 3,4. Я имел в виду, что при X++: treenode = xUtilIDElements::getNode(utils1); |
|