Quantcast
Channel: Product Lifecycle Management (SAP PLM)
Viewing all articles
Browse latest Browse all 52

How to delete an Engineering Record when everything else fails?

$
0
0

Introduction

 

Today we were blocked from recreating indices for PLM search because of one broken ER in the system, the indexing short dumped while trying to close an ER with inconsistent sub-components. I tried all the standard methods, even tried to use /PLMI/CL_ECR_BO->DELETE_CHANGE_RECORDS without success. I then found out about BAPI_CASE_DELETE but even that wouldn't work because of the inconsistency with the ER in question. However, I ended up using BAPI_CASE_DELETE because that was the easiest to cheat around.

 

Disclaimer: do not attempt the following unless you know what you are doing. Even if you do, I do not take any responsibility if you happen to break your system by following these instructions. You have been warned!!!

 

Solution

 

Navigate from BAPI_CASE_DELETE to CL_SCMG_CASE_API->IF_SCMG_CASE_API~DELETE and then to CL_SCMG_CASE->IF_SCMG_CASE~DELETE. Locate the code which is checking each sub-component for authorization and place a break point following the call.

 

    TRY.

        READTABLE gt_subcomp_fcodes INTO wa_fcode WITHKEY fcode = <wa_subcomponent>-fcode.

        IF sy-subrc = 0.

          IF wa_fcode-classname ISNOTINITIAL.

            ls_subcom_clas_method-clsname = wa_fcode-classname.

            ls_subcom_clas_method-cpdname = 'CHECK_ACTIVITY_AUTHORIZATION'.

            CALLFUNCTION'SEO_METHOD_GET_DETAIL'

              EXPORTING

                cpdkey      = ls_subcom_clas_method

              EXCEPTIONS

                not_existing = 1

                no_method   = 2

                OTHERS      = 3.

            IF sy-subrc <>0.

              lb_activity_is_authorized = if_srm=>true.

* method CHECK_ACTIVITY_AUTHORIZATION does not exist..default auth to be true

*this may occur for subcomponents created by other appl & customer

              CONTINUE.

            ELSE.

              TRY.

                  CREATEDATA lcl_subcomp_ref_var TYPEREFTO(wa_fcode-classname).

                  ASSIGN lcl_subcomp_ref_var->* TO<wa_subcomp_clas_instance>.

                  <wa_subcomp_clas_instance> ?= <wa_subcomponent>-class.

                  ls_string = 'CHECK_ACTIVITY_AUTHORIZATION'.

                  lcl_subcomp_obj ?= <wa_subcomp_clas_instance>.

                  CALLMETHOD lcl_subcomp_obj->(ls_string)

                    EXPORTING

                      im_activity              = if_srm_document=>act_delete

                      im_skip_authorization    = if_srm=>false

                    IMPORTING

                      ex_activity_is_authorized = lb_activity_is_authorized.

*--keep check as TRUE if the check_activity_authorization is not implemented by

*--component or the class is different.

                CATCH cx_root.

                  lb_activity_is_authorized = if_srm=>true.

                  lb_activity_is_authorized = if_srm=>true.

              ENDTRY.

            ENDIF.                        " close of IF sy-subrc <> 0.

            IF lb_activity_is_authorized = if_srm=>false.  " <-- place break point here

              MESSAGE s009(scmg_case)DISPLAYLIKE'E'.

              RAISE EXCEPTION TYPE cx_srm_sp_client.

            ENDIF.

          ENDIF.                          " close of IF wa_fcode-classname IS NOT INITIAL

 

        ENDIF.                            " close of IF sy-subrc = 0

 

      CATCH cx_scmg .

        RAISE EXCEPTION TYPE cx_srm_sp_client.

    ENDTRY.

Whenever the execution reaches your break point, change the value of lb_activity_is_authorized to 'X'. At the end of the execution your inconsistent ER will be deleted and you will be able to create indices for PLM search.

 

Conclusion

 

While not pretty, the solution works. In my opinion there should be a standard report to either repair ERs or delete them if they are beyond repair.


Viewing all articles
Browse latest Browse all 52

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>