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

Обсуждение Stimulsoft Reports.NET
Ответить
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

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

Сообщение Андрей Сакольчик »

Добрый день.
Для начала оговорюсь, что честно поискал в мануалах и форуме, но решения не нашел.
Суть в следующем: создаю в словаре переменную, которая должна инициализироваться выражением - фактически ей надо присвоить значение поля, расположенного на ReportSummaryBand. Если в выражении писать Text10.Text, компилятор ругается "Ссылка на объект не указывает на экземпляр объекта." Перепробовал кучу вариантов обращения к содержимому поля - непротык. Как посоветуете обратиться к полю из редактора текста выражения переменной?
Спасибо.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

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

Сообщение 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();
            }
Более конкретные рекомендации мы сможем дать, если вы пришлёте нам пример отчёта, который воспроизводит вашу проблему.

Спасибо.
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

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

Сообщение Андрей Сакольчик »

Благодарю за развернутый ответ.
Пример отчета приаттачил. Переменная Condition1 планируется для использования в дочерних отчетах в качестве фильтра для источника данных.
Есть компонент шаблона, который содержит выражения для вычисления. А есть компоненты, которые находятся уже на страницах отрендеренного отчёта.
В моем случае поле, из которого надо записать в переменную содержит константу (просто текст), ее вычислять не требуется.
Если текстовый компонент находится на бэнде, то на страницах отрендеренного отчёта будет столько же экземпляров компонента с таким именем, сколько строк в источнике данных бэнда.
Экземпляр поля Text1, по идее, в отрендеренном отчете создается один.
А, вообще, если несу чушь, то прошу простить - в голове пока полная каша. Никогда раньше не занимался построением отчетов.
Вложения
smpl_rep.mrt
(8.95 КБ) 343 скачивания
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

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

Сообщение HighAley »

Здравствуйте.

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

Спасибо.
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

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

Сообщение Андрей Сакольчик »

А что вам мешает задать значение переменной, а потом её отобразить в Text1?
Да, спасибо, я до этого уже сам допер. И, все-таки, в будущем, наверное, может возникнуть потребность использовать вычисленные или статические значения полей отчета.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

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

Сообщение HighAley »

Здравствуйте.

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

Спасибо.
Ответить