SAP Smartform程序中,smartform访问程序中自定义内表的值一般通过se11定义structure来实现的,很不方便。
看了几篇文章的解决之道,转引如下:
===========================================================
在smartforms里动态取得程序里内表的值
http://blog.chinaunix.net/u2/68743/showart_724902.html
一般我们在做smartforms的时候都要自己建一个结构,以方便适用,但是有时候多建个结构很麻烦,我们在程序里都建了内表的结构了,其实我们可以不建这个结构的。
在smartforms的 global settings->global definitions 里有个 types 我们可以在这里定义一个和程序里内表一样的结构
但是,在form interface 里定义参数的时候不能刚才定义的结构,激活的时候会报错。所以我们不要再这里一定参数。我们在smartforms里直接读程序里的内表。
global settings->global definitions 里有个 initialization 可以在定义一个指针
DATA: field(50). FIELD-SYMBOLS: <dbcnt> type any.
field = '(ZCHINA_TEST3)ITAB[]'. ASSIGN (field) TO <dbcnt>.
GT_LABEL[] = <dbcnt>.
这样就可以把程序里的内表的值取出来了,并赋给了smartforms里的内表,然后就当GT_LABEL 就是你通过参数传进来的一样用就行了。
通过这个方法 就不用再在se11里定义结构了,调用smartforms的时候也不用传参数了。
============================================================
关于smartforms如何调用自定义内表
看了moziyou的帖子:
http://www.itpub.net/thread-990949-1-2.html 原文中:2、用memory id或簇数据库。优点,不用SE11,可分别运行取数和打印过程,缺点两边都要定义相同的内表。 方法1的方法大家都清楚,对于方法二,不知道能不能给个简单的实例?最好abap的代码和smartforms的设置一起配合起来。 用方法2自己编了一个小例子,写得不好老鸟不要嘲笑。
1.程序方面: *&---------------------------------------------------------------------* *& Report ZTEST001_ABAP08 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ztest001_abap08. INCLUDE zinc_sf_helper . DATA: BEGIN OF it_itab OCCURS 0, num1 TYPE i, num2 TYPE i, num3 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-num1 = it_itab-num1 + 1. it_itab-num2 = it_itab-num2 + 2. it_itab-num3 = it_itab-num3 + 3. 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 = 'ZTEST001_ABAP08' 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 'ZTEST001_ABAP08' c_tst+8(14) INTO itemsname . savebuffer it_itab[] itemsname . 如果要传入多个表的数据就接着savebuffer * savebuffer xxxxxxxxxxxxxxxxxx. CALL FUNCTION m_fm EXPORTING ptr_items = itemsname "这里可以传入多个表,和方法1中的接口使用是一样 * 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
2.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.
3.smart form 方面我就截图了 全局设置->表格接口
全局定义->类型
全局定义->全局数据
全局定义->初始化
全局定义->格式化程序
[
本帖最后由 pzqstc 于 2008-5-23 09:34 编辑 ]












