技术开发 频道

SmartForm调用内表的三种方法

【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中使用了指针指向程序,程序必须激活才能运行,否则会报错。

0
相关文章