REX 3.0:Enabling Count Based Filter for Activities
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 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.
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:
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.
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.
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.