cundeng 发表于 2015-9-18 13:03:58

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/
  
页: [1]
查看完整版本: SAP SMARTFORMS技术之我见(一):