![]() |
#6 |
Участник
|
Подниму, пожалуй, тему. В АХ2012 появились модели, а UtilElements не позволяет по ним фильтроваться. Ниже приведен пример создания проекта по объектам конкретной модели. Также в приведенном коде исправлена ошибка исходного скрипта, когда, скажем, находился метод класса или поле таблицы, но сам класс или таблица в итоге в проект не добавлялись. Это связано с особенностью работы SysProjectFilterRunBase, которому на вход надо подавать только объекты AOT верхнего уровня.
X++: SysModelManifest modelManifest; SysModelElement modelElement; SysModelElementData modelElementData; UtilElements utilElementsBuf; ProjectNode projectNode; SysProjectFilterRunBase projectFilt; UTCTimestamp dateTimeMin = DateTimeUtil::addDays(DateTimeUtil::utcNow(), -1); boolean isAnyFound = false; projectNode = SysTreeNode::createProject('MyProject', ProjectSharedPrivate::ProjShared); projectFilt = SysProjectFilterRunBase::construct(); projectFilt.parmProjectNode(projectNode); projectFilt.grouping(SysProjectGrouping::AOT); // важно: группируем объекты в проекте, как в AOT, иначе получим плоский список объектов while select tableId from modelManifest where modelManifest.DisplayName == 'My Model Name' // фильтр по интересующей модели join tableId from modelElementData where modelElementData.ModelId == modelManifest.RecId && modelElementData.modifiedDateTime >= dateTimeMin // фильтр по времени модификации join modelElement where modelElement.RecId == modelElementData.ModelElement // мы в любом случае не сможем добавить в наш проект другие проекты && modelElement.ElementType != any2int64(UtilElementType::SharedProject) && modelElement.ElementType != any2int64(UtilElementType::PrivateProject) { utilElementsBuf.clear(); utilElementsBuf.recordType = modelElement.ElementType; utilElementsBuf.name = modelElement.Name; utilElementsBuf.parentId = modelElement.ParentId; if (utilElementsBuf.ParentId) { // важно: добавлять следует лишь объекты верхнего уровня // поэтому если нашелся метод или табличное поле, то // получаем родительский объект, иначе в проект он не добавится // за счет группировки повторяющиеся объекты в итоге // будут добавлены в результирующий проект лишь один раз utilElementsBuf = xUtilElements::parentElement(utilElementsBuf); } isAnyFound = projectFilt.doUtilElements(utilElementsBuf) || isAnyFound; } if (isAnyFound) { // сохраняем изменения и открываем новый проект projectFilt.write(); projectNode.AOTnewWindow(); } |
|
|
За это сообщение автора поблагодарили: Logger (3). |