原创 TAB [ SAP TAB ](javascript:void\(0\);)
点击 **蓝字** 关注我们
**一起来探索宇宙的奥秘** ****
To explore universe
打开一切科学的钥匙都毫无异议地是问号,我们大部分的伟大发现都应当归功于如何?而生活的智慧大概就在于逢事都问个为什么?
——巴尔扎克
冬至已过,又临平安夜和圣诞,又是一年的末尾,闲暇时间需要静下心来温故而知新。
许久未碰打印,知识于脑子又有几分糊涂,遂整理些许知识,记录。
数据随便取于物料表
—— 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.
SELECTa~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_alvEXPORTING
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.'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_spopliEXCEPTIONS
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 = spacePERFORM 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 = spacels_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_browseEXPORTING
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_nameEXPORTING
control_parameters = ls_control_paramoutput_options = ls_composer_paramIMPORTING
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_linesEXCEPTIONS
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_linesEXCEPTIONS
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 ssfctrlopls_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_paramoutput_options = ls_composer_paramIMPORTING
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
...