|
![]() |
#1 |
Участник
|
Скорее всего без самописного джоба в данном случае не обойтись. Я имею в виду теоретически можно сделать джоб который получит на вход имя отчета и переберет все VS Model Projects и найдет проекты, в которых встречается данный отчет.
В TechNet Микрософт предлагает смотреть их список по соответствию отчет<->проект http://technet.microsoft.com/en-us/l.../hh496433.aspx "When you know the name of the report that you want to edit, use this list to find the name of the reporting project that contains the report. You should open the project that contains the report that you want to edit. " |
|
![]() |
#2 |
Участник
|
|
|
![]() |
#3 |
Участник
|
есть системный класс VSProjectNode, который может быть использован для получения данных по узлу VS Project в AOT
на форуме были примеры кода по перебору элементов дерева AOT... |
|
![]() |
#4 |
Участник
|
http://erpkb.com/Axapta/KakProgramno...rzhanieProekta
теоретически, думаю, эти наработки можно использовать для перебора элементов VS Project |
|
![]() |
#5 |
Участник
|
вот набросал на скорую джоб который находит VS проект для SSRS отчета
сделано по мотивам класса SysUpgrade60ReportProject X++: static void findSSRSReport(Args _args) { #AOT #SysManagedCode #define.Report_ReferencesAttrib('Include') #define.ProjectContent("Project Content") str ssrsReportNameToFind = "TaxTable"; str referencedProjects; TreeNode projectsRootNode = TreeNode::findNode(#VSProjectsAXModelPath); TreeNodeIterator iter = projectsRootNode.AOTiterator(); TreeNode projectType = iter.next(); TreeNode child; TreeNode childReports; VSProjectNode project = null; str projectPath; TreeNode projectContentNode; str aotName, projectContent; XmlDocument projectDoc; XmlNode projectRefNode; XmlNode xmlAttribute; str ssrsReportAotName, ssrsReportAotNameUpper; str xpath; XmlNodeList reportReferences; int nodeIndex; int basePathLen = strLen(#SSRSReportsPath + #AOTDelimiter); XmlNamespaceManager nsmgr; str namespaceUri = #MSBuildURL; str nsPrefix = 'cs'; boolean found = false; str stripByteOrderInfo(str xml) { int offset; // The xml string has some special chars and we need to trim it. if (xml) { xml = strrtrim(strltrim(xml)); offset = strscan(xml, @"<Project", 0, strlen(xml)); // Remove everything before the "<?xml" tag if (offset > 0) { xml = substr(xml, offset, strlen(xml)); } } return xml; } while(projectType) { projectPath = projectType.treeNodePath(); project = TreeNode::findNode(projectPath); if(project) { projectContentNode = project.AOTfindChild(#VSProjectContentFolder); aotName = project.AOTname(); // Find the project file node projectContentNode = projectContentNode.AOTfindChild(aotName + #VSProjectsAXModelProjectFileExtension); if(projectContentNode) { // load the project file content from the project file node projectContent = projectContentNode.AOTgetSource(); if (projectContent) { projectContent = stripByteOrderInfo(projectContent); // load project file content into XML document. projectDoc = new XmlDocument(); if (projectDoc.loadXml(projectContent)) { // catalog report references in the XmlDocument nsmgr = new XmlNamespaceManager(projectDoc.NameTable()); nsmgr.addNamespace(nsPrefix, namespaceUri); xpath = strFmt('//cs:Compile/@Include[contains(., \'%1\')]/parent::node()', #SSRSReportsRootPath); reportReferences = projectDoc.selectNodes(xpath, nsmgr); for (nodeIndex = 0; nodeIndex < reportReferences.length(); nodeIndex++) { projectRefNode = reportReferences.item(nodeIndex); xmlAttribute = projectRefNode.attributes().getNamedItem(#Report_ReferencesAttrib); if (xmlAttribute) { // update attribute if new value is different ssrsReportAotName = xmlAttribute.innerText(); ssrsReportAotName = strDel(xmlAttribute.innerText(), 0, basePathLen); ssrsReportAotNameUpper = strUpr(ssrsReportAotName); if (ssrsReportAotName == ssrsReportNameToFind) { found = true; break; } } } } } } } if (found) break; projectType = iter.next(); } if (found) info (projectPath); else info ("Not found"); } |
|
|
За это сообщение автора поблагодарили: mazzy (5), sukhanchik (4). |
|
|