본문 바로가기
ABAP/소스코드

[Report] 운영에서 소스코드 편집 프로그램(YEDITPR)

by name_text 2024. 10. 24.

운영에서 소스코드 편집 프로그램

READ REPORT, EDITOR-CALL, INSERT REPORT

ENQUEUE_ESRDIRE, DEQUEUE_ESRDIRE

 

*2024.10.24 : 소스정렬 기능 추가

*2023.11.17 : WEB GUI 호환성

*2023.11.16 : EDITOR-CALL 구문을 CL_GUI_ABAPEDIT 변경하여 소스코드 편집기 가독성 개선

 

많은 개발자들이 운영환경에서 CBO 프로그램의 소스코드를 긴급으로 수정하기 위해 

Read Report, Editor-Call, Insert Report 3가지 구문을 이용한 간단한 리포트를 만들어 사용하고 있습니다.

 

원칙적으로는 이렇게 운영환경에서 소스코드를 직접 편집하면 안되지만, 부득이 하게 긴급 수정 후 개발에서 재작업후 CTS 넘겨서 운영에 재반영 하는 경우가 종종 생기다 보니...

 

이왕 사용하는거 조금이라도 편하게 사용하고자 아래 3가지 구문을 추가하여 사용하고 있습니다.

   1) 사용자 ID로 테스트 리포트 생성(기본값)

   2) 소스코드 편집 잠금처리(Lock Object 'ESRDIRE')

   3) 저장시 Popup_to_confirm 처리

동일 소스코드에 동시 편집 금지

#1. 소스코드


REPORT YEDITPR NO STANDARD PAGE HEADING.

TYPES: BEGIN OF t_source,
         line(255),
       END OF t_source.

DATA: gv_answer.
DATA: gt_source     TYPE STANDARD TABLE OF t_source,
      gt_source_bak LIKE gt_source,
      gs_source     LIKE LINE OF gt_source,
      go_editor     TYPE REF TO cl_gui_abapedit,
      go_source     TYPE REF TO cl_wb_source,
      go_wbeditor   TYPE REF TO cl_wb_editor.
DATA: gt_functionkeys TYPE STANDARD TABLE OF  rsmpe_keys,
      gt_menu_tree    TYPE STANDARD TABLE OF rsmpe_tree,
      gt_ecomm        TYPE STANDARD TABLE OF sy-ucomm.

CONSTANTS: BEGIN OF gc_status_bar,
             program TYPE trdir-name VALUE 'SAPLS38E',
             status  TYPE gui_status VALUE 'WB_WITH_TOOL_PC',
             title   TYPE gui_title VALUE 'WB_TITLE',
           END OF gc_status_bar.


PARAMETERS p_prog LIKE trdir-name OBLIGATORY MEMORY ID rid.

INITIALIZATION.
  PERFORM initialization.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
  PERFORM f4_program.

AT USER-COMMAND.
  PERFORM user_command.

START-OF-SELECTION.
  IF p_prog(1) NE 'Z'     AND p_prog(1) NE 'Y'      AND
     p_prog(5) NE 'SAPMZ' AND p_prog(5) NE 'SAPMY'  AND
     p_prog(5) NE 'SAPLZ' AND p_prog(5) NE 'SAPLY'  AND
     p_prog(2) NE 'MZ'    AND p_prog(2) NE 'MY'     AND
     p_prog(2) NE 'LZ'    AND p_prog(2) NE 'LY'.
    MESSAGE i001(00) WITH 'CBO만 사용가능!!'.
    RETURN.
  ENDIF.

  READ REPORT p_prog INTO gt_source.
  IF gt_source[] IS INITIAL.
    IF p_prog(1) EQ 'Z'     OR p_prog(1) EQ 'Y'.
      CONCATENATE 'REPORT'  p_prog '.' INTO gs_source-line.
      APPEND gs_source TO gt_source.  CLEAR gs_source.
    ENDIF.
  ENDIF.

  IF gt_source[] IS NOT INITIAL.
    DATA lv_is_its TYPE c.
    CALL FUNCTION 'GUI_IS_ITS'
      IMPORTING
        return = lv_is_its.

    IF lv_is_its IS NOT INITIAL.
      MESSAGE i001(00) WITH 'WEB GUI에서는 사용 불가합니다' DISPLAY LIKE 'E'.
      RETURN.
    ELSE.
      gt_source_bak[] = gt_source[].
      SKIP.

      SET PF-STATUS gc_status_bar-status OF PROGRAM gc_status_bar-program EXCLUDING gt_ecomm.
      SET TITLEBAR gc_status_bar-title OF PROGRAM gc_status_bar-program WITH p_prog '' 'Change'.

      IF go_editor IS NOT BOUND.
        go_editor = NEW #( parent = cl_gui_container=>default_screen ).
      ENDIF.

      go_editor->set_text(
        EXPORTING
          table           = gt_source
        EXCEPTIONS
          error_dp        = 1
          error_dp_create = 2
          error_code_page = 3
          OTHERS          = 4
      ).
      IF sy-subrc <> 0.
       message id sy-msgid type sy-msgty number sy-msgno
                  with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDIF.

    CALL FUNCTION 'ENQUEUE_ESRDIRE'
      EXPORTING
        mode_trdir     = 'E'
        name           = p_prog
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE sy-msgty.
      RETURN.
    ENDIF.
  ELSE.
    MESSAGE i001(00) WITH p_prog '(이)가 존재하지 않습니다'.
  ENDIF.

*&---------------------------------------------------------------------*
*& Form INITIALIZATION
*&---------------------------------------------------------------------*
FORM initialization .
  p_prog = 'Y' && sy-uname && '_TEST'.

  CALL FUNCTION 'RS_CUA_GET_STATUS'
    EXPORTING
      program           = gc_status_bar-program
      status            = gc_status_bar-status
    TABLES
      menutree          = gt_menu_tree
      functionkeys      = gt_functionkeys
    EXCEPTIONS
      not_found_program = 1
      not_found_status  = 2
      recursive_menues  = 3
      empty_list        = 4
      not_found_menu    = 5
      OTHERS            = 6.
  IF sy-subrc <> 0.
*Implement suitable error handling here
  ENDIF.

  gt_ecomm = VALUE #( FOR <lfs> IN gt_functionkeys
                      WHERE ( code NE 'WB_BACK'
                              AND code NE 'WB_END'
                              AND code NE 'WB_SAVE'
                              AND code NE 'ED_PRETTY_PRINT' )
                    ( <lfs>-code ) ).

  gt_ecomm = VALUE #( BASE gt_ecomm
                      FOR <lfs2> IN gt_menu_tree
                      WHERE ( code NE 'WB_BACK'
                              AND code NE 'WB_END'
                              AND code NE 'WB_SAVE'
                              AND code NE 'ED_PRETTY_PRINT' )
                    ( <lfs2>-code ) ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
FORM user_command .
  CASE sy-ucomm.
    WHEN 'WB_BACK'.
      CALL FUNCTION 'DEQUEUE_ESRDIRE'
        EXPORTING
          mode_trdir = 'E'
          name       = p_prog.
      LEAVE TO SCREEN 0.
    WHEN 'WB_END'.
      CALL FUNCTION 'DEQUEUE_ESRDIRE'
        EXPORTING
          mode_trdir = 'E'
          name       = p_prog.
      LEAVE PROGRAM.
    WHEN 'WB_SAVE'.
      go_editor->get_text(
*        exporting
*          NAME                   =     " document name
        IMPORTING
          table                  = gt_source
          is_modified            = DATA(lv_modified)
        EXCEPTIONS
          error_dp               = 1
          error_cntl_call_method = 2
          OTHERS                 = 3
      ).
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
      IF gt_source[] NE gt_source_bak[].
        CLEAR gv_answer.
        CALL FUNCTION 'POPUP_TO_CONFIRM'
          EXPORTING
            text_question         = '저장 하시겠습니까?'
            display_cancel_button = space
          IMPORTING
            answer                = gv_answer
          EXCEPTIONS
            text_not_found        = 1
            OTHERS                = 2.
        IF gv_answer EQ '1'.
          INSERT REPORT p_prog FROM gt_source.
          MESSAGE s001(00) WITH 'SAVED'.
          CALL FUNCTION 'DEQUEUE_ESRDIRE'
            EXPORTING
              mode_trdir = 'E'
              name       = p_prog.
          LEAVE TO SCREEN 0.
        ENDIF.
      ELSE.
        MESSAGE s001(00) WITH '변경된 부분이 없습니다'.
      ENDIF.
    WHEN 'ED_PRETTY_PRINT'.
      go_editor->get_text(
        IMPORTING
          table                  = gt_source
        EXCEPTIONS
          error_dp               = 1
          error_cntl_call_method = 2
          OTHERS                 = 3
      ).
      IF sy-subrc NE 0.
        RETURN.
      ENDIF.
      IF go_wbeditor IS NOT BOUND.
        go_wbeditor = NEW #( ).
        go_wbeditor->create_source_object( IMPORTING source_object = go_source ).
      ENDIF.
      go_source->set_source_tab( source = gt_source ).
      go_wbeditor->execute_function( CHANGING fcode = sy-ucomm ).
      go_source->get_source_tab( IMPORTING source = gt_source ).
      go_editor->set_text(
        EXPORTING
          table           = gt_source
        EXCEPTIONS
          error_dp        = 1
          error_dp_create = 2
          error_code_page = 3
          OTHERS          = 4 ).
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f4_program
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f4_program .
  DATA: lt_dynfields TYPE STANDARD TABLE OF dynpread,
        info_object LIKE euobj-id.

  lt_dynfields = VALUE #( ( fieldname = 'P_PROG' ) ).

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname     = sy-repid
      dynumb     = sy-dynnr
    TABLES
      dynpfields = lt_dynfields
    EXCEPTIONS
      OTHERS     = 0.

  p_prog = VALUE #( lt_dynfields[ 1 ]-fieldvalue OPTIONAL ).

  info_object = 'PROG'.
  CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
    EXPORTING
      object_type          = info_object
      object_name          = p_prog
      suppress_selection   = 'X'
    IMPORTING
      object_name_selected = p_prog
    EXCEPTIONS
      cancel               = 0.
ENDFORM.
ABAP

댓글