Skip to Content
In my project I need to create new service request by code with its subject data filled.
As a result I need to figure out how to fill the required data by calling function module CRM_ORDER_MAINTAIN. I share my code here in case you have the same requirement.
First of all you should already have a well-maintained Categorization Schema in Service Operation Work center:
In Application Areas assignment block, this schema must have corresponding combination of Transaction type and Catalog Category maintained.
In my example above, “Service Request / Defect Locations/Object Parts” just represents the following customizing:
Just specify the schema ID and category ID you would like to fill for the created Service Request:
We only need to specify a single category ID in our code, and all its parent node in the schema tree could automatically be filled as expected by WebUI.
Source code:
REPORT order_create_subject.

PARAMETERS: asp_id   TYPE crmt_srv_subject_com-asp_id OBLIGATORY DEFAULT 'WJ_SOFTWARE',
            cat_id   TYPE crmt_srv_subject_com-cat_id OBLIGATORY DEFAULT 'CA_13',
            cat_type TYPE crmt_srv_subject_com-katalog_type OBLIGATORY DEFAULT 'D'.

DATA: lt_input_fields   TYPE  crmt_input_field_tab,
      ls_input_field    LIKE LINE OF lt_input_fields,
      ls_field_name     LIKE LINE OF ls_input_field-field_names,
      lv_guid           TYPE guid_16,
      lt_orderadm_h_com TYPE crmt_orderadm_h_comt,
      ls_orderadm_h_com LIKE LINE OF lt_orderadm_h_com,
      lt_save           TYPE crmt_object_guid_tab,
      lt_saved          TYPE crmt_return_objects,
      lt_service_os     TYPE crmt_srv_osset_comt,
      ls_service_os     TYPE LINE OF crmt_srv_osset_comt,
      lt_osset          TYPE crmt_srv_osset_comt1,
      ls_osset          TYPE LINE OF crmt_srv_osset_comt1,
      ls_saved          LIKE LINE OF lt_saved,
      ls_subject        TYPE LINE OF crmt_srv_subject_comt.

START-OF-SELECTION.
  CALL FUNCTION 'GUID_CREATE'
    IMPORTING
      ev_guid_16 = lv_guid.

  PERFORM call_order_maintain.
  PERFORM call_order_save.

FORM prepare_service_os.
  ls_service_os = VALUE #( ref_guid = lv_guid ref_kind = 'A' ).

  ls_osset-profile_type = 'A'.

  CALL FUNCTION 'CRM_GUID_CREATE'
    IMPORTING
      ev_guid = ls_osset-ref_guid.

  CALL FUNCTION 'CRM_GUID_CREATE'
    IMPORTING
      ev_guid = ls_subject-ref_guid.

  ls_subject-asp_id = asp_id.
  ls_subject-katalog_type = cat_type.
  ls_subject-cat_id = cat_id.
  ls_subject-mode = 'A'.
  APPEND ls_subject TO ls_osset-subject.
  APPEND ls_osset TO lt_osset.
  APPEND LINES OF lt_osset TO ls_service_os-osset.
  APPEND ls_service_os TO lt_service_os.

  CLEAR: ls_input_field.

  ls_input_field-ref_guid = lv_guid.
  ls_input_field-ref_kind = 'A'.
  ls_input_field-objectname = 'SERVICE_OS'.

  ls_field_name-fieldname = 'ASP_ID'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'CAT_ID'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'CODE'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'CODEGRUPPE'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'KATALOGART'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'MODE'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'REF_GUID'.
  APPEND ls_field_name TO ls_input_field-field_names.
  APPEND ls_input_field TO lt_input_fields.

ENDFORM.

FORM call_order_maintain.
  CLEAR: ls_orderadm_h_com, ls_input_field, lt_input_fields.
  ls_orderadm_h_com-guid = lv_guid.
  ls_orderadm_h_com-description = 'created by code on:' && sy-timlo.
  ls_orderadm_h_com-process_type = 'SRVR'.
  ls_orderadm_h_com-mode = 'A'.

  APPEND ls_orderadm_h_com TO lt_orderadm_h_com.
  ls_input_field-ref_guid = lv_guid.
  ls_input_field-ref_kind = 'A'.
  ls_input_field-objectname = 'ORDERADM_H'.
  ls_field_name-fieldname = 'DESCRIPTION'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'MODE'.
  APPEND ls_field_name TO ls_input_field-field_names.
  ls_field_name-fieldname = 'PROCESS_TYPE'.
  APPEND ls_field_name TO ls_input_field-field_names.

  APPEND ls_input_field TO lt_input_fields.

  PERFORM prepare_service_os.

  CALL FUNCTION 'CRM_ORDER_MAINTAIN'
    EXPORTING
      it_service_os   = lt_service_os
    CHANGING
      ct_orderadm_h   = lt_orderadm_h_com
      ct_input_fields = lt_input_fields
    EXCEPTIONS
      OTHERS          = 99.

  IF sy-subrc = 0.
    WRITE:/ 'Order maintain function is done successfully.'.
  ENDIF.
ENDFORM.

FORM call_order_save.
  INSERT lv_guid INTO TABLE lt_save.

  CALL FUNCTION 'CRM_ORDER_SAVE'
    EXPORTING
      it_objects_to_save   = lt_save
      iv_update_task_local = abap_true
      iv_no_bdoc_send      = abap_true
    IMPORTING
      et_saved_objects     = lt_saved
    EXCEPTIONS
      document_not_saved   = 1.
  IF sy-subrc <> 0.
    WRITE: / 'Service Request created failed'.
  ELSE.
    READ TABLE lt_saved INTO ls_saved INDEX 1.
    WRITE: / 'Service Request created successfully, id: ' , ls_saved-object_id.
  ENDIF.
  COMMIT WORK AND WAIT.
ENDFORM.
To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

  1. Diego Gabriel

    Hi Jerry,

    Few weeks ago I created a similar one to generate Interaction Records by code and I also generated them with categorization (still unfinished… need to create transcripts of interactive scripts. Working on it next week).

    Maybe I can write a blog post as well sharing the complete code when it’s complete.

    BTW, as Michelle stated above, your Service Request screen seems pretty nice. I’m using CRM 7.0 EHP 3 and I don’t have such theme.

     

    Diego

    (0) 

Leave a Reply