Подотчет SSRS в tablix завершается ошибкой, когда значения нескольких параметров находятся за пределами значений подотчета - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть отчет SSRS 2012, который содержит подотчет в таблице.Я делаю это, чтобы предоставить копию подотчета для каждого из клиентов, выбранных в многозначном параметре @CustomerID основного отчета.

У меня есть набор данных «Клиенты», связанный с табликсом.После этого tablix передает поле с именем CustomerID параметру @CustomerID подотчета (в подотчете параметр @CustomerID не является многозначным).

Затем у меня есть 3 других многозначных параметра (@Assignedto, @OperationalArea и @SiteClass), которые мне нужно передать в подотчет.Я передаю их с помощью сопоставления параметров в свойствах вложенного отчета (например, Assignedto в вложенном отчете сопоставляется с параметрами! Assignedto.Value в основном отчете).

Моя проблема в том, что если у меня выбраны клиенты 1 и 2, а для трех параметров выбраны только те элементы, которые существуют для обоих клиентов, тогда подотчеты будут работать нормально.Однако, если я выбрал элемент в параметрах, который существует только для клиента 1, то вспомогательный отчет не будет выполняться для клиента 2 (даже если для клиента 2 также выбраны действительные позиции).Эта проблема возникает для всех трех многозначных параметров, которые передаются в подотчет.

Например:

  1. Клиенты 1 и 2 выбраны вместе с @Assignedto для выбора инженера1 и Инженер 2, которые оба являются допустимыми вариантами для Клиента 1 и Клиента 2. В этом случае будут отображаться подотчеты для Клиента 1 и 2.
  2. Заказчик 1 и 2 выбран вместе с выбором инженеров 1, 2, 3. Инженеры 1 и 2 действительны для обоих клиентов.Инженер 3 действителен только для клиента 1. В этом случае будет отображаться только подчиненный отчет для клиента 1, даже если есть данные для инженеров 1 и 2 для клиента 2. Я получаю сообщение об ошибке «Ошибка: подотчет не может бытьпоказано.

Когда я запускаю сам подотчет, он работает нормально, но значения для многозначных параметров определяются значением параметра @CustomerID (с использованием наборов данных), поэтомуЯ не могу выбрать значения вне допустимых значений для этого клиента.

Я запустил SQL для всех наборов данных в подотчете в SSMS, используя значения для параметров, которые находятся за пределами значений, существующих дляпокупатели.Все это работало нормально.

Я также пытался переключаться между использованием и неиспользованием функции соединения с параметрами набора данных в подотчете, но это ничего не делает.

Я также пытался передатьзначения многозначных параметров из основного отчета с использованием списка с разделителями-запятыми через запрос ниже, который ограничивает список действительными значениями для клиента.Это не решило проблему.

Я в растерянности, и любая помощь будет высоко ценится.

  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в наборе данных, который возвращает значения для многозначных параметров.Таким образом, теперь они могут иметь выбранные значения параметров, которые недопустимы для выбора клиента.Подотчет по-прежнему работает нормально.Поэтому проблема должна заключаться в том, как параметры передаются в подотчет.

1 Ответ

0 голосов
/ 11 декабря 2018

Решение этой проблемы, по-видимому, заключалось в том, что в подчиненном отчете можно было выбирать значения параметров, которые не были отфильтрованы с помощью CustomerID, и передавать параметр в форме [@Assignedto], а не в виде строки с разделителями илиФорма = Параметры! Назначено. Значение.

Я пробовал оба этих метода по отдельности, но безрезультатно, но при объединении они устранили проблему.

...