Using Expression Values in Variable

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

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

Иногда возникает необходимость использовать результат выражения (рассчитанное значение) в переменной. Рассмотрим пример. Допустим есть выражение {x+y}, которое расположено в текстовом компонент Text10. Для того чтобы использовать результат этого выражения в переменной недостаточно указать ссылку {Text10.Text}. Потому как обращение, в данном случае, будет не к результату выражения, а к текстовому выражению в шаблоне отчета. Для использования результата выражения в переменной, следует воспользоваться одним из следующих вариантов:

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

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

  • Также можно после построения всего отчета, в событии 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();
            }