In this post I would like to share how to create RRI to Portfolio and Project Management WebDynpro Applications from BW reports. This solution is based on creation a customer target with use of BADI RS_BBS_BADI.
In this post there are 3 custom targets:
◉ Go to item master data details
◉ Go to item financial planning
◉ Go to cProjects master data details
1. Create implementation of RS_BBS_BADI in SE19.
In this post there are 3 custom targets:
◉ Go to item master data details
◉ Go to item financial planning
◉ Go to cProjects master data details
Step-by-step
1. Create implementation of RS_BBS_BADI in SE19.
2. All logic is realized in ABAP code below.
CLASS ZCL_PPME001_BBS DEFINITION
public
final
create public .
public section.
interfaces IF_EX_RS_BBS_BADI .
protected section.
private section.
ENDCLASS.
CLASS ZCL_PPME001_BBS IMPLEMENTATION.
METHOD if_ex_rs_bbs_badi~get_types.
DATA: ls_handler TYPE rsbbs_s_badi_handler.
"Technical name of application
ls_handler-appl = 'ZPPM'.
"ABAP class with interface IF_RS_BBS_BADI_HANDLER
create object ls_handler-handler type zcl_ppme001_bbs_ppm.
INSERT ls_handler INTO TABLE c_th_handler.
"In addition you can create other target with link to realization class
ENDMETHOD.
ENDCLASS.
class ZCL_PPME001_BBS_PPM definition
public
final
create public .
public section.
interfaces IF_RS_BBS_BADI_HANDLER .
class-methods CLASS_CONSTRUCTOR .
protected section.
private section.
ENDCLASS.
CLASS ZCL_PPME001_BBS_PPM IMPLEMENTATION.
method CLASS_CONSTRUCTOR.
"This name will be visible as a target in RSBBS
if_rs_bbs_badi_handler~n_text = 'RRI in SAP PPM'.
if_rs_bbs_badi_handler~n_url_call = rs_c_true. "use URL
if_rs_bbs_badi_handler~n_sapgui_call = rs_c_false.
endmethod.
METHOD if_rs_bbs_badi_handler~get_targets.
TYPE-POOLS: icon.
DATA: ls_f4_list TYPE rsbbs_s_f4_list.
"Values visible as RRI targets
CLEAR: ls_f4_list.
ls_f4_list-icon = icon_check.
ls_f4_list-objnm = 'ZPPM_ITEM_DETAILS'.
ls_f4_list-txtlg = 'Go to item details in PPM'.
APPEND ls_f4_list TO e_t_f4_list.
CLEAR: ls_f4_list.
ls_f4_list-icon = icon_check.
ls_f4_list-objnm = 'ZPPM_CPROJECTS_FPM'.
ls_f4_list-txtlg = 'Go to cProjects project in PPM'.
APPEND ls_f4_list TO e_t_f4_list.
CLEAR: ls_f4_list.
ls_f4_list-icon = icon_check.
ls_f4_list-objnm = 'ZPPM_FIN_PLANNING'.
ls_f4_list-txtlg = 'Go to financial planning in by item PPM'.
APPEND ls_f4_list TO e_t_f4_list.
ENDMETHOD.
method if_rs_bbs_badi_handler~call_url.
types: begin of ts_zppm_item_attr,
zppmidgu type /bic/oizppmidgu, "Item Detail
zppmbugu type /bic/oizppmbugu, "Item Bucket
zppmpfgu type /bic/oizppmpfgu, "Item Portfolio
end of ts_zppm_item_attr,
tt_zppm_item_attr type standard table of ts_zppm_item_attr
with non-unique key zppmidgu.
data: lt_item_attr type tt_zppm_item_attr,
ls_item_attr type ts_zppm_item_attr,
lv_object_guid1 type /bic/oizppmidgu,
lv_parent_guid1 type /bic/oizppmbugu,
lv_portfolio_guid1 type /bic/oizppmpfgu,
lv_ppm_mandt type c length 3.
data: l_sx_mapping type rsbbs_sx_mapping,
l_s_range type rrrangesid,
lv_and type string value '&',
lv_url type string, "+
lv_appl type string value 'sap/bc/webdynpro/sap/rpm_item_details?',
lv_appl_mode type string value 'appl_mode=2',
lv_appl_type type string value 'appl_type=RPM',
lv_portfolio_id type string value 'portfolio_id=',
lv_portfolio_guid type string value 'portfolio_guid=', "+
lv_parent_type type string value 'parent_type=RBH',
lv_parent_id type string value 'parent_id=',
lv_parent_guid type string value 'parent_guid=', "+
lv_object_type type string value 'object_type=RIH',
lv_object_id type string value 'object_id=',
lv_object_guid type string value 'object_guid=', "+
lv_ctx_aprent_type type string value 'ctx_parent_type=RPH',
lv_ctx_parent_guid type string value 'ctx_parent_guid=', "+
lv_main_portfolio_guid type string value 'main_portfolio_guid=00000000000000000000000000000000',
lv_portal_role type string value 'portal_role=RPM_PORT',
lv_edit_mode type string value 'edit_mode=2',
lv_view_temp type string value 'view_temp=',
lv_is_status_locked type string value 'is_status_locked=',
lv_sap_wd_configid type string value 'sap-wd-configid=RPM_ITEM_DETAILS_CFG',
lv_sap_accessibility type string value 'sap-accessibility=',
lv_sap_theme type string value 'sap-theme=sap_belize',
lv_sap_client type string value 'sap-client=',
lv_sap_ie type string value 'sap-ie=Edge'.
types: begin of ts_zppm_cguid_attr,
zppmcguid type /bic/oizppmcguid,
cpr_ext_id type /bi0/oicpr_ext_id,
zppmcobjt type /bic/oizppmcobjt,
zppmcproj type /bic/oizppmcproj,
end of ts_zppm_cguid_attr,
tt_zppm_cguid_attr type standard table of ts_zppm_cguid_attr
with non-unique key zppmcguid.
data: lt_cguid_attr type tt_zppm_cguid_attr,
ls_cguid_attr type ts_zppm_cguid_attr,
lt_sguid_attr type tt_zppm_cguid_attr,
ls_sguid_attr type ts_zppm_cguid_attr.
data: lv_cguid type /bic/oizppmcguid,
lv_sguid type /bic/oizppmsguid.
data: lv_url2 type string,
lv_appl2 type string value 'sap/bc/webdynpro/sap/cprojects_fpm?',
lv_objevent type string value 'obj_event=',
lv_dpo type string value 'DPO',
lv_sap_wd_configid2 type string value 'sap-wd-configid=CPROJECTS_FPM'.
data: lv_url3 type string,
lv_appl3 type string value 'sap/bc/webdynpro/rpm/fin_cap_planning?',
lv_sap_wd_configid3 type string value 'sap-wd-configid=%2fRPM%2fWDA_FIN_CAP_PLANNING_CFG'.
case i_onam.
when 'ZPPM_ITEM_DETAILS'.
"Read PPM server info from settings table
clear: lv_url, r_url.
select single low into lv_url from tvarvc
where name = 'ZPPM_SERVER_URL' and
type = 'P' and
numb = '0000'.
"Read PPM mandant from settings table
clear: lv_ppm_mandt.
select single low into lv_ppm_mandt from tvarvc
where name = 'ZPPM_CLIENT' and
type = 'P' and
numb = '0000'.
lv_sap_client = |{ lv_sap_client }{ lv_ppm_mandt }|.
"Select portfolio
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMPFGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_portfolio_guid1 = l_s_range-low.
lv_portfolio_guid = |{ lv_portfolio_guid }{ l_s_range-low }|.
endif.
endloop.
"Select bucket
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMBUGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_parent_guid1 = l_s_range-low.
lv_parent_guid = |{ lv_parent_guid }{ l_s_range-low }|.
endif.
endloop.
"Select item detail
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMIDGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_object_guid1 = l_s_range-low.
lv_object_guid = |{ lv_object_guid }{ l_s_range-low }|.
endif.
endloop.
"Item should be visible in bw report structure
if lv_object_guid1 is not initial.
"If bicket or portfolio are hiden, read them from master data of item detail
if lv_parent_guid1 is initial or lv_portfolio_guid1 is initial.
clear:ls_item_attr, lt_item_attr.
call method zcl_ppme001_read_cv_data=>get_item_attr "read from master data
exporting
iv_item_guid = lv_object_guid1
importing
et_item_attr = lt_item_attr.
read table lt_item_attr into ls_item_attr index 1.
lv_parent_guid = |{ lv_parent_guid }{ ls_item_attr-zppmbugu }|.
lv_portfolio_guid = |{ lv_portfolio_guid }{ ls_item_attr-zppmpfgu }|.
endif.
"Form final URL
lv_url = |{ lv_url }{ lv_appl }{ lv_appl_mode }|.
concatenate lv_url lv_appl_type lv_portfolio_id lv_portfolio_guid
lv_parent_type lv_parent_id lv_parent_guid
lv_object_type lv_object_id lv_object_guid
lv_portal_role lv_edit_mode lv_view_temp lv_is_status_locked
lv_sap_wd_configid lv_sap_accessibility lv_sap_theme lv_sap_client
lv_sap_ie
into lv_url
separated by lv_and.
r_url = lv_url.
endif.
when 'ZPPM_CPROJECTS_FPM'.
"Read PPR server info from settings table
clear: lv_url2, r_url.
select single low into lv_url2 from tvarvc
where name = 'ZPPM_SERVER_URL' and
type = 'P' and
numb = '0000'.
"Read PPM mandant from settings table
clear: lv_ppm_mandt.
select single low into lv_ppm_mandt from tvarvc
where name = 'ZPPM_CLIENT' and
type = 'P' and
numb = '0000'.
lv_sap_client = |{ lv_sap_client }{ lv_ppm_mandt }|.
"Select object
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMCGUID' and mdflag = 'X'.
read table l_sx_mapping-range into l_s_range index 1.
lv_cguid = l_s_range-low.
endloop.
"Select object (source)
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMSGUID' and mdflag = 'X'.
read table l_sx_mapping-range into l_s_range index 1.
lv_sguid = l_s_range-low.
endloop.
if lv_cguid is not initial.
clear: ls_cguid_attr, lt_cguid_attr.
"Find Project DPO
call method zcl_ppme001_read_cv_data=>get_cguid_attr
exporting
iv_cguid = lv_cguid
importing
et_cguid_attr = lt_cguid_attr.
read table lt_cguid_attr into ls_cguid_attr index 1.
"Form final URL
lv_url2 = |{ lv_url2 }{ lv_appl2 }|.
if ls_cguid_attr-zppmcobjt = 'DPO'.
lv_objevent = |{ lv_objevent }{ lv_dpo }{ lv_cguid }{ lv_cguid }{ lv_dpo }|.
else.
lv_objevent = |{ lv_objevent }{ lv_dpo }{ ls_cguid_attr-zppmcproj }{ ls_cguid_attr-zppmcproj }{ lv_dpo }|.
endif.
lv_url2 = |{ lv_url2 }{ lv_objevent }|.
concatenate lv_url2
lv_sap_client
lv_sap_theme
lv_sap_wd_configid2
lv_sap_accessibility
lv_sap_ie
into lv_url2 separated by lv_and.
r_url = lv_url2.
elseif lv_sguid is not initial.
clear: ls_sguid_attr, lt_sguid_attr.
call method zcl_ppme001_read_cv_data=>get_cguid_attr
exporting
iv_cguid = lv_sguid
importing
et_cguid_attr = lt_sguid_attr.
read table lt_sguid_attr into ls_sguid_attr index 1.
"Form final URL
lv_url2 = |{ lv_url2 }{ lv_appl2 }|.
if ls_sguid_attr-zppmcobjt = 'DPO'.
lv_objevent = |{ lv_objevent }{ lv_dpo }{ lv_sguid }{ lv_sguid }{ lv_dpo }|.
else.
lv_objevent = |{ lv_objevent }{ lv_dpo }{ ls_sguid_attr-zppmcproj }{ ls_sguid_attr-zppmcproj }{ lv_dpo }|.
endif.
lv_url2 = |{ lv_url2 }{ lv_objevent }|.
concatenate lv_url2
lv_sap_client
lv_sap_theme
lv_sap_wd_configid2
lv_sap_accessibility
lv_sap_ie
into lv_url2 separated by lv_and.
r_url = lv_url2.
endif.
when 'ZPPM_FIN_PLANNING'.
"Read PPM server from settings table
clear: lv_url3, r_url.
select single low into lv_url3 from tvarvc
where name = 'ZPPM_SERVER_URL' and
type = 'P' and
numb = '0000'.
"Read PPM mandant from settings table
clear: lv_ppm_mandt.
select single low into lv_ppm_mandt from tvarvc
where name = 'ZPPM_CLIENT' and
type = 'P' and
numb = '0000'.
lv_sap_client = |{ lv_sap_client }{ lv_ppm_mandt }|.
"Select portfolio
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMPFGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_portfolio_guid1 = l_s_range-low.
lv_portfolio_guid = |{ lv_portfolio_guid }{ l_s_range-low }|.
endif.
endloop.
"Select bucket
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMBUGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_parent_guid1 = l_s_range-low.
lv_parent_guid = |{ lv_parent_guid }{ l_s_range-low }|.
endif.
endloop.
"Select item detail
clear: l_sx_mapping, l_s_range.
loop at i_thx_mapping into l_sx_mapping
where fieldnm = 'ZPPMIDGU'.
read table l_sx_mapping-range into l_s_range index 1.
if l_s_range-low is not initial.
lv_object_guid1 = l_s_range-low.
lv_object_guid = |{ lv_object_guid }{ l_s_range-low }|.
endif.
endloop.
if lv_object_guid1 is not initial.
if lv_parent_guid1 is initial or lv_portfolio_guid1 is initial.
clear:ls_item_attr, lt_item_attr.
call method zcl_ppme001_read_cv_data=>get_item_attr
exporting
iv_item_guid = lv_object_guid1
importing
et_item_attr = lt_item_attr.
read table lt_item_attr into ls_item_attr index 1.
lv_parent_guid = |{ lv_parent_guid }{ ls_item_attr-zppmbugu }|.
lv_portfolio_guid = |{ lv_portfolio_guid }{ ls_item_attr-zppmpfgu }|.
endif.
"Form final URL
lv_url3 = |{ lv_url3 }{ lv_appl3 }{ lv_appl_mode }|.
concatenate lv_url3 lv_appl_type lv_portfolio_id lv_portfolio_guid
lv_parent_type lv_parent_id lv_parent_guid
lv_object_type lv_object_id lv_object_guid
lv_portal_role lv_edit_mode lv_view_temp lv_is_status_locked
lv_sap_wd_configid3 lv_sap_accessibility lv_sap_theme lv_sap_client
lv_sap_ie
into lv_url3
separated by lv_and.
r_url = lv_url3.
endif.
endcase.
endmethod.
ENDCLASS.
3. Settings in RSBBS based on Infoprovider or query is very simple.
No comments:
Post a Comment