ABAP:SMARTFORMS 之一:数据从程序中传送到Form中


http://www.cnblogs.com/elegantok/archive/2008/10/24/1319040.html?ADUIN=2951261919&ADSESSION=1408712962&ADTAG=CLIENT.QQ.5341_.0&ADPUBNO=26376#userconsent#

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的设计。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值