지난번에 한번 썻던건데 새로운 문제점이 생겨버렸습니다.
주민번호가 키값이구요 그래서 중복이 되면 안됩니다 테이블컨트롤에서 작업을 하는데
저장되어있는 즉 DB랑 중복이 일어나도 안되구요 새로 입력하는 값들하고도 중복이 일어나면 안됩니다
그리고 자기를 수정해도 중복이 일어나면 안되구요
여기까진 해결을 했는데 문제점은 새로운 주민번호를 입력했는데 중복체크를 해서 아니면 모디파이해서 잘넘어갔습니다
문제는 저장을 하지안은 상태에서 그 주민번호를 다시 위에있는 값과 같은것을 써주면 중복체크가 안된다는것입니다
여러모로 생각해봤지만 해결이 되지않네요 조언좀 부탁드리겠습니다
MODIFY itab INDEX tc_1-current_line.
IF sy-subrc NE 0.
READ TABLE itab WITH KEY perid = itab-perid."
IF sy-subrc <> 0.
APPEND itab.
ELSE.
CLEAR itab.
MESSAGE i007(zmess). "중복메세지입니다.
ENDIF.
ENDIF.
ENDMODULE.
중복이 일어나지 않으면 어펜드를 해줬는데 문제는 어펜드를 하고 나서 중복이 일어나면 체크가 안되는것입니다.
제가 좀 프로그램에 소질이 없어서 잘안되네요
선배님들 조언좀 부탁드리구요 혹시 중복체크에 관한거 여러가지 방법좀 알려주실수 있으시면 좀 부탁드릴께요
댓글 6
-
activeman
2008.05.16 21:18
-
초보아밥퍼
2008.05.16 22:13
그냥 보기엔 걸릴꺼 같은데... 프로그램좀 살짝 올려주시면 확인이 가능할듯 ^^
-
밥먹고아밥해요
2008.05.16 22:41
INITIALIZATION.
tit_name = '주민번호'.
flag = 'M'.
START-OF-SELECTION.
SELECT p~perid f~name f~promdate p~telco p~telno g~addno g~addr1 g~addr2
FROM zmw_perstell AS p INNER JOIN zmw_pers_info AS f ON p~perid = f~perid
INNER JOIN zmw_addr_info AS g ON g~perid = p~perid
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE p~perid IN s_perid.
itab1[] = itab[].
DESCRIBE TABLE itab LINES lin.
lin1 = lin + 1.
IF sy-subrc = 0.
CALL SCREEN 100.
ELSE.
MESSAGE i001(zmess). "자료를 찾지못했습니다.
CALL SCREEN 100.
ENDIF.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
CLEAR : status,
status[].
IF flag = 'M'.
status = 'DISPLAY'. APPEND status.
status = 'DELETE'. APPEND status.
status = 'SAVE'. APPEND status.
ELSEIF flag = 'X'.
status = 'MODIFY'. APPEND status. "플래그값이 X 이면 3개버튼이 보여지고 M이면 한개버튼만 보여진다.
ENDIF.
SET PF-STATUS '100' EXCLUDING status. "위에서 어펜드한 스태이터스필드를 제외한다.
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module line OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE line OUTPUT.
DESCRIBE TABLE itab LINES tc_1-lines.
tc_1-lines = tc_1-lines + 1. "1칸의 편집할수 있는 공간을 미리 열어준것
ENDMODULE. " line OUTPUT
*&---------------------------------------------------------------------*
*& Module TC_CONT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE tc_cont OUTPUT.
IF flag1 = 'X'.
LOOP AT SCREEN.
IF screen-name = 'ITAB-PERID'.
IF tc_1-current_line > lin.
screen-input = 1.
ELSE.
screen-input = 0.
ENDIF.
ELSE.
screen-input = 1. "주민번호가 아닌것은 열어줘라
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE. " TC_CONT OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Module mark INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE mark INPUT.
IF
itab-perid = ' ' OR
itab-name = ' ' OR
itab-promdate = ' ' OR
itab-addno = ' ' OR
itab-addr1 = ' ' OR
itab-addr2 = ' ' OR
itab-telco = ' ' OR
itab-telno = ' '.
error_sg = 'F'.
ENDIF.
MODIFY itab INDEX tc_1-current_line.
IF sy-subrc NE 0.
READ TABLE itab WITH KEY perid = itab-perid.
IF sy-subrc <> 0. .
APPEND itab.
ELSE.
CLEAR itab.
MESSAGE i007(zmess).
ENDIF.
ENDIF.
ENDMODULE. "mark INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'DISPLAY'. "조회버튼
CLEAR:flag, flag1.
flag = 'M'. "flag는 스태이터스제어
flag1 = 'M'. "flag1는 테이블컨트롤 input open 제어
WHEN 'BACK'. "back버튼
LEAVE TO SCREEN 0.
WHEN 'MODIFY'. "수정버튼
CLEAR flag.
flag = 'X'.
flag1 = 'X'.
WHEN 'DELETE'. "삭제버튼
CLEAR: db_tab1, db_tab1[],
db_tab2, db_tab2[],
db_tab3, db_tab3[].
MESSAGE i002(zmess). "선택한 항목을 정말 지우겠습니까
LOOP AT itab.
IF itab-mark = 'X'.
index = sy-tabix.
DELETE itab INDEX index. "실제적으로 눈으로만 지워준것
MOVE-CORRESPONDING itab TO db_tab1. "헤더에만 올라가있다 밑에서 어펜드를 해주는 이유
MOVE-CORRESPONDING itab TO db_tab2.
MOVE-CORRESPONDING itab TO db_tab3.
APPEND db_tab1.
APPEND db_tab2.
APPEND db_tab3.
ENDIF.
ENDLOOP.
DELETE zmw_perstell FROM TABLE db_tab1.
DELETE zmw_pers_info FROM TABLE db_tab2. "실제적으로 디비테이블의 자료를 지워준다
DELETE zmw_addr_info FROM TABLE db_tab3.
MESSAGE s003(zmess).
WHEN 'SAVE'. "세이브버튼
MESSAGE i006(zmess).
CLEAR: db_tab1, db_tab1[],
db_tab2, db_tab2[],
db_tab3, db_tab3[].
IF error_sg <> 'F'.
LOOP AT itab.
MOVE-CORRESPONDING itab TO db_tab1.
MOVE-CORRESPONDING itab TO db_tab2.
MOVE-CORRESPONDING itab TO db_tab3.
APPEND db_tab1.
APPEND db_tab2.
APPEND db_tab3.
ENDLOOP.
MODIFY zmw_perstell FROM TABLE db_tab1. "바뀐것이 모디파이 된다 즉 세이브된다
MODIFY zmw_pers_info FROM TABLE db_tab2.
MODIFY zmw_addr_info FROM TABLE db_tab3.
MESSAGE s004(zmess).
ELSEIF error_sg = 'F'.
MESSAGE i005(zmess).
EXIT.
ENDIF.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INP
여기가 100번화면입니다.
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE line.
LOOP AT itab WITH CONTROL tc_1 CURSOR tc_1-current_line.
MODULE tc_cont.
ENDLOOP.
PROCESS AFTER INPUT.
MODULE exit AT EXIT-COMMAND.
LOOP AT itab.
CHAIN.
FIELD : itab-mark ,
itab-perid,
itab-name,
itab-promdate,
itab-addno,
itab-addr1,
itab-addr2,
itab-telco,
itab-telno.
MODULE mark ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
MODULE user_command_0100.
초보아밥퍼님 확인부탁드려요 ^^
-
Delight
2008.05.16 22:43
activeman님의 의견되로 SAVE시점에 중복체크를 하시는게 제일 좋은 방법 같습니다. -
초보아밥퍼
2008.05.17 00:26
READ TABLE itab WITH KEY perid = itab-perid. <-- ITAB에는 itab-perid동일한 값이 있거나 없거나
IF sy-subrc <> 0. <-- 0 또는 4 떨어질것이고
MODIFY itab INDEX tc_1-current_line. <-- 0 이면 MODIFY하공(APPEND,UPDATE기능성)
ELSE.
CLEAR itab.
MESSAGE i007(zmess).
ENDIF.
그냥 이렇게 하면 안될런지...
-
주야
2008.05.21 19:18
READ TABLE itab WITH KEY perid = itab-perid.
이 구문은 조심해서 사용하셔야 합니다.
RETURN 코드값이 어떻게 되냐에 따라 이때까지 MOVE ZZZ TO ITAB 해 놨던 값들이 쓸수도 못쓸수도 있기 때문에...
해서 그냥 쉽게 생각하세요.
LOCAL INTERANL TABLE(LTAB) 하나 생성해 놓고(ITAB과 동일한 구조로)
키값이 바뀌는 시점( ON CHAIN-REQUEST)에
LOCAL INTERNAL TABLE값을 모두 REFRESH 시키고 LTAB[] = ITAB[] 해놓고선
READ TABLE LTAB WITH KEY XXX = ITAB-XXX.
해서 있으면 에러인거죠.
이때 ITAB-XXX는 화면에서 새로 입력받은 값이겠죠. 그리고 당근 키값 모두 비교해야 하구요.
그리고 SAVE할 땐 당연히 그전에 DB값과 중복된게 있는지 확인해야 하구요.
중복을 체크하는 방법은 여러가지가 있을 겁니다.
꼭 입력하면서 체크 하실 필요는 없을 듯합니다..즉 입력하는 필드에서 체크 하실 필요는 없다는 거죠
테이블 컨트롤인경우 loop ~endloop구문에서 필드를 체크하실텐데 굳이 그기에서 체크하실 필요없이(제어가 힘들기 때문)
loop 구문이 아닌곳에서 인터널테이블의 항목이 중복되는지 체크를 하시고 메시지로 어떤항목이
중복 되었다고 띄워주셔도 될것 같습니다.
그리고 save 하실때 한번더 중복체크를 해주시면 될것 같습니다.
즐밥하세요..