注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

黑山老妖的博客

 
 
 

日志

 
 
关于我

主要用来存放收集的资料,几乎都是转贴的东西!感谢原作者!

SMARTFORMS export & import  

2007-04-24 09:44:43|  分类: ABAP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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.

  

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

文章出处:http://www.cnblogs.com/zhumk/archive/2005/06/04/167896.html

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.

  评论这张
 
阅读(427)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018