0

我有一个 SSRS 2012 报告,其中包含 tablix 中的子报告。我这样做是为了为主报告的多值@CustomerID 参数中选择的每个客户提供子报告的副本。

我有一个名为 Customers 的数据集,它链接到 tablix。从此,tablix 将名为 CustomerID 的字段传递给子报表的 @CustomerID 参数(在子报表中,@CustomerID 参数不是多值)。

然后,我需要将 3 个其他多值参数(@Assignedto、@OperationalArea 和 @SiteClass)传递给子报告。我通过使用子报告属性上的参数匹配来传递这些(例如,子报告中的 Assignedto 与主报告中的 Parameters!Assignedto.Value 匹配)。

我的问题是,如果我选择了客户 1 和 2,并且三个参数只选择了两个客户都存在的项目,那么子报告运行良好。但是,如果我在参数中选择了仅存在于客户 1 的项目,那么子报表将不会为客户 2 运行(即使也为客户 2 选择了有效项目)。传递给子报表的所有三个多值参数都会出现此问题。

例如:

  1. 客户 1 和 2 与工程师 1 和工程师 2 的 @Assignedto 选择一起选择,这两个选择都是客户 1 和客户 2 的有效选择。在这种情况下,将显示客户 1 和 2 的子报告。
  2. 客户 1 和 2 与工程师 1、2、3 一起选择。工程师 1 和 2 对两个客户都有效。工程师 3 仅对客户 1 有效。在这种情况下,即使客户 2 的工程师 1 和 2 有数据,也只会显示客户 1 的子报表。我收到一条错误消息,提示错误:无法子报表显示。

当我运行子报告本身时,它运行良好,但多值参数的值由@CustomerID 参数的值确定(使用数据集),因此我无法选择有效值之外的值顾客。

我已经为 SSMS 中的子报告中的所有数据集运行了 SQL,使用的参数值超出了客户存在的值。这些都运行良好。

我还尝试在子报告中使用和不使用带有数据集参数的连接函数之间进行切换,但这没有任何作用。

我还尝试通过以下查询使用逗号分隔列表从主报告传递多值参数值,这将列表限制为客户的有效值。这并没有解决问题。

我迷路了,任何帮助将不胜感激。

  IF OBJECT_ID('tempdb..#Data_Sub') IS NOT NULL DROP TABLE #Data_Sub;

Select distinct
        CustomerID
        ,[AssignedToUser]
        ,null as OperationalArea
        ,null as SiteClass
Into 
        #Data_Sub
from 
        [FAMSDB].[dbo].[Incidents_Full_PI] as IFPI
        inner join 
                    (
                            select 
                                        item 
                            from 
                                        [FAMSDB].[dbo].SplitToTable 
(@CustomerID,',')
                    ) as CID on IFPI.CustomerID = CID.item
where 
        ReportedFaultCode in ('SPD','SPO','SRD','SRO','SEO','SED')
        and CASE      when [AssignedToUser] in (select item from 
FAMSDB.dbo.SplitToTable(@Assignedto,',')) then 1
                      else 0
                      end = 1
Union
Select distinct
        CustomerID
        ,null
        ,OperationalArea
        ,null
from 
        [FAMSDB].[dbo].[Incidents_Full_PI] as IFPI
        inner join 
                    (
                            select 
                                        item 
                            from 
                                        [FAMSDB].[dbo].SplitToTable 
(@CustomerID,',')
                    ) as CID on IFPI.CustomerID = CID.item
where 
        ReportedFaultCode in ('SPD','SPO','SRD','SRO','SEO','SED')
        and CASE     when [OperationalArea] in (select item from 
FAMSDB.dbo.SplitToTable(@OperationalArea,',')) then 1
                     else 0
                     end = 1
Union
Select distinct
        CustomerID
        ,null
        ,null
        ,SiteClass
from 
        [FAMSDB].[dbo].[Incidents_Full_PI] as IFPI
        inner join 
                    (
                            select 
                                        item 
                            from 
                                        [FAMSDB].[dbo].SplitToTable 
(@CustomerID,',')
                    ) as CID on IFPI.CustomerID = CID.item
where 
        ReportedFaultCode in ('SPD','SPO','SRD','SRO','SEO','SED')
         and CASE     when [SiteClass] in (select item from 
FAMSDB.dbo.SplitToTable(@SiteClass,',')) then 1
                     else 0
                     end = 1
union
select 
        item 
        ,case   when 'Unassigned' in (select item from 
 FAMSDB.dbo.SplitToTable(@Assignedto,',')) then 'Unassigned' 
                else null
                end 
        ,case   when 'Unassigned' in (select item from 
FAMSDB.dbo.SplitToTable(@OperationalArea,',')) then 'Unassigned' 
                else null
                end
        ,case   when 'Unassigned' in (select item from 
FAMSDB.dbo.SplitToTable(@SiteClass,',')) then 'Unassigned' 
                else null
                end
from 
        [FAMSDB].[dbo].SplitToTable (@CustomerID,',')

union
select 
        item 
        ,case   when 'N/A' in (select item from 
FAMSDB.dbo.SplitToTable(@Assignedto,',')) then 'N/A' 
                else null
                end 
        ,case   when 'N/A' in (select item from 
 FAMSDB.dbo.SplitToTable(@OperationalArea,',')) then 'N/A' 
                else null
                end
        ,case   when 'N/A' in (select item from 
 FAMSDB.dbo.SplitToTable(@SiteClass,',')) then 'N/A' 
                else null
                end
from 
        [FAMSDB].[dbo].SplitToTable (@CustomerID,',')


Select
        CustomerID
        ,AssignedToUser
        ,OperationalArea
        ,SiteClass
From
    (
        Select distinct
                CustomerID
                ,case   when len((Select [AssignedToUser]+',' From(Select 
Distinct CustomerID,[AssignedToUser] From #Data_Sub) as b Where b.CustomerID 
= a.CustomerID For XML Path('')))=0 then null
                        else LEft((Select 
                                [AssignedToUser]+','
                        From
                                (
                                    Select Distinct
                                        CustomerID
                                        ,[AssignedToUser]   
                                    From
                                            #Data_Sub
                                ) as b
                        Where
                                b.CustomerID = a.CustomerID
                        For XML Path(''))
                        ,len((Select 
                                        [AssignedToUser]+','
                                From
                                        (
                                            Select Distinct
                                                CustomerID
                                                ,[AssignedToUser]   
                                            From
                                                    #Data_Sub
                                        ) as b
                                Where
                                        b.CustomerID = a.CustomerID
                                For XML Path('')))-1
                    ) end as AssignedToUser
                 ,case  when len((Select [OperationalArea]+',' From(Select 
Distinct CustomerID,[OperationalArea] From #Data_Sub) as b Where 
b.CustomerID = a.CustomerID For XML Path('')))=0 then null
                        else left((Select 
                                [OperationalArea]+','
                        From
                                (
                                    Select Distinct
                                        CustomerID
                                        ,[OperationalArea]  
                                    From
                                            #Data_Sub
                                ) as b
                        Where
                                b.CustomerID = a.CustomerID
                    For XML Path('')),
                        lEn((Select 
                                        [OperationalArea]+','
                                From
                                        (
                                            Select Distinct
                                                CustomerID
                                                ,[OperationalArea]  
                                            From
                                                    #Data_Sub
                                        ) as b
                                Where
                                        b.CustomerID = a.CustomerID
                                For XML Path('')))-1
                        ) end as OperationalArea
                ,case   when len((Select [SiteClass]+',' From(Select 
Distinct CustomerID,[SiteClass] From #Data_Sub) as b Where b.CustomerID = 
a.CustomerID For XML Path('')))=0 then null
                        else Left((Select 
                                 [SiteClass]+','
                        From
                                (
                                    Select Distinct
                                        CustomerID
                                        ,[SiteClass]    
                                    From
                                            #Data_Sub
                                ) as b
                        Where
                                b.CustomerID = a.CustomerID
                        For XML Path(''))
                    ,len((Select 
                                 [SiteClass]+','
                        From
                                (
                                    Select Distinct
                                        CustomerID
                                        ,[SiteClass]    
                                    From
                                            #Data_Sub
                                ) as b
                        Where
                                b.CustomerID = a.CustomerID
                        For XML Path('')))-1
                    ) end as SiteClass
        From
                #Data_Sub as a
    ) as ConcatSub
where
        AssignedToUser is not null
        and OperationalArea is not null
        and SiteClass is not null    

编辑:我没有通过删除返回多值参数值的数据集上的 CustomerID 过滤器来测试子报告。因此,他们现在可以选择对客户选择无效的参数值。子报告仍然运行良好。因此,问题必须在于如何将参数传递给子报告。

4

1 回答 1

0

对此的解决方案似乎是让子报告能够选择未被 CustomerID 过滤的参数值,并以 [@Assignedto] 形式而不是作为分隔字符串或 =Parameters 传递参数!Assignedto.Value 形式。

我分别尝试了这两种方法都没有结果,但是当它们结合起来时,它们已经解决了问题。

于 2018-12-11T10:46:04.197 回答