二维码

[动态alv] 使用ooalv方式动态的创建、修改和删除自定义表记录

Twilight发表于 2014-08-27 16:57Twilight 最后回复于 2014-08-27 16:57 [复制链接] 4845 0

程序代码:
  1. TYPE-POOLS:
  2.      vimty.
  3. TYPES :
  4.    BEGIN OF ty_mod,
  5.       row TYPE i,
  6.    END OF ty_mod.
  7. DATA:
  8.   g_container        TYPE scrfname VALUE 'CUSTOM_CONTAINER',
  9.   grid1              TYPE REF TO cl_gui_ALV_grid,
  10.   g_custom_container TYPE REF TO cl_gui_custom_container.
  11. DATA:
  12.   i_table            TYPE REF TO data,
  13.   wa_all             TYPE REF TO data.
  14. DATA:
  15.   org_crit_inst      TYPE vimty_oc_type,
  16.   old_rc             LIKE sy-subrc,
  17.   act_level          LIKE authb-actvt,
  18.   only_show_allowed  TYPE c,
  19.   i_exclude          TYPE ui_functions.
  20. DATA :
  21.   i_mod              TYPE STANDARD TABLE OF ty_mod,
  22.   i_del              TYPE STANDARD TABLE OF ty_mod.
  23. FIELD-SYMBOLS:
  24.         <i_itab>     TYPE table,
  25.         <wa_tab>     TYPE ANY.
  26. DATA: BEGIN OF header OCCURS 1.
  27.         INCLUDE STRUCTURE vimdesc.
  28. DATA: END OF header.
  29. DATA: BEGIN OF namtab OCCURS 50.
  30.         INCLUDE STRUCTURE vimnamtab.
  31. DATA: END OF namtab.
  32. DATA: vim_wheretab LIKE vimwheretb OCCURS 10.
  33. DATA: dba_sellist LIKE vimsellist OCCURS 10.
  34. SELECTION-SCREEN BEGIN OF BLOCK bb WITH FRAME TITLE text-100.
  35. PARAMETER: viewname TYPE tvdir-tabname.
  36. SELECTION-SCREEN SKIP 2.
  37. SELECTION-SCREEN BEGIN OF LINE.
  38. SELECTION-SCREEN PUSHBUTTON 20(10) text-101 USER-COMMAND b1. "Display
  39. SELECTION-SCREEN PUSHBUTTON 36(10) text-102 USER-COMMAND b2. "Change
  40. SELECTION-SCREEN END OF LINE.
  41. SELECTION-SCREEN END OF BLOCK bb.

  42. AT SELECTION-SCREEN.
  43.   CASE sy-ucomm.
  44.     WHEN 'B1'.
  45.       SET PF-STATUS  'ALV'.
  46.       CALL SCREEN 9001.
  47.     WHEN 'B2'.
  48.       SET PF-STATUS 'ALV1'.
  49.       CALL SCREEN 9001.
  50.   ENDCASE.
  51. * Class used to get changed data
  52. CLASS lcl_event_handler DEFINITION .
  53.   PUBLIC SECTION .
  54.     METHODS: handle_data_changed
  55.               FOR EVENT data_changed OF cl_gui_alv_grid
  56.               IMPORTING er_data_changed.
  57. ENDCLASS.                    "lcl_event_handler DEFINITION
  58. * Class used to get changed data
  59. CLASS lcl_event_handler IMPLEMENTATION .
  60. *  Handle Data Changed
  61.   METHOD handle_data_changed .
  62.     PERFORM handle_data_changed USING er_data_changed .
  63.   ENDMETHOD.                    "handle_data_changed
  64. ENDCLASS.                    "lcl_event_handler IMPLEMENTATION

  65. *&---------------------------------------------------------------------*
  66. *&      Module  STATUS_9001  OUTPUT
  67. *&---------------------------------------------------------------------*
  68. *       text
  69. *----------------------------------------------------------------------*
  70. MODULE status_9001 OUTPUT.
  71.   DATA:li_fieldcat TYPE lvc_t_fcat.
  72.   DATA:lwa_fieldcat TYPE lvc_s_fcat.
  73.   DATA:lh_flag(1).
  74.   DATA:gr_event_handler TYPE REF TO lcl_event_handler .
  75. * Creating an instance for the event handler
  76.   CREATE OBJECT gr_event_handler .
  77.   TRY.
  78.       CREATE DATA i_table TYPE TABLE OF (viewname).
  79.       ASSIGN i_table->* TO <i_itab>.
  80.       CREATE DATA wa_all LIKE LINE OF <i_itab>.
  81.       ASSIGN wa_all->* TO <wa_tab>.
  82. *     Selecting data dynamically
  83.       SELECT * FROM (viewname) INTO TABLE <i_itab>.
  84. *     Building the fieldcatelog
  85.       CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  86.         EXPORTING
  87.           i_structure_name       = viewname
  88.         CHANGING
  89.           ct_fieldcat            = li_fieldcat
  90.         EXCEPTIONS
  91.           inconsistent_interface = 1
  92.           program_error          = 2
  93.           OTHERS                 = 3.
  94.       IF sy-subrc <> 0.
  95.         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  96.           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  97.       ENDIF.
  98. *     Making fields editable except key fields
  99.       IF sy-ucomm = 'UPD' OR  sy-ucomm = 'CHANGE'.
  100.         LOOP AT li_fieldcat INTO lwa_fieldcat.
  101.           IF lwa_fieldcat-key = space.
  102.             lwa_fieldcat-edit = 'X'.
  103.             MODIFY li_fieldcat FROM lwa_fieldcat.
  104.           ENDIF.
  105.         ENDLOOP.
  106.       ENDIF.
  107. *     Making fields editable
  108.       IF sy-ucomm = 'NEW'.
  109.         LOOP AT li_fieldcat INTO lwa_fieldcat.
  110.           lwa_fieldcat-edit = 'X'.
  111.           MODIFY li_fieldcat FROM lwa_fieldcat.
  112.         ENDLOOP.
  113.         lh_flag = 'X'.
  114.         CLEAR : <i_itab>.
  115.         DO 100 TIMES.
  116.           APPEND <wa_tab> TO <i_itab>.
  117.         ENDDO.
  118.       ENDIF.
  119. *     Exclude buttons
  120.       PERFORM exclude_tb_functions CHANGING i_exclude.
  121.       IF g_custom_container IS INITIAL.
  122.         CREATE OBJECT g_custom_container
  123.           EXPORTING
  124.             container_name = g_container.
  125.         CREATE OBJECT grid1
  126.           EXPORTING
  127.             i_parent = g_custom_container.
  128.       ENDIF.
  129. *     Making all fields non-editable if display mode
  130.       IF sy-ucomm = 'SHOW'.
  131.         LOOP AT li_fieldcat INTO lwa_fieldcat.
  132.           lwa_fieldcat-edit = ' '.
  133.           MODIFY li_fieldcat FROM lwa_fieldcat.
  134.         ENDLOOP.
  135.       ENDIF.
  136.       IF sy-ucomm = 'SAVE'.
  137.         LOOP AT li_fieldcat INTO lwa_fieldcat.
  138.           IF lwa_fieldcat-key NE space.
  139.             lwa_fieldcat-edit = space.
  140.             MODIFY li_fieldcat FROM lwa_fieldcat.
  141.           ENDIF.
  142.         ENDLOOP.
  143.       ENDIF.
  144. *     Displaying ALV Grid
  145.       CALL METHOD grid1->set_table_for_first_display
  146.         EXPORTING
  147.           i_structure_name     = viewname
  148.           it_toolbar_excluding = i_exclude
  149.         CHANGING
  150.           it_outtab            = <i_itab>
  151.           it_fieldcatalog      = li_fieldcat.
  152.       IF sy-subrc NE 0.
  153.         EXIT.
  154.       ENDIF.
  155. *      Getting the changed data
  156.       SET HANDLER gr_event_handler->handle_data_changed FOR grid1 .
  157.     CATCH cx_sy_create_data_error.
  158.   ENDTRY.
  159. ENDMODULE.                 " STATUS_9001  OUTPUT
  160. *&------------------------------------------------------------*
  161. *&      Module USER_COMMAND_9001  INPUT
  162. *&------------------------------------------------------------*
  163. *       text
  164. *-------------------------------------------------------------*
  165. MODULE user_command_9001 INPUT.
  166.   DATA :
  167.     lh_norec      TYPE i,
  168.     lh_total(5)   TYPE c,
  169.     lh_succ(40)   TYPE c,
  170.     lwa_del       TYPE ty_mod,
  171.     lwa_mod       TYPE ty_mod,
  172.     lh_totdel     TYPE i.
  173. *    lh_flag       TYPE c,
  174. *    li_fieldcat   TYPE lvc_t_fcat,
  175. *    lwa_fieldcat  TYPE lvc_s_fcat.
  176.   CASE sy-ucomm.
  177.     WHEN 'CHANGE'.
  178.       SET PF-STATUS 'ALV1'.
  179.     WHEN 'SAVE'.
  180. *     Lock the table
  181.       CALL FUNCTION 'ENQUEUE_E_TABLE'
  182.         EXPORTING
  183.           mode_rstable   = 'E'
  184.           tabname        = viewname
  185.         EXCEPTIONS
  186.           foreign_lock   = 1
  187.           system_failure = 2
  188.           OTHERS         = 3.
  189.       IF sy-subrc <> 0.
  190.         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  191.                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  192.       ENDIF.
  193.       IF NOT grid1 IS INITIAL .
  194.         CALL METHOD grid1->check_changed_data .
  195.       ENDIF .
  196.       SORT i_mod BY row.
  197.       DELETE ADJACENT DUPLICATES  FROM i_mod COMPARING row.
  198.       lh_norec = LINES( i_mod ).
  199.       lh_total = lh_norec.
  200.       SHIFT lh_total LEFT DELETING LEADING space.
  201. *  Standard Table Update
  202.       IF i_mod[] IS NOT INITIAL.
  203.         LOOP AT i_mod INTO lwa_mod.
  204.           READ TABLE <i_itab> INTO <wa_tab> INDEX lwa_mod-row.
  205.           IF sy-subrc = 0 .
  206.             IF lh_flag NE 'X'.
  207.               MODIFY (viewname) FROM <wa_tab>.
  208.             ELSE.
  209.               INSERT (viewname) FROM <wa_tab>.
  210.               IF sy-subrc NE 0.
  211. *                MESSAGE e009.
  212.               ENDIF.
  213.             ENDIF.
  214.           ENDIF.
  215.         ENDLOOP.
  216.         CONCATENATE lh_total '  ' text-s01 INTO lh_succ SEPARATED BY space.
  217. *        MESSAGE i000 WITH lh_succ.
  218.       ELSE.
  219. *        MESSAGE i000 WITH text-s02.
  220.       ENDIF.
  221. *     Unlock the table
  222.       CALL FUNCTION 'DEQUEUE_E_TABLE'
  223.         EXPORTING
  224.           mode_rstable = 'E'
  225.           tabname      = viewname.
  226.       CLEAR : i_mod[],
  227.               lh_flag.
  228.     WHEN 'DELETE'.
  229. *      Selecting Selected Rows
  230.       PERFORM handle_user_command USING sy-ucomm.
  231.       IF i_del[] IS NOT INITIAL.
  232.         LOOP AT i_del INTO lwa_del.
  233.           READ TABLE <i_itab> INTO <wa_tab> INDEX lwa_del-row.
  234.           IF sy-subrc = 0.
  235.             DELETE (viewname) FROM <wa_tab>.
  236.           ENDIF.
  237.         ENDLOOP.
  238.         lh_totdel = LINES( i_del ).
  239. *        MESSAGE i011 WITH lh_totdel.
  240.         CLEAR : i_del[], lh_totdel .
  241.       ELSE.
  242. *        MESSAGE i000 WITH text-s03.
  243.       ENDIF.
  244.     WHEN 'EXIT'   OR
  245.          'BACK'   OR
  246.          'CANCEL'.
  247.       CLEAR : li_fieldcat[],
  248.               i_exclude[],
  249.               i_del[],
  250.               lh_totdel.
  251.       LEAVE TO SCREEN 0.
  252.   ENDCASE.
  253. ENDMODULE.                 " USER_COMMAND_9001  INPUT
  254. *&---------------------------------------------------------------------*
  255. *&      Form  handle_data_changed
  256. *&---------------------------------------------------------------------*
  257. FORM handle_data_changed  USING    p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
  258.   DATA :
  259.     lwa_mod_cell TYPE lvc_s_modi,
  260.     lwa_mod      TYPE ty_mod.
  261.   LOOP AT p_er_data_changed->mt_good_cells INTO lwa_mod_cell.
  262.     lwa_mod-row  = lwa_mod_cell-row_id.
  263.     APPEND lwa_mod TO i_mod.
  264.   ENDLOOP.
  265. ENDFORM.                    " handle_data_changed
  266. *&---------------------------------------------------------------------*
  267. *&      Form  exclude_tb_functions
  268. *&---------------------------------------------------------------------*
  269. FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .
  270.   DATA:
  271.     lwa_exclude TYPE ui_func.
  272.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  273.   APPEND lwa_exclude TO pt_exclude.
  274.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  275.   APPEND lwa_exclude TO pt_exclude.
  276.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  277.   APPEND lwa_exclude TO pt_exclude.
  278.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  279.   APPEND lwa_exclude TO pt_exclude.
  280.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  281.   APPEND lwa_exclude TO pt_exclude.
  282.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  283.   APPEND lwa_exclude TO pt_exclude.
  284.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
  285.   APPEND lwa_exclude TO pt_exclude.
  286.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  287.   APPEND lwa_exclude TO pt_exclude.
  288.   lwa_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  289.   APPEND lwa_exclude TO pt_exclude.
  290. ENDFORM.                    "exclude_tb_functions
  291. *&---------------------------------------------------------------------*
  292. *&      Form  handle_user_command
  293. *&---------------------------------------------------------------------*
  294. FORM handle_user_command  USING  p_ucomm TYPE syucomm.
  295.   DATA :
  296.     i_selected_rows  TYPE lvc_t_roid .
  297.   DATA :
  298.     lwa_selected_row TYPE lvc_s_roid,
  299.     lwa_del          TYPE ty_mod.
  300.   CALL METHOD grid1->get_selected_rows
  301.     IMPORTING
  302.       et_row_no = i_selected_rows.
  303.   LOOP AT i_selected_rows INTO lwa_selected_row.
  304.     lwa_del-row = lwa_selected_row-row_id.
  305.     APPEND lwa_del TO i_del.
  306.   ENDLOOP.
  307. ENDFORM.                    " handle_user_command
复制代码

PS:
1、container名称:CUSTOM_CONTAINER
2、创建PF Status —— “ALV”   “ALV1”
pf status 1.png
pf status 2.png
3、创建Text Elements
pf status 3.png
4、创建T-code – SE93
pf status 4.png
选择屏幕
pf status 5.png
执行效果:
pf status 6.png
回复

使用道具 举报

快速回帖

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

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