|
26.06.2014, 14:30 | #1 |
Участник
|
есть системный класс VSProjectNode, который может быть использован для получения данных по узлу VS Project в AOT
на форуме были примеры кода по перебору элементов дерева AOT... |
|
26.06.2014, 14:33 | #2 |
Участник
|
http://erpkb.com/Axapta/KakProgramno...rzhanieProekta
теоретически, думаю, эти наработки можно использовать для перебора элементов VS Project |
|
26.06.2014, 17:08 | #3 |
Участник
|
вот набросал на скорую джоб который находит 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). |
|
|