Показать сообщение отдельно
Старый 26.06.2014, 17:08   #6  
bio_unit is offline
bio_unit
Участник
Аватар для bio_unit
Сотрудники компании GMCS
Ex AND Project
 
119 / 77 (3) ++++
Регистрация: 21.04.2004
вот набросал на скорую джоб который находит 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).