Настройка формул

Оценить
(0 голоса)

RDC предоставляет дополнительную степень гибкости, позволяя контролировать содержимое объектов Report во время обработки записей отчетом (см. разделы “Изменение текстовых объектов во время выполнения” и “Условное форматирование и форматирование разделов” далее в этой главе). Благодаря этому ваш отчет может содержать объекты, отображающие результаты вычислений й процедур Visual Basic. Однако все-таки более простой способ предполагает изменение содержимого формул Crystal Reports динамически, во время выполнения. Такой способ подойдет для изменения формул, относящихся к группам, которые также можно изменять в коде, для изменения формулы, которая отображает в отчете тот или иной текст, или для изменения формулы, выполняющей математические вычисления или отвечающей за условное форматирование в отчете.

Порядок настройки формул во время выполнения подобен настройке формулы выборки записей во время выполнения (о чем подробно рассказывалось в предыдущем разделе). Естественно, для этого от вас потребуется знание языка формул Crystal Reports. Если вы уже успели позабыть этот материал, вернитесь к главе 5.

Предоставляемый RDC объект Report содержит коллекцию FormulaFields, которая может считываться или записываться во время выполнения. Эта коллекция возвращает множество объектов FormulaFieldDef inition, по одному для каждой определенной в отчете формулы. Хотя из объекта FormulaFieldDef inition можно извлечь достаточно большой объем информации, самый простой способ изменить содержимое формулы — это просто установить свойство Text для того элемента коллекции, который вы хотите изменить. Нумерация в коллекции начинается с единицы, а каждый член коллекции соответствует своему положению в списке полей формулы.

В приложении Xtreme Orders формула Order+Tax изменяется в зависимости от того, что пользователь вводит в текстовом поле Tax Rate (Ставка налога). Эта формула изменяется с помощью следующего кода:

' Настройка формулы Set @Order + Tax

If txtTaxRate = "" Then

Report.FormulaFields(1).Text = "{Orders.Order Amount}"

Else

Report.FormulaFields(1).Text = "{Orders.Order Amount} * " &_

Str(txtTaxRate / 100 + 1)

End If 'txtTaxRate = ""

Изменять свойство потребуется только для тех формул, которые вы хотите модифицировать во время выполнения. Имейте в виду, что имя формулы нельзя определять в виде аргумента индекса коллекции — для этого необходимо использовать номер индекса, начинающийся с единицы. Его можно определить по номеру позиции, в которой находится формула в списке формул в окне проектирования RDC: первая формула имеет индекс 1, пятая — 5 и так далее. Пример ссылки по имени формулы мы уже рассматривали в этой главе.

Свойству Text необходимо присваивать строковое выражение или переменную в строгом соответствии с синтаксисом формул Crystal Reports. Это свойство несет в себе новый текст формулы. Прежде чем присваивать какое-то значение формуле, необходимо учесть следующее. В Crystal Reports формула “Order + Tax” определена как числовая формула. Поэтому вы должны передать ей формулу, выраженную в числовой форме.

Если пользователь оставит текстовое поле пустым, это будет означать, что какой-либо дополнительный налог на продажу отсутствует. Значит, формула получит поле базы данных Order Amount и отобразит ту же сумму, что и поле базы данных.

Однако если пользователь введет ставку налога, то это значение будет разделено на 100, и к полученному результату будет прибавлена единица. В итоге будет получено число соответствующего типа, которое и будет использоваться для умножения напротив поля Order Amount, чтобы правильно вычислить ставку налога. Например, если пользователь определит ставку налога, равную 5 (пятипроцентный налог), тогда значение будет изменено на 1.05 и после этого будет объединено с оператором умножения и полем Order Amount в формуле.

Вы также можете захотеть показать в отчете какой-нибудь настроенный с помощью кода текст (например, комбинацию критериев, предоставляемых пользовательским интерфейсом вашего приложения). Хотя это можно сделать и посредством строковой формулы, поддерживаемая RDC возможность работы с текстовыми объектами во время выполнения позволяет решить данный вопрос по-другому. Поэтому в примере приложения Xtreme Orders формулы для этой цели не используются. В следующем разделе мы расскажем о том, как подобные задачи выполняются с помощью текстовых объектов.

Совет. В Crystal Reports XI имеется два варианта синтаксиса формул: синтаксис Crystal, совместимый с Crystal Reports 7 и более ранними версиями, и синтаксис Basic, который появился в версии Crystal Reports 8. Если вы хотите узнать, на основе какого синтаксиса составлена формула, выполните некоторый код, чтобы обратиться к формуле (попробуйте, например, получить свойство Text). Затем, чтобы определить синтаксис формулы, необходимо получить свойство LastGetFormulaSyntax объекта Report. Если вам необходимо подготовить какую-то формулу в определенном синтаксисе, сначала установите свойство FormulaSyntax объекта Report. Затем определите содержимое формулы, передав свойству Text текст определенного синтаксиса.

Изменение текстовых объектов во время выполнения

Не забывайте о том, что если вы добавляете в отчет какой-нибудь объект (поле, формулу, текстовый или другой объект), то с ним можно работать в коде VB. Данный объект будет иметь свойства, которые можно определять в диалоговом окне Property на этапе разработки и изменять во время выполнения. Если в отчет добавить текстовый объект, то объект TextObject будет доступен в рамках всего объекта Report. Объект TextObject имеет множество свойств (большинство из них можно найти в диалоговом окне Properties), которые можно изменять во время выполнения.

Манипулировать содержимым текстового объекта можно посредством свойств и методов. Свойство Text можно считывать во время выполнения кода, узнавая тем самым о содержимом текстового объекта. Чтобы изменить содержимое текстового объекта, необходимо во время выполнения использовать метод SetText объекта TextObject.

В приложении-примере Xtreme Orders в заголовок отчета был помещен текстовый объект с именем SubHeading. Следующий код демонстрирует, как можно настроить этот текстовый объект так, чтобы он отображал значения, которые пользователь выбирает на форме Print Xtreme Orders. Этот код предполагает, что где-то в приложении уже была объявлена строковая переменная strSubheading. Вы также заметите ссылки на такие элементы управления в форме, как текстовые объекты и поля со списком.

' Настройка текстового объекта SubHeading strSubHeading = txtFromDate & " through " & txtToDate strSubHeading = strSubHeading & ", By " & cboGroupBy If txtTaxRate = "" Then

strSubHeading = strSubHeading & ", No Tax"

Else

strSubHeading = strSubHeading & ", Sales Tax = " & txtTaxRate & "%"

End If 'txtTaxRate = ""

Report.SubHeading.SetText (strSubHeading)

1 Обратите внимание: скобки, в которые заключен аргумент метода SetText, являются необязательными, поскольку вы можете изменить содержимое текстового объекта из VB-кода, значит, вы, по сути, можете с использованием RDC создать в отчете “VB-формулы”. Каждый раздел отчета будет генерировать событие Format при его обработке во время выполнения отчета. Вы можете использовать внутри этого события метод SetText с целью изменения содержимого текстовых объектов для каждой записи отчета (в событии Format раздела подробностей) либо для группы или для верхних или нижних колонтитулов (в соответствующих им событиях Format) отчета. Более подробно о событии Format и условном форматировании разделов будет рассказано чуть позже в этой главе.

К сожалению, RDC позволяет упростить управление индивидуальным объектом только в тех отчетах, которые были созданы с помощью его собственного конструктора ActiveX. Если вы используете внешний файл .RPT с библиотекой RDC Library, то в некоторых случаях вам придется переходить к более “глубоким” объектам в иерархии, чтобы произвести данный вид настройки. Скажем, если вы произвели настройку объектов Application и Report, которые ссылаются на внешний файл .RPT (в вашем проекте нет конструктора ActiveX), и вы хотите изменить содержимое текстового объекта, то должны будет выполнить примерно такой код:

Report.Sections("PHb").ReportObjects(1).SetText "Order #"

Этот код изменит содержимое первого текстового объекта в разделе Report Header Ь на Order # (Заказ №). Такой результат достигается путем перехода в коллекцию Sections (одну из коллекций RDC, которая помимо номеров позволяет использовать также и строковые индексы). А в разделе Report Header b первый элемент коллекции ReportOb j ects (текстовый объект) изменяется с помощью метода SetText.

Совет. RDC также позволяет работать с полями, которые находятся внутри текстовых объектов. Используя коллекцию FieldElements объекта TextObject, вы можете добавлять, удалять или запрашивать находящиеся внутри текстовых объектов поля.

 

Передача значений полей параметров
Работа с группами отчета
Условное форматирование и форматирование разделов
Событие Format
Выбор пункта назначения вывода

Добавить комментарий


Защитный код
Обновить