事務代碼: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.
*& 包括 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.
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的設計。