#
在项目中,如果需要在CRM中开发一个BSP应用,比如需要开发一个Web查询报表,通常需要搭建模型和创建组件,过程比较繁琐。以下介绍一种快捷方式,可以满足需求,且能批量生产,让没有SSF经验的小伙伴也可以快速上手。
**2** 、需求实现:
2.1、创建数据表,作为BSP应用的数据库模型和用户界面模型,此表包含查询条件和查询结果的所有字段
2.2、启动CRM Webclient,进入admin角色,按工具->管理快速应用程序路径找到应用程序生成界面,并按向导生成BSP组件。
选择从数据库表创建:
可以在用户界面模型设置搜索字段、下拉框等技术参数
生成完,在BSP工作台可以看到向导生成的组件
在模型浏览器里也可以看到自动生成的根对象、查询对象和查询结果对象等
2.3 在查询视图实施类重写ON_SEARCH方法,获取查询条件,并将按查询条件搜索的结果set到结果对象里
METHOD eh_onsearch.*CALL METHOD SUPER->EH_ONSEARCH
** EXPORTING
** htmlb_event =
** htmlb_event_ex =
• .
DATA:lr_query_service TYPE REF TO cl_crm_bol_dquery_service,
lr_query TYPE REF TOif_bol_bo_col,
lr_msg_srv TYPE REF TOcl_bsp_wd_message_service,
lr_query_node TYPE REF TOcl_bsp_wd_context_node,
lr_result_node TYPE REF TOcl_bsp_wd_context_node,
lv_msg_cont TYPE REF TOcl_crm_genil_global_mess_cont,
lv_max_hits TYPE int4,
lv_size TYPE int4,
lv_string TYPE string,
lv_title TYPE string,
lv_ssize TYPE string.
DATA : lv_iterator TYPE REF TOif_bol_bo_col_iterator,
lv_param TYPE REF TOif_bol_bo_property_access,
ls_selection TYPE genilt_selection_parameter.
DATA : lr_param_col TYPE REF TOif_bol_bo_col.
DATA: lt_pata TYPE genilt_selection_parameter_tab.DATA ls_pata LIKE LINE OF lt_pata.
DATA: lt_ztest_rep TYPE TABLE OF zssf_r013.• get context nodes
get_context_nodes(
IMPORTING
eo_query = lr_query_nodeeo_result = lr_result_node ).• get query service
lr_query_service ?=lr_query_node->collection_wrapper->get_current( ).• more entries than in MAX_HITS
lr_query_service->get_property_as_value( EXPORTING iv_attr_name ='MAX_HITS'IMPORTINGev_result = lv_max_hits ).lr_param_col = lr_query_service->get_selection_params( ).lv_iterator = lr_param_col->get_iterator( ).lv_param =lv_iterator->get_first( ).WHILE lv_param IS BOUND.
• Get the attributes out
lv_param->get_properties( IMPORTING es_attributes = ls_selection ).IF ls_selection-low IS NOT INITIAL.APPEND ls_selection TO lt_pata.ENDIF.• Get all the entities from the collection
lv_param = lv_iterator->get_next( ).ENDWHILE.lr_query_service->check_selection_params( EXPORTINGiv_filter_empty_params =abap_true
iv_filter_unexpected_params = abap_false
CHANGING ct_params = lt_pata ).lr_query_service->adjust_selection_params( IMPORTINGet_params_to_be_adjusted =lt_pata
CHANGING ct_params = lt_pata ).lr_msg_srv ?=me->view_manager->get_message_service( ).“此函数是具体的取数逻辑,不同需求,写不同的逻辑即可
CALL FUNCTION 'ZSSF_TEST01'EXPORTING
it_parameter = lt_pataiv_max_hits = lv_max_hitsTABLES
et_table = lt_ztest_rep.“此函数为将结果集set到UI
CALL FUNCTION 'ZFM_CSS_RESULT_NODE_SET'EXPORTING
ir_result_node = lr_result_nodeiv_table_id = 'ZTEST01'
• IV_KEY_FIELD =
IMPORTING
ev_size = lv_sizeTABLES
it_tab = lt_ztest_rep.• finally set the result view title
lv_title
=cl_wcf_bsp_dsp_title=>if_wcf_bsp_dsp_title~get_search_result_list_title(iv_size = lv_sizeiv_max_hits =lv_max_hits ).*
me->gr_view_set->set_result_list_title( lv_title ).
ENDMETHOD.以下函数实现结果集set到结果对象
FUNCTION ZFM_CSS_RESULT_NODE_SET.*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(IR_RESULT_NODE) TYPE REFTO CL_BSP_WD_CONTEXT_NODE
*" REFERENCE(IV_TABLE_ID) TYPEAXT_TABLE_ID
*" EXPORTING
*" VALUE(EV_SIZE) TYPE I
*" TABLES
*" IT_TAB TYPE STANDARD TABLE OPTIONAL
*"----------------------------------------------------------------------
• Global data declarations
DATA: lv_bol_core TYPE REF TO cl_crm_bol_core.DATA: lt_params TYPE crmt_name_value_pair_tab,ls_params TYPE crmt_name_value_pair.
DATA: lv_axt_factory TYPE REF TO cl_crm_bol_entity_factory.DATA: lr_entity TYPE REF TO cl_crm_bol_entity,lr_result TYPE REF TO cl_crm_bol_entity_col.
DATA: lv_guid TYPEcrmt_object_guid,lv_varkey TYPE rstable-varkey.
• DATA: lo_transaction TYPE REF TOif_bol_transaction_context.
DATA: lr_axt_md TYPE REF TO cl_axt_tables_metadata.DATA: lt_objects_il TYPE axtt_objects_il,ls_objects_il TYPE axts_objects_il,
lt_model_il TYPE axtt_model_il.
DATA: ls_work TYPE REF TO data.<ls_data> TYPE any,
<ls_arrt> TYPE any,
<lv_value> TYPE any.
DATA: lo_handler TYPE REFTO cl_axt_ca_hdlr_abstr,lv_gen_object_guid TYPE crmt_genil_object_guid,
lv_gen_object_id TYPEcrmt_genil_object_id.
CLEAR ev_size.
ir_result_node->clear_collection( ).
lr_axt_md = cl_axt_tables_metadata=>get_instance( iv_table_id ).lr_axt_md->get_bol_model( IMPORTING et_objects_il = lt_objects_ilet_model_il =lt_model_il ).
READ TABLE lt_objects_il INTO ls_objects_il WITH KEY object_kind = 'A'.CHECK sy-subrc = 0.
lv_bol_core = cl_crm_bol_core=>get_instance( ).• lv_bol_core->reset( ).
lv_bol_core->start_up( 'ALL' ).
CREATE DATA ls_work TYPE (ls_objects_il-create_struct).
ASSIGN ls_work->* TO <ls_arrt>.
• 2. Get factory for business object
lv_axt_factory = lv_bol_core->get_entity_factory(ls_objects_il-root_object ).CHECK lv_axt_factory IS BOUND.
lo_handler = cl_axt_ca_hdlr_factory=>get_obj_handler( iv_object_name=ls_objects_il-root_object ).
lo_handler->initialize( ).
CREATE OBJECT lr_result.• 3. Create root entity
LOOP AT it_tab ASSIGNING <ls_data>.REFRESH lt_params.
CLEAR lr_entity.
CLEAR lv_guid.
ls_params-name = 'GUID'.• ASSIGN COMPONENT ls_params-name OFSTRUCTURE <ls_data> TO <lv_value>.
• IF sy-subrc = 0.
• IF <lv_value> IS NOT INITIAL.
* lv_guid = <lv_value>.• ENDIF.
• ENDIF.
*
• IF lv_guid IS INITIAL.
CALL FUNCTION 'CRM_GUID_CREATE'IMPORTING
ev_guid = lv_guid.• ENDIF.
ls_params-value = lv_guid.lv_varkey = lv_guid.APPEND ls_params TO lt_params.lr_entity = lv_axt_factory->create( lt_params ).CHECK lr_entity IS BOUND.
MOVE-CORRESPONDING <ls_data> TO <ls_arrt>.
CALL METHOD lr_entity->set_propertiesEXPORTING
is_attributes = <ls_arrt>.CALL METHOD lr_result->if_bol_entity_col~addEXPORTING
iv_entity = lr_entity.* lo_transaction =lr_entity->get_transaction( ).• lo_transaction->rollback( ).
**** 解锁bol
CALL FUNCTION 'DEQUEUE_E_TABLE'EXPORTING
mode_rstable = 'E'
tabname = iv_table_id
varkey = lv_varkey.ENDLOOP.ev_size = lr_result->if_bol_bo_col~size( ).CHECK ev_size > 0\.
ir_result_node->set_collection( lr_result ).
ENDFUNCTION.按以下路径定义组件
定义内向插件:
按以下路径定义逻辑连接、工作中心等
分配工作中心至导航栏参数文件
将工作中心分配到业务角色