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

作者:ABAP技巧与实战 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, SD, WM, 仓库管理, 开发, 数据工程, 销售分销

原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

**点击蓝字** 关注我们

前言

公众号群里面有人在讨论SMARTFORM打印中的小计和总计的实现.好久没有做SMARTFORM了, 所以没有参与讨论. 后来网上查询了一下.

也没有找到很好的解决方案.所以又花了点时间研究了一下.

打印效果呈现

先看一下打印效果: 每页中有当前页的小计及直到当前页的总计信息.如果是所有页的总计信息,建议程序计算后,通过抬头结构传递到SMARTFORM输出即可.

(为了呈现效果, 打印数据通过循环语句编造)

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

实现步骤

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

_**01** _

**分析打印内容**

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

_**02** _

**创建结构**

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**03** _

**创建SMARTFORM**

创建SMARTFORM: ZBC_SUBTOTAL

(TCODE: SMARTFORMS ).

_**04** _

**定义传入结构及内表**

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**05** _

**定义变量**

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

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**06** _

**定义页面**

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**07** _

**抬头内容**

通过模版打印抬头字段

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**08** _

**明细内容**

通过表格打印明细信息

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

_**09** _

**内表循环**

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

**_10_ **

**添加总计**

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

**_11_ **

**输出明细内容**

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

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

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

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

**_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 **

**约定**

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

( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.

越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图

**公众号 : syjf1976_abap**

**ABAP开发技巧**

**微信号 : 392077**

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

SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
SAP 小技巧之实现 SMARTFORM 打印中的小计与总计 - 封面图
ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「SAP小技巧之实现SMARTFORM打印中的小计与总计.md」整理生成,仅用于内部技术分享与学习交流。