Как создать агрегированное выражение текстового поля отчета в SQL Server Reporting? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть отчет служб отчетов SQL Server, в котором есть таблица с множеством полей, а затем текстовое поле, в котором я хочу отобразить общий вес. Теперь общий вес определяется огромным выражением:

=Sum(Round(Code.ConvertWgt(Switch(Parameters!OrderLength.Value = 
"T",Fields!TotalTheorWeight.Value
    ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
    ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
    ,Parameters!OrderLength.Value = 
"OD",Switch(Fields!Calculate_Weight_Using_ID.Value = 
"T",Fields!TotalTheorWeight.Value                                    
,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
)
),Switch(Parameters!WeightUnit.Value = "orderdflt"
,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",Fields!Weight_Precision.Value,Parameters!WeightPrecision.Value))))

Однако при предварительном просмотре отчета я вижу следующую ошибку:

Выражение «Значение» для текстового поля «TotalWeight» использует статистическое выражение без области действия. Область действия требуется для всех агрегатов, используемых за пределами области данных, если отчет не содержит ровно один набор данных.

Поэтому я попытался исправить это, изменив его на:

=Sum(IiF(Round(Code.ConvertWgt(Switch(Parameters!OrderLength.Value = 
"T",Fields!TotalTheorWeight.Value
    ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
    ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
,Parameters!OrderLength.Value = "OD",Switch(Fields!Calculate_Weight_Using_ID.Value = "T",Fields!TotalTheorWeight.Value
                                            ,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
                                            ,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
    )
),Switch(Parameters!WeightUnit.Value = "orderdflt"
    ,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
    ,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",Fields!Weight_Precision.Value,Parameters!WeightPrecision.Value)))), "Order")

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

Выражение Value для textrun ‘TotalWeight.Paragraphs [0] .TextRuns [0]’ содержит ошибку: [BC30516] Не удалось разрешить перегрузку, поскольку ни один доступный «IIf» не принимает это количество аргументов.

Как мне исправить это? Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2019

IIF похож на IF в Excel - где = IF ([какой-то тест], [если true, сделайте это], [если false - сделать это]) ... так что, исходя из имеющихся у вас скобок и запятых, вы в основном опуская [если true, сделайте это] и [если false сделайте это], вот почему вы получаете второе сообщение об ошибке о недостаточности аргументов.

Что касается исходного сообщения об ошибке, вместо использования текстового поля, вы можете ввести в пустую таблицу с одной строкой и одним столбцом и подключить его к набору данных?

Или вы задумывались о том, чтобы установить это значение в наборе данных - затем установить для этого набора данных значение параметра, а затем использовать параметр в текстовом поле?

Вы также можете покопаться в этой статье: https://docs.microsoft.com/en-us/sql/reporting-services/report-design/built-in-collections-reportitems-collection-references-report-builder?view=sql-server-2017

Или этот перекрестный вопрос здесь - я думаю, это то, что вам нужно сделать: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/7d1c401c-e31d-4bc5-8c89-8684e63d3cd3/rsfieldreference-the-value-expression-for-the-textbox-8216allcustomcpi18217-refers-to-the?forum=sqlreportingservices

0 голосов
/ 21 июня 2019

Таким образом, для адресации каждого выражения первая ошибка указывает на то, что вам нужно указать область действия для совокупности SUM.Это так же просто, как добавление имени набора данных, откуда поступают данные, внутри последней круглой скобки.Вам нужно будет добавить ..., "YourDatasetName"), чтобы сработало следующее - хотя у такого сложного выражения обязательно будут другие проблемы.Например, мы не можем знать, будет ли ConvertWgt работать правильно, не зная, что требуется для параметров.

=Sum(Round(
    Code.ConvertWgt(
    Switch(
        Parameters!OrderLength.Value = "T", Fields!TotalTheorWeight.Value
        ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
        ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
        ,Parameters!OrderLength.Value = "OD",
            Switch( Fields!Calculate_Weight_Using_ID.Value = "T",Fields!TotalTheorWeight.Value                                    
                    ,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
                    ,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
                  )
          ),Switch(Parameters!WeightUnit.Value = "orderdflt"
    ,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
    ,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",
              Fields!Weight_Precision.Value,
              Parameters!WeightPrecision.Value)))
    , "Order")

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...