SAP SMARTFORMS技术之我见(一):

SMARTFORMS和SAPSCRIPT FORM都是SAP中设计打印报表的工具,但是SAPScript需要手工一条一条的根据坐标

和长、高画表格线,这样极为不方便,而SmartForms有一个GUI来直接画界面,因此,总的来说,使用SmartForms

来设计报表打印要简单很多。而且SAPSrcipt在不同的Client中需要传输,测试起来也不方便。传输SAPScript的事务

代码为:SCC1,对应程序名为 RSTXSCRP。

事务代码:SMARTFORMS

1.在SAP的ABAP编程中,一般开发过程都是在Report程序中取出所有需要的数据,将数据进行相应的处理以后保存

到输出内表中,再打印内表中的数据,但是SmartForms是一个独立的外部Function Module,对于程序内部定义的内

表数据不能直接传递,需要se11定义外部的数据结构Structure或者使用标准的表结构,如果程序变更,需要传递的

数据发生变化,那么该Sturcture也需要修改,这是SmartForms中不方便的地方。


2.当然我们也可以在SmartForms内部写取数据的逻辑,但是在SmartForms中编程总不是很方便,而且有时我们的数

据需要首先以List或者ALV List的方式显示,然后再打印,所以在smartforms中书写取数据逻辑只能对一些要求非常

简单的场合适用。


3.我们决定还是在Report程序中进行取数逻辑,然后想办法将数据传递到SMARTFORMS中。我们知道在SAP中可

以将一个对象Export到内存或者数据库中,我们就可以根据一个类似于句柄的字符串再次取出该数据,传送一个

字符串到SmartForms中是没有任何问题的,所以我们只需要Export内表到内存或者数据库中,将句柄传递到

SmartForms中,在SmartForms中首先定义完全相同类型的内表,再将数据Impor到内表中即可完全恢复数据,这样

就完成的数据的传递工作。
下面就对export内表到内存和数据库分别进行说明。
     1)在程序调用smartforms之前,将处理好的要显示的内表itab抛出到内存:
       EXPORT TABLE = itab TO MEMORY ID 'Z_TEST'.
         在smartforms的 global settings全局设置->global definitions全局定义 里有个 types类型 我们可以在这里定义一个和程序里内表一样的结构。在global settings->global definitions 里 global data中定义要接收数据的内表it_tab和工作区。

      在smartforms输出表格内容时将抛出的表格接收进来:
        IMPORT TABLE = it_tab MEMORY ID 'Z_TEST'.
         释放 MEMORY ID :FREE MEMORY ID 'Z_TEST'.
     2) 在程序调用smartforms之前,将处理好的要显示的内表itab抛出到数据库:
     *将内表数据存入ABAP内存
       EXPORT table = itab TO DATABASE indx(hk) ID 'Z_TEST'.
       FREE itab.
         在smartforms的 global settings全局设置->global definitions全局定义 里有个 types类型 我们可以在这里定义一个和程序里内表一样的结构。在global settings->global definitions 里 global data中定义要接收数据的内表it_tab和工作区。然后在global settings->global definitions->initialization中调用格式化中的子例程将数据库中的内表数据取出。
     *将数据恢复到内表
     perform Restor_buffer using in_mtab changing it_tab.

    "此处的in_mtab需要在form interface表格接口中定义为c类型
    格式化中编写如下子例程:
       form Restor_buffer using typeid type c changing t type table.
             import table = t from database indx(hk) id typeid.
       endform.
  当然,也可以不用这么麻烦,直接在global settings->global definitions->initialization中:
       import table = it_tab from database indx(hk) id in_mtab.这样也是可以的。 

如图1、2所示:

图1

图2

4.对于不建立结构调用SMARTFORMS打印输出还有另外一种方法 ,就是 在smartforms的 global settings->global definitions 里有个 types 我们可以在这里定义一个和程序里内表一样的结构.但是,在form interface 里定义参数的时候不能使用刚才定义的那个结构,激活的时候会报错。表格接口(form interface)的table里面不需要传输report 中的内表,所以我们不需要在这里定义参数,内表内容不通过该接口传过来,而是动态读取过来。我们在 smartforms里直接读程序里的内表。全局设置global settings->global definitions全局设置 里有个 initialization初始化 可以在这里定义一个指针如下:
   DATA: field(50).
   FIELD-SYMBOLS: <fs> type any.

   field = '(Z_TEST)ITAB[]'."Z_TEST为report名称,itab[]为report中的内表名称
   ASSIGN (field) TO <fs>."定义的指针指向report中的内表

   it_tab[] = <fs>."将程序中的内表数据copy到smartforms中的相同结构的内表中。

这样就可以把程序里的内表的值取出来了,并赋给了smartforms里的内表,然后就当it_tab[] 就是你通过参数传进来

的一样用就行了。如图1.
下一篇将会对smartforms的详细用法进行说明。
Reference: 1) http://hi.baidu.com/yj35506629/blog/item/a5f4b40136281a071d9583eb.html
       2) http://renyanli215.blog.163.com/blog/static/2936610320090655136406/

 

转载于:https://www.cnblogs.com/clsoho/archive/2010/04/09/1707976.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值