abap实现报表还比较easy,但abap smartforms 实现单据再加上要有分页对于我来说可愁大了,什么都不会,网上有讲的挺细致的,但还是实现不来,问经理他让我慢慢研究,无奈,学吧……
下面是实现步骤,不仅不完善,而且肯定有问题,希望大鸟指正:
单据要求:
http://blog.sina.com.cn/s/blog_69f0481901015hro.html
实现步骤:(1)在创建smartforms的form之前建立段落样式,字体样式等:
(2)创建smartforms的form表格
(3)在表格接口———》表 中建立两个表接口(),
(4)定义全局变量
在初始化中
DESCRIBE TABLE GTD_ITEM LINES G_TOTALLINES.//获取整个table中数据列表中总的行数
TABLES:EKKO,EKPO,EKET,MAKT.//用于金额和数量的显示,因为他有些参考表,不能直接显示,不用这种方法可以在货币数量字段中新定义一些货币数量字段。
(5)在%page新页面上建立如图所示的结构:
三个文件夹分别表示:单据名称,table的头部信息,还有单据头部信息,可以分别加上各自的样式
(6)在mian中建立如图的结构
1、%LOOP1表头循环
设置:数据-〉loop循环-〉操作数:GTD_HEADER into GTH_HEADER
作用:循环表头内表中的数据,每次打印一个凭证的行项目数据。由于内表在这里不能有工作区,因此将每个表头数据放置到另外的工作区。如图:
2、%LOOP2循环明细数据,统计单张凭证行数
设置:
作用:由于在打印每张凭证及行项目之前,需要知道该凭证的总页数,因此需要首先计算gtd_ITEMS内表中有多少条当前凭证的行记录数。
3.统计总页数:
4.%loop3循环明细数据,
记录单张凭证数和积累行数:
5.明细模板
根据纸张要求设置它的宽度和显示高度还有根据要显示的数据列出表格数量和每格宽度高度。
在文本中写入变量:
注意:在设置金额时,须将变量加个(c),变成字符串形式,否则显示时候会不齐。
如图:
6.计算当前页:
7.记录空行:
8.空数据条目循环:where条件为空
作用:循环内表GTD_BLANKS,次数为内表中的记录数,即空行数,打印输出空行。
空数据条目循环模板设置要与前面的明细模板一只
主窗口的高度必须等于你需要的高度,不要多,也不要少,在本例中,高度为10行 x 11mm = 110mm,不一致分页效果将出现两页数据在一页而分页正常,导致错误。
9.强制分页:
一般属性——>转到新页
条件:
WINDOW1中模板设置一下行与列的值就行了,很简单,如图所示:
差点忘了一点,就是上面的清空数据一定要有:
清空数据才能保证数据经过循环后达到想要的值
最后实现效果:
本例中g_line1和g_page可以不设,设置是为了其他功能,想实现简单的单据完全可以不设置。
下面是调用程序:
*&---------------------------------------------------------------------*
*& Report ZMM_TEST04
*&
* Program : 采购订单打印
* Author : 杨路
* Date : 2011/8/4
* Description : 打印采购订单
*&---------------------------------------------------------------------*
REPORT ZMM_TEST04.
TABLES:EKKO,EKPO,EKET,MAKT.
DATA: GTD_DATA TYPE STANDARD TABLE OF ZMM_TEST01,
GTH_DATA TYPE ZMM_TEST01.
DATA: GWK_FORMNAME TYPE STXFTXT-FORMNAME,
GWK_FNAME TYPE RS38L_FNAM.
DATA:GTD_HEADER TYPE STANDARD TABLE OF ZMM_TESTHEADER01,
GTH_HEADER TYPE ZMM_TESTHEADER01.
DATA:GTD_ITEM TYPE STANDARD TABLE OF ZMM_TESTITEM01,
GTH_ITEM TYPE ZMM_TESTITEM01.
DATA:LTD_HEADER TYPE STANDARD TABLE OF ZMM_TESTHEADER01,
LTH_HEADER TYPE ZMM_TESTHEADER01,
LTD_ITEM TYPE STANDARD TABLE OF ZMM_TESTITEM01,
LTH_ITEM TYPE ZMM_TESTITEM01.
*--------------------------------------------------------------------------*
* selection-screen
*--------------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
S_BSART FOR EKKO-BSART,
S_AEDAT FOR EKKO-AEDAT,
S_EBELN FOR EKKO-EBELN,
S_EKORG FOR EKKO-EKGRP,
S_EKGRP FOR EKKO-EKORG,
S_LIFNR FOR EKKO-LIFNR.
SELECTION-SCREEN END OF BLOCK B1.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM SUB_GET_DATA.
PERFORM SUB_PRINT.
FORM SUB_GET_DATA .
SELECT
EKKO~LIFNR
EKKO~EKORG
EKPO~WERKS
EKKO~EBELN
EKKO~AEDAT
INTO CORRESPONDING FIELDS OF TABLE GTD_HEADER
FROM EKKO
INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
WHERE EKKO~BSART IN S_BSART
AND EKKO~AEDAT IN S_AEDAT
AND EKKO~EBELN IN S_EBELN
AND EKKO~EKORG IN S_EKORG
AND EKKO~EKGRP IN S_EKGRP
AND EKKO~LIFNR IN S_LIFNR.
SELECT
EKKO~EBELN
EKPO~EBELP
MAKT~MATNR
MAKT~MAKTX
EKPO~MENGE
EKPO~MEINS
EKPO~NETPR
EKKO~WAERS
EKET~EINDT
INTO CORRESPONDING FIELDS OF TABLE GTD_ITEM
FROM EKKO
INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
LEFT JOIN EKET ON EKPO~EBELN = EKET~EBELN
AND EKPO~EBELP = EKET~EBELP
LEFT JOIN MAKT ON EKPO~MATNR = MAKT~MATNR
WHERE EKKO~BSART IN S_BSART
AND EKKO~AEDAT IN S_AEDAT
AND EKKO~EBELN IN S_EBELN
AND EKKO~EKORG IN S_EKORG
AND EKKO~EKGRP IN S_EKGRP
AND EKKO~LIFNR IN S_LIFNR.
SELECT
EKKO~LIFNR
EKKO~EKORG
EKPO~WERKS
EKKO~EBELN
EKKO~AEDAT
EKPO~EBELP
MAKT~MATNR
MAKT~MAKTX
EKPO~MENGE
EKPO~MEINS
EKPO~NETPR
EKKO~WAERS
EKET~EINDT
into table GTD_DATA
FROM EKKO
INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
LEFT JOIN EKET ON EKPO~EBELN = EKET~EBELN
AND EKPO~EBELP = EKET~EBELP
LEFT JOIN MAKT ON EKPO~MATNR = MAKT~MATNR
WHERE EKKO~BSART IN S_BSART
AND EKKO~AEDAT IN S_AEDAT
AND EKKO~EBELN IN S_EBELN
AND EKKO~EKORG IN S_EKORG
AND EKKO~EKGRP IN S_EKGRP
AND EKKO~LIFNR IN S_LIFNR.
ENDFORM.
FORM SUB_PRINT.
CLEAR: LTD_HEADER, LTD_ITEM.
LOOP AT GTD_DATA INTO GTH_DATA .
READ TABLE GTD_HEADER INTO GTH_HEADER WITH KEY EBELN = GTH_DATA-EBELN.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING GTH_HEADER TO LTH_HEADER.
COLLECT LTH_HEADER INTO LTD_HEADER.
CLEAR LTH_HEADER.
ENDIF.
READ TABLE GTD_ITEM INTO GTH_ITEM WITH KEY EBELN = GTH_DATA-EBELN
EBELP = GTH_DATA-EBELP.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING GTH_ITEM TO LTH_ITEM.
COLLECT LTH_ITEM inTO LTD_ITEM.
CLEAR LTH_ITEM.
ENDIF.
ENDLOOP.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = 'ZMM_TEST04'
IMPORTING
FM_NAME = GWK_FNAME.
CALL FUNCTION GWK_FNAME
TABLES
GTD_HEADER = LTD_HEADER "header table
GTD_ITEM = LTD_ITEM "item table
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. " SUB_PRINT