AbapList/Smartforms To PDF保存本地
第一种:ABAPLIST_TO_PDF,需要用到假脱机。
list-processing的打印输出,很老旧的打印了,但是还是有些系统会用。
DATA:g_val TYPE c, w_pripar TYPE pri_params, w_arcpar TYPE arc_params, input_length TYPE i. DATA:spool_no LIKE sy-spono, src_spoolid LIKE tsp01-rqident. DATA:name TYPE tbtcjob-jobname, jobnumber TYPE tbtcjob-jobcount, wa_tbtcp TYPE tbtcp. CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING in_archive_parameters = w_arcpar in_parameters = w_pripar layout = 'X_65_132' line_count = 65 line_size = 132 no_dialog = 'X' IMPORTING out_archive_parameters = w_arcpar out_parameters = w_pripar valid = g_val. IF g_val NE space AND sy-subrc = 0. w_pripar-prrel = space. w_pripar-primm = space. NEW-PAGE PRINT ON NEW-SECTION PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar NO DIALOG. "Output which is gone to spool SUBMIT ztestc01 WITH p_bukrs = wa_data-bukrs WITH p_hbkid = wa_data-hbkid WITH p_hktid = wa_data-hktid WITH p_hkont = wa_data-hkont WITH p_zdzqj = wa_data-zdzqj TO SAP-SPOOL SPOOL PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar WITHOUT SPOOL DYNPRO AND RETURN. NEW-PAGE PRINT OFF. CALL FUNCTION 'ABAP4_COMMIT_WORK'. "提交假脱机请求,sp01查看 ENDIF. *获取假脱机,会得到之前成功数据 *-- Find out what the spool number is that was just created * DATA:lc_rq2name LIKE tsp01-rq2name. * CONCATENATE sy-repid+0(9) '_' sy-uname+0(3) INTO lc_rq2name. * SELECT * FROM tsp01 WHERE rq2name = lc_rq2name ORDER BY rqcretime DESCENDING. * spool_no = tsp01-rqident. * EXIT. * ENDSELECT. CLEAR spool_no. IMPORT spool_no = spool_no FROM MEMORY ID 'ZFIE9170'. FREE MEMORY ID 'ZFIE9170'. IF spool_no IS INITIAL. MESSAGE '假脱机错误' TYPE 'E'. ENDIF. * 后台job start-of-selection后程序抛后台,遇到message不报错 * name = |{ sy-repid }{ sy-datum }{ sy-uzeit }|. * CALL FUNCTION 'JOB_OPEN' * EXPORTING * jobname = name * IMPORTING * jobcount = jobnumber * EXCEPTIONS * cant_create_job = 1 * invalid_job_data = 2 * jobname_missing = 3 * OTHERS = 4. * IF sy-subrc = 0. * SUBMIT ztestc01 * WITH p_bukrs = wa_data-bukrs * WITH p_hbkid = wa_data-hbkid * WITH p_hktid = wa_data-hktid * WITH p_hkont = wa_data-hkont * WITH p_zdzqj = wa_data-zdzqj * TO SAP-SPOOL SPOOL PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar WITHOUT SPOOL DYNPRO * VIA JOB name NUMBER jobnumber AND RETURN. * * CALL FUNCTION 'JOB_CLOSE' * EXPORTING * jobcount = jobnumber * jobname = name * strtimmed = 'X' * EXCEPTIONS * cant_start_immediate = 1 * invalid_startdate = 2 * jobname_missing = 3 * job_close_failed = 4 * job_nosteps = 5 * job_notex = 6 * lock_failed = 7 * OTHERS = 8. * * IF sy-subrc = 0. * CLEAR wa_tbtcp. * SELECT SINGLE * * FROM tbtcp * INTO wa_tbtcp * WHERE jobcount = jobnumber. * IF wa_tbtcp-listident IS NOT INITIAL. * spool_no = wa_tbtcp-listident. * ELSE. * MESSAGE '假脱机失败' TYPE 'E'. * ENDIF. * ENDIF. * ENDIF. *--------------------------------------------------------------------* * JOB_2_PDF *--------------------------------------------------------------------* REFRESH it_pdf . src_spoolid = spool_no. CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' EXPORTING src_spoolid = src_spoolid no_dialog = space IMPORTING pdf_bytecount = bytecount TABLES pdf = it_pdf. CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE' EXPORTING line_width_src = 134 line_width_dst = 255 TABLES content_in = it_pdf content_out = file_tab. "Save the file CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = bytecount filename = file_path filetype = 'BIN' TABLES data_tab = file_tab.
其中遇见问题:
1.如果我不用submit,而是直接在当前程序中write,程序中ztestc01的页码会缺失。
因为页码往往是打印完了后,最后替换上去的。比如
DATA:lv_page TYPE char10. WRITE lv_page.
........"程序执行完
lv_page = ’第一页/共三页' .
MODIFY LINE ’1‘ OF PAGE ’1‘ FIELD VALUE lv_page FROM lv_page.
在modify 之前,sy-spono已经生成。
然而sumbit就很好的解决了这种问题,假脱机中的内容是完整的(当只打印一页)。
但是之后的测试发现,write多页的时候,只有最后一页实现了页码的更改。
我也尝试了abaplist->ASCII->ITF->OTF->PDF等等,发现要想输出PDF,还是需要用到假脱机。
2.submit ztestc01,sy-spono传递问题
ztestc01中,write输出中,会生成假脱机号存在sy-spono,而跳出submit后,怎么取出spool number是个问题。
(1)可以从dbtab:tsp01中取,但是会有问题,不能准确取到当前spono.
(2)后台job可以解决,但是start-of-selection之后的程序直接抛后台,如果有message不报错,不提醒
(3)传递abap memory,最实用哈哈
第一种:abaplist的另外尝试
SUBMIT ztestc01 WITH p_bukrs = '4000' EXPORTING LIST TO MEMORY AND RETURN.
DATA list_obj TYPE TABLE OF abaplist.
DATA list_asc TYPE TABLE OF char134.
CALL FUNCTION 'LIST_FROM_MEMORY' TABLES listobject = list_obj EXCEPTIONS not_found = 1 OTHERS = 2. CALL FUNCTION 'LIST_TO_ASCI' TABLES listasci = list_asc listobject = list_obj EXCEPTIONS empty_list = 1 list_index_invalid = 2 OTHERS = 3. DATA: lt_tline TYPE STANDARD TABLE OF tline. CALL FUNCTION 'CONVERT_ASCII_TO_ITF' EXPORTING tabletype = 'ASC' c_datatab = list_asc TABLES itf_lines = lt_tline EXCEPTIONS invalid_tabletype = 1 "internal error!! missing_size = 2 "internal error!! OTHERS = 3. DATA:g_val TYPE c, w_pripar TYPE pri_params, w_arcpar TYPE arc_params, input_length TYPE i. CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING in_archive_parameters = w_arcpar in_parameters = w_pripar layout = 'X_65_132' line_count = 65 line_size = 132 no_dialog = 'X' IMPORTING out_archive_parameters = w_arcpar out_parameters = w_pripar valid = g_val. DATA header LIKE thead. DATA options LIKE itcpo. DATA result LIKE itcpp. DATA otf LIKE TABLE OF itcoo. CALL FUNCTION 'PRINT_TEXT' EXPORTING * APPLICATION = 'TX' * ARCHIVE_INDEX = ' ' archive_params = w_arcpar * DEVICE = 'PRINTER' * DIALOG = 'X' header = header * OPTIONS = * IMPORTING * NEW_ARCHIVE_PARAMS = * RESULT = TABLES lines = lt_tline otfdata = otf . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
想要abaplist->ASCII->ITF->OTF,只能得到以下效果:
可以看到,SAPscript(ITF)文本只有132位,将纯文本ASCII转换为ITF后会变形,再转换OTF就错乱了。
只有让abaplist作为假脱机,输出PDF才是正确选择。
如果只打印一页,第一种方法完全没有任何问题,如果多页打印,页码会丢失(只有最后一页有页码),下面介绍我改版后的程序:
1.首先执行被调用程序,获取LINE_SIZE和LINE_COUNT(行宽和行数),后面初始化打印参数要用到
2.整体打印调用abaplist
DATA spoolid LIKE TSP01_SP0R-RQID_CHAR. DATA list_obj TYPE TABLE OF abaplist. DATA:g_val TYPE c, w_pripar TYPE pri_params, w_arcpar TYPE arc_params, input_length TYPE i. SUBMIT ztestc01 WITH p_bukrs = '4000' EXPORTING LIST TO MEMORY AND RETURN. CALL FUNCTION 'LIST_FROM_MEMORY' TABLES listobject = list_obj EXCEPTIONS not_found = 1 OTHERS = 2. CALL FUNCTION 'LIST_FREE_MEMORY'. CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING layout = 'X_65_132' line_count = 89 line_size = 130 no_dialog = 'X' IMPORTING out_archive_parameters = w_arcpar out_parameters = w_pripar valid = g_val. * Write lines of list to spool. IF g_val NE space AND sy-subrc = 0. w_pripar-prrel = space. w_pripar-primm = space. NEW-PAGE PRINT ON PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar NEW-SECTION NO DIALOG. CALL FUNCTION 'WRITE_LIST' TABLES listobject = list_obj EXCEPTIONS empty_list = 1 OTHERS = 2. MOVE sy-spono TO spoolid. NEW-PAGE PRINT OFF. CALL FUNCTION 'ABAP4_COMMIT_WORK'. "提交假脱机请求,sp01查看 ENDIF. *--------------------------------------------------------------------* * JOB_2_PDF *--------------------------------------------------------------------* REFRESH it_pdf . src_spoolid = spoolid. CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' EXPORTING src_spoolid = src_spoolid no_dialog = space IMPORTING pdf_bytecount = bytecount TABLES pdf = it_pdf. CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE' EXPORTING line_width_src = 134 line_width_dst = 255 TABLES content_in = it_pdf content_out = file_tab. *delete spool CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ' EXPORTING spoolid = spoolid.
第二种:smartforms输出PDF,无需假脱机
DATA: g_name TYPE rs38l_fnam.
control_parameters TYPE ssfctrlop,
output_options TYPE ssfcompop,
job_output_info TYPE ssfcrescl.
DATA:content_x TYPE xstring,
it_pdf TYPE TABLE OF tline WITH HEADER LINE,
wa_pdf LIKE LINE OF it_pdf,
file_tab TYPE STANDARD TABLE OF solisti1,
bytecount TYPE i.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZTESTC01' IMPORTING fm_name = g_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. * error handling MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. *----------------------------------------------------------------------* SELECT SINGLE spld INTO output_options-tddest
FROM usr01
WHERE bname = sy-uname.
IF output_options-tddest EQ space.
output_options-tddest = 'LP01'.
ENDIF.
control_parameters-no_dialog = 'X'. control_parameters-getotf = 'X'. control_parameters-langu = '1' . CALL FUNCTION g_name EXPORTING control_parameters = control_parameters output_options = output_options user_settings = '' is_head = ls_head * TABLES * it_itab = it_itab1 IMPORTING job_output_info = job_output_info EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. * error handling MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. REFRESH it_pdf . CALL FUNCTION 'CONVERT_OTF' EXPORTING format = 'PDF' IMPORTING * bin_file = lv_xstring "pdf xstring bin_filesize = bytecount TABLES otf = job_output_info-otfdata lines = it_pdf EXCEPTIONS err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 OTHERS = 4. CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE' EXPORTING line_width_src = 134 line_width_dst = 255 TABLES content_in = it_pdf content_out = file_tab. "Save the file CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = bytecount filename = file_path filetype = 'BIN' TABLES data_tab = file_tab.
本文来自博客园,作者:yangliu11223,转载请注明原文链接:https://www.cnblogs.com/yangliu11223/p/15727865.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏