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

  • 相关阅读:
    Linux课程实践一:Linux基础实践(SSH)
    《恶意代码分析实战》读书笔记 静态分析高级技术一
    Linux课程实践四:ELF文件格式分析
    Linux课程实践三:简单程序破解
    Linux课程实践二:编译模块实现内核数据操控
    2020.12.19 加分项和课程意见/建议
    博客已换
    [题解] LuoguP4983 忘情
    [题解] LuoguP4767 [IOI2000]邮局
    [题解] LuoguP2791 幼儿园篮球题
  • 原文地址:https://www.cnblogs.com/elegantok/p/1319040.html
Copyright © 2020-2023  润新知