表格属性与接口不在这里设置,因为传输数据通过内存地址来传输,不需要建立结构。直接定义全局变量:
wa_blanks type typ_items_row "空白行工作区
ig_blanks type typ_items_table "空白行内表
g_count type i "记录一张报表的明细的记录数量
G_CURRLINE type i "记录所有报表共计打印了多少行,用于判断最后一页
G_TOTALLINES type i "记录内表ig_items总行数,用于判断最后一页
G_CURRPAGE type i "一个凭证的当前页码
G_TOTALPAGE type i "一个凭证的总页码
全局变量类型的定义
与程序中的内表结构一直
全局变量——初始化设置
进行数据传输的定义,并计算内表IT的行数据,
至此,我们已经得到了表头和明细这2个内表的数据,下面准备画报表并输出数据。
2.表布局的逻辑结构
在SmartForm中,只有窗口类型为“主窗口”的窗口,才能被循环。例如,在最前面的样表中,明细数据有20条,不能在一页中打印输出完毕,需要输出4页才能打印完一张单据的数据,在这4张单据中,表头和表尾是不变的,但是表中间部分数据却是变化的,中间这个窗口需要被循环输出4次。因此需要将这个窗口类型设定为“主窗口”。在本例中为现实明细数据的这部分。
“窗口1”:从表最上面到明细栏的标题栏(包括标题栏)
注意,我将输出表头的窗口“windows1 表头”放在了输出明细数据的窗口“主窗口”的下面,这是必须的,因为表头中的数据需要从表头内表GT_HE_ITAB中。loop1是循环内表GT_HE_ITAB,将数据放到表头工作区GS_HE_ITAB中。所以,windows1 页头窗口就可以直接使用工作区GS_HE_ITAB中的数据。如果该窗口放在了主窗口的前面,那么至少第一页中表头会没有数据,而且后面每一页的表头显示的都是下一个表头的内容。
注:虽然打印机输出时,先打印WINDOWS1 页头,再打印MAIN主窗口,最后打印WINDOW2页尾窗口,但是程序执行时,却是按照上图中树结构从上到下进行处理的,是先处理MAIN主窗口,其次WINDOWS1 页头,最后WINDOW2页尾窗口的逻辑顺序。
下面详细介绍整个逻辑流程和代码:
1.LOOP1表头循环
作用:循环表头内表中的数据,每次打印一个凭证的行项目数据。由于内表在这里不能用,因此将每个表头数据放置到工作区。
2.LOOP4与CODE4
作用获取明细表有多少条数据,先loop符合条件的明细表,对这个表的数据计算有多少条行数据
3.CODE1初始化行记录并计算一张凭证的页数
用loop4得到的行数据作为判断计算出一张凭证(表头+明细)有几页
4.loop2循环明细数据
准备循环打印当前凭证的所有行项目
明细模板的设置
这里就不做详细介绍了对应的字段
这里的高度很重要
CODE5计算当前页码
作用:每输出一行,计算当前行所在的页码,即为当前页
5计算空行并打印空行
CODE3计算空行
作用:在当前凭证的所有有效数据行打印完毕以后,还需要计算需要打印多少空行,才能刚好打印满一张纸。用计算的数量,填充内表IG_BLANKS,计算完毕以后,G_COUNT必须清0。
打印空行:
强制分页设置
作用:在一个凭证打印完毕以后,将要进入打印下一个凭证之前,需要分页,但是在打印完最后一个凭证的最后一页以后,却不能有分页,否则最后会多一个空行。
当上面的条件相等的时候开始转到page1重新执行一次
自动分页的条件是“MAIN主窗口”的高度被打印满了,因此一定要注意,主窗口的高度必须等于你需要的高度,不要多,也不要少,在本例中,高度为8行 x 8mm =64mm
下面就是代码介绍:
打印预览:
附程序代码:
REPORT Z_ZJ_PP_P01. TABLES: CAUFV, "订单表头 PP/CO" afko, MAKT , "物料描述(成品) RESB . "预定/相关需求 *定单物料表头 TYPES : BEGIN OF gt_s_caufv,"订单表头 PP/CO aufnr TYPE caufv-aufnr, "生产单号 plnbez TYPE caufv-plnbez,"产品料号 MAKTX LIKE MAKT-MAKTX, "订单物料描述(短文本) gamng TYPE caufv-gamng,"工单数量 rsnum TYPE caufv-rsnum,"预留/相关需求的编号 gltrp TYPE caufv-gltrp,"订单需求日期 * stlbez TYPE caufv-stlbez,"产品料号 * aufpl TYPE caufv-aufpl,"订单中工序的工艺路线号 * werks TYPE caufv-werks,"订单生产工厂 * auart TYPE caufv-auart,"订单类型 END OF gt_s_caufv. DATA gt_caufv TYPE STANDARD TABLE OF gt_s_caufv WITH HEADER LINE. *定单下阶物料明细 TYPES: BEGIN OF gt_s_resb,"预定/相关需求 aufnr TYPE resb-aufnr,"生产单号 rsnum TYPE resb-rsnum,"预留/相关需求的编号 rspos TYPE resb-rspos,"预留/相关需求的项目编号 bdmng TYPE resb-bdmng,"需求数量 matnr TYPE resb-matnr,"物料号 MAKTX LIKE MAKT-MAKTX,"物料描述(短文本) END OF gt_s_resb. DATA gt_resb TYPE STANDARD TABLE OF gt_s_resb WITH HEADER LINE. DATA: num TYPE i. *查询输入界面 SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001. * *PARAMETERS: * * p_mybez LIKE caufv-plnbez . "成品编码 SELECT-OPTIONS: p_aufnr FOR afko-aufnr OBLIGATORY . "生产单号 SELECTION-SCREEN END OF BLOCK block1. START-OF-SELECTION. PERFORM GET_DATA. DESCRIBE TABLE gt_caufv LINES num. IF num NE 0. PERFORM FRM_PRINT_SELECTED. ENDIF. IF num EQ 0. MESSAGE '没有符合条件的数据 ' TYPE 'I'. ENDIF. FORM GET_DATA. *获取产品物料数据 SELECT CAUFV~aufnr CAUFV~plnbez MAKT~MAKTX CAUFV~gamng CAUFV~rsnum CAUFV~gltrp INTO CORRESPONDING FIELDS OF TABLE gt_caufv FROM CAUFV INNER JOIN MAKT ON CAUFV~plnbez = MAKT~MATNR WHERE aufnr IN p_aufnr. *获取定单下阶物料明细数据 SELECT resb~aufnr resb~rsnum resb~rspos resb~bdmng resb~matnr MAKT~MAKTX INTO CORRESPONDING FIELDS OF TABLE gt_resb from resb INNER join MAKT ON resb~MATNR = MAKT~MATNR WHERE aufnr IN p_aufnr. SORT gt_resb BY RSPOS . ENDFORM. FORM FRM_PRINT_SELECTED. DATA: fm_name TYPE rs38l_fnam value ''. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'Z_ZJ_PP_001' "SmartForms程序 IMPORTING fm_name = fm_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. CALL FUNCTION fm_name 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. ENDFORM. |
最后也非常感谢学无止境的博主分享经典smartForms教材:http://www.cnblogs.com/zhumk/archive/2005/06/04/167904.html