-----------------------------------------------------------------------------------------------------------
지금 M TYPE 프로그램을 공부하고 있습니다.
TABLE CONTROL에 행추가, 행삭제, 변경된 내용 저장 이 제가 해야할 것들입니다.
자세히 말씀드리자면 아래와 같습니다.
첨부한 그림에 보이는 왼쪽의 'P'라는 필드에는 데이터의 상태에 따라 값을 다르게 나타내야 합니다.
1.DB에서 불러온 데이터: ' ' --->공백
2.행추가로 등록된 행: 'I'
3.데이터 내용을 수정한 행: 'U'
4.DB에서 불러온 데이터를 삭제할 경우: 'D'
또한, 첨부한 그림 파일에 보이는 행추가 버튼(ADDR)과 행삭제 버튼(DELR)이 있습니다.
행추가 버튼을 누르게 되면 데이터를 불러온 제일 마지막 행에 행이 추가되어 입력받을 수 있도록 활성화가
되어야 합니다.
행삭제 버튼을 누르게 되면
1.행추가 버튼을 눌러 생성한 행의 경우 바로 삭제.
2.DB에서 불러온 데이터는 그림에서 보이는 왼쪽의 'P'라는 필드에 'D'를 나타내어야 됨.
(저장시에는 삭제된 채로 저장이 되야함.)
위와 같은 두가지 경우로 나뉘어 져야 합니다.
저 나름대로 자료를 찾아보고 저번에 게시판에 질문을 올려 여러분들이 해주신 답변을 참고하여
어느정도 진행을 하였습니다.
질문을 말씀드리겠습니다.
제가 구현한 것을 바탕으로 3가지 문제점이 발생하였습니다.
첫번째, DB에서 읽어온 데이터 삭제시 최초 삭제된 값보다 상위에 위치한 값들은 버튼을 두번 눌러야 'D'가 표시됨.
두번째, 행추가로 행을 추가하면 행이 추가되는데 삭제시 행추가된 행의 상위에 위치한 행을 삭제하면
아래에 있는 것들이 동시에 삭제됨.
세번째, ~IO1부분에서 MODIFY_DATA 모듈에 'U'를 집어 넣으면 행추가로 추가된 행을 삭제하려고 할때
삭제되지 않고'D'로 표시되며, DB에서 불러온 데이터들은 삭제시 'D'로 바뀌지만,
DB에서 불러온 다른라인의 데이터를 삭제시 전라인은 'U'로 바뀌고 최근 선택했던 라인만 'D'로 표시됨.
이 3가지 문제점에 대해서 여러분의 답변 부탁드립니다.
혹시나 질문이 이해되지 않으시는 분께서는 댓글로 말씀해주시면 다시 설명드리겠습니다.
아래는 소스 코드입니다.
-----------------------------------------------------------------------------------------------------------
PAO 부분
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE SET_TC_LINES.
LOOP AT IT_ZSADBLO INTO WA_ZSADBLO
WITH CONTROL TC_SADBLO.
MODULE MARK_SEND.
ENDLOOP.
PAI 부분
MODULE EXIT AT EXIT-COMMAND.
LOOP AT IT_ZSADBLO.
CHAIN.
FIELD : MARK,
WA_ZSADBLO-NAME,
WA_ZSADBLO-POINT,
WA_ZSADBLO-AGE,
WA_ZSADBLO-SAPART,
WA_ZSADBLO-SEX,
WA_ZSADBLO-PLACE.
MODULE MODIFY_DATA ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
MODULE USER_COMMAND_0100.
INCLUDE 프로그램들
~TOP
CONTROLS TC_SADBLO TYPE TABLEVIEW
USING SCREEN '0100'.
TABLES: ZSADBLO.
DATA: BEGIN OF WA_ZSADBLO,
POINT(1),
MARK(1),
SANUM LIKE ZSADBLO-SANUM,
NAME LIKE ZSADBLO-NAME,
AGE LIKE ZSADBLO-AGE,
SAPART LIKE ZSADBLO-SAPART,
SEX LIKE ZSADBLO-SEX,
PLACE LIKE ZSADBLO-PLACE,
END OF WA_ZSADBLO.
DATA: IT_ZSADBLO LIKE TABLE OF WA_ZSADBLO.
DATA: OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE OK_CODE.
DATA: MARK.
DATA: WA_ZSADBLO1 LIKE WA_ZSADBLO.
~O01
*&---------------------------------------------------------------------*
*& Include MZTC_2O01 *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'TITLE'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module MARK_SEND OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE MARK_SEND OUTPUT.
MARK = WA_ZSADBLO-MARK.
ENDMODULE. " MARK_SEND OUTPUT
*&---------------------------------------------------------------------*
*& Module SET_TC_LINES OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE SET_TC_LINES OUTPUT.
DESCRIBE TABLE IT_ZSADBLO LINES TC_SADBLO-LINES.
ENDMODULE. " SET_TC_LINES OUTPUT
~I01
*&---------------------------------------------------------------------*
*& Include MZTC_2I01 *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE EXIT INPUT.
CASE OK_CODE.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE OK_CODE.
WHEN 'PLAY'.
CLEAR OK_CODE.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE IT_ZSADBLO
FROM ZSADBLO.
CLEAR OK_CODE.
WHEN 'SAVE'.
WHEN 'ADDR'.
CLEAR WA_ZSADBLO.
WA_ZSADBLO-POINT = 'I'.
INSERT WA_ZSADBLO INTO TABLE IT_ZSADBLO.
CLEAR OK_CODE.
WHEN 'DELR'.
LOOP AT IT_ZSADBLO INTO WA_ZSADBLO WHERE MARK = 'X'.
IF WA_ZSADBLO-POINT = ''.
WA_ZSADBLO-POINT = 'D'.
ELSEIF WA_ZSADBLO-POINT = 'U'.
WA_ZSADBLO-POINT = 'D'.
ELSEIF WA_ZSADBLO-POINT = 'I'.
DELETE IT_ZSADBLO WHERE MARK = 'X'.
ENDIF.
MODIFY IT_ZSADBLO FROM WA_ZSADBLO INDEX SY-TABIX.
ENDLOOP.
IF SY-SUBRC <> 0.
MESSAGE S018.
ENDIF.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module MODIFY_DATA INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE MODIFY_DATA INPUT.
LOOP AT IT_ZSADBLO INTO WA_ZSADBLO1.
CLEAR WA_ZSADBLO1-MARK.
MODIFY IT_ZSADBLO FROM WA_ZSADBLO1.
ENDLOOP.
WA_ZSADBLO-MARK = MARK.
WA_ZSADBLO-POINT = 'U'.
MODIFY IT_ZSADBLO FROM WA_ZSADBLO
INDEX TC_SADBLO-CURRENT_LINE.
ENDMODULE. " MODIFY_DATA INPUT
------------------------------------------------------------------------------------------------------------
MODULE MODIFY_DATA INPUT에서 왜서 또 LOOP을 돌고 있습니까?
이 모듈은 PAI에서 이미 LOOP안에 있습니다. (로직에서 중복)