вот набросал на скорую джоб который находит 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");
}