如何在 WebClient UI 裡建立 Value Help

JerryWang_汪子熙發表於2023-01-31

我們先看一下按照本文介紹的步驟完成之後,實現的效果如何。

下圖 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_SEARCHcontext node PARTNER 獲取使用者從搜尋結果裡選擇的 BusinessPartner 記錄的內容,儲存到我們自己定義的欄位 BusinessPartner IDEmployee 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 方法。

相關文章