如何通过RAP在ODataV2预览版中实现搜索字段(金额/货币)的依赖验证?
解决RAP中金额与货币筛选依赖校验的方案
针对你遇到的筛选场景下无法校验金额与货币字段依赖的问题,给你两个可行的实现方向:
方向一:利用Query Validation接口实现校验
RAP专门提供了针对查询/筛选场景的校验机制,通过实现IF_QUERY_VALIDATION接口即可完成,步骤如下:
- 创建ABAP类,实现
IF_QUERY_VALIDATION接口的VALIDATE方法 - 在方法内获取当前筛选条件里的金额和货币字段值:
DATA(lo_filter) = io_request->get_filter( ). DATA(lv_amount) = lo_filter->get_value( iv_element = 'AMOUNT' ). DATA(lv_currency) = lo_filter->get_value( iv_element = 'CURRENCY' ). - 判断若金额有值但货币为空,抛出错误消息并终止筛选:
IF lv_amount IS NOT INITIAL AND lv_currency IS INITIAL. DATA(lo_msg_manager) = cl_message_manager=>get_instance( ). lo_msg_manager->add_message( iv_msg_type = if_abap_behv=>message_type-error iv_msg_text = 'Currency field is empty' ). RAISE EXCEPTION TYPE cx_query_validation_failed. ENDIF. - 在CDS Query定义中,通过
@Query.validation: 'ZCL_QUERY_VALIDATION'将校验类绑定到查询上
方向二:用Feeder Class拦截筛选请求(Fiori Elements场景适用)
如果你的RAP应用是基于Fiori Elements的列表报表,可通过Feeder Class处理:
- 创建继承自
CL_FPM_GUIBB_LIST的Feeder Class - 重写
PROCESS_AFTER_INPUT方法,在用户点击「Go」时触发校验逻辑 - 方法内获取筛选参数,不符合条件则添加错误消息并阻止数据加载:
DATA(lo_filter) = mo_fpm->get_filter( ). DATA(lv_amount) = lo_filter->get_value( 'AMOUNT' ). DATA(lv_currency) = lo_filter->get_value( 'CURRENCY' ). IF lv_amount IS NOT INITIAL AND lv_currency IS INITIAL. DATA(lo_msg_manager) = cl_message_manager=>get_instance( ). lo_msg_manager->add_message( iv_msg_type = 'E' iv_msg_text = 'Currency field is empty' iv_display_type = cl_message_manager=>display_type_inline ). mo_fpm->set_event_result( iv_result = if_fpm_constants=>gc_result-failure ). ENDIF. - 在Fiori Elements的Manifest文件中,将该Feeder Class配置到对应的列表报表组件
补充:Unmanaged Query场景的消息提示
你之前尝试的Unmanaged Query,只需在拦截逻辑中添加消息到消息管理器,即可在预览界面显示提示:
DATA(lo_msg_manager) = cl_message_manager=>get_instance( ). lo_msg_manager->add_message( iv_msg_type = if_abap_behv=>message_type-error iv_msg_text = 'Currency field is empty' ).
添加后前端会自动弹出错误提示,同时阻止数据展示。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

