SAP小技巧之 实现SMARTFORM打印中的小计与总计

点击蓝字 关注我们

前言

公众号群里面有人在讨论SMARTFORM打印中的小计和总计的实现.好久没有做SMARTFORM了, 所以没有参与讨论. 后来网上查询了一下. 也没有找到很好的解决方案.所以又花了点时间研究了一下.

打印效果呈现

先看一下打印效果: 每页中有当前页的小计及直到当前页的总计信息.如果是所有页的总计信息,建议程序计算后,通过抬头结构传递到SMARTFORM输出即可. (为了呈现效果, 打印数据通过循环语句编造)

实现步骤

后面的步骤包含了SMARTFORM的简单编写和程序调用过程.

01

分析打印内容

分析需要打印的内容. 示例中打印销售订单.

02

创建结构

创建结构用于传递销售订单的行项目打印内容(最好把数量,金额的单位也放到结构中,避免报错)

03

创建SMARTFORM

创建SMARTFORM: ZBC_SUBTOTAL 

(TCODE: SMARTFORMS ).

04

定义传入结构及内表

05

定义变量

定义SMARTFORM中需要使用的变量. 

其中 LV_TOTAL  LV_SUBTOTAL 分别用来统计数量的合计与小计

06

定义页面

定义两个页面. 第一个页面有抬头信息及MAIN窗口(用来打印行项目部分),及页码窗口 第二个页面只有MAIN窗口和页码窗口

07

抬头内容

通过模版打印抬头字段

08

明细内容

通过表格打印明细信息

09

内表循环

表格中添加循环信息,使用界面传递的IT_VBAP 及定义的局部变量 lw_vbap

10

添加总计

表格计算中添加两个总计功能, 分别为字段LV_TOTAL LV_SUBTOTAL汇总数量.

11

输出明细内容

在表头部分写字段描述信息

在主要区域写单据明细内容

在脚标部分写小计/总计内容,

需要注意的是,对小计内容需要补充一段代码. 用于呈现小计后清空变量. 以便后续重新统计.

12

程序调用

激活SMARTFORM后,

编写程序ZTS_CALL_SMARTFORMS调用打印函数

*&---------------------------------------------------------------------*
*& Report ZTS_CALL_SMARTFORMS
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zts_call_smartforms.




DATA: ls_vbak TYPE vbak.
DATA: lt_vbap LIKE TABLE OF zsts_smartforms.




START-OF-SELECTION.


  PERFORM frm_get_data.


  PERFORM frm_call_smartforms.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA: lw_vbap TYPE zsts_smartforms.
  DATA: lv_index TYPE i.
  ls_vbak-vbeln = '1001'.
*循环构造数据.
  DO 70 TIMES.


    lw_vbap-posnr = sy-index * 10.
    lw_vbap-matnr = 'M001'.
    lw_vbap-maktx = '测试物料'.
    lw_vbap-kwmeng = 10.
    APPEND lw_vbap TO lt_vbap.
  ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_SMARTFORMS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_smartforms .
  DATA l_line TYPE i.
  DATA l_times TYPE i.
  DATA l_mod TYPE i.
  DATA str TYPE string.
  DATA:l_usnam LIKE bkpf-usnam. "过账人
  DATA: l_date LIKE bkpf-budat.
  DATA: outopt TYPE ssfcresop.
  DATA: lf_formname           TYPE tdsfname.
  DATA: lf_fm_name            TYPE rs38l_fnam.
  DATA: i_job_output_info TYPE ssfcrescl.
  DATA: ls_outopt TYPE  ssfcompop.
  DATA: ls_control  TYPE  ssfctrlop.
  data: ls_opt type SSFCRESOP.
*打印控制参数
  ls_control-no_open      = 'X'.
  ls_control-no_close     = 'X'.
  ls_control-langu        = '1'.


*   output-tdimmed = 'X'.
*   output-tddelete = 'X'.


*开始打印输出
  CALL FUNCTION 'SSF_OPEN'
    EXPORTING
      control_parameters = ls_control
      output_options     = ls_outopt
    IMPORTING
      job_output_options = ls_opt
    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.
    EXIT.
  ENDIF.
*获取SMARTFORM的打印函数.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'ZBC_SUBTOTAL'
    IMPORTING
      fm_name            = lf_fm_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
    MESSAGE 'Call SSF_FUNCTION_MODULE_NAME Error' TYPE 'E'.
  ENDIF.


*调用打印函数
  CALL FUNCTION lf_fm_name
    EXPORTING
      control_parameters = ls_control
      output_options     = ls_outopt
      user_settings      = ' '
      is_vbak            = ls_vbak
    TABLES
      it_vbap            = lt_vbap
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  IF sy-subrc <> 0.
    MESSAGE 'Call SmartForms Error!' TYPE 'E'.
  ENDIF.


*关闭打印输出
  CALL FUNCTION 'SSF_CLOSE'
    IMPORTING
      job_output_info  = i_job_output_info
    EXCEPTIONS
      formatting_error = 1
      internal_error   = 2
      send_error       = 3
      OTHERS           = 4.
  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.

总结

这样就可以通过SMARTFORM本身提供的编码模块实现输出的当页小计与当前总计功能了.

SMARTFORM定义中允许添加代码块来完成打印的一些复杂处理与控制. 可以解决一些比较棘手的问题. 

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077

公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值