본문 바로가기
SAP ABAP/ABAP_오류해결

[ABAP] 버튼 활성화/비활성화 문제

by 유기억저장소 2025. 8. 10.

[ 문제상황 ]

문제 : 교재코드에 해당하는 사원이 있을 때만 담당사원을 조회하는 버튼이 활성화 되고,

해당하지 않는 경우에는 비활성화 되어야 하는데, 계속되서 활성화 되어 있는 상황

 

아무것도 실행 하지 않는 상황에서도 버튼이 활성화 되어 있음 

 

 

혹시나 하고 버튼을 눌러보면

스크린 이동하네요 ..! 

 

 

원래 의도한 바는 사원번호가 있는 상황에서만 버튼이 활성화 되어서

조회 가능해야 합니다..>!

 

 

하지만 이렇게 사원번호가 비어 있을 때에도 

<담당사원> 버튼이 활성화 되어 있어서 

 

 

 

화면이 넘어가버리네요 ㅠ~

 

 

 

어랏 ...
확실히 잘못 된 것

 

 

 


[ 원인 ]

 

크게 두 가지의 원인을 발견할 수 있었습니다.

 

1. 버튼 비활성화 처리 로직이 pbo에 있음

2. 버튼 이름을 다르게 줘서 매핑 되지 않음

 

PAI

MODULE user_command_0100 INPUT.

 

첫 번째 원인은 버튼비활성화에 대한 로직의 위치 때문이였습니다. 

 

 

MODULE user_command_0100 INPUT 구문 안에 들어있는 로직은 PAI(Process After Input) 단계에서 실행됩니다!

PAI는 PBO(Process Before Output)로 화면이 그려진 이후에 동작하기 때문에, 이미 UI가 완성된 상태에서 실행됩니다.

따라서 버튼 비활성화 같은 화면 속성 변경은 이 시점에 적용되지 않습니다.


게다가 이 서브루틴을 'SEARCH' 버튼 클릭 시 실행하도록 배치했다면, 해당 시점은 이미 모든 로직이 끝난 후입니다....!


즉, SEARCH 버튼을 눌렀다는 건 PAI가 한 번 수행된 상태이고, PAI가 실행되고 나면 그 화면의 생명 주기는 끝납니다.

 

 

 

 

두 번째 원인은, 이름을 다르게 써서 매핑이 안되었던 것!

 

FORM get_pernr_info .
  "담당사원 조회
  LOOP AT SCREEN.
    IF screen-name = 'PERNR_INFO'.
      IF zsa011402-pernr IS INITIAL.
        screen-active = 0. "비활성화
      ELSE.
        screen-active = 1. "명시적으로 활성화
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

ENDFORM.

 

착각하고 있던 점이, FctCode와 이름을 똑같이 지정해줘야 하는 줄 알았는데, 
상단의 Name값과 이름을 똑같이 해줘야 했던 것..!

 

 

Q) FctCode과 Name값은 무엇이 다른가요 ..?

  • PBO에서는 Name 기준으로 화면이랑 프로그램 변수를 연결
  • PAI에서는 FctCode 기준으로 버튼 같은 이벤트를 연결

화면을 그리는 건 Name이 담당,
버튼 클릭 같은 동작 처리 FctCode가 담당이라고 보면 됩니다 !

 

 

 

[ 해결 ]

get_pernr_info 서브루틴

 

 

해결방법1 : Name값과 같게 'A_PERNR_INFO'로 수정해주었습니다!

 

PBO

 

 

해결방법2 : 버튼 비활성화에 대한 서브루틴을 PBO로 옮겨주었습니다.!

 

 

 

[ 결과 확인 ]

 

 

 

아무것도 실행하지 않은 기본 창에는 버튼이 비활성화 되어있습니다.

-

 

 

담당사원이 있는 교재코드를 선택했을 경우

<담당사원> 버튼이 활성화 됩니다.

 

 

-

 

담당사원이 없는 교재 코드를 선택했을 경우,

사원번호에 들어가는 값이 없으므로 <담당사원> 버튼이 비활성화 되어 화면에 보이지 않습니다!

 

 


[ 정리 ]

오늘 문제의 핵심은 버튼 비활성화 로직이 원하는 타이밍(PBO)에 적용되지 않고,

매핑 이름 불일치로 인해 제대로 작동하지 않았다는 것.

 

원인으로는,

  1. 로직 위치 문제 → 버튼 상태 변경은 PBO에서 해야 하는데, PAI에 있어서 화면이 이미 그려진 후라 적용이 안 됨.
  2. 매핑 이름 문제 → FctCode가 아니라 Name 값과 동일하게 맞춰야 PBO에서 변수와 연결됨.

해결 방법.

  • 버튼 비활성화 서브루틴을 PBO로 옮기기
  • Name 값과 동일하게 버튼 이름 수정하기

그 결과,

  • 기본 화면에서는 버튼 비활성화
  • 담당사원 있는 경우만 버튼 활성화
  • 담당사원 없는 경우는 버튼 비활성화 유지

결국 PBO/PAI 차이와 Name vs FctCode 차이만 제대로 이해하면 해결할 수 있는 문제였습니다 ~!

 

 

 

 

 

 

 

'SAP ABAP > ABAP_오류해결' 카테고리의 다른 글

solve 1  (0) 2025.08.21
[GUI] GUI 한글 깨짐 현상  (2) 2025.08.10
Dictionary에서 check table과 search help 설계 오류  (0) 2025.08.08
enter 실행이 안됐던 이유  (0) 2025.08.07
버튼 눌러도 안넘어 갔던 이유  (0) 2025.08.05