05.02.2015, 14:34 | #1 |
Участник
|
Скрипт который создает проект и перемещает в него все изменения со слоя за дату
Добрый день!
Может кому то будет интересно или полезно: Данный скрипт собирает изменения на выбранном слое на выбранную дату и создает на основании этого проект в private. X++: static void createproject(Args _args) { SysProjectFilterRunBase sysProjectFilter; Utilelements utilElements; Identifiername projName; TransDate transDate; Counter c; UtilEntryLevel utilLevel; TimeOfDay timeOfDay; str projNamePrefix; UtcDateTime dateTime; ; projNamePrefix = "USR"; utilLevel = UtilEntryLevel::usr; timeOfDay = str2time("00:00:01"); dateTime = DateTimeUtil::newDateTime(mkDate(29,01, 2015), timeOfDay); transDate = today(); projName = strFmt("%1_%2", projNamePrefix ? projNamePrefix : enum2str(utilLevel), date2str(transDate, 321, 2,0,2,0,2)); setPrefix(strFmt("Create project %1", projName)); sysProjectFilter = new sysProjectFilterRunBase(); sysProjectFilter.parmProjectNode(sysTreeNode::createProject(projName)); sysProjectFilter.grouping(sysProjectGrouping::AOT); while select name, utilLevel, RecordType, ParentId from utilElements where utilElements.utilLevel == utilLevel && (utilElements.createdDateTime >= dateTime || utilElements.modifiedDateTime >= dateTime) { try { utilelements.reread(); if (sysProjectFilter.doUtilElements(utilelements)) { c++; } } catch (exception::Error) { throw error('Error at adding elements to the project'); } } sysProjectFilter.write(); if (c) { strFmt("Project %1 was created", projName); } else { info("No elements found."); } } |
|
06.02.2015, 10:40 | #2 |
Участник
|
Наверное, будет точнее сказать так:
"собирает изменения, сделанные после определенной даты и времени".
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
06.02.2015, 14:32 | #3 |
Участник
|
Да точно. По поводу даты - select легко можно исправить так как вам угодно. Я думаю что совместная разработка в аксапте не очень крута - можно к примеру написать RunBaseBatch который будет собирать изменения по людям на каждую дату и сохранять. Заодно можно посчитать наверное и количеств строк измененного кода.
|
|
06.02.2015, 14:58 | #4 |
Участник
|
Если один и тот же объект несколько разработчиков будет менять между запусками функции, то вы ничего не увидите.
Точнее, увидите последнего менявшего. Используйте контроль версий - будет намного проще. И будет круче)
__________________
Axapta v.3.0 sp5 kr2 |
|
06.02.2015, 20:08 | #5 |
Участник
|
согласен с AndyD
вот читайте Change Management and TFS Integration for Multi-Developer Projects White paper |
|
06.02.2018, 19:24 | #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). |