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_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. -> 노란색 불인 줄을 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 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을 더해주면 신규 사원번호가 될 것이므로 사용"
* 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.
'SAP ABAP 개발 및 설명 > 인사 마스터만들기' 카테고리의 다른 글
인사마스터 ALV 프로젝트 ver 2 (트랜잭션 설정) (0) | 2020.10.10 |
---|---|
인사마스터 ALV 프로젝트 ver 2 (PBO) (0) | 2020.10.09 |
인사마스터 ALV 프로젝트 ver 2 (CLASS문) (0) | 2020.10.02 |
인사마스터 ALV 프로젝트 ver 2 (TOP문 , 메인프로그램) (0) | 2020.10.02 |
인사마스터 ALV 프로젝트 ver 1.3 (0) | 2020.09.17 |