Search code examples
c#reporting-servicestfstfs-sdk

Generate reports programmatically using the TFS API and SSRS


Is there a simple approach in generating reports, either in PDF, Excel, Word or TIFF formats using the TFS API and SSRS? I can generate the reports manually by selecting the parameters from the combo boxes using the SSRS dashboard for TFS but I would like to include an export button to my web application so that I can easily bypass Team Web Access for generating reports. Any ideas?

I have read on this post that I could use the ReportExecutionService class from SSRS, so I was wondering if this could be used from the TFS server.

I have imported the namespace using this web service reference: http://<TFS server>/reportserver/ReportExecution2005.asmx


Solution

  • I have found out a way to generate reports using the ReportExecutionService web service. Provided that a web service reference was added to the project already, this will generate a file with the given parameters. Here the start and end dates are provided as parameters and the report is generated using the Render() method.

    private void GenerateReport()
    {
        ReportExecutionService rs = new ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        rs.Url = "http://<TFS server name>/reportserver/ReportExecution2005.asmx";
    
        // Render arguments
        byte[] result = null;
        string reportPath = @"<SSRS report path>";
        string format = "PDF";
        string historyID = null;
        string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
    
        // Prepare report parameter.
        ParameterValue[] parameters = new ParameterValue[2];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "StartDateParam";
        parameters[0].Value = "2012-06-01 00:00:00";
        parameters[1] = new ParameterValue();
        parameters[1].Name = "EndDateParam";
        parameters[1].Value = "2012-09-01 00:00:00";
        parameters[2] = new ParameterValue();
        parameters[2].Name = "AreaParam";
        parameters[2].Value = "[Work Item].[Area Hierarchy].[All]";
        parameters[3] = new ParameterValue();
        parameters[3].Name = "WorkItemTypeParam";
        parameters[3].Value = "[Work Item].[System_WorkItemType].&[Task]";
        parameters[4] = new ParameterValue();
        parameters[4].Name = "StateParam";
        parameters[4].Value = "[Work Item].[System_State].&[Active]";
        parameters[5] = new ParameterValue();
        parameters[5].Name = "TrendLineParam";
        parameters[5].Value = "both";
    
        DataSourceCredentials[] credentials = null;
        string showHideToggle = null;
        string encoding;
        string mimeType;
        string extension;
        Warning[] warnings = null;
        ParameterValue[] reportHistoryParameters = null;
        string[] streamIDs = null;
    
        ExecutionInfo execInfo = new ExecutionInfo();
        ExecutionHeader execHeader = new ExecutionHeader();
    
        rs.ExecutionHeaderValue = execHeader;
    
        execInfo = rs.LoadReport(reportPath, historyID);
    
        var parameters_ = rs.GetExecutionInfo().Parameters;
    
        rs.SetExecutionParameters(parameters, "en-us"); 
        String SessionId = rs.ExecutionHeaderValue.ExecutionID;
    
        Console.WriteLine("SessionID: {0}", rs.ExecutionHeaderValue.ExecutionID);
    
        try
        {
            result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
    
            execInfo = rs.GetExecutionInfo();
    
            Console.WriteLine("Execution date and time: {0}", execInfo.ExecutionDateTime);
    
        }
        catch (SoapException e)
        {
            Console.WriteLine(e.Detail.OuterXml);
        }
        // Write the contents of the report to an MHTML file.
        try
        {
            FileStream stream = File.Create("report.pdf", result.Length);
            Console.WriteLine("File created.");
            stream.Write(result, 0, result.Length);
            Console.WriteLine("Result written to the file.");
            stream.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    
    }
    

    By the way, the values set for the parameters are MDX queries and I haven't found out yet how to set a specific AreaPath, so for now only I can list 'All'.