Отвечу сам! Стандартными инструментами никак! Но....
Вывод в отчет любой картинки, хранящейся в БД:
Стандартный функционал не предусматривает такую возможность, но мы можем его добавить. Так как редактирование приложения (я имею в виду «Профстрой») нам не доступно мы будем добавлять функционал непосредственно на сервер Firebird, используя механизм User Defined Functions (UDF), позволяющий писать пользовательские функции на любом компилирующем инструменте разработки (хост-языке). Саму библиотеку нам писать не придется, возьмем готовую и просто подключим необходимую функцию в нашу БД, и потом используем в конструкции запроса в отчете.
1. Добавим на сервер библиотеку UDF BlobSaveLoad (функции для загрузки файла в Blob и выгрузки Blob в файл. blobsaveload.zip (47k), 17.01.2007, kdv). Библиотеку берем отсюда:
http://ibase.ru/d_udf.htm. Из скачанного архива необходимо скопировать файл библиотеки blobsaveload.dll в папку «UDF» которая находится в каталоге сервера (пример пути: «C:\Program Files\Firebird\Firebird_[здесь версия сервера]\UDF»). ВНИМАНИЕ! Только для Firebird Win32
2. Регистрируем функцию «SaveBLOBToFile» из ранее добавленной библиотеки, которая будет сохранять картинку на диск из поля blob в нашей БД. Для регистрации подключаемся к нашей БД с помощью инструмента управления базой данных (я использую IBExpert) и выполняем скрипт:
DECLARE EXTERNAL FUNCTION SAVEBLOBTOFILE
BLOB,
CSTRING(256) CHARACTER SET NONE
RETURNS INTEGER BY VALUE
ENTRY_POINT 'SaveBLOBToFile' MODULE_NAME 'blobsaveload';
3. Если версия Вашего сервера меньше Firebird 2.1 тогда придется задекларировать функцию ascii_char() из библиотеки ib_udf .dll, которая присутствует в стандартной поставке сервера. Функция нам понадобится для передачи в запрос символа двоеточия.
Для этого выполним скрипт:
DECLARE EXTERNAL FUNCTION ascii_char
INTEGER NULL
RETURNS CSTRING(1) FREE_IT
ENTRY_POINT 'IB_UDF_ascii_char' MODULE_NAME 'ib_udf'
Двоеточие нам нужно для указания пути сохранения картинки на диск из БД. Простое указание в запросе «с:\», вернет «с\». Почему так, расписывать не буду, как говорит Леонид Каневский из передачи «Следствие вели» - «Впрочем, это уже совсем другая история …».
Если версия Вашего сервера, больше или равно версии 2.1, этот пункт пропускаем!
4. Вот и все! Пример конструкции в отчете, которая выведет нам картинку:
<TD rowspan="11" width="308" align="center">
~SQL2:Установить:SELECT pUnic||'_'||oNumb||'.bmp' IMG_PATH, SAVEBLOBTOFILE(bPict, 'C'||ascii_char(58)||'\ProfSegment\Profstroy4\TMP\'||pUnic||'_'||oNumb||'.bmp') SAVE_IMG FROM ListOrd WHERE (pUnic=:SQL1pUnic.AsInt:)AND(oNumb=:SQL1oNumb.AsInt:)~
~SQL2:Начало~
<img src="~SQL2:IMG_PATH:AsString~" width=150 height=150 alt="~SQL2:IMG_PATH:AsString~">
~SQL2:Конец~
</TD>
Пример реальный из стандартного отчета «Коммерческое предложение» («Профстрой4»)
Описание конструкции:
выполняем запрос;
в результате запроса 2 поля: IMG_PATH и SAVE_IMG;
IMG_PATH – содержит название-идентификатор сохраненного файла картинки на диск, будем использовать как ссылку с теге <img>;
SAVE_IMG – результат сохранения картинки из БД на диск;
выводим картинку через тег <img>, через конструкцию «:AsImage» мне вывод не понравился, коряво формируются параметры тега;
Результат вышеописанных манипуляций:
P.S. Если у вас версия «Профстрой» не предусматривает функционал добавления и редактирования отчетов (например дилерская версия), можно добавить отчет с помощью инструмента управления базой данных (IBExpert), выполнив скрипт или вручную.
Скрипт пример добавления отчета:
INSERT INTO DOCUMNL (DPORN, DFORM, DNAME, DUNIC, DPROP, DTEXT, DHTML, DGRUP, DILER, DPREF, DCNTP, DREMA, DVIEW) VALUES (145, 'проект', 'Коммерческое предложение для клиента', 145, '', NULL, 'HTML', '', 1, 'ОБЩАЯ', -1, 0, NULL);
Значение [145] в скрипте должно быть уникально в пределах таблицы DOCUMNL.
Далее необходимо в поле DTEXT (это текстовый blob) добавить код самого отчета.