엑셀파일을 불러와서 엑셀에 있는 데이터 값과 sap에서 만든 테이블과의 데이터를
비교해서 없는 값만 올리려고 해요
제가 코딩한건 일단 엑셀파일을 불러와서 테이블(임의생성한)에 올려주는 로직까진 했구요
근데 이걸 비교해서 없는것만 올리는 구문은 어떻해 어느 부분에 넣어야 될까요?
*====================================*
*&---------------------------------------------------------------------*
*& Report ZAB07B02
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZAB07B02 MESSAGE-ID ZAB07M.
*----------------------------------------------------------------------*
* TABLES DEFINE
*----------------------------------------------------------------------*
TABLES ZAB02T02.
*----------------------------------------------------------------------*
* DATA DEFINE
*----------------------------------------------------------------------*
DATA: V_FIELD0(4) TYPE C,
GV_INDEX TYPE I,
GV_ROW TYPE N,
GV_TAB TYPE FILETABLE,
GV_FILE LIKE RLGRAP-FILENAME, "경로저장변수
GV_SUBRC TYPE I,
GV_TMP TYPE I.
FIELD-SYMBOLS <FS> TYPE ANY.
* 엑셀 업로드 데이터 선언
DATA : GT_XLS TYPE KCDE_CELLS OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* INTERNAL TABLE DEFINE
*----------------------------------------------------------------------*
DATA : BEGIN OF ITAB_RST OCCURS 0,
* FIELD0(1), "체크박스의 공간을 위한 변수선언
TITLE(10),
A(10),
B(10),
C(10),
D(10),
E(10),
F(10),
G(10),
H(10),
I(10),
J(10),
K(10).
DATA: END OF ITAB_RST.
DATA : BEGIN OF ITAB_IN OCCURS 0.
INCLUDE STRUCTURE ZAB02T02.
DATA: END OF ITAB_IN.
*기본 화면
*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS : P_FNAME LIKE RLGRAP-FILENAME MODIF ID 01, "파일명
P_ENDCOL TYPE I MODIF ID 01,
P_ENDROW TYPE I MODIF ID 01.
SELECTION-SCREEN END OF BLOCK B1.
*------------------------------------------------------
*AT SELECTION-SCREEN
*-------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.
PERFORM F4_FILENAME USING P_FNAME.
*------------------------------------------------------------
*INITIALZATION
*------------------------------------------------------------
INITIALIZATION.
PERFORM INITIALIZATION.
*------------------------------------------------------------
*START-OF-SELECTION
*------------------------------------------------------------
START-OF-SELECTION.
SET PF-STATUS 'STAT0100'. "실행시 툴바밑에 버튼지정
CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
EXPORTING
FILENAME = P_FNAME "경로 지정
I_BEGIN_COL = '1' "시작칼럼
I_BEGIN_ROW = '1' "시작열
I_END_COL = P_ENDCOL "끝라인
I_END_ROW = P_ENDROW "끝열
TABLES
INTERN = GT_XLS
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
LOOP AT GT_XLS.
GV_INDEX = ( GT_XLS-COL ).
ASSIGN COMPONENT GV_INDEX OF STRUCTURE ITAB_RST TO <FS>.
MOVE GT_XLS-VALUE TO <FS>.
AT END OF ROW.
APPEND ITAB_RST.
CLEAR ITAB_RST.
ENDAT.
ENDLOOP.
LOOP AT ITAB_RST.
WRITE :/ ITAB_RST.
ENDLOOP.
*LOOP AT GT_XLS.
* WRITE : / GT_XLS-ROW , GT_XLS-COL , GT_XLS-VALUE.
*ENDLOOP.
INCLUDE ZAB07B01_F4_FILENAMEF01.
*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_FNAME text
*----------------------------------------------------------------------*
FORM F4_FILENAME USING GV_FILE.
CLEAR : GV_TAB. REFRESH GV_TAB.
*업로드할 파일의 PATH 지정하기.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = '업로드할 파일을 선택하세요'
DEFAULT_FILENAME = '*.XLS'
MULTISELECTION = ' '
CHANGING
FILE_TABLE = GV_TAB
RC = GV_SUBRC.
IF SY-SUBRC = 0.
LOOP AT GV_TAB INTO GV_FILE.
ENDLOOP.
ENDIF.
ENDFORM. " F4_FILENAME.
*&---------------------------------------------------------------------*
*& Form INITIALIZATION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM INITIALIZATION .
P_FNAME = 'C:'.
ENDFORM. " INITIALIZATION
*----------------------------------------------------------------------*
* AT USER-COMMAND //펑션키 설정
*----------------------------------------------------------------------*
AT USER-COMMAND.
SY-LSIND = 1.
CASE SY-UCOMM.
WHEN 'SS'.
PERFORM SELECT_ALL.
WHEN 'DEL'.
PERFORM DELETE_ALL .
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
SY-UCOMM = ' '.
*&---------------------------------------------------------------------*
*& Form SELECT_ALL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SELECT_ALL.
LOOP AT ITAB_RST.
MOVE-CORRESPONDING ITAB_RST TO ITAB_IN.
CLEAR ZAB02T02.
ZAB02T02-MANDT = SY-MANDT.
ZAB02T02-TITLE = ITAB_IN-TITLE.
ZAB02T02-A = ITAB_IN-A.
ZAB02T02-B = ITAB_IN-B.
ZAB02T02-C = ITAB_IN-C.
ZAB02T02-D = ITAB_IN-D.
ZAB02T02-E = ITAB_IN-E.
ZAB02T02-F = ITAB_IN-F.
MODIFY ZAB02T02 FROM ITAB_IN.
MESSAGE s007.
ENDLOOP.
ENDFORM. "SELECT_ALL
*&---------------------------------------------------------------------*
*& Form DELETE_ALL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DELETE_ALL .
loop at ITAB_RST.
DELETE FROM ZAB02T02.
MESSAGE s006.
endloop.
ENDFORM. " DELETE_ALL
댓글 4
-
나더몰라
2008.03.20 22:37
-
옆집남자
2008.03.21 02:50
허접 초보 생각 씁니다.
1. 엑셀 테이타를 담아야죠.^^ -> it_list
2. sap table에서 비교할 테이블을 담아야죠.^^ - gt_list.
당연 key 조건으로..1를 돌면서 2를 검색하면 되죠.^^
loop at it_list.
read table gt_list with key key 조건들 .....ㅋㅋ
if sy-subrc eq 0.
이곳으로 떨어지면 sap 테이블에 있는거.
else.
여기로 떨어지면 sap테이블에 없는거..그럼 이부분에 떨어진것만..
새롭게 인터널 테이블에 담아서...어펜드 해주면 되고..
난중에 요걸 update 해주면 되졍..^^
endif.
endloop.
허접 생각 이였습니다.
-
옆집남자
2008.03.21 02:57
-추가-
님 소스를 보고 어디 부분에 넣어야 될지는.....말해 드리기가 참 머하네요..ㅎㅎ
그냥 생각을 조금 해보면..
1.엑셀 담고.
2.비교하고.
3 비교된 데이타 따로 저장하고.
================================================
4.만약 버튼이 있다면..save, delete, change. 등등..
5. 버튼 처리문 넣어주고.
=================================================
6 만약 버튼 없고 바로 update 처리 해주는 거라면..따로 담은 테이블 걍 update해주면 됩니다.
그럼 대충 어디에 넣어야 될지 아시겠나요.?
소스 흐름을 잘 봐보세요..아무리 초보라도 보면 보입니다.^^
허접 초보 였습니다.
-
r333
2008.03.21 18:09
^^잘이해했습니다.
옆집남자님, 나더몰라님의 아이디어 감사합니다.
IF SY-SUBRC NE 0. 이구문이 생각을 왜못했는지 저도 이해가 안가네요^^
DATA : GS_ITAB LIKE SAP 테이블에 ITAB
LOOP AT ITAB. "itab 업로드한값
SAP 테이블에 ITAB 업로드한값의 키값을 WHERE 조건으로 줘서 SELECT
IF SY-SUBRC NE 0.
MOVE-CORRESPONDING ITAB TO GS_ITAB.
INSERT SAP 테이블 FROM GS_ITAB.
ENDIF.
ENDLOOP.
이런식으로 하면되지 안을까요..?