Accessing IBase Hierarchy
In this blog I will share Installed Base (IBase) concept briefly and the FM’s commonly used.
Installed base management enables the representation of objects installed at a customer’s site or an organization (such as devices, machines, and software) for which a service is offered. In business processes, an installed base can be referred to as a general unit or as an individual element (component).
The Purpose of Installed bases are to structure and represent installed objects. Each object belongs to an object family. An installed base consists of general data, a structure and components. One can install as many components as they require for each installed base and you can create subordinate components for each of these components. In this way, you create an installed base structure with as many nodes as you want. Partners are assigned to installed objects.
The Function group: IB_CRM_API gives the CRM API’s for IBase.
1) CRM_IBASE_GET_DETAIL: Gives the IBase details
2) CRM_IBASE_GET_PARTNER: Gives the Partner information of the IBase.
3) CRM_IBASE_COMP_GET_DETAIL: Gives the Component details.
4) CRM_IBASE_COMP_GET_PARTNER: Gives the Partner information of the Component.
5) CALL FUNCTION ‘CRM_IBASE_COMP_GET_HIERARCHY’
EXPORTING
i_comp = ls_comp
i_level_down_all = ‘X’
i_level_up_all = ‘X’
IMPORTING
e_struc_ibase_tab = lt_fields
EXCEPTIONS
not_specified = 1
doesnt_exist = 2
no_authority = 3
OTHERS = 4.
For a Component pass the import parameter i_level_down_all = ‘X’ to get all the Subcomponents(Child). For a Subcomponent pass the import parameter i_level_up_all = ‘X’ to get its component(Parent).
Alternatively, using BOL Programming above details can be fetched.
data: lr_ib_entity TYPE REF TO cl_crm_bol_entity,
lv_partner_ib TYPE string,
lv_partner_num TYPE string,
lv_part_fct TYPE string,
lr_bol_col TYPE REF TO if_bol_entity_col,
lr_comp_col TYPE REF TO if_bol_entity_col,
lr_subcomp_col TYPE REF TO if_bol_entity_col,
lv_partner_guid TYPE crmt_object_guid,
lr_entity TYPE REF TO cl_crm_bol_entity,
lr_comp_entity TYPE REF TO cl_crm_bol_entity,
lr_subcomp_entity TYPE REF TO cl_crm_bol_entity.
For instance lr_ib_entity is at IBHeader level, has IBase details.
A)We will retrieve Business Partner details for the IBase from the below code.
*** HeaderPartnerSet
lr_entity = lr_ib_entity->get_related_entity( iv_relation_name = ‘HeaderPartnerSet’ ).
*** IBPartnerAll
check lr_entity is bound.
lr_bol_col = lr_entity->get_related_entities( iv_relation_name = ‘IBPartnerAll’ ).
CHECK lr_bol_col IS BOUND.
lr_entity ?= lr_bol_col->get_first( ).
check lr_entity is bound.
lv_partner_ib = lr_entity->get_property_as_string( ‘PARTNER_NUMBER’ ).
lr_entity = lr_entity->get_related_entity( iv_relation_name = ‘BusinessPartner’ ).
check lr_entity is bound.
lv_partner_guid = lr_entity->get_property_as_string( ‘BP_GUID’ ).
B)Get all the Components of a given ibase and Partner details.
**component collection
lr_comp_col = lr_ib_entity->get_related_entities( iv_relation_name = cl_crm_ibase_il_constant=>firstlevelrelation ).
if lr_comp_col is bound.
lr_comp_entity ?= lr_comp_col->get_first( ).
** lr_comp_entity has component details.
**** iterate through all the Components.
while lr_comp_entity is bound.
***** ComponentPartnerSet
lr_entity = lr_comp_entity->get_related_entity( iv_relation_name = ‘ComponentPartnerSet’ ).
**** IBPartnerAll
if lr_entity is not bound.
exit.
endif.
lr_bol_col = lr_entity->get_related_entities( iv_relation_name = ‘IBPartnerAll’ ).
CHECK lr_bol_col IS BOUND.
lr_entity ?= lr_bol_col->get_first( ).
***** iterate through all the Partners in a Component.
while lr_entity is bound.
lv_partner_num = lr_entity->get_property_as_string( ‘PARTNER_NUMBER’ ).
lv_part_fct = lr_entity->get_property_as_string( ‘PARTNER_FCT’ ).
lr_entity = lr_entity->get_related_entity( iv_relation_name = ‘BusinessPartner’ ).
check lr_entity is bound.
lv_partner_guid = lr_entity->get_property_as_string( ‘BP_GUID’ ).
lr_entity ?= lr_bol_col->get_next( ).
Endwhile.” iterate through all the Partners in a Component end.
lr_comp_entity ?= lr_comp_col->get_next( ).
Endwhile.” iterate through all the Components end.
Endif.
C)Get all the Subcomponents of a given Component and Partner details.
**Subcomponent collection
lr_subcomp_col = lr_subcomp_entity->get_related_entities( iv_relation_name = cl_crm_ibase_il_constant=> sublevelrelation ).
if lr_subcomp_col is bound.
lr_subcomp_entity ?= lr_subcomp_col->get_first( ).
** lr_subcomp_entity has component details.
**** iterate through all the Subcomponents.
while lr_subcomp_entity is bound.
***** ComponentPartnerSet
lr_entity = lr_subcomp_entity->get_related_entity( iv_relation_name = ‘ComponentPartnerSet’ ).
**** IBPartnerAll
if lr_entity is not bound.
exit.
endif.
lr_bol_col = lr_entity->get_related_entities( iv_relation_name = ‘IBPartnerAll’ ).
CHECK lr_bol_col IS BOUND.
lr_entity ?= lr_bol_col->get_first( ).
***** iterate through all the Partners in a Subcomponent.
while lr_entity is bound.
lv_partner_num = lr_entity->get_property_as_string( ‘PARTNER_NUMBER’ ).
lv_part_fct = lr_entity->get_property_as_string( ‘PARTNER_FCT’ ).
lr_entity = lr_entity->get_related_entity( iv_relation_name = ‘BusinessPartner’ ).
check lr_entity is bound.
lv_partner_guid = lr_entity->get_property_as_string( ‘BP_GUID’ ).
lr_entity ?= lr_bol_col->get_next( ).
Endwhile.” iterate through all the Partners in a Subcomponent end.
lr_subcomp_entity ?= lr_subcomp_col->get_next( ).
Endwhile.” iterate through all the Subcomponents end.
Endif.
Thanks
Ram Vellanki
Hi Ram,
Thanks for the share. Just a quick question. Pls let me know if I've to make changes to IBASEs in the middleware or through BADIs, would it be advisable to use BOL layer or there are some specific FMs available to do so. I would most likely want to change warranties, associated partners or determine service orders associated with the IBASE. Would it be advisable to use BOL programming for use in such scenarios.
Thanks
Ashish
Hi Ashish,
There are Many FMs to access IBASE. Look in the Function Group: IB_CRM_API for the relevant one. First consider the option of using BOL programming.
Thanks
Ram
Hello Ram,
I am getting a dump in scenarios A & B because lr_ib_entity is pointing to NULL object reference.
A) lr_entity = lr_ib_entity->get_related_entity( iv_relation_name = 'HeaderPartnerSet' ). B) **component collection lr_comp_col = lr_ib_entity->get_related_entities( iv_relation_name = cl_crm_ibase_il_constant=>firstlevelrelation ).
I tried to instantiate or set the reference to an object but failed. Can you please give me solution? Thanks
Hi Ricky,
I gave a code snippet for understanding.. Ideally lr_ib_entity will point to the root node and check if it is bound.
Thanks
Ram
Hi Ram,
lr_ib_entity is NOT bound
Can you please give me the code snippet to point lr_ib_entity to point to root node IBHeader?
Thanks
Hi can u pls tell me how to do this in ECC system to get and update IBASE, where the above FM are not there .