-----------------------------------------------------------------------------------------------------------
지금 M TYPE 프로그램을 공부하고 있습니다.
질문을 말씀 드리겠습니다.
TABLE CONTROL에 행추가, 행삭제, 변경된 내용 저장 이 제가 해야할 것들입니다.
자세히 말씀드리자면 아래와 같습니다.
첨부한 그림에 보이는 왼쪽의 'P'라는 필드에는 데이터의 상태에 따라 값을 다르게 나타내야 합니다.
1.DB에서 불러온 데이터: ' ' --->공백
2.행추가로 등록된 행: 'I'
3.데이터 내용을 수정한 행: 'U'
4.DB에서 불러온 데이터를 삭제할 경우: 'D'
또한, 첨부한 그림 파일에 보이는 행추가 버튼(ADDR)과 행삭제 버튼(DELR)이 있습니다.
행추가 버튼을 누르게 되면 데이터를 불러온 제일 마지막 행에 행이 추가되어 입력받을 수 있도록 활성화가
되어야 합니다.
행삭제 버튼을 누르게 되면
1.행추가 버튼을 눌러 생성한 행의 경우 바로 삭제.
2.DB에서 불러온 데이터는 그림에서 보이는 왼쪽의 'P'라는 필드에 'D'를 나타내어야 됨.
(저장시에는 삭제된 채로 저장이 되야함.)
위와 같은 두가지 경우로 나뉘어 져야 합니다.
저 나름대로 자료를 찾아보면서 진행하고 있는데 어려움이 따르네요..ㅜㅜ
여러분들의 답변 부탁드리겠습니다.
아래는 소스코드입니다.
-----------------------------------------------------------------------------------------------------------
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 부분
PROCESS AFTER INPUT.
MODULE EXIT AT EXIT-COMMAND.
LOOP AT IT_ZSADBLO.
CHAIN.
FIELD : MARK,
WA_ZSADBLO-AGE,
WA_ZSADBLO-SAPART,
WA_ZSADBLO-SEX,
WA_ZSADBLO-PLACE.
MODULE MODIFY_DATA ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
INCLUDE 프로그램들
~TOP
PROGRAM SAPMZTC_2 .
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.
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.
MODIFY IT_ZSADBLO FROM WA_ZSADBLO
INDEX TC_SADBLO-CURRENT_LINE.
ENDMODULE. " MODIFY_DATA INPUT
------------------------------------------------------------------------------------------------------------
댓글 4
-
김지성
2008.11.26 19:22
-
activeman
2008.11.26 19:41
로직이 잘 생성되어 있는것 같네요..이 정도 로직이시면 쉽게 프로그램 하실 수 있을 것 같습니다..
말씀하신대로...
1.DB에서 불러온 데이터: ' ' --->공백
==> 인터널 테이블에 db의 자료를 그냥 불러 오기만 한다면 필드 'p'는 공백이 됩니다..
2.행추가로 등록된 행: 'I'
==> 프로그램을 보니까 테이블 컨트롤 위저드를 사용하지 않으셨네요.(위저드를 사용하면 행추가,삭제,오르차순정렬, 내림차순정렬
의 소스가 자동 생성이 되고 이 소스를 약간만 수정하여 행이 추가 될때 p 필드에 'I'를 추가만 하면 됩니다.)
아래소스를 참고 하세요..(위저드로 생성하시면 아래 소스가 자동으로 생성됩니다.)
LOOP WITH CONTROL TC2.
CHAIN.
FIELD IT_TAB2-ZSPTSP.
FIELD IT_TAB2-ZRUNHR
MODULE ZRUNHR_CHECK ON REQUEST.
FIELD IT_TAB2-ZRRNHR
MODULE ZRRNHR_CHECK ON REQUEST.
MODULE TC2_MODIFY ON CHAIN-REQUEST.
ENDCHAIN.
FIELD IT_TAB2-MARK
MODULE TC2_MARK ON REQUEST.
ENDLOOP.
MODULE TC2_USER_COMMAND.
*&---------------------------------------------------------------------*
*& Module TC2_USER_COMMAND INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE TC2_USER_COMMAND INPUT.
OK_CODE = SY-UCOMM.
PERFORM USER_OK_TC USING 'TC2'
'IT_TAB2'
'MARK'
'ITD_TAB2'
CHANGING OK_CODE.
ENDMODULE. "TC2_USER_COMMAND INPUT
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM USER_OK_TC USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME
P_ITD_TAB
CHANGING P_OK LIKE SY-UCOMM.
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*-END OF LOCAL DATA----------------------------------------------------*
* Table control specific operations *
* evaluate TC name and operations *
SEARCH P_OK FOR P_TC_NAME.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
L_OFFSET = STRLEN( P_TC_NAME ) + 1.
L_OK = P_OK+L_OFFSET.
* execute general and TC specific operations *
CASE L_OK.
WHEN 'INSR'. "insert row
PERFORM FCODE_INSERT_ROW USING P_TC_NAME
P_TABLE_NAME.
CLEAR P_OK.
WHEN 'DELE'. "delete row
PERFORM DELETE_TABLE_TAB USING P_TC_NAME.
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME
P_ITD_TAB.
PERFORM CAL_SUM_TC USING P_TC_NAME.
CLEAR P_OK.
WHEN 'P--' OR "top of list
'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
L_OK.
CLEAR P_OK.
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM FCODE_INSERT_ROW
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA L_LINES_NAME LIKE FELD-NAME.
DATA L_SELLINE LIKE SY-STEPL.
DATA L_LASTLINE TYPE I.
DATA L_LINE TYPE I.
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLSTYPE CXTAB_CONTROL.
FIELD-SYMBOLSTYPE STANDARD TABLE.
FIELD-SYMBOLSTYPE I.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO
.
* get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO. "not headerline
* get looplines of TableControl
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
ASSIGN (L_LINES_NAME) TO.
* get current line
GET CURSOR LINE L_SELLINE.
IF SY-SUBRC <> 0. " append line to table
L_SELLINE =-LINES + 1.
* set top line and new cursor line *
IF L_SELLINE >.
-TOP_LINE = L_SELLINE - + 1 .
L_LINE = 1.
ELSE.
-TOP_LINE = 1.
L_LINE = L_SELLINE.
ENDIF.
ELSE. " insert line into table
L_SELLINE =-TOP_LINE + L_SELLINE - 1.
* set top line and new cursor line *
L_LASTLINE = L_SELLINE +- 1.
IF L_LASTLINE <=-LINES.
-TOP_LINE = L_SELLINE.
L_LINE = 1.
ELSEIF> -LINES.
-TOP_LINE = 1.
L_LINE = L_SELLINE.
ELSE.
-TOP_LINE = -LINES - + 2 .
L_LINE = L_SELLINE --TOP_LINE + 1.
ENDIF.
ENDIF.
* insert initial line
INSERT INITIAL LINE INTOINDEX L_SELLINE.
-LINES = -LINES + 1.
* set cursor
SET CURSOR LINE L_LINE.
ENDFORM. " FCODE_INSERT_ROW
*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW *
*&---------------------------------------------------------------------*
FORM FCODE_DELETE_ROW
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME
P_ITD_TAB.
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
DATA L_ITD_TAB LIKE FELD-NAME.
DATA LV_TABIX LIKE SYST-TABIX.
FIELD-SYMBOLS
TYPE CXTAB_CONTROL.
FIELD-SYMBOLSTYPE STANDARD TABLE.
FIELD-SYMBOLS.
FIELD-SYMBOLS.
FIELD-SYMBOLSTYPE STANDARD TABLE.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO
.
* get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
CONCATENATE P_ITD_TAB '[]' INTO L_ITD_TAB. "table body
ASSIGN (L_TABLE_NAME) TO
. "not headerline
ASSIGN (L_ITD_TAB) TO. "not headerline
* delete marked lines *
DESCRIBE TABLELINES
-LINES.
LOOP AT
ASSIGNING
.
* access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURETO .
IF
= 'X'.
LV_TABIX = SYST-TABIX.
APPENDTO .
DELETEINDEX LV_TABIX.
IF SY-SUBRC = 0.
-LINES = -LINES - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FCODE_DELETE_ROW
3.데이터 내용을 수정한 행: 'U'
==>수정은 행을 추가한것을 제외하고 수정할 경우는 "U"를 해줘야 한다는거죠?..이것은 "MODULE MODIFY_DATA ON CHAIN-REQUEST"에서 처리하시면 될것같네요.. 여기서 이 로직을 거친다면 P필드에 "U"를 넣어주는 로직을 추가 하시면 되겠네요.
4.DB에서 불러온 데이터를 삭제할 경우: 'D'
==> WHEN 'DELE'. "delete row) 이부분이 삭제 하는 로직인데 이부분에서 삭제하지 않고
필드 "p"에 "D"만 넣어 주시면 되겠네요..
1.행추가 버튼을 눌러 생성한 행의 경우 바로 삭제.
==> 이부분도 WHEN 'DELE'. 에서 P필드가 "I"인 경우는 삭제
2.DB에서 불러온 데이터는 그림에서 보이는 왼쪽의 'P'라는 필드에 'D'를 나타내어야 됨.
(저장시에는 삭제된 채로 저장이 되야함.)
==> 이부분도 WHEN 'DELE'. 에서 P필드가 " "인 경우는 P필드에 "D"를 넣어 준다..
그리고 저장시에는 user_command 에서 fcode 'save'에 대해 인터널테이블의 필드 "P"를 체크하여
"D"인것은 저장하지 않도록 하면 되겠네요..
즐밥하세요..
activeman
2008.11.26 19:47
헉..수정하니까...밑에 부분이 이상하네요....ㅋㅋ
튀밥
2008.11.27 23:44
activeman님, 김지성님의 답변이 저에게 많은 도움이 되었습니다^^
감사합니다.
간단히 조언을 드리자면
1. Insert Line시 Table Control의 Line을 1증가 하고, P 필드에 I 값을 설정하고 Table Control Modify.
2. Delete Line시 먼저 Line을 선택했는 지 체크
Yes 면 : P 필드 체크해서 값이 없으면 D 값을 입력하고, 값이 I 라면 바로 삭제하고, U나 D라면 각각에 맞게 처리하하고 Modify
No 면 : 라인 먼저 선택하라고 메시지 처리
이런식으로 구현이 되겠네요..