实现SmartForms的分页打印

标签:
abapsap |
分类: ABAP |
表格属性与接口不在这里设置,因为传输数据通过内存地址来传输,不需要建立结构。直接定义全局变量:
http://img0.ph.126.net/evz3dAKVd8epOsX6ZjT43Q==/2126261974172379477.jpg
全局变量类型的定义
http://img1.ph.126.net/0iZqDVAQai9eWvcVgCU_1g==/1085086035237592882.jpg
与程序中的内表结构一直
全局变量——初始化设置
http://img0.ph.126.net/p7v5GNsX_f_IPTxWpqCTyQ==/3137601565493785122.jpg
进行数据传输的定义,并计算内表IT的行数据,
至此,我们已经得到了表头和明细这2个内表的数据,下面准备画报表并输出数据。
2.表布局的逻辑结构
在SmartForm中,只有窗口类型为“主窗口”的窗口,才能被循环。例如,在最前面的样表中,明细数据有20条,不能在一页中打印输出完毕,需要输出4页才能打印完一张单据的数据,在这4张单据中,表头和表尾是不变的,但是表中间部分数据却是变化的,中间这个窗口需要被循环输出4次。因此需要将这个窗口类型设定为“主窗口”。在本例中为现实明细数据的这部分。
“窗口1”:从表最上面到明细栏的标题栏(包括标题栏)
http://img0.ph.126.net/1Mr-Xsr8gx_-zlowbTcpGQ==/569423877903559701.jpg
注意,我将输出表头的窗口“windows1 表头”放在了输出明细数据的窗口“主窗口”的下面,这是必须的,因为表头中的数据需要从表头内表GT_HE_ITAB中。loop1是循环内表GT_HE_ITAB,将数据放到表头工作区GS_HE_ITAB中。所以,windows1 页头窗口就可以直接使用工作区GS_HE_ITAB中的数据。如果该窗口放在了主窗口的前面,那么至少第一页中表头会没有数据,而且后面每一页的表头显示的都是下一个表头的内容。
注:虽然打印机输出时,先打印WINDOWS1 页头,再打印MAIN主窗口,最后打印WINDOW2页尾窗口,但是程序执行时,却是按照上图中树结构从上到下进行处理的,是先处理MAIN主窗口,其次WINDOWS1 页头,最后WINDOW2页尾窗口的逻辑顺序。
下面详细介绍整个逻辑流程和代码:
1.LOOP1表头循环
http://img0.ph.126.net/BUwAgcj4ieLhvmTFsufozQ==/3137601565493785131.jpg
作用:循环表头内表中的数据,每次打印一个凭证的行项目数据。由于内表在这里不能用,因此将每个表头数据放置到工作区。
2.LOOP4与CODE4
http://img0.ph.126.net/nQGCmRq9B-HSdfQJ_0JMhg==/909727124829253605.jpg
http://img0.ph.126.net/rXb3fChxP6AkHtfuOkk_Nw==/3171378562699166655.jpg
http://img0.ph.126.net/8jfMRO5qZzLDtrCvYawcHw==/1021754165477694870.jpg
作用获取明细表有多少条数据,先loop符合条件的明细表,对这个表的数据计算有多少条行数据
3.CODE1初始化行记录并计算一张凭证的页数
http://img1.ph.126.net/lw-DJZfCGgDLEUMaOhXLrg==/1021754165477694874.jpg
用loop4得到的行数据作为判断计算出一张凭证(表头+明细)有几页
4.loop2循环明细数据
http://img1.ph.126.net/kfGpE7gpktxJ9uxClGDt6A==/6597761359472108914.jpg
http://img2.ph.126.net/x6McqKcr4Kaje37Nfaue9A==/1085086035237592889.jpg
准备循环打印当前凭证的所有行项目
http://img0.ph.126.net/2le2JTP-L0erNEFKoUqFeQ==/102175416563993325.jpg
明细模板的设置
http://img0.ph.126.net/mqZ7Z_7eAeoXw7OVwfMwoQ==/6598250642146253376.jpg
这里就不做详细介绍了对应的字段
http://img0.ph.126.net/lfQgRzN90poHbS_h_TRGKQ==/1932607190195548173.jpg
这里的高度很重要
CODE5计算当前页码
http://img2.ph.126.net/ucJeRnr6Unt0YYa0AhGh8Q==/6598198965099747596.jpg
作用:每输出一行,计算当前行所在的页码,即为当前页
5计算空行并打印空行
CODE3计算空行
http://img2.ph.126.net/6B1WxE9AJGMDsBGz0ECZYg==/1563593495645708621.jpg
作用:在当前凭证的所有有效数据行打印完毕以后,还需要计算需要打印多少空行,才能刚好打印满一张纸。用计算的数量,填充内表IG_BLANKS,计算完毕以后,G_COUNT必须清0。
打印空行:
http://img2.ph.126.net/MiWUhGo4xcDyckWEzj03qw==/5717520937574915654.jpg
http://img0.ph.126.net/kW6RoYfXNwJ_cXU6XnKhbg==/3012626675834270412.jpg
http://img0.ph.126.net/45V2xuPReP7uC9eJhrTb9w==/3012626675834270415.jpg
强制分页设置
http://img2.ph.126.net/BmMNhDzKDB0dZpzA1G6hyg==/3012626675834270417.jpg
http://img2.ph.126.net/_DD4cYKmId2EB6Ob7hvfuA==/2506534667626406180.jpg
作用:在一个凭证打印完毕以后,将要进入打印下一个凭证之前,需要分页,但是在打印完最后一个凭证的最后一页以后,却不能有分页,否则最后会多一个空行。
当上面的条件相等的时候开始转到page1重新执行一次
http://img2.ph.126.net/wu7uafZpNc3UawqziEX3Kg==/1932607190195548175.jpg
自动分页的条件是“MAIN主窗口”的高度被打印满了,因此一定要注意,主窗口的高度必须等于你需要的高度,不要多,也不要少,在本例中,高度为8行 x 8mm =64mm
http://img0.ph.126.net/lqZdWlgmaRjlZ8IaIjoGoA==/3137883040470493950.jpg
下面就是代码介绍:
打印预览:
http://img2.ph.126.net/bxUsp2d7VNOuAG9BHc4yeQ==/2855000688876303812.jpg
附程序代码:
TABLES: *定单物料表头 TYPES * * * * DATA *定单下阶物料明细 TYPES: DATA DATA: *查询输入界面 SELECTION-SCREEN * *PARAMETERS: * * SELECT-OPTIONS: SELECTION-SCREEN START-OF-SELECTION. PERFORM FORM *获取产品物料数据 |