ABAP 에서 다른 리포트를 현재 프로그램 안에서 그대로 실행 시키고 싶을 때 가장 먼저 떠오르는 명령어가 SUBMIT 입니다. 외부에서 짠 표준 리포트의 결과를 받아오거나, 사용자 입력값을 가공해서 다른 프로그램에 던져 넣거나, 백그라운드 잡으로 예약하는 일까지 한 줄로 처리할 수 있는 강력한 명령어입니다.
SUBMIT 의 핵심은 단순히 “프로그램을 실행” 하는 것이 아니라 호출된 프로그램의 Selection Screen 에 어떻게 값을 넣을지 와 호출된 프로그램의 결과를 어떻게 받아올지 를 동시에 다룬다는 점입니다. WITH · WITH SELECTION-TABLE · AND RETURN · EXPORTING LIST TO MEMORY · VIA JOB 같은 다양한 부가절이 그래서 존재합니다.
이 글에서는 SUBMIT 의 정의와 동작 방식, Selection Screen 파라미터 전달 패턴, 호출된 프로그램과 데이터를 주고받는 방법(ABAP MEMORY), 그리고 백그라운드 잡 등록까지 한 번에 정리합니다.
핵심 — SUBMIT vs CALL TRANSACTION vs PERFORM
| 구분 | SUBMIT | CALL TRANSACTION | PERFORM |
|---|---|---|---|
| 대상 | 실행 가능 Report(EXE/RP) | T-Code 가 있는 트랜잭션 | 같은 프로그램 내 Form 루틴 |
| 실행 세션 | 새 내부 세션 (메모리 분리) | 새 트랜잭션 세션 | 같은 세션 공유 |
| 파라미터 전달 | Selection Screen 값 (WITH · SELECTION-TABLE) |
BDC 데이터 또는 SET/GET PARAMETER | USING · CHANGING |
| 제어 반환 | AND RETURN 있을 때만 |
기본 반환 | 항상 반환 |
| 결과 받기 | EXPORTING LIST TO MEMORY · ABAP_MEMORY |
SET/GET PARAMETER · sy-subrc | CHANGING 변수 |
| 주 사용 | 표준 리포트 재활용 · 백그라운드 잡 예약 | 화면 자동화(BDC) · T-Code 호출 | 코드 분리 · 재사용 |
선택 기준 — 표준 리포트의 결과를 그대로 받아 가공 하거나 백그라운드 잡으로 등록 해야 하면 SUBMIT, 화면 처리 자동화 가 필요하면 CALL TRANSACTION, 같은 프로그램 내부 로직 분리 만 필요하면 PERFORM 입니다.
1단계 — 기본 SUBMIT 호출
가장 단순한 형태는 프로그램 이름 하나만 지정하는 호출입니다. 이 경우 호출된 프로그램의 Selection Screen 이 그대로 화면에 뜨고, 사용자가 값을 직접 입력해야 합니다. 그리고 호출한 프로그램은 거기서 끝납니다 — 제어가 돌아오지 않습니다.
[1] 가장 단순한 호출
└ SUBMIT zrxx_report_a.
[2] 화면 띄우지 않고 바로 실행
└ SUBMIT zrxx_report_a VIA SELECTION-SCREEN.
※ 사용자에게 Selection Screen 을 보여줌 (값 입력 가능)
[3] Selection Screen 자체를 숨김 (디폴트 값으로 실행)
└ SUBMIT zrxx_report_a.
※ VIA SELECTION-SCREEN 없으면 화면 안 뜸
기본형의 가장 큰 함정 — 호출 후 제어가 돌아오지 않는다 는 점입니다. 호출한 프로그램의 SUBMIT 이후 코드는 절대 실행되지 않습니다. 호출한 쪽 흐름을 유지하려면 반드시 AND RETURN 을 붙여야 합니다.
SUBMIT 사용 형식 — Static vs Dynamic
| 형식 | 문법 | 특징 |
|---|---|---|
| Static | SUBMIT report_name. |
컴파일 시점에 프로그램명이 고정. 수행 속도 빠름. |
| Dynamic | SUBMIT (string_var). |
런타임에 변수로 프로그램명 지정. Static 보다 약간 느림. |
SUBMIT 의 모든 부가절 — 한눈에 보기
| 부가절 | 의미 |
|---|---|
LINE-SIZE col LINE-COUNT line |
호출되는 프로그램의 출력 Line Size · Line Count 지정 |
USING SELECTION-SCREEN screen_number |
호출되는 프로그램의 특정 Selection Screen 번호를 지정해서 그 화면의 변수들에 값을 넘김 |
VIA SELECTION-SCREEN |
Selection Screen 자체는 화면에 띄우지 않지만 값은 그대로 넘기는 옵션 |
AND RETURN |
호출된 프로그램 종료 후 호출한 프로그램의 나머지 코드를 이어 실행. 없으면 호출한 프로그램도 같이 종료. |
EXPORTING LIST TO MEMORY |
호출된 프로그램의 List 출력을 메모리에 저장. 호출한 쪽에서 LIST_FROM_MEMORY 로 받음. |
USER user VIA JOB job NUMBER n |
백그라운드 잡으로 등록. 결과/출력 List 는 SPOOL 에 남고 Job 화면에서 조회. |
USING SELECTION-SETS OF PROGRAM prog |
호출되는 프로그램을 기존 Variant 로 수행. Variant 가 사전에 존재해야 함. |
WITH (호출 변수) = (값/변수) |
Selection Screen 의 SELECT-OPTIONS·PARAMETERS 에 값을 넘김. 위의 USING SELECTION-SETS 와는 함께 사용 불가. |
2단계 — Selection Screen 파라미터 전달
SUBMIT 의 진가는 호출된 프로그램의 Selection Screen 에 값을 넣어 호출할 수 있다는 점입니다. 두 가지 방식이 있고, 패턴에 따라 선택이 달라집니다.
방식 1 — WITH 절로 개별 지정
값이 몇 개 없고 정적이면 WITH 절로 직접 지정하는 게 가장 직관적입니다.
" PARAMETER 지정
SUBMIT zrxx_report_a
WITH p_bukrs = '1000'
WITH p_werks = '0001'
AND RETURN.
" SELECT-OPTIONS 지정
SUBMIT zrxx_report_a
WITH s_matnr BETWEEN 'TEST-MAT-001' AND 'TEST-MAT-999'
WITH s_ernam EQ sy-uname
AND RETURN.
BETWEEN · EQ · IN 같은 연산자를 그대로 쓸 수 있습니다.
방식 2 — WITH SELECTION-TABLE 로 RANGE 변수 전달
조건이 동적으로 만들어지거나 IN-LIST 가 길면 WITH SELECTION-TABLE 가 훨씬 깔끔합니다. RSPARAMS 또는 RSPARAMSL_255 형태의 내부 테이블에 한 줄씩 채워서 한 번에 던집니다.
DATA: lt_params TYPE TABLE OF rsparams,
ls_param TYPE rsparams.
" 단일값 추가
ls_param-selname = 'P_BUKRS'.
ls_param-kind = 'P'. " P = Parameter, S = Select-Option
ls_param-low = '1000'.
APPEND ls_param TO lt_params.
CLEAR ls_param.
" SELECT-OPTIONS 추가
ls_param-selname = 'S_MATNR'.
ls_param-kind = 'S'.
ls_param-sign = 'I'.
ls_param-option = 'BT'.
ls_param-low = 'TEST-MAT-001'.
ls_param-high = 'TEST-MAT-999'.
APPEND ls_param TO lt_params.
" 호출
SUBMIT zrxx_report_a
WITH SELECTION-TABLE lt_params
AND RETURN.
RSPARAMS핵심 필드 —SELNAME(Selection Screen 변수명) ·KIND(P=Parameter, S=Select-Option) ·SIGN/OPTION/LOW/HIGH는 RANGE 와 동일.
이 방식의 장점은 RANGE 변수를 그대로 변환해서 넣을 수 있다 는 점입니다. SELECTION-OPTIONS 값에 RANGE 변수를 가공해서 그대로 넘겨줄 수 있다는 의미입니다.
실전 예시 — RSPARAMS 동적 채움 vs 변수 직접 매핑
같은 결과를 얻는 두 가지 패턴을 비교해봅니다. 호출되는 프로그램에 SELECT-OPTIONS: so_matnr FOR mara-matnr. 가 선언돼 있다고 가정.
" ─────────────── 예시 1 — RSPARAMS 로 직접 채워서 전송 ───────────────
DATA: lt_para TYPE TABLE OF rsparams WITH HEADER LINE.
CLEAR lt_para.
lt_para-selname = 'SO_MATNR'. " * 호출될 프로그램에 존재하는 조회조건
lt_para-kind = 'S'.
lt_para-sign = 'I'.
lt_para-option = 'EQ'.
lt_para-low = 'TEST-MAT-001'.
APPEND lt_para.
SUBMIT zrxx_report_target
WITH SELECTION-TABLE lt_para
AND RETURN.
" ─────────────── 예시 2 — RANGE 변수 직접 매핑 (lt_para 불필요) ───────────────
" 호출한 프로그램에 동일한 형태의 SELECT-OPTIONS 가 있으면 그대로 넘김
" Select-options: so_matnr FOR mara-matnr.
SUBMIT zrxx_report_target
WITH so_matnr = so_matnr
AND RETURN.
예시 2는 호출한 프로그램의 RANGE 변수를 그대로 호출되는 프로그램의 같은 이름 RANGE 변수에 넘기는 가장 간결한 형태입니다. 양쪽 변수의 이름이 같고 구조도 같을 때 가장 빠르게 쓸 수 있습니다.
3단계 — 호출 후 제어 흐름
SUBMIT 의 가장 흔한 함정이 제어가 안 돌아온다 는 점이라고 했습니다. 이걸 제어하는 두 가지 부가절을 정확히 짚고 갑니다.
AND RETURN — 제어 반환
[AND RETURN 없음]
└ 호출 프로그램 → SUBMIT → 호출된 프로그램 실행 → 종료 (호출 프로그램도 같이 종료)
[AND RETURN 있음]
└ 호출 프로그램 → SUBMIT → 새 내부 세션에서 실행 → 종료 → 호출 프로그램의 SUBMIT 다음 줄
AND RETURN 을 붙이면 호출된 프로그램이 새 내부 세션(internal session) 에서 돌고, 끝나면 호출한 프로그램의 SUBMIT 다음 줄부터 이어집니다. 99% 이상의 경우 이 옵션을 붙입니다.
VIA SELECTION-SCREEN — 화면 표시 여부
" Selection Screen 을 사용자에게 보여줌 (값 확인 / 수정 가능)
SUBMIT zrxx_report_a
WITH p_bukrs = '1000'
VIA SELECTION-SCREEN
AND RETURN.
" Selection Screen 숨김 (값을 그대로 가지고 바로 실행)
SUBMIT zrxx_report_a
WITH p_bukrs = '1000'
AND RETURN.
대부분의 자동화 시나리오에서는 VIA SELECTION-SCREEN 을 생략해서 화면을 안 띄우고 바로 실행시킵니다. 사용자가 한 번 더 확인해야 할 때만 추가합니다.
4단계 — 호출된 프로그램에서 결과 받아오기
호출한 프로그램과 호출된 프로그램은 메모리가 분리된 새 내부 세션 이라서, 변수를 그냥 공유할 수 없습니다. 결과를 받아오려면 별도의 전달 메커니즘이 필요합니다. 세 가지가 자주 쓰입니다.
방식 A — EXPORTING LIST TO MEMORY (리스트 출력 결과)
호출된 프로그램이 WRITE 로 화면에 출력하는 리스트가 있다면, 그 출력 자체를 메모리에 저장해 가져올 수 있습니다.
DATA: lt_list TYPE TABLE OF abaplist.
" 1) 리스트를 메모리에 저장하면서 호출
SUBMIT zrxx_report_a
WITH p_bukrs = '1000'
EXPORTING LIST TO MEMORY
AND RETURN.
" 2) 메모리에서 리스트 읽기
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
listobject = lt_list
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
CALL FUNCTION 'WRITE_LIST'
TABLES
listobject = lt_list.
ENDIF.
LIST_FROM_MEMORY표준 시그니처 —TABLES LISTOBJECT LIKE ABAPLIST·EXCEPTIONS NOT_FOUND. 메모리 ID 는 SAP 내부적으로'%_LIST'를 사용.
방식 B — ABAP MEMORY (변수 자체 공유)
리스트가 아니라 내부 테이블이나 변수값 자체 를 주고받고 싶을 때 가장 흔한 패턴. 호출된 프로그램이 EXPORT, 호출한 프로그램이 IMPORT.
" ============ 호출된 프로그램 (zrxx_report_b) ============
DATA: gt_result TYPE TABLE OF mara.
SELECT * FROM mara INTO TABLE gt_result UP TO 100 ROWS.
EXPORT gt_result FROM gt_result TO MEMORY ID 'XX_RESULT'.
" ============ 호출한 프로그램 ============
DATA: lt_result TYPE TABLE OF mara.
SUBMIT zrxx_report_b
AND RETURN.
IMPORT gt_result TO lt_result FROM MEMORY ID 'XX_RESULT'.
" 메모리 정리
FREE MEMORY ID 'XX_RESULT'.
ABAP_MEMORY 핵심 규칙 — EXPORT 의 변수명과 IMPORT 의 변수명이 같아야 합니다. EXPORT gt_result 했으면 받는 쪽도 IMPORT gt_result TO ... 로 같은 이름을 써야 합니다. 다른 이름으로 받으려면 FROM 절을 추가해서 매핑해야 합니다.
실전 예시 — MES 연계 시나리오에서의 ABAP_MEMORY
외부 시스템에서 RFC 로 호출되는 함수 안에서 다시 표준/사용자 리포트를 SUBMIT 으로 돌리고, 그 결과로 CBO 테이블에 원화값을 채우는 패턴을 예로 봅니다.
" ─────────────── 호출하는 프로그램 (RFC FM 내부) ───────────────
DATA: gv_r TYPE char01 VALUE 'X'.
" MES 에서 해당 FUNCTION 호출 시 ZRXX0119 프로그램 실행
" CBO 테이블에 원화값 넣기 용도
" ABAP_MEMORY 로 변수에 데이터 전송 시
" 호출하는 프로그램 변수와 이름이 같아야 함
EXPORT gv_r TO MEMORY ID 'SUBMIT_DATA'. " MEMORY ID 는 임의로 지정
SUBMIT zrxx0119 AND RETURN.
" ─────────────── 호출된 프로그램 (zrxx0119) ───────────────
DATA: gv_r TYPE char01.
" 호출한 쪽과 같은 변수명(gv_r) 사용
IMPORT gv_r FROM MEMORY ID 'SUBMIT_DATA'.
" 이후 gv_r 값을 사용해 CBO 테이블 갱신 로직 실행
" ...
핵심은 양쪽의 변수 이름(gv_r)이 완전히 동일 하다는 점입니다. MEMORY ID('SUBMIT_DATA')는 작성자가 임의로 지정 가능하지만, 변수명은 일치시켜야 IMPORT 가 값을 찾아 들어갑니다.
방식 C — SET/GET PARAMETER (Parameter ID)
단일값 한두 개만 전달할 때는 SET/GET PARAMETER 도 간단합니다. SU3 에서 정의된 Parameter ID 슬롯을 거치는 방식.
" 보내는 쪽
SET PARAMETER ID 'BUK' FIELD '1000'.
SUBMIT zrxx_report_c AND RETURN.
" 받는 쪽 (zrxx_report_c)
DATA: lv_bukrs TYPE bukrs.
GET PARAMETER ID 'BUK' FIELD lv_bukrs.
5단계 — 백그라운드 잡으로 등록 (VIA JOB)
SUBMIT 으로 리포트를 즉시 실행 이 아니라 백그라운드 잡 으로 예약할 수도 있습니다. 표준 함수 두 개와 SUBMIT 의 VIA JOB 절을 묶어서 사용합니다.
[1] JOB_OPEN 호출 → 잡 헤더 생성 → JOBCOUNT 받기
└ CALL FUNCTION 'JOB_OPEN' ...
[2] SUBMIT VIA JOB ... AND RETURN → 잡에 스텝 추가
└ SUBMIT zrxx_report_d
VIA JOB lv_jobname NUMBER lv_jobcount
WITH p_bukrs = '1000'
AND RETURN.
[3] JOB_CLOSE → 잡 등록 완료 (즉시 실행 또는 예약)
└ CALL FUNCTION 'JOB_CLOSE' ...
세 호출이 순서대로 한 세트입니다. 가운데 SUBMIT 은 반드시 VIA JOB ... NUMBER ... 와 AND RETURN 을 같이 써야 합니다 (잡 등록만 하고 호출한 프로그램으로 돌아와야 다음 SUBMIT 이나 JOB_CLOSE 를 호출할 수 있기 때문).
DATA: lv_jobname TYPE tbtcjob-jobname VALUE 'ZXX_NIGHTLY_REPORT',
lv_jobcount TYPE tbtcjob-jobcount.
" 1) 잡 열기
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
" 2) SUBMIT 으로 스텝 추가
SUBMIT zrxx_report_d
VIA JOB lv_jobname NUMBER lv_jobcount
WITH p_bukrs = '1000'
AND RETURN.
" 3) 잡 닫기 (즉시 실행)
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = 'X' " 즉시 실행
EXCEPTIONS
OTHERS = 1.
JOB_OPEN표준 시그니처 — IMPORTINGJOBNAME, EXPORTINGJOBCOUNT/INFO.JOB_CLOSE는 즉시 실행이면STRTIMMED = 'X', 시간 예약이면SDLSTRTDT/SDLSTRTTM지정.
백그라운드 잡으로 등록한 경우의 큰 함정 — EXPORTING LIST TO MEMORY 는 동작하지 않습니다. 백그라운드 실행은 결과가 SPOOL 로 가기 때문에 ABAP 메모리에 들어가지 않습니다. 백그라운드에서 결과를 보내려면 EXPORT ... TO DATABASE 또는 결과를 DB 테이블에 저장하는 방식을 써야 합니다.
자주 빠뜨리는 함정
AND RETURN 빼먹기
가장 흔한 실수. SUBMIT zrxx_report. 만 쓰면 호출한 프로그램이 SUBMIT 시점에 같이 종료됩니다. SUBMIT 다음 줄에 ALV 출력이나 메시지가 있어도 절대 실행되지 않으니, 자동화 흐름에서는 거의 항상 AND RETURN 을 붙입니다.
EXPORT/IMPORT 변수명 불일치
ABAP_MEMORY 로 데이터를 주고받을 때 보내는 쪽과 받는 쪽의 변수명이 다르면 데이터를 못 받습니다. EXPORT gt_result FROM gt_result TO MEMORY ID '...' 형태로 명시해두면 헷갈리지 않습니다.
백그라운드에서 LIST TO MEMORY 시도
SM36/SM37 로 돌리는 잡에서는 EXPORTING LIST TO MEMORY 의 결과가 ABAP 메모리에 안 남고 SPOOL 로 흘러갑니다. 백그라운드에서 결과를 받아야 한다면 호출된 프로그램 자체가 결과를 DB 테이블에 저장하도록 설계를 바꿔야 합니다.
Selection Screen 변수명 대소문자
RSPARAMS 의 SELNAME 은 대문자로 넣어야 합니다. 'p_bukrs' 가 아니라 'P_BUKRS' 로. 소문자로 넣으면 값이 안 들어가는데 에러도 안 떠서 디버깅이 어려운 함정입니다.
FREE MEMORY 누락
ABAP_MEMORY 에 EXPORT 해놓고 안 지우면 같은 사용자 세션에서 다음 호출에 이전 값이 남아 있을 수 있습니다. IMPORT 끝난 뒤 FREE MEMORY ID '...' 로 정리해주는 습관이 안전합니다.
전체 코드 — 복사용 통합본
지금까지 다룬 SUBMIT 패턴을 하나의 ABAP 프로그램으로 통합한 예시입니다. SE38 에 붙여 그대로 실행해보면 동작을 확인할 수 있습니다 (회사 환경의 표준 리포트 이름으로 zrxx_report_target 만 교체).
REPORT zrxx_submit_demo.
DATA: lt_params TYPE TABLE OF rsparams,
ls_param TYPE rsparams,
lt_list TYPE TABLE OF abaplist,
lt_result TYPE TABLE OF mara.
DATA: lv_jobname TYPE tbtcjob-jobname VALUE 'ZXX_SUBMIT_DEMO',
lv_jobcount TYPE tbtcjob-jobcount.
* ─────────────────────────────────────────────
* 1) WITH 절로 개별 파라미터 전달 + AND RETURN
* ─────────────────────────────────────────────
SUBMIT zrxx_report_target
WITH p_bukrs = '1000'
WITH p_werks = '0001'
AND RETURN.
* ─────────────────────────────────────────────
* 2) WITH SELECTION-TABLE 로 RSPARAMS 동적 전달
* ※ SELNAME 은 반드시 대문자
* ─────────────────────────────────────────────
ls_param-selname = 'P_BUKRS'.
ls_param-kind = 'P'.
ls_param-low = '1000'.
APPEND ls_param TO lt_params.
CLEAR ls_param.
ls_param-selname = 'S_MATNR'.
ls_param-kind = 'S'.
ls_param-sign = 'I'.
ls_param-option = 'BT'.
ls_param-low = 'TEST-MAT-001'.
ls_param-high = 'TEST-MAT-999'.
APPEND ls_param TO lt_params.
SUBMIT zrxx_report_target
WITH SELECTION-TABLE lt_params
AND RETURN.
* ─────────────────────────────────────────────
* 3) EXPORTING LIST TO MEMORY 로 리스트 받기
* ─────────────────────────────────────────────
SUBMIT zrxx_report_target
WITH SELECTION-TABLE lt_params
EXPORTING LIST TO MEMORY
AND RETURN.
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
listobject = lt_list
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
CALL FUNCTION 'WRITE_LIST'
TABLES
listobject = lt_list.
ENDIF.
* ─────────────────────────────────────────────
* 4) ABAP_MEMORY 로 내부 테이블 받기
* ※ 호출된 프로그램에서 EXPORT gt_result ... ID 'XX_RESULT' 필요
* ※ 보내는 변수명과 받는 변수명이 같아야 함
* ─────────────────────────────────────────────
SUBMIT zrxx_report_target
WITH SELECTION-TABLE lt_params
AND RETURN.
IMPORT gt_result TO lt_result FROM MEMORY ID 'XX_RESULT'.
FREE MEMORY ID 'XX_RESULT'.
* ─────────────────────────────────────────────
* 5) VIA JOB 으로 백그라운드 잡 등록
* ─────────────────────────────────────────────
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
SUBMIT zrxx_report_target
VIA JOB lv_jobname NUMBER lv_jobcount
WITH SELECTION-TABLE lt_params
AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = 'X' " 즉시 실행
EXCEPTIONS
OTHERS = 1.
ENDIF.
요약
| 단계 | 핵심 부가절 | 언제 쓰나 |
|---|---|---|
| 1 | AND RETURN |
호출 후 제어 돌려받기 (거의 필수) |
| 2 | WITH · WITH SELECTION-TABLE |
Selection Screen 값 전달 (정적/동적) |
| 3 | VIA SELECTION-SCREEN |
사용자에게 화면 한 번 더 보여줄 때만 |
| 4 | EXPORTING LIST TO MEMORY · ABAP MEMORY |
호출된 프로그램 결과 받기 (포그라운드만) |
| 5 | VIA JOB ... NUMBER ... |
백그라운드 잡으로 등록 (JOB_OPEN·JOB_CLOSE 와 세트) |
SUBMIT 은 결국 다른 리포트를 내 흐름 안에 끼워 넣는 명령어입니다. AND RETURN 으로 제어를 챙기고, WITH 또는 WITH SELECTION-TABLE 로 값을 넘기고, ABAP_MEMORY 로 결과를 받아오면 표준 리포트의 99% 시나리오를 커버할 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
SUBMIT 의 세부 동작과 부가절은 NetWeaver 버전(ECC 6.0 / S/4HANA on-premise / S/4HANA Cloud)과 시스템 환경에 따라 일부 차이가 있을 수 있으니, 실제 적용 시에는 해당 시스템의 Selection Screen 구조와 표준 리포트 동작을 확인하고 사용하시기 바랍니다.