SMARTFORMS和SAPSCRIPT FORM都是SAP中设计打印报表的工具,但是SAPScript需要手工一条一条的根据坐标和长、高画表格线,这样极为不方便,而SmartForms有一个GUI来直接画界面,因此,总的来说,使用SmartForms来设计报表打印要简单很多。而且SAPSrcipt在不同的Client中需要传输,测试起来也不方便。传输SAPScript的事务代码为:SCC1,对应程序名为 RSTXSCRP

事务代码:SMARTFORMS

在SAP的ABAP编程中,一般开发过程都是在Report程序中取出所有需要的数据,将数据进行相应的处理以后保存到输出内表中,再打印内表中的数据,但是SmartForms是一个独立的外部Function Module,对于程序内部定义的内表数据不能直接传递,需要定义外部的数据结构Structure或者使用标准的表结构,如果程序变更,需要传递的数据发生变化,那么该Sturcture也需要修改,这是SmartForms中不方便的地方。

当然我们也可以在SmartForms内部写取数据的逻辑,但是在SmartForms中编程总不是很方便,而且有时我们的数据需要首先以List或者ALV List的方式显示,然后再打印,所以在smartforms中书写取数据逻辑只能对一些要求非常简单的场合适用。

我们决定还是在Report程序中进行取数逻辑,然后想办法将数据传递到SMARTFORMS中。我们知道在SAP中可以将一个对象Export到内存或者数据库中,我们就可以根据一个类似于句柄的字符串再次取出该数据,传送一个字符串到SmartForms中是没有任何问题的,所以我们只需要Export内表到内存或者数据库中,将句柄传递到SmartForms中,在SmartForms中首先定义完全相同类型的内表,再将数据Impor到内表中即可完全恢复数据,这样就完成的数据的传递工作。

以下是Import和Export的Include程序:

*&---------------------------------------------------------------------*
*&  包括              ZINC_SF_HELPER                                   *
*&---------------------------------------------------------------------*

TYPES buffer_id(80) TYPE c.
DATA wa_indx TYPE indx.

DEFINE savebuffer.
  perform save_to_buffer using &1 &2.
END-OF-DEFINITION.

DEFINE clearbuffer.
  perform clear_buffer using &1.
END-OF-DEFINITION.
*&--------------------------------------------------------------------*
*&      Form  Get_Unique_Id
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->ID         text
*---------------------------------------------------------------------*
*FORM get_unique_id USING typeid TYPE c CHANGING id TYPE c.
*  DATA: m_buff(32) TYPE c.
*  CALL FUNCTION 'TH_GET_SESSION_ID'
*   IMPORTING
*     session_id       =  m_buff
**     ID_LEN           =
*            .
*  CONCATENATE sy-repid '_' m_buff typeid INTO id.
*ENDFORM.                    "Get_Unique_Id


*&--------------------------------------------------------------------*
*&      Form  Save_To_Buffer
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->T          text
*      -->BUFF_ID    text
*---------------------------------------------------------------------*
FORM save_to_buffer USING t TYPE table typeid TYPE c .
wa_indx-aedat = sy-datum.
wa_indx-usera = sy-uname.
wa_indx-pgmid = sy-repid.
*  PERFORM get_unique_id USING buff_id CHANGING buff_id.
  EXPORT t TO DATABASE indx(hk) ID typeid from wa_indx.
ENDFORM.                    "Save_To_Buffer

*&--------------------------------------------------------------------*
*&      Form  Clear_Buffer
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->BUFF_ID    text
*---------------------------------------------------------------------*
FORM clear_buffer USING buffid TYPE c.
  DELETE FROM DATABASE indx(hk) ID buffid.
ENDFORM.                    "Clear_Buffer

form Restor_buffer using typeid type c changing t type table.
import t from database indx(hk) id typeid.
endform.

下面是调用示例:

form frm_print_data .

DATA: headername(18) TYPE c. 
  DATA: itemsname(18) TYPE c.
  " 在句柄中加上服务器当前时间作为句柄名称,防止多人同时使用该程序,导致句柄名称相同
   CONCATENATE 'ZSPMMF1002HD' SY-UZEIT INTO headername .
   CONCATENATE 'ZSPMMF1002IT' SY-UZEIT INTO itemsname.

savebuffer ig_output_h[] headername. "ig_output_h是保存输出表单表头数据的内表
  savebuffer ig_output_d[] itemsname.   "ig_output_d是保存输出数据明细的内表,与表头数据有关联字段
  
DATA: wl_fmname TYPE rs38l_fnam.
* 通过SmartForms的名称取得编译以后的对应的Function Module的名称
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname                 = 'ZSPMMF1007X'    "SmartForms的名称
*     VARIANT                  = ' '
*     DIRECT_CALL              = ' '
     IMPORTING
       fm_name                  = wl_fmname
     EXCEPTIONS
       no_form                  = 1
       no_function_module       = 2
       OTHERS                   = 3
              .
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.


  CALL FUNCTION wl_fmname
    EXPORTING
*   ARCHIVE_INDEX              =
*   ARCHIVE_INDEX_TAB          =
*   ARCHIVE_PARAMETERS         =
*   CONTROL_PARAMETERS         =
*   MAIL_APPL_OBJ              =
*   MAIL_RECIPIENT             =
*   MAIL_SENDER                =
*   OUTPUT_OPTIONS             =
*   USER_SETTINGS              = 'X'
    ptr_header                 = headername
    ptr_items                  = itemsname
* IMPORTING
*   DOCUMENT_OUTPUT_INFO       =
*   JOB_OUTPUT_INFO            =
*   JOB_OUTPUT_OPTIONS         =
 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.

clearbuffer headername.  "调用完毕以后,删除数据
  clearbuffer itemsname.

endform.                    " frm_print_data

将数据Export到内存可以取得较好的效率,但是一般SAP的应用服务器都会使用群集,因此我们Export数据到数据库中会保险一些。

在系列文章之二,说明SmartForms的设计。

转载于:https://blog.51cto.com/tangwenchong/554236

ABAP:SMARTFORMS 之一:数据从程序中传送到Form中相关推荐

  1. 数据从程序中传入到form中

    SMARTFORMS和SAPSCRIPT FORM都是 SAP中设计打印报表的工具,但是SAPScript需要手工一条一条的根据坐标和长.高画表格线,这样极为不方便,而SmartForms有一个GUI ...

  2. 在JS中获取页面form中的一个TEXT元素的坐标值

    <input type="button" value="Chick Me" onClick="alert('Top:'+this.offsetT ...

  3. sql 数据与程序的物理独立性和逻辑独立性

    数据与程序的物理独立性 数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系.当数据库的存储结构改变了,由数据库管理员对模式/内模式影 ...

  4. 威纶通与三菱PLC条码枪解码程序本程序是威纶通触摸屏USB接头直接插条形码扫码枪,得到的数据传送到PLC中进行解码

    威纶通与三菱PLC条码枪解码程序本程序是威纶通触摸屏USB接头直接插条形码扫码枪,得到的数据传送到PLC中进行解码,转化成为PLC能识别的十进制,用于需要使用扫码枪设定数据是非常实用,当然带485通信 ...

  5. ABAP动态生成经典应用之Table数据Upload 程序

    开发说明:在CBO的程序开发过程中,需要为Table准备大量的测试数据,手动录入效率低,不专业,我们可以采用其他的高级编辑工具(例如:EXCEL,EditPlus)按照Table数据存储结构准备好数据 ...

  6. movs 数据传送指令_PLC中简单好用的传送指令功能,你学会了吗?

    戳上方蓝字 "技成电工课堂" 关注我们哦! PLC的各种功能指令中,传送指令的使用非常频繁,且相对简单.一说到简单,我猜已经有很多人蠢蠢欲动,迫不及待地想征服这个传送指令了.那么, ...

  7. 数据与程序分离——程序中那些表的事儿

    我们先来看一小段程序: const char *GetString(int key) {if (key == 1)return "first";else if (key == 2) ...

  8. c语言二维数组输入数据,c语言编写程序,把下面的数据输入到一个二维数组中:...

    c语言编写程序,把下面的数据输入到一个二维数组中: 答案:3  信息版本:手机版 解决时间 2019-10-07 01:08 已解决 2019-10-06 03:19 1. 编写程序,把下面的数据输入 ...

  9. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作 在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据 ...

  10. 请编写程序,读入CSV文件中数据,循环获得用户输入,直至用户直接输入“Q”退出。根据用户输入的星座名称,输出此星座的出生日期范围及对应字符形式。如果输入的名称有误,请输出“输入星座名称有误”

    星座,开始月日,结束月日,Unicode ‌水瓶座,120,218,9810 ‌双鱼座,219,320,9811 ‌白羊座,321,419,9800 ‌金牛座,420,520,9801 ‌双子座,52 ...

最新文章

  1. 表单之label标签
  2. 4G EPS 的网络协议栈
  3. 华为正式发布鸿蒙智慧屏,华为正式发布鸿蒙OS操作系统 智慧屏将率先使用
  4. python基础学习(二)注释和算术运算符
  5. 【运维技术】Zookeeper单机以及集群搭建教程
  6. 【计算机网络】协议,接口,服务
  7. 双击打开Inventor文件
  8. java http请求头_http的请求头含义及如何用java发送
  9. jQuery学习笔记:文档处理
  10. 大数据比海量数据多了什么
  11. java自动化测试_Java自动化测试(一)
  12. CTEX编译Xelatex以及如何更新Miktex
  13. js中求2个数的最大值的几种方法
  14. 北京联合大学计算机科学与技术分数线,北京联合大学录取分数线2021是多少分(附历年录取分数线)...
  15. 软件开发+推广引流,最适合企业商家的软件营销模式
  16. python调用usb设备_在Python中查询连接的USB设备信息的简单方法?
  17. 《软件测试》第十章 外国语言测试
  18. 自己办理积分入户深圳—经验之谈
  19. 《Linux/UNIX OpenLDAP实战指南》——2.9 OpenLDAP控制策略
  20. #IB TWS编程手记——02.提交你的第一个Hello World!

热门文章

  1. PHP 与 YAML
  2. E - 权势二进制 哈尔滨理工大学软件学院大一个人赛训练
  3. 如何在sublime编辑器中,执行命令行脚本
  4. com和dll(一)
  5. CodeForces Gym 100935E Pairs
  6. linux挂载windows上的共享文件夹
  7. .net Remoting学习笔记(二)
  8. MySql命令行下导出、导入数据
  9. ZED2+ORB_SLAM3
  10. 作业要求 20181030-1 Alpha发布用户使用报告