Отчеты с типом «Двоичные данные» «Парус-Предприятие 8» Материалы вебинара можно скачать по ссылке: zip
Назначение Отчеты с типом Двоичные данные применяются если: 1. Нужно оперативно выгрузить данные из системы 2. Нужно сформировать отчет с типом данных отличных от стандартных типов отчетов ПП Парус 8, например, PDF, HTML, RTF, MS Word (презентация pps 3. Нужно, частично или полностью, формировать отчет НЕ на клиенте ПП Парус 8 (презентация ppsx 4. Предоставить пользователю произвольные файлы из других информационных систем.
Особенности написания отчета Отчеты с типом Двоичные данные всегда: 1. Основываются на процедуре PL/SQL. 2. Имеют входной числовой параметр с типом привязки Идентификатор процесса. 3. Данные, передаваемые «клиенту» будут записаны в таблицу FILE_BUFFER. 4. С «клиента» будет вызвано приложение ОС, которое определяется непосредственно в процедуре отчета
Особенности написания отчета Особенности заполнения таблицы FILE_BUFFER В поле IDENT необходимо записывать идентификатор процесса; Если имя файла начинается с., то на клиенте будет создано случайное имя файла; В поле DATA записываются данные с типом CLOB, либо в поле BDATA записываются данные с типом BLOB; Если в параметр RUN_CMD: записать NULL, то это будет запущено приложение, которое ассоциировано с расширением имени файла; записать NULL (как строковую константу), то файл будет создан, но никакой команды на запуск выполнено не будет; Записать имя исполняемого файла и символы %1, например, some_program.exe /q -x %1, то будет запущена указанная программа, символы %1 будут заменены на имя файла, который будет создан из полей BDATA или DATA.
Особенности написания отчета Файлы создаются во временной папке пользователя (заданной в переменной окружения TEMP); Файлы не удаляются; Файлы создаются и выполняются по порядку, в зависимости от значения поля RN таблицы FILE_BUFFER;
Установка примера Рассмотрим пример отчета с типом двоичные данные, который выгружает данные из раздела «Хозяйственные операции» в MS Excel используя формат HTML. Под пользователем PARUS компилируем процедуру UDO_P_ECONOPRS_BREPORT ( выложена в архиве в папке BINARY В разделе «Отчеты» – «Пользовательские отчеты» создаем новую запись Заполняем произвольно мнемокод и наименование. Указываем тип: Двоичные данные Указываем хранимую процедуру: UDO_P_ECONOPRS_BREPORT
Установка примера Добавляем 3 параметра отчета: NPROCESS – привязка к идентификатору процесса NCOMPANY – привязка к организации NIDENT – привязка к идентификатор помеченных записей
Установка примера Добавляем связь с разделом «Хозяйственные операции» Заходим в раздел «Хозяйственные операции» отмечаем необходимые нам записи и из контекстного меню выбираем «Расширения» – «Пользовательские отчеты»
Установка примера Из списка отчетов выбираем «Выгрузка ХО в HTML (двоичные данные)» И получаем выгрузку данных в MS Excel Так же при минимальных модификациях в процедуре этот отчет можно открыть в любом браузере.
Отчет с типом двоичные данные - HTML Данный способ показал значительный прирост в скорости выгрузки данных по сравнению со стандартной функцией «Перенос в MS Excel», а так же по сравнению с пользовательским отчетом использующим PRSG_EXCEL В режиме теста, на примере записей Хозяйственных операций и проводок, время выгрузки составляет 57 сек.
Разбор процедуры создания отчета create or replace procedure UDO_P_ECONOPRS_BREPORT( NCOMPANY in number –организация,NIDENT in number --идентификатор отмеченных записей,NPROCESS in number --идентификатор процесса ) Обязательные параметры NIDENT и NPROCESS procedure PUT_LINE(S in varchar2) as begin DBMS_LOB.WRITEAPPEND(C, LENGTH(S || CR), S || CR); end; и процедуру наполнения BLOB из CLOB procedure SAVE_MODULE(DATA in out nocopy clob, RES in out nocopy blob) as -- L_DEST_OFFSET integer; L_SOURCE_OFFSET integer; L_LANG_CONTEXT integer; L_WARNING integer; L_BLOB_CSID integer; -- begin L_BLOB_CSID := NLS_CHARSET_ID('CL8MSWIN1251'); L_DEST_OFFSET := 1; L_SOURCE_OFFSET := 1; L_LANG_CONTEXT := DBMS_LOB.DEFAULT_LANG_CTX; L_WARNING := DBMS_LOB.WARN_INCONVERTIBLE_CHAR; DBMS_LOB.CONVERTTOBLOB(DEST_LOB => RES, SRC_CLOB => DATA, AMOUNT => DBMS_LOB.LOBMAXSIZE, DEST_OFFSET => L_DEST_OFFSET, SRC_OFFSET => L_SOURCE_OFFSET, BLOB_CSID => L_BLOB_CSID, LANG_CONTEXT => L_LANG_CONTEXT, WARNING => L_WARNING); end; Объявляем процедуру записи строки в CLOB
Разбор процедуры создания отчета PUT_LINE(' ' || ' ' || ' Отчет ' || -- заголовок отчета '.tcell {padding: ; border:.5pt solid black;} ' || --описание css стилей ' ' || ' ' || ' '); Создаем временный CLOB DBMS_LOB.CREATETEMPORARY(C, true); Добавляем основную разметку отчета HTML тэгами процедурой PUT_LINE Начинаем строку заголовков PUT_LINE(' '); Добавляем разметку основной таблицы PUT_LINE(' Номер операции ' || ' Дата учета ' ||... ' Номер партии '); PUT_LINE(' '); -- конец строки заголовка Описываем каждый столбец заголовка
Разбор процедуры создания отчета for CURS in (select trim(E.OPERATION_PREF) || '-' || trim(E.OPERATION_NUMB) as OPER_NUMB,E.OPERATION_DATE as OPER_DATE...,O.NOMEN_CODE || ', ' || O.NOMEN_NAME || ', ' || O.NOMEN_MEAS as NOMEN,O.NOMEN_PARTNO as NOMEN_PARTNO from V_ECONOPRS E, V_OPRSPECS O, SELECTLIST S where S.IDENT = NIDENT and E.RN = S.DOCUMENT and E.RN = O.PRN(+) ) loop Начинаем выборку данных PUT_LINE(' '); -- начало строки с данными -- столбцы с данными PUT_LINE(' ' || CURS.OPER_NUMB || ' '); PUT_LINE(' ' || TO_CHAR(CURS.OPER_DATE, 'dd.mm.yyyy') || ' ');... PUT_LINE(' ' || CURS.NOMEN_PARTNO || ' '); PUT_LINE(' '); -- конец строки с данными PUT_LINE(' '); -- конец разметки основной таблицы PUT_LINE(' '); -- конец отчета Заполняем таблицу данными
Разбор процедуры создания отчета Создаем временный BLOB DBMS_LOB.CREATETEMPORARY(B, true); Заполняем BLOB из CLOB SAVE_MODULE(C, B); Очищаем BLOB DBMS_LOB.FREETEMPORARY(C); Заполняем FILEBUFFER данными из BLOB insert into FILE_BUFFER (IDENT, FILENAME, BDATA, RUN_CMD) values (NPROCESS, '.htm', B, 'excel.exe /e %1'); Здесь мы формируем html файл и открываем его в MS Excel. Вместо Excel можно использовать любой браузер например Google Chrome для этого вместо excel.exe необходимо написать chrome.exe DBMS_LOB.FREETEMPORARY(B); end; Очищаем CLOB