OLE2 로 엑셀 문서를 출력하는 프로그램을
DOI 로 바꾸려고 하고 있습니다.
기존의 프로그램에서 최종적으로 나온 엑셀 결과는,
어느곳에도 저장은 안되고
단지 신규 엑셀 화면이 띄워 지고 셀 안에 데이터가 들어 있는
- 즉 저장 된 파일이 아닌.. - 상태인데요.
DOI 로 문서를 띄워서 작업을 하는것 까진 성공 했는데
프로그램이 종료되면 Excel 파일도 같이 종료 되어 버리네요.
(유저가 확인 할 틈도 없이)
Excel 창이 닫히지 않고 남아 있게 하려면 어떻게 해야 하는 지 알고 싶습니다..
샘플 프로그램 참고해서 시험중입니다만
선언은 다음과 같습니다.
CALL METHOD C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
IMPORTING
CONTROL = CONTROL
RETCODE = RETCODE.
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'CONTAINER'.
컨테이너를 만들고
CALL METHOD CONTROL->INIT_CONTROL
EXPORTING R3_APPLICATION_NAME =
'R/3 Basis' "#EC NOTEXT
INPLACE_ENABLED = ''
INPLACE_SCROLL_DOCUMENTS = ''
PARENT = CONTAINER
REGISTER_ON_CLOSE_EVENT = 'X'
REGISTER_ON_CUSTOM_EVENT = 'X'
NO_FLUSH = 'X'
IMPORTING error = errors
CALL METHOD CONTROL->GET_DOCUMENT_PROXY
EXPORTING DOCUMENT_TYPE = 'Excel.Sheet'
NO_FLUSH = 'X'
* REGISTER_CONTAINER = 'X'
IMPORTING DOCUMENT_PROXY = DOCUMENT
error = errors.
CALL METHOD DOCUMENT->CREATE_DOCUMENT
EXPORTING OPEN_INPLACE = ''
DOCUMENT_TITLE =
'R/3 table contents in Excel' "#EC NOTEXT
NO_FLUSH = 'X'
IMPORTING
ERROR = errors
* RETCODE =
그리고 엑셀 파일을 띄웠구요
CALL METHOD DOCUMENT->GET_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH = ' '
IMPORTING
SHEET_INTERFACE = SPREADSHEET.
제어를 위해 인터페이스를 받아왔습니다
이후로는 DB 로부터 자료를 가져와서
CALL METHOD SPREADSHEET->INSERT_RANGE_DIM
EXPORTING
NAME = 'SAP_Table'
TOP = 2
LEFT = 2
ROWS = 5
NO_FLUSH = 'X'
COLUMNS = 5
IMPORTING
ERROR = ERRORS.
APPEND ERRORS.
영역을 설정하고
* transfer R/3 table data into excel range
CALL METHOD spreadsheet->insert_one_table
EXPORTING data_table = excel_table
ddic_name = tabname
rangename = 'SAP_Table'
no_flush = 'X'
wholetable = 'X'
IMPORTING error = errors.
APPEND errors.
자료를 넘기고
CALL METHOD spreadsheet->fit_widest
EXPORTING name = space
no_flush = 'X'.
* protect the R/3 data against input
CALL METHOD spreadsheet->protect_range
EXPORTING name = 'SAP_Table'
protect = 'X'
no_flush = 'X'
IMPORTING error = errors.
APPEND errors.
* now flush automation queue
CALL METHOD control->set_focus
EXPORTING no_flush = ' '
IMPORTING error = errors.
APPEND errors.
화면에 보이게 했습니다.
중간에 자질구레한 곳들은 뺐는데
필요한 곳이 있으면 보충하겠습니다...
댓글 9
-
JiruMi
2009.02.26 04:19
-
으..2MB~떠나야하나
2009.02.26 06:34
죄송한데 컨테이너에 담긴 엑셀 파일을 안 닫히게 하시고 싶단 말씀이신지요?
-
도도마녀
2009.02.26 06:49
저 클래스는 사용해 보지 않았었는데 저렇게 엑셀로 출력하는 방법도 있군요...
내일 한번 해보고 싶네요 -0-
그냥 단순하게 gui_downlaod 하고 다운된 파일 호출해주면 안되는 건가요?
엑셀파일이 서식이 필요한 양식이라면 smw0에 서식파일 올리고 매크로로 처리하셔도 될듯 하고요
-
지의
2009.02.26 17:50
엑셀을 하나 열어서 뛰우지 말고 cbo 화면 하나 만들어서 화면 내에다 뛰워주면 어떨까 하는 생각도 해봅니다. -
JiruMi
2009.02.26 18:33
으..2MB~떠나야하나님 댓글 감사합니다.
아직 잘 몰라서 샘플을 참조하면서 하다보니 저렇게 컨테이너를 만들어서 붙이고 띄우고 있는데요,
현재 저렇게 하면 SAP 와는 별도로 엑셀 창이 떠서 셀에 데이타가 쓰여집니다. (여기까진 좋습니다)
문제는 프로그램이 종료 되었을때 이 창이 같이 Close 된다는 점입니다..
도도마녀님 , 지의님// 댓글 감사합니다.
현재의 과제는 기존 프로그램의 결과 변형 없이 퍼포먼스의 향상을 꾀하려는 것인데
그렇게 하려다 보니 이런 고민을 하고 있는겁니다.
고객은 결과 화일이 엑셀 화면에서 나타나면, 거기서 최종 수정을 가한 뒤에 자신의 컴퓨터에
저장을 하고 있다고 합니다.
-
으..2MB~떠나야하나
2009.02.26 18:40
컨테이너에 엑셀을 부르는 경우는 ole 로 제어하는 경우와 조금 차이가 있습니다.
DOI 방식은 alv 처럼 만들어진 화면의 컨테이너에 엑셀을 호출하는 것이고
OLE 는 엑셀 프로그램을 직접 실행하는 것입니다.
당연히 DOI 방식에서는 별도의 저장이 없는 경우 엑셀창이 닫히게 될겁니다.
속도가 느리긴 하지만 엑셀을 직접 제어하고 싶으시면 OLE 방식으로 가야하는게 아닐까 싶습니다.
OLE 의 경우 별도의 close, quit 명령어가 없는 경우 저장을 안해도 엑셀이 닫히지는 않습니다.
-
JiruMi
2009.02.26 18:47
으..2MB~떠나야하나 님 //
아.. 생각해 보니 그렇군요. 컨테이너에 달려 있으니 프로그램이 닫히면 종료 될 수 밖에 없군요.
OLE 처럼 별도로 제어 할 수 있는 방법은 없는것인가..
답변 감사 드리며 질문 종료 하겠습니다!
-
DBnoid
2009.02.26 20:02
최근 OLE관련 프로그램을 보다 궁금했었는데 비슷한 생각을 하신거같네요.
OLE관련 프로그램을 하시려면 OLE에서 쓸수 있는 항목들을 알아야 합니다.
저도 해당 항목들의 라이브러리가 없을까 하는 생각을 했는데 결국은 MS에 있더군요.
MSDN의 VBA 관련 홈페이지를 보시면
OLE를가지고 엑셀실행, 셀병합, 셀에 색깔넣기, 폰트설정, 등의 기능을 공부해 보실수 있을꺼라 생각됩니다.
부디 성공하시길...
-
JiruMi
2009.02.26 23:55
DBnoid 님// 감사합니다. 거기까진 생각도 못 해 봤는데 좋은 참고가 되었습니다~.
마지막에 write 문을 하나 찍어주니까 엑셀 파일이 안 닫기고 살아 있네요.
프로그램 세션이 종료 안되고 남아 있어서 그런가..
역시나 결과 화면을 x 버튼으로 닫으면 엑셀도 함께 닫힙니다.
(동시에 OLE2 로도 똑같은 화면을 출력 했는데 얘만 남아있어요)