본문 바로가기

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

인사마스터 ALV 프로젝트 ver 2 (PAI)

SCREEN 100 PAI


PROCESS BEFORE OUTPUT.			
 MODULE STATUS_0100.			
 MODULE SET_ALV_0100.			
			
PROCESS AFTER INPUT.			
MODULE EXIT_100 AT EXIT-COMMAND.			
 MODULE USER_COMMAND_0100.			
MODULE user_command_0100 INPUT.

CASE OK_CODE.
WHEN 'SAVE'.

PERFORM SAVE_DATA.


ENDCASE.

CLEAR OK_CODE.
ENDMODULE.

MODULE user_command_0100 INPUT.

CASE OK_CODE.
  
WHEN 'SAVE'.
"ALV GRID상에서 변경하고 클릭을하면 DATA_CHANGED가 발생해서 ALV -> 인터널 테이블이 발생함.

 

하지만 ALV_GRID에서 클릭과 엔터와 같은 행동을 하지 않고 저장버튼을 바로 누른다면 변경된 정보가 반영되지 않음.
->이 경우는 변경사항이 반영되지 않고 REFRESH가 일어나서 인터널 테이블에 존재하는 변경되지 않은 기존의 데이터가 바로 GRID에 반영되는 상황이 발생하는 것.

->그렇기 때문에 USER_COMMAND에서 위와 같은 상황이 발생하는 것을 방지하기 위해서 CHECK_CHANGED_DATA를 실행해줌.

*CTRL + F6 / 인스턴스  : g_grid / 클래스 : Cl_GUI_ALV_GRID 메도스 CHECK_CHANGED_DATA.
"REFRESH와 CHECK_CHANGED_DATA를 구분지어 사용하기.

PERFORM SAVE_DATA.

ENDCASE.

CLEAR OK_CODE"OK_CODE 클리어해주기"
ENDMODULE.

 


FORM save_data .

DATA : LT_SAVE_I TYPE TABLE OF ZT08_0010, "신규 등록 사번에 대한 인터널 테이블"
       LT_SAVE_U TYPE TABLE OF ZT08_0010, "변경 사번에 대한 인터널 테이블"
       LS_SAVE   TYPE          ZT08_0010. "위 두 테이블에 값을 넣기 위해 사용하는 임시의 워크에어리어"

DATA : LV_EMPNO TYPE ZT08_0010-EMPNO, "신규사번 채번을 위한 데이터 선언"
       LV_YEAR  TYPE ZT08_0010-EMPNO. "매년 년도가 바뀌는 것을 고려하여 신규사원등록 처리를 위한 데이터 선언"

DATA : LV_ERR TYPE C, "에러를 위한 데이터 선언"
       LV_ANSWER TYPE C. "POP창 생성을 위해 YES/NO 값을 받을 LV_ANSWER 선언"



FIELD-SYMBOLS : <FS_DISP> LIKE GS_DISP.

* <ALV에서 변경한 데이터 반영>
  CALL METHOD G_GRID->CHECK_CHANGED_DATA.
  
* <변경데이터 유무 검증 - 없으면 에러>
  READ TABLE GT_DISP INTO GS_DISP
                     WITH KEY STAT = ICON_LED_YELLOW.

  IF SY-SUBRC NE 0.
    MESSAGE S006.
    EXIT.
  ENDIF.
  
  LOOP AT GT_DISP ASSIGNING <FS_DISP>
                    WHERE STAT = ICON_LED_YELLOW.
"이때 다 LOOP하는 것이 아니라 아이콘이 노란색만 돌게 해야됨,"

  "위 구문이랑 같은 말"
*  IF <FS_DISP>-STAT NE ICON_LED_YELLOW.
*    CONTINUE.
*  ENDIF.



CLEAR <FS_DISP>-RESULT. "반복되서 출력되는데 이후에도 남아있을 수 있기 때문에 중간에 지워버리기."

 

FORM save_data .

DATA LT_SAVE_I TYPE TABLE OF ZT08_0010"신규 등록 사번에 대한 인터널 테이블"
         
LT_SAVE_U TYPE TABLE OF ZT08_0010"변경 사번에 대한 인터널 테이블"
         
LS_SAVE   TYPE          ZT08_0010"위 두 테이블에 값을 넣기 위해 사용하는 임시의 워크에어리어"

DATA LV_EMPNO TYPE ZT08_0010-EMPNO"신규사번 채번을 위한 데이터 선언"
         
LV_YEAR TYPE ZT08_0010-EMPNO"매년 년도가 바뀌는 것을 고려하여 신규사원등록 처리를 위한 데이터 선언"

DATA LV_ERR TYPE C"에러를 위한 데이터 선언"
         
LV_ANSWER TYPE C. "POP창 생성을 위해 YES/NO 값을 받을 LV_ANSWER 선언"

FIELD-SYMBOLS <FS_DISPLIKE GS_DISP.

<ALV에서 변경한 데이터 반영>
  
CALL METHOD G_GRID->CHECK_CHANGED_DATA

-> 여기까지는 화면과 인터널 테이블과는 동기화가 된 상황
-> 그러므로 추후 데이터는 인터널 테이블만 가지고 핸들링하면 됨

 

<변경데이터 유무 검증 - 없으면 에러>
  
READ TABLE GT_DISP INTO GS_DISP
                     
WITH KEY STAT ICON_LED_YELLOW. -> 노란색 불인 줄을 KEY로 읽는다는 뜻.
  
IF SY-SUBRC NE 0.
    
MESSAGE S006.
    
EXIT.
  
ENDIF.

 

* <필수 필드 입력여부 검증 + 입력데이터에 대한 유효성 검증 + 저장데이터 구성(변경, 생성)>

 

이름 ,부서입사일직급재직구분은 필수 입력으로 하되(상시필수), 재직구분이 3이면 반드시 퇴사일이 존재하도록 로직을 구성해보자.

라인별로 체크해야되므로 LOOP이 필요

 

LOOP AT GT_DISP ASSIGNING <FS_DISP>
                    
WHERE STAT ICON_LED_YELLOW.
->이때 다 LOOP하는 것이 아니라 아이콘이 노란색만 돌게 해야됨,

「  
"위 구문이랑 같은 말"
*  IF <FS_DISP>-STAT NE ICON_LED_YELLOW.
*    CONTINUE.
*  ENDIF.」

CLEAR <FS_DISP>-RESULT"반복되서 출력되는데 이후에도 남아있을 수 있기 때문에 중간에 지워버리기."

 


*<필수필드 검증>
  "필수 상시처리"
  IF <FS_DISP>-NAME IS INITIAL OR
     <FS_DISP>-DEPT IS INITIAL OR
     <FS_DISP>-ENTDT IS INITIAL OR
     <FS_DISP>-GRADE IS INITIAL OR
     <FS_DISP>-STATUS IS INITIAL.
     <FS_DISP>-STAT = ICON_LED_RED. "필수가 없이 저장을 누르면 빨간색 아이콘이 뜨며 아래 메시지가 뜨도록 해주는 구문"
     LV_ERR = 'X'.
  PERFORM SET_RESULT USING TEXT-M01
                     CHANGING <FS_DISP>-RESULT.

  ENDIF.
  
  "PERFORM문 코드"
  FORM set_result  USING    P_TEXT
                 CHANGING p_result.

  IF p_result IS INITIAL.
       p_result = P_TEXT.
     ELSE.
*     아래 구문처럼 처리를 해주지 않으면 각각의 큰 if문 안에서의 메시지가 연결되지 않을 경우가 생김. 그렇기 때문에
*     뭉개지지 않도록 처리해주어야하는 과정
       CONCATENATE p_result P_TEXT "'이름/부서/입사일/직급/재직구분은 필수입력 필드입니다'."
              INTO p_result
      SEPARATED BY '#'. "->두개의 메시지가 붙어서 나옴. 다수의 처리에 있어서 메시지가 뭉개지지 않도록 처리해주는 작업.
     ENDIF.

ENDFORM.

 

*<필수필드 검증>
  

필수 상시처리할 항목


  
IF <FS_DISP>-NAME IS INITIAL OR
     <FS_DISP>
-DEPT IS INITIAL OR
     <FS_DISP>
-ENTDT IS INITIAL OR
     <FS_DISP>
-GRADE IS INITIAL OR
     <FS_DISP>
-STATUS IS INITIAL.
     <FS_DISP>
-STAT ICON_LED_RED"필수가 없이 저장을 누르면 빨간색 아이콘이 뜨며 아래 메시지가 뜨도록 해주는 구문"


     
LV_ERR 'X'.
  
PERFORM SET_RESULT USING TEXT-M01
                     
CHANGING <FS_DISP>-RESULT.

  ENDIF.

 

FORM set_result  USING    P_TEXT
                 CHANGING p_result.

  IF p_result IS INITIAL.
       p_result P_TEXT.
     

ELSE.
->    아래 구문처럼 처리를 해주지 않으면 각각의 큰 if문 안에서의 메시지가 연결되지 않을 경우가 생김. 그렇기 때문에
       뭉개지지 않도록 처리해주어야하는 과정


       CONCATENATE p_result P_TEXT "이름/부서/입사일/직급/재직구분은 필수입력 필드입니다"
              INTO p_result
      SEPARATED BY '#'"->두개의 메시지가 붙어서 나옴. 다수의 처리에 있어서 메시지가 뭉개지지 않도록 처리해주는 작업.
     ENDIF.

ENDFORM.


"퇴사처리"
  IF <FS_DISP>-STATUS = '3' AND
     <FS_DISP>-RETDT IS INITIAL.
     <FS_DISP>-STAT = ICON_LED_RED.
     LV_ERR = 'X'.
  PERFORM SET_RESULT USING TEXT-M02
                     CHANGING <FS_DISP>-RESULT.

"퇴직상태가 아니지만  퇴직일자가 있는  경우"
  ELSEIF <FS_DISP>-STATUS <> '3' AND
         <FS_DISP>-RETDT IS NOT INITIAL.
          <FS_DISP>-STAT = ICON_LED_RED.
          LV_ERR = 'X'.
  PERFORM SET_RESULT USING TEXT-M03
                     CHANGING <FS_DISP>-RESULT.

  ENDIF.
  
  * <입력데이터에 대한 유효성 검증>

"퇴사일이 존재하면서 입사일보다 빠를경우 - 왜 이경우를 넣냐면 퇴사일이 존재하지 않는 값들을 설정하지 않으면
*입사일보다 빠르다고 인식함

IF <FS_DISP>-RETDT IS NOT INITIAL AND
   <FS_DISP>-RETDT < <FS_DISP>-ENTDT.
   LV_ERR = 'X'.
  <FS_DISP>-STAT = ICON_LED_RED.
  PERFORM SET_RESULT USING TEXT-M04 "퇴사일이 입사일보다 이전입니다.
                     CHANGING <FS_DISP>-RESULT.

ENDIF.

  "PERFORM문 코드"
  FORM set_result  USING    P_TEXT
                 CHANGING p_result.

  IF p_result IS INITIAL.
       p_result = P_TEXT.
     ELSE.
*     아래 구문처럼 처리를 해주지 않으면 각각의 큰 if문 안에서의 메시지가 연결되지 않을 경우가 생김. 그렇기 때문에
*     뭉개지지 않도록 처리해주어야하는 과정
       CONCATENATE p_result P_TEXT "'이름/부서/입사일/직급/재직구분은 필수입력 필드입니다'.
              INTO p_result
      SEPARATED BY '#'. "->두개의 메시지가 붙어서 나옴. 다수의 처리에 있어서 메시지가 뭉개지지 않도록 처리해주는 작업.
     ENDIF.

ENDFORM.

퇴사처리


  
IF <FS_DISP>-STATUS '3' AND
     <FS_DISP>
-RETDT IS INITIAL.
     <FS_DISP>
-STAT ICON_LED_RED.
     LV_ERR 
'X'.
  
PERFORM SET_RESULT USING TEXT-M02
                     
CHANGING <FS_DISP>-RESULT.

퇴직상태가 아니지만  퇴직일자가 있는  경우
  
ELSEIF <FS_DISP>-STATUS <> '3' AND
         <FS_DISP>
-RETDT IS NOT INITIAL.
          <FS_DISP>
-STAT ICON_LED_RED.
          LV_ERR 
'X'.
  
PERFORM SET_RESULT USING TEXT-M03
                     
CHANGING <FS_DISP>-RESULT.

 
ENDIF.

 

<입력데이터에 대한 유효성 검증>

퇴사일이 존재하면서 입사일보다 빠를경우 왜 이경우를 넣냐면 퇴사일이 존재하지 않는 값들을 설정하지 않으면
입사일보다 빠르다고 인식함

IF <FS_DISP>-RETDT IS NOT INITIAL AND
   <FS_DISP>
-RETDT < <FS_DISP>-ENTDT.
   LV_ERR 
'X'.
  <FS_DISP>
-STAT ICON_LED_RED.
  
PERFORM SET_RESULT USING TEXT-M04 "퇴사일이 입사일보다 이전입니다.
                     
CHANGING <FS_DISP>-RESULT.

ENDIF.

 


*<신규사원번호 채번 로직 작성하기>

IF <FS_DISP>-EMPNO IS INITIAL.
  "신규사번 채번"

"방법 1---------------------------------------------------
**  IF LV_EMPNO IS INITIAL. "LV_EMPNO가 비어있다면(값이 없다면_"
**    먼저 DB에서 채번하기"
**
**    SELECT MAX( EMPNO )
**      INTO LV_EMPNO
**      FROM ZT00_0010
**      WHERE EMPNO LIKE '2020%'.  "해마다 년도가 바뀌므로 이것은 일회성일 수 있음 그래서 아래 방법 2로 실행"
**  LV_EMPNO = LV_EMPNO + 1. "2020으로 시작하는 번호를 가져와서 1을 더해주면 신규 사원번호가 될 것이므로 사용"
**  ADD 1 TO LV_EMPNO 위에 구문이랑 같은 개념
*---------------------------------------------------------

"방법 2----------------------------------------------------
  IF LV_EMPNO IS INITIAL. "LV_EMPNO가 비어있다면(값이 없다면_)"

    SELECT MAX( EMPNO )
      INTO LV_EMPNO
      FROM ZT00_0010
      WHERE EMPNO LIKE LV_YEAR.

      IF LV_EMPNO IS INITIAL.
        CONCATENATE SY-DATUM+0(4) '000000' INTO LV_EMPNO. "신규 사원번호 생성일때 뒤에 000000를 추가해주는 로직"
      ENDIF.
   "2020으로 시작하는 번호를 가져와서 1을 더해주면 신규 사원번호가 될 것이므로 사용"

  ENDIF.

  LV_EMPNO = LV_EMPNO + 1.

  <FS_DISP>-EMPNO_BACKUP = LV_EMPNO.

 

<신규사원번호 채번 로직 작성하기>

 

IF <FS_DISP>-EMPNO IS INITIAL.
  "신규사번 채번"

「방법 1
  IF LV_EMPNO IS INITIAL. "LV_EMPNO가 비어있다면(값이 없다면_"
   먼저 DB에서 채번하기"

    SELECT MAX( EMPNO )
      INTO LV_EMPNO
      FROM ZT00_0010
      WHERE EMPNO LIKE '2020%'.  "해마다 년도가 바뀌므로 이것은 일회성일 수 있음 그래서 아래 방법 2로 실행"
  LV_EMPNO = LV_EMPNO + 1. "2020으로 시작하는 번호를 가져와서 1을 더해주면 신규 사원번호가 될 것이므로 사용"
  ADD 1 TO LV_EMPNO 위에 구문이랑 같은 개념


방법 2
  IF LV_EMPNO IS INITIAL"LV_EMPNO가 비어있다면(값이 없다면_)"

    CONCATENATE SY-DATUM+0(4)'%' INTO LV_YEAR.
     20200804라는 예시에서 앞에 0은 시작점을 잡아줌 0번자리에서 시작해서 4번째 자리까지 취해라
     ->즉 맨 앞에 2보다 앞인 0에서 시작해서 앞에서 두번째 0 다음자리까지 취하는 로직

    SELECT MAXEMPNO )
      INTO LV_EMPNO
      FROM ZT00_0010
      WHERE EMPNO LIKE LV_YEAR.

      IF LV_EMPNO IS INITIAL.
        CONCATENATE SY-DATUM+0(4'000000' INTO LV_EMPNO. ->신규 사원번호 생성일때 뒤에 000000를 추가해주는 로직
      ENDIF.
   "2020으로 시작하는 번호를 가져와서 1을 더해주면 신규 사원번호가 될 것이므로 사용"

 

*  ADD 1 TO LV_EMPNO 위에 구문이랑 같은 개념
  ENDIF.

  LV_EMPNO LV_EMPNO + 1.

  TOP에서 선언한 EMPNO_BAKUP"에 LV_EMPNO 집어넣기
  <FS_DISP>-EMPNO_BACKUP LV_EMPNO.


 


 *<저장데이터 구성(생성, 변경)>

  CLEAR LS_SAVE.
  MOVE-CORRESPONDING <FS_DISP> TO LS_SAVE.
  LS_SAVE-EMPNO = LV_EMPNO. "위에서 찾은 사원번호인 EMPNO를 넣어주기"
  LS_SAVE-ERDAT = SY-DATUM. "신규생성일자"
  LS_SAVE-ERZET = SY-UZEIT.
  LS_SAVE-ERNAM = SY-UNAME. "신규생성자명"
  APPEND LS_SAVE TO LT_SAVE_I. "EMPNO가 INITIAL 이므로 신규생성 테이블에 등록하기"

ELSE. "<FS_DISP>-EMPNO IS NOT INITIAL이라는 의미"
  CLEAR LS_SAVE.
  MOVE-CORRESPONDING <FS_DISP> TO LS_SAVE.
  LS_SAVE-AEDAT = SY-DATUM. "변경일자"
  LS_SAVE-AEZET = SY-UZEIT.
  LS_SAVE-AENAM = SY-UNAME. "변경자이름"
  APPEND LS_SAVE TO LT_SAVE_U. "변경 테이블에 넣어준다는 의미"
ENDIF.

ENDLOOP.

 

<저장데이터 구성(생성, 변경)>


  
CLEAR LS_SAVE.
  
MOVE-CORRESPONDING <FS_DISP> TO LS_SAVE.
  LS_SAVE
-EMPNO LV_EMPNO"위에서 찾은 사원번호인 EMPNO를 넣어주기"
  
LS_SAVE-ERDAT SY-DATUM"신규생성일자"
  
LS_SAVE-ERZET SY-UZEIT.
  LS_SAVE
-ERNAM SY-UNAME"신규생성자명"
  
APPEND LS_SAVE TO LT_SAVE_I"EMPNO가 INITIAL 이므로 신규생성 테이블에 등록하기"

ELSE"<FS_DISP>-EMPNO IS NOT INITIAL이라는 의미"
  
CLEAR LS_SAVE.
  
MOVE-CORRESPONDING <FS_DISP> TO LS_SAVE.
  LS_SAVE
-AEDAT SY-DATUM"변경일자"
  
LS_SAVE-AEZET SY-UZEIT.
  LS_SAVE
-AENAM SY-UNAME"변경자이름"
  
APPEND LS_SAVE TO LT_SAVE_U"변경 테이블에 넣어준다는 의미"
ENDIF.

ENDLOOP.


<신규생성 확인메시지 출력>

PERFORM USER_CONFIRM USING TEXT-Q01
                           TEXT-Q02
                     CHANGING LV_ANSWER.

CHECK LV_ANSWER EQ '1'.

"PERFORM문"
FORM user_confirm  USING    P_TITLE
                            P_QUEST
                   CHANGING P_ANSWER.

  CLEAR : P_ANSWER.

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR                    = P_TITLE
      TEXT_QUESTION               = P_QUEST
      TEXT_BUTTON_1               = 'YES'
      TEXT_BUTTON_2               = 'NO'
    IMPORTING
      ANSWER                      = P_ANSWER.

ENDFORM.

 

<신규생성 확인메시지 출력>

PERFORM USER_CONFIRM USING TEXT-Q01
                           
TEXT-Q02
                     
CHANGING LV_ANSWER.

CHECK LV_ANSWER EQ '1'.

 

FORM user_confirm  USING    P_TITLE
                            P_QUEST
                   
CHANGING P_ANSWER.

  
CLEAR P_ANSWER.

  
CALL FUNCTION 'POPUP_TO_CONFIRM'
    
EXPORTING
      
TITLEBAR                    P_TITLE
      TEXT_QUESTION               
P_QUEST
      TEXT_BUTTON_1               
'YES'
      TEXT_BUTTON_2               
'NO'
    
IMPORTING
      ANSWER                      
P_ANSWER.

ENDFORM.


* <데이터 저장>
IF LV_ERR EQ 'X'. "에러가 한건이라도 있으면 나가게 하기.
  MESSAGE S007 DISPLAY LIKE 'E'.
  EXIT.
ENDIF.

<데이터 저장>
IF LV_ERR EQ 'X'"에러가 한건이라도 있으면 나가게 하기.
  
MESSAGE S007 DISPLAY LIKE 'E'.
  
EXIT.
ENDIF.

 


"신규" - 사번을 꽂아넣어주는게 가장 중요한 로직임을 알아야됨. 위의 LV_EMPNO = LV_EMPNO + 1 등의 로직을 통해서.
"그래서 GT_DISP에는 새로운 사번에 대한 정보가 아직 존재하지 않음.
INSERT ZT08_0010 FROM TABLE LT_SAVE_I
                 ACCEPTING DUPLICATE KEYS. "KEY가 중복 안되는 놈이 들어감"

  IF SY-SUBRC = 0.
    COMMIT WORK.
    LOOP AT GT_DISP ASSIGNING <FS_DISP>
                        WHERE STAT = ICON_LED_YELLOW
                          AND EMPNO = ''. "생성인데 노란불 + 사번이 없는 친구들만 LOOP 돌면서 작업을 진행한다는 뜻
      <FS_DISP>-STAT = ICON_LED_GREEN.
      <FS_DISP>-EMPNO = <FS_DISP>-EMPNO_BACKUP.
      <FS_DISP>-ERDAT = LS_SAVE-ERDAT. "이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"
      <FS_DISP>-ERZET = LS_SAVE-ERZET. "이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"
      <FS_DISP>-ERNAM = LS_SAVE-ERNAM. "이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"


    ENDLOOP.
  ELSE.
    ROLLBACK WORK.
    "실패일때는
    GS_DISP-STAT = ICON_LED_RED.
    GS_DISP-RESULT = TEXT-M05. "신규사원 생성정보 저장 중 요류가 발생하였습니다."
    MODIFY GT_DISP FROM GS_DISP TRANSPORTING STAT RESULT
                                       WHERE STAT = ICON_LED_YELLOW
                                       AND EMPNO = ''.
  ENDIF.
"변경"
UPDATE ZT08_0010 FROM TABLE LT_SAVE_U.
  IF SY-SUBRC = 0.
    COMMIT WORK.

    CLEAR GS_DISP.
    GS_DISP-STAT = ICON_LED_GREEN.
    MODIFY GT_DISP FROM GS_DISP
    "LOOP를 써서 GT_DISP INTO GS_DISP를 + INDEX를  써도 되지만 TRANSPORTING을 써서 간단히 인터널 테이블 값을 바꿀 수있음"
              TRANSPORTING STAT "TRANSPORTING + 바꾸고자 하는 필드"
                     WHERE STAT = ICON_LED_YELLOW "필드 = 노란불인 조건"
                       AND EMPNO NE ''. "EMPNO가 빈값이 아닌 조건"

  ELSE.
    ROLLBACK WORK.
    GS_DISP-STAT = ICON_LED_RED.
    GS_DISP-RESULT = TEXT-M06. "사원 정보 변경  저장 중 요류가 발생하였습니다."
    MODIFY GT_DISP FROM GS_DISP TRANSPORTING STAT RESULT
                                       WHERE STAT = ICON_LED_YELLOW "노란색이면서 비어있지 않은 경우
                                       AND EMPNO <> ''.

  ENDIF.

* <처리 결과를 ALV에 반영.>




ENDFORM.

 

신규

->사번을 꽂아넣어주는게 가장 중요한 로직임을 알아야됨위의 LV_EMPNO = LV_EMPNO + 1 등의 로직을 통해서.
->그래서 GT_DISP에는 새로운 사번에 대한 정보가 아직 존재하지 않음.
INSERT ZT08_0010 FROM TABLE LT_SAVE_I
                 ACCEPTING DUPLICATE KEYS
"KEY가 중복 안되는 놈이 들어감"

  
IF SY-SUBRC 0.
    
COMMIT WORK.
    
LOOP AT GT_DISP ASSIGNING <FS_DISP>
                        
WHERE STAT ICON_LED_YELLOW
                          
AND EMPNO ''"생성인데 노란불 사번이 없는 친구들만 LOOP 돌면서 작업을 진행한다는 뜻
      
<FS_DISP>-STAT ICON_LED_GREEN.
      <FS_DISP>
-EMPNO <FS_DISP>-EMPNO_BACKUP.
      <FS_DISP>
-ERDAT LS_SAVE-ERDAT"이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"
      
<FS_DISP>-ERZET LS_SAVE-ERZET"이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"
      
<FS_DISP>-ERNAM LS_SAVE-ERNAM"이 작업을 안하면 생성정보를 DB와 인터널 데이블 간의연동이 안되서 오류발생"


    
ENDLOOP.
  
ELSE.
    
ROLLBACK WORK.
    
"실패일때는
    
GS_DISP-STAT ICON_LED_RED.
    GS_DISP
-RESULT TEXT-M05"신규사원 생성정보 저장 중 요류가 발생하였습니다."
    
MODIFY GT_DISP FROM GS_DISP TRANSPORTING STAT RESULT
                                       
WHERE STAT ICON_LED_YELLOW
                                       
AND EMPNO ''.
  
ENDIF.
"변경"
UPDATE ZT08_0010 FROM TABLE LT_SAVE_U.
  
IF SY-SUBRC 0.
    
COMMIT WORK.

    
CLEAR GS_DISP.
    GS_DISP
-STAT ICON_LED_GREEN.
    
MODIFY GT_DISP FROM GS_DISP
    
"LOOP를 써서 GT_DISP INTO GS_DISP를 + INDEX를  써도 되지만 TRANSPORTING을 써서 간단히 인터널 테이블 값을 바꿀 수있음"
              
TRANSPORTING STAT "TRANSPORTING + 바꾸고자 하는 필드"
                     
WHERE STAT ICON_LED_YELLOW "필드 노란불인 조건"
                       
AND EMPNO NE ''"EMPNO가 빈값이 아닌 조건"

  
ELSE.
    
ROLLBACK WORK.
    GS_DISP
-STAT ICON_LED_RED.
    GS_DISP
-RESULT TEXT-M06"사원 정보 변경  저장 중 요류가 발생하였습니다."
    
MODIFY GT_DISP FROM GS_DISP TRANSPORTING STAT RESULT
                                       
WHERE STAT ICON_LED_YELLOW "노란색이면서 비어있지 않은 경우
                                       
AND EMPNO <> ''.

ENDIF.
ENDFORM.

반응형