Smartforms 循环打印数据
在 smartform 的使用中,偶尔会遇到用户要求按某一条件进行数据的分组打印,并进行页码的统计和区分,这里记录下自己使用的方法。
FORM sub_data_print .
SORT itab_total BY matkl budat zcdnr.
SORT s_fenlei BY low.
"ALV Data"
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.
DATA: itab_print LIKE TABLE OF wand.
DATA: mid TYPE c LENGTH 20.
ls_control_param-langu = sy-langu.
ls_control_param-no_open = 'X'.
ls_control_param-no_close = 'X'.
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 = 'FORM_NAME'
IMPORTING
fm_name = fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3 .
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT s_fenlei.
REFRESH itab_print.
LOOP AT itab_total INTO wand WHERE fenlei = s_fenlei-low.
APPEND wand TO itab_print.
ENDLOOP.
IF itab_print IS INITIAL.
CONTINUE.
ENDIF.
CONCATENATE sy-uname sy-uzeit INTO mid.
"将内表数据存入 ABAP 内存"
EXPORT a = itab_print TO DATABASE indx(hk) ID mid.
CALL FUNCTION fm_name
EXPORTING
control_parameters = ls_control_param
output_options = ls_composer_param
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.
ENDIF.
"删除内存数据"
DELETE FROM DATABASE indx(hk) ID mid.
ENDLOOP.
CALL FUNCTION 'SSF_CLOSE'
IMPORTING
job_output_info = i_job_output_info
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " SUB_DATA_PRINT "