二维码

[动态alv] alv中动态编程的编辑和保存功能的实现

Twilight发表于 2014-08-13 15:35Twilight 最后回复于 2014-08-13 15:35 [复制链接] 5974 0

程序代码:
  1. *******************************************************************
  2. * TYPE-POOLS                                                      *
  3. *******************************************************************
  4. TYPE-POOLS: slis.
  5. *******************************************************************
  6. * INTERNAL TABLES/WORK AREAS/VARIABLES     *
  7. *******************************************************************
  8. DATA: i_fieldcat TYPE slis_t_fieldcat_ALV,
  9.       i_index TYPE STANDARD TABLE OF i WITH HEADER LINE,
  10.       w_field TYPE slis_fieldcat_alv,
  11.       p_table LIKE dd02l-tabname,
  12.       dy_table TYPE REF TO data,
  13.       dy_tab TYPE REF TO data,
  14.       dy_line TYPE REF TO data.
  15. *******************************************************************
  16. * FIELD-SYMBOLS                                                   *
  17. *******************************************************************
  18. FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
  19.                <dyn_wa> TYPE ANY,
  20.                <dyn_field> TYPE ANY,
  21.                <dyn_tab_temp> TYPE STANDARD TABLE.
  22. *******************************************************************
  23. * SELECTION SCREEN                                                *
  24. *******************************************************************
  25. PARAMETERS: tabname(30) TYPE c,
  26.             lines(5)  TYPE n.
  27. *******************************************************************
  28. * START-OF-SELECTION                                              *
  29. *******************************************************************
  30. START-OF-SELECTION.
  31. * Storing table name
  32.   p_table = tabname.
  33. * Create internal table dynamically with the stucture of table name
  34. * entered in the selection screen
  35.   CREATE DATA dy_table TYPE STANDARD TABLE OF (p_table).
  36.   ASSIGN dy_table->* TO <dyn_table>.
  37.   IF sy-subrc <> 0.
  38.     MESSAGE i001(00) WITH ' No table found'(001).
  39.     LEAVE TO LIST-PROCESSING.
  40.   ENDIF.
  41. * Create workarea for the table
  42.   CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  43.   ASSIGN dy_line->* TO <dyn_wa>.
  44. * Create another temp. table
  45.   CREATE DATA dy_tab TYPE STANDARD TABLE OF (p_table).
  46.   ASSIGN dy_tab->* TO <dyn_tab_temp>.
  47.   SORT i_fieldcat BY col_pos.
  48. * Select data from table
  49.   SELECT * FROM (p_table)
  50.   INTO TABLE <dyn_table>
  51.   UP TO lines ROWS.
  52.   REFRESH <dyn_tab_temp>.
  53. * Display report
  54.   CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  55.     EXPORTING
  56.       i_callback_program       = sy-repid
  57.       i_structure_name         = p_table
  58.       i_callback_user_command  = 'USER_COMMAND'
  59.       i_callback_pf_status_set = 'SET_PF_STATUS'
  60.     TABLES
  61.       t_outtab                 = <dyn_table>
  62.     EXCEPTIONS
  63.       program_error            = 1
  64.       OTHERS                   = 2.
  65.   IF sy-subrc <> 0.
  66.   ENDIF.
  67. *&-----------------------------------------------------------------*
  68. *&      Form  SET_PF_STATUS
  69. *&-----------------------------------------------------------------*
  70. *       Setting custom PF-Status
  71. *------------------------------------------------------------------*
  72. *      -->RT_EXTAB   Excluding table
  73. *------------------------------------------------------------------*
  74. FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  75.   SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'.
  76. ENDFORM.                    "SET_PF_STATUS
  77. *&----------------------------------------------------------------*
  78. *&      Form  user_command
  79. *&-----------------------------------------------------------------*
  80. *       Handling custom function codes
  81. *------------------------------------------------------------------*
  82. *      -->R_UCOMM      Function code value
  83. *      -->RS_SELFIELD  Info. of cursor position in ALV
  84. *------------------------------------------------------------------*
  85. FORM user_command  USING    r_ucomm LIKE sy-ucomm
  86.                                     rs_selfield TYPE slis_selfield.
  87. * Local data declaration
  88.   DATA: li_tab TYPE REF TO data,
  89.         l_line TYPE REF TO data.
  90. * Local field-symbols
  91.   FIELD-SYMBOLS:<l_tab> TYPE table,
  92.                 <l_wa>  TYPE ANY.
  93. * Create table
  94.   CREATE DATA li_tab TYPE STANDARD TABLE OF (p_table).
  95.   ASSIGN li_tab->* TO <l_tab>.
  96. * Create workarea
  97.   CREATE DATA l_line LIKE LINE OF <l_tab>.
  98.   ASSIGN l_line->* TO <l_wa>.
  99.   CASE r_ucomm.
  100. *   When a record is selected
  101.     WHEN '&IC1'.
  102. *     Read the selected record
  103.       READ TABLE <dyn_table> ASSIGNING <dyn_wa> INDEX
  104.       rs_selfield-tabindex.
  105.       IF sy-subrc = 0.
  106. *       Store the record in an internal table
  107.         APPEND <dyn_wa> TO <l_tab>.
  108. *       Fetch the field catalog info
  109.         CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  110.           EXPORTING
  111.             i_program_name         = sy-repid
  112.             i_structure_name       = p_table
  113.           CHANGING
  114.             ct_fieldcat            = i_fieldcat
  115.           EXCEPTIONS
  116.             inconsistent_interface = 1
  117.             program_error          = 2
  118.             OTHERS                 = 3.
  119.         IF sy-subrc = 0.
  120. *         Make all the fields input enabled except key fields
  121.           w_field-input = 'X'.
  122.           MODIFY i_fieldcat FROM w_field TRANSPORTING input
  123.           WHERE key IS INITIAL.
  124.         ENDIF.
  125. *       Display the record for editing purpose
  126.         CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  127.           EXPORTING
  128.             i_callback_program    = sy-repid
  129.             i_structure_name      = p_table
  130.             it_fieldcat           = i_fieldcat
  131.             i_screen_start_column = 10
  132.             i_screen_start_line   = 15
  133.             i_screen_end_column   = 200
  134.             i_screen_end_line     = 20
  135.           TABLES
  136.             t_outtab              = <l_tab>
  137.           EXCEPTIONS
  138.             program_error         = 1
  139.             OTHERS                = 2.
  140.         IF sy-subrc = 0.
  141. *         Read the modified data
  142.           READ TABLE <l_tab> INDEX 1 INTO <l_wa>.
  143. *         If the record is changed then track its index no.
  144. *         and populate it in an internal table for future
  145. *         action
  146.           IF sy-subrc = 0 AND <dyn_wa> <> <l_wa>.
  147.             <dyn_wa> = <l_wa>.
  148.             i_index = rs_selfield-tabindex.
  149.             APPEND i_index.
  150.           ENDIF.
  151.         ENDIF.
  152.       ENDIF.
  153. *   When save button is pressed
  154.     WHEN '&DATA_SAVE'.
  155. *     Sort the index table
  156.       SORT i_index.
  157. *     Delete all duplicate records
  158.       DELETE ADJACENT DUPLICATES FROM i_index.
  159.       LOOP AT i_index.
  160. *       Find out the changes in the internal table
  161. *       and populate these changes in another internal table
  162.         READ TABLE <dyn_table> ASSIGNING <dyn_wa> INDEX i_index.
  163.         IF sy-subrc = 0.
  164.           APPEND <dyn_wa> TO <dyn_tab_temp>.
  165.         ENDIF.
  166.       ENDLOOP.
  167. *     Lock the table
  168.       CALL FUNCTION 'ENQUEUE_E_TABLE'
  169.         EXPORTING
  170.           mode_rstable   = 'E'
  171.           tabname        = p_table
  172.         EXCEPTIONS
  173.           foreign_lock   = 1
  174.           system_failure = 2
  175.           OTHERS         = 3.
  176.       IF sy-subrc = 0.
  177. *       Modify the database table with these changes
  178.         MODIFY (p_table) FROM TABLE <dyn_tab_temp>.
  179.         MESSAGE s001(00) WITH 'data be saved successfully'(002).
  180.         REFRESH <dyn_tab_temp>.
  181. *       Unlock the table
  182.         CALL FUNCTION 'DEQUEUE_E_TABLE'
  183.           EXPORTING
  184.             mode_rstable = 'E'
  185.             tabname      = p_table.
  186.       ENDIF.
  187.   ENDCASE.
  188.   rs_selfield-refresh = 'X'.
  189. ENDFORM.                    "user_command
复制代码


执行效果
alv edit save.png
1、输入一张存在的表和取数条数
2、双击任何一行,然后修改数据 保存
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表