웹 상에 파워빌더 관련 자료가 많이 없어 최근 해결한 엑셀 업로드 관련 내용을 하나 소개합니다.
두가지 문제를 소개드릴껀데,
먼저 첫번째는 엑셀에서 txt 파일변경 후 데이터 윈도우로 importfile 할 때 생기는 타이밍 이슈 입니다.
파워빌더 엑셀파일을 읽어오기 위해서는 일단 엑셀파일을 텍스트 파일로 변환 저장하고,
그 텍스트 파일을 읽어온 뒤 저장한 텍스트파일을 삭제하도록 구현합니다.
// 엑셀파일을 txt 파일로 변경하는 부분
ole_excel.WorkBooks.Open(ls_open_file)
ole_excel.Application.Visible = FALSE
lb_select = ole_excel.WorkSheets(1).Activate
ll_xls = pos(ls_open_file, 'xls')
ls_save_file = mid(ls_open_file, 1, ll_xls -2) + string(now(),'hhmmss') + ".txt"
ole_excel.Application.Workbooks(1).Saveas(ls_save_file, -4158)
ole_excel.WorkBooks(1).Saved = TRUE
ole_excel.Application.Quit
ole_excel.DisConnectObject()
DESTROY ole_excel
// txt 파일을 데이터 윈도우로 읽어오는 부분
ll_import = dwo.importfile(ls_save_file)
SetPointer(Arrow!)
IF ll_import < 1 Then
MessageBox("ERROR", f_message("SY00029") + "(" + ls_save_file + ") " + string(ll_import), StopSign!)
Return ll_import
END IF
문제는 위 코드 중 dwo.importfile(ls_save_file) 여기서 발생합니다.
데이터 윈도우와 엑셀 시트의 열의 순서, 데이터 타입 모두 동일하게 했는데도 불구하고, '-2 파일이 비어있다' 라는 리턴코드가 계속 떨어졌습니다.
디버깅 결과 타이밍 이슈가 발생하는 것을 확인했습니다.
txt 파일이 정상적으로 생성되기 전에 ll_import = dwo.importfile(ls_save_file) 이 부분이 실행되는 것을 확인했습니다.
그래서 아래와 같이 코드를 변경해주니 정상동작 합니다.
FOR ll_cnt = 1 TO 5000
ll_import = dwo.importfile(ls_save_file)
IF ll_import = -2 THEN
CONTINUE
ELSE
EXIT
END IF
NEXT
두번째는 문제는 importfile(ls_save_file) 로 데이터 윈도우에 DATA가 절반 가량만 들어가는 문제가 발생했습니다.
결론부터 말씀드리면 이 문제는 ole_excel.Application.Workbooks(1).Saveas(ls_save_file, -4158) 할 때 -4158 파라메터가 잘못되었기 때문입니다.
dwo.importfile()에서 제대로 import 하기 위해서는 유니코드형태의 txt파일로 저장되어야합니다.
(importfile() 함수설명 참조 : http://infocenter-archive.sybase.com/help/index.jsp?topic=/com.sybase.help.pb_10.5.dwref/html/dwref/BFCBDJFEdw.htm)
ole_excel.Application.Workbooks(1).Saveas(ls_save_file, -4158) 함수의 두번 째 파라메터는 어떤 엑셀을 어떤 형식으로 저장할 것인지를 결정하는 파라메터입니다.
(참조 MSDN :
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbook-saveas-method-excel
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlfileformat-enumeration-excel)
이 파라메터를 유니코드 형태 TXT 파일을 의미하는 42로 수정하면 정상적으로 모두 txt 파일의 DATA를 전부 데이터윈도우로 import 해옵니다.
*.수정 완료 후 코드
SetPointer(HourGlass!)
ole_excel.WorkBooks.Open(ls_open_file)
ole_excel.Application.Visible = FALSE
lb_select = ole_excel.WorkSheets(1).Activate
ll_xls = pos(ls_open_file, 'xls')
ls_save_file = mid(ls_open_file, 1, ll_xls -2) + string(now(),'hhmmss') + ".txt"
ole_excel.Application.Workbooks(1).Saveas(ls_save_file,42)
ole_excel.WorkBooks(1).Saved = TRUE
ole_excel.Application.Quit
ole_excel.DisConnectObject()
DESTROY ole_excel
FOR ll_cnt = 1 TO 5000
ll_import = dwo.importfile(ls_save_file)
IF ll_import = -2 THEN
CONTINUE
ELSE
EXIT
END IF
NEXT
SetPointer(Arrow!)
'Tech & Programming > 파워빌더' 카테고리의 다른 글
Sybase 파워빌더 아카이브 사이트 공유 (MSDN과 유사) (0) | 2018.07.20 |
---|---|
[Tip - 파워빌더] 파워빌더가 갑자기 다운될 때 조치방법 (0) | 2017.11.29 |
[Tip - 파워빌더] DB Profile 설정 시 오류 발생 조치 방법 (0) | 2017.11.29 |