Не могу вставить модуль данных |
Стандартные функции InterBase. UDF
UDF
В практике программирования нередко встречаются ситуации, когда программисту недостаточно того набора функций, который предоставлен сервером InterBase. К счастью, InterBase дает возможность создавать и подключать к базе данных собственные функции, которые называются UDF ( User Defined Functions - Функции, определенные пользователем). Прелесть этого механизма в том, что такие функции можно написать на любом языке программирования, включая Delphi, который позволяет делать библиотеки DLL ( Dynamic Link Library - Динамически подключаемые библиотеки). Программист может реализовать в одном или нескольких DLL -файлах множество необходимых ему функций практически любой сложности, затем поместить этот файл (файлы) там, где установлен InterBase. Останется только подключить описанные функции к рабочей базе данных, после чего любую из этих функций можно использовать в запросах на любых клиентских ПК.
Для демонстрации этой возможности как нельзя лучше подойдет функция Upper_Rus, описанная В.В.Фароновым в книге "Программирование баз данных в Delphi7. Учебный курс". Функция преобразует все символы строки в верхний регистр, но в отличие от стандартной Upper, она корректно сработает и с другими наборами символов и порядком сортировки.
Для начала нам нужно создать DLL -файл. Откройте Delphi. В нашем случае нам нужно будет создать отдельный DLL -файл, поэтому создавать его нужно как отдельный проект. Выберите команду меню < File -> Close All >, чтобы закрыть новое приложение, которое Delphi запускает автоматически. Затем выберем команду < File -> New -> Other >. Откроется окно, в котором на вкладке New нам нужно выбрать DLL Wizard:
При этом откроется окно модуля без всяких форм, которое содержит лишь следующий код (комментарии опущены):
library Project1; uses SysUtils, Classes; {$R *.res} begin end.
Выберем команду < File -> Save All >, где нам предложат сохранить проект без всяких модулей. Создайте для проекта отдельную папку, а проект назовите Udf_Dll. Далее приводится весь код библиотеки Udf_Dll (без комментариев):
library Udf_Dll; uses SysUtils, Classes; {$R *.res} function Upper_Rus(InpString: PChar): PChar; cdecl; //Функция преобразует буквы входной строки в заглавные begin Result := PChar(ANSIUpperCase(String(InpString))); end; exports Upper_Rus; begin end.
Поскольку это DLL -проект, который не может работать самостоятельно, выбирать команду Run не нужно. Вместо этого нажмите < Ctrl+F9 >, либо выберите команду < Project -> Compile Udf_Dll >. В результате в указанной вами папке появится файл Udf_Dll.dll.
В приведенном выше коде мы создали функцию Upper_Rus, которая имеет входной и выходной строковые параметры типа PChar (строковый тип Windows ). Кроме того, для правильной работы с InterBase, эта экспортируемая функция задекларирована как cdecl (соглашение о передаче входных параметров). В теле функции входная строка преобразуется в верхний регистр функцией WinAPI ANSIUpperCase, благодаря чему ЛЮБОЙ набор символов (не обязательно русский) будет корректно преобразован в верхний регистр.
В конце мы указываем, что описанная функция Upper_Rus предназначена для экспорта.
Delphi можно закрыть. Полученный файл динамической библиотеки Udf_Dll.dll скопируйте в каталог UDF сервера InterBase (по умолчанию - C:\Program Files\Borland\InterBase\UDF). Если скопировать файл в другой каталог, InterBase его не найдет.
Теперь эту функцию нужно зарегистрировать в базе данных First (сервер InterBase должен быть запущен, утилита IBConsole открыта, база данных First выделена и запущена утилита Interactive SQL ). В окне запросов Interactive SQL укажите следующий запрос:
DECLARE EXTERNAL FUNCTION UPPER_RUS CSTRING(256) RETURNS CSTRING(256) ENTRY_POINT 'Upper_Rus' MODULE_NAME 'UDF_DLL'; COMMIT;
Здесь указан тип строк InterBase CSTRING, что соответствует типу PChar в Delphi, и установлено ограничение в 256 символов. Теперь, если вы посмотрите в дереве серверов IBConsole в разделе " External Functions " нашей БД First, вы увидите зарегистрированную функцию UPPER _RUS.
В Interactive SQL мы можем ввести запрос, показывающий разницу между стандартной функцией UPPER и нашей функцией UPPER _RUS (может потребоваться перезагрузка IBConsole, или хотя бы закрытие ( Disconnect ) и открытие ( Connect ) базы данных First ):
SELECT UPPER(Nazvanie COLLATE WIN1251), UPPER_RUS(Nazvanie COLLATE WIN1251) FROM Tovar;
Как видно из рисунка, там, где стандартная функция UPPER не смогла преобразовать текст в верхний регистр, функция UPPER _RUS с этой задачей справилась. Далее эту функцию можно использовать в пределах базы данных First на любом пользовательском ПК, который подключен к InterBase.