批量修改Service Order description的report

81 阅读1分钟

Created by Jerry Wang on Apr 05, 2014

执行report,report会自动找出系统里指定数量的状态处于open的service order,将其description设置成report指定的新的内容。
clipboard1

并打印出总共花费的时间(以微秒为单位,包含save)
clipboard2

REPORT ZORDER_MODIFY_LAUNCHER.

PARAMETERS: num type i OBLIGATORY DEFAULT 1,
            txt type char20 OBLIGATORY DEFAULT 'new text'.

DATA: lt_rspar TYPE TABLE OF rsparams,
      ls_rspar LIKE LINE OF lt_rspar,
      lt_order_index TYPE STANDARD TABLE OF crmd_order_index-header,
      lt_order_tab TYPE STANDARD TABLE OF crmd_orderadm_h-object_id,
      lv_order_id LIKE LINE OF lt_order_tab.

AT SELECTION-SCREEN.
    CHECK num > 0.
    PERFORM fill_order_tab.
START-OF-SELECTION.

 LOOP AT lt_order_tab INTO lv_order_id.
  ls_rspar = VALUE #( selname = 'ORDERID'
                      kind = 'S'
                      sign = 'I'
                      option = 'EQ'
                      low  = lv_order_id ).

  APPEND ls_rspar TO lt_rspar.

  ls_rspar = VALUE #( selname = 'TXT'
                      kind = 'P'
                      low  = txt ).

  APPEND ls_rspar TO lt_rspar.
 ENDLOOP.

submit zorder_modify WITH SELECTION-TABLE lt_rspar.

FORM fill_order_tab.
   CLEAR: lt_order_index.
   SELECT DISTINCT crmd_order_index~HEADER INTO  TABLE @lt_order_index
  up to @num rows FROM CRMD_ORDER_INDEX  INNER JOIN CRM_JEST ON CRM_JEST~OBJNR = CRMD_ORDER_INDEX~HEADER
  WHERE CRMD_ORDER_INDEX~PROCESS_TYPE_IX = 'SRVO' AND
  CRMD_ORDER_INDEX~STAT_OPEN = 'X' AND
  CRM_JEST~INACT = @abap_false AND CRM_JEST~STAT IN ('E0001', 'I1002') AND
  CRMD_ORDER_INDEX~OBJECT_TYPE = 'BUS2000116'.

  CHECK lt_order_index IS NOT INITIAL.

  SELECT object_id INTO TABLE lt_order_tab FROM CRMD_ORDERADM_H FOR ALL ENTRIES IN lt_order_index
     WHERE guid = lt_order_index-table_line.

ENDFORM.


REPORT zorder_modify.

DATA: lt_exception     TYPE crmt_exception_t,
      ls_exception     LIKE LINE OF lt_exception,
      lt_header        TYPE crmt_orderadm_h_comt,
      lt_saved_object  TYPE crmt_return_objects,
      lt_save_failed   TYPE crmt_object_guid_tab,
      lt_to_be_save    TYPE crmt_object_guid_tab,
      lt_changed_input TYPE crmt_input_field_tab,
      ls_changed_input LIKE LINE OF lt_changed_input,
      ls_header        LIKE LINE OF lt_header,
      lv_start         TYPE i,
      lv_end           TYPE i,
      lv_object_id     TYPE crmd_orderadm_h-object_id.

SELECTION-SCREEN BEGIN OF BLOCK b1
  WITH FRAME TITLE txt1.
SELECT-OPTIONS: orderid  FOR lv_object_id OBLIGATORY. "DEFAULT '8000000110' OBLIGATORY.
PARAMETERS: txt    TYPE char20 OBLIGATORY."DEFAULT 'new description'.
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  txt1 = 'Specify Service order ID and new description to be changed.'.

START-OF-SELECTION.

  PERFORM get_guid_by_id.
  PERFORM fill_header_tab.

  GET RUN TIME FIELD lv_start.
  CALL FUNCTION 'CRM_ORDER_MAINTAIN'
    IMPORTING
      et_exception      = lt_exception
    CHANGING
      ct_orderadm_h     = lt_header
      ct_input_fields   = lt_changed_input
    EXCEPTIONS
      error_occurred    = 1
      document_locked   = 2
      no_change_allowed = 3
      no_authority      = 4
      OTHERS            = 5.

  IF sy-subrc <> 0 OR lt_exception IS NOT INITIAL.
    WRITE: / 'Modify API call failed.' COLOR COL_NEGATIVE.
    LOOP AT lt_exception INTO ls_exception.
      WRITE: / ls_exception-code COLOR COL_GROUP.
    ENDLOOP.
    RETURN.
  ENDIF.

  CALL FUNCTION 'CRM_ORDER_SAVE'
    EXPORTING
      it_objects_to_save   = lt_to_be_save
    IMPORTING
      et_saved_objects     = lt_saved_object
      et_exception         = lt_exception
      et_objects_not_saved = lt_save_failed
    EXCEPTIONS
      document_not_saved   = 1.

  IF sy-subrc <> 0 OR lt_exception IS NOT INITIAL OR lt_save_failed IS NOT INITIAL.
    WRITE: / 'Save API call failed.' COLOR COL_NEGATIVE.
    RETURN.
  ENDIF.

  COMMIT WORK AND WAIT.

  GET RUN TIME FIELD lv_end.
  lv_end  = lv_end - lv_start.
  FIELD-SYMBOLS: <line> LIKE LINE OF orderid.
  LOOP AT orderid ASSIGNING <line>.
     WRITE: / 'Order saved successfully: ' , <line>-low COLOR COL_TOTAL.
  ENDLOOP.

  WRITE:/ 'Time spent(microsecond): ', lv_end COLOR COL_POSITIVE.

FORM get_guid_by_id.
  DATA: lt_temp TYPE STANDARD TABLE OF crmd_orderadm_h.
  FIELD-SYMBOLS:<line> TYPE crmd_orderadm_h.

  SELECT guid INTO CORRESPONDING FIELDS OF TABLE lt_temp FROM crmd_orderadm_h WHERE object_id IN orderid AND
     process_type = 'SRVO'.
  LOOP AT lt_temp ASSIGNING <line>.
    INSERT <line>-guid INTO TABLE lt_to_be_save.
  ENDLOOP.
ENDFORM.

FORM fill_header_tab.

  FIELD-SYMBOLS: <guid_line> LIKE LINE OF lt_to_be_save.
  LOOP AT lt_to_be_save ASSIGNING <guid_line>.
    ls_header-guid = <guid_line>.
    ls_header-description = txt.
    APPEND ls_header TO lt_header.
    clear: ls_changed_input.

    ls_changed_input-ref_guid = <guid_line>.
    ls_changed_input-objectname = 'ORDERADM_H'.
    APPEND 'DESCRIPTION' TO ls_changed_input-field_names.
    APPEND ls_changed_input TO lt_changed_input.
  ENDLOOP.
ENDFORM.