SAP 프로젝트를 하다 보면 “이 엑셀 파일 좀 SAP에 넣어주세요”라는 요청을 반드시 받게 됩니다. 마스터 데이터 초기 이관, 코스트센터 매핑표, 계정 매핑 테이블, 벤더 목록… 상황은 다르지만 요구는 늘 같습니다.
문제는 SAP에는 “엑셀 업로드 버튼”이 없다는 것입니다. SAP는 데이터베이스 테이블에 직접 INSERT 하는 것을 기본적으로 막아두고 있고, 대신 여러 우회 경로를 제공합니다. 이 글에서는 그 경로 4가지를 초보자 기준으로 처음부터 끝까지 정리합니다.
전체 그림부터 보기
핵심은 ①②는 화면(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에서 나중에 실행하는 방식입니다. 즉시 실행이 아니라 큐에 쌓아두는 구조라서, 오류가 나도 해당 건만 남기고 나머지는 처리되며 나중에 재처리할 수 있다는 장점이 있습니다.
어떤 방법을 골라야 할까?
방법 ① LSMW — 코딩 없이 14단계로
LSMW(Legacy System Migration Workbench)는 ABAP을 몰라도 마법사 형태로 데이터를 이관할 수 있게 만든 SAP 표준 도구입니다.
⚠️ 먼저 알아두세요 LSMW는 SAP ECC 시대의 도구이고, S/4HANA에서는 공식 지원 대상이 아닙니다(SAP Note 2287723). 트랜잭션 자체는 열리지만 표준 오브젝트 대부분이 S/4HANA 데이터 모델과 맞지 않습니다. S/4HANA 프로젝트라면 방법 ③으로 바로 넘어가세요.
LSMW 14단계 전체 흐름
단계별 상세 따라하기
준비: 엑셀 파일 저장 방식
LSMW는 .xlsx를 직접 읽지 못합니다. 반드시 아래처럼 변환하세요.
- 엑셀에서
파일 → 다른 이름으로 저장 - 형식을
텍스트 (탭으로 분리) (*.txt)로 선택 - 헤더 행은 남겨둬도 되지만, 7단계에서 “첫 행은 필드명” 옵션을 반드시 체크
- 한글이 있다면 저장 후 메모장에서 열어 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 Input | SAP가 미리 만들어둔 표준 오브젝트가 있을 때 (예: 벤더 마스터 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로 녹화하는 법
- 명령창에
SHDB입력 New recording클릭- 입력값:
Recording : ZREC_TEST
Transaction: SM30 (Z테이블 유지보수 화면인 경우)
Start recording→ 실제 화면이 뜹니다. 여기서 데이터 1건을 처음부터 끝까지 정상 입력하고 저장합니다.- 저장이 끝나면 자동으로 녹화 결과 화면이 나옵니다. 아래처럼 화면번호와 필드가 쭉 나열됩니다.
SAPLSM30 0100
BDC_CURSOR VIEWNAME
VIEWNAME ZTEST_TABLE
BDC_OKCODE =UPD
SAPLZTEST 0200
ZTEST-ZCODE 1001
ZTEST-ZNAME 테스트항목
BDC_OKCODE =SAVE
Program버튼으로 ABAP 프로그램을 자동 생성할 수 있습니다. 생성된 코드에서 하드코딩된 값(1001,테스트항목)을 엑셀에서 읽은 변수로 바꾸고 LOOP를 씌우면 완성입니다.
실무에서 알아야 할 BDC 주의사항
- BDC_OKCODE: 버튼 클릭에 해당합니다.
=SAVE,/00(엔터),=BACK등. 이게 빠지면 화면이 안 넘어갑니다. - BDC_CURSOR: 커서 위치. 없어도 되는 경우가 많지만, 특정 필드에 커서가 있어야 다음 로직이 도는 화면도 있습니다.
- 팝업 화면: 사용자 설정이나 데이터 값에 따라 팝업이 뜨기도 하고 안 뜨기도 합니다. 앞서 언급한
SAPLF040 0700오류가 대표적입니다. 녹화할 때와 실행할 때 같은 사용자 파라미터·같은 조건인지 확인하세요. - 화면 개인화(Layout): 사용자마다 컬럼 배치가 다르면 필드명이 안 맞습니다. 배치 실행용 전용 계정을 쓰는 편이 안전합니다.
방법 ③ S/4HANA Migration Cockpit — 현재의 표준
S/4HANA로 넘어왔다면 LSMW 대신 이 도구를 씁니다. 엑셀 템플릿을 SAP가 직접 제공하기 때문에 사실 가장 쉽습니다.
접근 방법
- 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가지 방법 최종 비교
| 항목 | LSMW | BDC (ABAP) | Migration Cockpit | ABAP 직접 |
|---|---|---|---|---|
| 개발 필요 | 거의 없음 | 필요 | 없음 | 필요 |
| 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 하지 않는다” 입니다. 나머지는 상황에 맞게 고르면 됩니다.
