zoukankan      html  css  js  c++  java
  • UI基础五:简单的OP组件POPUP搜索帮助

    需求:给一个配置表,需要根据配置表来弹出选择框,并将选择的数据添加到SALES ORDER的项目

    BSP_WD_CMPWB

    新建组件:ZHSI_JPMPG

    新建视图,适用VALUE NODE 参考表ZCRMT0057.(表视图,可配置,按钮)

    在节点的IF_BSP_MODEL~INIT中设置选择模式:多选:

      method IF_BSP_MODEL~INIT.
    
        TYPES: BEGIN OF ltype_attr_struct,
                 mandt        TYPE mandt,
                 zzzmodeno    TYPE zmodeno,
                 zpart_group  TYPE zpart_group,
                 product_id   TYPE comt_product_id,
                 zgroup_des   TYPE zgroup_des,
                 zproduct_des TYPE comt_prshtextx,
                 quantity     TYPE zcrm_quan,
    
               END OF ltype_attr_struct.
    
    
        super->if_bsp_model~init( id    = id
                                  owner = owner ).
    
        SELECTION_MODE = SELMODE_MULTI."多选
    
        DATA: lv_struct_ref TYPE REF TO ltype_attr_struct,
              lv_value_node TYPE REF TO cl_bsp_wd_value_node,
              lv_bo_coll    TYPE REF TO if_bol_bo_col.
    
        CREATE DATA lv_struct_ref.
        CREATE OBJECT lv_value_node
          EXPORTING
            iv_data_ref = lv_struct_ref.
        CREATE OBJECT lv_bo_coll TYPE cl_crm_bol_bo_col.
    
        lv_bo_coll->add( lv_value_node ).
    
        set_collection( lv_bo_coll ).
    
    
      endmethod.

    在组件控制器中添加参数节点:OPTION,值节点,字段参考ZCRMT0057中个别字段

    在组件控制器中添加返回结果节点:ZJPPJM,值节点,字段参考ZCRMT0057

    根据参数条件初始化查询结果TABLE:DO_INIT_CONTEXT

      METHOD do_init_context.
    **SUPER->DO_INIT_CONTEXT( ).
        DATA:gt_zcrmt0057 TYPE TABLE OF zcrmt0057,
             gw_zcrmt0057 LIKE LINE OF gt_zcrmt0057,
             lr_line      TYPE REF TO zcrmt0057,
             lr_valuenode TYPE REF TO cl_bsp_wd_value_node,
             lr_col       TYPE REF TO if_bol_bo_col,
             lr_comp      TYPE REF TO zl_zhsi_jpm_bspwdcomponen_impl,
             gr_cond      TYPE REF TO if_bol_bo_property_access,
             gw_cond      TYPE zmodeno.
    
        lr_comp ?= me->comp_controller.
        IF lr_comp IS BOUND.
          gr_cond = lr_comp->typed_context->option->collection_wrapper->get_current( ).
          IF gr_cond IS BOUND.
            gr_cond->get_property_as_value(
              EXPORTING
                iv_attr_name = 'ZZZMODENO'
              IMPORTING
                ev_result    = gw_cond ).
            SELECT * INTO TABLE gt_zcrmt0057 FROM zcrmt0057 WHERE zzzmodeno = gw_cond.
          ENDIF.
        ENDIF.
        CREATE OBJECT lr_col TYPE cl_crm_bol_bo_col.
        LOOP AT gt_zcrmt0057 INTO gw_zcrmt0057.
          CREATE DATA lr_line.
          CREATE OBJECT lr_valuenode
            EXPORTING
              iv_data_ref = lr_line.
          lr_valuenode->set_properties( gw_zcrmt0057 ).
          lr_col->add( lr_valuenode ).
        ENDLOOP.
    
        me->typed_context->zjppmj->collection_wrapper->set_collection( lr_col ).
      ENDMETHOD.

    重定义GET_LOCAL_TOOLBAR_BUTTONS方法,添加选择按钮(点击将选择结果返回到程序中)

      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( ).
        gw_button-id = 'CHOOSE'.
        gw_button-type = cl_thtmlb_util=>gc_done.
        gw_button-text = '選択'.
        gw_button-on_click = 'ZCHOOSE'.
        gw_button-enabled = abap_true.
        APPEND gw_button TO rt_result.
      ENDMETHOD.

    重定义GET_NO_OF_VISIBLE_TOOLBAR_BTNS方法,修改显示的按钮数量

      METHOD if_bsp_wd_dyn_btn_control~get_no_of_visible_toolbar_btns.
        rv_result = super->if_bsp_wd_dyn_btn_control~get_no_of_visible_toolbar_btns( ).
        rv_result = 9.
      ENDMETHOD.

    在Event Handler中添加前面设置的ZCHOOSE:

    (将选择的结果添加到组件控制器的返回节点中)

      METHOD eh_onzchoose.
        DATA lr_context_node_tree      TYPE REF TO cl_bsp_wd_context_node_tree.
        DATA lr_node                   TYPE REF TO if_bsp_wd_tree_node.
        DATA lr_tree_event             TYPE REF TO cl_thtmlb_tree.
        DATA lr_choose               TYPE REF TO if_bol_bo_col_iterator.
        DATA:lr_bol TYPE REF TO if_bol_bo_col.
        DATA   lv_sel_index              TYPE int4.
        DATA :lv_row_index TYPE int4,
              lr_comp      TYPE REF TO zl_zhsi_jpm_bspwdcomponen_impl,
              lr_window    TYPE REF TO cl_bsp_wd_window.
    
        lr_choose = me->typed_context->zjppmj->collection_wrapper->get_iterator( ).
        lr_bol = lr_choose->get_marked( ).
    
        lr_comp ?= me->comp_controller.
        lr_comp->typed_context->zjppjm->collection_wrapper->clear_collection( ).
        lr_comp->typed_context->zjppjm->collection_wrapper->set_collection( lr_bol ).
        lr_window = me->view_manager->get_window_controller( ).
        lr_window->call_outbound_plug( iv_outbound_plug   = 'PRD_SELECT' ).
      ENDMETHOD.

    WINDOW中添加外向跳转对象:

      METHOD op_prd_select.
        me->fire_outbound_plug( iv_outbound_plug   = 'PRD_SELECT'
                                 iv_data_collection = iv_data_collection ).
      ENDMETHOD.

    将组件添加InterfaceView,将组件控制器的参数节点和返回结果节点添加:

    在使用的组件中添加ComponentUsage:

    以上将搜索帮助的查询和返回值处理完成,现在来使用位置调用组件并处理返回结果:

    在BT115IT_SLSO的中添加按钮:

      METHOD do_prepare_output.
        CALL METHOD super->do_prepare_output
          EXPORTING
            iv_first_time = abap_false.
    *    CHECK sy-uname = zcl_crm_attributes=>gc_chenguoguang.
    **********************************************************************20170501-Begin
    *ZSO1/ZSO2/ZSO5 放出product ID 字段,ITEM增加exploed view按钮
    ***数据定义
        DATA:
          ls_button            TYPE crmt_thtmlb_button,
          ls_crmt_orgman_wrk   TYPE crmt_orgman_wrk,
          ls_crmst_adminh_btil TYPE crmst_adminh_btil,
          lr_btitems           TYPE REF TO cl_crm_bol_entity,
          lr_btorder           TYPE REF TO cl_crm_bol_entity,
          lr_btadminh          TYPE REF TO cl_crm_bol_entity.
    ***数据准备
        lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ).
        IF lr_btitems IS BOUND.
          lr_btorder = lr_btitems->get_root( ).
        ENDIF.
        IF lr_btorder IS BOUND.
          lr_btadminh = lr_btorder->get_related_entity( iv_relation_name = 'BTOrderHeader' ).
        ENDIF.
        CHECK lr_btadminh IS BOUND.
        lr_btadminh->get_properties( IMPORTING  es_attributes = ls_crmst_adminh_btil ).
        CALL FUNCTION 'CRM_ORGMAN_READ_OW'
          EXPORTING
            iv_ref_guid          = ls_crmst_adminh_btil-guid
            iv_ref_kind          = 'A'
          IMPORTING
            es_orgman_wrk        = ls_crmt_orgman_wrk
          EXCEPTIONS
            entry_does_not_exist = 1
            OTHERS               = 2.
        IF sy-subrc <> 0.
    * Implement suitable error handling here
        ENDIF.
    
        zl_bt115it__items_impl=>gv_sales_org = ls_crmt_orgman_wrk-sales_org.
        ls_button-type     = cl_thtmlb_util=>gc_icon_goto..
        ls_button-on_click = 'ZEXPLODE'.
        ls_button-text = 'Explode view'.
        ls_button-enabled  = abap_true.
        APPEND ls_button TO gt_button_tib.
        "在ZSO5的行项目中增加“部品リスト選択”按钮,只针对日本分公司显示。在点击该按钮时,弹出对话框,显示字段如下:
        "ADD BY LY 20171031
        IF ls_crmt_orgman_wrk-sales_org = 'O 50000231' AND ls_crmst_adminh_btil-process_type = 'ZSO5'.
          ls_button-type     = cl_thtmlb_util=>gc_icon_add..
          ls_button-on_click = 'ZPDEX'.
          ls_button-text = '部品リスト選択'.
          ls_button-enabled  = abap_true.
          APPEND ls_button TO gt_button_tib.
        ENDIF.
    **********************************************************************20170501-End
        "日语登陆,默认带出日语的物料描述,如无则取英语描述
        "ADD BY LY 20170613
        DATA:
          lv_langu TYPE sy-langu,
          lv_text  TYPE abap_bool.
        DATA lr_item_iter TYPE REF TO if_bol_bo_col_iterator.
        DATA lr_admini TYPE REF TO cl_crm_bol_entity.
        DATA ls_admini TYPE crmst_admini_btil.
        DATA:lr_core   TYPE REF TO cl_crm_bol_core.
        CLEAR:lv_langu.
        IF sy-langu = 'J'"加的by 李渊 20170613
          OR sy-langu = 'F'."20170731 法国逻辑
          lv_langu = sy-langu.
        ENDIF.
    
        IF lv_langu IS NOT INITIAL.
          lr_item_iter = me->typed_context->btadmini->collection_wrapper->if_bol_bo_col~get_iterator( ).
          CHECK lr_item_iter IS BOUND.
          lr_admini ?= lr_item_iter->get_first( ).
          WHILE lr_admini IS BOUND.
            lr_admini->get_properties( IMPORTING es_attributes = ls_admini ).
            IF sy-langu = lv_langu."加的by 李渊 20170606
              SELECT SINGLE short_text INTO ls_admini-description
                FROM comm_prshtext
                WHERE product_guid = ls_admini-product
                AND   langu        = lv_langu.
              IF sy-subrc <> 0.
                SELECT SINGLE short_text INTO ls_admini-description
                 FROM comm_prshtext
                 WHERE product_guid = ls_admini-product
                 AND   langu        = 'E'.
              ENDIF.
            ENDIF.
            lr_admini->set_properties( EXPORTING is_attributes = ls_admini ).
            lr_admini ?= lr_item_iter->get_next( ).
          ENDWHILE.
          lr_core = cl_crm_bol_core=>get_instance( ).
          lr_core->modify( ).
        ENDIF.
    
      ENDMETHOD.

    事件控制器中添加处理事件:ZPDEX

      METHOD eh_onzpdex.
    * Added by wizard: Handler for event 'ZPDEX'
        OP_PRD_SELECT( ).
      ENDMETHOD.

    添加外向链接:PRD_SELECT

      METHOD op_prd_select.
    * Added by wizard: Outbound plug 'PRD_SELECT'
        TYPES:BEGIN OF ty_cond,
                product_id TYPE comt_product_id,
                zzzmodeno  TYPE zmodeno,
              END OF ty_cond.
        DATA:lr_entity              TYPE REF TO cl_crm_bol_entity,
             lv_interface_view_name TYPE string,
             lv_title               TYPE string,
             gw_cond                TYPE ty_cond,
             gr_cond                TYPE REF TO ty_cond,
             lr_valuenode           TYPE REF TO cl_bsp_wd_value_node,
             lr_context             TYPE REF TO cl_bsp_wd_context_node.
        DATA:ls_crmst_adminh_btil TYPE crmst_adminh_btil,
             lr_btitems           TYPE REF TO cl_crm_bol_entity,
             lr_btorder           TYPE REF TO cl_crm_bol_entity,
             lr_btadminh          TYPE REF TO cl_crm_bol_entity.
    ***数据准备
    ”not use begin lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ). IF lr_btitems IS BOUND. lr_btorder = lr_btitems->get_root( ). ENDIF. IF lr_btorder IS BOUND. lr_btadminh = lr_btorder->get_related_entity( iv_relation_name = 'BTOrderHeader' ). ENDIF. CHECK lr_btadminh IS BOUND. lr_btadminh->get_properties( IMPORTING es_attributes = ls_crmst_adminh_btil ). "not use end lv_interface_view_name = 'ZHSI_JPMPG/MainWindow'. lv_title = '部品リスト選択'. "弹出框的标题 comp_popup = comp_controller->window_manager->create_popup("实例化弹出框,search_belnr_popup iv_interface_view_name = lv_interface_view_name "对应的类型为IF_BSP_WD_POPUP为全局变量 iv_usage_name = 'PRD_SELECT ' iv_title = lv_title ). comp_popup->set_on_close_event( iv_view = me iv_event_name = 'ZJPP_CLOSE' ). "设置弹出窗口对应的关闭事件 ** set display mode "此事件用于接受对应的选中返回值 comp_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ). ** Open the Popup comp_popup->set_window_width( 700 ). comp_popup->set_window_height( 500 ). DATA:lr_cond TYPE REF TO if_bol_bo_col. CREATE OBJECT lr_cond TYPE cl_crm_bol_bo_col. CREATE DATA gr_cond. CREATE OBJECT lr_valuenode EXPORTING iv_data_ref = gr_cond. gw_cond-zzzmodeno = ls_crmst_adminh_btil-zzzmodeno. lr_valuenode->set_properties( gw_cond ). lr_cond->add( lr_valuenode ). " Get Query Context node lr_context = comp_popup->get_context_node( 'OPTION' ). CHECK lr_context IS BOUND. lr_context->set_collection( collection = lr_cond ). comp_popup->open( iv_inbound_plug = 'PRD_SELECT' iv_collection = lr_cond ). ENDMETHOD.

    处理返回结果:新建事件:ZJPP_CLOSE

      METHOD eh_onzjpp_close.
    * Added by wizard: Handler for event 'ZJPP_CLOSE'
        DATA lr_item TYPE REF TO cl_crm_bol_entity.
        DATA:lr_schedext TYPE REF TO cl_crm_bol_entity,
             lr_schedlin TYPE REF TO cl_crm_bol_entity.
        DATA:lr_btitems                  TYPE REF TO cl_crm_bol_entity,
             lr_btorder                  TYPE REF TO cl_crm_bol_entity,
             lr_btadminh                 TYPE REF TO cl_crm_bol_entity,
             lr_context_node             TYPE REF TO cl_bsp_wd_context_node,
             lr_iterator                 TYPE REF TO if_bol_bo_col_iterator,
             lr_access                   TYPE REF TO if_bol_bo_property_access,
             ls_crmt0057                 TYPE zcrmt0057,
             gw_item                     TYPE crmst_admini_btil,
             gv_quantity                 TYPE crmt_schedlin_quan,
             ls_schedlin                 TYPE crmst_schedlin_btil,
             gv_string                   TYPE string,
             gr_cx_crm_genil_model_error TYPE REF TO cx_crm_genil_model_error.
    
        CHECK comp_popup IS BOUND.
        lr_context_node = comp_popup->get_context_node( iv_cnode_name = 'ZJPPJM' ).
        CHECK lr_context_node IS BOUND.
        lr_iterator = lr_context_node->collection_wrapper->get_iterator( ).
        IF lr_iterator->size( ) > 0.
          lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ).
          lr_access = lr_iterator->get_first( ).
          WHILE lr_access IS BOUND.
            CLEAR:gv_string.
            lr_access->get_properties( IMPORTING es_attributes = ls_crmt0057 ).
            TRY.
                lr_item ?= lr_btitems->create_related_entity( 'BTOrderItemAll' ).
              CATCH cx_crm_genil_model_error INTO gr_cx_crm_genil_model_error.
                gv_string = gr_cx_crm_genil_model_error->get_text( ).
            ENDTRY.
            IF lr_item IS BOUND.
              CLEAR:gw_item.
              lr_item->get_properties( IMPORTING es_attributes = gw_item ).
              IF gw_item-guid IS INITIAL.
                CALL FUNCTION 'CRM_GUID_CREATE'
                  IMPORTING
                    ev_guid = gw_item-guid.
              ENDIF.
              gw_item-ordered_prod = ls_crmt0057-product_id.
              lr_item->set_properties( EXPORTING  is_attributes = gw_item ).
              lr_schedext ?= lr_item->get_related_entity( 'BTItemSchedlinExt' ).
              IF lr_schedext IS NOT BOUND.
                lr_schedext ?= lr_item->create_related_entity( 'BTItemSchedlinExt' ).
              ENDIF.
              IF lr_schedext IS BOUND.
                lr_schedlin ?= lr_schedext->get_related_entity( 'BTSchedlinAll' ).
                IF lr_schedlin IS NOT BOUND.
                  lr_schedlin ?= lr_schedext->create_related_entity( 'BTSchedlinAll' ).
                ENDIF.
                IF lr_schedlin IS BOUND.
                  CLEAR:ls_schedlin.
                  ls_schedlin-quantity = ls_crmt0057-quantity.
                  lr_schedlin->if_bol_bo_property_access~set_properties( is_attributes = ls_schedlin ).
                ENDIF.
              ENDIF.
              typed_context->btitems->collection_wrapper->add( lr_item ).
            ENDIF.
            lr_access = lr_iterator->get_next( ).
          ENDWHILE.
        ENDIF.
    
      ENDMETHOD.

    效果:

  • 相关阅读:
    读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
    读书笔记_代码大全_第14章_组织直线型代码_第15章_使用条件语句
    读书笔记_代码大全_第31章_布局与风格
    读书笔记_代码大全_第16章_控制循环
    读书笔记_Effective_C++_条款五:了解C++默默编写并调用哪些函数
    python学习笔记(三)——字符串
    python学习笔记(六)——函数
    Windows下安装Django
    python小专题——time模块
    python学习笔记(四)——数据字典
  • 原文地址:https://www.cnblogs.com/sapSB/p/7770645.html
Copyright © 2011-2022 走看看