当*.rdl文件是机密文件时,我如何确定子报表的来源

本文关键字:文件 何确定 报表 rdl 机密 | 更新日期: 2023-09-27 18:27:09

我正在使用SQL Server报表生成器中创建的报表所使用的相同数据源生成电子表格。我下载了报告的*.rdl文件,并使用它生成的三个数据集,其中两个来自简单查询,一个来自复杂的存储过程。

*.rdl文件和MS SQL Server报表生成器中的项目都向我表明,只有这两个查询和存储过程与此报表明显相关。

我成功地获得了所有这些数据——这两个查询提供了我用来填充组合框的值,而存储过程返回了我在报告的"摘要"部分中使用的几个字段。

然而,我可以从SSRS(网页)或直接从报表生成器生成的遗留报表也可以在"摘要"部分下方打印"详细信息"部分。

我不知道这些数据来自哪里——*.rdl文件只包含对"子报表"的引用作为线索:

   <Subreport Name="subreport1">
        <Parameters>
          <Parameter Name="BegDate">
            <Value>=Parameters!BegDate.Value</Value>
          </Parameter>
          <Parameter Name="EndDate">
            <Value>=Parameters!EndDate.Value</Value>
          </Parameter>
          <Parameter Name="Member">
            <Value>=Parameters!Member.Value</Value>
          </Parameter>
          <Parameter Name="Unit">
            <Value>=Parameters!Unit.Value</Value>
          </Parameter>
          <Parameter Name="Type">
            <Value>=Fields!T.Value</Value>
          </Parameter>
        </Parameters>
        . . .

我不提供"Type"参数——我使用其他四个参数获得"Summary"数据。并且子报表中显示的值不会出现在*.rdl文件中。这些可能是从哪里来的?

我以这种方式查找存储过程的返回值:

string[] columnNames = dtPriceComplianceResults.Columns.Cast<DataColumn>()
    .Select(x => x.ColumnName)
    .ToArray();
if (columnNames.Length > 5)
{
    MessageBox.Show("more than 5");
    // TODO: If there are more fields, use these to generate the "Details" section of the report
}

但它从来没有超过用于填充报告/电子表格的"摘要"部分的几个字段。

如果我给"Type"参数提供一个值,我可能会得到更多的数据吗?即便如此,*.rdl文件中似乎没有引用该子报表的数据源,这让我非常烦恼/困惑。

更新

是否可能在*.rdl文件中为用户权限提供了"Type"参数?(我现在在家,无法查看,但我想知道这是否是*.rdl文件的常见模式,或者至少是可能的模式)。

如果是这样,那么Type参数可能会返回这些附加字段。

当*.rdl文件是机密文件时,我如何确定子报表的来源

rdl中的<Subreport>元素有一个必需的<ReportName>子元素。

如果查看该元素的值,它应该有一个子报表的路径(根据SSRS服务器上的伪文件夹)。您应该能够转到SSRS服务器上的该路径,并像下载主报表一样下载子报表的RDL文件。

我创建了一些测试报告和子报告来检查这一点。然后我在网上搜索了一些文档——它不是所以是秘密的,但也不那么容易找到。

RDL文件XML的模式清楚地表明<ReportName><Subreport>所必需的元素。

RDL文件XML模式