안녕하세요~ 아밥을 접한 지 한 달 된 초짜입니다 ^^;
엑셀파일을 업로드하여 데이터를 insert하는 프로그램을 짰는데,
날짜 형식인 필드의 데이터가 깨집니다. (텍스트 파일로 올릴 시에는 제대로 들어갑니다)
엑셀파일 데이터 : 2008.04.30 -> insert 된 데이터 : 2008..0.4. 이렇게요.
문제가 뭘까요? ㅠ
관련 코드는 아래와 같습니다.
DATA : LO_ITAB TYPE KCDE_CELLS OCCURS 0 WITH HEADER LINE.
DATA : LO_INDEX LIKE SY-TABIX.
DATA : LO_START_COL TYPE I VALUE '1',
LO_START_ROW TYPE I VALUE '1',
LO_END_COL TYPE I VALUE '256',
LO_END_ROW TYPE I VALUE '65536'.
FIELD-SYMBOLS : <LO_FS> TYPE ANY.
CLEAR : G_UPLOAD_T.
FREE : G_UPLOAD_T.
IF P_IFILE2 IS NOT INITIAL.
* 업로드된 엑셀 파일에서 데이터를 읽는 함수
CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
EXPORTING
FILENAME = P_IFILE2
I_BEGIN_COL = LO_START_COL
I_BEGIN_ROW = LO_START_ROW
I_END_COL = LO_END_COL
I_END_ROW = LO_END_ROW
TABLES
INTERN = LO_ITAB
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2.
CHECK NOT LO_ITAB[] IS INITIAL.
SORT LO_ITAB BY ROW COL.
LOOP AT LO_ITAB.
MOVE : LO_ITAB-COL TO LO_INDEX.
ASSIGN COMPONENT LO_INDEX OF STRUCTURE G_UPLOAD_T TO <LO_FS>.
MOVE : LO_ITAB-VALUE TO <LO_FS>.
AT END OF ROW.
APPEND G_UPLOAD_T.
CLEAR G_UPLOAD_T.
ENDAT.
ENDLOOP.
ENDIF.
LOOP AT G_UPLOAD_T.
INSERT INTO ZTEBT VALUES G_UPLOAD_T.
ENDLOOP.
댓글 3
-
엉큼고냥이
2008.06.26 22:16
아밥님이 말씀하신것처럼 날짜가 8바이트라서 .를 빼고 올려주셔야됩니다^^;; -
하오
2008.09.17 23:58
CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT' 하시고 나서
LO_ITAB-VALUE 를
data: li_cnt type i,
li_yyyy type c,
li_mm type c,
li_yyyymmdd(8) type c.
li_cnt = strlen( gt_upload-value ).
li_yyyy = li_cnt - 4.
li_mm = li_cnt - 7.
clear: li_yyyymmdd.
concatenate gt_upload-value+li_yyyy(4) "yyyy
gt_upload-value+li_mm(2) "mm
gt_upload-value+0(2) "dd
into li_yyyymmdd.
move li_yyyymmdd to G_UPLOAD_T-fldate. 처럼 했습니다. -
comple
2008.11.05 20:10
FM 'CONVERT_DATE_TO_INTERNAL' 은 external 형식을 internal date 형식으로 변경해줍니다.
아래 소스을 참조하시면 이해가 되실겁니다.
하지만 이것도 만능은 아닙니다.
SAP 사용자 설정에 있는 년/월/일 구분자(-,/,.), 순서에 맞게 변경됩니다.
사용자 설정에 YYYY.MM.DD 인데 엑셀 업 하실때 YYYY/MM/DD로 하시면 에러가 납니다.
꼭 주의하시길.
data: lv_char(10).
data: lv_datum type sy-datum.
lv_char = '20081010'.
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
date_external = lv_char
* ACCEPT_INITIAL_DATE =
IMPORTING
DATE_INTERNAL = lv_datum
EXCEPTIONS
DATE_EXTERNAL_IS_INVALID = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
write: lv_char, lv_datum.
lv_char = '2008.10.10'.
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
date_external = lv_char
* ACCEPT_INITIAL_DATE =
IMPORTING
DATE_INTERNAL = lv_datum
EXCEPTIONS
DATE_EXTERNAL_IS_INVALID = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
skip.
write: lv_char, lv_datum.