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

[SAP ABAP] 로컬 PC 파일 선택 — CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG 사용법 (다중 선택)

by Song.sh 2026. 5. 14.

ABAP 프로그램에서 사용자가 로컬 PC의 파일을 선택하도록 유도 해야 하는 상황은 자주 옵니다. Excel 업로드, PDF 표시, 첨부 파일 등록, 일괄 처리 입력 파일 지정 등. 매번 파일 경로를 텍스트로 직접 입력받기는 불편하고 오타 위험도 큽니다.

 

이때 사용하는 SAP 표준 클래스가 CL_GUI_FRONTEND_SERVICESFILE_OPEN_DIALOG 메서드입니다. Windows 표준 "파일 열기" 다이얼로그를 띄우고, 사용자가 선택한 파일(또는 여러 개) 의 절대 경로를 ABAP 변수로 돌려줍니다. 한 줄짜리 호출이지만 옵션이 풍부합니다.

 

이 글은 단일·다중 파일 선택, 초기 폴더 지정, 파일 필터 적용, 사용자 취소 처리 까지 자주 쓰는 패턴을 정리한 메모입니다. 폴더(디렉토리) 선택용 DIRECTORY_BROWSE 와 헷갈리지 않게 비교까지 함께.


핵심 원리

FILE_OPEN_DIALOG 의 시그니처는 다음과 같습니다.

파라미터 방향 설명
window_title IMPORTING (옵션) 다이얼로그 상단 제목
initial_directory IMPORTING (옵션) 다이얼로그가 처음 열릴 때 보여줄 폴더 (예: 'D:\')
multiselection IMPORTING (옵션) 'X' 면 다중 선택 허용 (기본은 단일)
file_filter IMPORTING (옵션) 확장자 필터 (예: *.xlsx 만 보이게)
file_table CHANGING 사용자가 선택한 파일 경로 목록 (filetable 타입)
rc CHANGING 선택된 파일 수 (오류 시 -1)
user_action CHANGING 사용자가 OK 눌렀는지(action_ok) / 취소했는지(action_cancel)

핵심 출력은 file_table(선택된 파일 목록) + user_action(취소 여부). 다중 선택을 켜면 결과가 여러 라인으로 들어오므로 후속 처리도 단일/다중 구분해서 만들어야 합니다.


1단계 — 기본 호출

가장 단순한 형태입니다. 변수 3개 선언하고 호출.

DATA: lt_file_table TYPE filetable,
      l_rc          TYPE i,
      lv_action     TYPE i.

cl_gui_frontend_services=>file_open_dialog(
  EXPORTING
    window_title      = '파일 선택'
    initial_directory = 'D:\'              " 시작점 폴더
    multiselection    = 'X'                 " 다중 선택 허용
  CHANGING
    file_table        = lt_file_table       " 선택된 파일 결과
    rc                = l_rc
    user_action       = lv_action ).

 

호출 시점에 Windows 표준 다이얼로그가 뜨고, 사용자가 파일을 고른 뒤 열기 또는 취소 를 누르면 그 결과가 변수에 채워져 돌아옵니다.


2단계 — 옵션별 활용

initial_directory — 시작 폴더 지정

매번 사용자가 어디서부터 탐색하게 할지 정합니다. 보통 자주 쓰는 경로를 미리 잡아두면 사용자 입장에서 클릭 수가 크게 줄어듭니다.

상황 권장 initial_directory
일반 업로드 파일 'C:\' 또는 'D:\'
사용자 바탕화면 GET_DESKTOP_DIRECTORY 호출해서 동적 입력
임시 폴더 GET_TEMP_DIRECTORY 호출해서 동적 입력

multiselection — 단일 vs 다중

기본값은 단일 선택. 'X' 로 설정하면 Ctrl/Shift 로 여러 파일 선택 가능. 후속 처리에서 단일/다중 분기 필요.

file_filter — 확장자 필터

특정 형식만 보이게 하려면 file_filter 사용. 파이프(|) 로 표시 텍스트와 패턴을 구분.

" Excel 만 보이게
cl_gui_frontend_services=>file_open_dialog(
  EXPORTING
    file_filter = |Excel (*.xlsx)\|*.xlsx\||
               && |{ cl_gui_frontend_services=>filetype_all }|
  ...
).

3단계 — 결과 처리 (단일 vs 다중)

사용자가 OK를 눌렀는지 먼저 확인한 뒤, 선택된 파일 개수에 따라 분기합니다.

IF lv_action = cl_gui_frontend_services=>action_ok.

  DATA(lv_lines) = lines( lt_file_table ).

  IF lv_lines <= 1.
    " 단일 파일 선택
    DATA(lv_filename) = lt_file_table[ 1 ]-filename.
    WRITE: lv_filename.

  ELSE.
    " 다중 파일 선택 — 라인별 처리
    LOOP AT lt_file_table INTO DATA(ls_file_table).
      WRITE: / ls_file_table-filename.
    ENDLOOP.

  ENDIF.

ENDIF.

 

핵심 포인트:

  • user_action = cl_gui_frontend_services=>action_ok 비교 — 사용자가 취소했을 경우 분기에서 빠짐
  • lt_file_table[ 1 ]-filename — 단일 파일이라도 결과는 테이블이므로 첫 라인 가져오기
  • LOOP — 다중 파일 처리. 각 라인의 filename 필드에 절대 경로

전체 코드

DATA: lv_action     TYPE i,
      lt_file_table TYPE filetable,
      l_rc          TYPE i.

cl_gui_frontend_services=>file_open_dialog(
  EXPORTING
    window_title      = '파일 선택'
    initial_directory = 'D:\'
    multiselection    = 'X'
    file_filter       = |Excel (*.xlsx)\|*.xlsx\||
                     && |{ cl_gui_frontend_services=>filetype_all }|
  CHANGING
    file_table        = lt_file_table
    rc                = l_rc
    user_action       = lv_action ).

IF lv_action = cl_gui_frontend_services=>action_ok.

  DATA(lv_lines) = lines( lt_file_table ).

  IF lv_lines <= 1.
    DATA(lv_filename) = lt_file_table[ 1 ]-filename.
    WRITE: lv_filename.
  ELSE.
    LOOP AT lt_file_table INTO DATA(ls_file_table).
      WRITE: / ls_file_table-filename.
    ENDLOOP.
  ENDIF.

ENDIF.

복붙해서 SE38에 그대로 실행하면 동작합니다.


관련 다이얼로그 비교

비슷한 용도의 메서드와 헷갈리지 않도록 정리.

메서드 용도
FILE_OPEN_DIALOG 파일 열기 (기존 파일 선택, 단일/다중 가능)
FILE_SAVE_DIALOG 파일 저장 (저장할 파일명·경로 지정, 단일만)
DIRECTORY_BROWSE 폴더(디렉토리) 선택 — 파일 아님
GET_DESKTOP_DIRECTORY / GET_TEMP_DIRECTORY 다이얼로그 없이 표준 폴더 경로 조회

선택 대상이 파일이면 FILE_OPEN_DIALOG, 저장 위치 지정이면 FILE_SAVE_DIALOG, 폴더면 DIRECTORY_BROWSE — 단순한 규칙입니다.


흔히 빠뜨리는 함정

user_action 체크 누락

사용자가 다이얼로그를 그냥 닫거나 취소를 누르면 file_table 이 비어 있거나 이전 값이 남아 있을 수 있음. 후속 로직이 그걸 모르고 처리하면 엉뚱한 파일을 열 수 있음. 반드시 user_action = cl_gui_frontend_services=>action_ok 비교 후 처리.

단일 선택인데 결과를 무조건 LOOP 처리

다중 선택을 안 켜도 결과는 항상 테이블(filetable) 입니다. 결과를 가져올 때 lt_file_table[ 1 ] 식으로 인덱스 접근만 해도 충분. 굳이 LOOP 안 써도 됨.

다중 선택 켜놓고 단일만 가정

다중 선택 옵션(multiselection = 'X') 켜놓고 후속에서 [ 1 ] 만 사용하면 사용자가 여러 파일 선택해도 첫 번째만 처리됨. 반대 케이스는 다중 안 켰는데 LOOP — 동작은 하지만 의도가 불분명.

file_filter 구문 실수

파이프 문자가 ABAP에서 string template 특수문자이므로 | 로 이스케이프해야 함. 또한 표시명과 패턴을 두 번 써야 동작.

  • 잘못된 예: 'Excel|*.xlsx'
  • 올바른 예: |Excel (.xlsx)|.xlsx||

한글 경로 깨짐

filetable 결과는 한글 경로를 정상 처리하지만, 후속 단계(예: 외부 라이브러리·서버 측 처리) 에서 인코딩 문제로 깨질 수 있음. 가능하면 ASCII 경로 환경에서 테스트 권장.

initial_directory 미존재 폴더

존재하지 않는 경로를 지정하면 다이얼로그가 디폴트 위치(보통 Documents) 로 열림. directory_exist 메서드로 사전 확인 권장.

서버 사이드 실행 불가

CL_GUI_FRONTEND_SERVICES 는 SAP GUI 클라이언트 컨트롤. 배치 잡(SM37) 등 GUI 없는 환경에서 호출하면 예외 발생. 서버 파일 처리는 OPEN DATASET + AL11 사용.


요약

단계 처리 핵심
1 변수 선언 filetable · l_rc · lv_action 3개
2 다이얼로그 호출 window_title · initial_directory · multiselection · file_filter
3 사용자 액션 확인 IF lv_action = cl_gui_frontend_services=>action_ok
4 결과 처리 단일: lt_file_table[ 1 ]-filename / 다중: LOOP

FILE_OPEN_DIALOG 는 ABAP에서 가장 흔하게 등장하는 사용자 인터랙션 컨트롤 중 하나입니다. 옵션 한두 가지(multiselection·file_filter) 만 잘 활용해도 사용자 입장에서 훨씬 쾌적한 입력 화면을 만들 수 있습니다. 폴더가 필요할 때는 DIRECTORY_BROWSE, 저장 위치 지정에는 FILE_SAVE_DIALOG 와 같이 짝꿍 메서드를 기억해두면 어떤 시나리오에도 빠르게 적용할 수 있습니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. CL_GUI_FRONTEND_SERVICES 는 SAP GUI 클라이언트 환경에서만 동작하며 서버 배치에서는 사용할 수 없습니다. SAP 버전·Windows 버전에 따라 다이얼로그 모양과 옵션이 다를 수 있으므로 운영 환경 적용 전 개발 시스템에서 확인하시기 바랍니다.