ABAP 随笔 smartforms 打印及 PDF 转化

作者:SAPTAB 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, MM, 开发, 数据工程, 物料管理

原创 TAB [ SAP TAB ](javascript:void\(0\);)

点击 **蓝字** 关注我们

**一起来探索宇宙的奥秘** ****

To explore universe

打开一切科学的钥匙都毫无异议地是问号,我们大部分的伟大发现都应当归功于如何?而生活的智慧大概就在于逢事都问个为什么?

——巴尔扎克

ABAP 随笔 smartforms 打印及 PDF 转化 - 封面图
ABAP 随笔 smartforms 打印及 PDF 转化 - 封面图

冬至已过,又临平安夜和圣诞,又是一年的末尾,闲暇时间需要静下心来温故而知新。

许久未碰打印,知识于脑子又有几分糊涂,遂整理些许知识,记录。

数据随便取于物料表

ABAP 随笔 smartforms 打印及 PDF 转化 - 封面图
ABAP 随笔 smartforms 打印及 PDF 转化 - 封面图

—— BEGIN ——

report Z_smartforms

TABLES:mara.
TYPES:BEGIN OF ty_data,

checkbox TYPE c,

matnr TYPE mara-matnr,

mtart TYPE mara-mtart,

matkl TYPE mara-matkl,

maktx TYPE makt-maktx,

END OF ty_data.

DATA gt_data TYPE TABLE OF ty_data.

*INCLUDE zalv_oo_cls.

INCLUDE z_smartforms_cls.

DATA ok_code TYPE sy-ucomm.

DATA: gt_fieldcat TYPE lvc_t_fcat. "字段操作表
DATA: gs_layout TYPE lvc_s_layo.
SELECT-OPTIONS:

matnr FOR mara-matnr,

mtart FOR mara-mtart,

matkl FOR mara-matkl.

START-OF-SELECTION.

SELECT

a~matnr ,

a~mtart ,

a~matkl ,

b~maktx

INTO CORRESPONDING FIELDS OF TABLE @gt_data

FROM mara AS a

INNER JOIN makt AS b ON a~matnr = b~matnr

UP TO 30 ROWS.

END-OF-SELECTION.

CHECK gt_data[] IS NOT INITIAL.

CREATE OBJECT gr_alv.

PERFORM frm_set_fieldcat.

CALL METHOD gr_alv->standard_oo_alv

EXPORTING

iv_screen = '9000'

iv_default_ex = 'X'

is_layout = gs_layout

iv_self_ucomm = 'X'

iv_container_name = 'TC'

CHANGING

• CR_DOCK = GR_DOCK

• CR_GRID = GR_GRID

ct_fieldcat = gt_fieldcat

ct_data = gt_data

EXCEPTIONS

create_alv_failed = 1.
CALL SCREEN 9000.
FORM frm_set_fieldcat.

gs_layout-sel_mode = 'D' . "模式

gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示

gs_layout-cwidth_opt = 'X'. "将ALV字段宽度设置为最优化

gs_layout-no_merging = ''.

gs_layout-box_fname = 'CHECKBOX'.

DATA lv_pos TYPE i.

DATA ls_fieldcat LIKE LINE OF gt_fieldcat.

DEFINE %%append_fieldcat.

lv_pos = lv_pos + 1.
ls_fieldcat-col_pos = lv_pos.
ls_fieldcat-fieldname = &1."字段名
ls_fieldcat-coltext = &2."文本
* ls_fieldcat-no_zero = &3."去掉前导零
ls_fieldcat-ref_table = &3\.
ls_fieldcat-ref_field = &4\.
APPEND ls_fieldcat TO gt_fieldcat.

CLEAR ls_fieldcat.

END-OF-DEFINITION.

%%append_fieldcat

'CHECKBOX' '选择' '' '',

'MATNR' '' 'MARA' 'MATNR',

'MTART' '' 'MARA' 'MTART',

'MATKL' '' 'MARA' 'MATKL',

'MAKTX' '' 'MAKT' 'MAKTX'.

ENDFORM.

*&\---------------------------------------------------------------------*

*& Module STATUS_9000 OUTPUT

*&\---------------------------------------------------------------------*

*&

*&\---------------------------------------------------------------------*

MODULE status_9000 OUTPUT.

SET PF-STATUS 'STATUS'.

SET TITLEBAR 'TITLE'.

ENDMODULE.

*&\---------------------------------------------------------------------*

*& Module USER_COMMAND_9000 INPUT

*&\---------------------------------------------------------------------*

• text

*----------------------------------------------------------------------*

MODULE user_command_9000 INPUT.

ok_code = sy-ucomm.

CASE ok_code.

WHEN 'BACK' OR 'EXIT'.

LEAVE TO SCREEN 0.

WHEN 'CANC'.

LEAVE PROGRAM.

WHEN OTHERS.

ENDCASE.
ENDMODULE.

*&\---------------------------------------------------------------------*

*& Form FRM_PRINT_DATA

*&\---------------------------------------------------------------------*

*& text

*&\---------------------------------------------------------------------*

*& \--> p1 text

*& <\-- p2 text

*&\---------------------------------------------------------------------*

FORM frm_print_data .
TYPES: lty_spopli TYPE TABLE OF spopli WITH EMPTY KEY.
DATA(lt_spopli) = VALUE lty_spopli(

( selflag = 'X' varoption = '打印')

( varoption = '仅预览')

( varoption = '输出PDF')

).

DATA: antwort TYPE c.

"选择打印功能

CALL FUNCTION 'POPUP_TO_DECIDE_LIST'

EXPORTING

cursorline = 1

mark_flag = 'X'

mark_max = 1

• START_COL = 0

• START_ROW = 0

textline1 = '请选择输出功能'

• TEXTLINE2 = ' '

• TEXTLINE3 = ' '

titel = '功能选择'

• DISPLAY_ONLY = ' '

IMPORTING

answer = antwort

TABLES

t_spopli = lt_spopli

EXCEPTIONS

not_enough_answers = 1

too_much_answers = 2

too_much_marks = 3

OTHERS = 4.

IF sy-subrc NE 0.

MESSAGE '请选择一个功能' TYPE 'I'.

RETURN.

ENDIF.

CHECK antwort IS NOT INITIAL.

DATA: fname(30) VALUE 'ZTEST_SMARTFORMS_01'.
DATA: fm_name TYPE rs38l_fnam.
DATA: ls_control_param TYPE ssfctrlop ."控制结构
DATA: ls_composer_param TYPE ssfcompop ."处理输出
DATA: outopt TYPE ssfcresop.
DATA: i_job_output_info TYPE ssfcrescl.

CASE antwort.

WHEN '1'.

ls_control_param-langu = '1'.
ls_control_param-no_open = 'X'."控制smartforms的调用
ls_control_param-no_close = 'X'."控制假脱机系统
ls_control_param-device = 'PRINTER'."
"最后一张票据需要关闭假脱机 ls_control_param-no_close = space

PERFORM frm_print_smf USING

ls_control_param

ls_composer_param

fname

CHANGING

i_job_output_info.

WHEN '2'."直接预览

ls_composer_param-tdnoprint = 'X'."预览界面无打印按钮
ls_control_param-langu = '1'.
ls_control_param-no_open = 'X'."控制smartforms的调用
ls_control_param-no_close = 'X'."控制假脱机系统
"最后一张票据需要关闭假脱机 ls_control_param-no_close = space
ls_control_param-no_dialog = 'X'."
ls_control_param-device = 'PRINTER'."
ls_control_param-preview = 'X'."预览

PERFORM frm_print_smf USING

ls_control_param

ls_composer_param

fname

CHANGING

i_job_output_info.

WHEN '3'.

DATA: lv_fullpath TYPE string.
DATA: l_filename TYPE string.
DATA: l_bin_filesize TYPE i.

DATA :l_bin_file TYPE xstring.

DATA: lt_lines TYPE STANDARD TABLE OF tline.
CALL METHOD cl_gui_frontend_services=>directory_browse

EXPORTING

window_title = '选择目录'

• INITIAL_FOLDER =

CHANGING

selected_folder = lv_fullpath.

• 根据SmartForm 名称获得Form的 Function Name

CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

EXPORTING

formname = fname

IMPORTING

fm_name = fm_name

EXCEPTIONS

no_form = 1

no_function_module = 2

OTHERS = 3.

IF sy-subrc <> 0\.

MESSAGE 'Call SSF_FUNCTION_MODULE_NAME Error' TYPE 'E'.

ENDIF.
ls_control_param-langu = '1'.
ls_control_param-no_dialog = 'X'."
ls_control_param-getotf = 'X'."
ls_composer_param-tddest = 'LP01'."打印机

• smartforms

CALL FUNCTION fm_name

EXPORTING

control_parameters = ls_control_param
output_options = ls_composer_param

IMPORTING

job_output_info = i_job_output_info

EXCEPTIONS

formatting_error = 1

internal_error = 2

send_error = 3

user_canceled = 4

OTHERS = 5.

IF sy-subrc <> 0\.

MESSAGE 'Call SmartForms Error' TYPE 'E'.

ENDIF.

• Convert content to PDF

CALL FUNCTION 'CONVERT_OTF'

EXPORTING

format = 'PDF'

IMPORTING

bin_filesize = l_bin_filesize

• BIN_FILE = L_BIN_FILE

TABLES

otf = i_job_output_info-otfdata[]

lines = lt_lines

EXCEPTIONS

err_max_linewidth = 1

err_format = 2

err_conv_not_possible = 3

OTHERS = 4.

CONCATENATE lv_fullpath '\' sy-datum sy-uzeit

'.PDF' INTO l_filename.

• download pdf

CALL FUNCTION 'GUI_DOWNLOAD'

EXPORTING

bin_filesize = l_bin_filesize

filename = l_filename

filetype = 'BIN'

TABLES

data_tab = lt_lines

EXCEPTIONS

file_write_error = 1

no_batch = 2

gui_refuse_filetransfer = 3

invalid_type = 4

no_authority = 5

unknown_error = 6

header_not_allowed = 7

separator_not_allowed = 8

filesize_not_allowed = 9

header_too_long = 10

dp_error_create = 11

dp_error_send = 12

dp_error_write = 13

unknown_dp_error = 14

access_denied = 15

dp_out_of_memory = 16

disk_full = 17

dp_timeout = 18

file_not_found = 19

dataprovider_exception = 20

control_flush_error = 21

OTHERS = 22.

WHEN OTHERS.

ENDCASE.
ENDFORM.

*&\---------------------------------------------------------------------*

*& Form FRM_PRINT_SMF

*&\---------------------------------------------------------------------*

*& text

*&\---------------------------------------------------------------------*

*& \--> LS_CONTROL_PARAM

*& \--> LS_COMPOSER_PARAM

*& \--> FNAME

*& <\-- I_JOB_OUTPUT_INFO

*&\---------------------------------------------------------------------*

FORM frm_print_smf USING ls_control_param TYPE ssfctrlop

ls_composer_param TYPE ssfcompop

fname TYPE char30

CHANGING i_job_output_info TYPE ssfcrescl.

DATA: outopt TYPE ssfcresop,

fm_name TYPE rs38l_fnam.

CALL FUNCTION 'SSF_OPEN'

EXPORTING

control_parameters = ls_control_param
output_options = ls_composer_param

IMPORTING

job_output_options = outopt

EXCEPTIONS

formatting_error = 1

internal_error = 2

send_error = 3

user_canceled = 4

OTHERS = 5.

IF sy-subrc <> 0\.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

EXIT.

ENDIF.

• 根据SmartForm 名称获得Form的 Function Name

CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

EXPORTING

formname = fname

IMPORTING

fm_name = fm_name

EXCEPTIONS

no_form = 1

no_function_module = 2

OTHERS = 3.

IF sy-subrc <> 0\.

MESSA

...

SAPTAB

关于作者:SAPTAB

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP随笔smartforms打印及PDF转化.md」整理生成,仅用于内部技术分享与学习交流。