加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实现SmartForms的分页打印

(2017-02-24 16:49:34)
标签:

abap

sap

分类: ABAP
1.创建SmartForms程序

表格属性与接口不在这里设置,因为传输数据通过内存地址来传输,不需要建立结构。直接定义全局变量:

http://img0.ph.126.net/evz3dAKVd8epOsX6ZjT43Q==/2126261974172379477.jpg

  wa_blanks        type typ_items_row     "空白行工作区

  ig_blanks        type typ_items_table   "空白行内表

  g_count          type                 "记录一张报表的明细的记录数量

  G_CURRLINE      type                 "记录所有报表共计打印了多少行,用于判断最后一页

  G_TOTALLINES type                    "记录内表ig_items总行数,用于判断最后一页

  G_CURRPAGE     type                  "一个凭证的当前页码

  G_TOTALPAGE  type                    "一个凭证的总页码

全局变量类型的定义

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.LOOP4CODE4

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

附程序代码:

 

  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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有