-
Z_MMZCL_CONV — 메소드별 로직 설명SAP/소스 2026. 5. 17. 21:33
Z_MMZCL_CONV — 메소드별 로직 설명 Z_MMZCL_CONV — 메소드별 로직 설명
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 OutputCONVERSION_EXIT_ALPHA_OUTPUT을 래핑한다. 내부 숫자를 외부 표시용 자릿수 패딩 형식으로 변환한다 (예:100→000100).CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING INPUT = IV_IN IMPORTING OUTPUT = EV_OUT.DYN_CONV_IN/DYN_CONV_OUT— 동적 Conv.EXITEXIT 이름을 파라미터
IV_EXIT로 받아 런타임에 FM명을 조합·호출하는 범용 버전.ALPHA_IN/OUT처럼 하드코딩 없이 어떤 Conversion Exit도 처리 가능하다.IV_EXIT값(예:'ALPHA')을 받아CONVERSION_EXIT_{EXIT}_INPUT형태로 FM명 조합TFDIRSELECT SINGLE로 해당 FM 존재 여부 검증 (SY-SUBRC = 0확인)- 존재 시
CALL FUNCTION LV_FUNCNAME(동적 호출) - 존재하지 않거나
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.40 12,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_STARTFM으로 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→ExternalBAPI_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 호출.
- 입력값 Condense 후
CN ZGMM1_NUM_SIGN2상수로 숫자·기호 이외 문자 포함 여부 검증 - 쉼표(
,) 구분자 제거 후 재검증 → 유효하지 않으면EXIT 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) 형식으로 정규화한다.- Condense 후 이미 순수 8자리 숫자이면 즉시 리턴
-,/,.구분자를 SPACE로 일괄 치환- 치환 후 길이가 8자리인 경우만
RV_OUT에 세팅 - 유효하지 않으면 초기값 유지 (에러 미발생)
" 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) 기준 일시로 변환한다.
Z_MMZCL_UTIL=>GET_TIMEZONE( IV_TYPE = 'S' )로 시스템 타임존 조회CS_CONV-DATLO+CS_CONV-TIMLO를 연결하여 Timestamp 생성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_DATA가CHANGING이므로 대상 구조체·테이블에 타입 캐스팅 없이 바로 역직렬화된다.ODATA_IN— OData→SAP 구조 매핑 (단건)OData Gateway로 수신한 GW 구조체를 SAP 내부 구조체로 타입 자동 인식 후 변환하는 핵심 메소드.
STATICS LT_DFIES— 최초 1회만CL_SALV_DDIC=>GET_BY_DATA()로 구조 메타 조회 (캐싱)IV_CLR = 'X'이면 StaticsFREE처리 (메모리 클리어)- 필드별 루프에서 GW↔SAP 필드 동적
ASSIGN DATATYPE기준 자동 변환 —DATS→IN_DATE(),TIMS→IN_TIME(), 금액→CURR_TO_INT()- 변환 실패 시
ZMMZ01클래스 E003 메시지 생성 →CT_ERRAppend
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을 반복 호출한다.- 동적으로 Line 타입
CREATE DATA생성 AT FIRST에서IV_CLR = 'X'자동 세팅 (첫 행에서만 Statics 초기화)CT_ERR[]발생 시CT_SAP[] CLEAR후EXIT— 부분 반영 방지- 처리 완료 후
FREE LO_LINE/UNASSIGN메모리 정리
⚠️ 에러 발생 시 이미 처리한 행도 포함하여CT_SAP전체를 CLEAR한다. 부분 성공은 허용하지 않는다.5. Print Out / 보안 변환 4 메소드
PRINT_OUT— 구조체 출력 변환 (단건)SAP 내부 구조체의 숫자·날짜·금액 필드를 모두 Char 형으로 변환한 새로운 동적 구조체를 런타임에 생성하여 리턴한다.
STATICS LO_STRUC, LT_DFIES캐싱 (IV_CLR = 'X'로 클리어 가능)- 내부 헬퍼
_PRT_DYN_STRU()로 변환 대상 필드 목록 + 동적 구조체 생성 CREATE DATA EO_DATA TYPE HANDLE LO_STRUC로 런타임 타입 인스턴스 생성- 필드별
DATATYPE확인 → 해당OUT_*메소드 호출 후 동적 ASSIGN으로 세팅
💡MS_CONVTYPEStatic 멤버를 미리 세팅해 두면 날짜·금액 등 출력 타입을 한 번에 제어할 수 있다.PRINT_OUT_TAB— 구조체 출력 변환 (테이블)PRINT_OUT의 테이블 버전. 동적 구조체 Line 타입으로 결과 테이블을 생성 후 루프 처리. 결과는EO_DATA(REF TO DATA) 와EV_JSON(JSON 문자열) 두 가지로 동시 리턴한다.MASS_DECR— 대량 복호화 (Q-Secure)CT_DATA테이블의 지정 필드값을 일괄 복호화한다.CT_DATA루프에서IS_FLD-TAR필드값 추출 →LT_DCRYP수집- SORT +
DELETE ADJACENT DUPLICATES(중복 제거, 성능 최적화) ZQSECURE_MC_DECRYPT_FOR_CBO호출로 대량 복호화- 결과를
LT_MAPP매핑 테이블로 받아 원본CT_DATA에 Assign 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에서TABNAMESELECT 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의 실질적 핵심 로직. 런타임에 필드 타입을 재정의한 구조체를 생성한다.CL_SALV_DDIC=>GET_BY_DATA()로 입력 데이터의 DFIES 목록 획득IT_EXCL제외 필드 필터링 (루프 중 DELETE)IV_ALL_STR = 'X'이면 모든 필드 타입을STRING으로 강제 지정CURR, QUAN, DATS, TIMS, DEC, INT*, NUMC→ZMM_TO_CHAR30타입으로 교체- 그 외 타입 →
_CHK_TABLE()로 유효성 확인 후테이블명-필드명또는ROLLNAME기준으로 원래 타입 유지 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_DATA는ANY타입으로 구조체·테이블 구분 없이 처리.동적 구조체 생성 _PRT_DYN_STRU가 런타임에 필드 타입을 재정의하여 JSON 직렬화 친화적 Char 기반 구조를 생성. 원본 구조체 수정 없이 출력 전용 구조체를 동적으로 파생.중복 제거 최적화 MASS_DECR/MASS_ENCR에서 SORT +DELETE ADJACENT DUPLICATES로 Q-Secure FM 호출 횟수 최소화.'SAP > 소스' 카테고리의 다른 글
Z_MYBATIS_TO_ABAP — 설계 및 설치 가이드 (0) 2026.05.27 ABAP — HTML/XML 속성값 추출 패턴 (0) 2026.05.27 AMDP SQLScript 날짜·시간 계산 함수 예제 (0) 2026.05.25 ABAP PascalCase 변환 — snake_case ↔ Table Field (0) 2026.05.19 YCHKOBJ (0) 2026.05.17