본문 바로가기
ALV · 화면 · 리포트

[SAP ABAP] ALV Variant 사용자별 분리 저장하는 법 (DISVARIANT 활용)

by Song.sh 2026. 5. 8.

ALV 리포트를 운영하다 보면 "사용자마다 컬럼 순서나 필터를 다르게 저장하고 싶다"는 요구가 자주 나옵니다. SAP는 이를 위해 ALV Variant(레이아웃) 기능을 표준으로 제공하지만, 단순히 ALV를 띄우기만 하면 공용 Variant로만 저장돼서 다른 사용자가 변경한 내용이 모두에게 영향을 줍니다.

이번 글에서는 DISVARIANT 구조체를 활용해서 ALV Variant를 사용자별로 자동 분리 저장하는 방법을 정리합니다.


핵심 개념 — DISVARIANT 구조체

ALV에서 Variant를 저장할 때 SAP는 DISVARIANT 라는 구조체를 받아 저장 정책을 결정합니다. 주요 필드는 다음과 같습니다.

필드 설명
REPORT Variant가 속한 프로그램명. 보통 sy-repid 사용
USERNAME 사용자 ID. sy-uname 을 넣으면 사용자별 분리 저장
HANDLE 한 프로그램 안에서 ALV 화면이 여러 개일 때 구분용
VARIANT 기본 적용할 Variant 이름 (선택)

핵심은 USERNAME 필드입니다. 이 값을 채워두면 SAP가 자동으로 Variant 저장 시 사용자 ID 기반으로 분리합니다.


단계별 구현

1단계 — Variant 변수 선언

ALV를 띄우는 프로그램(또는 펑션 그룹) 글로벌 영역에 다음 변수를 선언합니다.

DATA: gt_variant TYPE disvariant,
      gv_save    TYPE char01.
  • gt_variant — Variant 정보 구조체
  • gv_save — 저장 모드 ('U' = 사용자별, 'A' = 전사 공용 + 사용자별)

2단계 — CREATE_VARIANT 폼 작성

PBO(또는 ALV 초기화 시점)에서 호출할 폼을 작성합니다.

FORM create_variant.

  CLEAR gt_variant.

  gt_variant-report   = sy-repid.
  gt_variant-username = sy-uname.

  CASE abap_true.
    WHEN r_create.
      gt_variant-handle = '1'.
    WHEN r_change.
      gt_variant-handle = '2'.
    WHEN r_search.
      gt_variant-handle = '3'.
  ENDCASE.

  " 저장 모드 결정
  " 'A' = 전사 + 사용자별 모두 가능 (관리자/배포용 계정)
  " 'U' = 사용자별만 가능 (일반 사용자)
  IF sy-uname CP 'ADMIN*'.   " 회사 관리자 계정 prefix는 환경에 맞게 변경
    gv_save = 'A'.
  ELSE.
    gv_save = 'U'.
  ENDIF.

ENDFORM.

💡 위 코드의 'ADMIN*' 부분은 회사마다 표준이 다릅니다. 본인 회사의 관리자/배포용 계정 prefix로 바꿔서 사용하세요. 일반 사용자만 사용한다면 이 분기 자체를 빼고 gv_save = 'U' 만 두면 됩니다.

3단계 — ALV 호출 시 적용

ALV 그리드를 표시하는 메소드 호출 시 위에서 만든 gt_variant를 함께 넘깁니다.

CALL METHOD go_alv->set_table_for_first_display
  EXPORTING
    is_variant      = gt_variant
    i_save          = gv_save
    is_layout       = gs_layout
  CHANGING
    it_outtab       = gt_data[]
    it_fieldcatalog = gt_fcat[].

핵심은 is_variant = gt_varianti_save = gv_save 두 줄입니다. 이것만으로 사용자별 Variant 저장이 활성화됩니다.


동작 원리 — 무엇이 자동으로 처리되나

이렇게 설정해두면 추가 로직 없이도 다음이 자동으로 처리됩니다.

  • 사용자가 저장한 Variant가 없으면 → 기본 세팅(또는 디폴트 Variant)으로 조회
  • 사용자가 저장한 Variant가 있으면 → 본인이 저장한 Variant로 자동 조회
  • 다른 사용자의 Variant 변경 → 본인 화면에 영향 없음

기본 Variant 배포하는 방법

처음 프로그램을 배포할 때 공용 기본 세팅을 같이 넘기면 사용자가 처음 진입할 때 깔끔한 화면을 보게 됩니다.

절차

  1. ALV 화면에서 원하는 컬럼 순서·필터·정렬을 설정
  2. 상단 메뉴 레이아웃 관리저장 클릭
  3. 저장 다이얼로그에서 "이 레이아웃을 기본값으로" 또는 유사 옵션 체크
  4. 사용자별이 아닌 공용으로 저장 (관리자 계정으로)

이렇게 배포된 기본 Variant는 사용자가 본인만의 Variant를 만들기 전까지 모든 사용자에게 동일하게 적용됩니다.


활용 팁

한 프로그램에 ALV 화면이 여러 개라면 — HANDLE 활용

리포트 안에서 화면이 여러 개(예: 생성/변경/조회 모드)인 경우, 각 화면마다 다른 Variant를 저장하고 싶다면 gt_variant-handle 값을 다르게 지정합니다.

WHEN r_create.
  gt_variant-handle = '1'.
WHEN r_change.
  gt_variant-handle = '2'.
WHEN r_search.
  gt_variant-handle = '3'.

같은 프로그램 + 같은 사용자라도 HANDLE 값이 다르면 별도 Variant로 저장됩니다.

저장 모드 (I_SAVE) 정리

의미
'X' 저장 불가 (조회 전용)
'U' 사용자별 저장만 가능
' ' 전사(공용) 저장만 가능
'A' 전사 + 사용자별 둘 다 가능

대부분의 경우 일반 사용자는 'U', 관리자/배포용 계정은 'A' 로 분기하는 패턴이 표준입니다.


주의사항

USERNAME 필드를 비우면 공용 Variant로 저장됨

gt_variant-username = sy-uname. 이 줄을 빠뜨리면 모든 사용자가 같은 Variant를 공유하게 됩니다. 사용자 A가 컬럼을 바꾸면 B 화면도 같이 바뀌므로 운영 환경에서는 반드시 채워줘야 합니다.

Variant는 클라이언트별 저장

Variant는 SAP 클라이언트(예: 100, 200) 단위로 저장됩니다. DEV 클라이언트에서 만든 Variant는 자동으로 PRD로 가지 않으니, 표준 Variant를 운영에 배포하려면 별도 트랜스포트 처리가 필요합니다.

사용자 ID prefix 분기 시 주의

위 예시 코드의 IF sy-uname CP 'ADMIN*' 같은 분기는 회사마다 표준이 다릅니다. 일반 사용자, 관리자, 인터페이스 계정 등을 구분하는 prefix가 회사 정책에 따라 정해져 있으니 본인 회사 표준에 맞게 수정하세요.


요약

단계 작업
1 gt_variant TYPE disvariant 선언
2 username = sy-uname, report = sy-repid 채우기
3 필요시 HANDLE 로 화면별 분리
4 gv_save = 'U' (사용자별만) 또는 'A' (관리자)
5 ALV 호출 시 is_variant, i_save 파라미터로 전달

ALV Variant 사용자별 분리는 5줄 정도의 추가 코드로 큰 사용자 경험 개선을 가져옵니다. 한 번 적용해두면 사용자별 컬럼 순서·필터·정렬이 모두 본인 화면에만 영향을 주게 되어, 부서 공용 리포트에서 발생하는 충돌이 사라집니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. 회사별 사용자 ID 표준과 권한 정책에 따라 일부 코드가 다를 수 있으므로 적용 전 확인하시기 바랍니다.