我们先看一下按照本文介绍的步骤完成之后,实现的效果如何。
下图 BusinessPartner ID 字段右侧,有一个正方形小图标,暗示着这个字段分配了一个 F4 Value help.
点击 F4 快捷键或者点击正方形图标,会看到一个弹出的 Value Help 窗口,我们可以根据各种搜索条件,查询 Business Partner 数据,而不用去记忆 Business Partner 的 ID.
比如根据 First Name 或者 Last Name 进行搜索。
如上图所示,我们选中搜索结果里第一条记录,则其 id 120 就会自动填写到触发 Value Help 的 BusinessPartner ID 字段上去。
详细实现步骤
(1) 实现 GET_P 方法。
代码如下:
CASE iv_property. WHEN if_bsp_wd_model_setter_getter=>fp_fieldtype. rv_value = cl_bsp_dlc_view_descriptor=>field_type_input. ENDCASE.
上面代码的语义是将 BusinessPartner ID 的类型(fieldtype),指定为枚举值 cl_bsp_dlc_view_descriptor=>field_type_input.
实现 GET_V 方法:
create object rv_valuehelp_descriptor type cl_bsp_wd_valuehelp_navdescr exporting iv_outbound_plug = 'OP_PARTNER_SEARCH'.
给 BusinessPartner ID 字段绑定一个 outbound plug,取名 OP_PARTNER_SEARCH.
(2) 创建一个同名的 outbound plug:OP_PARTNER_SEARCH
在视图控制器里定义一个 private attribute, 名叫 mv_popup,类型为 TYPE REF TO if_bsp_wd_popup.
实现如下 ABAP 代码:
DATA: lv_node TYPE REF TO cl_bsp_wd_context_node. DATA: lv_title TYPE string. lv_title = cl_wd_utilities=>get_otr_text_by_alias( 'CRM_UIU_PROD_CUST/SEARCH_CUSTOMER' ). mv_popup = comp_controller->window_manager->create_popup( iv_interface_view_name = 'SearchHelpWindow' iv_usage_name = 'BPSearch' iv_title = lv_title ). mv_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ). mv_popup->set_on_close_event( iv_view = me iv_event_name = 'CLOSEPOPUP' ). mv_popup->open( 'CLEAR_ALL' ).
(3) 上一步骤的 ABAP 代码里,我们试图打开定义在名叫 BPSearch 的 Component Usage 里的 Popup window,因此这一步,我们需要在 runtime repository 里定义一个 Component usage:
当 value help 窗口关闭时,event CLOSEPOPUP 会触发。
will be triggered. So we create this event handler and implement it:
因此我们为 CLOSEPOPUP 事件创建 event handler. 在事件处理函数的实现逻辑里,我们从 Component BP_HEAD_SEARCH 的 context node PARTNER 获取用户从搜索结果里选择的 BusinessPartner 记录的内容,存储到我们自己定义的字段 BusinessPartner ID 和 Employee Name 里。
method EH_ONCLOSEPOPUP. DATA: lv_target_node TYPE REF TO cl_bsp_wd_context_node. DATA: lr_node TYPE REF TO cl_bsp_wd_context_node, lr_entity TYPE REF TO if_bol_bo_property_access, lr_entity_bp TYPE REF TO if_bol_bo_property_access, lv_fullname TYPE BU_DESCRIP, lv_bp_id TYPE bu_partner. lr_entity ?= me->typed_context->bpinfo->collection_wrapper->get_current( ). ASSERT lr_entity IS NOT INITIAL. lr_node = mv_popup->get_context_node( 'PARTNER' ). CHECK lr_node IS BOUND. lr_entity_bp = lr_node->collection_wrapper->get_current( ). CHECK lr_entity IS BOUND AND lr_entity_bp IS BOUND. lv_bp_id = lr_entity_bp->get_property_as_string( 'BP_NUMBER' ). CHECK lv_bp_id IS NOT INITIAL. lr_entity->set_property( iv_attr_name = 'BP_ID' iv_value = lv_bp_id ). CALL FUNCTION 'CRM_BUPA_DESCRIPTION_READ' EXPORTING iv_partner = lv_bp_id IMPORTING ev_description_name = lv_fullname EXCEPTIONS no_partner_specified = 1 no_valid_record_found = 2 OTHERS = 3. lr_entity->set_property( iv_attr_name = 'BP_NAME' iv_value = lv_fullname ).
第二步创建 outbound plug OP_PARTNER_SEARCH 时,创建的方法默认是 protected 的,我们需要手动将其更改成 Public.
如果省去这一步,运行时我们会遇到异常 CX_BSP_WD_INCORRECT_IMPLEMENT,因为 BSP 框架无法调用一个类的 protected 方法。