工作生活与爱好

工作中的记录; 生活中的记忆; 业余爱好的记载。

2007-01-15

 

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

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


Comments: 发表评论



<< Home

Archives

1990年1月15日   2007年1月14日   2007年1月15日   2007年1月16日   2007年1月17日   2007年1月18日   2007年1月19日   2007年1月20日   2007年1月22日   2007年1月23日   2007年1月24日   2007年1月25日   2007年1月26日   2007年1月27日   2007年1月29日   2007年1月30日   2007年1月31日   2007年2月1日   2007年2月2日   2007年2月3日   2007年3月13日   2007年5月15日   2007年5月16日   2007年6月2日  

This page is powered by Blogger. Isn't yours?