Tech & Programming/파워빌더

파워빌더 엑셀 업로드 관련 오류 (importfile함수 오류)

소스코드 요리사 2018. 1. 31. 13:36

웹 상에 파워빌더 관련 자료가 많이 없어 최근 해결한 엑셀 업로드 관련 내용을 하나 소개합니다.


두가지 문제를 소개드릴껀데, 


먼저 첫번째는 엑셀에서 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!)