엑셀 데이터를 SAP 테이블에 업로드하는 4가지 방법 (LSMW · BDC · Migration Cockpit · ABAP 완전 정리)

SAP 프로젝트를 하다 보면 “이 엑셀 파일 좀 SAP에 넣어주세요”라는 요청을 반드시 받게 됩니다. 마스터 데이터 초기 이관, 코스트센터 매핑표, 계정 매핑 테이블, 벤더 목록… 상황은 다르지만 요구는 늘 같습니다.

문제는 SAP에는 “엑셀 업로드 버튼”이 없다는 것입니다. SAP는 데이터베이스 테이블에 직접 INSERT 하는 것을 기본적으로 막아두고 있고, 대신 여러 우회 경로를 제공합니다. 이 글에서는 그 경로 4가지를 초보자 기준으로 처음부터 끝까지 정리합니다.

전체 그림부터 보기

엑셀 파일 .xlsx / .csv / .txt ① LSMW 코딩 없이 14단계 마법사로 매핑 (ECC 전용) ② BDC (Batch Input) 화면 조작을 녹화해서 자동 반복 실행 ③ Migration Cockpit S/4HANA 표준 도구, 템플릿 엑셀 업로드 ④ ABAP 직접 개발 가장 유연, Z테이블 적재에 최적 SAP 테이블 표준 / Z테이블

핵심은 ①②는 화면(Dynpro)을 거쳐서 들어가고, ④는 테이블에 바로 쓴다는 점입니다. 이 차이가 뒤에서 설명할 모든 장단점을 만듭니다.

시작 전 반드시 알아야 할 개념 3가지

1) 표준 테이블 vs Z 테이블

구분예시직접 INSERT권장 방법
SAP 표준 테이블LFA1(벤더), CSKS(코스트센터), SKA1(계정)❌ 절대 금지LSMW / BDC / BAPI / Migration Cockpit
커스텀 Z 테이블ZTEST_TABLE, ZFI_MAPPING✅ 가능ABAP 직접 개발

표준 테이블에 직접 INSERT 하면 안 되는 이유는, SAP 표준 테이블 하나에 데이터를 넣을 때 연관된 테이블 10~20개가 동시에 갱신되기 때문입니다. 예를 들어 벤더 하나를 만들면 LFA1(일반), LFB1(회사코드), LFBK(은행), LFM1(구매조직)이 함께 생성되고 번호 채번 오브젝트도 증가합니다. 화면을 거치지 않고 LFA1에만 INSERT 하면 그 벤더는 조회는 되지만 전표 입력에서 오류가 나는 “유령 데이터”가 됩니다.

2) Dynpro(다인프로)와 화면 흐름

SAP의 화면 하나하나에는 프로그램명 + 화면번호가 붙어 있습니다. 예를 들어 SAPLF040 프로그램의 0302 화면 같은 식입니다. BDC는 “이 화면의 이 필드에 이 값을 넣고 엔터” 를 순서대로 재생하는 방식이라, 화면 순서가 하나라도 달라지면 바로 실패합니다.

No batch input data found for dynpro SAPLF040 0700. SAPLF040 0302 expected

이 유명한 오류 메시지가 정확히 그 상황입니다. 0302 화면이 나올 줄 알았는데 세금 관련 팝업인 0700이 먼저 떠서 흐름이 깨진 것입니다.

3) 배치 인풋 세션(Batch Input Session)

BDC와 LSMW가 만들어내는 결과물입니다. “화면 조작 명령어 묶음”을 큐에 넣어두고 SM35에서 나중에 실행하는 방식입니다. 즉시 실행이 아니라 큐에 쌓아두는 구조라서, 오류가 나도 해당 건만 남기고 나머지는 처리되며 나중에 재처리할 수 있다는 장점이 있습니다.

어떤 방법을 골라야 할까?

업로드 대상 테이블은? START SAP 표준 테이블 시스템이 S/4HANA 인가? YES Migration Cockpit LTMC / Migrate Your Data NO (ECC) LSMW 표준 오브젝트 / BAPI 사용 커스텀 Z 테이블 유지보수 화면(SM30)이 있나? YES BDC Recording SHDB로 SM30 화면 녹화 NO ABAP 직접 개발 GUI_UPLOAD + MODIFY 한 번만 쓰고 버릴 작업인가, 계속 반복할 작업인가? · 일회성 이관 → LSMW / Migration Cockpit (개발 없이 빠르게) · 현업이 매달 직접 올림 → ABAP 프로그램 (T-code 부여, 검증 로직 포함)

방법 ① LSMW — 코딩 없이 14단계로

LSMW(Legacy System Migration Workbench)는 ABAP을 몰라도 마법사 형태로 데이터를 이관할 수 있게 만든 SAP 표준 도구입니다.

⚠️ 먼저 알아두세요 LSMW는 SAP ECC 시대의 도구이고, S/4HANA에서는 공식 지원 대상이 아닙니다(SAP Note 2287723). 트랜잭션 자체는 열리지만 표준 오브젝트 대부분이 S/4HANA 데이터 모델과 맞지 않습니다. S/4HANA 프로젝트라면 방법 ③으로 바로 넘어가세요.

LSMW 14단계 전체 흐름

PHASE 1 · 구조 정의 (1~6단계) — 엑셀과 SAP를 어떻게 연결할지 설계 1. Maintain Object Attributes 임포트 방식 선택 (Recording/BAPI/IDoc) 2. Maintain Source Structures 엑셀 시트 구조 이름 정의 3. Maintain Source Fields 엑셀 각 열의 이름·타입·길이 4. Maintain Structure Relations 소스 ↔ 타겟 구조 연결 5. Field Mapping & Conversion ★ 가장 중요 — 필드별 매핑·변환 6. Fixed Values / Routines 고정값·코드 변환표 정의 PHASE 2 · 파일 연결 (7~8단계) — 실제 엑셀 파일 지정 7. Specify Files PC 경로 또는 서버 경로, 구분자·헤더 유무 설정 8. Assign Files 지정한 파일을 2단계 소스 구조에 할당 PHASE 3 · 읽기와 변환 (9~12단계) — 실행 전 검증 구간 9. Read Data 파일을 읽어 LSMW 임시영역에 적재 10. Display Read Data 건수·값 확인 (0건이면 7단계 설정 오류) 11. Convert Data 5·6단계 규칙을 적용해 SAP 형식으로 변환 12. Display Converted Data ★ 여기서 반드시 눈으로 검증하고 넘어갈 것 PHASE 4 · 실제 적재 (13~14단계) — 되돌릴 수 없는 구간 13. Create Batch Input Session SM35 큐에 세션 생성 (아직 DB 반영 안 됨) 14. Run Batch Input Session 세션 실행 → 이 시점에 DB에 반영

단계별 상세 따라하기

준비: 엑셀 파일 저장 방식

LSMW는 .xlsx를 직접 읽지 못합니다. 반드시 아래처럼 변환하세요.

  1. 엑셀에서 파일 → 다른 이름으로 저장
  2. 형식을 텍스트 (탭으로 분리) (*.txt) 로 선택
  3. 헤더 행은 남겨둬도 되지만, 7단계에서 “첫 행은 필드명” 옵션을 반드시 체크
  4. 한글이 있다면 저장 후 메모장에서 열어 UTF-8로 다시 저장
자주 하는 실수
❌ .xlsx 그대로 지정  → 9단계 Read Data에서 0건
❌ CSV(쉼표)로 저장   → 금액에 천단위 콤마가 있으면 열이 밀림
✅ 탭 구분 .txt + UTF-8

0단계: 프로젝트 생성

SAP GUI 명령창에 LSMW 입력 → 실행 → Create 버튼(흰 종이 아이콘)

Project    : ZTEST_PROJECT      (프로젝트 - 업무 단위)
Subproject : ZTEST_SUBPROJECT   (서브프로젝트 - 모듈 단위)
Object     : ZTEST_OBJECT       (오브젝트 - 실제 이관 단위)

세 개 모두 Z로 시작하는 이름을 쓰세요. 계층 구조는 프로젝트 > 서브프로젝트 > 오브젝트 이고, 실제 설정은 오브젝트 단위로 저장됩니다.

1단계: Maintain Object Attributes

여기가 초보자가 가장 많이 헷갈리는 곳입니다. 흔히 “업로드할 테이블 이름을 입력한다”고 알려져 있는데, 틀린 설명입니다. 이 화면에서 고르는 것은 테이블이 아니라 임포트 방식입니다.

옵션언제 쓰나
Standard Batch/Direct InputSAP가 미리 만들어둔 표준 오브젝트가 있을 때 (예: 벤더 마스터 0040)
Batch Input Recording표준 오브젝트가 없을 때. 화면을 직접 녹화 (Z테이블은 이것)
BAPI표준 BAPI 함수로 처리 (가장 안정적, 오류 메시지가 명확)
IDoc인터페이스 방식으로 처리

Z 커스텀 테이블에 넣는 것이 목적이라면 Batch Input Recording을 선택하고, Recording 이름을 지정한 뒤 Overview → Recording 버튼으로 들어가 SM30 유지보수 화면 조작을 녹화합니다.

2~3단계: 소스 구조와 필드 정의

2단계에서 구조 이름을 하나 만듭니다 (예: ZS_UPLOAD, 설명 “엑셀 업로드 구조”). 3단계에서 엑셀의 열 순서와 정확히 같은 순서로 필드를 정의합니다.

필드명       타입   길이   설명
ZCODE        C      10     코드
ZNAME        C      50     명칭
ZAMOUNT      C      15     금액        ← 숫자여도 C(문자)로 받는 게 안전
ZDATE        C      10     일자        ← 나중에 변환 규칙에서 처리

💡 : 3단계에서는 모든 필드를 C(문자) 타입으로 받으세요. 숫자나 날짜 타입으로 잡으면 엑셀에 값이 하나만 이상해도 9단계에서 전체가 실패합니다. 타입 변환은 5단계 변환 규칙에서 처리하는 것이 정석입니다.

5단계: Field Mapping and Conversion Rules — 가장 중요

여기서 소스 필드를 타겟 필드에 끌어다 놓고, 필요하면 변환 규칙을 넣습니다. 실무에서 거의 항상 쓰는 3가지 규칙입니다.

abap

" ① 앞의 0 채우기 (코스트센터, 계정, 벤더 등 필수)
"    엑셀의 "1001" → SAP 내부값 "0000001001"
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING input  = ZS_UPLOAD-ZCODE
  IMPORTING output = <타겟필드>.

" ② 날짜 변환 (2025-01-15 → 20250115)
REPLACE ALL OCCURRENCES OF '-' IN ZS_UPLOAD-ZDATE WITH ''.
<타겟필드> = ZS_UPLOAD-ZDATE.

" ③ 금액 콤마 제거 (1,234,567 → 1234567)
REPLACE ALL OCCURRENCES OF ',' IN ZS_UPLOAD-ZAMOUNT WITH ''.
<타겟필드> = ZS_UPLOAD-ZAMOUNT.

7~8단계: 파일 지정과 할당

7단계에서 Legacy Data On the PC (Frontend)를 더블클릭하고:

File          : C:\temp\upload.txt
Name          : ZFILE_UPLOAD
Delimiter     : Tabulator            ← 탭 구분
File Structure: ☑ Field Names at Start of File   ← 헤더 행이 있다면 체크
File Type     : ☑ Record End Marker (Windows)
Code Page     : UTF-8                 ← 한글 깨짐 방지

8단계는 단순히 방금 만든 파일을 2단계 구조에 연결하는 작업입니다. 대부분 자동으로 매칭됩니다.

9~12단계: 읽기와 변환 (검증 구간)

9단계 실행 후 읽은 건수를 반드시 확인하세요.

  • 0건이면 → 7단계 파일 경로나 구분자 설정 문제
  • 건수가 1개 적으면 → 헤더 행이 정상적으로 제외된 것 (정상)
  • 열이 밀려 있으면 → 구분자가 탭이 아니거나 데이터에 탭이 섞여 있음

12단계에서는 변환된 결과를 눈으로 봅니다. 여기까지는 DB에 아무것도 반영되지 않으므로 몇 번이고 다시 해도 됩니다.

13~14단계: 실제 적재

13단계로 세션을 만들고, 14단계에서 SM35로 이동해 실행합니다. 처리 모드는 3가지입니다.

모드동작언제
Process/Foreground화면을 하나하나 보여주며 진행첫 테스트 시 1~2건만
Display Errors Only오류 건에서만 화면 정지실무 권장
Background화면 없이 전부 처리대량 건 (수천 건 이상)

처음에는 엑셀에 데이터를 딱 2줄만 남기고 Foreground로 돌려 화면 흐름을 눈으로 확인한 뒤, 전체 데이터로 Display Errors Only 모드를 쓰는 것이 안전합니다.

방법 ② BDC — 화면 조작을 녹화해서 반복 실행

BDC(Batch Data Communication)는 LSMW 내부에서도 쓰이는 엔진입니다. LSMW가 마법사 껍데기라면, BDC는 그 알맹이입니다. ABAP 프로그램으로 직접 짜면 훨씬 유연하게 제어할 수 있습니다.

SHDB 녹화 화면 조작을 한 번 수행 BDCDATA 내부테이블 PROGRAM SAPLZTEST DYNPRO 0100 FNAM/FVAL 필드=값 엑셀 데이터 결합 한 행마다 BDCDATA 재생성 방식 A · CALL TRANSACTION 즉시 실행, 결과를 바로 받음 CALL TRANSACTION ‘ZT01’ USING lt_bdc MODE ‘N’ MESSAGES INTO lt_msg ✔ 오류를 프로그램에서 직접 잡아 처리 가능 ✘ 대량 처리 시 타임아웃 위험 방식 B · 세션 (BDC_INSERT) 큐에 담아두고 SM35에서 나중에 실행 BDC_OPEN_GROUP → BDC_INSERT BDC_CLOSE_GROUP → SM35 실행 ✔ 대량 안정적, 오류 건만 남겨 재처리 가능 ✘ 즉시 결과 확인 불가, SM35 별도 실행 필요 SAP 화면 로직 실행 → DB 반영

SHDB로 녹화하는 법

  1. 명령창에 SHDB 입력
  2. New recording 클릭
  3. 입력값:
   Recording  : ZREC_TEST
   Transaction: SM30          (Z테이블 유지보수 화면인 경우)
  1. Start recording → 실제 화면이 뜹니다. 여기서 데이터 1건을 처음부터 끝까지 정상 입력하고 저장합니다.
  2. 저장이 끝나면 자동으로 녹화 결과 화면이 나옵니다. 아래처럼 화면번호와 필드가 쭉 나열됩니다.
SAPLSM30      0100
              BDC_CURSOR    VIEWNAME
              VIEWNAME      ZTEST_TABLE
              BDC_OKCODE    =UPD
SAPLZTEST     0200
              ZTEST-ZCODE   1001
              ZTEST-ZNAME   테스트항목
              BDC_OKCODE    =SAVE
  1. Program 버튼으로 ABAP 프로그램을 자동 생성할 수 있습니다. 생성된 코드에서 하드코딩된 값(1001, 테스트항목)을 엑셀에서 읽은 변수로 바꾸고 LOOP를 씌우면 완성입니다.

실무에서 알아야 할 BDC 주의사항

  • BDC_OKCODE: 버튼 클릭에 해당합니다. =SAVE, /00(엔터), =BACK 등. 이게 빠지면 화면이 안 넘어갑니다.
  • BDC_CURSOR: 커서 위치. 없어도 되는 경우가 많지만, 특정 필드에 커서가 있어야 다음 로직이 도는 화면도 있습니다.
  • 팝업 화면: 사용자 설정이나 데이터 값에 따라 팝업이 뜨기도 하고 안 뜨기도 합니다. 앞서 언급한 SAPLF040 0700 오류가 대표적입니다. 녹화할 때와 실행할 때 같은 사용자 파라미터·같은 조건인지 확인하세요.
  • 화면 개인화(Layout): 사용자마다 컬럼 배치가 다르면 필드명이 안 맞습니다. 배치 실행용 전용 계정을 쓰는 편이 안전합니다.

방법 ③ S/4HANA Migration Cockpit — 현재의 표준

S/4HANA로 넘어왔다면 LSMW 대신 이 도구를 씁니다. 엑셀 템플릿을 SAP가 직접 제공하기 때문에 사실 가장 쉽습니다.

1. 프로젝트 생성 Migrate Your Data 앱 2. 오브젝트 선택 Customer / Cost Center 등 3. 템플릿 다운로드 SAP가 주는 .xlsx 4. 데이터 입력 엑셀에 값만 채우기 5. 파일 업로드 그대로 드래그 앤 드롭 6. 매핑값 확인 레거시 코드 → SAP 코드 7. 시뮬레이션 DB 반영 없이 검증만 8. 마이그레이션 실제 DB 반영

접근 방법

  • Fiori: Launchpad에서 Migrate Your Data 앱 검색
  • 온프레미스 GUI: T-code LTMC (프로젝트 관리), LTMOM (오브젝트 구조 수정)

LSMW 대비 좋은 점

  • 템플릿에 필수 항목이 색으로 표시되고, 각 필드의 설명·허용값이 시트에 함께 들어있습니다.
  • 7단계 시뮬레이션에서 DB 반영 없이 전체 검증이 되므로 사실상 안전장치가 하나 더 있는 셈입니다.
  • 레거시 코드 → SAP 코드 변환표를 UI에서 관리합니다 (LSMW의 Fixed Values를 GUI로 만든 것).

한계

  • SAP가 제공하는 표준 오브젝트만 지원합니다. 커스텀 Z테이블은 대상이 아닙니다.
  • 커스텀이 필요하면 LTMOM으로 구조를 확장하거나, 아예 방법 ④로 가야 합니다.

방법 ④ ABAP 직접 개발 — Z테이블이라면 이게 정답

Z 커스텀 테이블에 데이터를 넣는 것이 목적이라면, 솔직히 LSMW로 우회할 이유가 거의 없습니다. 화면을 거칠 필요가 없으니 MODIFY 한 줄이면 끝나기 때문입니다. 30줄짜리 프로그램이 LSMW 14단계보다 빠릅니다.

아래는 실무에서 바로 쓸 수 있는 전체 소스입니다.

abap

*&---------------------------------------------------------------------*
*& Report ZEXCEL_UPLOAD
*& 엑셀(탭 구분 텍스트) 파일을 Z테이블에 업로드
*&---------------------------------------------------------------------*
REPORT zexcel_upload.

*--- 업로드 구조 정의 (엑셀 열 순서와 동일하게)
TYPES: BEGIN OF ty_data,
         zcode   TYPE char10,
         zname   TYPE char50,
         zamount TYPE char15,
         zdate   TYPE char10,
       END OF ty_data.

DATA: gt_raw   TYPE TABLE OF string,   " 파일 원본 라인
      gt_data  TYPE TABLE OF ty_data,  " 파싱 결과
      gt_ztab  TYPE TABLE OF ztest_table,
      gv_error TYPE flag.

*--- 선택 화면
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file TYPE string LOWER CASE OBLIGATORY,
            p_head AS CHECKBOX DEFAULT 'X',   " 첫 행이 헤더인가
            p_test AS CHECKBOX DEFAULT 'X'.   " 테스트 모드 (저장 안 함)
SELECTION-SCREEN END OF BLOCK b1.

*--- 파일 선택 F4 도움말
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  DATA: lt_file TYPE filetable,
        lv_rc   TYPE i.

  cl_gui_frontend_services=>file_open_dialog(
    EXPORTING window_title = '업로드 파일 선택'
              file_filter  = '텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*'
    CHANGING  file_table   = lt_file
              rc           = lv_rc ).

  IF lv_rc = 1.
    READ TABLE lt_file INTO DATA(ls_file) INDEX 1.
    IF sy-subrc = 0.
      p_file = ls_file-filename.
    ENDIF.
  ENDIF.

*--- 메인 처리
START-OF-SELECTION.
  PERFORM upload_file.
  PERFORM parse_and_validate.
  PERFORM save_data.

*&---------------------------------------------------------------------*
*& 1. 파일 읽기 — 표준 클래스만 사용 (별도 함수모듈 불필요)
*&---------------------------------------------------------------------*
FORM upload_file.
  cl_gui_frontend_services=>gui_upload(
    EXPORTING filename = p_file
              filetype = 'ASC'
              codepage = '4110'          " UTF-8 (한글 깨짐 방지)
    CHANGING  data_tab = gt_raw
    EXCEPTIONS OTHERS   = 1 ).

  IF sy-subrc <> 0.
    MESSAGE '파일을 읽을 수 없습니다. 경로를 확인하세요.' TYPE 'E'.
  ENDIF.

  " 헤더 행 제거
  IF p_head = 'X' AND lines( gt_raw ) > 0.
    DELETE gt_raw INDEX 1.
  ENDIF.

  IF gt_raw IS INITIAL.
    MESSAGE '업로드할 데이터가 없습니다.' TYPE 'E'.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& 2. 탭 구분자로 파싱 + 검증
*&---------------------------------------------------------------------*
FORM parse_and_validate.
  DATA: lv_tab  TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
        ls_data TYPE ty_data,
        ls_ztab TYPE ztest_table,
        lv_idx  TYPE i.

  LOOP AT gt_raw INTO DATA(lv_line).
    lv_idx = sy-tabix.
    CLEAR: ls_data, ls_ztab.

    " 빈 줄 건너뛰기
    IF lv_line IS INITIAL.
      CONTINUE.
    ENDIF.

    SPLIT lv_line AT lv_tab INTO ls_data-zcode
                                 ls_data-zname
                                 ls_data-zamount
                                 ls_data-zdate.

    " --- 검증 1: 필수값 체크
    IF ls_data-zcode IS INITIAL.
      WRITE: / lv_idx, '행: 코드가 비어 있습니다.'.
      gv_error = 'X'.
      CONTINUE.
    ENDIF.

    " --- 변환 1: 앞의 0 채우기 (1001 → 0000001001)
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING input  = ls_data-zcode
      IMPORTING output = ls_ztab-zcode.

    ls_ztab-zname = ls_data-zname.

    " --- 변환 2: 금액 콤마 제거 후 숫자 변환
    REPLACE ALL OCCURRENCES OF ',' IN ls_data-zamount WITH ''.
    CONDENSE ls_data-zamount NO-GAPS.
    IF ls_data-zamount CO '0123456789.-'.
      ls_ztab-zamount = ls_data-zamount.
    ELSE.
      WRITE: / lv_idx, '행: 금액 형식 오류 →', ls_data-zamount.
      gv_error = 'X'.
      CONTINUE.
    ENDIF.

    " --- 변환 3: 날짜 (2025-01-15 → 20250115)
    REPLACE ALL OCCURRENCES OF '-' IN ls_data-zdate WITH ''.
    REPLACE ALL OCCURRENCES OF '/' IN ls_data-zdate WITH ''.
    CONDENSE ls_data-zdate NO-GAPS.
    IF strlen( ls_data-zdate ) = 8.
      ls_ztab-zdate = ls_data-zdate.
    ELSE.
      WRITE: / lv_idx, '행: 날짜 형식 오류 →', ls_data-zdate.
      gv_error = 'X'.
      CONTINUE.
    ENDIF.

    " --- 시스템 필드
    ls_ztab-erdat = sy-datum.
    ls_ztab-erzet = sy-uzeit.
    ls_ztab-ernam = sy-uname.

    APPEND ls_ztab TO gt_ztab.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& 3. 저장
*&---------------------------------------------------------------------*
FORM save_data.
  IF gt_ztab IS INITIAL.
    MESSAGE '저장할 유효 데이터가 없습니다.' TYPE 'E'.
  ENDIF.

  IF gv_error = 'X'.
    WRITE: / '─────────────────────────────'.
    WRITE: / '오류 행이 있습니다. 위 목록을 확인하세요.'.
  ENDIF.

  IF p_test = 'X'.
    WRITE: / '[테스트 모드] 저장 가능 건수:', lines( gt_ztab ).
    WRITE: / '실제 저장하려면 테스트 모드 체크를 해제하세요.'.
    RETURN.
  ENDIF.

  MODIFY ztest_table FROM TABLE gt_ztab.

  IF sy-subrc = 0.
    COMMIT WORK AND WAIT.
    MESSAGE |{ lines( gt_ztab ) }건이 저장되었습니다.| TYPE 'S'.
  ELSE.
    ROLLBACK WORK.
    MESSAGE '저장 중 오류가 발생했습니다.' TYPE 'E'.
  ENDIF.
ENDFORM.

이 코드의 설계 포인트

  • p_test 테스트 모드: 기본값을 체크로 두었습니다. 처음 실행하면 검증만 하고 저장은 하지 않습니다. 실무에서 사고를 막아주는 가장 값싼 안전장치입니다.
  • codepage = '4110': UTF-8 코드페이지입니다. 한글이 ####로 깨질 때 대부분 이 설정이 원인입니다.
  • CONVERSION_EXIT_ALPHA_INPUT: SAP는 코드성 필드를 앞에 0을 채운 형태로 저장합니다. 이걸 안 하면 나중에 조인이 안 맞아서 한참 헤매게 됩니다.
  • .xlsx를 직접 읽고 싶다면: 오픈소스 라이브러리 abap2xlsx를 설치하면 xlsx를 그대로 파싱할 수 있습니다. 다만 설치 승인이 필요하므로, 현업에게 “탭 구분 텍스트로 저장해서 주세요”라고 안내하는 편이 대부분 빠릅니다.

4가지 방법 최종 비교

항목LSMWBDC (ABAP)Migration CockpitABAP 직접
개발 필요거의 없음필요없음필요
S/4HANA❌ 미지원⚠️ 가능하나 비권장✅ 표준
표준 테이블❌ 금지
Z 커스텀 테이블△ (Recording 필요)최적
대량 처리(10만건+)✅ 세션 방식✅ 가장 빠름
오류 재처리✅ SM35✅ SM35직접 구현
검증 로직 커스텀△ 제한적✅ 자유
현업이 직접 실행❌ 어려움✅ T-code 부여
속도(개발~완료)반나절1~2일1~2시간반나절

자주 만나는 오류 TOP 6

증상원인해결
한글이 ####로 깨짐코드페이지 불일치파일을 UTF-8로 저장, LSMW는 Code Page UTF-8, ABAP은 codepage = '4110'
Read Data 결과 0건파일 경로 오류 또는 .xlsx 지정탭 구분 .txt로 저장, 7단계 경로 재확인
코드 앞의 0이 사라짐엑셀이 0001을 숫자 1로 인식엑셀에서 해당 열을 텍스트 서식으로 지정, SAP에서 CONVERSION_EXIT_ALPHA_INPUT 적용
날짜가 45678 같은 숫자로 나옴엑셀 날짜 일련번호가 그대로 추출됨엑셀에서 열 서식을 yyyy-mm-dd로 바꾸고 다시 저장
No batch input data found for dynpro XXXX예상 화면과 실제 화면 불일치 (팝업 개입)Foreground 모드로 1건 실행해 어느 화면에서 멈추는지 확인 후 BDC 재녹화
세션은 성공인데 데이터가 없음Update 태스크가 비동기로 실패SM13(업데이트 요청) 확인, COMMIT WORK AND WAIT 사용

로그 확인 T-code 모음

SM35  배치 인풋 세션 목록 및 오류 로그
SM37  백그라운드 잡 모니터링
SM13  업데이트 요청 실패 확인
ST22  ABAP 덤프 (런타임 오류)
SM21  시스템 로그
SLG1  애플리케이션 로그

실행 전 체크리스트

□ 대상이 표준 테이블인가 Z테이블인가 확인했다
□ 개발기/품질기에서 먼저 테스트했다 (운영 직접 실행 금지)
□ 엑셀을 탭 구분 UTF-8 텍스트로 저장했다
□ 코드성 컬럼(계정, 코스트센터 등)을 엑셀에서 텍스트 서식으로 지정했다
□ 전체 실행 전에 2~3건만 Foreground / 테스트 모드로 돌려봤다
□ 실행 전 대상 테이블 백업을 떴다 (SE16N 다운로드 또는 백업 테이블 생성)
□ 실패 시 되돌릴 방법을 정해뒀다
□ 실행 후 건수를 SE16N으로 대조 확인했다

특히 백업은 빼먹기 쉽습니다. 표준 테이블은 되돌리기가 사실상 불가능하고, Z테이블도 잘못 넣은 데이터를 골라내는 게 생각보다 어렵습니다. 실행 전에 SE16N에서 대상 테이블을 엑셀로 내려받아 두는 데 1분이면 충분합니다.

정리

  • S/4HANA + 표준 테이블 → Migration Cockpit
  • ECC + 표준 테이블 → LSMW (BAPI 방식 우선)
  • Z 커스텀 테이블 → ABAP 직접 개발
  • 화면 로직을 꼭 태워야 하는 경우 → BDC

한 가지만 기억한다면, “표준 테이블에는 절대 직접 INSERT 하지 않는다” 입니다. 나머지는 상황에 맞게 고르면 됩니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤