Apha Transfer Form Pdf
Стандартный функционал, который позволяет генерировать печатные формы PDF и выводить их на печать или публиковать куда-либо в бинарном виде использует фоновые задачи и SPOOL данных печати. Поначалу все было прекрасно, данные формировались, клиенты были довольны. Но в один момент все накрылось «медным тазом», объемы генерируемых печатных форм значительно выросли, SPOOL стал сильно «засераться», что приводило к жутким тормозам всей серверной части. ' Для обработки данных. Cl_fp_wb_helper=>form_layout_exists( i_name = l_xdp ). CATCH cx_fp_api_usage. '#EC NO_HANDLER CATCH cx_fp_api_repository INTO l_except. IF l_except->textid = cx_fp_api_repository=>object_already_exists. Импорт и экспорт данных формы. Введенные в форму данные можно сохранить без сохранения самих полей формы, а затем использовать для заполнения других форм. Это может ускорить заполнение форм за счет автоматического ввода данных, общих для большого числа форм. Процесс включает экспорт данных из заполненных форм для сохранения в файлах специального типа и импорт таких файлов для заполнения пустых форм. Экспорт данных формы. Откройте заполненную форму. Создание форм PDF. Создание и изменение полей формы. Перемещение полей формы.
С чего все началось Специфика компании, в которой я работаю, подразумевает тесный контакт и сотрудничество с нашими клиентами. Одним из таких бизнес-процессов является рассылка различной документации как по почте, так и на бумажных носителях по наше не любимой почте в конвертах.
Стандартный функционал, который позволяет генерировать печатные формы PDF и выводить их на печать или публиковать куда-либо в бинарном виде использует фоновые задачи и SPOOL данных печати. Поначалу все было прекрасно, данные формировались, клиенты были довольны. Но в один момент все накрылось «медным тазом», объемы генерируемых печатных форм значительно выросли, SPOOL стал сильно «засераться», что приводило к жутким тормозам всей серверной части.

Об одном из способов решения этой проблемы я и хочу рассказать в данной статье. Поехали Как это обычно бывает, первым делом все бегут с подобными проблемами к базистам, которые отвечают за работу серверной части и оптимизацию кучи различных настроек в конфигурационных файлах. Что в результате: прочитана куча SAP Notes, проштудированы форумы, потом начались изменения параметров, что-то дало небольшой прирост производительности, где-то наоборот. Но в конечном результате нужного эффекта так и не получили. Само собой давление руководства и недовольных клиентов возрастало, так как формирование документов занимало все больше и больше времени и о какой либо клиентоориентированность не могло быть и речи, что пагубно влияло на престиж компании. В результате было принято решение попробовать разобраться с проблемой на программной уровне.
Хватит уже прелюдий, перейдем к технической стороне вопроса. Анализ базисного кода Поначалу я решил разобраться как же все таки работает стандартный функционал генерации PDF форм, в результате Drill down, я натолкнулся на пакет SAFP, который раскрыл мне глаза на все происходящее и кажется пол дела было уже решено. Проанализировав примеры программ я выяснил, что для меня встали следующие основные задачи:.
Создать XFT файл формуляра;. Сгенерировать XFD файл, содержащий данные;. Получить бинарный файл и PDL файл, который понимает принтер; Создать XFT файл формуляра Тут для меня было два вариант решения, либо самому создать этот файл и хранить его где-то на сервере приложений, что было бы неразумно с точки зрения поддержки и актуализации, либо не придумывать велосипед и сразу же получать ссылку на готовый формуляр, который удобно редактировать и тестировать через транзакцию SFP.
Пойдем по пути наименьшего сопротивления: DATA: lxdp TYPE fpwbformname VALUE 'ZTEST', ' Имя формуляра lxft TYPE string, ' Путь к формуляру на сервере приложений lexcept TYPE REF TO cxfpapirepository. ' Для обработки данных TRY. Clfpwbhelper=formlayoutexists( iname = lxdp ).
CATCH cxfpapiusage. '#EC NOHANDLER CATCH cxfpapirepository INTO lexcept.
IF lexcept-textid = cxfpapirepository=objectalreadyexists. Lxft = clfpwbhelper=formlayouturl( iname = lxdp idestpath = 'X' ). MESSAGE ID 'FPRUNX' TYPE 'E' NUMBER '050' WITH sy-langu. Здесь мы проверяем существует ли формуляр в системе с заданным именем и если получаем положительный ответ, то считываем путь к этому формуляру. Генерируем XFD файл, содержащий данные Сформировать PDF файл — это еще пол дела. Нам необходимо наполнить его данными, чтобы это сделать нужно сгенерировать файл с данными XFD, который представляет из себя обычный xml файла.

Лучшее для меня решения было — это использовать трансформации. Итак приступим.
Как нам узнать как должен выглядеть файл после трансформации, чтобы он успешно применился к нашему формуляру? Сделать это очень просто, заходим в транзакцию SFP, открываем нужный нам формуляр и включаем отладку, как показано на рисунках ниже. Выбираем в формуляре Параметры настройки Далее ставим режим отладки, это позволит нам после вывода печатной формы получить файлы во вложении Запускаем печатную форму на тест и получаем необходимые файлы во вложении PDF, нас интересует XFD.xml Итак, мы получили файл представления данных для печатной формы, теперь нам не составит труда создать трансформацию и вызывать ее в дальнейшем: CALL TRANSFORMATION ztesttrans SOURCE isdata = itdata RESULT XML xstr. Получить бинарный файл и PDL файл, который понимает принтер Итак, у нас есть все необходимое для того, чтобы сформировать печатную форму. Правда тут есть один нюанс.
В природе как выяснилось существует различные типы принтеров, одни цветные, другие нет. Для определенной группы принтеров применяются так называемые шаблоны XSD, применяемые для генерации PDF файлов. Более подробно о их типах и классификации написано. Мы будем использовать hppcl5c.xdc, так как он идеально подходит для нашей задачи, в том числе позволяет распечатывать на цветном принтере. Что мы получили. DATA: lfp TYPE REF TO iffp, lpdfobj TYPE REF TO iffppdfobject, pdfresult TYPE xstring, pdlresult TYPE xstring.
получаем ADS-соединение MOVE clfp=getadsconnection( ) TO ldest. получаем FP reference lfp = clfp=getreference( ). создаем объект PDF lpdfobj = lfp-createpdfobject( connection = ldest ). указываем наш шаблон, который мы нашли ранее lpdfobj-settemplate( xftfile = lxft ). задам данные для шаблона lpdfobj-setdata( formdata = lxfd ).
говорим объекту PDF создать PDF. так же в классе есть другие задачи, которые можно глянуть в описании класса lpdfobj-settaskrenderpdf( ). говорим объекту PDF создать PDL файл CALL METHOD lpdfobj-settaskrenderpdl EXPORTING pdltype = 'pcl' pdlfile = ' xdcname = 'hppcl5c.xdc'. DATA: form TYPE string. Form = ifpwbformname. Lpdfobj-setapplicationformidentity( application = 'SAFP' form = form ). Рация носимая инструкция. запускаем наши задачи, вызвав ADS TRY.
Lpdfobj-execute( ). CATCH cxfpruntimeinternal cxfpruntimesystem cxfpruntimeusage.
'#EC NOHANDLER ENDTRY. получаем результат в формате XSTRING lpdfobj-getpdf( IMPORTING pdfdata = pdfresult ). CALL METHOD lpdfobj-getpdl IMPORTING pdldata = pdlresult. Итоги В результате после применения данного подхода, удалось вообще исключить SPOOL как таковой в цепочке. Это позволило нам создавать довольно крупные объемы печатных форм в фоновом режиме не загружая сервер, на текущий момент порядка 5000 документов за 3 часа. Стоит обратить внимание, что такой подход позволяет так же совершать другие операции с PDF, например цифровую подпись со стороны сервера.
Более детально можно изучить примеры в пакете, о котором я говорил выше в статье SAFP. Метки:. Добавить метки Пометьте публикацию своими метками Метки необходимо разделять запятой. Например: php, javascript, адронный коллайдер, задача трех тел.