使用 ADMIN 快速应用程序工具生成 BSP 应用

作者:郑德鼎 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

#

在项目中,如果需要在CRM中开发一个BSP应用,比如需要开发一个Web查询报表,通常需要搭建模型和创建组件,过程比较繁琐。以下介绍一种快捷方式,可以满足需求,且能批量生产,让没有SSF经验的小伙伴也可以快速上手。

**2** 、需求实现:

2.1、创建数据表,作为BSP应用的数据库模型和用户界面模型,此表包含查询条件和查询结果的所有字段

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

2.2、启动CRM Webclient,进入admin角色,按工具->管理快速应用程序路径找到应用程序生成界面,并按向导生成BSP组件。

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

选择从数据库表创建:

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

可以在用户界面模型设置搜索字段、下拉框等技术参数

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

生成完,在BSP工作台可以看到向导生成的组件

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 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_node
eo_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_pata
iv_max_hits = lv_max_hits

TABLES

et_table = lt_ztest_rep.

“此函数为将结果集set到UI

CALL FUNCTION 'ZFM_CSS_RESULT_NODE_SET'

EXPORTING

ir_result_node = lr_result_node

iv_table_id = 'ZTEST01'

• IV_KEY_FIELD =

IMPORTING

ev_size = lv_size

TABLES

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_size
iv_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.

FIELD-SYMBOLS

<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_properties

EXPORTING

is_attributes = <ls_arrt>.
CALL METHOD lr_result->if_bol_entity_col~add

EXPORTING

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.

2.4 将BSP应用挂到UI

按以下路径定义组件

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

定义内向插件:

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

按以下路径定义逻辑连接、工作中心等

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

分配工作中心至导航栏参数文件

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图

将工作中心分配到业务角色

使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
使用 ADMIN 快速应用程序工具生成 BSP 应用 - 封面图
郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「使用ADMIN快速应用程序工具生成BSP应用.md」整理生成,仅用于内部技术分享与学习交流。