数据从程序中传入到form中
生活随笔
收集整理的這篇文章主要介紹了
数据从程序中传入到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
在 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數據到數據庫中會保險一些。
總結
以上是生活随笔為你收集整理的数据从程序中传入到form中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指针传递内表方式做smartforms
- 下一篇: SMARTFORM 循环打印实现 (循环