Поскольку Crystal Reports использует свой собственный язык формул, в нем имеется ряд "тонких моментов", о которых следует помнить.
Перегруженные функции.
Многие функции имеют несколько форм, которые имеют одинаковое имя, но принимают разное количество аргументов. Таковыми являются, например, практически все функции вычисления общих и промежуточных итогов. Например, функция Sum имеет три варианта синтаксиса: с одним, двумя и тремя аргументами.
Обработка значений Null.
Вообще-то очень желательно, чтобы поля с таким значением вообще не попадали в отчет, так как сильно тормозят его формирование. Если поле БД просто вставлено в отчет, и в нем попадется значение Null, в готовом отчете так и будет написано: <Null>. Если поле со значением Null попадется в формуле, формула также возвратит Null независимо от синтаксиса. Единственное исключение – функция IsNull(), которая, собственно, и предназначена для обработки таких значений.
Для борьбы с Null существует еще один способ. Идем в меню File->Report Options…. В открывшемся окошке устанавливаем флажок Convert NULL Field to Default:
Особенности работы со строками.
При вычислении формул Crystal Reports сам пытается понять тип переданного аргумента. Поэтому следует быть осторожным, в частности с операцией сложения. Оператор "+" проводит как сложение чисел, так и конкатенацию строк. (Для того, чтобы гарантировать конкатенацию, используйте оператор "&").
В "Шаг 16 - Комбинирование текстовых полей с другими" мы провели комбинирование текстового поля с полем базы данных. А вот как можно сделать тоже самое с помощью формулы:
“Продано “ & {Order Details.Quantity} & “ штук”
Еще раз обращаю внимание на пробелы в строках (после продано и перед штук). Нельзя о них забывать. С формулами, конечно, больше возни, но и работают они быстрее. Если для вас важен фактор скорости формирования отчета (т.е. если полученный отчет будет распространятся в электронном виде), лучше использовать формулы. Бумаге, естественно, все равно.
В общем, функции для работы со строками очень похожи на аналогичные в других языках программирования. Например, имеются функции Left, Right, Mid.
Пример:
Имеется база данных с фамилиями, именами и отчествами. А в отчет требуется вывести фамилию и инициалы:
{Persons.LName} & “ “ & Left({Persons.Name},1) & “. “ & Left({Persons.SName},1) & “.”
Crystal Reports позволяет также интерпретировать любые данные как массивы символов, и следовательно, применять к ним функции, принимающие массивы и операторы массивов. Нумерация этих массивов начинается с 1.
Приведенный выше пример можно переписать так:
{Persons.LName} & “ “ & {Persons.Name}[1] & “. “ & {Persons.SName}[1] & “.”
Если надо выделить три первых символа имени:
{Persons.Name}[1 to 3]
Особенно удобен такой синтаксис при работе с датами (которые тоже бывают представлены в символьном формате). Он позволяет "разобрать дату на части": день, месяц, год. Подробнее о датах чуть позже.
Среди строковых функций Crystal Reports имеется одна, заслуживающая особого внимания. Это функция ToText. О ней – в следующем шаге.