Smartforms 的一个实例

22 篇文章 3 订阅

自己偶尔做的一个实例,具体内容是:

封面单独一页,写着采购订单,然后写着订单的抬头和明细,明细中数量金额小计,5行一页。

只是测试用的,比较简陋啊。

   

   

 

1、封面:采购订单文本是通过text module,然后再window中直接调用,logo是通过SE78上传的。

因为只是封面调用一次,所以没有创建main window,同时next page 也不是当前页。

  

接口变量和全局变量:



1、调用table控件之前,这里获取header_count的原因是在后面的分页情况下,当达到最后一页的时候不会再分页,从而产生一个空白页

在表头部分获取header 的数据。表头和注脚只会在分页的时候才会调用。

如果是在table控件中绑定bar code,很容易出现格子不够大,所以此时需要调整段落的间距。

     

因为detail的内容是采购订单行项目,所以需要循环header中的采购订单。

进入循环,需要确定当前行是否是第5行或5的倍数,根据这个来进行分行;对数字金额进行小计;是否需要换表头;

CLEAR:disp_auto_paging_txt.
"分类小计
total_amount = total_amount + ls_detail-netpr.
total_qty = total_qty + ls_detail-menge.

"当使用强制分页时,可以不用像上面那样判断 就可以给 lastrow 赋值,如果不使用
"强制分页,则需要像上面那样赋值
lastrow = ls_detail-last_flag .

if lastrow = 'X' .
"下一页所需读取的gt_head数据的索引号
   header_index = headER_index + 1.
endif.

"每页数据的流水号
serial_number = serial_number + 1.

DATA mod TYPE i.
mod = serial_number mod 5.
if  mod  = 0 ."如果满一页时
"当前页码加一
current_page = current_page + 1. 
disp_auto_paging_txt = 'X'. "分页
IF lastrow = 'X'.
  total_amount_n = total_amount.
  total_qty_n = total_qty.
ELSE.
  clear total_amount_n.
  clear total_qty_n.
ENDIF.
endif.


在main area的主要区域最后确定是否分页。

    

脚注部分:需要显示数量和金额进行小计,同时确定是否需要结束table的循环。

主程序文本如下:

REPORT  yjzj_smartform_control_paging.
DATA: lt_poheader TYPE TABLE OF ytest_sform_02,
      ls_poheader TYPE ytest_sform_02,
      lt_poitem   TYPE TABLE OF ytest_sform_01,
      lt_poitem3  TYPE TABLE OF ytest_sform_01,
      ls_poitem   TYPE ytest_sform_01.

DATA: g_rows       TYPE i, "记录已读取的行数
      g_spacelines TYPE i, "不满一页时需要补充的空行行数
      g_tabix      LIKE sy-tabix,
      flg .

START-OF-SELECTION.
  PERFORM  initdata.

  "initData

  LOOP AT lt_poheader INTO ls_poheader.
    CLEAR: g_rows,flg.
    LOOP AT lt_poitem INTO  ls_poitem WHERE ebeln  = ls_poheader-ebeln.
      flg = 'x'.
      g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
      g_rows = g_rows + 1.                                  "条数加1
      IF g_rows = 5."满一页后计数双从零开始
        "满一页数总页数加一
        ls_poheader-total_page =  ls_poheader-total_page + 1.
        CLEAR: g_rows.
      ENDIF.

      ls_poitem-xh = ls_poitem-ebelp.
      APPEND ls_poitem TO lt_poitem3.
    ENDLOOP.

    IF g_rows <> 0 OR flg IS INITIAL."如果不满一页,或者无数据时
      CLEAR: ls_poitem.
      ls_poitem-ebeln = ls_poitem-ebeln.
      g_spacelines = 5 - g_rows."需要补的空白行数
      DO g_spacelines TIMES.
        IF sy-index = g_spacelines.
          ls_poitem-last_flag = 'X'.
        ENDIF.
        APPEND ls_poitem TO lt_poitem3.
        "SY-TABIX为上面APPEND语句操作后所影响的索引号
        g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
      ENDDO.
      "满一页数总页数加一
      ls_poheader-total_page =  ls_poheader-total_page + 1.
    ENDIF.


    MODIFY lt_poheader FROM ls_poheader TRANSPORTING total_page .
  ENDLOOP.

  PERFORM callsmartform.

FORM callsmartform .
  DATA: lf_fm_name TYPE rs38l_fnam.

  DATA: control          TYPE ssfctrlop,
        ls_output_option TYPE ssfcompop,
        ntotalline       TYPE i,
        npageline        TYPE i VALUE 10,
        p_index          LIKE sy-tabix.
  DATA: emptycount      TYPE i ,  "空行数.
        ncurrline       TYPE i,      "中间变量
        job_output_info TYPE ssfcrescl.

  control-no_open = 'X'.
  control-no_close = 'X'.
  ls_output_option-tddest = 'LP01'.
  "control-no_dialog = 'X'.
  control-preview = 'X'.


  "***********调用SMARTFORM程序生成函数
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname = 'YTEST_LAZHAO_01'
    IMPORTING
      fm_name  = lf_fm_name.


  "***********动态调用新生成的函数
  CALL FUNCTION lf_fm_name
    TABLES
      lt_header  = lt_poheader[]
      lt_detail  = lt_poitem3[]
      lt_detail2 = lt_poitem3[].

ENDFORM.


FORM initdata.
  DATA: times     TYPE i,
        classname TYPE string,
        number    TYPE i VALUE 1,
        str       TYPE string.

  SELECT DISTINCT ebeln
    FROM ekpo
    INTO TABLE @DATA(lt_ebeln)
    WHERE ebeln IN ('4400000260','4400000259').

  IF lt_ebeln[] IS NOT INITIAL.

    SELECT ebeln bukrs FROM ekko INTO TABLE lt_poheader
      FOR ALL ENTRIES IN lt_ebeln
      WHERE ebeln = lt_ebeln-ebeln.

    SELECT ebeln ebelp matnr menge meins netpr
      FROM ekpo INTO CORRESPONDING FIELDS OF TABLE lt_poitem
      FOR ALL ENTRIES IN lt_ebeln
      WHERE ebeln = lt_ebeln-ebeln.

  ENDIF.

ENDFORM.

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值