본문 바로가기

SAP ABAP 개발 및 설명/인사 마스터만들기

인사마스터 ALV 프로젝트 ver 1.3

Screen 200번


스크린 200번 세팅


Screen 200번 세팅

 

스크린 100번에서 신규, 번경, 퇴직 버튼에 따라서 입력하는 버튼을 통해 스크린 200번을 불러 올 것. 그렇기 때문에 스크린 200번에는 위 그림과 같이 세팅을 해놓고 각각의 Input 창에는 TOP에서 선언한 200번 인터널 테이블의 필드에 맞게 Naming을 해주는 작업이 필요하다.


200번 스크린


PROCESS BEFORE OUTPUT.
MODULE STATUS_0200.
MODULE SET_SCREEN_0200.

PROCESS AFTER INPUT.
MODULE EXIT_200 AT EXIT-COMMAND.
MODULE USER_COMMAND_0200. 

Screen 200번 PBO


PBO-STATUS_0200

MODULE status_0200 OUTPUT.
 SET PF-STATUS '0200'.
 SET TITLEBAR '0200'.
ENDMODULE.

 

▪이곳에서는 요구사항에서 원했던대로 저장과 나가기를 위한 버튼 두 개를 세팅하면 된다.

 

PBO-SET_SCREEN_0200

MODULE set_screen_0200 OUTPUT.
 LOOP AT SCREEN INTO SCREEN.

*1.수행모드에 따른 INPUT 가능 제어.


   CASE GS_ITAB_0200-MODE.

    WHEN GC_MODE_INSERT. 
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
          SCREEN-INPUT = 0.
      ENDIF.

    WHEN GC_MODE_UPDATE.
      IF SCREEN-NAME = 'GS_ITAB_0200-EMPNO'.
         SCREEN-INPUT = 0.
      ENDIF.
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
         SCREEN-INPUT = 0.
      ENDIF.

    WHEN gc_mode_retire.
      IF screen-name = 'GS_ITAB_0200-RETDT'.
         screen-input = 1.
      ELSE.
         screen-input = 0.
       ENDIF.
ENDCASE.


*2.수행모드에 따른 필수필드 제어.  - 성능에 큰 영향을 주지 않으니 로직 자체를 분리.

*등록/변경일땐 입사일이 필수
*퇴직일땐 퇴사일이 필수.

  CASE GS_ITAB_0200-MODE.
    WHEN GC_MODE_INSERT OR GC_MODE_UPDATE.
      IF SCREEN-NAME = 'GS_ITAB_0200-ENTDT'.
         SCREEN-REQUIRED = 1.
      ENDIF.
      
    WHEN GC_MODE_RETIRE.
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
         SCREEN-REQUIRED = 1.
      ENDIF.
  ENDCASE.


MODIFY SCREEN FROM SCREEN.

  ENDLOOP.
  
ENDMODULE.

버튼에 맞게 스크린 200번의 input / output의 항목을 열고 닫는 기능.

 

간단하게 Screen을 큰 헤더가 있는 Table이라고 생각하고 Screen의 Element List 항목 하나하나를 Work Area라고 생각하면서 작업을 해주면 된다.

 

1.수행모드에 따른 INPUT 가능 제어.
->각 버튼에 따라서 열고 닫는 항목을 CASE 문을 통해 분개한다.

 

스크린의 항목에 대해서는 SCREEN-NAME으로 칭해져있고

SCREEN-INPUT = 1이라면 열리는 것, SCREEN-INPUT = 0이라면 닫히는 기능을 수행한다.

 

[CASE문] 
CASE GS_ITAB_0200-MODE. "3개의 모드의 경우에서" 

Insert 일 때
    WHEN GC_MODE_INSERT.  
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
          SCREEN-INPUT = 0.
      ENDIF.
Update 일 때
    WHEN GC_MODE_UPDATE.
      IF SCREEN-NAME = 'GS_ITAB_0200-EMPNO'.
         SCREEN-INPUT = 0.
      ENDIF.
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
         SCREEN-INPUT = 0.
      ENDIF.
Retire 일 때
    WHEN gc_mode_retire.
      IF screen-name = 'GS_ITAB_0200-RETDT'.
         screen-input = 1.
      ELSE.
         screen-input = 0.
       ENDIF.
ENDCASE.

 

 

2.수행모드에 따른 필수필드 제어.

-> 성능에 큰 영향을 주지 않으니 로직 자체를 분리해서 생각한다.

 

구현해야할 로직
*등록/변경일땐 입사일이 필수
*퇴직일땐 퇴사일이 필수.

 

SCREEN-REQUIRED = 1이라면 필수적으로 필요한 값을 의미한다.

[CASE문] 

CASE GS_ITAB_0200-MODE.

Insert 와 Update 일 때 입사일이 필수적으로 열리도록 세팅

WHEN GC_MODE_INSERT OR GC_MODE_UPDATE.
      IF SCREEN-NAME = 'GS_ITAB_0200-ENTDT'.
         SCREEN-REQUIRED = 1.
      ENDIF.

 

Retire 일 때  퇴사일이 필수적으로 열리도록 세팅

 

WHEN GC_MODE_RETIRE.
      IF SCREEN-NAME = 'GS_ITAB_0200-RETDT'.
         SCREEN-REQUIRED = 1.
      ENDIF.

 

스크린 객체에 있는 것을 스크린을 통해 변경하겠다. 앞에 SCREEN이 데이블 뒤에 테이블이 WA

MODIFY SCREEN FROM SCREEN.


200번 PAI


PROCESS AFTER INPUT.
MODULE EXIT_200 AT EXIT-COMMAND.
MODULE USER_COMMAND_0200.

exit_200 -> 200번 스크린의 exit 조건 설정.

MODULE exit_200 INPUT.
CASE OK_CODE.
  WHEN 'BACK' OR 'EXIT' OR 'CANC'.
    LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

 

user_command_0200 -> 버튼에 따라서 수행하는 역할을 정해주기. 

같은 'SAVE'일지라도 어떤 버튼을 누르고 불러온 200번에서의 SAVE 냐에 따라서 각각의 역할을 다르게 정해준다.

MODULE user_command_0200 INPUT.


CASE OK_CODE.
  WHEN 'SAVE'.
   CASE GS_ITAB_0200-MODE.
     WHEN GC_MODE_INSERT.
       PERFORM CREATE_DATA_200.

     WHEN GC_MODE_UPDATE.
       PERFORM UDPATE_DATA_200.

     WHEN GC_MODE_RETIRE.
       PERFORM RETIRE_DATA_0200.

  ENDCASE.
  WHEN 'OUTT'.
     LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.

 

INSERT버튼일때 PERFORM문

FORM create_data_200 .



  DATA : LS_DATA TYPE ZT08_0010,
         LV_ANSWER. 

 CALL FUNCTION 'POPUP_TO_CONFIRM'
   EXPORTING
    TITLEBAR                    = '데이터 저장'
    text_question               = '입력하신 정보가 저장됩니다. 계속 진행하시겠습니까?'
    TEXT_BUTTON_1               = 'YES'(001)
    TEXT_BUTTON_2               = 'NO'(002)

  IMPORTING
    ANSWER                      = LV_ANSWER.
    
 IF sy-subrc <> 0.
 ENDIF.

CHECK LV_ANSWER EQ '1'. "CHECK해서 맞는지 봐라"

*저장할 워크에어이러로 데이터 이관
   MOVE-CORRESPONDING GS_ITAB_0200 TO LS_DATA.

*레코드 생성 정보
   LS_DATA-ERDAT = SY-DATUM.
   LS_DATA-ERZET = SY-UZEIT.
   LS_DATA-ERNAM = SY-UNAME.

   "데이터 저장"
   INSERT ZT08_0010 FROM LS_DATA.
   IF SY-SUBRC = 0.
   
   "성공처리"
   COMMIT WORK AND WAIT.
   MESSAGE S001. "정상 처리."

   CLEAR GS_ITAB.
   MOVE-CORRESPONDING GS_ITAB_0200 TO GS_ITAB.

   "FIELD TEXT처리"
   PERFORM GET_TEXT_SINGLE_LINE CHANGING GS_ITAB.

   APPEND GS_ITAB TO GT_ITAB.
   LEAVE TO SCREEN 0.
   
   ELSE.
   "실패처리"
    ROLLBACK WORK.
    MESSAGE S002 DISPLAY LIKE 'E'. "데이터 처리 중 오류발생을 E타입으로 보여주는 구문"
   ENDIF.
ENDFORM.

DATA LS_DATA TYPE ZT08_0010, "테이블의 구조와 닮은 임의이 데이터를 담을 인터널 테이블을 선언해준다"
           LV_ANSWER. "아래 팝업창을 위해 LV_ANSWER을 디폴트로 CHAR 1자리로 선언해준다"

 

CALL FUNCTION 'POPUP_TO_CONFIRM'
   EXPORTING
    TITLEBAR                    '데이터 저장'
    text_question               '입력하신 정보가 저장됩니다. 계속 진행하시겠습니까?'
    TEXT_BUTTON_1               'YES'(001)
    TEXT_BUTTON_2               'NO'(002)

  IMPORTING
    ANSWER                      LV_ANSWER

           .
 IF sy-subrc <> 0.
 ENDIF.

 

▪팝업창에서 YES를 누르면 1이 LV_ANSWER에 담겨서 반환되는데 CHECK LV_ANSWER EQ '1'. 구문을 통해 1인지를 확인한다.

더보기

IF LV_ANSWER NE '1'.
EXIT. 
ENDIF.

CHECK 구문 대신에 위와 같은 IF문을 쓸수도 있다.

단, EXIT을 주의해서 써야되는데 EXIT을 써서 나갔을 때 지금 이 (,두 등)문이 마지막  마지막 프로세스인지 아니인지를 확인해야됨.

 

저장할 워크에어이러로 데이터 이관을 위해 MOVE-CORRESPONDING GS_ITAB_0200 TO LS_DATA. 구문으로 작업처리를 위한 데이터 셋인 LS_DATA로 데이터를 옮긴다.



레코드 생성 정보
   
LS_DATA-ERDAT = SY-DATUM.  생성일은 현재 날짜로 레코드 생성
   LS_DATA
-ERZET = SY-UZEIT. 생성시간은 현재 프로그램의 시간으로 레코드 생성
   LS_DATA
-ERNAM = SY-UNAME. 작성자 이름은 현재 로그인한 사람의 아이디로 레코드 생성

데이터 저장을 위해 INSERT ZT08_0010 FROM LS_DATA. LS_DATA 구문을 통해 부터 내가 생성한 테이블에 데이터를 INSERT 해준다.
이후 IF SY-SUBRC 0. 구문으로 작업이 진행되었다는 것을 확인해준다

 

▪SE11에 있는 DB에 데이터 꽂기.

COMMIT WORK (AND WAIT). 라는 구문을 통해 (AND WAIT)는 없어도 됨.

더보기

<COMMIT WORK AND ROLLBACK WORK>

COMMIT과 ROLLBACK은 쉽게 이야기하면 SQL에서 사용하는 구문으로써 실제 내가 작업한 것을 DB에 까지 실행시킬지 아니면 이전 단계로 돌릴지에 대한 구문이다.

 

이 구문이 ABAP에서는 COMMIT WORK라는 것은 예를 들어 이 퍼폼문이 끝나고 수행되는 것을 기다리는 것이 아니라, 이 구문 직후에 데이터가 DB테이블로 입력되는 것을 진행하는 구문이다. 디버깅을 통해 진행했을 때 COMMIT WORK 구문 직후에 스크린에서 변경한 데이터가 DB에 바로 다이렉트로 변경된것을 확인할 수 있다.

 

또한, 내가 작업을 한것에 대해서 SAVE 버튼을 눌렀을 때 진행한 작업에 대해서 날라가지 않기 위해서 이 구문을 사용해서 저장까지는 되도록 사용할 수도 있다.

 

ROLLBACK WORK는 진행한 작업에 대해서 되돌려야 할 때 사용하는 구문이다.

MESSAGE S001. "정상 처리를 위한 메시지"

  CLEAR GS_ITAB. "찌거기 제거를 위하여 GS_ITAB CLEAN 해주기"

 

▪이후 GS_ITAB_0200에서 GS_ITAB으로 데이터를 MOVE-CORRESPONDING GS_ITAB_0200 TO GS_ITAB. 옮겨준다.

바로 APPEND를 쓰면 VALUE_RANGE에 해당하는 FIELD TEXT가 나타나지 않기 때문에 다시한번 구문 수행"
PERFORM GET_TEXT_SINGLE_LINE CHANGING GS_ITAB.

▪이후 APPEND GS_ITAB TO GT_ITAB.를 통해 ALV에서 보여지는 GT_ITAB에서 데이터를 이관시켜주는 작업을 진행한다.
LEAVE TO SCREEN 0.
ELSE.

실패처리는 ROLLBACK WORK. 구문을 사용하고 메시지를 오류발생했다는 타입으로 제시해주면 된다.
MESSAGE S002 DISPLAY LIKE 'E'"데이터 처리 중 오류발생을 E타입으로 보여주는 구문"
ENDIF.
ENDFORM.

UPDATE 버튼일때 PERFORM문

FORM udpate_data_200 .
   DATA : LS_DATA TYPE ZT08_0010,
          LV_ANSWER.

 CALL FUNCTION 'POPUP_TO_CONFIRM'
   EXPORTING
    TITLEBAR                    = ' 데이터 저장'
    text_question               = '변경하신  정보가 저장됩니다. 계속 진행하시겠습니까?'
    TEXT_BUTTON_1               = 'YES'(001)
    TEXT_BUTTON_2               = 'NO'(002)

  IMPORTING
    ANSWER                      = LV_ANSWER.
    
 IF sy-subrc <> 0.
 ENDIF.

CHECK LV_ANSWER EQ '1'. "CHECK해서 맞는지 봐라

*   저장할 워크에어이러로 데이터 이관
   MOVE-CORRESPONDING GS_ITAB_0200 TO LS_DATA.

*레코드 생성 정보
  LS_DATA-AEDAT = SY-DATUM.
  LS_DATA-AEZET = SY-UZEIT.
  LS_DATA-AENAM = SY-UNAME.


"데이터 갱신"
   UPDATE ZT08_0010 FROM LS_DATA.

   IF SY-SUBRC = 0.

"성공처리"

COMMIT WORK. "AND WAIT.
MESSAGE S001. "정상 처리."

CLEAR GS_ITAB.
MOVE-CORRESPONDING GS_ITAB_0200 TO GS_ITAB.

   
PERFORM GET_TEXT_SINGLE_LINE CHANGING GS_ITAB.

MODIFY GT_ITAB FROM GS_ITAB INDEX GS_ITAB_0200-INDEX.
LEAVE TO SCREEN 0.
ELSE.

"실패처리"
 ROLLBACK WORK.
MESSAGE S002 DISPLAY LIKE 'E'. "데이터 처리 중 오류발생을 E타입으로 보여주는 구문"
ENDIF.

ENDFORM.

▪INSERT일때와 크게 차이는 없다. 다만 레코드의 생성이 아닌 변경에 대한 필드를 사용해야된다는 것과 신규로 데이터를 올리는 것이 아니기 때문에 MODIFY나 UPDATE 구문을 사용해주어야한다는 것을 생각하면 된다.

 

RETIRE 버튼일때 PERFORM문

FORM RETIRE_DATA_0200 .

  DATA : LS_DATA TYPE ZT08_0010,
         LV_ANSWER. 
         
*퇴직일이 입사일보다 먼저 오는 것을 방지하는 입력값 점검 로직.
IF GS_ITAB_0200-ENTDT > GS_ITAB_0200-RETDT.
  MESSAGE S005 DISPLAY LIKE 'E'. "퇴사일이 입사일 이후입니다."
  EXIT.
ENDIF.



 CALL FUNCTION 'POPUP_TO_CONFIRM'
   EXPORTING
    TITLEBAR                    = ' 데이터 저장'
    text_question               = '퇴직정보가 반영됩니다. 계속 진행하시겠습니까?'
    TEXT_BUTTON_1               = 'YES'(001)
    TEXT_BUTTON_2               = 'NO'(002)

  IMPORTING
    ANSWER                      = LV_ANSWER.
 IF sy-subrc <> 0.
 ENDIF.




CHECK LV_ANSWER EQ '1'. 

*저장할 워크에어이러로 데이터 이관
   MOVE-CORRESPONDING GS_ITAB_0200 TO LS_DATA.

*레코드 생성 정보
  LS_DATA-AEDAT = SY-DATUM.
  LS_DATA-AEZET = SY-UZEIT.
  LS_DATA-AENAM = SY-UNAME.


   "데이터 갱신"
   UPDATE ZT08_0010 FROM LS_DATA.

   IF SY-SUBRC = 0.
.
   "성공처리"

   COMMIT WORK. "AND WAIT.
   MESSAGE S001. "정상 처리."

   CLEAR GS_ITAB.
   MOVE-CORRESPONDING GS_ITAB_0200 TO GS_ITAB.

  
   PERFORM GET_TEXT_SINGLE_LINE CHANGING GS_ITAB.
 
   MODIFY GT_ITAB FROM GS_ITAB INDEX GS_ITAB_0200-INDEX.
   LEAVE TO SCREEN 0.
   ELSE.


   "실패처리"
    ROLLBACK WORK.
    MESSAGE S002 DISPLAY LIKE 'E'. "데이터 처리 중 오류발생을 E타입으로 보여주는 구문"
   ENDIF.

ENDFORM.

▪INSERT일때와 크게 차이는 없다. 다만 레코드의 생성이 아닌 변경에 대한 필드를 사용해야된다는 것과 신규로 데이터를 올리는 것이 아니기 때문에 MODIFY나 UPDATE 구문을 사용해주어야한다는 것을 생각하면 된다.

 


결과 ALV 화면

 

반응형