Introduction
Activities on REX 3.0 can be filtered based on the Days Profile by standard configuration. Days profile is defined and used as a filter for activities as upper and lower range for the start date of an activity from the present day. The upper range is equal to the Present Day + No of Days in Future the activity start date should fall for it to qualify to flow to REX. Similarly the lower range is equal to the Present Day + No of Days in past the activity date should fall.
All the activities within the upper and lower range will flow to Mobile device given the activity should have the Sales Representative (Syncing from the
Device) as Employee Responsible.
We faced the challenge to implement the REX 3.0 filters as we were required filter the visits based on count for each customer, i.e., a fixed number of future as well as past activities of an account should flow to REX.
We will try to give the technical implementation in the document.
Technical Flow Description
- The parameter ET_ACTIVITY_GUIDS of the internal FM ‘/MAC/RSFM_GET_USR_ACT_LIST’ of BAPI /MAC/RSFM_GET_USR_ACTIVITIES is updated with all the activity GUIDs of the customer.
- The enhancement spot lr_badi_activity->/mac/rs_badi_act_get_list_bef of FM of /MAC/RSFM_GET_ACT_LIST is implemented (ZBADI_IMPL_ACT)to update the GUIDs.
- The implementation class ZBADI_IMPL_ACT is created and made required changes in the method /MAC/RS_BADI_IF_ACT~/MAC/RS_BADI_ACT_GET_LIST_BEF.
ABAP Development
The below logic is included in the method /MAC/RS_BADI_IF_ACT~ /MAC/RS_BADI_ACT_GET_LIST_BEF:
- The selection criteria to fetch the activity GUIDs are as :
- Transaction type : All DEX REX transaction type( FM : /MAC/RSFM_GET_SRV_CUSTOMIZING, Parameter ET_ACT_DOWN_PARAM)Partner function: ‘00000009’ (Activity Partner).
- Partner: the entire customer for whom the SR is employee responsible (FM /MAC/RSFM_GET_BP_LIST, Parameter ET_ACCOUNT_ID).
- Date: Valid from, valid to from REX date profile.
- Rejected (I1032), cancelled (E0007), finished (I1008), closed (E0009) Activities are deleted from the list.
- Max no of past and future activities for each customer from the customization table ZACT_CNT is fetched to filter the activities based on start date of the activity.
- All follow up activities of the final activity list are fetched and appended with the same list.
The standard REX code in the FM is skipped by setting value CV_SKIP = ‘X’.
Custom Table structure ZACT_CNT
Field |
Data type |
Width |
Dec |
Description |
MANDT |
CLNT |
3 |
0 |
Client |
COUNT_PAST_ACT |
NUMC |
4 |
0 |
No of objects |
COUNT_FUTURE_ACT |
NUMC |
4 |
0 |
No of objects |
Sample code:
METHOD /mac/rs_badi_if_act~/mac/rs_badi_act_get_list_bef.
CONSTANTS:lc_eq(2) TYPE c VALUE 'EQ',
lc_i TYPE c VALUE 'I',
lc_object_type TYPE name_komp VALUE 'OBJECT_TYPE',
lc_process_type TYPE name_komp VALUE 'PROCESS_TYPE',
lc_category TYPE name_komp VALUE 'CATEGORY',
lc_partner_fct TYPE name_komp VALUE 'PARTNER_FCT',
lc_valid_from TYPE name_komp VALUE 'VALID_FROM',
lc_valid_to TYPE name_komp VALUE 'VALID_TO',
lc_bu_partner TYPE name_komp VALUE 'BU_PARTNER',
lc_bus2000110 TYPE tvarv_val VALUE 'BUS2000110',
lc_orderadm_h TYPE crmt_object_name VALUE 'ORDERADM_H',
lc_activity_h TYPE crmt_object_name VALUE 'ACTIVITY_H',
lc_appointment TYPE crmt_object_name VALUE 'APPOINTMENT',
lc_partner TYPE crmt_object_name VALUE 'PARTNER',
lc_status TYPE crmt_object_name VALUE 'STATUS',
lc_rejected TYPE crm_j_status VALUE 'I1032',
lc_closed TYPE crm_j_status VALUE 'E0009',
lc_cancelled TYPE crm_j_status VALUE 'E0007',
lc_finished TYPE crm_j_status VALUE 'I1008',
lc_docflow TYPE crmt_object_name VALUE 'DOC_FLOW'.
FIELD-SYMBOLS: <activity_tab> TYPE ANY TABLE.
DATA: lv_start_date TYPE sy-datum,
lv_end_date TYPE sy-datum,
lv_guid TYPE guid_32, "#EC NEEDED
lv_days_ahead TYPE /mac/rsde_no_days,
lv_days_back TYPE /mac/rsde_no_days,
lv_subrc TYPE sysubrc,
lv_index TYPE sy-index,
lv_past_no TYPE zno_of_objects,
lv_future_no TYPE zno_of_objects.
DATA: lr_1o_search TYPE REF TO cl_crm_q1o_search.
DATA: i_selection_param TYPE genilt_selection_parameter_tab,
i_guids TYPE crmt_object_guid_tab,
i_doc_flow TYPE crmt_doc_flow_wrkt,
i_return TYPE bapiret2_t,
i_return_val TYPE bapiret2_t,
i_act_data TYPE REF TO data,
i_tran_type_down TYPE /mac/rst_act_down_param,
i_device_transactions TYPE /mac/rst_device_trans,
i_account_id TYPE /mac/rst_bp_id,
i_column_value TYPE TABLE OF zcolumnvalue,
i_act_guids TYPE crmt_object_guid_tab,
i_requested_objects TYPE crmt_object_name_tab,
i_orderadm_h TYPE crmt_orderadm_h_wrkt,
i_activity_h TYPE crmt_activity_h_wrkt,
i_appointment TYPE crmt_appointment_wrkt,
i_partner TYPE crmt_partner_external_wrkt,
i_status TYPE crmt_status_wrkt.
DATA: wa_selection_param TYPE genilt_selection_parameter,
wa_act_tab TYPE crmst_query_r_act_btil,
wa_tran_type_down TYPE /mac/rss_act_down_param,
wa_account_id TYPE /mac/rss_bp_id,
wa_sales_org TYPE /mac/rss_crm_erp_sales_org,
wa_guid TYPE guid_32,
wa_act_guids TYPE crmt_object_guid,
wa_doc_flow TYPE crmt_doc_flow_wrk,
wa_requested_objects TYPE crmt_object_name,
wa_orderadm_h TYPE crmt_orderadm_h_wrk,
wa_activity_h TYPE crmt_activity_h_wrk,
wa_appointment TYPE crmt_appointment_wrk,
wa_partner TYPE crmt_partner_external_wrk,
wa_status TYPE crmt_status_wrk,
wa_no_act TYPE zact_cnt.
DATA: wa_activities TYPE crmst_query_r_act_btil,
i_activities TYPE crmt_query_r_act_btil,
i_all_activities TYPE crmt_query_r_act_btil,
lv_result_size TYPE i,
lv_delete_from_index TYPE i.
"Read mobile relevant customization - Activity Type, Partner Function, Days Back and Days Ahead
CALL FUNCTION '/MAC/RSFM_GET_SRV_CUSTOMIZING'
EXPORTING
iv_act_flag = 'X'
IMPORTING
et_act_down_param = i_tran_type_down.
CALL FUNCTION '/MAC/RSFM_GET_CLNT_CUSTOMIZING'
IMPORTING
et_device_transactions = i_device_transactions.
CALL FUNCTION '/MAC/RSFM_USER_ORG_UNIT'
EXPORTING
iv_user_id = sy-uname
IMPORTING
es_sales_org = wa_sales_org.
LOOP AT i_tran_type_down INTO wa_tran_type_down.
lv_index = sy-tabix.
READ TABLE i_column_value WITH KEY table_line = wa_tran_type_down-process_type TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
DELETE i_tran_type_down FROM lv_index.
ENDIF.
ENDLOOP.
LOOP AT i_tran_type_down INTO wa_tran_type_down.
" Define Transaction Type Filter from Customization
IF wa_tran_type_down-process_type IS NOT INITIAL.
READ TABLE i_device_transactions WITH KEY process_type = wa_tran_type_down-process_type
device_trans_key = '0001' TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_process_type.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = wa_tran_type_down-process_type.
APPEND wa_selection_param TO i_selection_param.
" Define category Filter from Customization
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_category.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = wa_tran_type_down-act_category.
APPEND wa_selection_param TO i_selection_param.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR wa_no_act.
SELECT SINGLE count_past_act
count_future_act
FROM zact_cnt
INTO CORRESPONDING FIELDS OF wa_no_act.
" Define Business Object Category Filter -Fetch Activities & Task
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_object_type.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = lc_bus2000110.
APPEND wa_selection_param TO i_selection_param.
"Partner Function for activity partner
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_partner_fct.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = '00000009'.
APPEND wa_selection_param TO i_selection_param.
" Get accounts for sy-user
CALL FUNCTION '/MAC/RSFM_GET_BP_LIST'
IMPORTING
et_account_id = i_account_id.
IF i_account_id IS NOT INITIAL.
LOOP AT i_account_id INTO wa_account_id WHERE partner_id IS NOT INITIAL.
DELETE i_selection_param WHERE attr_name EQ lc_bu_partner
OR attr_name EQ lc_valid_from
OR attr_name EQ lc_valid_to.
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_bu_partner.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = wa_account_id-partner_id.
APPEND wa_selection_param TO i_selection_param.
***********************Past Orders****************************
"Valid From Date
lv_days_back = wa_tran_type_down-days_behind.
IF lv_days_back IS INITIAL.
lv_start_date = sy-datum.
ELSE.
lv_start_date = sy-datum - lv_days_back. "Deduct the days back to get the valid from date
ENDIF.
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_valid_from.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = lv_start_date.
APPEND wa_selection_param TO i_selection_param.
"Valid To Date
CLEAR wa_selection_param.
CLEAR lv_end_date.
lv_end_date = sy-datum - 1.
wa_selection_param-attr_name = lc_valid_to.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = lv_end_date.
APPEND wa_selection_param TO i_selection_param.
"Set the Selection Parameters to Activity Object Search
CREATE OBJECT lr_1o_search.
CALL METHOD lr_1o_search->set_selection_parameters
EXPORTING
iv_obj_il = 'BTQACT'
it_selection_parameters = i_selection_param
IMPORTING
et_return = i_return
EXCEPTIONS
partner_fct_error = 1
object_type_not_found = 2
multi_value_not_supported = 3
OTHERS = 4.
lv_subrc = sy-subrc.
IF lv_subrc <> 0.
RETURN.
ENDIF.
CREATE DATA i_act_data TYPE TABLE OF crmst_query_r_act_btil.
ASSIGN i_act_data->* TO <activity_tab>.
"Run the Activity query
CALL METHOD lr_1o_search->get_result_values
EXPORTING
iv_max_hits = '999999999'
IMPORTING
et_results = i_activities
et_return = i_return.
IF sy-subrc <> 0.
APPEND LINES OF i_return TO i_return_val.
RETURN.
ELSEIF i_activities[] IS NOT INITIAL.
DELETE i_activities WHERE status_system EQ lc_rejected OR status EQ lc_closed OR status_system EQ lc_finished or status EQ lc_cancelled.
DESCRIBE TABLE i_activities LINES lv_result_size.
IF lv_result_size > wa_no_act-count_past_act.
lv_delete_from_index = wa_no_act-count_past_act + 1.
SORT i_activities BY from DESCENDING from_time DESCENDING.
DELETE i_activities FROM lv_delete_from_index.
ENDIF.
APPEND LINES OF i_activities TO i_all_activities.
REFRESH i_activities.
ENDIF.
***********************Future Orders****************************
DELETE i_selection_param WHERE attr_name EQ lc_valid_from OR attr_name EQ lc_valid_to.
"Valid From Date
CLEAR wa_selection_param.
lv_start_date = sy-datum.
wa_selection_param-attr_name = lc_valid_from.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = lv_start_date.
APPEND wa_selection_param TO i_selection_param.
"Valid To Date
lv_days_ahead = wa_tran_type_down-days_ahead.
IF lv_days_ahead IS INITIAL.
lv_end_date = sy-datum.
ELSE.
lv_end_date = sy-datum + lv_days_ahead. "Add the days ahead to get the valid to date
ENDIF.
CLEAR wa_selection_param.
wa_selection_param-attr_name = lc_valid_to.
wa_selection_param-sign = lc_i.
wa_selection_param-option = lc_eq.
wa_selection_param-low = lv_end_date.
APPEND wa_selection_param TO i_selection_param.
"Set the Selection Parameters to Activity Object Search
CREATE OBJECT lr_1o_search.
CALL METHOD lr_1o_search->set_selection_parameters
EXPORTING
iv_obj_il = 'BTQACT'
it_selection_parameters = i_selection_param
IMPORTING
et_return = i_return
EXCEPTIONS
partner_fct_error = 1
object_type_not_found = 2
multi_value_not_supported = 3
OTHERS = 4.
lv_subrc = sy-subrc.
IF lv_subrc <> 0.
RETURN.
ENDIF.
CREATE DATA i_act_data TYPE TABLE OF crmst_query_r_act_btil.
ASSIGN i_act_data->* TO <activity_tab>.
"Run the Activity query
CALL METHOD lr_1o_search->get_result_values
EXPORTING
iv_max_hits = '999999999'
IMPORTING
et_results = i_activities
et_return = i_return.
IF sy-subrc <> 0.
APPEND LINES OF i_return TO i_return_val.
RETURN.
ELSEIF i_activities[] IS NOT INITIAL.
DELETE i_activities WHERE status_system EQ lc_rejected OR status EQ lc_closed OR status_system EQ lc_finished or status EQ lc_cancelled.
DESCRIBE TABLE i_activities LINES lv_result_size.
IF lv_result_size > wa_no_act-count_future_act.
lv_delete_from_index = wa_no_act-count_future_act + 1.
SORT i_activities BY from ASCENDING from_time ASCENDING.
DELETE i_activities FROM lv_delete_from_index.
ENDIF.
APPEND LINES OF i_activities TO i_all_activities.
REFRESH i_activities.
ENDIF.
ENDLOOP. " Customer Loop
ENDIF.
IF i_all_activities IS NOT INITIAL.
LOOP AT i_all_activities INTO wa_activities.
CLEAR lv_guid.
lv_guid = wa_activities-guid.
INSERT wa_activities-guid INTO TABLE i_guids.
INSERT lv_guid INTO TABLE ct_activity_guids.
ENDLOOP.
ENDIF.
" Fetching followup's of activities.
MOVE lc_docflow TO wa_requested_objects.
INSERT wa_requested_objects INTO TABLE i_requested_objects.
CALL FUNCTION 'CRM_ORDER_READ'
EXPORTING
it_header_guid = i_guids
it_requested_objects = i_requested_objects
IMPORTING
et_doc_flow = i_doc_flow[]
EXCEPTIONS
document_not_found = 1
error_occurred = 2
document_locked = 3
no_change_authority = 4
no_display_authority = 5
no_change_allowed = 6
OTHERS = 7.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
REFRESH:i_guids.
IF i_doc_flow IS NOT INITIAL.
LOOP AT i_doc_flow INTO wa_doc_flow.
CLEAR:lv_guid.
lv_guid = wa_doc_flow-objkey_b.
INSERT lv_guid INTO TABLE ct_activity_guids.
ENDLOOP.
ENDIF.
SORT ct_activity_guids.
DELETE ADJACENT DUPLICATES FROM ct_activity_guids.
cv_skip = 'X'.
ENDIF.
ENDMETHOD.
********Above documents was co authored by my fellow colleague Karthi Dhayalan. *********