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

[Report] 일괄 번역 편집기(MASS_TRANSLATE)

by name_text 2023. 11. 15.

일괄 번역 편집기

MASS_TRANSLATE

 

 

다국어 적용을 위해 ABAP Object(Program, Function, Class, Table 등) 이나 Roll에 다른 언어의 텍스트를 입력하고자 할 경우 SAP 표준 기능을 가지고 하기에는 상당히 번거롭고 작업 여부를 체크하기에도 편리하지 않습니다.

다국어 적용을 위해 많은 프로젝트에서 CBO로 프로그램을 만들어 Package내의 모든 항목을 일괄로 조회/변경하는 식으로 작업을 합니다.

 

CBO 프로그램에서 타 언어의 텍스트를 저장한 후 T-Code : SLXT 에서 Package별로 Workbench CTS를 생성하는 방식으로 사용하면 됩니다.

 

해당 소스코드에 사용된 공통 기능들은 블로그내의 아래 게시물 내용을 참고하면 됩니다.

ALV Common Include

2023.09.05 - [ABAP/소스코드] - [Include] ALV용 Common Include

 

Excel 파일 업로드 Function

2023.07.10 - [ABAP/소스코드] - [Function] ZCM_EXCEL_UPLOAD - 필드 점검 및 변환 엑셀 업로드

 

Internal Table Excel 다운로드 Class

2023.11.15 - [ABAP/소스코드] - [Class] Internal Table 엑셀 다운로드(XLSX 형식)

 

# 소스코드

*&---------------------------------------------------------------------*
*& Report ZMASS_TRANSLATE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMASS_TRANSLATE MESSAGE-ID YISPIMS01.

INCLUDE ZCM_ALV.
INCLUDE ZMASS_TRANSLATE_TOP.
INCLUDE ZMASS_TRANSLATE_ALV.
INCLUDE ZMASS_TRANSLATE_C01.
INCLUDE ZMASS_TRANSLATE_F01.
INCLUDE ZMASS_TRANSLATE_I01.
INCLUDE ZMASS_TRANSLATE_O01.

"Initialization
INITIALIZATION.
  PERFORM INITIALIZATION.

"Selection Screen의 PBO
AT SELECTION-SCREEN OUTPUT.
  PERFORM AT_SELECTION_SCREEN_OUTPUT.

"Selection Screen의 PAI
AT SELECTION-SCREEN.
  PERFORM AT_SELECTION_SCREEN.

AT SELECTION-SCREEN ON S_OBJE.
  IF S_OBJE-LOW IS NOT INITIAL AND NOT LINE_EXISTS( GT_F4_OBJ[ OBJECT = S_OBJE-LOW ] ).
    MESSAGE E004.
  ENDIF.
  IF S_OBJE-HIGH IS NOT INITIAL AND NOT LINE_EXISTS( GT_F4_OBJ[ OBJECT = S_OBJE-HIGH ] ).
    MESSAGE E004.
  ENDIF.

AT SELECTION-SCREEN ON S_LOBJ.
  IF S_LOBJ-LOW IS NOT INITIAL AND NOT LINE_EXISTS( GT_F4_LXE[ LXE_OBJTYPE = S_LOBJ-LOW ] ).
    MESSAGE E004.
  ENDIF.
  IF S_LOBJ-HIGH IS NOT INITIAL AND NOT LINE_EXISTS( GT_F4_LXE[ LXE_OBJTYPE = S_LOBJ-HIGH ] ).
    MESSAGE E004.
  ENDIF.

*AT SELECTION-SCREEN ON VALUE-REQUEST FOR <selection screen field>.     "Field F4
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILEN.
  PERFORM F4_FILE USING P_FILEN.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_OBJE-LOW .
  PERFORM F4_OBJECT.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_OBJE-HIGH .
  PERFORM F4_OBJECT.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_LOBJ-LOW.
  PERFORM F4_LXE_OBJTYPE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_LOBJ-HIGH.
  PERFORM F4_LXE_OBJTYPE.

"Start of Selection(F8)
START-OF-SELECTION.
  IF P_OBJ IS NOT INITIAL AND S_DEVC[] IS INITIAL.
    MESSAGE S055(00) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  PERFORM GET_DATA .

  IF P_FILEN IS NOT INITIAL.
    PERFORM EXCEL_UPLOAD.
  ENDIF.

"End of Selection(Screen Display)
END-OF-SELECTION.
  IF GT_DISP[] IS INITIAL.
    MESSAGE S005 DISPLAY LIKE 'E'.
  ELSE.
    PERFORM CM_ALV_REFRESH USING GO_GRID SPACE 'A'.
    CALL SCREEN 100.
  ENDIF.
*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS : ICON.
TABLES: SSCRFIELDS, LXE_ATTOB, TADIR, AGR_DEFINE.

TYPES: BEGIN OF T_OBJ_LXE_MAP,
  LXE_OBJTYPE   TYPE LXE_ATTOB-OBJ_TYPE,  "번역 오브젝트 유형
  KTEXT         TYPE LXE_ATTOBT-KTEXT,
  OBJECT        TYPE TADIR-OBJECT,        "오브젝트 유형
  OBJECT_T      TYPE AS4TEXT,
  END OF T_OBJ_LXE_MAP.

TYPES: BEGIN OF T_OBJ_F4,
  OBJECT        TYPE TADIR-OBJECT,        "오브젝트 유형
  OBJECT_T      TYPE AS4TEXT,
  END OF T_OBJ_F4.
TYPES: BEGIN OF T_LXE_F4,
  LXE_OBJTYPE   TYPE LXE_ATTOB-OBJ_TYPE,
  KTEXT         TYPE LXE_ATTOBT-KTEXT,
  END OF T_LXE_F4.

TYPES: BEGIN OF T_LXE_OBJECT,
  DEVCLASS TYPE DEVCLASS,      "개발클래스
  OBJECT    TYPE TADIR-OBJECT,   "오브젝트 유형
  OBJ_NAME  TYPE TADIR-OBJ_NAME, "오브젝트
  OBJ_DESC  TYPE AS4TEXT,         "오브젝트 내역
  LXE_OBJTYPE  TYPE LXE_ATTOB-OBJ_TYPE,   "번역 오브젝트 유형
  LXE_KTEXT    TYPE AS4TEXT,     "번역 오브젝트 유형 내역
  LXE_OBJNAME  TYPE LXEOBJNAME,           "번역 오브젝트
  TEXTKEY  TYPE LXE_PCX_S1-TEXTKEY,   "번역 오브젝트 텍스트 키
  M_LANG   TYPE TADIR-MASTERLANG,         "Master Language
  S_LANG   TYPE T002-SPRAS,                    "Source Language
  S_TEXT   TYPE LXE_PCX_S1-S_TEXT,
  T_LANG   TYPE T002-SPRAS,    "Target Language
  T_TEXT   TYPE LXE_PCX_S1-T_TEXT,
  END OF T_LXE_OBJECT.

TYPES: BEGIN OF T_DISP.
  INCLUDE TYPE T_LXE_OBJECT.
  TYPES: LXE_COLLNAME  TYPE LXECOLLNAM,     "언어 컬렉션
         STATUS        TYPE ICONNAME,
         MESSAGE       TYPE BAPI_MSG.
  TYPES: INFO_FIELD(4) TYPE C,
         EXCP_FIELD    TYPE C,
  END OF T_DISP.

DATA: GT_DISP TYPE STANDARD TABLE OF T_DISP WITH EMPTY KEY WITH NON-UNIQUE SORTED KEY EXCP COMPONENTS EXCP_FIELD,
      GS_DISP LIKE LINE OF GT_DISP.

DATA: GT_OBJ_LXE_MAP TYPE SORTED TABLE OF T_OBJ_LXE_MAP WITH UNIQUE KEY OBJECT LXE_OBJTYPE,
      GT_F4_OBJ TYPE STANDARD TABLE OF T_OBJ_F4,
      GT_F4_LXE TYPE STANDARD TABLE OF T_LXE_F4.

DATA: GT_EXCEL  TYPE STANDARD TABLE OF T_LXE_OBJECT.

DATA: GR_OBJECT TYPE RANGE OF TADIR-OBJECT,
      GR_LXE_OBJTYPE TYPE RANGE OF LXE_ATTOB-OBJ_TYPE.

DATA: GV_SLANG    TYPE LXEISOLANG,
      GV_TLANG    TYPE LXEISOLANG.

DATA: GT_STATUS_EXCLUDE TYPE TABLE OF SY-UCOMM.
DATA: OK_CODE TYPE SY-UCOMM.

*-----------------------------------------------------------------------
* ALV Global Variants
*-----------------------------------------------------------------------
CONSTANTS: GC_HANDLE_0100 TYPE SLIS_HANDL VALUE '0100'.

*-----------------------------------------------------------------------
* DEFINE
*-----------------------------------------------------------------------
DEFINE _MAKE_RANGE.
  &1-SIGN      = &2.
  &1-OPTION    = &3.
  &1-LOW       = &4.
  &1-HIGH      = &5.
  APPEND &1. CLEAR &1.
END-OF-DEFINITION.

DEFINE _EXCP_FIELD.
  &3 = COND #( WHEN &2 IS INITIAL THEN '1'
               WHEN &1 EQ &2 THEN '2'
               ELSE '3' ).
END-OF-DEFINITION.

*-----------------------------------------------------------------------
* SELECTION-SCREEN
*-----------------------------------------------------------------------
SELECTION-SCREEN FUNCTION KEY 1.    "Function Key1 (SSCRFIELDS-FUNCTXT_01)

SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-BL1.
  PARAMETERS: P_OBJ RADIOBUTTON GROUP RB1 USER-COMMAND RB1,
              P_ROL RADIOBUTTON GROUP RB1.

SELECTION-SCREEN END OF BLOCK BL1.

SELECTION-SCREEN BEGIN OF BLOCK BL2 WITH FRAME TITLE TEXT-BL2.
  SELECT-OPTIONS: S_DEVC FOR TADIR-DEVCLASS     MODIF ID OB0,        " Package
                  S_OBJE FOR TADIR-OBJECT       MODIF ID OB1,        " 오브젝트 유형
                  S_NAME FOR TADIR-OBJ_NAME     MODIF ID OB1.        " 오브젝트
  PARAMETERS      P_OBJE TYPE TADIR-OBJECT DEFAULT 'ACGR'      MODIF ID RO2.
  SELECT-OPTIONS: S_ROLL FOR AGR_DEFINE-AGR_NAME  MODIF ID RO1,      " ROLL
                  S_USER FOR TADIR-AUTHOR,                           " 오브젝트 생성자
                  S_LOBJ FOR LXE_ATTOB-OBJ_TYPE MODIF ID OB1.        " 번역 오브젝트 유형
  PARAMETERS      P_LOBJ TYPE LXE_ATTOB-OBJ_TYPE DEFAULT 'ACGR'      MODIF ID RO2.

  SELECTION-SCREEN SKIP .
  PARAMETERS: P_SLANG TYPE T002-SPRAS OBLIGATORY,     " Source Language
              P_TLANG TYPE T002-SPRAS OBLIGATORY,     " Target Language
              P_FILEN LIKE RLGRAP-FILENAME MODIF ID UPL,
              P_CHECK AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK BL2.
*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_ALV
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*       ALV 툴바에 버튼 추가
*----------------------------------------------------------------------*
FORM HANDLE_TOOLBAR      USING ALV_ID       "각 ALV 구분을 위한 값
                               E_OBJECT  Type Ref To CL_ALV_EVENT_TOOLBAR_SET
                               E_INTERACTIVE Type  CHAR01.
  CASE ALV_ID.
    WHEN GC_HANDLE_0100.
      APPEND VALUE #( BUTN_TYPE = 0
                      FUNCTION  = 'EXCEL'
                      ICON      = ICON_XLS
                      QUICKINFO = SWITCH #( SY-LANGU WHEN '3' THEN '엑셀' ELSE 'Excel' )
                      TEXT      = SWITCH #( SY-LANGU WHEN '3' THEN '엑셀 다운로드' ELSE 'Download Excel' ) ) TO E_OBJECT->MT_TOOLBAR.
      APPEND VALUE #( BUTN_TYPE = 3 ) TO E_OBJECT->MT_TOOLBAR.
      APPEND VALUE #( BUTN_TYPE = 0                     "0 : 버튼, 3 : Separator
                      FUNCTION  = 'CP_TEXT'             "ALV User-Command 의 E_UCOMM 값
                      ICON      = ICON_SYSTEM_COPY      "버튼에 표시할 아이콤
                      QUICKINFO = SWITCH #( SY-LANGU WHEN '3' THEN '텍스트 복사' ELSE 'Text Copy' )                "툴팁
                      TEXT      = SWITCH #( SY-LANGU WHEN '3' THEN '선택 텍스트 복사' ELSE 'Copy selected text' ) ) TO E_OBJECT->MT_TOOLBAR.
      APPEND VALUE #( BUTN_TYPE = 0
                      FUNCTION  = 'SAVE'
                      ICON      = ICON_SYSTEM_SAVE
                      QUICKINFO = SWITCH #( SY-LANGU WHEN '3' THEN '저장' ELSE 'Save' )
                      TEXT      = SWITCH #( SY-LANGU WHEN '3' THEN '선택 항목 저장' ELSE 'Save selected rows' ) ) TO E_OBJECT->MT_TOOLBAR.
      APPEND VALUE #( BUTN_TYPE = 3 ) TO E_OBJECT->MT_TOOLBAR.
      APPEND VALUE #( BUTN_TYPE = 0
                      FUNCTION  = 'REFRESH'
                      ICON      = ICON_REFRESH
                      QUICKINFO = SWITCH #( SY-LANGU WHEN '3' THEN '새로고침' ELSE 'Refresh' )
                      TEXT      = SWITCH #( SY-LANGU WHEN '3' THEN '새로고침' ELSE 'Refresh' ) ) TO E_OBJECT->MT_TOOLBAR.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*       ALV User Command
*----------------------------------------------------------------------*
FORM HANDLE_USER_COMMAND USING ALV_ID      "각 ALV 구분을 위한 값
                               E_UCOMM TYPE SY-UCOMM.
  CASE ALV_ID.
    WHEN GC_HANDLE_0100.
      GO_GRID->CHECK_CHANGED_DATA( ).
      GO_GRID->GET_SELECTED_ROWS( IMPORTING ET_INDEX_ROWS = DATA(LT_ROWS) ).
      DELETE LT_ROWS WHERE ROWTYPE IS NOT INITIAL.

      DATA: LS_ROWS LIKE LINE OF LT_ROWS,
            LV_ANSWER TYPE C.
      FIELD-SYMBOLS <LFS_DISP> LIKE LINE OF GT_DISP.

      CASE E_UCOMM.
        WHEN 'CP_TEXT'.
          IF LT_ROWS[] IS INITIAL.
            MESSAGE S006 DISPLAY LIKE 'E'.
            EXIT.
          ENDIF.

          LOOP AT LT_ROWS INTO LS_ROWS.
            READ TABLE GT_DISP ASSIGNING <LFS_DISP> INDEX LS_ROWS-INDEX.
            IF SY-SUBRC NE 0.
              CONTINUE.
            ENDIF.
            <LFS_DISP>-T_TEXT = <LFS_DISP>-S_TEXT.
          ENDLOOP.

        WHEN 'SAVE'.
          IF LT_ROWS[] IS INITIAL.
            MESSAGE S006 DISPLAY LIKE 'E'.
            EXIT.
          ENDIF.

          PERFORM SAVE_TRANSLATE USING LT_ROWS.
        WHEN 'EXCEL'.
          GT_EXCEL = CORRESPONDING #( GT_DISP ).
          "엑셀 다운로드
          ZCL_ITAB_TO_EXCEL=>DOWNLOAD( EXPORTING IT_ITAB      = GT_EXCEL
                                                 IT_FIELDCAT  = GT_FIELD_CAT
                                                 IV_AUTO_OPEN = 'X' ).
          EXIT.

        WHEN 'REFRESH'.
          CLEAR LT_ROWS.
          PERFORM GET_DATA.
          GO_GRID->SET_GRIDTITLE( GV_GRID_TITLE ).
      ENDCASE.

      PERFORM CM_ALV_REFRESH USING GO_GRID ' ' 'A'.

      IF LT_ROWS[] IS NOT INITIAL.
        GO_GRID->SET_SELECTED_ROWS( EXPORTING IT_INDEX_ROWS = LT_ROWS ).
      ENDIF.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  HANDLE_ONF4
*&---------------------------------------------------------------------*
*       ALV Field F4
*----------------------------------------------------------------------*
FORM HANDLE_ONF4                    USING ALV_ID      "각 ALV 구분을 위한 값
                                          E_FIELDNAME  Type  LVC_FNAME
                                          E_FIELDVALUE Type  LVC_VALUE
                                          ES_ROW_NO    Type  LVC_S_ROID
                                          ER_EVENT_DATA  Type Ref To  CL_ALV_EVENT_DATA
                                          ET_BAD_CELLS  Type  LVC_T_MODI
                                          E_DISPLAY Type  CHAR01.

  DATA: LT_RETURN TYPE STANDARD TABLE OF DDSHRETVAL,
        LS_RETURN LIKE LINE OF LT_RETURN.
  FIELD-SYMBOLS : <LFT> TYPE LVC_T_MODI.

  "Event was Handled 속성
  ER_EVENT_DATA->M_EVENT_HANDLED = 'X'.

  CASE ALV_ID.
    WHEN GC_HANDLE_0100.
      CASE E_FIELDNAME.
        WHEN 'OBJECT'.
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              RETFIELD         = 'OBJECT'
              VALUE_ORG        = 'S'
            TABLES
              VALUE_TAB        = GT_F4_OBJ
              RETURN_TAB       = LT_RETURN
            EXCEPTIONS
              PARAMETER_ERROR  = 1
              NO_VALUES_FOUND  = 2
              OTHERS           = 3
            .
          IF SY-SUBRC <> 0.
           EXIT.
          ENDIF.
        WHEN 'LXE_OBJTYPE'.
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              RETFIELD         = 'LXE_OBJTYPE'
              VALUE_ORG        = 'S'
            TABLES
              VALUE_TAB        = GT_F4_LXE
              RETURN_TAB       = LT_RETURN
            EXCEPTIONS
              PARAMETER_ERROR  = 1
              NO_VALUES_FOUND  = 2
              OTHERS           = 3
            .
          IF SY-SUBRC <> 0.
           EXIT.
          ENDIF.
      ENDCASE.
  ENDCASE.

  IF E_DISPLAY NE 'X'.
    READ TABLE LT_RETURN INTO LS_RETURN INDEX 1.
    "탐색도움말에서 선택한 값으로 화면 업데이트
    ASSIGN ER_EVENT_DATA->M_DATA->* TO <LFT>.
    IF <LFT> IS ASSIGNED.
      APPEND VALUE #( ROW_ID    = ES_ROW_NO-ROW_ID
                      FIELDNAME = E_FIELDNAME
                      VALUE     = LS_RETURN-FIELDVAL ) TO <LFT>.
    ENDIF.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  CREATE_OBJECT_ALV_0100
*&---------------------------------------------------------------------*
*       Docking Container - Full screen
*----------------------------------------------------------------------*
FORM CREATE_OBJECT_ALV_0100 .
  CHECK GO_DOCKING_CONTAINER IS INITIAL.

  "Container Create
  PERFORM CM_CREATE_DOCKING_CONTAINER USING GO_DOCKING_CONTAINER  'TOP' 2000.

  "ALV Object Create
  PERFORM CM_CREATE_ALV_GRID USING GO_DOCKING_CONTAINER GO_GRID.

  "ALV Variant
  GS_VARIANT = VALUE #( REPORT    = SY-REPID
                        HANDLE    = GC_HANDLE_0100
                        USERNAME  = SY-UNAME ).

  "ALV LAUOUT
  GS_LAYOUT = VALUE #( ZEBRA      = ' '       "줄무늬 패턴
                       SEL_MODE   = 'A'       "선택 모드
                       CWIDTH_OPT = 'X'       "열너비 최적화
                       SMALLTITLE = 'X'       "작은 ALV 제목
                       GRID_TITLE = GV_GRID_TITLE
                       INFO_FNAME = 'INFO_FIELD'
                       EXCP_FNAME = 'EXCP_FIELD'
                       ).


  "Field Catalog - Default Values
  PERFORM CM_CREATE_FIELD_CAT_BY_ITAB USING GT_DISP CHANGING GT_FIELD_CAT.

  "ALV Function key Exclude
  PERFORM CM_SET_ALV_EXCLUDE_DEFAULT USING GT_EXCLUDE.

  "ALV Sort
  PERFORM CM_SET_ALV_SORT USING: GT_SORT  'DEVCLASS'  'X' SPACE SPACE,
                                 GT_SORT  'OBJECT'    'X' SPACE SPACE,
                                 GT_SORT  'OBJ_NAME'  'X' SPACE SPACE.

*S> 로컬 서브루틴 - 각 프로그램의 상황에 맞도록 로컬 서브루틴을 만들어서 진행
  "Field Catalog - User Define
  PERFORM SET_FIELD_CATALOG_0100 CHANGING GT_FIELD_CAT.

  "ALV F4 Fields
  PERFORM SET_ALV_F4_FIELD_0100 USING GO_GRID CHANGING GT_FIELD_CAT.
*E> 로컬 서브루틴

  "ALV의 초기 편집/조회 상태
*  GO_GRID->SET_READY_FOR_INPUT( 0 ).    "O : 조회, 1 : 편집

  "Event Handler
  PERFORM CM_SET_EVENT_HANDLER  USING GO_GRID GC_HANDLE_0100
                                      'X'     "TOOLBAR
                                      'X'     "USER_COMMAND
                                      ' '     "DATA_CHANGED
                                      ' '     "DATA_CHANGED_FINISHED
                                      ' '     "DOUBLE_CLICK
                                      ' '     "HOTSPOT_CLICK
                                      'X'     "ON_F4
                                      ' '     "BUTTON_CLICK
                                      ' '     "EVT_ENTER
                                      ' '    ."EVT_MODIFIED.

  PERFORM CM_DISPLAY_ALV_GRID USING GO_GRID      "ALV GRID
                                    GS_VARIANT   "ALV Variant
                                    'A'         "레이아웃 저장 옵션
                                    'X'        "기본 레이아웃 저장 여부
                                    GS_LAYOUT    "ALV Layout Setting
                                    GT_EXCLUDE   "ALV Function Key Exclude
                                    GT_DISP[]
                                    GT_FIELD_CAT
                                    GT_SORT.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_FIELD_CATALOG_0100
*&---------------------------------------------------------------------*
*       필드카타로그 수정
*----------------------------------------------------------------------*
FORM SET_FIELD_CATALOG_0100  CHANGING PT_FIELDCAT TYPE LVC_T_FCAT.
  LOOP AT PT_FIELDCAT ASSIGNING FIELD-SYMBOL(<LFS>).
    CASE <LFS>-FIELDNAME.
      WHEN 'LXE_COLLNAME'.
        <LFS>-TECH = 'X'.
      WHEN 'M_LANG'.
        <LFS>-EMPHASIZE = 'C500'.
      WHEN 'S_LANG'.
        <LFS>-COLTEXT = TEXT-F01.
        <LFS>-EMPHASIZE = 'C600'.
      WHEN 'S_TEXT'.
        <LFS>-COLTEXT = TEXT-F02.
      WHEN 'T_LANG'.
        <LFS>-COLTEXT = TEXT-F03.
        <LFS>-EMPHASIZE = 'C700'.
      WHEN 'T_TEXT'.
        <LFS>-COLTEXT = TEXT-F04.
        <LFS>-EDIT = 'X'.
      WHEN 'STATUS'.
        <LFS>-COLTEXT = TEXT-F05.
        <LFS>-JUST = 'C'.
    ENDCASE.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_ALV_F4_FIELD_0100
*&---------------------------------------------------------------------*
*       ALV 필드 탐색도움말 사용 필드 설정
*----------------------------------------------------------------------*
FORM SET_ALV_F4_FIELD_0100  USING    PO_GRID TYPE REF TO CL_GUI_ALV_GRID
                            CHANGING PT_FIELDCAT TYPE LVC_T_FCAT.
  DATA(LT_F4) = VALUE LVC_T_F4(
                              ( FIELDNAME = 'OBJECT' REGISTER = 'X' )  "탐색도움말을 사용할 필드
                              ( FIELDNAME = 'LXE_OBJTYPE' REGISTER = 'X' )
                              ).

  PO_GRID->REGISTER_F4_FOR_FIELDS( LT_F4 ).

  "필드카타로그에 f4availabl 설정
  LOOP AT LT_F4 INTO DATA(LS_F4).
    READ TABLE PT_FIELDCAT ASSIGNING FIELD-SYMBOL(<LFS>) WITH KEY FIELDNAME = LS_F4-FIELDNAME.
    IF SY-SUBRC EQ 0.
      <LFS>-F4AVAILABL = 'X'.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_C01
*&---------------------------------------------------------------------*
CLASS LCL_OBJECT DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF T_OBJLIST,
      DEVCLASS    TYPE DEVCLASS,
      OBJECT      TYPE TADIR-OBJECT,        "오브젝트 유형
      OBJ_NAME    TYPE TADIR-OBJ_NAME,      "오브젝트
      LXE_OBJNAME TYPE LXEOBJNAME,          "번역 오브젝트
      M_LANG      TYPE TADIR-MASTERLANG,    "Master Language
      END OF T_OBJLIST,
      TT_OBJLIST TYPE STANDARD TABLE OF T_OBJLIST WITH EMPTY KEY,
      TT_OBJLIST_SORT TYPE SORTED TABLE OF T_OBJLIST WITH NON-UNIQUE KEY OBJECT.

    TYPES: BEGIN OF T_OBJ_DESC,
      SPRAS     TYPE SPRAS,
      OBJECT    TYPE TROBJTYPE,
      OBJ_NAME  TYPE SOBJ_NAME,
      OBJ_DESC  TYPE REPTI,
      END OF T_OBJ_DESC,
    TT_OBJS TYPE SORTED TABLE OF T_OBJ_DESC WITH NON-UNIQUE KEY OBJECT,
    TT_OBJ_DESC TYPE STANDARD TABLE OF T_OBJ_DESC WITH EMPTY KEY.

    CLASS-METHODS: GET_OBJECT_LIST RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST_SORT,
                   GET_OBJECT_DESCRIPT RETURNING VALUE(ET_OBJ_DESC) TYPE TT_OBJ_DESC.
  PRIVATE SECTION.
    CLASS-DATA: LV_OBJECT       TYPE TADIR-OBJECT,
                LV_LXE_OBJNAME  TYPE LXEOBJNAME,
                LV_CHAR20       TYPE C LENGTH 20,
                LV_CHAR30       TYPE C LENGTH 30,
                LV_CHAR40       TYPE C LENGTH 40,
                ES_OBJLIST      TYPE T_OBJLIST.
    CLASS-METHODS: GET_TADIR_MAIN RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST,    "일반 오브젝트
                   GET_TADIR_FUNC RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST,    "펑션 모듈
                   GET_TADIR_MESS RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST,    "메시지
                   GET_TADIR_TADC RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST,    "Tables (Customizing - Maintenance
                   GET_TADIR_SCREEN RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST,    "Screen
                   GET_TADIR_ROLL RETURNING VALUE(ET_OBJLIST) TYPE TT_OBJLIST.    "Roll
ENDCLASS.
CLASS LCL_OBJECT IMPLEMENTATION.
  METHOD GET_OBJECT_LIST.
    DATA LT_OBJLIST TYPE TT_OBJLIST.
    LT_OBJLIST = GET_TADIR_MAIN( ).
    IF 'FUNC' IN GR_OBJECT.
      APPEND LINES OF GET_TADIR_FUNC( ) TO LT_OBJLIST.
    ENDIF.
    IF 'MESS' IN GR_OBJECT.
      APPEND LINES OF GET_TADIR_MESS( ) TO LT_OBJLIST.
    ENDIF.
    IF 'TABL' IN GR_OBJECT.
      APPEND LINES OF GET_TADIR_TADC( ) TO LT_OBJLIST.
    ENDIF.
    IF 'FUGR' IN GR_OBJECT OR 'PROG' IN GR_OBJECT.
      APPEND LINES OF GET_TADIR_SCREEN( ) TO LT_OBJLIST.
    ENDIF.
    IF 'ACGR' IN GR_OBJECT.
      APPEND LINES OF GET_TADIR_ROLL( ) TO LT_OBJLIST.
    ENDIF.

    ET_OBJLIST = CORRESPONDING #( LT_OBJLIST ).
  ENDMETHOD.

  METHOD GET_TADIR_MAIN.
    SELECT
      A~DEVCLASS,
      A~OBJECT,
      A~OBJ_NAME,
      A~OBJ_NAME    AS LXE_OBJNAME,
      A~MASTERLANG  AS M_LANG
    FROM TADIR AS A
    WHERE A~PGMID     EQ 'R3TR'
      AND A~OBJECT    IN @GR_OBJECT
      AND A~DEVCLASS  IN @S_DEVC
      AND A~OBJ_NAME  IN @S_NAME
      AND A~AUTHOR    IN @S_USER
      INTO CORRESPONDING FIELDS OF TABLE @ET_OBJLIST.
  ENDMETHOD.

  METHOD GET_TADIR_FUNC.
    SELECT
      A~DEVCLASS,
      'FUNC' AS OBJECT,
      A~OBJ_NAME,
      A~MASTERLANG  AS M_LANG,
      B~FUNCNAME
    FROM TADIR AS A
      INNER JOIN TFDIR AS B ON 'SAPL' && A~OBJ_NAME EQ B~PNAME
    WHERE A~PGMID     EQ 'R3TR'
      AND A~OBJECT    EQ 'FUGR'
      AND A~DEVCLASS  IN @S_DEVC
      AND B~FUNCNAME  IN @S_NAME
      AND A~AUTHOR    IN @S_USER
      AND ( B~FUNCNAME  LIKE 'Z%' OR B~FUNCNAME LIKE 'Y%' )
      INTO TABLE @DATA(LT_OBJLIST).
    LOOP AT LT_OBJLIST INTO DATA(LS_OBJLIST).
      ES_OBJLIST = CORRESPONDING #( LS_OBJLIST ).

      CONCATENATE LS_OBJLIST-FUNCNAME ES_OBJLIST-OBJ_NAME INTO ES_OBJLIST-LXE_OBJNAME RESPECTING BLANKS.
      ES_OBJLIST-OBJ_NAME = LS_OBJLIST-FUNCNAME.

      APPEND ES_OBJLIST TO ET_OBJLIST.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_TADIR_MESS.
    SELECT
      A~DEVCLASS,
      'MESS' AS OBJECT,
      A~OBJ_NAME,
      A~MASTERLANG  AS M_LANG,
      B~MSGNR
    FROM TADIR AS A
      INNER JOIN T100 AS B ON A~OBJ_NAME = B~ARBGB AND B~SPRSL = @P_SLANG
    WHERE A~PGMID     EQ 'R3TR'
      AND A~OBJECT    EQ 'MSAG'
      AND A~DEVCLASS  IN @S_DEVC
      AND A~OBJ_NAME  IN @S_NAME
*      AND ( A~OBJ_NAME LIKE 'Z%' OR A~OBJ_NAME LIKE 'Y%' )
      AND A~AUTHOR    IN @S_USER
      INTO TABLE @DATA(LT_OBJLIST).

    LOOP AT LT_OBJLIST INTO DATA(LS_OBJLIST).
      ES_OBJLIST = CORRESPONDING #( LS_OBJLIST ).

      LV_CHAR20 = ES_OBJLIST-OBJ_NAME.
      CONCATENATE LV_CHAR20 LS_OBJLIST-MSGNR INTO ES_OBJLIST-LXE_OBJNAME RESPECTING BLANKS.

      APPEND ES_OBJLIST TO ET_OBJLIST.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_TADIR_TADC.
    SELECT
      A~DEVCLASS,
      A~OBJECT,
      A~OBJ_NAME,
      A~OBJ_NAME    AS LXE_OBJNAME,
      A~MASTERLANG  AS M_LANG
    FROM TADIR AS A
    WHERE A~PGMID     EQ 'R3TR'
      AND A~OBJECT    EQ 'TABL'
      AND A~DEVCLASS  IN @S_DEVC
      AND A~OBJECT    IN @S_OBJE
      AND A~OBJ_NAME  IN @S_NAME
*      AND ( A~OBJ_NAME  LIKE 'Z%' OR A~OBJ_NAME  LIKE 'Y%' )
      AND A~AUTHOR    IN @S_USER
    INTO TABLE @DATA(LT_OBJLIST).

    LOOP AT LT_OBJLIST INTO DATA(LS_OBJLIST).
      ES_OBJLIST = CORRESPONDING #( LS_OBJLIST ).
      LV_CHAR30 = ES_OBJLIST-OBJ_NAME.
      CONCATENATE SY-MANDT LV_CHAR30 '+' INTO ES_OBJLIST-LXE_OBJNAME RESPECTING BLANKS.

      APPEND ES_OBJLIST TO ET_OBJLIST.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_TADIR_SCREEN. " Screen
    SELECT
      A~DEVCLASS,
      A~OBJECT,
      A~OBJ_NAME,
      A~OBJ_NAME    AS LXE_OBJNAME,
      A~MASTERLANG  AS M_LANG,
      B~PROG,
      B~DNUM
    FROM TADIR AS A
      INNER JOIN D020S AS B ON
        CASE WHEN A~OBJECT EQ 'FUGR' THEN 'SAPL' && A~OBJ_NAME ELSE A~OBJ_NAME END EQ B~PROG
    WHERE A~PGMID     EQ 'R3TR'
      AND A~OBJECT    IN @GR_OBJECT
      AND A~DEVCLASS  IN @S_DEVC
      AND A~OBJ_NAME  IN @S_NAME
*      AND ( A~OBJ_NAME LIKE 'Z%' OR A~OBJ_NAME LIKE 'Y%' )
      AND A~AUTHOR    IN @S_USER
      AND B~TYPE      NE 'S'
    INTO TABLE @DATA(LT_OBJLIST).

    LOOP AT LT_OBJLIST INTO DATA(LS_OBJLIST).
      ES_OBJLIST = CORRESPONDING #( LS_OBJLIST ).
      LV_CHAR40  = ES_OBJLIST-OBJ_NAME.
      CONCATENATE LV_CHAR40 LS_OBJLIST-DNUM INTO ES_OBJLIST-LXE_OBJNAME RESPECTING BLANKS.

      APPEND ES_OBJLIST TO ET_OBJLIST.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_TADIR_ROLL. " Role definition
    SELECT
      'ACGR'    AS OBJECT,
      AGR_NAME  AS OBJ_NAME
    FROM AGR_DEFINE
    WHERE AGR_NAME IN @S_ROLL
      AND AGR_NAME LIKE 'Z%'
      AND ( CREATE_USR IN @S_USER OR CHANGE_USR IN @S_USER )
    INTO TABLE @DATA(LT_OBJLIST).
    LOOP AT LT_OBJLIST INTO DATA(LS_OBJLIST).
      ES_OBJLIST = CORRESPONDING #( LS_OBJLIST ).
      CONCATENATE SY-MANDT ES_OBJLIST-OBJ_NAME INTO ES_OBJLIST-LXE_OBJNAME.

      APPEND ES_OBJLIST TO ET_OBJLIST.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_OBJECT_DESCRIPT.
    DATA LR_OBJ_NAME TYPE RANGE OF TRDIR-NAME.

    DATA(LT_DISP_DUP) = GT_DISP[].
    SORT LT_DISP_DUP BY OBJECT OBJ_NAME.
    DELETE ADJACENT DUPLICATES FROM LT_DISP_DUP COMPARING OBJECT OBJ_NAME.

    DATA(LT_OBJ) = CORRESPONDING TT_OBJS( LT_DISP_DUP ).

    LOOP AT LT_OBJ INTO DATA(LS_OBJ) GROUP BY ( OBJECT = LS_OBJ-OBJECT ) ASCENDING ASSIGNING FIELD-SYMBOL(<LFS_GROUP>).
      LR_OBJ_NAME[] = VALUE #( FOR LS IN GROUP <LFS_GROUP> ( SIGN = 'I' OPTION  = 'EQ' LOW = LS-OBJ_NAME ) ).

      "오브젝트별 텍스트 조회
      CASE <LFS_GROUP>-OBJECT.
        WHEN 'DEVC'.  "Package
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRAS AS SPRAS,
            DEVCLASS AS OBJ_NAME,
            CTEXT AS OBJ_DESC
          FROM TDEVCT AS A
          WHERE DEVCLASS  IN @LR_OBJ_NAME
            AND SPRAS IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'PROG'.  "Program
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRSL AS SPRAS,
            NAME AS OBJ_NAME,
            TEXT AS OBJ_DESC
          FROM TRDIRT AS A
          WHERE NAME  IN @LR_OBJ_NAME
            AND SPRSL IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'FUGR'.  "Function Group
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRAS,
            AREA AS OBJ_NAME,
            AREAT AS OBJ_DESC
          FROM TLIBT
          WHERE AREA  IN @LR_OBJ_NAME
            AND SPRAS IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'FUNC'.  "Function Module
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRAS,
            FUNCNAME AS OBJ_NAME,
            STEXT AS OBJ_DESC
          FROM TFTIT
          WHERE FUNCNAME  IN @LR_OBJ_NAME
            AND SPRAS IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'MSAG' OR 'MESS'.  " Message Class
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRSL AS SPRAS,
            ARBGB AS OBJ_NAME,
            STEXT AS OBJ_DESC
          FROM T100T
          WHERE ARBGB IN @LR_OBJ_NAME
            AND SPRSL IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'TABL'.  " Table
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            TABNAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD02T
          WHERE TABNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'DTEL'.  " Data Element
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            ROLLNAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD04T
          WHERE ROLLNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'VIEW'.  " VIEW
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            VIEWNAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD25T
          WHERE VIEWNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'SHLP'.  "SEARCH HELP
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            SHLPNAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD30T
          WHERE SHLPNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'DOMA'.  "DOMAIN
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            DOMNAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD01T
          WHERE DOMNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'ENQU'.  "Lock Object
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            VIEWNAME  AS OBJ_NAME,
            DDTEXT   AS OBJ_DESC
          FROM DD25T
          WHERE VIEWNAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'TTYP'.  "Table Type
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            DDLANGUAGE AS SPRAS,
            TYPENAME AS OBJ_NAME,
            DDTEXT AS OBJ_DESC
          FROM DD40T
          WHERE TYPENAME IN @LR_OBJ_NAME
            AND DDLANGUAGE IN ( @SY-LANGU, 'E', '3' )
            AND AS4LOCAL   EQ 'A'
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'TRAN'.  "TRANSACTION
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRSL AS SPRAS,
            TCODE AS OBJ_NAME,
            TTEXT AS OBJ_DESC
          FROM TSTCT
          WHERE TCODE IN @LR_OBJ_NAME
            AND SPRSL IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'CLAS' OR 'INTF'.  "CLASS  "Interface (ABAP Objects)
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            LANGU AS SPRAS,
            CLSNAME AS OBJ_NAME,
            DESCRIPT AS OBJ_DESC
          FROM SEOCLASSTX
          WHERE CLSNAME IN @LR_OBJ_NAME
            AND LANGU IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'SSFO'.  "Smartform
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            LANGU AS SPRAS,
            FORMNAME  AS OBJ_NAME,
            CAPTION   AS OBJ_DESC
          FROM STXFADMT
          WHERE FORMNAME IN @LR_OBJ_NAME
            AND LANGU IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'PARA'.  "SPA/GPA Parameters
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRACHE AS SPRAS,
            PARAMID   AS OBJ_NAME,
            PARTEXT   AS OBJ_DESC
          FROM TPARAT
          WHERE PARAMID  IN @LR_OBJ_NAME
            AND SPRACHE IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'SHI3'.  "General structure storage: Definition of a structure
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            B~SPRAS,
            A~TREE_ID AS OBJ_NAME,
            B~TEXT    AS OBJ_DESC
          FROM TMENU01 AS A
            INNER JOIN TMENU01T AS B ON A~TREE_ID EQ B~TREE_ID
                                    AND A~EXTENSION EQ B~EXTENSION
                                    AND A~NODE_ID EQ B~NODE_ID
                                    AND A~EXT_KEY EQ B~EXT_KEY
          WHERE A~TREE_ID IN @LR_OBJ_NAME
            AND A~PARENT_ID EQ @SPACE
            AND B~SPRAS IN ( @SY-LANGU, 'E', '3' )
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

        WHEN 'ACGR'.  "Role
          SELECT @<LFS_GROUP>-OBJECT AS OBJECT,
            SPRAS AS SPRAS,
            AGR_NAME AS OBJ_NAME,
            TEXT AS OBJ_DESC
          FROM AGR_TEXTS
          WHERE AGR_NAME IN @LR_OBJ_NAME
            AND SPRAS IN ( @SY-LANGU, 'E', '3' )
            AND LINE EQ 0
          APPENDING CORRESPONDING FIELDS OF TABLE @ET_OBJ_DESC.

      ENDCASE.
    ENDLOOP.

    SORT ET_OBJ_DESC BY SPRAS OBJECT OBJ_NAME.
  ENDMETHOD.
ENDCLASS.

 

*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  INITIALIZATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM INITIALIZATION .
  SSCRFIELDS-FUNCTXT_01 = |{ ICON_TRANSPORT }Translation Export|.

  P_SLANG = SY-LANGU.
  P_TLANG = SWITCH #( SY-LANGU WHEN '3' THEN 'E' ELSE '3' ).
  P_OBJ = 'X'.

  "사용 가능 오브젝트
  GT_OBJ_LXE_MAP = VALUE #(
                      ( LXE_OBJTYPE = 'ACGR'  OBJECT = 'ACGR' ) " Roles
                      ( LXE_OBJTYPE = 'CA1'   OBJECT = 'FUGR' ) " Interface Texts (FUGR)
                      ( LXE_OBJTYPE = 'CA4'   OBJECT = 'PROG' ) " Interface Texts (PROG)
                      ( LXE_OBJTYPE = 'CAD1'  OBJECT = 'FUGR' ) " Developer Interface Docu (FUGR)
                      ( LXE_OBJTYPE = 'CAD4'  OBJECT = 'PROG' ) " Developer Interface Docu (PROG)
                      ( LXE_OBJTYPE = 'CLAS'  OBJECT = 'CLAS' ) " Classes
                      ( LXE_OBJTYPE = 'DEVC'  OBJECT = 'DEVC' ) " Packages
                      ( LXE_OBJTYPE = 'DOMA'  OBJECT = 'DOMA' ) " Domains
                      ( LXE_OBJTYPE = 'DTEL'  OBJECT = 'DTEL' ) " Data Elements
                      ( LXE_OBJTYPE = 'ENQU'  OBJECT = 'ENQU' ) " Lock Objects
                      ( LXE_OBJTYPE = 'FNC1'  OBJECT = 'FUNC' ) " Function
                      ( LXE_OBJTYPE = 'INTF'  OBJECT = 'INTF' ) " Class Interfaces
                      ( LXE_OBJTYPE = 'MESS'  OBJECT = 'MESS' ) " Messages
                      ( LXE_OBJTYPE = 'MSAG'  OBJECT = 'MSAG' ) " Message Classes
                      ( LXE_OBJTYPE = 'RPT1'  OBJECT = 'FUGR' ) " Text Elements (FUGR)
                      ( LXE_OBJTYPE = 'RPT4'  OBJECT = 'PROG' ) " Text Elements (PROG)
                      ( LXE_OBJTYPE = 'RPT8'  OBJECT = 'CLAS' ) " Text Elements (CLAS)
                      ( LXE_OBJTYPE = 'SCT1'  OBJECT = 'FUGR' ) " Screen Control (FUGR)
                      ( LXE_OBJTYPE = 'SCT4'  OBJECT = 'PROG' ) " Screen Control (PROG)
                      ( LXE_OBJTYPE = 'SGPA'  OBJECT = 'PARA' ) " SET/GET Parameters
                      ( LXE_OBJTYPE = 'SHI3'  OBJECT = 'SHI3' ) " Area Menu
                      ( LXE_OBJTYPE = 'SHLP'  OBJECT = 'SHLP' ) " Search Helps
*                      ( LXE_OBJTYPE = 'SOTR'  OBJECT = 'SOTR' ) " Web Dynpr(OTR Short Texts)
                      ( LXE_OBJTYPE = 'SRH1'  OBJECT = 'FUGR' ) " Screen Painter Headers (FUGR)
                      ( LXE_OBJTYPE = 'SRH4'  OBJECT = 'PROG' ) " Screen Painter Headers (PROG)
                      ( LXE_OBJTYPE = 'SRH8'  OBJECT = 'CLAS' ) " Screen Painter Headers (CLAS)
                      ( LXE_OBJTYPE = 'SRT1'  OBJECT = 'FUGR' ) " Screen Painter Texts (FUGR)
                      ( LXE_OBJTYPE = 'SRT4'  OBJECT = 'PROG' ) " Screen Painter Texts (PROG)
                      ( LXE_OBJTYPE = 'SRT8'  OBJECT = 'CLAS' ) " Screen Painter Texts (CLAS)
                      ( LXE_OBJTYPE = 'TABT'  OBJECT = 'TABL' ) " Table Descriptions
                      ( LXE_OBJTYPE = 'TADC'  OBJECT = 'TABL' ) " Tables 값, 언어키별 테이블 값
                      ( LXE_OBJTYPE = 'TRAN'  OBJECT = 'TRAN' ) " Transaction
                      ( LXE_OBJTYPE = 'TTYP'  OBJECT = 'TTYP' ) " Table Types
                      ( LXE_OBJTYPE = 'VALU'  OBJECT = 'DOMA' ) " Fixed Values for Domains
                      ( LXE_OBJTYPE = 'VIEW'  OBJECT = 'VIEW' ) " View
                      ( LXE_OBJTYPE = 'SSF'   OBJECT = 'SSFO' ) " Smartform
                        ).

  DATA LT_OBJECT_TEXT TYPE TABLE OF KO100.
  CALL FUNCTION 'TR_OBJECT_TABLE'
    TABLES
      WT_OBJECT_TEXT       = LT_OBJECT_TEXT.
            .
  SORT LT_OBJECT_TEXT BY OBJECT.

  SELECT OBJ_TYPE, KTEXT FROM LXE_ATTOBT WHERE LANG EQ @SY-LANGU INTO TABLE @DATA(LT_LXE_ATTOBT).
  SORT LT_LXE_ATTOBT BY OBJ_TYPE.

  LOOP AT GT_OBJ_LXE_MAP ASSIGNING FIELD-SYMBOL(<LFS>).
    READ TABLE LT_OBJECT_TEXT INTO DATA(LS_OBJECT_TEXT) WITH KEY OBJECT = <LFS>-OBJECT BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      <LFS>-OBJECT_T = LS_OBJECT_TEXT-TEXT.
    ENDIF.
    READ TABLE LT_LXE_ATTOBT INTO DATA(LS_LXE_ATTOBT) WITH KEY OBJ_TYPE = <LFS>-LXE_OBJTYPE BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      <LFS>-KTEXT = LS_LXE_ATTOBT-KTEXT.
    ENDIF.
  ENDLOOP.

  GT_F4_OBJ = CORRESPONDING #( GT_OBJ_LXE_MAP ).
  SORT GT_F4_OBJ. DELETE ADJACENT DUPLICATES FROM GT_F4_OBJ COMPARING ALL FIELDS.
  GT_F4_LXE = CORRESPONDING #( GT_OBJ_LXE_MAP ).
  SORT GT_F4_LXE. DELETE ADJACENT DUPLICATES FROM GT_F4_LXE COMPARING ALL FIELDS.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  AT_SELECTION_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM AT_SELECTION_SCREEN_OUTPUT .
  LOOP AT SCREEN.

    CHECK SCREEN-GROUP1 IS NOT INITIAL.
    IF SCREEN-GROUP1 EQ 'OB0'.
      SCREEN-REQUIRED = '2'.
    ENDIF.
    IF SCREEN-GROUP1 EQ 'RO2'.
      SCREEN-INPUT = '0'.
    ENDIF.

    CASE SCREEN-GROUP1.
      WHEN 'OB0' OR 'OB1'.
        SCREEN-ACTIVE = SWITCH #( P_OBJ WHEN 'X' THEN 1 ELSE 0 ).
      WHEN 'RO1' OR 'RO2'.
        SCREEN-ACTIVE = SWITCH #( P_ROL WHEN 'X' THEN 1 ELSE 0 ).
    ENDCASE.

    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  AT_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM AT_SELECTION_SCREEN .
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      CALL TRANSACTION 'SLXT'.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F4_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F4_FILE  USING    P_FILE.
  DATA: LT_FTAB TYPE FILETABLE,
        LV_RC   TYPE I.
  CLEAR LT_FTAB.

  CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(
    EXPORTING
      FILE_FILTER             = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      MULTISELECTION          = ABAP_FALSE
    CHANGING
      FILE_TABLE              = LT_FTAB
      RC                      = LV_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      others                  = 5
         ).
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.
  IF LT_FTAB[] IS NOT INITIAL.
    P_FILE = LT_FTAB[ 1 ]-FILENAME.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .
  DATA: LT_PCX_S1   TYPE TABLE OF LXE_PCX_S1,
        LV_COLLNAM  TYPE LXECOLLNAM,
        LV_PSTATUS  TYPE LXESTATPRC.

  CLEAR: GT_DISP, GV_SLANG, GV_TLANG.
  CLEAR: GR_OBJECT, GR_LXE_OBJTYPE.

  "오브젝트 유형, 번역 오브젝트 유형 제한
  IF P_OBJ IS NOT INITIAL.  "ABAP OBJECT
    GR_OBJECT = VALUE #( FOR LS IN GT_OBJ_LXE_MAP
                         WHERE ( OBJECT IN S_OBJE AND LXE_OBJTYPE IN S_LOBJ AND OBJECT NE P_OBJE AND LXE_OBJTYPE NE P_LOBJ )
                       ( SIGN = 'I' OPTION = 'EQ'
                         LOW  = LS-OBJECT ) ).
    SORT GR_OBJECT. DELETE ADJACENT DUPLICATES FROM GR_OBJECT COMPARING ALL FIELDS.

    GR_LXE_OBJTYPE = VALUE #( FOR LS IN GT_OBJ_LXE_MAP
                              WHERE ( OBJECT IN S_OBJE AND LXE_OBJTYPE IN S_LOBJ AND OBJECT NE P_OBJE AND LXE_OBJTYPE NE P_LOBJ )
                            ( SIGN = 'I' OPTION = 'EQ'
                              LOW  = LS-LXE_OBJTYPE ) ).
    SORT GR_LXE_OBJTYPE. DELETE ADJACENT DUPLICATES FROM GR_LXE_OBJTYPE COMPARING ALL FIELDS.
  ELSE. "ROLL
    GR_OBJECT = VALUE #( ( SIGN = 'I' OPTION = 'EQ' LOW = P_OBJE ) ).
    GR_LXE_OBJTYPE = VALUE #( ( SIGN = 'I' OPTION = 'EQ' LOW = P_LOBJ ) ).
  ENDIF.

  IF GR_OBJECT[] IS INITIAL OR GR_LXE_OBJTYPE[] IS INITIAL.
    EXIT.
  ENDIF.

  "Languages in the Translation Environment
  SELECT
    R3_LANG,
    LANGUAGE
  FROM LXE_T002X
  WHERE R3_LANG IN ( @P_SLANG, @P_TLANG )
    AND IS_R3_LANG EQ 'X'
  INTO TABLE @DATA(LT_LXE_T002X).
  IF SY-SUBRC EQ 0.
    TRY.
      GV_SLANG = LT_LXE_T002X[ R3_LANG = P_SLANG ]-LANGUAGE.
      GV_TLANG = LT_LXE_T002X[ R3_LANG = P_TLANG ]-LANGUAGE.
    CATCH CX_SY_ITAB_LINE_NOT_FOUND INTO DATA(LV_CX).
      MESSAGE S000 WITH TEXT-E02 DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING .
    ENDTRY.
  ENDIF.

  DATA(LO_PROGRESS) = NEW ZCL_PROGRESS( 2 ).
  LO_PROGRESS->SET_STEP( 'Object Text Read' ).

  "번역 오브젝트별로 개별 오브젝트 조회
  DATA(LT_TADIR) = LCL_OBJECT=>GET_OBJECT_LIST( ).

  "번역 오브젝트 리스트
  LOOP AT GT_OBJ_LXE_MAP INTO DATA(LS_OBJ_LXE_MAP) WHERE LXE_OBJTYPE IN GR_LXE_OBJTYPE AND OBJECT IN GR_OBJECT.
    LOOP AT LT_TADIR INTO DATA(LS_TADIR) WHERE OBJECT EQ LS_OBJ_LXE_MAP-OBJECT.
      "번역 오브젝트
      IF LS_OBJ_LXE_MAP-LXE_OBJTYPE NE 'SSF'.   "번역 오브젝트 유형이 스마트폼이 아닌 경우
        CLEAR: LT_PCX_S1, LV_COLLNAM, LV_PSTATUS.

        " Source language -> Target language
        CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
          EXPORTING
            T_LANG                   = GV_TLANG
            S_LANG                   = GV_SLANG
            CUSTMNR                  = '999999'
            OBJTYPE                  = LS_OBJ_LXE_MAP-LXE_OBJTYPE
            OBJNAME                  = LS_TADIR-LXE_OBJNAME
            READ_ONLY                = 'X'
         IMPORTING
           COLLNAM                  = LV_COLLNAM
           PSTATUS                  = LV_PSTATUS
          TABLES
            LT_PCX_S1                = LT_PCX_S1
                  .
        LOOP AT LT_PCX_S1 INTO DATA(LS_PCX_S1).
          GS_DISP = CORRESPONDING #( LS_TADIR ).
          MOVE-CORRESPONDING LS_PCX_S1 TO GS_DISP.
          GS_DISP-LXE_OBJTYPE = LS_OBJ_LXE_MAP-LXE_OBJTYPE.
          GS_DISP-LXE_KTEXT   = LS_OBJ_LXE_MAP-KTEXT.

          GS_DISP-LXE_COLLNAME = LV_COLLNAM.

          " Web dynpro ## SOTR object# Alias# Textkey# ##
          IF LS_OBJ_LXE_MAP-LXE_OBJTYPE EQ 'SOTR'.
            GS_DISP-TEXTKEY = LS_TADIR-OBJ_NAME.
          ENDIF.

          "상태 표시
          _EXCP_FIELD GS_DISP-S_TEXT GS_DISP-T_TEXT GS_DISP-EXCP_FIELD.
          APPEND GS_DISP TO GT_DISP.
        ENDLOOP.
      ELSE.   "스마트폼일 경우
        SELECT DISTINCT
          A~FORMNAME AS LXE_OBJNAME,
          A~INAME,
          A~LINENR,
          A~TDFORMAT,
          COALESCE( T1~TDLINE, @SPACE ) AS S_TEXT,
          COALESCE( T2~TDLINE, @SPACE ) AS T_TEXT
        FROM  STXFTXT AS A
          LEFT OUTER JOIN STXFTXT AS T1 ON  A~TXTYPE  EQ T1~TXTYPE  AND A~FORMNAME  EQ T1~FORMNAME
                                        AND A~INAME   EQ T1~INAME   AND A~VARI      EQ T1~VARI
                                        AND A~LINENR  EQ T1~LINENR  AND T1~SPRAS    EQ @P_SLANG
          LEFT OUTER JOIN STXFTXT AS T2 ON  A~TXTYPE  EQ T2~TXTYPE  AND A~FORMNAME  EQ T2~FORMNAME
                                        AND A~INAME   EQ T2~INAME   AND A~VARI      EQ T2~VARI
                                        AND A~LINENR  EQ T2~LINENR  AND T2~SPRAS    EQ @P_TLANG
        WHERE A~FORMNAME EQ @LS_TADIR-OBJ_NAME
          AND A~SPRAS    IN ( @P_SLANG, @P_TLANG )
          AND A~TXTYPE   EQ 'F'
        INTO TABLE @DATA(LT_STXFTXT).

        LOOP AT LT_STXFTXT INTO DATA(LS_STXFTXT).
          GS_DISP = CORRESPONDING #( LS_TADIR ).
          GS_DISP-LXE_OBJTYPE = LS_OBJ_LXE_MAP-LXE_OBJTYPE.
          GS_DISP-LXE_KTEXT   = LS_OBJ_LXE_MAP-KTEXT.
          GS_DISP-S_TEXT      = LS_STXFTXT-S_TEXT.
          GS_DISP-T_TEXT      = LS_STXFTXT-T_TEXT.
          GS_DISP-LXE_OBJNAME = LS_STXFTXT-LXE_OBJNAME.

          CONCATENATE LS_STXFTXT-INAME LS_STXFTXT-LINENR LS_STXFTXT-TDFORMAT
                 INTO GS_DISP-TEXTKEY SEPARATED BY SPACE.

          "상태 표시
          _EXCP_FIELD GS_DISP-S_TEXT GS_DISP-T_TEXT GS_DISP-EXCP_FIELD.
          APPEND GS_DISP TO GT_DISP.
        ENDLOOP.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  "기 번역항목 제어
  IF P_CHECK IS NOT INITIAL.
    DELETE GT_DISP WHERE EXCP_FIELD EQ '3'.
  ENDIF.

  "건수 표시
  DATA: LV_CNT_R TYPE I VALUE IS INITIAL,
        LV_CNT_Y TYPE I VALUE IS INITIAL,
        LV_CNT_G TYPE I VALUE IS INITIAL.

  LO_PROGRESS->SET_STEP( 'Object Description Read' ).

  "오브젝트 내역
  DATA(LT_OBJ_DESC) = LCL_OBJECT=>GET_OBJECT_DESCRIPT( ).

  LOOP AT GT_DISP ASSIGNING FIELD-SYMBOL(<LFS_DISP>).
    LV_CNT_R = LV_CNT_R + SWITCH #( <LFS_DISP>-EXCP_FIELD WHEN '1' THEN 1 ELSE 0 ).
    LV_CNT_Y = LV_CNT_Y + SWITCH #( <LFS_DISP>-EXCP_FIELD WHEN '2' THEN 1 ELSE 0 ).
    LV_CNT_G = LV_CNT_G + SWITCH #( <LFS_DISP>-EXCP_FIELD WHEN '3' THEN 1 ELSE 0 ).

    READ TABLE LT_OBJ_DESC INTO DATA(LS_OBJ_DESC) WITH KEY SPRAS    = SY-LANGU
                                                           OBJECT   = <LFS_DISP>-OBJECT
                                                           OBJ_NAME = <LFS_DISP>-OBJ_NAME BINARY SEARCH.
    IF SY-SUBRC NE 0.
      READ TABLE LT_OBJ_DESC INTO LS_OBJ_DESC WITH KEY SPRAS    = '3'
                                                       OBJECT   = <LFS_DISP>-OBJECT
                                                       OBJ_NAME = <LFS_DISP>-OBJ_NAME BINARY SEARCH.
      IF SY-SUBRC NE 0.
        READ TABLE LT_OBJ_DESC INTO LS_OBJ_DESC WITH KEY SPRAS    = 'E'
                                                         OBJECT   = <LFS_DISP>-OBJECT
                                                         OBJ_NAME = <LFS_DISP>-OBJ_NAME BINARY SEARCH.
      ENDIF.
    ENDIF.
    IF SY-SUBRC EQ 0.
      <LFS_DISP>-OBJ_DESC = LS_OBJ_DESC-OBJ_DESC.
    ENDIF.
    <LFS_DISP>-S_LANG = P_SLANG.
    <LFS_DISP>-T_LANG = P_TLANG.
  ENDLOOP.

  SORT GT_DISP BY DEVCLASS OBJECT OBJ_NAME LXE_OBJTYPE LXE_OBJNAME TEXTKEY.

  MESSAGE S007 WITH CONV STRING( LINES( GT_DISP ) ) CONV STRING( LV_CNT_G ) CONV STRING( LV_CNT_Y ) CONV STRING( LV_CNT_R ) INTO GV_GRID_TITLE.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  F4_OBJECT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F4_OBJECT .
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD         = 'OBJECT'
      DYNPPROG         = SY-REPID
      DYNPNR           = SY-DYNNR
      DYNPROFIELD      = 'S_OBJE'
      VALUE_ORG        = 'S'
    TABLES
      VALUE_TAB        = GT_F4_OBJ
    EXCEPTIONS
      PARAMETER_ERROR  = 1
      NO_VALUES_FOUND  = 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.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F4_LXE_OBJTYPE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F4_LXE_OBJTYPE .
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD         = 'LXE_OBJTYPE'
      DYNPPROG         = SY-REPID
      DYNPNR           = SY-DYNNR
      DYNPROFIELD      = 'S_LOBJ'
      VALUE_ORG        = 'S'
    TABLES
      VALUE_TAB        = GT_F4_LXE
    EXCEPTIONS
      PARAMETER_ERROR  = 1
      NO_VALUES_FOUND  = 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.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SAVE_TRANSLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SAVE_TRANSLATE USING PT_ROWS TYPE LVC_T_ROW.
  DATA: LS_STXFTXT TYPE STXFTXT,
        LS_LXE_LOG TYPE LXE_LOG.
  DATA: LV_LXESTATPRC TYPE LXESTATPRC,
        LT_LXE_PCX_S1 TYPE STANDARD TABLE OF LXE_PCX_S1.
  DATA: LV_ANSWER TYPE C,
        LV_CNT_E TYPE I,
        LV_CNT_S TYPE I.

  CALL FUNCTION 'POPUP_CONTINUE_YES_NO'
    EXPORTING
      TEXTLINE1           = TEXT-Q01
      TITEL               = TEXT-Q02
    IMPORTING
      ANSWER              = LV_ANSWER
            .
  CHECK LV_ANSWER EQ 'J'.

  CLEAR: LV_CNT_E, LV_CNT_S.

  DATA(LO_PROGRESS) = NEW ZCL_PROGRESS( LINES( PT_ROWS ) ).

  LOOP AT PT_ROWS INTO DATA(LS_ROWS).
    LO_PROGRESS->SET_PERCENT( TEXT-T01 ).
    READ TABLE GT_DISP ASSIGNING FIELD-SYMBOL(<LFS_DISP>) INDEX LS_ROWS-INDEX.
    IF SY-SUBRC NE 0.
      CONTINUE.
    ENDIF.

    IF <LFS_DISP>-LXE_OBJTYPE EQ 'SSF'. "SMARTFORM
      LS_STXFTXT = VALUE #( SPRAS    = <LFS_DISP>-T_LANG
                            TXTYPE   = 'F'
                            FORMNAME = <LFS_DISP>-LXE_OBJNAME
                            TDLINE   = <LFS_DISP>-T_TEXT ).

      SPLIT <LFS_DISP>-TEXTKEY AT SPACE INTO  LS_STXFTXT-INAME
                                          LS_STXFTXT-LINENR
                                          LS_STXFTXT-TDFORMAT
                                    IN CHARACTER MODE.

      LS_LXE_LOG = VALUE #( CUSTMNR   = '999999'
                            TARGLNG   = GV_TLANG
                            OBJTYPE   = <LFS_DISP>-LXE_OBJTYPE
                            OBJNAME   = <LFS_DISP>-LXE_OBJNAME
                            UNAME     = SY-UNAME
                            UDATE     = SY-DATLO
                            UTIME     = SY-TIMLO ).

      MODIFY STXFTXT FROM LS_STXFTXT.
      IF SY-SUBRC NE 0.
        ROLLBACK WORK.
        <LFS_DISP>-STATUS = ICON_MESSAGE_ERROR.
      ELSE.
        MODIFY LXE_LOG FROM LS_LXE_LOG.
        IF SY-SUBRC NE 0.
          ROLLBACK WORK.
          <LFS_DISP>-STATUS = ICON_MESSAGE_ERROR.
        ELSE.
          COMMIT WORK AND WAIT.
          <LFS_DISP>-STATUS = ICON_SYSTEM_OKAY.
        ENDIF.
      ENDIF.
    ELSE.
      CLEAR: LT_LXE_PCX_S1.

      CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
        EXPORTING
          T_LANG    = GV_TLANG
          S_LANG    = GV_SLANG
          CUSTMNR   = '999999'
          OBJTYPE   = <LFS_DISP>-LXE_OBJTYPE
          OBJNAME   = <LFS_DISP>-LXE_OBJNAME
          READ_ONLY = ''
        IMPORTING
          PSTATUS   = LV_LXESTATPRC
        TABLES
          LT_PCX_S1 = LT_LXE_PCX_S1.

      SORT LT_LXE_PCX_S1 BY TEXTKEY.
      READ TABLE LT_LXE_PCX_S1 ASSIGNING FIELD-SYMBOL(<LFS_PCX>) WITH KEY TEXTKEY = <LFS_DISP>-TEXTKEY BINARY SEARCH.
      IF SY-SUBRC EQ 0.
        <LFS_PCX>-T_TEXT = <LFS_DISP>-T_TEXT.
      ENDIF.
      CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE'
        EXPORTING
          T_LANG    = GV_TLANG
          S_LANG    = GV_SLANG
          CUSTMNR   = '999999'
          OBJTYPE   = <LFS_DISP>-LXE_OBJTYPE
          OBJNAME   = <LFS_DISP>-LXE_OBJNAME
        IMPORTING
          PSTATUS   = LV_LXESTATPRC
        TABLES
          LT_PCX_S1 = LT_LXE_PCX_S1.

      IF LV_LXESTATPRC EQ  'S'.
        <LFS_DISP>-STATUS = ICON_SYSTEM_OKAY.
      ELSE.
        <LFS_DISP>-STATUS = ICON_MESSAGE_ERROR.
      ENDIF.
    ENDIF.

    IF <LFS_DISP>-STATUS EQ ICON_SYSTEM_OKAY.
      <LFS_DISP>-MESSAGE = 'OK'.
      ADD 1 TO LV_CNT_S.
    ELSE.
      <LFS_DISP>-MESSAGE = 'ERROR'.
      ADD 1 TO LV_CNT_E.
    ENDIF.
  ENDLOOP.

  DATA(LV_MSGTY) = COND SY-MSGTY( WHEN LV_CNT_S > 0 AND LV_CNT_E > 0 THEN 'W'
                                  WHEN LV_CNT_E = 0 THEN 'S'
                                  ELSE 'E' ).
  MESSAGE I008 WITH CONV STRING( LV_CNT_E + LV_CNT_S ) CONV STRING( LV_CNT_S ) CONV STRING( LV_CNT_E ) DISPLAY LIKE LV_MSGTY.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  EXCEL_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EXCEL_UPLOAD .
  DATA: LV_END_COL TYPE I.

  LV_END_COL = LINES( CL_SALV_DDIC=>GET_BY_DATA( GT_EXCEL ) ).

  CLEAR GT_EXCEL.

  CALL FUNCTION 'ZCM_EXCEL_UPLAOD'
    EXPORTING
      I_FILENAME                = P_FILEN
      I_BEGIN_COL               = 1
      I_BEGIN_ROW               = 2
      I_END_COL                 = LV_END_COL
*     I_END_ROW                 =
*     I_FIELD_ELEMENT_MSG       = 'X'
*     I_ENABLE_CONV_EXIT        = 'X'
*     I_CHECK_CONV_EXIT         = ' '
*     I_STOP_FIRST_ERROR        = ' '
    TABLES
      OUTTAB                    = GT_EXCEL
*     INTERN                    =
            .
  IF GT_EXCEL[] IS INITIAL.
    EXIT.
  ENDIF.
  SORT GT_EXCEL BY DEVCLASS OBJECT OBJ_NAME LXE_OBJTYPE LXE_OBJNAME TEXTKEY.

  LOOP AT GT_DISP ASSIGNING FIELD-SYMBOL(<LFS_DISP>).
    READ TABLE GT_EXCEL INTO DATA(LS_EXCEL) WITH KEY  DEVCLASS = <LFS_DISP>-DEVCLASS
                                                      OBJECT   = <LFS_DISP>-OBJECT
                                                      OBJ_NAME = <LFS_DISP>-OBJ_NAME
                                                      LXE_OBJTYPE = <LFS_DISP>-LXE_OBJTYPE
                                                      LXE_OBJNAME = <LFS_DISP>-LXE_OBJNAME
                                                      TEXTKEY     = <LFS_DISP>-TEXTKEY BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      IF <LFS_DISP>-T_LANG EQ LS_EXCEL-T_LANG.
        <LFS_DISP>-T_TEXT = LS_EXCEL-T_TEXT.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_I01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100_EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100_EXIT INPUT.
  CASE OK_CODE.
    WHEN 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
  CLEAR OK_CODE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

ENDMODULE.
*&---------------------------------------------------------------------*
*&  Include           ZMASS_TRANSLATE_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS '100'.
  SET TITLEBAR '100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  CREATE_OBJECT_ALV_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE CREATE_OBJECT_ALV_0100 OUTPUT.
  PERFORM CREATE_OBJECT_ALV_0100.
ENDMODULE.
*GUI Texts
*----------------------------------------------------------
* 100 --> Mass Translation Editor
* 100 --> Mass Translation Editor

*Text elements
*----------------------------------------------------------
* BL1 선택조건
* BL2 조회조건
* E01 선택#가능한#오브젝트#타입이#없습니다
* E02 입력한 언어가 올바르지 않습니다
* F01 원어
* F02 원본 언어 텍스트
* F03 대어
* F04 대상 언어 텍스트
* F05 처리상태
* Q01 선택한 항목의 텍스트를 적용 하시겠습니까?
* Q02 질문
* T01 오브젝트 언어 업데이트


*Selection texts
*----------------------------------------------------------
* P_CHECK         기 번역항목 제거
* P_OBJ         ABAP Object
* P_ROL         Roll
* P_SLANG         원본 언어
* P_TLANG         대상 언어
* S_NAME         오브젝트이름
* P_FILEN D       .
* P_LOBJ D       .
* P_OBJE D       .
* S_DEVC D       .
* S_LOBJ D       .
* S_OBJE D       .
* S_ROLL D       .
* S_USER D       .


*Messages
*----------------------------------------------------------
*
* Message class: 00
*055   모든 필수 입력 필드에 값을 입력하십시오.
*
* Message class: YISPIMS01
*000   &1 &2 &3 &4
*004   입력값이 유효하지 않습니다
*005   데이터가 존재하지 않습니다
*006   선택한 항목이 없습니다
*007   Total: &1 , Green: &2 , Yellow: &3 , Red: &4
*008   &1 건의 데이터가 처리되었습니다(성공 : &2, 실패 : &3)

 

댓글