운영에서 소스코드 편집 프로그램
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
'ABAP > 소스코드' 카테고리의 다른 글
[Report] SMW0 HTML양식 미리보기(ydemo_html_template_list) (4) | 2024.10.24 |
---|---|
[Report] 소스코드 작성하여 바로 실행(YDIRECT_EXEC) (0) | 2024.10.24 |
[Class] Internal Table/Structure 일괄 Conversion - ZCL_MASS_CONV_ALPHA (0) | 2023.11.22 |
[Class] Excel 업로드/다운로드 통합 Class - ZCL_EXCEL_UPDOWN (1) | 2023.11.22 |
[Report] 일괄 번역 편집기(MASS_TRANSLATE) (2) | 2023.11.15 |
댓글