You are on page 1of 15

Activate the Below BAdI for allowing meter to send manual meter reads to MDM

Source Code:

METHOD if_ex_isu_ami_send_mr~trigger_send_mr.
*&---------------------------------------------------------------------*
*& *
*& Method - ZCL_ISU_AMI_SEND_MR~TRIGGER_SEND_MR *
************************************************************************
* PROJECT : AMI *
* OBJECT NAME : ZCL_ISU_AMI_SEND_MR~TRIGGER_SEND_MR *
* OBJECT Type : Badi Implementation Class *
* DATE OF CREATION : 24-Sep-2018 *
* DEVELOPER : Saurabh Roy *
* FUNCTIONAL OWNER : Venkat *
* TECHNICAL SPEC NO. : *
* DESCRIPTION : Triggers AMI MR Results *
* TRANSPORT REQUEST : RD1K981135 *
************************************************************************
************************************************************************
* MODIFICATIONS LOG : *
************************************************************************
* DATE REQUEST NO. DEVELOPER DESCRIPTION OF CHANGES *
* -------- ---------- ------------- ----------------------- *
* 29.05.19 RD1K984206 Karteek Katta Commented clearing memory ID
*
************************************************************************

DATA: lv_from_mdm TYPE abap_bool.

IMPORT from_mdm = lv_from_mdm FROM MEMORY ID 'MRR'.


*---------Begin of changes for RD1K984206----------*
* FREE MEMORY ID 'MRR'.
*---------End of changes for RD1K984206----------*
CHECK lv_from_mdm IS INITIAL.

* Send all MR Results without filtering.


yt_ins_eabl_trig_send = xt_ins_eabl_send.
yt_upd_eabl_trig_send = xt_upd_eabl_send.

ENDMETHOD.

Step 2: Create Authorization object and provide authorization to enter the


Manual meter reads from various transactions:

Authorization Object:
Source Code:
METHOD if_ex_isu_ami_attr_mr~set_attr_mr_changing.
*&---------------------------------------------------------------------*
*
************************************************************************
* DATE REQUEST NO. DEVELOPER DESCRIPTION OF CHANGES *
* -------- ---------- ------------- ----------------------- *
* 19/03/2019 RD1K983067 Karteek Katta To disable MR entry to *
* unauthorized user *
************************************************************************

* Auth Check (Based on T-Code & Activity)


CASE sy-tcode.

WHEN 'EL28'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EG31'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EG32'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EG30'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EL29'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '02'.

WHEN 'EL27'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '03'.

IF sy-subrc NE 0.
* No Authorization for Display
MESSAGE e020(zdm) DISPLAY LIKE 'I'.
* No Authorization to perform activity - Smart Meter

RETURN.
ENDIF.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '02'.


IF sy-subrc NE 0.
* No Authorization for Change
* MESSAGE 'No Authorization to perform activity -
Smart Meter' TYPE 'E' DISPLAY LIKE 'I'.
MESSAGE e020(zdm) DISPLAY LIKE 'I'.
* No Authorization to perform activity - Smart Meter
* RETURN.
ENDIF.

WHEN 'EG42'.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '03'.

IF sy-subrc NE 0.
* No Authorization for Display
* MESSAGE 'No Authorization to perform activity' TYPE 'E' DISPLAY LIKE
'I'.
* MESSAGE 'No Authorization to perform activity' TYPE 'S' DISPLAY LIKE
'E'.
* RETURN.
DATA(lv_unauthorized) = abap_true.
ENDIF.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '02'.


IF sy-subrc NE 0.
* No Authorization for Change
* MESSAGE 'No Authorization to perform activity' TYPE 'E' DISPLAY LIKE
'I'.
* MESSAGE 'No Authorization to perform activity' TYPE 'S' DISPLAY LIKE
'E'.
* RETURN.
lv_unauthorized = abap_true.
ENDIF.

WHEN 'EC50E'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EC85'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EC86'.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '03'.


IF sy-subrc NE 0.
* No Authorization for Display
MESSAGE 'No Authorization to perform activity' TYPE 'E' DISPLAY LIKE
'I'.
RETURN.
ENDIF.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '02'.


IF sy-subrc NE 0.
* No Authorization for Change
MESSAGE 'No Authorization to perform activity' TYPE 'E' DISPLAY LIKE
'I'.
RETURN.
ENDIF.

AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.


IF sy-subrc NE 0.
* No Authorization for Create
MESSAGE 'No Authorization to perform activity' TYPE 'E' DISPLAY LIKE
'I'.
RETURN.
ENDIF.

WHEN 'EC87'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '01'.
WHEN 'EL37'.
AUTHORITY-CHECK OBJECT 'ZAMI_MR' ID 'ACTVT' FIELD '06'.
WHEN OTHERS.

ENDCASE.

IF sy-subrc NE 0.

* MR Enable/Disable acc to Standard SAP logic


IF x_reabld-ams IS NOT INITIAL OR x_reabld-sourcesyst > 0.
y_protect = 'X'.
ELSE.
CLEAR y_protect.
ENDIF.

ELSEIF sy-subrc EQ 0. "Authorization Pass.


* MR Enable
CLEAR y_protect.
ENDIF.

IF lv_unauthorized IS NOT INITIAL.


* MR Enable/Disable acc to Standard SAP logic
IF x_reabld-ams IS NOT INITIAL OR x_reabld-sourcesyst > 0.
y_protect = 'X'.
ELSE.
CLEAR y_protect.
ENDIF.

ELSEIF sy-subrc EQ 0. "Authorization Pass.


* MR Enable
CLEAR y_protect.
ENDIF.

ENDMETHOD.

Step 3: Enhancement to send Manual meter reads to MDM using the standard WS
for all meter read reasons.
METHOD lcl_get_mrdr_for_send.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""""""""""""""""$"$\SE:(1) Class CL_ISU_AMI_MRR_MANAGER, Method LCL_GET_MRDR_
FOR_SEND, Start
A
*$*$-Start: (1)--------------------------------------------------------------
-------------------$*$*
ENHANCEMENT 1 Z_SEND_MR_RESULTS_EL28. "active version
*if sy-tcode = 'EL28'.
* Enhanced to trigger meter reading result web service for meter reading reas
ons defined by customer

CALL METHOD cl_isu_ami_mrr_manager=>zlcl_get_mrdr_for_send


EXPORTING
x_masterdata = x_masterdata
xt_eablg = xt_eablg
xt_eablg_insert = xt_eablg_insert
xt_db_eabl = xt_db_eabl
xt_ins_eabl = xt_ins_eabl
xt_upd_eabl = xt_upd_eabl
xt_all_eabl = xt_all_eabl
IMPORTING
yt_create_ins_eabl = yt_create_ins_eabl
yt_create_upd_eabl = yt_create_upd_eabl
yt_change_upd_eabl = yt_change_upd_eabl
yt_ins_eabl = yt_ins_eabl
yt_upd_eabl = yt_upd_eabl.

return.
*endif.
ENDENHANCEMENT.
*$*$-End: (1)--------------------------------------------------------------
-------------------$*$*

INCLUDE: ielablgr,
ielablst.

* BAdI to decide if mr results should be sent or not


DATA obj_badi_isu_ami_send_mr TYPE REF TO isu_ami_send_mr.

* local tables
DATA: lt_ins_eabl_send TYPE eabl_tab, "inserted mr results eligible fo
r send
lt_upd_eabl_send TYPE eabl_tab, "updated mr results eligible for
send
lt_ins_eabl_trig_send TYPE eabl_tab, "inserted mr results to trigger
send
lt_upd_eabl_trig_send TYPE eabl_tab, "updated mr results to trigger s
end
lt_ins_eabl TYPE eabl_tab, "inserted mr results not sent
lt_change_eabl_send TYPE eabl_tab, "changed mr results for send
lt_upd_eabl TYPE eabl_tab, "updated mr results not sent
lt_eablg TYPE eablg_tab.

* local workareas
DATA: lw_ins_eabl_send TYPE eabl, "inserted mr result eligible for se
nd
lw_upd_eabl_send TYPE eabl, "updated mr result eligible for sen
d
lw_ins_eabl_trig_send TYPE eabl, "inserted mr result to trigger send
lw_upd_eabl_trig_send TYPE eabl, "updated mr result to trigger send
lw_db_eabl TYPE eabl, "db mr result
lw_eabl TYPE eabl, "generic mr result workarea for loo
ps
lw_ablesgr TYPE eablg. "meter reading reason

* local variables
DATA: lv_send_relevant_change TYPE regen-
kennzx, "mr result change is send relevant
lv_create_sent TYPE regen-
kennzx. "create was already sent according to ami monitoring

* sending of mr results is only supported for following meter reading reason:


* 08 - Meter reading upon technical installation
* 12 - Meter reading at technical removal
* 21 - Meter reading at billing-related installation
* 22 - Meter reading at billing-related removal
* 24 - Replacement upon installation
* 25 - Replacement upon removal

lt_eablg = xt_eablg.
DELETE lt_eablg WHERE ablesgr NE co_gr_einbau AND
ablesgr NE co_gr_ausbau AND
ablesgr NE co_gr_zuordg AND
ablesgr NE co_gr_zuordd AND
ablesgr NE co_gr_weeinb AND
ablesgr NE co_gr_weausb.

* determine valid inserted meter reading results for installation, removal an


d replacement
LOOP AT xt_ins_eabl INTO lw_eabl.
LOOP AT lt_eablg INTO lw_ablesgr WHERE ablbelnr = lw_eabl-ablbelnr.
IF lw_eabl-ablstat CA co_as_valid AND (
lw_ablesgr-ablesgr = co_gr_einbau OR
lw_ablesgr-ablesgr = co_gr_ausbau OR
lw_ablesgr-ablesgr = co_gr_zuordg OR
lw_ablesgr-ablesgr = co_gr_zuordd OR
lw_ablesgr-ablesgr = co_gr_weeinb OR
lw_ablesgr-ablesgr = co_gr_weausb ).
* meter reading result valid for sending
APPEND lw_eabl TO lt_ins_eabl_send.
EXIT. "make sure mr result is only added once in case it has more tha
n one eligible mr reason
ELSE.
* meter reading result not valid for sending
APPEND lw_eabl TO lt_ins_eabl.
EXIT. "make sure mr result is only added once in case it has more tha
n one mr reason
ENDIF.
ENDLOOP.
IF sy-subrc NE 0.
* meter reading result not valid for sending
APPEND lw_eabl TO lt_ins_eabl.
ENDIF.
ENDLOOP.

* determine valid updated meter reading results for installation, removal and
replacement
LOOP AT xt_upd_eabl INTO lw_eabl.
LOOP AT lt_eablg INTO lw_ablesgr WHERE ablbelnr = lw_eabl-ablbelnr.
IF lw_eabl-ablstat CA co_as_valid AND (
lw_ablesgr-ablesgr = co_gr_einbau OR
lw_ablesgr-ablesgr = co_gr_ausbau OR
lw_ablesgr-ablesgr = co_gr_zuordg OR
lw_ablesgr-ablesgr = co_gr_zuordd OR
lw_ablesgr-ablesgr = co_gr_weeinb ).
READ TABLE xt_db_eabl INTO lw_db_eabl WITH KEY ablbelnr = lw_eabl-
ablbelnr.
IF lw_db_eabl-ablstat NE co_as_vorbereitet AND
lw_db_eabl-transstat = co_systat_iu109 OR
lw_db_eabl-transstat = co_systat_iu110 OR
lw_db_eabl-transstat = co_systat_iu111 OR
lw_db_eabl-transstat = co_systat_iu112.
* meter reading result valid for sending change
* check if send relevant fields have been changed
CALL METHOD cl_isu_ami_mrr_manager=>lcl_check_change_send_relevant
EXPORTING
x_eabl_changed = lw_eabl
x_eabl_db = lw_db_eabl
IMPORTING
y_send_relevant_change = lv_send_relevant_change.
IF lv_send_relevant_change = abap_true.
APPEND lw_eabl TO lt_change_eabl_send.
ENDIF.
EXIT.
ELSE.
* it is not possible to determine based on the meter reading document
whether a
* create service was sent out already or not e.g. in case it was chan
ged in the meantime
* to implausible (not sent relevant) transmission status was set to I
U200 (manual entry)
* the only possibility is to check in ami monitoring if a create serv
ice was already
* sent for this meter reading document result
CALL METHOD cl_isu_ami_mrr_manager=>lcl_check_mrdr_create_amimon
EXPORTING
x_ablbelnr = lw_eabl-ablbelnr
IMPORTING
y_create_sent = lv_create_sent.
IF lv_create_sent = abap_true.
* meter reading result valid for sending change since create was se
nt before according to ami monitoring
* check if send relevant fields have been changed
CALL METHOD cl_isu_ami_mrr_manager=>lcl_check_change_send_relevan
t
EXPORTING
x_eabl_changed = lw_eabl
x_eabl_db = lw_db_eabl
IMPORTING
y_send_relevant_change = lv_send_relevant_change.
IF lv_send_relevant_change = abap_true.
APPEND lw_eabl TO lt_change_eabl_send.
ENDIF.
EXIT.
ELSE.
* meter reading result valid for sending create since no create ser
vice was sent before according to ami monitoring
APPEND lw_eabl TO lt_upd_eabl_send.
EXIT. "make sure mr result is only added once in case it has more
than one eligible mr reason
ENDIF.
ENDIF.
ELSE.
* meter reading result not valid for sending
APPEND lw_eabl TO lt_upd_eabl.
EXIT. "make sure mr result is only added once in case it has more tha
n one mr reason
ENDIF.
ENDLOOP.
IF sy-subrc NE 0.
* meter reading result not valid for sending
APPEND lw_eabl TO lt_upd_eabl.
ENDIF.
ENDLOOP.

IF xt_eablg_insert IS NOT INITIAL AND xt_ins_eabl IS INITIAL AND xt_upd_eab


l IS INITIAL.
* in case no new or updated mr result was entered but a new mr reason is ad
ded to the mr result
* it must be checked here whether this mr result is now required to be sent
LOOP AT xt_all_eabl INTO lw_eabl WHERE ablstat CA co_as_valid AND
transstat NE co_systat_iu109 AND
transstat NE co_systat_iu110 AND
transstat NE co_systat_iu111.
* only send mr result in case it was not sent before and it has one of th
e eligible mr reasons
LOOP AT xt_eablg_insert INTO lw_ablesgr
WHERE ablbelnr = lw_eabl-ablbelnr AND (
ablesgr = co_gr_einbau OR
ablesgr = co_gr_ausbau OR
ablesgr = co_gr_zuordg OR
ablesgr = co_gr_zuordd OR
ablesgr = co_gr_weeinb ).
APPEND lw_eabl TO lt_upd_eabl_send.
EXIT.
ENDLOOP.
ENDLOOP.
ENDIF.

IF lt_upd_eabl_send IS NOT INITIAL OR lt_ins_eabl_send IS NOT INITIAL.

TRY.
GET BADI obj_badi_isu_ami_send_mr.
* determine which meter reading results should be sent
CALL BADI obj_badi_isu_ami_send_mr->trigger_send_mr
EXPORTING
x_masterdata = x_masterdata
xt_eablg = xt_eablg
xt_ins_eabl_send = lt_ins_eabl_send
xt_upd_eabl_send = lt_upd_eabl_send
IMPORTING
yt_ins_eabl_trig_send = lt_ins_eabl_trig_send
yt_upd_eabl_trig_send = lt_upd_eabl_trig_send.

* determine the inserted mr results that should not be send and


* add them to separate internal table for later status update
LOOP AT lt_ins_eabl_send INTO lw_ins_eabl_send.
READ TABLE lt_ins_eabl_trig_send INTO lw_ins_eabl_trig_send
WITH KEY ablbelnr = lw_ins_eabl_send-ablbelnr.
IF sy-subrc <> 0.
APPEND lw_ins_eabl_send TO lt_ins_eabl.
ENDIF.
ENDLOOP.

* determine the updated mr results that should not be send and


* add them to separate internal table for later status update
LOOP AT lt_upd_eabl_send INTO lw_upd_eabl_send.
READ TABLE lt_upd_eabl_trig_send INTO lw_upd_eabl_trig_send
WITH KEY ablbelnr = lw_upd_eabl_send-ablbelnr.
IF sy-subrc <> 0.
APPEND lw_upd_eabl_send TO lt_upd_eabl.
ENDIF.
ENDLOOP.

CATCH cx_badi_not_implemented.
* badi not implemented, no send of meter reading results neccessary
* still mr results must get new status so add them to table for later u
pdate
APPEND LINES OF lt_upd_eabl_send TO lt_upd_eabl.
APPEND LINES OF lt_ins_eabl_send TO lt_ins_eabl.
ENDTRY.

ENDIF.

yt_ins_eabl = lt_ins_eabl.
yt_upd_eabl = lt_upd_eabl.
yt_create_ins_eabl = lt_ins_eabl_trig_send.
yt_create_upd_eabl = lt_upd_eabl_trig_send.
yt_change_upd_eabl = lt_change_eabl_send.

ENDMETHOD.

You might also like