二维码

[fmalv] FM ALV设置EDT_CLL_CB参数可使编辑字段值更新内表

Twilight发表于 2014-10-30 14:45glb1197531 最后回复于 2015-06-07 10:17 [复制链接] 11253 2

FM ALV在处理可编辑字段方面已经很强大了,所以平常很少用OO ALV来做。当然OO ALV凭借类、事件、方法有其更强大的功能,FM ALV底层实际也是基于OO ALV的。本文主要以REUSE_ALV_GRID_DISPLAY_LVC为例,演示可编辑字段处理的简单方法:

在REUSE_ALV_GRID_DISPLAY_LVC显示的ALV中,实现可编辑字段的新值自动更新到内表有一个前提:
REUSE_ALV_GRID_DISPLAY_LVC的输入参数中,有一个是:I_GRID_SETTINGS,其中的EDT_CLL_CB字段是可回调标识,需要设置EDT_CLL_CB = 'X'。

在此前提下,再按是否自定义STATUS区分:
(1)没有自定义STATUS,即使用标准的界面。
当为可编辑字段输入新值后,敲回车点击标准工具栏的按钮点击标准的保存按钮,都可以自动更新字段的新值到内表中;
(2)自定义STATUS,此时又区分2种情况:
(2.1)自定义按钮的功能码设置为&DATA_SAVE。当为可编辑字段输入新值后,点击此按钮,也可以自动更新字段的新值到内表中;
(2.2)自定义按钮的功能码不是&DATA_SAVE。当为可编辑字段输入新值后,点击此按钮,是不会自动更新字段的新值到内表中的。
其中,&DATA_SAVE是标准界面保存按钮的功能码。

对于(2.2)情况,可以在判断功能码时,调用方法CHECK_CHANGED_DATA,这样即可自动更新可编辑字段的新值到内表中。

以“FM ALV自定义小计文本”一文代码为例,设置“数量”字段为可编辑字段。
新建了状态ZSTATUS,保留标准保存按钮。
创建了按钮YES、NO,功能码分别是POPUP_1、POPUP_2。
这2个按钮和标准的保存按钮都是调用FORM:FRM_ALV_POPUP弹出另一个ALV窗口显示内表最新值。
这2个按钮的区别在于:按钮YES在调用FORM:FRM_ALV_POPUP之前,调用了方法CHECK_CHANGED_DATA;而按钮NO没有。

你可以尝试上述说的几种情况,对比当前界面内表与弹出的窗口内表(即更新后)的值。
对可编辑字段输入新值后:直接点击标准保存按钮按钮YES,内表更新了;点击按钮NO,内表没有更新。
所以自定义按钮时,建议把方法CHECK_CHANGED_DATA的调用移到判断功能码前。

程序代码:
  1. REPORT  ydamon_001 MESSAGE-ID oo.
  2. *----------------------------------------------------------------------*
  3. *                           Pools and Types
  4. *----------------------------------------------------------------------*
  5. TYPE-POOLS: slis,abap,vrm,icon,ole2.

  6. TYPES: BEGIN OF struc_tab,
  7.          mblnr TYPE mseg-mblnr,
  8.          mjahr TYPE mseg-mjahr,
  9.          zeile TYPE mseg-zeile,
  10.          bwart TYPE mseg-bwart,
  11.          matnr TYPE mseg-matnr,
  12.          maktx TYPE makt-maktx,
  13.          dmbtr TYPE mseg-dmbtr,
  14.          menge TYPE mseg-menge,
  15.          bpmng TYPE mseg-bpmng,
  16.          meins TYPE mara-meins,
  17.          sum TYPE char50,
  18.        END OF struc_tab.

  19. *----------------------------------------------------------------------*
  20. *                   Work Area and Internal Table
  21. *----------------------------------------------------------------------*
  22. DATA: gs_layout TYPE lvc_s_layo,
  23.       gs_settings TYPE lvc_s_glay,
  24.       gt_sort TYPE lvc_t_sort,
  25.       gt_fieldcat TYPE lvc_t_fcat.

  26. DATA: gs_tab TYPE struc_tab,
  27.       gt_tab TYPE TABLE OF struc_tab.

  28. *----------------------------------------------------------------------*
  29. *                      Ranges and Field Symbols
  30. *----------------------------------------------------------------------*
  31. FIELD-SYMBOLS: <fs_tab> TYPE struc_tab.

  32. *----------------------------------------------------------------------*
  33. *                          Class and Object
  34. *----------------------------------------------------------------------*
  35. DATA: grid TYPE REF TO cl_gui_alv_grid.

  36. *----------------------------------------------------------------------*
  37. *                         START-OF-SELECTION
  38. *----------------------------------------------------------------------*
  39. START-OF-SELECTION.

  40.   PERFORM frm_data_get.
  41.   PERFORM frm_data_process.
  42.   PERFORM frm_data_output.

  43. *&---------------------------------------------------------------------*
  44. *&      FORM  FRM_DATA_GET
  45. *&---------------------------------------------------------------------*
  46. FORM frm_data_get.

  47.   SELECT a~mblnr a~mjahr a~zeile a~bwart a~matnr a~dmbtr a~menge a~bpmng
  48.          b~maktx
  49.     FROM mseg AS a
  50.     INNER JOIN makt AS b ON b~matnr EQ a~matnr AND b~spras EQ sy-langu
  51.     UP TO 15 ROWS
  52.     INTO CORRESPONDING FIELDS OF TABLE gt_tab.

  53.   IF gt_tab IS INITIAL.
  54.     MESSAGE s000 DISPLAY LIKE 'E' WITH '没有符合条件的数据!'.
  55.     STOP.
  56.   ENDIF.
  57. ENDFORM.                                                  "FRM_DATA_GET

  58. *&---------------------------------------------------------------------*
  59. *&      FORM  FRM_DATA_PROCESS
  60. *&---------------------------------------------------------------------*
  61. FORM frm_data_process.
  62.   LOOP AT gt_tab ASSIGNING <fs_tab>.
  63.     CONCATENATE <fs_tab>-maktx '-' <fs_tab>-bwart INTO <fs_tab>-sum.
  64.   ENDLOOP.

  65.   gs_tab-meins = 'EA'.
  66.   MODIFY gt_tab FROM gs_tab TRANSPORTING meins WHERE meins NE 'EA'.
  67.   CLEAR gs_tab.
  68. ENDFORM.                                               "FRM_DATA_PROCESS

  69. *&---------------------------------------------------------------------*
  70. *&      FORM  FRM_DATA_OUTPUT
  71. *&---------------------------------------------------------------------*
  72. FORM frm_data_output.

  73.   PERFORM frm_alv_init_layout.
  74.   PERFORM frm_alv_init_settings.
  75.   PERFORM frm_alv_sort_build.
  76.   PERFORM frm_alv_init_fieldcat.
  77.   PERFORM frm_alv_display.

  78. ENDFORM.                    " FRM_DATA_OUTPUT

  79. *&---------------------------------------------------------------------*
  80. *&      FORM  FRM_ALV_INIT_LAYOUT
  81. *&---------------------------------------------------------------------*
  82. FORM frm_alv_init_layout.

  83.   gs_layout-zebra = 'X'.
  84.   gs_layout-sel_mode = 'D'.
  85.   gs_layout-cwidth_opt = 'X'.
  86.   gs_layout-detailinit = 'X'.

  87. ENDFORM.                    " FRM_ALV_INIT_LAYOUT

  88. *&---------------------------------------------------------------------*
  89. *&      FORM  FRM_ALV_INIT_SETTINGS
  90. *&---------------------------------------------------------------------*
  91. FORM frm_alv_init_settings.

  92.   gs_settings-edt_cll_cb = 'X'.

  93. ENDFORM.                    " FRM_ALV_INIT_SETTINGS

  94. *&---------------------------------------------------------------------*
  95. *&      FORM  FRM_ALV_SORT_BUILD
  96. *&---------------------------------------------------------------------*
  97. FORM frm_alv_sort_build.
  98.   DATA: ls_sort TYPE lvc_s_sort.

  99.   ls_sort-fieldname = 'MATNR'.
  100.   ls_sort-up        = 'X'.
  101.   APPEND ls_sort TO gt_sort.
  102.   CLEAR ls_sort.

  103.   ls_sort-fieldname = 'MAKTX'.
  104.   ls_sort-up        = 'X'.
  105.   APPEND ls_sort TO gt_sort.
  106.   CLEAR ls_sort.

  107.   ls_sort-fieldname = 'BWART'.
  108.   ls_sort-up        = 'X'.
  109.   APPEND ls_sort TO gt_sort.
  110.   CLEAR ls_sort.

  111.   ls_sort-fieldname = 'SUM'.
  112.   ls_sort-up        = 'X'.
  113.   ls_sort-subtot    = 'X'.
  114.   APPEND ls_sort TO gt_sort.
  115.   CLEAR ls_sort.

  116. ENDFORM.                    "FRM_ALV_SORT_BUILD

  117. *&---------------------------------------------------------------------*
  118. *&      FORM  FRM_ALV_INIT_FIELDCAT
  119. *&---------------------------------------------------------------------*
  120. FORM frm_alv_init_fieldcat.
  121.   DATA: ls_fieldcat TYPE lvc_s_fcat.
  122.   DEFINE mac_fill_fieldcat.
  123.     ls_fieldcat-fieldname  = &1.
  124.     ls_fieldcat-coltext = &2.
  125.     ls_fieldcat-no_zero = &3.
  126.     ls_fieldcat-do_sum = &4.
  127.     ls_fieldcat-no_out = &5.
  128.     ls_fieldcat-ref_table = &6.
  129.     ls_fieldcat-ref_field = &7.
  130.     ls_fieldcat-decimals_o = &8.
  131.     ls_fieldcat-qfieldname = &9.
  132.     append ls_fieldcat to gt_fieldcat.
  133.     clear ls_fieldcat.
  134.   END-OF-DEFINITION.

  135.   mac_fill_fieldcat 'MBLNR' '物料凭证' '' '' '' '' '' '' ''.
  136.   mac_fill_fieldcat 'MJAHR' '凭证年度' '' '' '' '' '' '' ''.
  137.   mac_fill_fieldcat 'ZEILE' '行号' 'X' '' '' '' '' '' ''.
  138.   mac_fill_fieldcat 'BWART' '移动类型' '' '' '' '' '' '' ''.
  139.   mac_fill_fieldcat 'MATNR' '物料编码' 'X' '' '' 'MARA' 'MATNR' '' ''.
  140.   mac_fill_fieldcat 'MAKTX' '物料描述' '' '' '' '' '' '' ''.
  141.   mac_fill_fieldcat 'DMBTR' '金额' '' 'X' '' '' '' '' ''.
  142.   mac_fill_fieldcat 'MENGE' '数量' '' 'X' '' 'MSEG' 'MENGE' '0' 'MEINS'.
  143.   mac_fill_fieldcat 'BPMNG' '计算数量' '' 'X' '' 'MSEG' 'MENGE' '0' 'MEINS'.
  144.   mac_fill_fieldcat 'SUM' '小计:' '' '' 'X' '' '' '' ''.
  145.   mac_fill_fieldcat 'MEINS' '单位' '' '' 'X' '' '' '' ''.

  146.   ls_fieldcat-edit = 'X'.
  147.   MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING edit
  148.     WHERE fieldname EQ 'MENGE'.
  149.   CLEAR ls_fieldcat.

  150. ENDFORM.                    " FRM_ALV_INIT_FIELDCAT

  151. *&---------------------------------------------------------------------*
  152. *&      FORM  FRM_ALV_DISPLAY
  153. *&---------------------------------------------------------------------*
  154. FORM frm_alv_display.

  155.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  156.     EXPORTING
  157.       i_callback_program       = sy-repid
  158.       is_layout_lvc            = gs_layout
  159.       i_grid_settings          = gs_settings
  160.       it_sort_lvc              = gt_sort
  161.       it_fieldcat_lvc          = gt_fieldcat
  162.       i_save                   = 'U'
  163.       i_default                = space
  164.       i_callback_pf_status_set = 'FRM_ALV_STATUS_SET'
  165.       i_callback_user_command  = 'FRM_ALV_USER_COMMAND'
  166.     TABLES
  167.       t_outtab                 = gt_tab
  168.     EXCEPTIONS
  169.       program_error            = 1
  170.       OTHERS                   = 2.
  171.   IF sy-subrc <> 0.
  172.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  173.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  174.   ENDIF.

  175. ENDFORM.                    " FRM_ALV_DISPLAY

  176. *&---------------------------------------------------------------------*
  177. *&      FORM  FRM_ALV_STATUS_SET
  178. *&---------------------------------------------------------------------*
  179. FORM frm_alv_status_set USING pt_extab TYPE slis_t_extab.

  180.   SET PF-STATUS 'ZSTATUS' EXCLUDING pt_extab.

  181.   CHECK grid IS INITIAL.

  182.   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  183.     IMPORTING
  184.       e_grid = grid.

  185. ENDFORM.                    " FRM_ALV_STATUS_SET

  186. *&---------------------------------------------------------------------*
  187. *&      FORM  FRM_ALV_USER_COMMAND
  188. *&---------------------------------------------------------------------*
  189. FORM frm_alv_user_command USING pa_ucomm TYPE sy-ucomm
  190.                                 ps_selfield TYPE slis_selfield.

  191.   CASE pa_ucomm.
  192.     WHEN '&DATA_SAVE'.
  193.       PERFORM frm_alv_popup.
  194.     WHEN 'POPUP_1'.
  195.       CALL METHOD grid->check_changed_data.
  196.       PERFORM frm_alv_popup.
  197.     WHEN 'POPUP_2'.
  198.       PERFORM frm_alv_popup.
  199.   ENDCASE.

  200. ENDFORM.                    " FRM_ALV_USER_COMMAND

  201. *&---------------------------------------------------------------------*
  202. *&      FORM  FRM_ALV_POPUP
  203. *&---------------------------------------------------------------------*
  204. FORM frm_alv_popup.
  205.   DATA: ls_fieldcat_sub TYPE slis_fieldcat_alv,
  206.         lt_fieldcat_sub TYPE slis_t_fieldcat_alv.
  207.   DEFINE mac_fill_fieldcat_sub.
  208.     ls_fieldcat_sub-fieldname  = &1.
  209.     ls_fieldcat_sub-seltext_m = &2.
  210.     ls_fieldcat_sub-key = &3.
  211.     ls_fieldcat_sub-no_zero = &4.
  212.     ls_fieldcat_sub-no_out = &5.
  213.     ls_fieldcat_sub-ref_tabname = &6.
  214.     ls_fieldcat_sub-ref_fieldname = &7.
  215.     ls_fieldcat_sub-decimals_out = &8.
  216.     ls_fieldcat_sub-qfieldname = &9.
  217.     append ls_fieldcat_sub to lt_fieldcat_sub.
  218.     clear ls_fieldcat_sub.
  219.   END-OF-DEFINITION.

  220.   mac_fill_fieldcat_sub 'MBLNR' '物料凭证' '' '' '' '' '' '' ''.
  221.   mac_fill_fieldcat_sub 'MJAHR' '凭证年度' '' '' '' '' '' '' ''.
  222.   mac_fill_fieldcat_sub 'ZEILE' '行号' '' 'X' '' '' '' '' ''.
  223.   mac_fill_fieldcat_sub 'BWART' '移动类型' '' '' '' '' '' '' ''.
  224.   mac_fill_fieldcat_sub 'MATNR' '物料编码' '' 'X' '' 'MARA' 'MATNR' '' ''.
  225.   mac_fill_fieldcat_sub 'MAKTX' '物料描述' '' '' '' '' '' '' ''.
  226.   mac_fill_fieldcat_sub 'DMBTR' '金额' '' '' '' '' '' '' ''.
  227.   mac_fill_fieldcat_sub 'MENGE' '数量' '' '' '' 'MSEG' 'MENGE' '0' 'MEINS'.
  228.   mac_fill_fieldcat_sub 'BPMNG' '计算数量' '' '' '' 'MSEG' 'MENGE' '0' 'MEINS'.
  229.   mac_fill_fieldcat_sub 'MEINS' '单位' '' '' 'X' '' '' '' ''.

  230.   CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
  231.     EXPORTING
  232.       i_callback_program      = sy-repid
  233.       i_zebra                 = 'X'
  234.       i_screen_start_column   = 10
  235.       i_screen_start_line     = 1
  236.       i_screen_end_column     = 135
  237.       i_screen_end_line       = 15
  238.       i_tabname               = '1'
  239.       it_fieldcat             = lt_fieldcat_sub
  240.       i_callback_user_command = 'FRM_ALV_USER_COMMAND_POPUP'
  241.     TABLES
  242.       t_outtab                = gt_tab
  243.     EXCEPTIONS
  244.       program_error           = 1
  245.       OTHERS                  = 2.

  246. ENDFORM.     "FRM_ALV_POPUP

  247. *&---------------------------------------------------------------------*
  248. *&      FORM  FRM_ALV_USER_COMMAND_POPUP
  249. *&---------------------------------------------------------------------*
  250. FORM frm_alv_user_command_popup USING pa_ucomm TYPE sy-ucomm
  251.                                       pwa_selfield TYPE slis_selfield.
  252.   DATA: l_filename TYPE string,
  253.         l_path TYPE string,
  254.         l_fullpath TYPE string,
  255.         l_action TYPE i.
  256.   TYPES: BEGIN OF struc_table,
  257.            mblnr TYPE char20,
  258.            mjahr TYPE char20,
  259.            zeile TYPE char20,
  260.            bwart TYPE char20,
  261.            matnr TYPE char20,
  262.            maktx TYPE char20,
  263.            dmbtr TYPE char20,
  264.            menge TYPE char20,
  265.            bpmng TYPE char20,
  266.          END OF struc_table.
  267.   DATA: ls_tab TYPE struc_table,
  268.         lt_tab TYPE TABLE OF struc_table.

  269.   CASE pa_ucomm.
  270.     WHEN '&ETA'.
  271.       CLEAR pa_ucomm.

  272.       CALL METHOD cl_gui_frontend_services=>file_save_Dialog
  273.         EXPORTING
  274.           file_filter          = 'Excel Files (*.xls,*.xlsx)|*.xls;*.xlsx'
  275.         CHANGING
  276.           filename             = l_filename
  277.           path                 = l_path
  278.           fullpath             = l_fullpath
  279.           user_action          = l_action
  280.         EXCEPTIONS
  281.           cntl_error           = 1
  282.           error_no_gui         = 2
  283.           not_supported_by_gui = 39
  284.           OTHERS               = 4.
  285.       IF sy-subrc <> 0.
  286.         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  287.                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  288.       ENDIF.

  289.       CHECK l_action EQ 0.
  290.       CLEAR ls_tab.
  291.       REFRESH lt_tab.

  292.       LOOP AT gt_tab ASSIGNING <fs_tab>.
  293.         MOVE-CORRESPONDING <fs_tab> TO ls_tab.
  294.         APPEND ls_tab TO lt_tab.
  295.         CLEAR ls_tab.
  296.       ENDLOOP.

  297.       ls_tab-mblnr = '物料凭证'.
  298.       ls_tab-mjahr = '凭证年度'.
  299.       ls_tab-zeile = '行号'.
  300.       ls_tab-bwart = '移动类型'.
  301.       ls_tab-matnr = '物料编码'.
  302.       ls_tab-maktx = '物料描述'.
  303.       ls_tab-dmbtr = '金额'.
  304.       ls_tab-menge = '数量'.
  305.       ls_tab-bpmng = '计算数量'.
  306.       INSERT ls_tab INTO lt_tab INDEX 1.
  307.       CLEAR ls_tab.

  308.       CALL METHOD cl_gui_frontend_services=>gui_download
  309.         EXPORTING
  310.           filename                = l_fullpath
  311.           write_field_separator   = 'X'
  312.         CHANGING
  313.           data_tab                = lt_tab
  314.         EXCEPTIONS
  315.           file_write_error        = 1
  316.           no_batch                = 2
  317.           gui_refuse_filetransfer = 3
  318.           invalid_type            = 4
  319.           no_authority            = 5
  320.           unknown_error           = 6
  321.           header_not_allowed      = 7
  322.           separator_not_allowed   = 8
  323.           filesize_not_allowed    = 9
  324.           header_too_long         = 10
  325.           dp_error_create         = 11
  326.           dp_error_send           = 12
  327.           dp_error_write          = 13
  328.           unknown_dp_error        = 14
  329.           access_denied           = 15
  330.           dp_out_of_memory        = 16
  331.           disk_full               = 17
  332.           dp_timeout              = 18
  333.           file_not_found          = 19
  334.           dataprovider_exception  = 20
  335.           control_flush_error     = 21
  336.           not_supported_by_gui    = 22
  337.           error_no_gui            = 23
  338.           OTHERS                  = 24.
  339.       IF sy-subrc <> 0.
  340.         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  341.                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  342.       ENDIF.
  343.   ENDCASE.

  344. ENDFORM. " FRM_ALV_USER_COMMAND_POPUP
复制代码

* 本程序保留了“REUSE_ALV_POPUP_TO_SELECT导出”一文中的导出功能。
程序执行初始界面
EDT_CLL_CB 1.png
yes按钮调用oo的CHECK_CHANGED_DATA方法监听修改内容更新至内表
EDT_CLL_CB 2.png
no按钮没有调用oo的CHECK_CHANGED_DATA方法,所以alv界面的值没有更新至内表,但我们也可以设置I_GRID_SETTINGS-EDT_CLL_CB = 'X'参数达到同样的效果
EDT_CLL_CB 3.png
回复

使用道具 举报

小懒
站长写的帖子倒还可以{:soso_e142:}
回复 支持 反对

使用道具 举报

glb1197531
不设置I_GRID_SETTINGS-EDT_CLL_CB,只调用oo的CHECK_CHANGED_DATA方法,应该也可以实现
回复 支持 反对

使用道具 举报

快速回帖

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

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