SAP ABAP에서 웹저장소(SMW0)를 이용한 문서 연결
ABAP 프로그램에 파일을 연결하는 방식은 여러가지가 있겠지만, 저같은 경우엔 SMW0에 파일을 업로드 하여 사용을 합니다.
이 파일을 BDC나 Excel Upload할때 문서양식을 PC에서 찾지 않고 프로그램에 직접 연결해서 쓰면 편하기 때문이지요.
아래와 같이 버튼을 추가해서 프로그램에 연결합니다.
그럼, SMW0에 문서를 저장하는 방법을 소개합니다.
1. SMW0 초기화면
- 티코드 SMW0를 실행하면 초기 화면이 나옵니다. 여기서 2번째 선택
2. 패키지 생성 or 대상 패키지 조회
3. 신규 오브젝트 생성
4. 신규파일 타입일 경우 MIME Type 추가
- 등록된 확장자가 없다면 신규등록 추가 (파일 등록전에 mime type 추가해준 화면(ms-word, ms-excel) )
5. 신규문서 등록
6. SMW0 파일 링크 위한 ABAP 코드
*&———————————————————————*
*& Report ZMMB3000
*&
*&———————————————————————*
*&이크래더블 거래실적 Excel Upload
*&———————————————————————*
REPORT zmmb3000.
TYPE-POOLS: kcde,
icon.
TABLES: sscrfields. “선택화면의 필드
DATA : g_xls_t TYPE STANDARD TABLE OF kcde_intern_struc WITH HEADER LINE.
DATA: BEGIN OF gt_dat OCCURS 0,
venid(10), “협력회사ID
seqid(2), “Seq.
bunam(35), “사업및솔루션.
reqcm(35), “사업분야.
smonth(6), “수행기간시작일.
emonth(6), “수행기간종료일.
putyp(1), “수행성격(‘1’:제품, ‘2’:용역).
oramt(20), “계약금액.
ordcm(35), “발주처.
suptp(20), “수급형태.
pertp(20), “이행구분.
END OF gt_dat.
DATA: gt_2060 TYPE TABLE OF zmmt2060 WITH HEADER LINE.
*–> SMW0 ROUTING 생성/변경 양식
INCLUDE: officeintegrationinclude.
DATA: functxt TYPE smp_dyntxt.
DATA: doc_table LIKE w3mime OCCURS 0.
DATA: doc_size TYPE i.
DATA: doc_type(80) VALUE soi_doctype_excel97_sheet.“엑셀
DATA: doc_format(80) TYPE c.
DATA: link_server TYPE REF TO i_oi_link_server.
DATA: factory TYPE REF TO i_oi_document_factory.
DATA: document TYPE REF TO i_oi_document_proxy.
DATA: retcode TYPE t_oi_ret_string.
*<–
*———————————————————————-*
* INITIALIZATION
*———————————————————————-*
INITIALIZATION.
PERFORM scrfields_functxt.
*———————————————————————-*
* SELECTION-SCREEN
*———————————————————————-*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text–001.
PARAMETERS: p_header TYPE c DEFAULT 1. “헤더라인.
PARAMETERS p_fname LIKE rlgrap-filename. “파일.
SELECTION-SCREEN: FUNCTION KEY 1.
SELECTION-SCREEN END OF BLOCK b1.
*&———————————————————————*
*& AT SELECTION-SCREEN *
*&———————————————————————*
AT SELECTION-SCREEN.
PERFORM scr_user_command.
*———————————————————————-*
* AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
*———————————————————————-*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
CALL FUNCTION ‘F4_FILENAME’ “File Upload를 위한 Window
IMPORTING
file_name = p_fname.
*———————————————————————-*
* START-OF-SELECTION.
*———————————————————————-*
START-OF-SELECTION.
PERFORM close_document.
PERFORM excel_upload.
PERFORM change_data.
PERFORM save_data.
*&———————————————————————*
*& Form EXCEL_UPLOAD
*&———————————————————————*
* text
*———————————————————————-*
FORM excel_upload .
FIELD-SYMBOLS: <fs>.
DATA: lv_index TYPE i.
* 엑셀 파일 upload 함수 호출
CALL FUNCTION ‘KCD_EXCEL_OLE_TO_INT_CONVERT’ “파일 convert
EXPORTING
filename = p_fname
i_begin_col = 1
i_begin_row = 1
i_end_col = 100
i_end_row = 5000
TABLES
intern = g_xls_t
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
STOP.
ENDIF.
CHECK NOT g_xls_t[] IS INITIAL.
SORT g_xls_t BY row col.
LOOP AT g_xls_t WHERE row > p_header.
MOVE : g_xls_t-col TO lv_index.
ASSIGN COMPONENT lv_index OF STRUCTURE gt_dat TO <fs>.
MOVE : g_xls_t-value TO <fs>.
AT END OF row.
APPEND gt_dat.
CLEAR gt_dat.
ENDAT.
ENDLOOP.
ENDFORM. ” EXCEL_UPLOAD
*&———————————————————————*
*& Form CHANGE_DATA
*&———————————————————————*
* text
*———————————————————————-*
FORM change_data .
CLEAR: gt_2060, gt_2060[].
LOOP AT gt_dat.
MOVE-CORRESPONDING gt_dat TO gt_2060.
gt_2060-erdat = sy-datum.
gt_2060-erzet = sy-uzeit.
gt_2060-ernam = sy-uname.
gt_2060-aedat = sy-datum.
gt_2060-aezet = sy-uzeit.
gt_2060-aenam = sy-uname.
gt_2060-act_yn = ‘Y’.
gt_2060-lvorm = space.
APPEND gt_2060. CLEAR: gt_2060.
ENDLOOP.
ENDFORM. ” CHANGE_DATA
*&———————————————————————*
*& Form SAVE_DATA
*&———————————————————————*
* text
*———————————————————————-*
FORM save_data .
DATA: lv_lines(5).
lv_lines = LINES( gt_2060 ).
* DELETE FROM zmmt2060.
MODIFY zmmt2060 FROM TABLE gt_2060.
IF sy-subrc = 0.
WRITE:/ ‘거래실적 Upload완료!’.
WRITE:/ ‘건수:’, lv_lines.
ELSE.
WRITE:/ ‘거래실적 Upload실패!’.
ENDIF.
ENDFORM. ” SAVE_DATA
*&———————————————————————*
*& Form SCRFIELDS_FUNCTXT
*&———————————————————————*
* text
*———————————————————————-*
FORM scrfields_functxt .
functxt-icon_id = icon_import.
functxt-quickinfo = ‘Excel Format Download’.
functxt-icon_text = ‘Excel Format Download’.
sscrfields-functxt_01 = functxt.
ENDFORM. “scrfields_functxt
*&———————————————————————*
*& Form SCR_USER_COMMAND
*&———————————————————————*
* text
*———————————————————————-*
FORM scr_user_command .
CASE sscrfields-ucomm.
WHEN ‘FC01’.
PERFORM sap_oi_load_mime_data.
WHEN OTHERS.
ENDCASE.
ENDFORM. ” SCR_USER_COMMAND
*&———————————————————————*
*& Form SAP_OI_LOAD_MIME_DATA
*&———————————————————————*
* text
*———————————————————————-*
FORM sap_oi_load_mime_data .
IF factory IS INITIAL.
CALL METHOD c_oi_factory_creator=>get_document_factory
IMPORTING
factory = factory
retcode = retcode.
IF retcode NE c_oi_errors=>ret_ok.
EXIT.
ENDIF.
CALL METHOD factory->start_factory
EXPORTING
r3_application_name = ‘document_name’
IMPORTING
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = ‘E’.
CALL METHOD factory->get_link_server
IMPORTING
link_server = link_server
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = ‘E’.
CALL METHOD link_server->start_link_server
EXPORTING link_server_mode = 3
* DEFAULT 1(STANDARD NAME), 0 (INACTIVE), 2(CUSTOMER NAME),
* 3(UNIQUE NAME) -> 0, 2(동일사용자 X), 3 일때 다중실행 ##
* SERVER_NAME_SUFFIX = ‘HR’
IMPORTING retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = ‘E’.
ENDIF. “factory IS INITIAL..
*
CLEAR: doc_table[].
CALL FUNCTION ‘SAP_OI_LOAD_MIME_DATA’
EXPORTING
object_id = ‘ZMMB3000’ ” SMW0 정의된 문서
IMPORTING
data_size = doc_size
document_format = doc_format
document_type = doc_type
TABLES
data_table = doc_table
EXCEPTIONS
object_not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc NE 0.
RAISE fail_document_load.
MESSAGE ID sy-msgid TYPE ‘E’ NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF doc_size NE 0.
* FACTORY 와 DOCUMENT 연결
CALL METHOD factory->get_document_proxy
EXPORTING
document_type = doc_type
IMPORTING
document_proxy = document
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = ‘E’.
* Document를 Protected Mode로 Open하고 매크로를 실행함.
CALL METHOD document->open_document_from_table
EXPORTING
document_table = doc_table[]
document_size = doc_size
IMPORTING
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = ‘E’.
ELSE.
* MESSAGE E005 RAISING FAIL_DOCUMENT_OPEN.
* RAISE FAIL_DOCUMENT_OPEN.
* MESSAGE S000 WITH ‘선택한 문서가 없습니다’.
ENDIF.
ENDFORM. ” SAP_OI_LOAD_MIME_DATA
*&———————————————————————*
*& Form close_document
*&———————————————————————*
* text
*———————————————————————-*
FORM close_document .
IF NOT document IS INITIAL.
CALL METHOD document->close_document.
FREE document.
ENDIF.
ENDFORM. ” close_document
좋은 정보 감사합니다
도움이 되셨다니 다행입니다. 🙂
좋은 정보 감사합니다~ ^^
잘 활용하세요~
mime type에 추가는 어느 화면에서 할 수 있을까요?
설마 테이블에 그냥 밀어넣는건 아니지요?
세팅에 mime 유형 유지보수 기능 이용하시면 됩니다.
운영에 막혀 있으면, 개발에서 추가하시고 리퀘스트 따서 넘기시면 되요.