T-CODE:smartforms 可以去设计自己需要的报表打印样式。
步骤如下:
1.创建Style,先设置好自己在form里要用到的段落与字体格式,比如标题/内容/页脚 段落等等
2.如有指定格式字体的固定性文字,比如采购协议等,可以创建好Text Module, 再在form里直接使用
3.Form设计,FORM属性可设置打印纸张尺寸,FORM接口设置传入参数与内标数据,通常页和窗口可以新增,一般常见三大部分,标题/表头数据与循环内表数据/页尾,具体要看需求,窗口布局要把控好,不能超出比如设定为A4大小的尺寸限制。
如下创建了一个名为:ZSTOCK的form,代码调用如下:
首先是打印机直接列印的代码:
*&---------------------------------------------------------------------*
*& Report zsmartformsdd
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsmartformsdd.
DATA: lt_stock LIKE STANDARD TABLE OF zstock WITH HEADER LINE.
DATA: funname TYPE rs38l_fnam.
DATA: ls_outset TYPE ssfcompop.
DATA: ls_control TYPE ssfctrlop.
DATA: ls_output_info TYPE ssfcrescl.
DATA: ls_output_options TYPE ssfcresop.
DATA: l_devtype TYPE rspoptype.
DATA: l_bin_filesize TYPE i.
DATA: lt_docs TYPE STANDARD TABLE OF docs.
DATA: lt_lines TYPE STANDARD TABLE OF tline.
DATA: l_pdf_name TYPE string.
DATA: l_guiobj TYPE REF TO cl_gui_frontend_services.
DATA: l_filepath TYPE string.
DATA: l_fullpath TYPE string.
DATA: l_filename TYPE string.
DATA: l_uact TYPE i.
PARAMETERS: p_werks LIKE mard-werks DEFAULT '6310' .
START-OF-SELECTION.
* 获取Plant库存
SELECT a~werks, b~name1, a~lgort, a~matnr, c~maktx, a~labst
INTO TABLE @lt_stock UP TO 100 ROWS
FROM mard AS a
INNER JOIN t001w AS b ON a~werks = b~werks
LEFT JOIN makt AS c ON a~matnr = c~matnr
WHERE a~werks = @p_werks.
* 通过form的名称获取函数名
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSTOCK'
IMPORTING
fm_name = funname.
* smartforms 打印参数设置
CLEAR: ls_outset, ls_control.
ls_outset-tddest = 'LP01'. " 默认打印机
ls_outset-tdimmed = 'X'. " 快速打印
ls_outset-tdarmod = 1. " 本地设置生效
ls_control-no_dialog = 'X' . " 不显示打印窗口
ls_control-preview = 'X'. " 直接预览
* ls_control-getotf = 'X'. " 取得OTF DATA
* 启动smartforms
CALL FUNCTION funname
EXPORTING
output_options = ls_outset " 打印参数选项
control_parameters = ls_control " 打印控制
IMPORTING
job_output_info = ls_output_info " 打印结果返回
TABLES
lt_stock = lt_stock. " 内表数据
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
如果只是导出列印的PDF版本,需要启用参数getotf,再将otf data转成pdf data, 代码如下:
*&---------------------------------------------------------------------*
*& Report zsmartformsdd
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsmartformsdd.
DATA: lt_stock LIKE STANDARD TABLE OF zstock WITH HEADER LINE.
DATA: funname TYPE rs38l_fnam.
DATA: ls_outset TYPE ssfcompop.
DATA: ls_control TYPE ssfctrlop.
DATA: ls_output_info TYPE ssfcrescl.
DATA: ls_output_options TYPE ssfcresop.
DATA: l_devtype TYPE rspoptype.
DATA: l_bin_filesize TYPE i.
DATA: lt_docs TYPE STANDARD TABLE OF docs.
DATA: lt_lines TYPE STANDARD TABLE OF tline.
DATA: l_pdf_name TYPE string.
DATA: l_guiobj TYPE REF TO cl_gui_frontend_services.
DATA: l_filepath TYPE string.
DATA: l_fullpath TYPE string.
DATA: l_filename TYPE string.
DATA: l_uact TYPE i.
PARAMETERS: p_werks LIKE mard-werks DEFAULT '6310' .
START-OF-SELECTION.
* 获取Plant库存
SELECT a~werks, b~name1, a~lgort, a~matnr, c~maktx, a~labst
INTO TABLE @lt_stock UP TO 100 ROWS
FROM mard AS a
INNER JOIN t001w AS b ON a~werks = b~werks
LEFT JOIN makt AS c ON a~matnr = c~matnr
WHERE a~werks = @p_werks.
* 通过form的名称获取函数名
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSTOCK'
IMPORTING
fm_name = funname.
* smartforms 打印参数设置
CLEAR: ls_outset, ls_control.
ls_outset-tddest = 'LP01'. " 默认打印机
ls_outset-tdimmed = 'X'. " 快速打印
ls_outset-tdarmod = 1. " 本地设置生效
ls_control-no_dialog = 'X' . " 不显示打印窗口
ls_control-preview = 'X'. " 直接预览
ls_control-getotf = 'X'. " 取得OTF DATA
* 启动smartforms
CALL FUNCTION funname
EXPORTING
output_options = ls_outset " 打印参数选项
control_parameters = ls_control " 打印控制
IMPORTING
job_output_info = ls_output_info " 打印结果返回
TABLES
lt_stock = lt_stock. " 内表数据
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* IF ls_output_info-outputdone = 'X' . " 打印完成,结果返回
*
* ENDIF.
* OTF DATA转为PDF
CALL FUNCTION 'CONVERT_OTF_2_PDF'
IMPORTING
bin_filesize = l_bin_filesize
TABLES
otf = ls_output_info-otfdata
doctab_archive = lt_docs
lines = lt_lines
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2
OTHERS = 3.
l_pdf_name = 'stock.pdf'.
CREATE OBJECT l_guiobj.
* 文件保存选择
CALL METHOD l_guiobj->file_save_dialog
EXPORTING
* window_title =
default_extension = 'pdf'
default_file_name = l_pdf_name
CHANGING
filename = l_pdf_name
path = l_filepath
fullpath = l_fullpath
user_action = l_uact.
* 下载文件
l_filename = l_fullpath.
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.
最终结果如下: