본문 바로가기
BAPI · BADI · RFC · Interface

[SAP ABAP] BDC(Batch Data Communication) 시작하기 — SHDB 레코딩 + CALL TRANSACTION + BDC_SUBSCR 정리 팁

by Song.sh 2026. 5. 20.

SAP 에서 표준 트랜잭션(MM01 자재마스터 생성·VA01 영업오더 생성·FB01 회계 전표 등) 을 자동화해야 할 때 가장 먼저 떠올리는 도구가 BDC(Batch Data Communication) 입니다. BAPI 가 있으면 BAPI 가 표준이지만, 회사 특정 화면이나 BAPI 가 지원하지 않는 화면 흐름을 자동화해야 한다면 BDC 가 사실상 유일한 선택지가 됩니다.

 

BDC 의 개념은 단순합니다. 사용자가 SAP 화면에서 직접 키보드를 두드리며 진행하는 과정을 BDCDATA 구조체에 화면 번호 + 필드명 + 필드값으로 풀어놓는 것이 전부입니다. SAP 는 그 데이터를 받아 화면을 실제로 그리지 않고도 같은 트랜잭션을 자동 실행해 줍니다. 어려운 부분은 BDC 코드 자체가 아니라 "어떤 화면에서 어떤 필드를 어떤 순서로 채워야 하는지" 를 알아내는 부분인데, 그것이 SHDB(Transaction Recorder) 의 역할.

 

이 글은 BDC 의 표준 패턴을 SHDB 레코딩(저장 전 BDC_SUBSCR 정리 포함) → 레코딩 결과를 보고 BDC 코드 직접 작성 → CALL TRANSACTION 호출 → 메시지 수집 → 에러 처리 흐름으로 한 번에 정리한 메모입니다. 실무에서는 SHDB 의 "Program" 버튼으로 자동 변환된 코드를 그대로 쓰기보다, 레코딩 결과의 화면·필드 정보를 참고해 SE38 에서 ABAP 코드를 직접 작성하는 방식 이 깔끔하고 유지보수도 쉽습니다.


핵심 — BDCDATA 구조체 5개 필드 한눈 비교

BDC 의 모든 동작은 BDCDATA 구조체 한 줄로 표현됩니다.

필드 의미 예시
PROGRAM 화면이 소속된 모듈풀 프로그램명 SAPMM06E · SAPLMGMM
DYNPRO 화면 번호 0100 · 0200
DYNBEGIN 새 화면 시작 표시 'X' (화면 줄에만) / ' ' (필드 줄)
FNAM 필드 기술명 RM06E-BSART · EKKO-LIFNR
FVAL 필드값 'NB' · '0000100001'

핵심 한 줄: 화면 한 개 = DYNBEGIN='X' 한 줄(PROGRAM + DYNPRO) + 그 화면의 필드들(FNAM + FVAL) 여러 줄. 다음 화면으로 넘어갈 때 다시 DYNBEGIN='X' 한 줄을 추가하는 패턴이 반복됩니다.


1단계 — SHDB 트랜잭션 레코딩 + BDC_SUBSCR 정리

레코딩 트랜잭션 SHDB 에서 자동화하고 싶은 표준 트랜잭션을 한 번 손으로 실행해 그 과정을 기록합니다.

/n SHDB → New Recording 클릭
  → 팝업
       Recording      : ZTEST_BDC_001 (자유 이름)
       Transaction    : MM01 (자동화하려는 T-Code)
  → Start Recording → MM01 화면이 새로 뜸
  → MM01 화면에서 실제 자재 한 건을 손으로 끝까지 입력
       자재번호 · 산업분야 · 자재유형 · 자재 그룹 · 단위 · 자재내역 등
  → 마지막에 저장(Ctrl+S)
  → 자동으로 SHDB 결과 화면으로 돌아오며
     화면 줄(DYNBEGIN='X') + 필드 줄(FNAM/FVAL) 이 순서대로 표시됨

 

★ 저장 전에 BDC_SUBSCR 라인 직접 삭제

여기서 가장 중요한 작업. 레코딩 결과에는 화면 안의 서브스크린 영역을 가리키는 BDC_SUBSCR 라인(보통 SAPLMGD1 같은 프로그램명과 함께 표시) 이 같이 들어 있습니다. 이 줄들은 실제 입력 동작이 아니라 "현재 보고 있는 서브스크린 정보" 라서 BDC 실행 시 화면 전환을 거꾸로 깨뜨리는 원인 이 됩니다.

SHDB 결과 화면에서:
  1) BDC_SUBSCR 으로 시작하는 라인을 하나씩 클릭해 선택
     (Ctrl 누르면서 여러 라인 동시 선택 가능)
  2) 상단 툴바의 휴지통 아이콘 또는 메뉴의 Edit → Delete Line
  3) 해당 라인들이 화면에서 사라짐
  4) ★ 모든 BDC_SUBSCR 라인 제거 확인 후 → Save (Ctrl + S)

 

저장 전에 SHDB 화면에서 미리 정리해 두는 이유: 한 번 저장된 레코딩은 BDC_SUBSCR 라인을 그대로 머금은 채 보관됩니다. 나중에 그 레코딩을 다시 활용하거나 다른 사람이 참고할 때 같은 정리 작업을 반복해야 합니다.

 

SHDB 결과 화면에서 미리 깨끗하게 정리한 뒤 저장하는 패턴 이 가장 효율적이며, 노트에 기록해 둔 핵심 팁이기도 합니다.

저장된 레코딩은 SHDB 메뉴에서 다시 열어 화면 번호·필드 정보를 참고하는 "설계도" 로 사용합니다.


2단계 — 레코딩 결과를 보고 BDC 코드 직접 작성

SHDB 의 "Program" 버튼으로 ABAP 코드를 자동 변환하는 기능이 있긴 합니다. 다만 자동 변환된 코드는 BDC_CURSOR 같은 보조 라인이 잔뜩 끼어 있고 변수명 명명 규칙도 회사 표준과 안 맞는 경우가 많아 실무에서는 레코딩 결과를 "참고용 화면 사전" 으로 두고 SE38 에서 BDC 코드를 직접 작성 하는 패턴이 일반적입니다.

직접 작성하면 다음 장점이 있습니다.

  • 변수명·구조체를 회사 표준에 맞게 깔끔히 정리
  • 입력값 부분만 LOOP 안에서 동적으로 받게 설계
  • 불필요한 BDC_CURSOR 라인 자연스럽게 생략
  • BDC_OKCODE 만 명확히 남겨 다음 화면 전환 의도 가시화

작성 흐름

1) SE38 → 신규 프로그램 생성 (예: ZBDC_MM01_TEST)
2) DATA 선언:
       gt_bdcdata  TYPE TABLE OF bdcdata
       gs_bdcdata  TYPE bdcdata
       gt_messages TYPE TABLE OF bdcmsgcoll

3) 화면 흐름 따라가는 표준 서브루틴 두 개 작성
       FORM bdc_dynpro  USING program dynpro.   " 새 화면 시작
       FORM bdc_field   USING fnam    fval.     " 필드값 한 줄

4) SHDB 결과 화면을 옆에 띄워 두고 순서대로 옮겨 적기:
       각 DYNBEGIN='X' 줄  →  PERFORM bdc_dynpro USING '...' '...'.
       그 화면의 FNAM/FVAL 줄들 → PERFORM bdc_field USING '...' '...'.

5) 화면별 BDC_OKCODE 줄 챙기기 (다음 화면 트리거)
       PERFORM bdc_field USING 'BDC_OKCODE' '/00'.   " Enter
       PERFORM bdc_field USING 'BDC_OKCODE' '=BU'.   " 저장
       PERFORM bdc_field USING 'BDC_OKCODE' '=BACK'. " 뒤로

 

직접 작성이라고 해서 어려운 게 아닙니다. SHDB 결과 화면이 사실상 "이 화면 → 이 필드 → 이 값" 을 줄별로 명세해 둔 설계도라서, 옆에 띄워 놓고 PERFORM bdc_dynpro · PERFORM bdc_field 만 순서대로 호출하면 됩니다. 변환 버튼이 만든 자동 생성 코드보다 가독성·유지보수가 훨씬 좋고, 본인이 어디서 무엇을 했는지 명확하게 추적 가능.

BDC_OKCODE 는 절대 빠뜨리지 말기

각 화면 줄(bdc_dynpro) 직후에 그 화면을 어떻게 빠져나갈지 결정하는 BDC_OKCODE 한 줄이 필수입니다.

BDC_OKCODE 값 동작
'/00' Enter — 다음 화면으로
'=BU' 저장 (Save)
'=ENTR' Enter — '/00' 과 동일
'=BACK' 뒤로 (F3)
'/N' 현재 트랜잭션 종료

BDC_OKCODE 가 빠진 화면 줄은 다음 화면으로 못 넘어가 같은 화면에서 무한 대기 상태가 됩니다. SHDB 결과를 그대로 옮길 때 화면 사이의 OKCODE 줄을 빠뜨리지 않도록 주의.


3단계 — 표준 서브루틴 두 개: BDC_DYNPRO · BDC_FIELD

자동 생성된 코드의 골격은 표준 패턴이라 두 개의 FORM 으로 압축됩니다.

* 새 화면 시작 추가
FORM bdc_dynpro USING program dynpro.
  CLEAR gs_bdcdata.
  gs_bdcdata-program  = program.
  gs_bdcdata-dynpro   = dynpro.
  gs_bdcdata-dynbegin = 'X'.
  APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.

* 필드 한 줄 추가
FORM bdc_field USING fnam fval.
  IF fval IS NOT INITIAL OR fnam CP 'BDC_*'.   " 빈 값은 스킵 (BDC_OKCODE 등은 항상 추가)
    CLEAR gs_bdcdata.
    gs_bdcdata-fnam = fnam.
    gs_bdcdata-fval = fval.
    APPEND gs_bdcdata TO gt_bdcdata.
  ENDIF.
ENDFORM.

이 두 개의 FORM 으로 모든 화면·필드를 풀어놓을 수 있습니다. 본문 코드는 그저 두 FORM 을 화면 순서대로 호출하는 단순한 흐름.


4단계 — BDC 데이터 채우기 (MM01 예제)

자재 한 건을 생성하는 흐름. SHDB 가 자동 생성해 준 코드에서 BDC_SUBSCR 정리한 결과입니다.

* === 화면 1: 자재번호 입력 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field  USING 'BDC_OKCODE'  '=ENTR'.
PERFORM bdc_field  USING 'RMMG1-MATNR' p_matnr.    " 자재번호
PERFORM bdc_field  USING 'RMMG1-MBRSH' 'M'.        " 산업분야
PERFORM bdc_field  USING 'RMMG1-MTART' 'FERT'.     " 자재유형

* === 화면 2: 뷰 선택 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field  USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field  USING 'MSICHTAUSW-DYTXT(01)' 'X'.   " Basic Data 1

* === 화면 3: Basic Data 1 ===
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field  USING 'BDC_OKCODE' '=BU'.       " 저장
PERFORM bdc_field  USING 'MAKT-MAKTX' p_maktx.     " 자재내역
PERFORM bdc_field  USING 'MARA-MEINS' 'EA'.        " 단위
PERFORM bdc_field  USING 'MARA-MATKL' '001'.       " 자재 그룹

각 화면의 첫 줄은 bdc_dynpro, 그 안의 필드들은 bdc_field 로. 마지막 화면에 도달하면 '=BU'(저장) 같은 펑션 코드를 BDC_OKCODE 에 넣어 트랜잭션을 종료시킵니다.


5단계 — CALL TRANSACTION 실행 + 메시지 수집

데이터를 다 채웠으면 CALL TRANSACTION 한 줄로 실행. 결과 메시지는 별도 ITAB 에 수집합니다.

DATA: gt_messages TYPE TABLE OF bdcmsgcoll,
      gv_subrc    TYPE sy-subrc.

CALL TRANSACTION 'MM01'
  USING gt_bdcdata
  MODE   'N'         " A=All / E=Errors / N=No display
  UPDATE 'S'         " A=Async / S=Sync / L=Local
  MESSAGES INTO gt_messages.

gv_subrc = sy-subrc.

" 메시지 변환 — 사람이 읽을 수 있는 텍스트로
LOOP AT gt_messages INTO DATA(ls_msg).
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid  = ls_msg-msgid
      msgnr  = ls_msg-msgnr
      msgv1  = ls_msg-msgv1
      msgv2  = ls_msg-msgv2
      msgv3  = ls_msg-msgv3
      msgv4  = ls_msg-msgv4
    IMPORTING
      message_text_output = DATA(lv_text).

  WRITE: / |[{ ls_msg-msgtyp }] { lv_text }|.
ENDLOOP.

IF gv_subrc = 0.
  WRITE: / '✅ BDC 처리 성공'.
ELSE.
  WRITE: / '❌ BDC 처리 실패'.
ENDIF.

MODE / UPDATE 옵션 선택 기준:

옵션 동작 언제 사용
MODE 'A' 모든 화면 표시 디버깅 — 어느 화면에서 막히는지 눈으로 확인
MODE 'E' 에러 화면만 표시 초기 운영 — 에러 발생 시 사용자가 보정
MODE 'N' 화면 표시 안 함 (백그라운드) 정식 운영 — 가장 빠름
UPDATE 'S' 동기 업데이트 — DB 반영 완료 후 다음 코드 실행 후속 코드가 DB 결과를 즉시 봐야 할 때
UPDATE 'A' 비동기 업데이트 — 호출 즉시 다음 진행 대량 처리 — 성능 우선

6단계 — 세션 방식 vs Call Transaction 방식

BDC 는 두 가지 실행 방식이 있습니다.

" 방식 1: Call Transaction — 즉시 실행
CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'S'
  MESSAGES INTO gt_messages.

" 방식 2: 세션 — SM35 큐에 적재 후 사용자가 별도 실행
CALL FUNCTION 'BDC_OPEN_GROUP'
  EXPORTING client = sy-mandt
            group  = 'ZTEST_SESSION'
            user   = sy-uname.

CALL FUNCTION 'BDC_INSERT'
  EXPORTING tcode     = 'MM01'
  TABLES    dynprotab = gt_bdcdata.

CALL FUNCTION 'BDC_CLOSE_GROUP'.
" → SM35 트랜잭션에서 그룹 'ZTEST_SESSION' 실행

선택 기준:

  • CALL TRANSACTION — 결과를 즉시 보고 후속 처리 / 한 건씩 빠르게
  • 세션 — 대량 처리 시 사용자가 SM35 에서 모니터링·재처리 가능 / 에러 건만 골라 다시 실행

대부분의 자동화는 CALL TRANSACTION 이 편하고, 사용자가 직접 모니터링하면서 처리해야 하는 대량 업로드는 세션 방식이 적합.


흔히 빠뜨리는 함정

BDC_SUBSCR 라인 남김

레코딩 결과의 BDC_SUBSCR 라인은 SHDB 결과 화면에서 저장하기 전에 직접 선택해 삭제. SE38 에서 코드를 작성한 뒤 발견하면 늦습니다 — BDC_SUBSCR 정보가 이미 머릿속에 있어야 다음 화면 진행 라인을 어디에 두는지 정리하기 쉬워서, SHDB 결과를 보기 전에 한 번에 청소 해 두는 패턴이 가장 깔끔합니다. 노트의 핵심 팁.

BDC_OKCODE 누락

" ❌ BDC_OKCODE 없이 다음 화면 시도
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field  USING 'RMMG1-MATNR' p_matnr.
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.   " ❌ 이 화면으로 못 넘어감

각 화면 줄 직후 BDC_OKCODE 한 줄('=ENTR' · '/00' · '=BU') 필수.

운영 환경에서 MODE 'A' 실행

CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'A' ...   " ❌ 운영 사용자 화면 떠버림

'A' 는 디버깅용. 운영 배포 직전에 반드시 'N'(백그라운드) 으로 변경. 잊으면 사용자가 BDC 호출할 때마다 화면이 떴다가 사라지는 현상 발생.

UPDATE 'A' (비동기) + 즉시 후속 조회

CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'A' ...
SELECT SINGLE * FROM mara INTO ls_mara WHERE matnr = p_matnr.   " ❌ 아직 안 들어가 있을 수 있음

비동기 업데이트는 호출 즉시 리턴하지만 DB 반영은 백그라운드. 후속 코드가 그 결과를 봐야 한다면 UPDATE 'S'(동기) 필수.

필드값 형식 변환 누락

PERFORM bdc_field USING 'RMMG1-MATNR' '12345'.   " ❌ 자재번호는 18자리 0 패딩 필요
PERFORM bdc_field USING 'EKKO-AEDAT' '2026-01-15'.   " ❌ SAP 화면은 'DD.MM.YYYY' 또는 사용자 형식

BDC 는 화면 입력을 그대로 흉내내는 것이라 사용자 화면에 보이는 형식 그대로 채워야 합니다. 자재번호 18자리 패딩(CONVERSION_EXIT_MATN1_INPUT)·날짜 사용자 형식 변환(WRITE date TO lv_date) 등 미리 처리.

메시지 수집 안 함

CALL TRANSACTION 'MM01' USING gt_bdcdata MODE 'N' UPDATE 'S'.   " ❌ MESSAGES INTO 없음
IF sy-subrc <> 0.
  MESSAGE 'BDC 실패' TYPE 'E'.   " 무슨 에러인지 모름
ENDIF.

MESSAGES INTO gt_messages 로 수집해야 어느 필드에서 어떤 메시지가 떴는지 확인 가능. 메시지 텍스트는 MESSAGE_TEXT_BUILD 같은 FM 으로 풀어내거나 직접 T100 테이블 조회.

화면 흐름 변경에 BDC 깨짐

SAP 패치 후 MM01 화면의 필드 순서/번호가 바뀜
  → 기존 BDC 가 "RMMG1-MTART" 필드를 못 찾아 에러

BDC 는 화면 구조에 강하게 의존하므로 SAP 업데이트·EHP 적용 시 화면 변경 가능성 확인 필요. 가능하면 BAPI 가 있는 트랜잭션은 BAPI 로 마이그레이션.

BAPI 있는데 BDC 사용

" ❌ BAPI_MATERIAL_SAVEDATA 가 있는데 MM01 BDC 작성
CALL TRANSACTION 'MM01' USING ...

자재마스터(BAPI_MATERIAL_SAVEDATA) · PO(BAPI_PO_CREATE1) · 영업오더(BAPI_SALESORDER_CREATEFROMDAT2) 같이 BAPI 가 표준으로 제공되는 트랜잭션은 BAPI 가 우선. BDC 는 BAPI 가 없거나 회사 특정 커스텀 화면 자동화 때만 사용.


전체 코드 — 복사용 통합본

자재 한 건을 생성하는 BDC 미니 리포트. SHDB 레코딩 결과에서 BDC_SUBSCR 정리한 형태입니다.

REPORT zr_bdc_mm01_demo.

PARAMETERS: p_matnr TYPE matnr OBLIGATORY,
            p_maktx TYPE makt-maktx OBLIGATORY.

DATA: gt_bdcdata  TYPE TABLE OF bdcdata,
      gs_bdcdata  TYPE bdcdata,
      gt_messages TYPE TABLE OF bdcmsgcoll.

* === BDC 데이터 채우기 ===
" 화면 1: 초기화면 (자재번호·산업분야·자재유형)
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field  USING 'BDC_OKCODE'  '=ENTR'.
PERFORM bdc_field  USING 'RMMG1-MATNR' p_matnr.
PERFORM bdc_field  USING 'RMMG1-MBRSH' 'M'.
PERFORM bdc_field  USING 'RMMG1-MTART' 'FERT'.

" 화면 2: 뷰 선택 (Basic Data 1)
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field  USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field  USING 'MSICHTAUSW-DYTXT(01)' 'X'.

" 화면 3: Basic Data 1 + 저장
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field  USING 'BDC_OKCODE' '=BU'.
PERFORM bdc_field  USING 'MAKT-MAKTX' p_maktx.
PERFORM bdc_field  USING 'MARA-MEINS' 'EA'.
PERFORM bdc_field  USING 'MARA-MATKL' '001'.

* === CALL TRANSACTION 실행 ===
CALL TRANSACTION 'MM01'
  USING gt_bdcdata
  MODE   'N'        " 운영 = N / 디버깅 = A
  UPDATE 'S'
  MESSAGES INTO gt_messages.

DATA(gv_subrc) = sy-subrc.

* === 메시지 출력 ===
LOOP AT gt_messages INTO DATA(ls_msg).
  DATA lv_text TYPE string.

  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING msgid = ls_msg-msgid
              msgnr = ls_msg-msgnr
              msgv1 = ls_msg-msgv1
              msgv2 = ls_msg-msgv2
              msgv3 = ls_msg-msgv3
              msgv4 = ls_msg-msgv4
    IMPORTING message_text_output = lv_text.

  WRITE: / |[{ ls_msg-msgtyp }] { lv_text }|.
ENDLOOP.

IF gv_subrc = 0.
  WRITE: /, / |✅ 자재 { p_matnr } 생성 완료|.
ELSE.
  WRITE: /, / |❌ 자재 { p_matnr } 생성 실패 (sy-subrc = { gv_subrc })|.
ENDIF.

*&---------------------------------------------------------------------*
*&  Form  BDC_DYNPRO — 새 화면 시작 한 줄 추가
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR gs_bdcdata.
  gs_bdcdata-program  = program.
  gs_bdcdata-dynpro   = dynpro.
  gs_bdcdata-dynbegin = 'X'.
  APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.

*&---------------------------------------------------------------------*
*&  Form  BDC_FIELD — 필드 한 줄 추가 (빈 값은 스킵, BDC_* 는 항상 추가)
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  IF fval IS NOT INITIAL OR fnam CP 'BDC_*'.
    CLEAR gs_bdcdata.
    gs_bdcdata-fnam = fnam.
    gs_bdcdata-fval = fval.
    APPEND gs_bdcdata TO gt_bdcdata.
  ENDIF.
ENDFORM.

이 미니 리포트를 그대로 SE38 에 넣고 실행하면 자재번호 + 자재내역만 입력해도 자재마스터 한 건이 자동으로 생성됩니다. 대량 처리는 SELECT-OPTIONS 또는 엑셀 업로드로 LOOP 만들고 안에서 REFRESH gt_bdcdata + 같은 패턴 반복.


요약

단계 작업 핵심
1 SHDB 레코딩 + BDC_SUBSCR 정리 T-Code 한 건 손으로 진행 → 저장 전 BDC_SUBSCR 라인 직접 삭제 → 저장
2 레코딩 보고 BDC 코드 직접 작성 SE38 에서 bdc_dynpro / bdc_field 서브루틴 + 화면별 OKCODE 옮겨 적기
3 BDCDATA 채우기 화면 순서대로 bdc_dynpro + bdc_field 반복 호출
4 CALL TRANSACTION MODE 'N' + UPDATE 'S' + MESSAGES INTO
5 메시지 분석 MESSAGE_TEXT_BUILD 로 텍스트 변환 후 로그
6 대량 처리 CALL TRANSACTION 반복 또는 세션(SM35) 방식

BDC 는 들었을 때보다 패턴이 훨씬 단순합니다. SHDB 결과 화면에서 BDC_SUBSCR 라인을 미리 정리한 뒤, 그 결과를 옆에 띄워 두고 SE38 에서 bdc_dynpro · bdc_field 두 개의 서브루틴만 화면 순서대로 호출하면 됩니다. 함정 몇 가지(MODE 'A' 운영 배포·UPDATE 'A' + 즉시 조회·필드값 형식)만 피하면 안정적으로 돌아가며, 같은 패턴을 다른 트랜잭션 자동화(VA01·FB01·ME21N 등)에도 그대로 재사용할 수 있습니다.

 

다만 BAPI 가 있는 트랜잭션은 항상 BAPI 가 우선임을 기억하기. BDC 는 화면 의존성이 강해 시스템 패치에 약한 단점이 있으므로 표준 BAPI 가 가능하다면 그쪽이 안전한 선택입니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

BDC(Batch Data Communication) · SHDB(Transaction Recorder) · CALL TRANSACTION ... USING ... MESSAGES INTO 구문 · BDC_OPEN_GROUP / BDC_INSERT / BDC_CLOSE_GROUP FM 은 SAP 표준 기능으로 ECC 6.0 / S/4HANA on-premise 환경에서 동일하게 동작합니다.

 

MODE 옵션(A/E/N) 과 UPDATE 옵션(A/S/L) 의 의미는 SAP NetWeaver 표준 문서 기준이며, BDC 는 화면 흐름에 강하게 의존하므로 SAP EHP 업그레이드나 패치 적용 시 화면 변경 여부 확인이 필요합니다.

 

가능한 경우 BAPI(BAPI_MATERIAL_SAVEDATA · BAPI_PO_CREATE1 등) 가 권장되며, BDC 는 BAPI 가 없거나 회사 특정 커스텀 화면 자동화에 한정해 사용하시기 바랍니다. S/4HANA Cloud(ABAP Cloud / Steampunk) 환경에서는 BDC 사용이 제한되므로 RAP / BAPI / OData 기반 대안을 검토해야 합니다.