Crystal Reports имеет встроенный язык(даже два), который позволяет писать дополнительные функции. Эти функции можно выделять в общие и использовать в разных отчетах. Вот, например, простая функция печати даты вида "31 декабря 2007 г.", работа которой не зависит от региональных и языковых настроек компьютера пользователя:
Function (DateVar Dt)
numberVar dd;
numberVar mm;
numberVar yy;
stringVar sm;
dd := Day(Dt);
mm := Month(Dt);
yy := Year(Dt);
stringVar array MonthNames := ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"];
CStr(dd, 0) & " " & MonthNames[mm] & " " & CStr(yy, 0, "") & " г."
Но бывает, что возникает ситуация, когда возможностей встроенного языка не хватает. В этом случае можно подключить свою собственную дополнительную библиотеку с набором функций. Для создания такой библиотеки можно воспользоваться любым языком, поддерживающим COM.
Спецификация по созданию таких библиотек можно найти на сайте CR.
В составе iScala идет такая библиотека. Более подробно смотри раздел помощи "Special Functions for Crystal Reports".
В своей работе я часто пользуюсь одной такой библиотекой. Изначально она была написана Alexey Vishnyakov из SCALA CIS. С тех пор разными людьми в нее вносились изменения и добавлялись новые возможности.
Список функций библиотеки:
- avvScaCRGetStringField(SqlString As String) As String - выполняет произвольный SQL запрос SqlString и возвращает значение текстового поля из БД. В запросе можно использовать макросы <CC> и <YY> - они будут заменены на код компании и финансовый год соответственно.
- avvScaCRGetNumericField(SqlString As String) As Double - тоже, но для числового поля
- avvScaCRGetDateField(SqlString As String) As Date - тоже, но для поля типа дата
- avvScaCRNumStr(N As Currency, rub As Integer) As String - представление числа прописью.
При втором аргументе функции равном:
0 - вывод только числа прописью,
1 - дополнительно вывод "рублей" и "копеек"
2 - дополнительно вывод у.е. и сотых у.е.
3 - дополнительно вывод "долларов" и "центов"
4 - дополнительно вывод "ЕВРО" и "центов"
5 - дополнительно вывод "ГРИВНЫ" и "копейки" (на украинском языке) - avvScaCRScaNumToNumber(strNum As String) As Double - конвертация текстовой строки в число
- avvScaCRScaFormatNumber(Num As Double, ThousandSeparator As String, DecimalSeparator As String, DecimalPlaces As Integer) As String - форматирование числа
- avvScaCRScaNumberToStr(Num As Double) As String - конвертация числа в строку в соответствии с настройками компании
- avvScaCRScaShortDateToDate(StrDate As String) As Date - конвертация текстовой строки типа в дату
К сожалению функции, работающие с БД, не всегда правильно работают с несколькими сессиями. Я уже описывал эту проблему тут.
Саму библиотеку и ее исходный код можно скачать здесь.
Для установки нужно зарегистрировать DLL на всех компьютерах, где будут использоваться такие отчеты командой: regsvr32 CRUFLavv.dll
Должно появиться сообщение "DllRegisterServer в CRUFLavv.dll завершено успешно."
После этого новые в списке функций появятся новые пункты, путь к ним Functions/Additional Functions/Visual Basic UFLs (u2lcom.dll):
Можно пользоваться.