160 likes | 479 Views
«Парус-Предприятие 8». Отчеты с типом «Двоичные данные». Материалы вебинара можно скачать по ссылке: https://cloud.mail.ru/public/443709673ea0/parus_webinar220514.zip. Назначение. Отчеты с типом “ Двоичные данные ” применяются если : Нужно оперативно выгрузить данные из системы
E N D
«Парус-Предприятие 8» Отчеты с типом «Двоичные данные» Материалы вебинара можно скачать по ссылке: https://cloud.mail.ru/public/443709673ea0/parus_webinar220514.zip
Назначение Отчеты с типом “Двоичные данные” применяются если: Нужно оперативно выгрузить данные из системы 2. Нужно сформировать отчет с типом данных отличных от стандартных типов отчетов ПП Парус 8, например, PDF, HTML, RTF, MS Word (презентация http://www.parus.com/docs/09_mindijarov_13122012.pps); 3. Нужно, частично или полностью, формировать отчет НЕ на клиенте ПП Парус 8 (презентация http://www.parus.com/docs/imindiyarov_20130725.ppsx); 4. Предоставить пользователю произвольные файлы из других информационных систем.
Особенности написания отчета Отчеты с типом “Двоичные данные” всегда: Основываются на процедуре PL/SQL. Имеют входной числовой параметр с типом привязки “Идентификатор процесса”. Данные, передаваемые «клиенту» будут записаны в таблицу FILE_BUFFER. С «клиента» будет вызвано приложение ОС, которое определяется непосредственно в процедуре отчета
Особенности написания отчета Особенности заполнения таблицы 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 В режиме теста, на примере 20 000 записей Хозяйственных операций и проводок, время выгрузки составляет 57 сек.
Разбор процедуры создания отчета createorreplaceprocedure UDO_P_ECONOPRS_BREPORT( NCOMPANY innumber–организация ,NIDENT innumber--идентификатор отмеченных записей ,NPROCESS innumber--идентификатор процесса ) Обязательные параметры NIDENT и NPROCESS Объявляем процедуру записи строки в CLOB procedurePUT_LINE(S invarchar2) as begin DBMS_LOB.WRITEAPPEND(C, LENGTH(S || CR), S || CR); end; и процедуру наполнения BLOB из CLOB procedure SAVE_MODULE(DATA inoutnocopyclob, RES inoutnocopyblob) 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 DBMS_LOB.CREATETEMPORARY(C, true); Добавляем основную разметку отчета HTML тэгами процедурой PUT_LINE PUT_LINE('<html>' || '<head>' || '<title>Отчет</title>' || -- заголовок отчета '<style>.tcell {padding: 3 7 3 7; border:.5pt solid black;}</style>' || --описание cssстилей '<meta http-equiv=Content-Type content="text/html; charset=windows-1251">' || '</head>' || '<body>'); Добавляем разметку основной таблицы PUT_LINE('<table border=0 cellspacing="0" cellpadding="0" style="border-collapse:collapse" >'); Начинаем строку заголовков PUT_LINE('<tr>'); Описываем каждый столбец заголовка PUT_LINE('<td class=tcell align=center><b>Номер операции</b></td>' || '<td class=tcell align=center><b>Дата учета</b></td>'|| . . . '<td class=tcell align=center><b>Номер партии</b></td>'); PUT_LINE('</tr>'); -- конец строки заголовка
Разбор процедуры создания отчета Начинаем выборку данных for CURS in (selecttrim(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(' <tr>'); -- начало строки с данными -- столбцы с данными PUT_LINE(' <td class=tcell>' || CURS.OPER_NUMB || '</td>'); PUT_LINE(' <td class=tcell align=center>' || TO_CHAR(CURS.OPER_DATE, 'dd.mm.yyyy') || '</td>'); . . . PUT_LINE(' <td class=tcell>' || CURS.NOMEN_PARTNO || '</td>'); PUT_LINE(' </tr>'); -- конец строки с данными PUT_LINE('</table>'); -- конец разметки основной таблицы PUT_LINE('</body></html>'); -- конецотчета
Разбор процедуры создания отчета Создаем временный BLOB DBMS_LOB.CREATETEMPORARY(B, true); Заполняем BLOB из CLOB SAVE_MODULE(C, B); Очищаем CLOB DBMS_LOB.FREETEMPORARY(C); Заполняем FILEBUFFER данными из BLOB insertinto 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 Очищаем BLOB DBMS_LOB.FREETEMPORARY(B); end;