自己偶尔做的一个实例,具体内容是:
封面单独一页,写着采购订单,然后写着订单的抬头和明细,明细中数量金额小计,5行一页。
只是测试用的,比较简陋啊。
1、封面:采购订单文本是通过text module,然后再window中直接调用,logo是通过SE78上传的。
因为只是封面调用一次,所以没有创建main window,同时next page 也不是当前页。
接口变量和全局变量:
1、调用table控件之前,这里获取header_count的原因是在后面的分页情况下,当达到最后一页的时候不会再分页,从而产生一个空白页
在表头部分获取header 的数据。表头和注脚只会在分页的时候才会调用。
如果是在table控件中绑定bar code,很容易出现格子不够大,所以此时需要调整段落的间距。
因为detail的内容是采购订单行项目,所以需要循环header中的采购订单。
进入循环,需要确定当前行是否是第5行或5的倍数,根据这个来进行分行;对数字金额进行小计;是否需要换表头;
CLEAR:disp_auto_paging_txt.
"分类小计
total_amount = total_amount + ls_detail-netpr.
total_qty = total_qty + ls_detail-menge.
"当使用强制分页时,可以不用像上面那样判断 就可以给 lastrow 赋值,如果不使用
"强制分页,则需要像上面那样赋值
lastrow = ls_detail-last_flag .
if lastrow = 'X' .
"下一页所需读取的gt_head数据的索引号
header_index = headER_index + 1.
endif.
"每页数据的流水号
serial_number = serial_number + 1.
DATA mod TYPE i.
mod = serial_number mod 5.
if mod = 0 ."如果满一页时
"当前页码加一
current_page = current_page + 1.
disp_auto_paging_txt = 'X'. "分页
IF lastrow = 'X'.
total_amount_n = total_amount.
total_qty_n = total_qty.
ELSE.
clear total_amount_n.
clear total_qty_n.
ENDIF.
endif.
在main area的主要区域最后确定是否分页。
脚注部分:需要显示数量和金额进行小计,同时确定是否需要结束table的循环。
主程序文本如下:
REPORT yjzj_smartform_control_paging.
DATA: lt_poheader TYPE TABLE OF ytest_sform_02,
ls_poheader TYPE ytest_sform_02,
lt_poitem TYPE TABLE OF ytest_sform_01,
lt_poitem3 TYPE TABLE OF ytest_sform_01,
ls_poitem TYPE ytest_sform_01.
DATA: g_rows TYPE i, "记录已读取的行数
g_spacelines TYPE i, "不满一页时需要补充的空行行数
g_tabix LIKE sy-tabix,
flg .
START-OF-SELECTION.
PERFORM initdata.
"initData
LOOP AT lt_poheader INTO ls_poheader.
CLEAR: g_rows,flg.
LOOP AT lt_poitem INTO ls_poitem WHERE ebeln = ls_poheader-ebeln.
flg = 'x'.
g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
g_rows = g_rows + 1. "条数加1
IF g_rows = 5."满一页后计数双从零开始
"满一页数总页数加一
ls_poheader-total_page = ls_poheader-total_page + 1.
CLEAR: g_rows.
ENDIF.
ls_poitem-xh = ls_poitem-ebelp.
APPEND ls_poitem TO lt_poitem3.
ENDLOOP.
IF g_rows <> 0 OR flg IS INITIAL."如果不满一页,或者无数据时
CLEAR: ls_poitem.
ls_poitem-ebeln = ls_poitem-ebeln.
g_spacelines = 5 - g_rows."需要补的空白行数
DO g_spacelines TIMES.
IF sy-index = g_spacelines.
ls_poitem-last_flag = 'X'.
ENDIF.
APPEND ls_poitem TO lt_poitem3.
"SY-TABIX为上面APPEND语句操作后所影响的索引号
g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
ENDDO.
"满一页数总页数加一
ls_poheader-total_page = ls_poheader-total_page + 1.
ENDIF.
MODIFY lt_poheader FROM ls_poheader TRANSPORTING total_page .
ENDLOOP.
PERFORM callsmartform.
FORM callsmartform .
DATA: lf_fm_name TYPE rs38l_fnam.
DATA: control TYPE ssfctrlop,
ls_output_option TYPE ssfcompop,
ntotalline TYPE i,
npageline TYPE i VALUE 10,
p_index LIKE sy-tabix.
DATA: emptycount TYPE i , "空行数.
ncurrline TYPE i, "中间变量
job_output_info TYPE ssfcrescl.
control-no_open = 'X'.
control-no_close = 'X'.
ls_output_option-tddest = 'LP01'.
"control-no_dialog = 'X'.
control-preview = 'X'.
"***********调用SMARTFORM程序生成函数
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'YTEST_LAZHAO_01'
IMPORTING
fm_name = lf_fm_name.
"***********动态调用新生成的函数
CALL FUNCTION lf_fm_name
TABLES
lt_header = lt_poheader[]
lt_detail = lt_poitem3[]
lt_detail2 = lt_poitem3[].
ENDFORM.
FORM initdata.
DATA: times TYPE i,
classname TYPE string,
number TYPE i VALUE 1,
str TYPE string.
SELECT DISTINCT ebeln
FROM ekpo
INTO TABLE @DATA(lt_ebeln)
WHERE ebeln IN ('4400000260','4400000259').
IF lt_ebeln[] IS NOT INITIAL.
SELECT ebeln bukrs FROM ekko INTO TABLE lt_poheader
FOR ALL ENTRIES IN lt_ebeln
WHERE ebeln = lt_ebeln-ebeln.
SELECT ebeln ebelp matnr menge meins netpr
FROM ekpo INTO CORRESPONDING FIELDS OF TABLE lt_poitem
FOR ALL ENTRIES IN lt_ebeln
WHERE ebeln = lt_ebeln-ebeln.
ENDIF.
ENDFORM.