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的設計。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章