问题描述
我有一个带有可编辑字段的 ALV 网格,如果我检查输入的数据并显示错误,ALV 会更新,如果我尝试更改输入数据,其他时候 ALV 不再更新。
PAI 中的代码是:
ls_layout-cwidth_opt = abap_true.
CREATE OBJECT go_alv
EXPORTING
i_parent = cl_gui_custom_container=>screen0
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
IF sy-subrc EQ 0.
* Adapting field catalog
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZAMOUNT'
CHANGING
ct_fieldcat = lt_fieldcat.
IF sy-subrc EQ 0.
* Field catalog specifics
LOOP AT lt_fieldcat ASSIGNING <ls_fieldcat>.
IF <ls_fieldcat>-fieldname = 'DMBTR'.
<ls_fieldcat>-edit = abap_true.
ENDIF.
ENDLOOP.
ENDIF.
* Show data usig ALV class
go_alv->set_table_for_first_display(
EXPORTING
is_layout = ls_layout
CHANGING
it_outtab = gt_out
it_fieldcatalog = lt_fieldcat ).
go_alv->set_ready_for_input( EXPORTING
i_ready_for_input = 1 ).
CALL METHOD go_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD go_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ENDIF.
PBO 中的代码是:
IF go_alv IS NOT INITIAL.
CALL METHOD go_alv->check_changed_data( ).
PERFORM check_amounts TABLES gt_out
CHANGING gv_sum_amounts
gv_tot_amount.
CALL METHOD go_alv->refresh_table_display
EXPORTING
is_stable = VALUE #( row = abap_true
col = abap_true )
i_soft_refresh = 'X'.
cl_gui_cfw=>flush( ).
ENDIF.
在执行 check_amounts 中,如果用户修改输入字段并且错误在内部表中删除但未显示在 ALV 中,我将使用错误填充 ALV 的字段。
我也尝试通过调用里面的refresh来实现data_change_finished方法,但是没有解决异常。
你能帮我吗? 谢谢
解决方法
我不太确定我是否理解您的问题,但我看到以下一些潜在问题:
- 您的有效性检查被拆分了。一方面是 data_changed 事件。另一方面,您可以执行 check_amounts。
- 如果 data_changed 事件发现输入错误,它会在您的网格上显示红色轮廓。在您的内部表(“gt_out”)中,此字段将保持与以前相同(它不会使用无效输入更新表!)。 这可能就是您认为网格中应该有一条消息但没有的原因。
- 您是否为 data_changed 事件定义了自己的本地版本?比缺少处理程序。当您尝试在 data_changed_finished 事件中进行刷新时,您肯定需要处理程序。
- 您还说您只将刷新放在 data_changed_finished 的方法中。您还需要将 check_amount 放在那里执行。否则,您会提前调用刷新。
- 在 data_changed_finished 方法中,您有来自 data_changed 方法的自动更新表(“gt_out”)。您应该可以在此处更新它并刷新后将其发送到您的网格。
- 我不喜欢你在 PBO 中调用 check_changed_data 方法。由于 register_edit_event 调用 data_changed 事件已在您按 Enter 键或跳转到下一个字段时触发。您通常只在收到单独的用户命令时才调用此方法,可以在触发事件之前触发该命令,以确保您拥有正确的数据。
- 对此不是 100% 确定,但对于 register_edit_event 调用,事件 ID cl_gui_alv_grid=>mc_evt_modified 应该已经包含事件 ID cl_gui_alv_grid=>mc_evt_enter。
我会尝试定义一个本地类来处理 data_changed 和 data_changed_finished 事件,并将 check_amount 和 refresh 放在 data_changed_finished 事件的方法中。 也许其中一些对你有帮助?如果您对此有任何疑问,请告诉我,我可以提供更多详细信息。
问候