|
|
|
|
#1 |
|
китайский стажер
|
Спасибо огромное, помогло, работает и правда долго (минуты 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); } } } } Спасибо еще раз!
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
|
|
|
#2 |
|
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). | |
|
|
#3 |
|
китайский стажер
|
Vallys,
1. в таблице UtilIdElements есть записи с 0 ID и разными Name, так что от пары ID-Name наверное не получится отказаться. 2. Parent действительно кажется не нужен, потому что все типы элементов, которые имеют родителя не имеют свойства SecurityKey. Спасибо что подсказали, если добавить условие ParentID = 0, то выборка действительно сокращается. 3,4 Насчет слоя... Не понятно, я же выбираю запись с любого слоя где элемент присутствует, мне слой не важен - лишь бы выбрать все элементы. Наверное что-то не догоняю, легко допускаю. 5. может быть. Спасибо!
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
|
|
|
#4 |
|
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); |
|
|