abap smartforms 实现单据

abap实现报表还比较easy,但abap smartforms 实现单据再加上要有分页对于我来说可愁大了,什么都不会,网上有讲的挺细致的,但还是实现不来,问经理他让我慢慢研究,无奈,学吧……

下面是实现步骤,不仅不完善,而且肯定有问题,希望大鸟指正:

单据要求:

实现步骤:(1)在创建smartformsform之前建立段落样式,字体样式等:

2)创建smartformsform表格

 

 

 

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_line1g_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

 

新到公司用sap,开始学习sap abap,什么都不太会,做了好几天才搞出来个单据和一个报表,将过程写出来分享,希望高手指出不足,我会非常之感激。

本来语文就不好,想偷点懒截图,结果还要一个个插进来,郁闷……

posted @ 2011-08-05 10:11  luge  阅读(3228)  评论(2编辑  收藏  举报