【IT168 技术文章】
我们在SmartForm中常常要调用内表,将内表值传入显示,而SmartForm调用自定义内表有以下几种方法:
1、接口内表。优点:简单直观。缺点:要在SE11建立一个structrure type,比较麻烦。
2、用memory id或簇数据库。优点:不用SE11,可分别运行取数和打印过程。缺点:两边都要定义相同的内表。
3、在SmartForm中定义一个指针指向程序中的内表。
关于第一种方法比较简单,在这里就不说了。下面详细讲一下第二种和第三种方法。
第二种方法:
1、“全局设置”-〉“表格接口”-〉“导入”
这个参数用来传入我们在Report中Export内表数据的句柄(ID key)。
2、“全局设置”-〉“全局定义”-〉“类型”
3、“全局设置”-〉“全局定义”-〉“全局数据”
4、“全局设置”-〉“全局定义”-〉“初始化”
将数据句柄中的内表恢复到刚设定的全局变量中:
5、“全局设置”-〉“全局定义”-〉“格式化程序”
定义Form Restor_buffer函数
6、在数据LOOP循环中
程序代码:
*&---------------------------------------------------------------------*
*& Report ZTEST_SMARTFORM
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_SMARTFORM.
INCLUDE zinc_sf_helper .
DATA: BEGIN OF it_itab OCCURS 0,
col1 TYPE i,
col2 TYPE i,
col3 TYPE i,
col4 TYPE i,
END OF it_itab.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_print_data.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_get_data.
DO 20 TIMES.
it_itab-col1 = it_itab-col1 + 1.
it_itab-col2 = it_itab-col2 + 2.
it_itab-col3 = it_itab-col3 + 3.
it_itab-col4 = it_itab-col4 + 4.
APPEND it_itab.
ENDDO.
ENDFORM. "frm_get_data
*&---------------------------------------------------------------------*
*& Form frm_print_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_print_data.
DATA: m_fm TYPE rs38l_fnam.
DATA: headername(22) TYPE c.
DATA: itemsname(22) TYPE c.
DATA: c_tst(22) TYPE c.
DATA: l_tst TYPE timestampl.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZTEST_CYH3'
IMPORTING
fm_name = m_fm
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.
GET TIME STAMP FIELD l_tst. "long form
MOVE l_tst TO c_tst.
CONCATENATE 'ZTEST_CYH3' c_tst+8(14) INTO itemsname .
savebuffer it_itab[] itemsname . "如果要传入多个表的数据就接着savebuffer
* savebuffer xxxxxxxxxxxxxxxxxx.
CALL FUNCTION m_fm
EXPORTING
ptr = itemsname "这里可以传入多个表
* xxxxxxxx = xxxxxxxxxx
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 itemsname .
ENDFORM. "frm_print_data
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 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.
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
运行效果:
SmartForm调用自定义内表的第三种方法:在SmartForm中定义一个指针指向程序中的内表。
PS:个人觉得这个方法是最简洁的,使用这种方法SmartForm中并不需要传入参数就可以调用到内表中的值。
1、和第二种方法一样,需要在全局定义中定义两个结构类型和内表ITAB与工作区WA
2、“全局设置”-〉“全局定义”-〉“初始化”
定义一个指针:
这样就可以把程序里的内表的值取出来了,并赋给了smartforms里的内表ITAB,然后就当ITAB就是你通过参数传进来的一样用就行了。
程序代码:
*&---------------------------------------------------------------------*
*& Report ZTEST_SMARTFORM2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_SMARTFORM2.
DATA: BEGIN OF it_itab OCCURS 0,
col1 TYPE i,
col2 TYPE i,
col3 TYPE i,
col4 TYPE i,
END OF it_itab.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_print_data.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_get_data.
DO 20 TIMES.
it_itab-col1 = it_itab-col1 + 1.
it_itab-col2 = it_itab-col2 + 2.
it_itab-col3 = it_itab-col3 + 3.
it_itab-col4 = it_itab-col4 + 4.
APPEND it_itab.
ENDDO.
ENDFORM. "frm_get_data
*&---------------------------------------------------------------------*
*& Form frm_print_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_print_data.
DATA: m_fm TYPE rs38l_fnam.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZTEST_CYH4'
IMPORTING
fm_name = m_fm
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 m_fm
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.
ENDFORM.
注:由于SmartForm中使用了指针指向程序,程序必须激活才能运行,否则会报错。