Excel导入ALV后搜索帮助字段校验失效问题求解
解决方案:ALV上传Excel后搜索帮助字段校验缺失问题
核心原因
ALV仅对手动编辑触发的单元格变更自动调用搜索帮助校验,而Excel批量导入的数据属于直接写入内表,不会触发ALV的编辑事件校验逻辑,因此缺失了这一步验证。
具体解决步骤
1. 上传Excel后主动触发ALV数据校验
在Excel数据写入<all_table_new>后,不要直接调用set_table_for_first_display,优先对数据做校验,可选两种方式:
方法一:手动遍历内表校验搜索帮助字段
针对带搜索帮助的字段,逐个调用对应标准校验函数(或自定义校验逻辑):
DATA: lv_fieldname TYPE fieldname, lv_check_ok TYPE abap_bool. LOOP AT <all_table_new> ASSIGNING <fs_data>. " 校验物料编号(示例字段) lv_fieldname = 'MATNR'. ASSIGN COMPONENT lv_fieldname OF STRUCTURE <fs_data> TO <fs_val>. IF sy-subrc = 0. CALL FUNCTION 'MATN1_CHECK' EXPORTING matnr = <fs_val> EXCEPTIONS invalid_input = 1 OTHERS = 2. IF sy-subrc <> 0. APPEND VALUE #( indx = sy-tabix type = 'E' message = '物料编号格式无效' ) TO gt_mod. lv_check_ok = abap_false. ENDIF. ENDIF. " 校验销售组织(示例字段) lv_fieldname = 'VKORG'. ASSIGN COMPONENT lv_fieldname OF STRUCTURE <fs_data> TO <fs_val>. IF sy-subrc = 0. CALL FUNCTION 'VKORG_CHECK' EXPORTING vkorg = <fs_val> EXCEPTIONS invalid_input = 1 OTHERS = 2. IF sy-subrc <> 0. APPEND VALUE #( indx = sy-tabix type = 'E' message = '销售组织不存在' ) TO gt_mod. lv_check_ok = abap_false. ENDIF. ENDIF. ENDLOOP.
方法二:调用ALV API触发自动校验
初始化ALV后,调用check_changed_data强制触发全局校验:
" 在set_table_for_first_display之后添加 CALL METHOD gt_grid_new_upld->check_changed_data IMPORTING e_valid = lv_check_ok. IF lv_check_ok = abap_false. CALL METHOD gt_grid_new_upld->display_messages. ENDIF.
2. 增强事件处理方法的校验逻辑
在handle_data_changed_new_upld方法中,补充对导入行的校验,确保所有变更(含导入)都被检查:
METHOD handle_data_changed_new_upld. DATA: ls_modified TYPE lvc_s_modi, fs_data TYPE ANY, fs_val TYPE ANY. LOOP AT er_data_changed->mt_mod_cells INTO ls_modified. READ TABLE <all_table_new> ASSIGNING fs_data INDEX ls_modified-row_id. IF sy-subrc = 0. ASSIGN COMPONENT ls_modified-fieldname OF STRUCTURE fs_data TO fs_val. IF sy-subrc = 0. CASE ls_modified-fieldname. WHEN 'MATNR'. CALL FUNCTION 'MATN1_CHECK' EXPORTING matnr = fs_val EXCEPTIONS invalid_input = 1. IF sy-subrc <> 0. er_data_changed->add_protocol_entry( i_msgid = 'ZMSG' i_msgno = '001' i_msgty = 'E' i_msgv1 = fs_val ). er_data_changed->modify_cell( i_row_id = ls_modified-row_id i_fieldname = ls_modified-fieldname i_value = '' ). ENDIF. WHEN 'VKORG'. " 同理处理销售组织校验 ENDCASE. ENDIF. ENDIF. ENDLOOP. ENDMETHOD.
3. 优化ALV初始化的错误标记逻辑
在现有代码的LOOP AT <all_table_new>循环中,扩展为对所有带搜索帮助的字段做错误标记,将校验不通过的行类型设为'E',让ALV自动高亮错误行。
关键注意点
- 确保字段目录
it_cat_new中,带搜索帮助的字段正确维护了ref_table、ref_field属性,ALV才能识别关联的搜索帮助。 - 校验函数需匹配实际字段,比如工厂用
WERKS_CHECK,自定义搜索帮助需自行实现校验逻辑。
内容的提问来源于stack exchange,提问作者Sagar Singh
相关产品推荐
相关产品推荐

