Некоторые клиенты, использующие Кристалловские шаблоны печати документов из iScala, при переходе на новую версию (3.1 или 3.2) столкнулись с проблемами печати документов. А дело всё в используемой внешней библиотеке CRUFLavv.dll.
Начнём с того, откуда взялась эта библиотека.
Итак, название продукта: «iScala 2.2 RTP-template extention». На самом деле здесь опечатка. Должно быть не RTP, а RPT.
Из других файлов, входящих в состав проекта, можно найти такое описание: «Additional Users Functions for Crystal Reports»
Как расшифровывается название библиотеки?
- CR — явно Crystal Reports;
- UF — очевидно, Users Functions (пользовательские функции)
- L — скорее всего Library (Библиотека)
- avv — Алексей Викторович Вишняков
Кроме этого, библиотека редактировалась Рушаном Абдряшитовым:
' Author: A.V.Vishnyakov (AVV - Scala Technical Consultant). ' Modified by: R.I.Abdryashitov (ARI - Scala Technical Consultant), 15.02.2013.
Здесь не указана дата создания, только дата изменения. Но, так как я точно знаю, что Алексей Вишняков в конце декабря 2004 года покинул Эпикор, значит создана эта библиотека была не позднее 2004 года.
А теперь давайте попытаемся разобраться чего в ней такого, почему она перестала работать и так ли нужно её использовать сейчас, в 2018 году.
- Библиотека содержит функцию, которая позволяет из кристалловского отчёта обращаться к базе данных iScala используя строку соединения открытой сессии iScala и получить значение одного из полей строки какой-либо таблицы. В версиях до 3.1. объект, к которому обращается библиотека, назывался SfwIII (Scala for Windows III), мои коллеги называли его «Эс Эф Вэ ай-яй-яй» 🙂 В версиях, начиная с 3.1. он называется iScala. Из-за этого библиотека и перестала работать. Разумеется, есть перекомпилированный вариант под версию 3.1, но официально никто его не поддерживает, так что давайте не спешить его искать 🙂
- Также из открытой сессии можно получить код компании, финансовый год, числовой формат, количество знаков после запятой, формат даты и разделитель даты, которые, в свою очередь, используются в пользовательских функциях, встроенных в библиотеку.
- Кроме этого имеется несколько полезных функций, например,
-
Public Function NumStr(N As Currency, rub As Integer) As String ' Представление числа прописью. ' Числа типа Currency - до ~922 триллионов ' При втором аргументе функции равном: ' 0, вывод только числа прописью, ' 1, дополнительно вывод "рублей" и "копеек" ' 2, дополнительно вывод у.е. и сотых у.е. ' 3, дополнительно вывод "долларов" и "центов" ' 4, дополнительно вывод "ЕВРО" и "центов" ' 5, дополнительно вывод "ГРИВНЫ" и "копейки" (на укр. языке)
-
Public Function ScaNumToNumber(strNum As String) As Double 'Конвертация текстовой строки в число
-
Public Function ScaFormatNumber(Num As Double, ThousandSeparator As String, DecimalSeparator As String, DecimalPlaces As Integer) As String ' форматирование числа
-
Public Function ScaNumberToStr(Num As Double) As String 'Конвертация числа в строку в соответствии с настройками компании
-
Public Function ScaShortDateToDate(StrDate As String) As Date 'Конвертация текстовой строки типа в дату
-
А теперь позвольте мне популярно объяснить, что эта библиотека Вам больше не нужна.
Начнём с пункта 1. Внимательно прочитайте следующую цитату из статьи «Сравнение разных технологий печати документов в Scala, iScala»:
Возможность обращения к базе данных — иногда в наборе DDF кодов нет нужного. В то же время в таблице базы данных информация имеется и было бы весьма желательно эту информацию получить. Именно из-за этого в своё время мой коллега Алексей Вишняков создал специальную библиотеку для кристала. Она до сих пор работает у многих клиентов, хотя давно пора перейти на новую современную технологию (канал MSRS), где возможность обращения к базе данных является «родной» и где можно сразу получить один набор данных из многих строк, в отличие от использования вышеупомянутой библиотеки, где приходится посылать много запросов на возврат одного значения, из-за чего построение документа может выполняться достаточно длительное время.
Пункт 2 можно пропустить, т.к. в первую очередь он используется для работы функций, кратко описанных в п.3. Хочу лишь добавить, что получить параметры сессии можно более простым способом
Пункт 3:
NumStr — сумма прописью. Никто не запрещает использовать эту функцию непосредственно в отчёте, а не из «внешней» библиотеки
ScaNumToNumber — эта функция нужна, чтобы преобразовать текстовое представление числового значения в число, которое можно будет использовать в арифметических операциях, т.к. набор данных, который iScala передаёт отчёту содержит все числа, отформатированные в соответствие с числовым форматом, заданным для компании, например, 123’456’789,01. С одной стороны, это утверждение верно, однако, это не полная информация. Возможно, Вы просто не знаете, что в DDF файле можно в явном виде задать формат числа без всяких разделителей тысяч, а также с использованием точки, как десятичного разделителя. Это, так называемые Extended DDF форматы, например, <.13> (будет выведено 123456789.01) вместо <13> (будет выведено в отформатированном виде, например, 123’456’789,01). То же самое, касается и ScaShortDateToDate , например, <10@1> (год — 4 знака) вместо <10> (год 2 знака) или, например, <10@4> — ISO format 8601 (всегда YYYY-MM-DD). Таким образом, эти функции просто теряют смысл.
А теперь подумайте, хотите ли Вы использовать библиотеку, которую никто не поддерживает, или может быть всё-таки задаться вопросом: «А что в ней такого, что в настоящий момент не может быть сделано более оптимальным способом?» 🙂
Я понимаю, что переделывать не хочется, но если Вы переходите на новую версию iScala, значит в этом есть какой-то смысл, верно? Наверное, есть смысл и в том, чтобы избавиться от устаревших технологий, которые мы тащим из прошлого просто потому что нам лень оторваться от социальных сетей и заняться, наконец, работой 🙂
Если у Вас возникли вопросы, не стесняйтесь написать: