ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Z_MMZCL_CONV — 메소드별 로직 설명
    SAP/소스 2026. 5. 17. 21:33

    NUGG_Z_MMZCL_CONV.nugg
    0.13MB

     

     

    Z_MMZCL_CONV — 메소드별 로직 설명

    Z_MMZCL_CONV — 메소드별 로직 설명

    클래스: Z_MMZCL_CONV  |  메소드 수: 28  |  모듈: MM (Z)  |  개발자: DEVSDS009

    Z_MMZCL_CONV는 MM 모듈 커스텀 개발에서 공통으로 사용하는 데이터 형식 변환 유틸리티 클래스다. Alpha 변환, 금액·수량·날짜·시간 출력 포맷팅, JSON/OData 매핑, 암복호화 등 6개 그룹 28개 메소드로 구성된다.

    💡 Static 멤버 MS_CONVTYPE 를 미리 세팅하면 PRINT_OUT 계열 메소드에서 날짜·금액 등의 출력 포맷을 호출 시점에 일괄 제어할 수 있다. 기술하지 않으면 각 메소드의 Default 포맷(Type 1)이 적용된다.

    1. Alpha / Conv.EXIT 변환 4 메소드

    SAP Conversion Exit FM을 래핑하여 호출 코드를 단순화한 그룹.

    ALPHA_IN — Alpha Conv.EXIT Input

    표준 FM CONVERSION_EXIT_ALPHA_INPUT을 직접 래핑한다. 외부 입력 숫자 문자열의 불필요한 선행 공백·0을 제거하여 SAP 내부 형식으로 변환한다.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING  INPUT  = IV_IN
      IMPORTING  OUTPUT = EV_OUT.
    💡 구매오더 번호(EBELN), 자재 코드(MATNR) 등 ALPHA 도메인 필드 입력 전 필수 적용.

    ALPHA_OUT — Alpha Conv.EXIT Output

    CONVERSION_EXIT_ALPHA_OUTPUT을 래핑한다. 내부 숫자를 외부 표시용 자릿수 패딩 형식으로 변환한다 (예: 100000100).

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING  INPUT  = IV_IN
      IMPORTING  OUTPUT = EV_OUT.

    DYN_CONV_IN / DYN_CONV_OUT — 동적 Conv.EXIT

    EXIT 이름을 파라미터 IV_EXIT로 받아 런타임에 FM명을 조합·호출하는 범용 버전. ALPHA_IN/OUT처럼 하드코딩 없이 어떤 Conversion Exit도 처리 가능하다.

    1. IV_EXIT 값(예: 'ALPHA')을 받아 CONVERSION_EXIT_{EXIT}_INPUT 형태로 FM명 조합
    2. TFDIR SELECT SINGLE로 해당 FM 존재 여부 검증 (SY-SUBRC = 0 확인)
    3. 존재 시 CALL FUNCTION LV_FUNCNAME (동적 호출)
    4. 존재하지 않거나 CX_SY_DYN_CALL_ERROR 발생 시 조용히 EXIT (에러 미발생 설계)
    CONCATENATE  TEXT-001  IV_EXIT  TEXT-002  INTO  LV_FUNC.
    " → 'CONVERSION_EXIT_ALPHA_INPUT'
    
    SELECT SINGLE FUNCNAME FROM TFDIR WHERE FUNCNAME = @LV_FUNC
      INTO @DATA(LV_FUNCNAME).
    CHECK : SY-SUBRC = 0.
    
    TRY.
        CALL FUNCTION LV_FUNCNAME
          EXPORTING INPUT  = IV_IN
          IMPORTING OUTPUT = EV_OUT.
      CATCH CX_SY_DYN_CALL_ERROR.
        EXIT.
    ENDTRY.
    ⚠️ FM 미존재 시 에러 없이 종료되므로, EXIT 이름 오타 시 EV_OUT이 초기값으로 리턴된다. 호출 전 EXIT명 검증 권장.

    2. 금액 / 수량 / 숫자 변환 8 메소드

    OUT_CURR — 금액 출력 (DMBTR → Char)

    IV_TYPE 옵션으로 출력 포맷을 선택한다.

    IV_TYPE입력 예 (123.40)출력 결과
    1 (기본)123.4012,340
    212340
    312,340 KRW
    41만 2천원 (KRW 전용, 천원 단위)
    8일만 이천 삼백 사십 원정
    9일만이천삼백사십원정
    X입력값 그대로
    • IV_SPACE = 'X' 이면 값이 초기값일 때 빈 문자열 리턴 (Zero 숨김)
    • IV_SIGN = 'X' 이면 CLOI_PUT_SIGN_IN_FRONT로 부호를 맨 앞으로 이동

    OUT_QUAN — 수량 출력 (MENGE_D → Char)

    IV_UNIT으로 단위를 지정하고 WRITE ... UNIT 구문으로 소수점 자릿수를 제어한다. IV_DECIMAL을 설정하면 지정 자릿수만큼 잘라서 표시한다. 부호 처리 포함.

    WRITE : LV_IN  TO  RV_OUT  UNIT  IV_UNIT.       " Type 1: 구분자 포함
    WRITE : LV_IN  TO  RV_OUT  UNIT  IV_UNIT  NO-GROUPING.  " Type 2: 구분자 없음

    OUT_DEC — Decimal 출력

    BUX_DECIMAL_START FM으로 DB 내부 형식 소수값을 사람이 읽기 쉬운 구분자 포함 형식으로 변환한다. 소수부가 없으면 .00 표시를 생략한다.

    OUT_INT — Integer 출력

    WRITE ... TO 구문으로 천 단위 구분자를 붙여 문자열화. 단순하지만 부호 앞 이동 처리까지 포함.

    WRITE : IV_IN  TO  RV_OUT.   " → '12,345'
    CONDENSE : RV_OUT.
    
    IF IV_SIGN = 'X'.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING VALUE = RV_OUT.
    ENDIF.

    CURR_TO_EXT — 통화 Internal→External

    BAPI_CURRENCY_CONV_TO_EXTERN_9 호출. SAP 내부 저장 금액(정규화 값)을 외부 표시 금액으로 변환한다.

    CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERN_9'
      EXPORTING  CURRENCY        = LV_CURRENCY
                 AMOUNT_INTERNAL = LV_INTERNAL
      IMPORTING  AMOUNT_EXTERNAL = LV_EXTERNAL.

    CURR_TO_INT — 통화 External→Internal

    반대 방향 변환. 입력 문자열 정합성 검증 후 BAPI 호출.

    1. 입력값 Condense 후 CN ZGMM1_NUM_SIGN2 상수로 숫자·기호 이외 문자 포함 여부 검증
    2. 쉼표(,) 구분자 제거 후 재검증 → 유효하지 않으면 EXIT
    3. BAPI_CURRENCY_CONV_TO_INTERN_9 호출, MAX_NUMBER_OF_DIGITS = '17' 고정
    ⚠️ 유효하지 않은 입력값은 에러 없이 EXIT하므로 EV_OUT이 초기값으로 리턴된다.

    ROUND — 소수점 반올림/올림/버림

    SAP 표준 FM ROUND 래핑. IV_SIGN으로 처리 방식을 제어한다.

    IV_SIGN동작
    -버림
    +올림
    공백반올림 (상업적 반올림)

    입력값을 Float 타입으로 변환 후 FM 호출, 성공 시 EV_ROUND에 결과 저장.

    UNIT_CONV — 단위 변환

    수량 단위를 변환한다. IV_MATNR 유무에 따라 FM을 달리 호출한다.

    조건사용 FM
    자재 코드 없음UNIT_CONVERSION_SIMPLE (전역 기준)
    자재 코드 있음MARM(자재별 단위 변환) 기반 로직
    💡 IV_VALUE_IN 또는 IV_UNIT_IN이 초기값이면 CHECK로 즉시 종료된다.

    3. 날짜 / 시간 변환 6 메소드

    IN_DATE — Char → DATE (DATS) 변환

    다양한 포맷의 날짜 문자열을 SAP DATS(YYYYMMDD) 형식으로 정규화한다.

    1. Condense 후 이미 순수 8자리 숫자이면 즉시 리턴
    2. -, /, . 구분자를 SPACE로 일괄 치환
    3. 치환 후 길이가 8자리인 경우만 RV_OUT에 세팅
    4. 유효하지 않으면 초기값 유지 (에러 미발생)
    " ex) 2025-01-01 / 2025/01/01 / 2025.01.01  =>  20250101
    DATA(LV_DATE) = Z_MMZCL_CONV=>IN_DATE( IV_IN = LV_CHAR ).

    IN_TIME — Char → TIME (TIMS) 변환

    IN_DATE와 동일 패턴, 6자리(HHMMSS) 기준. :, /, . 구분자 제거.

    " ex) 12:01:01  =>  120101
    DATA(LV_TIME) = Z_MMZCL_CONV=>IN_TIME( IV_IN = LV_CHAR ).

    OUT_DATE — DATE → Char 출력

    IV_TYPE에 따라 출력 포맷을 선택한다. 초기값(00000000)이면 빈 문자열 리턴.

    IV_TYPE출력 예 (20250101)
    1 (기본)2025-01-01
    22025/01/01
    32025.01.01
    42025년 01월 01일
    52025년 01월 01일 수요일
    601/01
    701월 01일
    X그대로
    💡 IV_YY = 'X' 설정 시 년도를 2자리로 표시한다 (예: 25년 01월 01일).

    OUT_TIME — TIME → Char 출력

    12시간제(Type 5, 6)는 오전/오후 판단 로직을 직접 구현한다.

    WHEN '5'.
      IF      LV_TIME(2) = 12.   LV_FORMAT = TEXT-F09.  " 오후
      ELSEIF  LV_TIME(2) = 24.
        LV_TIME(2) = LV_TIME(2) - 24.  LV_FORMAT = TEXT-F10.  " 오전
      ELSEIF  LV_TIME(2) > 12.
        LV_TIME(2) = LV_TIME(2) - 12.  LV_FORMAT = TEXT-F09.  " 오후
      ELSE.                       LV_FORMAT = TEXT-F10.  " 오전
      ENDIF.
    IV_TYPE출력 예 (143000)
    1 (기본)14:30:00
    214/30/00
    314시 30분 00초
    414시 30분
    5오후 02:30:00
    602:30:00 오후

    TZ_LOC_TO_SYS — Local Time → System Time

    사용자 로컬 일시를 시스템(UTC) 기준 일시로 변환한다.

    1. Z_MMZCL_UTIL=>GET_TIMEZONE( IV_TYPE = 'S' )로 시스템 타임존 조회
    2. CS_CONV-DATLO + CS_CONV-TIMLO를 연결하여 Timestamp 생성
    3. CONVERT TIME STAMP 구문으로 변환 → DATUM, UZEIT에 결과 세팅
    CONVERT TIME STAMP CONV TIMESTAMP( LV_TS )
            TIME ZONE  LV_TIME_ZONE
            INTO DATE  CS_CONV-DATUM
                 TIME  CS_CONV-UZEIT.

    TZ_SYS_TO_LOC — System Time → Local Time

    반대 방향. GET_TIMEZONE( IV_TYPE = 'U', IV_USER = ... )사용자별 타임존을 조회하여 변환 → DATLO, TIMLO에 세팅.

    4. JSON / OData 변환 4 메소드

    DATA_TO_JSON — DATA → JSON 직렬화

    /UI2/CL_JSON=>SERIALIZE() 래핑. 파라미터 타입이 ANY이므로 구조체·테이블 모두 직렬화 가능하다. IV_COMPRESS = 'X'이면 공백 없이 압축된 JSON을 생성한다.

    DATA(LV_JSON) = Z_MMZCL_CONV=>DATA_TO_JSON(
                      IV_DATA     = LS_DATA
                      IV_COMPRESS = 'X' ).

    JSON_TO_DATA — JSON → DATA 역직렬화

    /UI2/CL_JSON=>DESERIALIZE() 래핑. IV_JSON이 초기값이면 CHECK로 즉시 종료. CV_DATACHANGING이므로 대상 구조체·테이블에 타입 캐스팅 없이 바로 역직렬화된다.

    ODATA_IN — OData→SAP 구조 매핑 (단건)

    OData Gateway로 수신한 GW 구조체를 SAP 내부 구조체로 타입 자동 인식 후 변환하는 핵심 메소드.

    1. STATICS LT_DFIES — 최초 1회만 CL_SALV_DDIC=>GET_BY_DATA()로 구조 메타 조회 (캐싱)
    2. IV_CLR = 'X'이면 Statics FREE 처리 (메모리 클리어)
    3. 필드별 루프에서 GW↔SAP 필드 동적 ASSIGN
    4. DATATYPE 기준 자동 변환 — DATSIN_DATE(), TIMSIN_TIME(), 금액→CURR_TO_INT()
    5. 변환 실패 시 ZMMZ01 클래스 E003 메시지 생성 → CT_ERR Append
    CASE LS_DFIES-DATATYPE.
      WHEN 'DATS'. <LV_SAP> = IN_DATE( <LV_GW> ).
      WHEN 'TIMS'. <LV_SAP> = IN_TIME( <LV_GW> ).
      WHEN 'CURR'. <LV_SAP> = CURR_TO_INT( ... ).
      WHEN OTHERS. <LV_SAP> = <LV_GW>.  " 기본: 직접 대입
    ENDCASE.

    ODATA_IN_TAB — OData→SAP 구조 매핑 (테이블)

    ODATA_IN의 테이블 버전. 루프로 ODATA_IN을 반복 호출한다.

    1. 동적으로 Line 타입 CREATE DATA 생성
    2. AT FIRST에서 IV_CLR = 'X' 자동 세팅 (첫 행에서만 Statics 초기화)
    3. CT_ERR[] 발생 시 CT_SAP[] CLEAREXIT — 부분 반영 방지
    4. 처리 완료 후 FREE LO_LINE / UNASSIGN 메모리 정리
    ⚠️ 에러 발생 시 이미 처리한 행도 포함하여 CT_SAP 전체를 CLEAR한다. 부분 성공은 허용하지 않는다.

    5. Print Out / 보안 변환 4 메소드

    PRINT_OUT — 구조체 출력 변환 (단건)

    SAP 내부 구조체의 숫자·날짜·금액 필드를 모두 Char 형으로 변환한 새로운 동적 구조체를 런타임에 생성하여 리턴한다.

    1. STATICS LO_STRUC, LT_DFIES 캐싱 (IV_CLR = 'X'로 클리어 가능)
    2. 내부 헬퍼 _PRT_DYN_STRU()로 변환 대상 필드 목록 + 동적 구조체 생성
    3. CREATE DATA EO_DATA TYPE HANDLE LO_STRUC로 런타임 타입 인스턴스 생성
    4. 필드별 DATATYPE 확인 → 해당 OUT_* 메소드 호출 후 동적 ASSIGN으로 세팅
    💡 MS_CONVTYPE Static 멤버를 미리 세팅해 두면 날짜·금액 등 출력 타입을 한 번에 제어할 수 있다.

    PRINT_OUT_TAB — 구조체 출력 변환 (테이블)

    PRINT_OUT의 테이블 버전. 동적 구조체 Line 타입으로 결과 테이블을 생성 후 루프 처리. 결과는 EO_DATA(REF TO DATA) 와 EV_JSON(JSON 문자열) 두 가지로 동시 리턴한다.

    MASS_DECR — 대량 복호화 (Q-Secure)

    CT_DATA 테이블의 지정 필드값을 일괄 복호화한다.

    1. CT_DATA 루프에서 IS_FLD-TAR 필드값 추출 → LT_DCRYP 수집
    2. SORT + DELETE ADJACENT DUPLICATES (중복 제거, 성능 최적화)
    3. ZQSECURE_MC_DECRYPT_FOR_CBO 호출로 대량 복호화
    4. 결과를 LT_MAPP 매핑 테이블로 받아 원본 CT_DATA에 Assign
    5. IS_FLD-RET(별도 출력 필드)가 있으면 해당 필드에 쓰고, 없으면 원 필드에 덮어씀
    "원필드 변경: IS_FLD = VALUE #( TAR = 'BANK'  COLNAME = 'ZBNKN' )
    "별도 출력: IS_FLD = VALUE #( TAR = 'BANK'  RET = 'BANK_OUT'  COLNAME = 'ZBNKN' )

    MASS_ENCR — 대량 암호화 (Q-Secure)

    MASS_DECR과 대칭 구조. 원문(LT_VALUE)을 수집 후 ZQSECURE_MC_ENCRYPT_FOR_CBO를 호출하여 원문↔암호문 매핑(LT_MAPP)을 받아 CT_DATA에 반영한다.

    6. Private 헬퍼 메소드 2 메소드

    _CHK_TABLE — SAP 테이블 존재 확인

    DD02L에서 TABNAME SELECT SINGLE. 존재하면 RV_OKAY = 'X' 리턴. _PRT_DYN_STRU 내부에서 필드의 테이블 참조 유효성 검사에 사용된다.

    SELECT SINGLE TABNAME FROM DD02L WHERE TABNAME = @IV_TAB
      INTO @DATA(LV_TAB).
    IF SY-SUBRC = 0. RV_OKAY = 'X'. ENDIF.

    _PRT_DYN_STRU — 동적 구조체 생성 (Print Out 핵심 헬퍼)

    PRINT_OUT / PRINT_OUT_TAB의 실질적 핵심 로직. 런타임에 필드 타입을 재정의한 구조체를 생성한다.

    1. CL_SALV_DDIC=>GET_BY_DATA()로 입력 데이터의 DFIES 목록 획득
    2. IT_EXCL 제외 필드 필터링 (루프 중 DELETE)
    3. IV_ALL_STR = 'X'이면 모든 필드 타입을 STRING으로 강제 지정
    4. CURR, QUAN, DATS, TIMS, DEC, INT*, NUMCZMM_TO_CHAR30 타입으로 교체
    5. 그 외 타입 → _CHK_TABLE()로 유효성 확인 후 테이블명-필드명 또는 ROLLNAME 기준으로 원래 타입 유지
    6. ABAP_COMPONENT_TAB 구성 → CL_ABAP_STRUCTDESCR=>CREATE()로 런타임 구조체 생성 → EO_STRUC 리턴
    CASE LS_DFIES-DATATYPE.
      WHEN 'CURR' OR 'QUAN' OR 'DATS' OR 'TIMS' OR 'DEC ' OR
           'INT1' OR 'INT2' OR 'INT4' OR 'INT8' OR 'NUMC'.
        LV_TYPE ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( 'ZMM_TO_CHAR30' ).
      WHEN OTHERS.
        " 테이블 유효성 확인 후 원래 타입 유지
        IF _CHK_TABLE( LS_DFIES-TABNAME ) IS NOT INITIAL.
          LV_FLD = |{ LS_DFIES-TABNAME }-{ LS_DFIES-FIELDNAME }|.
        ELSE.
          LV_FLD = |{ LS_DFIES-ROLLNAME }|.
        ENDIF.
        LV_TYPE ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( LV_FLD ).
    ENDCASE.

    7. 클래스 설계 특징 요약

    설계 패턴내용
    STATICS 캐싱 ODATA_IN, PRINT_OUT에서 DFIES/구조체 메타를 최초 1회만 조회. 반복 호출 시 SELECT 없이 재사용하여 성능 최적화.
    IV_CLR 클리어 패턴 테이블 루프 메소드에서 첫 행(AT FIRST)에 IV_CLR = 'X'를 자동 세팅하여 Statics를 클리어. 동일 프로그램에서 다른 구조체로 재호출 시 메타 재조회 보장.
    에러 무결성 OData 매핑 실패 시 CT_SAP[] 전체 CLEAR 후 리턴. 부분 데이터 반영으로 인한 데이터 정합성 오류 방지.
    ANY 타입 활용 DATA_TO_JSON / JSON_TO_DATAANY 타입으로 구조체·테이블 구분 없이 처리.
    동적 구조체 생성 _PRT_DYN_STRU가 런타임에 필드 타입을 재정의하여 JSON 직렬화 친화적 Char 기반 구조를 생성. 원본 구조체 수정 없이 출력 전용 구조체를 동적으로 파생.
    중복 제거 최적화 MASS_DECR / MASS_ENCR에서 SORT + DELETE ADJACENT DUPLICATES로 Q-Secure FM 호출 횟수 최소화.
    #SAP_ABAP #Z_MMZCL_CONV #변환유틸리티 #OData매핑 #동적구조체 #JSON직렬화 #금액변환 #날짜변환 #Q-Secure #MM커스텀
Designed by Tistory.