Skip to Content
0
Oct 09, 2020 at 04:20 PM

Cancellation of Service Confirmation Cancels Only Items?

64 Views Last edit Oct 09, 2020 at 10:45 PM 2 rev

Hello,

On SAP CRM, Cancellation of Service Confirmation cancels only items but not header. When I checked the code of event 'EH_ONCANCEL_CONF' I noticed that code only modifies items statuses to 'I1096' and 'I1095'. I know from the documents I read that if all items are cancelled that header gets cancelled too. Does anyone knows where headers cancelation occurs so I can check why only Items cancelled on my case?

Here s the code of 'EH_ONCANCEL_CONF'.

METHOD eh_oncancel_conf.

  INCLUDE: crm_object_names_con,
           crm_object_kinds_con,
           crm_status_con,
           crm_mode_con.

  DATA: lr_tcc         TYPE REF TO cl_bt117s_s_bspwdcomponen_impl,
        lr_entity        TYPE REF TO cl_crm_bol_entity,
        lr_result        TYPE REF TO if_bol_entity_col,
        lr_msg_srv       TYPE REF TO cl_bsp_wd_message_service,
        ls_btorder       TYPE crmst_guid_btil,
        lt_req_objects   TYPE crmt_object_name_tab,
        lt_header_guid   TYPE crmt_object_guid_tab,
        lt_orderadm_i    TYPE crmt_orderadm_i_wrkt,
        ls_orderadm_i    TYPE crmt_orderadm_i_wrk,
        lt_status        TYPE crmt_status_wrkt,
        ls_status        TYPE crmt_status_wrk,
        lt_status_com    TYPE crmt_status_comt,
        ls_status_com    TYPE crmt_status_com,
        lt_input_fields  TYPE crmt_input_field_tab,
        ls_input_fields  TYPE crmt_input_field,
        lt_fieldname     TYPE crmt_input_field_names_tab,
        ls_fieldname     TYPE crmt_input_field_names,
        lv_error         TYPE boolean.


  lr_msg_srv = me->view_manager->get_message_service( ).

  IF me->typed_context->btqrsrvcfm->selected_index = 0.
*   no confirmation maked on list
    lr_msg_srv->add_message( iv_msg_type   = 'I'
                             iv_msg_id     = 'CRMN_REPORT'
                             iv_msg_number = '108' ).
    RETURN.
  ENDIF.

  lr_entity ?= me->typed_context->btqrsrvcfm->collection_wrapper->get_current( ).
  CHECK lr_entity IS BOUND.

  lr_tcc    ?= me->comp_controller.
  lr_entity ?= lr_tcc->create_bt_root( lr_entity ).
  CHECK lr_entity IS BOUND.

  CALL METHOD lr_entity->if_bol_bo_property_access~get_properties
    IMPORTING
      es_attributes = ls_btorder.

  INSERT ls_btorder-crm_guid       INTO TABLE lt_header_guid.
  INSERT gc_object_name-orderadm_h INTO TABLE lt_req_objects.
  INSERT gc_object_name-orderadm_i INTO TABLE lt_req_objects.
  INSERT gc_object_name-status INTO TABLE lt_req_objects.

* read items and status
  CALL FUNCTION 'CRM_ORDER_READ'
    EXPORTING
      it_header_guid       = lt_header_guid
      iv_mode              = gc_mode-change
      it_requested_objects = lt_req_objects
    IMPORTING
      et_orderadm_i        = lt_orderadm_i
      et_status            = lt_status
    EXCEPTIONS
      OTHERS               = 1.
  IF sy-subrc IS NOT INITIAL.
    lr_msg_srv->add_message( iv_msg_type   = sy-msgty
                             iv_msg_id     = sy-msgid
                             iv_msg_number = sy-msgno
                             iv_msg_v1     = sy-msgv1
                             iv_msg_v2     = sy-msgv2
                             iv_msg_v3     = sy-msgv3 ).
    RETURN.
  ENDIF.

* check confirmation is completed
  READ TABLE lt_status TRANSPORTING NO FIELDS
       WITH KEY guid   = ls_btorder-crm_guid
                status = gc_status-completed
                active = abap_true.
  IF sy-subrc IS NOT INITIAL.
    lr_msg_srv->add_message( iv_msg_type   =  'W'
                             iv_msg_id     = 'CRM_CONFIRM_SRV'
                             iv_msg_number = '109' ).
    lv_error = abap_true.
  ENDIF.


* check not already cancelled
  READ TABLE lt_status TRANSPORTING NO FIELDS
       WITH KEY guid   = ls_btorder-crm_guid
                status = gc_status-cancelled_conf_srv
                active = abap_true.
  IF sy-subrc IS INITIAL.
    lr_msg_srv->add_message( iv_msg_type   =  'W'
                              iv_msg_id     = 'CRM_CONFIRM_SRV'
                              iv_msg_number = '108' ).
    lv_error = abap_true.
  ENDIF.


* build up working structure for api call
  ls_fieldname-fieldname = 'ACTIVATE'.
  INSERT ls_fieldname INTO TABLE lt_fieldname.

  LOOP AT lt_orderadm_i INTO ls_orderadm_i.
    CLEAR ls_status_com.
    CLEAR ls_input_fields.

    ls_status_com-ref_guid   = ls_orderadm_i-guid.
    ls_status_com-ref_kind   = gc_object_ref_kind-orderadm_i.
    ls_status_com-status     = gc_status-cancelled_invoice.
    ls_status_com-activate   = abap_true.
    INSERT ls_status_com INTO TABLE lt_status_com.

    ls_input_fields-ref_guid    = ls_orderadm_i-guid.
    ls_input_fields-ref_kind    = gc_object_ref_kind-orderadm_i.
    ls_input_fields-objectname  = gc_object_name-status.
    ls_input_fields-logical_key = ls_status_com-status.
    ls_input_fields-field_names = lt_fieldname.
    INSERT ls_input_fields INTO TABLE lt_input_fields.

    ls_status_com-status = gc_status-cancelled_conf_srv.
    INSERT ls_status_com INTO TABLE lt_status_com.

    ls_input_fields-logical_key = ls_status_com-status.
    INSERT ls_input_fields INTO TABLE lt_input_fields.

  ENDLOOP.

* check items available
  IF sy-subrc IS NOT INITIAL.
    lr_msg_srv->add_message( iv_msg_type   =  'W'
                             iv_msg_id     = 'CRM_LEASING_CANCEL'
                             iv_msg_number = '008' ).
    lv_error = abap_true.
  ENDIF.


* cancel all items
  IF lv_error = abap_false.
    CALL FUNCTION 'CRM_ORDER_MAINTAIN'
      EXPORTING
        it_status       = lt_status_com
      CHANGING
        ct_input_fields = lt_input_fields
      EXCEPTIONS
        OTHERS          = 1.
    IF sy-subrc IS INITIAL.
*     save confirmation
      CALL FUNCTION 'CRM_ORDER_SAVE'
        EXPORTING
          it_objects_to_save = lt_header_guid
        EXCEPTIONS
          document_not_saved = 1
          OTHERS             = 2.
      IF sy-subrc IS INITIAL.
*       call commit
        COMMIT WORK AND WAIT.
        lr_msg_srv->add_message( iv_msg_type   =  'S'
                                  iv_msg_id     = 'CRMN_REPORT'
                                  iv_msg_number = '121' ).

      ELSE.
*       error during save
        lr_msg_srv->add_message( iv_msg_type   = sy-msgty
                                 iv_msg_id     = sy-msgid
                                 iv_msg_number = sy-msgno
                                 iv_msg_v1     = sy-msgv1
                                 iv_msg_v2     = sy-msgv2
                                 iv_msg_v3     = sy-msgv3 ).
      ENDIF.
    ELSE.
*     error during maintain
      lr_msg_srv->add_message( iv_msg_type   = sy-msgty
                               iv_msg_id     = sy-msgid
                               iv_msg_number = sy-msgno
                               iv_msg_v1     = sy-msgv1
                               iv_msg_v2     = sy-msgv2
                               iv_msg_v3     = sy-msgv3 ).
    ENDIF.
  ENDIF.

* init and unlock
  CALL FUNCTION 'CRM_ORDER_INITIALIZE'
    EXPORTING
      it_guids_to_init = lt_header_guid
    EXCEPTIONS
      OTHERS           = 0.


ENDMETHOD.

Thank you,

Best Regards.