본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] CALL TRANSACTION 정의와 사용법 — MODE·UPDATE·BDC 자동 입력 (SHDB)

by Song.sh 2026. 5. 26.

SAP에서 자체 프로그램을 만들다 보면 "이 데이터로 표준 트랜잭션 화면을 열어 사용자에게 후속 작업을 시킨다" 거나 "표준 트랜잭션을 화면 없이 백그라운드로 자동 입력시킨다" 같은 요구가 자주 발생합니다.

 

이때 표준 ABAP에서 사용하는 명령어가 CALL TRANSACTION 입니다. 이름 그대로 다른 트랜잭션(T-Code) 을 호출하는 명령으로, 사용자가 화면을 직접 조작하게 하는 모드와 프로그램이 입력값을 미리 채워 자동으로 진행시키는 BDC 모드를 모두 지원합니다.

 

이 글은 CALL TRANSACTION 의 기본 정의와 옵션, 비슷한 이름의 LEAVE TO TRANSACTION · SUBMIT 과의 차이, 그리고 BDC 모드에서 표준 트랜잭션을 자동 입력하는 4단계 패턴까지 정리한 메모입니다.


핵심 — CALL TRANSACTION 은 호출 시점에 새 LUW 를 만듭니다

비슷해 보이는 세 명령어(CALL TRANSACTION · LEAVE TO TRANSACTION · SUBMIT) 은 호출 대상의 종류 · 호출 후 흐름 · LUW 경계가 모두 다릅니다.

항목 CALL TRANSACTION LEAVE TO TRANSACTION SUBMIT
호출 대상 트랜잭션 (T-Code) 트랜잭션 (T-Code) 실행 가능한 리포트 프로그램
호출 후 복귀 복귀함 (다음 줄부터 계속 실행) 복귀 안 함 (호출과 동시에 종료) AND RETURN 절 유무에 따라
LUW 경계 새 LUW 시작 — 호출 트랜잭션 종료 시 COMMIT 호출자 LUW 종료 후 새 LUW 시작 같은 LUW 안에서 실행
입력값 전달 SPA/GPA 또는 USING bdcdata SPA/GPA 만 WITH 절로 Selection-screen 옵션 전달
BDC 자동 입력 지원 (BDCDATA 테이블) 미지원 미지원
일반 용도 표준 화면을 자체 프로그램에서 호출 · 자동 입력 현재 흐름 종료 후 다른 T-Code 로 이동 리포트 프로그램 실행 · 결과 회수

CALL TRANSACTION 의 가장 중요한 특징은 호출 시점에 새 LUW(Logical Unit of Work) 가 시작된다는 점입니다. 호출자의 COMMIT WORK 와 호출된 트랜잭션 내부의 COMMIT WORK 가 서로 다른 LUW 에 묶이기 때문에, 호출자 입장에서 표준 트랜잭션의 성공·실패만 받아 보고 본인의 다른 작업과 묶어 처리하기에 편합니다.

같이 등장하는 BDC(Batch Data Communication) 는 별개 개념이 아니라 CALL TRANSACTIONUSING bdcdata 옵션에 채울 데이터를 만드는 기법입니다. 표준 BAPI 가 없는 트랜잭션을 자동 입력해야 할 때 주로 사용합니다.


1단계 — 가장 단순한 호출

옵션 없이 트랜잭션 코드만 넘기면 호출된 트랜잭션의 초기 화면이 사용자에게 그대로 보입니다. 사용자가 후속 작업을 직접 진행하고, 트랜잭션을 종료하면 호출자의 다음 줄로 돌아옵니다.

CALL TRANSACTION 'MM01'.
WRITE: / '자재 생성 트랜잭션이 종료되었습니다.'.

이 형태는 자체 프로그램에서 "여기서 자재 마스터 만들어 두고 다음 단계 진행" 같은 흐름을 안내할 때 사용합니다. 다만 호출자가 미리 채워준 입력값이 없으므로 SPA/GPA 메모리를 활용해 초기 필드를 채워두기도 합니다.

SET PARAMETER ID 'MAT' FIELD 'TEST-MAT-001'.
SET PARAMETER ID 'WRK' FIELD '0001'.
CALL TRANSACTION 'MM02'.

SPA/GPA 메모리 ID 가 트랜잭션 초기 화면의 필드와 연결되어 있으면, 위처럼 SET PARAMETER 로 값을 먼저 박아두는 방식으로 사용자 입력을 줄일 수 있습니다.


2단계 — MODE · UPDATE · OPTIONS 옵션

자동 입력 시 필요한 옵션은 다음과 같습니다.

CALL TRANSACTION 'MM01'
  USING   lt_bdcdata
  MODE    'N'
  UPDATE  'S'
  MESSAGES INTO lt_messtab.

각 옵션의 의미는 다음과 같습니다.

옵션 의미
MODE A All — 모든 화면 표시 (디버깅 · 데모용)
E Error — 에러 발생 시점에만 화면 멈춤 (실무 디버깅용)
N No display — 화면 미표시 (운영 · 배치용)
UPDATE S Synchronous — DB 업데이트 완료 후 복귀 (결과 즉시 확인 가능)
A Asynchronous — 업데이트 요청 후 즉시 복귀 (성능 우선)
L Local — 호출 워크 프로세스에서 직접 업데이트
MESSAGES INTO BDCMSGCOLL 타입 인터널 테이블에 메시지 수집

실무에서 가장 자주 쓰는 조합은 다음 두 가지입니다.

  • 운영 자동 입력: MODE 'N' UPDATE 'S' — 화면 미표시 + 동기 업데이트로 결과 즉시 회수
  • 개발·검증: MODE 'E' UPDATE 'S' — 에러 발생 시에만 화면이 멈춰 디버깅 가능

호출 결과는 sy-subrc 로 판단합니다. 0 이면 정상, 1001 이상이면 BDC 처리 중 에러가 발생한 상태입니다.


3단계 — BDC 모드 (USING bdcdata)

자동 입력값은 BDCDATA(SAP 표준 구조체, 패키지 SBDC) 타입 인터널 테이블에 채워서 USING 절로 전달합니다.

BDCDATA 의 주요 필드는 다음과 같습니다.

필드 의미
PROGRAM 호출할 화면의 모듈 풀 프로그램명 (예: SAPLMGMM)
DYNPRO 화면 번호 (예: 0060)
DYNBEGIN 새 화면 시작 표시 ('X')
FNAM 필드명 또는 명령(BDC_OKCODE)
FVAL 해당 필드에 입력할 값

화면 단위로 한 줄(DYNBEGIN='X') 을 시작하고, 그 아래로 필드별 입력값을 한 줄씩 채우는 식입니다. 자체로 만들기보다 SHDB 트랜잭션에서 실제 입력 과정을 레코딩해 자동 생성된 코드를 가져다 쓰는 방식이 표준입니다.

SHDB → New recording → 트랜잭션 코드 입력 (예: MM01) → 실제 입력 진행 후 저장
  → "Program" 버튼 → 자동 생성된 ABAP 코드 확보
  → 코드에서 BDC_SUBSCR 같은 불필요 행 제거 → 자체 프로그램에 이식

레코딩 결과의 BDC_SUBSCR 같은 서브스크린 관련 행은 화면에 따라 노이즈일 수 있으므로 제거 후 깔끔하게 정리해서 사용합니다.


4단계 — MESSAGES INTO 로 에러 수집

자동 입력 결과 메시지는 BDCMSGCOLL(SAP 표준 구조체) 타입 인터널 테이블로 받습니다.

DATA: lt_messtab TYPE STANDARD TABLE OF bdcmsgcoll,
      ls_messtab TYPE bdcmsgcoll,
      lv_msg     TYPE string.

CALL TRANSACTION 'MM01'
  USING    lt_bdcdata
  MODE     'N'
  UPDATE   'S'
  MESSAGES INTO lt_messtab.

LOOP AT lt_messtab INTO ls_messtab WHERE msgtyp CA 'EAX'.
  CALL FUNCTION 'FORMAT_MESSAGE'
    EXPORTING
      id        = ls_messtab-msgid
      lang      = sy-langu
      no        = ls_messtab-msgnr
      v1        = ls_messtab-msgv1
      v2        = ls_messtab-msgv2
      v3        = ls_messtab-msgv3
      v4        = ls_messtab-msgv4
    IMPORTING
      msg       = lv_msg.
  WRITE: / ls_messtab-msgtyp, lv_msg.
ENDLOOP.

MSGTYP 컬럼은 메시지 타입을 나타내며, E(Error) · A(Abort) · X(Exit) · W(Warning) · S(Success) · I(Information) 가 들어옵니다. 에러 판정은 보통 CA 'EAX'(Error/Abort/Exit 중 하나) 로 처리합니다.

메시지 텍스트 자체는 메시지 클래스(MSGID) + 번호(MSGNR) + 변수(MSGV1~MSGV4) 로 분해되어 들어오므로, 사용자에게 보여줄 때는 FORMAT_MESSAGE 함수로 한 문장으로 조립합니다.


흔히 빠뜨리는 함정

COMMIT WORK 가 따로 동작

CALL TRANSACTION 은 새 LUW 를 만들기 때문에 호출자의 COMMIT WORK 와 호출 트랜잭션의 COMMIT WORK 가 따로 동작합니다. 두 처리를 하나의 트랜잭션 단위로 묶고 싶다면 BAPI 같이 같은 LUW 안에서 동작하는 방식을 선택합니다.

UPDATE 'A' 직후 결과 SELECT

UPDATE 'A'(비동기) 모드에서 호출 직후 결과 테이블을 SELECT 하면, DB 반영이 아직 끝나지 않아 빈 결과가 나올 수 있습니다. 결과를 바로 확인해야 한다면 UPDATE 'S'(동기) 로 변경합니다.

sy-subrc 만 보고 정상 판정

sy-subrc = 0 이라도 메시지 테이블에 Warning · Information 이 들어오는 경우가 있습니다. 더 안전한 판정은 MESSAGES INTO 결과를 MSGTYP CA 'EAX' 로 한 번 더 확인하는 방식입니다.

MODE 'N' 으로만 운영, 디버깅 안 됨

운영에서는 MODE 'N' 이 표준이지만, 개발·검증 단계에서 같은 모드를 쓰면 에러 화면이 보이지 않아 원인 파악이 어렵습니다. 셀렉션 화면에 모드 파라미터를 두고 개발 환경에서는 'E', 운영에서는 'N' 으로 동적 분기합니다.

BDC_OKCODE 누락

화면 단위 종료 시점에 BDC_OKCODE(예: '/00'·'=SAVE') 가 빠지면 다음 화면으로 넘어가지 못해 멈춥니다. 화면마다 마지막 줄에 BDC_OKCODE 한 줄이 들어가야 합니다.

표준 BAPI 가 있는데 BDC 로 구현

자재 마스터 · 구매 오더 · 송장 같이 표준 BAPI 가 잘 정의된 객체는 BDC 보다 BAPI 가 안정적입니다. SAP 화면이 버전 업데이트되면 BDC 가 깨질 수 있지만 BAPI 는 시그니처가 유지됩니다. 표준 BAPI 우선 검토 후 없는 경우에만 BDC 를 사용합니다.

SHDB 레코딩의 서브스크린 행 미정리

SHDB 레코딩 결과에 포함되는 BDC_SUBSCR 행은 화면에 따라 동적 영역이라 그대로 두면 다른 데이터에서 실패할 수 있습니다. 이식 시 불필요한 서브스크린 행을 제거하고 필수 필드만 남깁니다.


전체 코드 — 복사용 통합본

자재 마스터(MM01) 를 자동 입력으로 생성하는 표준 흐름입니다. 실무에서는 표준 BAPI(BAPI_MATERIAL_SAVEDATA) 사용이 권장되며, 본 예제는 CALL TRANSACTION + BDC 패턴 자체를 익히는 용도입니다.

REPORT z_call_transaction_demo.

* ★ 사전 작업
* 1) SHDB 트랜잭션에서 MM01 레코딩 → ABAP 코드 자동 생성
* 2) 코드에서 BDC_SUBSCR 같은 불필요 행 제거
* 3) 본 프로그램의 perform fill_bdcdata 안에 핵심 행만 이식

PARAMETERS:
  p_matnr TYPE matnr   DEFAULT 'TEST-MAT-001',
  p_mtart TYPE mtart   DEFAULT 'FERT',
  p_mbrsh TYPE mbrsh   DEFAULT 'M',
  p_mode  TYPE c       DEFAULT 'N'.        " A · E · N

DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata,
      ls_bdcdata TYPE bdcdata,
      lt_messtab TYPE STANDARD TABLE OF bdcmsgcoll,
      ls_messtab TYPE bdcmsgcoll,
      lv_msg     TYPE string.

* 1) BDCDATA 채우기 — 화면 단위로 DYNBEGIN='X' 시작 후 필드 입력
PERFORM add_screen USING 'SAPLMGMM' '0060'.
PERFORM add_field  USING 'BDC_OKCODE' '=ENTR'.
PERFORM add_field  USING 'RMMG1-MATNR' p_matnr.
PERFORM add_field  USING 'RMMG1-MBRSH' p_mbrsh.
PERFORM add_field  USING 'RMMG1-MTART' p_mtart.

PERFORM add_screen USING 'SAPLMGMM' '0070'.
PERFORM add_field  USING 'BDC_OKCODE' '=ENTR'.
PERFORM add_field  USING 'MSICHTAUSW-DYTXT(01)' 'X'.   " 첫 번째 view 선택

PERFORM add_screen USING 'SAPLMGMM' '4004'.
PERFORM add_field  USING 'BDC_OKCODE' '=BU'.           " 저장
PERFORM add_field  USING 'MAKT-MAKTX' 'Sample Material'.
PERFORM add_field  USING 'MARA-MEINS' 'EA'.
PERFORM add_field  USING 'MARA-MATKL' '01'.

* 2) ★ 핵심: CALL TRANSACTION 호출 — MODE p_mode · UPDATE 'S'
CALL TRANSACTION 'MM01'
  USING    lt_bdcdata
  MODE     p_mode
  UPDATE   'S'
  MESSAGES INTO lt_messtab.

* 3) 결과 판정 — sy-subrc 만 보지 말고 메시지 테이블에서 E/A/X 확인
IF sy-subrc <> 0.
  WRITE: / '실행 중 에러가 발생했습니다. sy-subrc =', sy-subrc.
ENDIF.

LOOP AT lt_messtab INTO ls_messtab.
  CALL FUNCTION 'FORMAT_MESSAGE'
    EXPORTING
      id   = ls_messtab-msgid
      lang = sy-langu
      no   = ls_messtab-msgnr
      v1   = ls_messtab-msgv1
      v2   = ls_messtab-msgv2
      v3   = ls_messtab-msgv3
      v4   = ls_messtab-msgv4
    IMPORTING
      msg  = lv_msg.

  WRITE: / ls_messtab-msgtyp, lv_msg.
ENDLOOP.

* 4) 정상 판정 보조 — E/A/X 한 건도 없으면 성공
READ TABLE lt_messtab WITH KEY msgtyp = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
  WRITE: / '자재 생성 처리가 정상 완료되었습니다:', p_matnr.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  ADD_SCREEN — 새 화면 시작 줄 추가
*&---------------------------------------------------------------------*
FORM add_screen USING p_program TYPE any
                      p_dynpro  TYPE any.
  CLEAR ls_bdcdata.
  ls_bdcdata-program  = p_program.
  ls_bdcdata-dynpro   = p_dynpro.
  ls_bdcdata-dynbegin = 'X'.
  APPEND ls_bdcdata TO lt_bdcdata.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  ADD_FIELD — 필드 입력 줄 추가
*&---------------------------------------------------------------------*
FORM add_field USING p_fnam TYPE any
                     p_fval TYPE any.
  CLEAR ls_bdcdata.
  ls_bdcdata-fnam = p_fnam.
  ls_bdcdata-fval = p_fval.
  APPEND ls_bdcdata TO lt_bdcdata.
ENDFORM.

같이 보면 좋은 글은 "BAPI나 BDC 시 MESSAGE 함수를 통해 에러 확인 법" 입니다. BDCMSGCOLL 메시지를 사용자에게 ALV · POPUP 형태로 보여주는 후속 처리를 상세히 다룹니다.


요약

단계 구문 핵심
1 CALL TRANSACTION 'XX' 단순 호출 — SPA/GPA 로 초기값 전달 가능
2 MODE · UPDATE 화면 표시 모드(A/E/N) + 업데이트 동기 여부(S/A/L)
3 USING bdcdata BDCDATA 인터널 테이블에 화면·필드 입력 자동화
4 MESSAGES INTO BDCMSGCOLL 수집 → MSGTYP CA 'EAX' 로 에러 판정

CALL TRANSACTION 은 표준 화면을 자체 프로그램에서 호출하거나 자동 입력할 때 사용하는 ABAP 표준 명령어입니다. 호출 시점에 새 LUW 가 시작되어 호출자와 호출 대상의 트랜잭션 경계가 분리되며, USING bdcdata 와 결합하면 BDC 자동 입력까지 가능합니다. 표준 BAPI 가 있는 객체에는 BAPI 를 우선 검토하고, BAPI 가 없는 화면 기반 트랜잭션에 한해 CALL TRANSACTION + BDC 패턴을 사용하는 것이 안정적인 선택입니다.


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

CALL TRANSACTION · LEAVE TO TRANSACTION · SUBMIT 구문과 BDCDATA · BDCMSGCOLL 표준 구조체(패키지 SBDC), SHDB · MM01 · FORMAT_MESSAGE 트랜잭션·함수는 SAP NetWeaver 표준 기능으로 ECC 6.0 · S/4HANA on-premise 환경 공통으로 동작합니다. BDC 자동 입력은 화면 레이아웃 변경 시 깨질 수 있으므로 운영 전 MODE 'E' 로 검증 후 MODE 'N' 으로 전환하시기 바랍니다.