SAP ABAP 체크 ( 데이터 타입 숫자, 길이 등) 'NUMERIC_CHECK' , CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH


ABAP 개발 시에 엑셀로 데이터 대량 업로드 할 경우 저장하기 전에 필요한 유효성 체크를 해야한다.





  DATA GV_INDEX TYPE I"

  DATA LT_EXCEL LIKE TABLE OF KCDE_CELLS,
         LS_EXCEL LIKE KCDE_CELLS.


  DATA LV_LEN(3),
         LV_LEN2(3),
         LV_TYPE    TYPE DD01V-DATATYPE.

  FIELD-SYMBOLS <FS1>.

  CHECK P_FILE IS NOT INITIAL.

  "엑셀 데이터 변환 (엑셀데이터 -> LT_EXCEL)
  CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
    EXPORTING
      FILENAME                P_FILE "
      I_BEGIN_COL             1   "
      I_BEGIN_ROW             2   "
      I_END_COL               256
      I_END_ROW               60000
    TABLES
      INTERN                  LT_EXCEL
    EXCEPTIONS
      INCONSISTENT_PARAMETERS 1
      UPLOAD_OLE              2.

  IF LT_EXCEL IS INITIAL.

    MESSAGE '파일이 존재하지 않습니다.' TYPE 'W' DISPLAY LIKE 'E'.

  ENDIF.
  "------------------------------------------------------------------------"


  CLEAR GS_EXCEL,
          GT_EXCEL.

  "엑셀 데이터 -> 인터널 테이블
  LOOP AT LT_EXCEL INTO LS_EXCEL"
    CLEAR GV_INDEX.
    MOVE LS_EXCEL-COL TO GV_INDEX.

    " 대문자로 변환
    TRANSLATE LS_EXCEL-VALUE TO UPPER CASE.
    
    " 날짜, 계좌번호 , 사업자 번호 등의 숫자만 들어오도록 변환
    "여기서 COL 의 숫자는 엑셀의 몇번째 열인지 
    IF LS_EXCEL-COL OR LS_EXCEL-COL 4.

      REPLACE  ALL OCCURRENCES OF ',' IN LS_EXCEL-VALUE  WITH ' '.
      REPLACE  ALL OCCURRENCES OF '-' IN LS_EXCEL-VALUE  WITH ' '.
      REPLACE  ALL OCCURRENCES OF '.' IN LS_EXCEL-VALUE  WITH ' '.
      REPLACE  ALL OCCURRENCES OF '/' IN LS_EXCEL-VALUE  WITH ' '.
      CONDENSE LS_EXCEL-VALUE NO-GAPS

    ENDIF.

    ASSIGN COMPONENT GV_INDEX OF STRUCTURE GS_EXCEL TO <FS1>.
    MOVE LS_EXCEL-VALUE TO <FS1>.

*--------------------------------------------------------------------*
    AT END OF ROW" 인터널 테이블 추가
      APPEND GS_EXCEL TO GT_EXCEL.
      CLEAR :GS_EXCEL.
    ENDAT.
*--------------------------------------------------------------------*
    CLEAR LS_EXCEL.

  ENDLOOP.

  "ALV DISPLAY 가져온 엑셀 데이터를 보여줄 ALV 인터널 테이블로

  LOOP AT GT_EXCEL INTO GS_EXCEL.

*---데이터 길이 체크
" 저장할 필드의 길이가 제한되어 있을때 잘못된 데이터가 저장되지 않도록 체크

    CLEARLV_LEN.
    CALL METHOD CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
      EXPORTING
        FIELD GS_EXCEL-BNKN                         " Field "
      RECEIVING
        LEN   LV_LEN.            " Output Length "


    IF LV_LEN > 10 .
      GS_DISPLAY-MSG ' 길이가 14자리가 넘습니다.'.
    ENDIF.

*--------데이터 타입  확인
* 숫자만 해당되는 데이터의 경우 에러 체크
* 문자, 특수문자의 경우  LV_TYPE = 'CHAR' 로 출력
    CLEAR LV_TYPE.
    CALL FUNCTION 'NUMERIC_CHECK'
      EXPORTING
        STRING_IN GS_EXCEL-ZBNKN
      IMPORTING
*       STRING_OUT =
        HTYPE     LV_TYPE.

    
    IF LV_TYPE 'CHAR'.

       GS_DISPLAY-MSG ' 문자가 포함되어 있습니다.'.

    ENDIF.

    MOVE-CORRESPONDING GS_EXCEL TO GS_DISPLAY.
    APPEND GS_DISPLAY TO GT_DISPLAY.
    
    CLEAR GS_DISPLAY.
다음 이전