您的位置:首页 > 其它

SAP SMARTFORMS技术之我见(一):

2010-04-09 09:24 501 查看
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: