Страница 1 из 1

Подстановка значения поля отчета в выражение переменной.

Добавлено: 14 май 2014, 15:12
Андрей Сакольчик
Добрый день.
Для начала оговорюсь, что честно поискал в мануалах и форуме, но решения не нашел.
Суть в следующем: создаю в словаре переменную, которая должна инициализироваться выражением - фактически ей надо присвоить значение поля, расположенного на ReportSummaryBand. Если в выражении писать Text10.Text, компилятор ругается "Ссылка на объект не указывает на экземпляр объекта." Перепробовал кучу вариантов обращения к содержимому поля - непротык. Как посоветуете обратиться к полю из редактора текста выражения переменной?
Спасибо.

Re: Подстановка значения поля отчета в выражение переменной.

Добавлено: 15 май 2014, 10:16
HighAley
Здравствуйте.
Андрей Сакольчик писал(а):Для начала оговорюсь, что честно поискал в мануалах и форуме, но решения не нашел.
Суть в следующем: создаю в словаре переменную, которая должна инициализироваться выражением - фактически ей надо присвоить значение поля, расположенного на ReportSummaryBand. Если в выражении писать Text10.Text, компилятор ругается "Ссылка на объект не указывает на экземпляр объекта." Перепробовал кучу вариантов обращения к содержимому поля - непротык. Как посоветуете обратиться к полю из редактора текста выражения переменной?
Для начала давайте разберёмся с понятиями.
Есть компонент шаблона, который содержит выражения для вычисления. А есть компоненты, которые находятся уже на страницах отрендеренного отчёта.
Во время построения отчета движок генератора отчетов берёт выражение из компонента шаблона, вычисляет его и записывает полученное значение в компонент на странице, которая в текущий момент рендерится.
Если текстовый компонент находится на бэнде, то на страницах отрендеренного отчёта будет столько же экземпляров компонента с таким именем, сколько строк в источнике данных бэнда.

Поэтому с помощью выражения {Text10.Text} вы получите текстовое значение выражения, которое содержится в шаблоне отчёта, а не в построенном отчёте.

Далее, надо знать, в каком месте и в какое время вы хотите использовать значение.
Значение выражения высчитывается в момент рендеринга данного компонента (кроме сумм по бэнду/странице, которые высчитываются после полного построения бэнда/отчета).
Порядок обработки компонентов определяется деревом отчета: чем выше компонент в дереве, тем раньше построится.

Поэтому возможны следующие варианты:

1. Если вы хотите получить значение компонента до его отрисовки, то надо: либо использовать такое же выражение, как в компоненте, либо использовать два прохода (на первом рассчитать, на втором использовать).

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

3. Ещё один вариант - после построения всего отчета, в событии EndRender пробежаться по всем компонентам построенного отчёта и сделать необходимые вычисления.
Вот пример скрипта, который подсчитывает сумму по странице для специфического случая - у бэнда установлено свойство Can Break и заранее неизвестно, на какой странице окажется текстовый компонент.

Код: Выделить всё

foreach (StiPage page in RenderedPages)
            {
                StiText sumComp = null;
                foreach (StiComponent component in page.Components)
                {
                    if (component.Name == "sum_comp")
                    {
                        sumComp = component as StiText;
                        break;
                    }
                }

                double sum = 0;
                foreach (StiComponent comp in page.Components)
                {
                    if (comp.Name == "aaa")
                    {
                        sum += (double)(comp as StiText).TagValue;
                    }
                }
                sumComp.Text = sum.ToString();
            }
Более конкретные рекомендации мы сможем дать, если вы пришлёте нам пример отчёта, который воспроизводит вашу проблему.

Спасибо.

Re: Подстановка значения поля отчета в выражение переменной.

Добавлено: 15 май 2014, 11:37
Андрей Сакольчик
Благодарю за развернутый ответ.
Пример отчета приаттачил. Переменная Condition1 планируется для использования в дочерних отчетах в качестве фильтра для источника данных.
Есть компонент шаблона, который содержит выражения для вычисления. А есть компоненты, которые находятся уже на страницах отрендеренного отчёта.
В моем случае поле, из которого надо записать в переменную содержит константу (просто текст), ее вычислять не требуется.
Если текстовый компонент находится на бэнде, то на страницах отрендеренного отчёта будет столько же экземпляров компонента с таким именем, сколько строк в источнике данных бэнда.
Экземпляр поля Text1, по идее, в отрендеренном отчете создается один.
А, вообще, если несу чушь, то прошу простить - в голове пока полная каша. Никогда раньше не занимался построением отчетов.

Re: Подстановка значения поля отчета в выражение переменной.

Добавлено: 15 май 2014, 13:25
HighAley
Здравствуйте.

А что вам мешает задать значение переменной, а потом её отобразить в Text1?

Спасибо.

Re: Подстановка значения поля отчета в выражение переменной.

Добавлено: 15 май 2014, 15:02
Андрей Сакольчик
А что вам мешает задать значение переменной, а потом её отобразить в Text1?
Да, спасибо, я до этого уже сам допер. И, все-таки, в будущем, наверное, может возникнуть потребность использовать вычисленные или статические значения полей отчета.

Re: Подстановка значения поля отчета в выражение переменной.

Добавлено: 16 май 2014, 09:26
HighAley
Здравствуйте.

Ответ на ваш вопрос зависит от конкретной ситуации. Как правило проще использовать аналогичное выражение либо переменную.

Спасибо.