我有一个 SSRS 2012 报告,其中包含 tablix 中的子报告。我这样做是为了为主报告的多值@CustomerID 参数中选择的每个客户提供子报告的副本。
我有一个名为 Customers 的数据集,它链接到 tablix。从此,tablix 将名为 CustomerID 的字段传递给子报表的 @CustomerID 参数(在子报表中,@CustomerID 参数不是多值)。
然后,我需要将 3 个其他多值参数(@Assignedto、@OperationalArea 和 @SiteClass)传递给子报告。我通过使用子报告属性上的参数匹配来传递这些(例如,子报告中的 Assignedto 与主报告中的 Parameters!Assignedto.Value 匹配)。
我的问题是,如果我选择了客户 1 和 2,并且三个参数只选择了两个客户都存在的项目,那么子报告运行良好。但是,如果我在参数中选择了仅存在于客户 1 的项目,那么子报表将不会为客户 2 运行(即使也为客户 2 选择了有效项目)。传递给子报表的所有三个多值参数都会出现此问题。
例如:
- 客户 1 和 2 与工程师 1 和工程师 2 的 @Assignedto 选择一起选择,这两个选择都是客户 1 和客户 2 的有效选择。在这种情况下,将显示客户 1 和 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 过滤器来测试子报告。因此,他们现在可以选择对客户选择无效的参数值。子报告仍然运行良好。因此,问题必须在于如何将参数传递给子报告。