前段时间接到的需求:INBOX(ICCMP_INBOX)查询结果,多选后弹出选择用户的框,选择用户,带入到单据的PARTNER FUNC的工程师中,并修改单据状态。
其实标准的INBOX的ComponentUsages是有EMPLOYEE的,但是好像需要激活一些东西(SFW5),所以就自己把这个单独引入到INBOX中
增强ICCMP_INBOX/InboxItems 视图
给结果添加按钮:
METHOD if_bsp_wd_dyn_btn_control~get_local_toolbar_buttons. DATA:gw_button TYPE crmt_thtmlb_button. rt_result = super->if_bsp_wd_dyn_btn_control~get_local_toolbar_buttons( ). READ TABLE rt_result INTO gw_button WITH KEY id = 'ASSIGN'. IF sy-subrc <> 0. gw_button-id = 'ASSIGN'. gw_button-text = '分配'. gw_button-on_click = 'SEL_ZHSI0ENG'."指定事件 gw_button-enabled = 'X'. INSERT gw_button INTO rt_result INDEX 1. ENDIF. ENDMETHOD.
创建事件Event Handler 并分配OUT BONUD:
METHOD eh_onsel_zhsi0eng. * Added by wizard: Handler for event 'SEL_ZHSI0ENG' OP_TOEMP( ). ENDMETHOD.
METHOD op_toemp. * Added by wizard: Outbound plug 'TOEMP' DATA lv_title TYPE string. lv_title = cl_wd_utilities=>get_otr_text_by_alias( 'CRM_UIU_BT/EMPLOYEE_SEARCH' ). bpsearch = comp_controller->window_manager->create_popup( iv_interface_view_name = 'SearchHelpWindow' "#EC NOTEXT iv_usage_name = 'BPEMPL'"gc_emp_resp_search_usage iv_title = lv_title ). * set event bpsearch->set_on_close_event( iv_view = me iv_event_name = 'BP_SELEND' ). * set display mode bpsearch->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ). * Open the Popup bpsearch->open( ). " iv_inbound_plug = 'CLEAR_ALL' ENDMETHOD.
这时候页面上会显示按钮,并且可以弹窗,但是没有返回事件,所以选择后就会DUMP。
定义返回事件:(与上面对应)
METHOD eh_onbp_selend. * Added by wizard: Handler for event 'BP_SELEND' DATA: lr_context_node TYPE REF TO cl_bsp_wd_context_node, lr_current TYPE REF TO if_bol_bo_property_access, lr_core TYPE REF TO cl_crm_bol_core, lv_outbound_plug TYPE seocmpname. DATA: lr_selected_entities TYPE REF TO cl_crm_bol_entity_col. * Get query result context node lr_context_node = bpsearch->get_context_node( iv_cnode_name = 'EMPLOYEE' ). CHECK lr_context_node IS BOUND. lr_current = lr_context_node->collection_wrapper->get_current( ). CHECK lr_current IS BOUND. DATA: l_bp TYPE bu_partner. DATA: lr_entity TYPE REF TO if_bol_bo_property_access. * l_bp = lr_current->get_property_as_string( iv_attr_name = 'BP_NUMBER' ). * lr_entity ?= me->typed_context->zcorder->collection_wrapper->get_current( ). CHECK l_bp IS NOT INITIAL. TRY. * Accept all selected items lr_selected_entities ?= get_selected_entity_col( ). CATCH cx_sy_move_cast_error. RETURN. ENDTRY. CHECK lr_selected_entities IS BOUND. DATA: lr_ex_internal_error TYPE REF TO cx_crm_ic_internal_error, "#EC NEEDED lr_ex TYPE REF TO cx_root, "#EC NEEDED lv_remark TYPE string, "#EC NEEDED lv_msg_v1 TYPE symsgv, lv_msg_v2 TYPE symsgv, lv_text TYPE string, lr_aui_oneorder TYPE REF TO cl_crm_aui_oneorder, lr_mixed_ent TYPE REF TO cl_bsp_wd_mixed_node, lr_msg_service TYPE REF TO cl_bsp_wd_message_service. * TRY. * Accept all selected items DATA: lr_selected_entity TYPE REF TO cl_crm_bol_entity. lr_selected_entity ?= lr_selected_entities->if_bol_entity_col~get_first( ). WHILE lr_selected_entity IS BOUND. * Delegate to inbox entity DATA: lr_inbox_entity TYPE REF TO cl_crm_aui_entity, lv_message TYPE crmst_aui_message, lv_navlink TYPE string, lt_groups TYPE hrobjbupat. lr_inbox_entity ?= lr_selected_entity. * Get the underyling bol entity DATA:lr_related_bol_entity TYPE REF TO cl_crm_bol_entity. DATA:lr_root TYPE REF TO cl_crm_bol_entity. DATA:lr_order_h TYPE REF TO cl_crm_bol_entity. DATA:lr_partset TYPE REF TO cl_crm_bol_entity. DATA:lr_stuset TYPE REF TO cl_crm_bol_entity. DATA:lr_partall TYPE REF TO cl_crm_bol_entity. DATA:lr_partbol TYPE REF TO if_bol_entity_col. DATA:lr_stucurr TYPE REF TO cl_crm_bol_entity. DATA:lr_part TYPE REF TO cl_crm_bol_entity. DATA:ls_part TYPE crmst_partner_btil. DATA:ls_stu TYPE crmst_status_btil. DATA:gv_guid TYPE crmt_object_guid. DATA:ls_key TYPE crmst_partner_logical_key. DATA:lr_iter TYPE REF TO if_bol_entity_col_iterator. DATA:gv_is_started TYPE abap_bool. DATA:gv_c TYPE abap_bool. DATA:lv_trans TYPE REF TO if_bol_transaction_context. lr_related_bol_entity ?= lr_inbox_entity->get_bol_entity( ). IF lr_related_bol_entity IS INITIAL. lv_remark = 'Inbox processing: Underlying bol entity not bound'. "#EC NOTEXT RAISE EXCEPTION TYPE cx_crm_ic_internal_error EXPORTING remark = lv_remark. ELSE. lr_order_h = lr_related_bol_entity->get_related_entity( iv_relation_name = 'BTOrderHeader' ). lr_order_h->if_bol_bo_property_access~get_property_as_value( EXPORTING iv_attr_name = 'GUID' IMPORTING ev_result = gv_guid ). * "get instance lr_core = cl_crm_bol_core=>get_instance( ). * "check the bol instance is initial gv_is_started = cl_crm_bol_core=>check_is_started( ). * "if instance is not initial,get initial IF gv_is_started EQ abap_false. lr_core->start_up( 'BT' ). ENDIF. lr_core->load_component( iv_component_name = 'BT' ). * "get root entity CHECK lr_core IS BOUND. lr_root = lr_core->get_root_entity( iv_object_name = 'BTOrder' iv_object_guid = gv_guid ). lr_order_h = lr_root->get_related_entity( iv_relation_name = 'BTOrderHeader' ). CHECK lr_order_h IS BOUND. lr_partset = lr_order_h->get_related_entity( iv_relation_name = 'BTHeaderPartnerSet' ). IF lr_partset IS BOUND. lr_partbol = lr_partset->get_related_entities( iv_relation_name = 'BTPartnerAll' ). lr_iter ?= lr_partbol->get_iterator( ). lr_part ?= lr_iter->find_by_property( EXPORTING iv_attr_name = 'PARTNER_FCT' iv_value = 'ZHSI0ENG' ). * IF lr_iter IS BOUND. IF lr_part IS NOT BOUND. lr_partall = lr_partbol->get_first( ). IF lr_partall->is_changeable( ) = abap_true. CLEAR:ls_part. ls_part-partner_fct = 'ZHSI0ENG'. ls_part-partner_no = l_bp. lr_partall->if_bol_bo_property_access~set_properties( is_attributes = ls_part ). ENDIF. ELSE. CLEAR:gv_c. IF lr_part->is_changeable( ) = abap_false. gv_c = lr_part->switch_to_change_mode( ). ENDIF. IF gv_c = 'X' OR lr_part->is_changeable( ) = abap_true. lr_part->if_bol_bo_property_access~get_properties( IMPORTING es_attributes = ls_part ). ls_part-partner_fct = 'ZHSI0ENG'. ls_part-partner_no = l_bp. lr_part->if_bol_bo_property_access~set_properties( is_attributes = ls_part ). ENDIF. ENDIF. ENDIF. lr_stuset = lr_order_h->get_related_entity( iv_relation_name = 'BTHeaderStatusSet' ). IF lr_stuset IS BOUND. lr_stucurr = lr_stuset->get_related_entity( iv_relation_name = 'BTStatusHCurrent' ). IF lr_stucurr IS BOUND. IF lr_stucurr->is_changeable( ) = abap_true. CLEAR:ls_stu. CLEAR:gv_c. IF lr_stucurr->is_changeable( ) = abap_false. gv_c = lr_stucurr->switch_to_change_mode( ). ENDIF. IF gv_c = 'X' OR lr_stucurr->is_changeable( ) = abap_true. lr_stucurr->if_bol_bo_property_access~get_properties( IMPORTING es_attributes = ls_stu ). ls_stu-status = 'E0003'. ls_stu-act_status = 'E0003'. ls_stu-active = 'X'. lr_stucurr->if_bol_bo_property_access~set_properties( is_attributes = ls_stu ). ENDIF. ENDIF. ENDIF. ENDIF. lr_core->modify( ). lv_trans = lr_core->get_transaction( ). lv_trans->save( ). lv_trans->commit( ). ENDIF. * lr_related_bol_entity->reread( ). lr_selected_entity ?= lr_selected_entities->if_bol_entity_col~get_next( ). CHECK: lr_selected_entity IS BOUND. ENDWHILE. * Error handling CATCH cx_root. * Display error message lr_msg_service = cl_bsp_wd_message_service=>get_instance( ). lv_text = lr_inbox_entity->get_property_as_string( 'MAIN_CAT' ). CONCATENATE '"' lv_text '"' INTO lv_msg_v1. "#EC_NOTEXT lv_text = lr_inbox_entity->get_property_as_string( 'DESCRIPTION' ). CONCATENATE '"' lv_text '"' INTO lv_msg_v2. "#EC_NOTEXT CALL METHOD lr_msg_service->add_message EXPORTING iv_msg_type = if_genil_message_container=>mt_error iv_msg_id = 'CRM_IC_AUI' iv_msg_number = '053' iv_msg_v1 = lv_msg_v1 iv_msg_v2 = lv_msg_v2. ENDTRY. ENDMETHOD.