The goal of this doc, is to give some tools to access to file store using GOS & ArchiveLink
The big problem of GOS is: you could store documents in different places. You will need to use different method / functions to read the document depending of the location.
Lets take an example, a Sales Order :
At first you could think all the documents are stored in the same place, but it's not. A detail could give you this information quickly. There is no creator for object post on a HTTP Content Server.
1. Get the list of document store in the HTTP Content Server.
Code |
---|
DATA : lw_objecttype TYPE saeanwdid , |
The result in debug is
5 documents store in the Content Repository Z1
1 document store in the Content Repository Z2
Sample code to read the content of the last file.
Code |
---|
DATA : lw_objecttype TYPE saeanwdid , lw_object_id TYPE saeobjid , lw_file TYPE string , lw_path TYPE string , lw_fullpath TYPE string , lw_doctype TYPE saedoktyp , lw_length TYPE num12 , lw_offset TYPE num12 , lw_size TYPE i , ls_connection TYPE toav0 , lt_connections TYPE toav0_t , lt_data TYPE tabl1024_t . MOVE : '0000009122' TO lw_object_id , 'VBAK' TO lw_objecttype . * Get the list of documents link to the Sales Order CALL FUNCTION 'ARCHIV_GET_CONNECTIONS' EXPORTING objecttype = lw_objecttype object_id = lw_object_id TABLES connections = lt_connections EXCEPTIONS nothing_found = 1 OTHERS = 2. * Get the last entry. LOOP AT lt_connections INTO ls_connection. ENDLOOP. * Change the type of the field for Document Type (=PDF) MOVE ls_connection-reserve TO lw_doctype. * Get the Content of the entry in Binary Mode (more simple for PDF) CALL FUNCTION 'ARCHIVOBJECT_GET_BYTES' EXPORTING archiv_id = ls_connection-archiv_id archiv_doc_id = ls_connection-arc_doc_id document_type = lw_doctype length = lw_length offset = lw_offset IMPORTING binlength = lw_length TABLES binarchivobject = lt_data EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_kernel = 3 OTHERS = 4. CHECK sy-subrc EQ space. * Ask user for the name and the location of the file CALL METHOD cl_gui_frontend_services=>file_save_dialog CHANGING filename = lw_file path = lw_path fullpath = lw_fullpath EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. MOVE lw_length TO lw_size. * Save the file. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = lw_size filename = lw_file filetype = 'BIN' CHANGING data_tab = lt_data EXCEPTIONS OTHERS = 24. |
2. Get the list of document store in the default SAP tables.
Code |
---|
|
The result in debug mode will be :
To read the data, we will used a SAP Office function. Because the file are stored in the SAP Office table SOO*
Code |
---|
DATA : lw_file_type TYPE fileformat , lw_file TYPE string , lw_path TYPE string , lw_fullpath TYPE string , lw_doc_id TYPE so_entryid , ls_role TYPE obl_s_rolt , ls_object TYPE sibflporb , ls_relation TYPE obl_s_relt , ls_link_a TYPE obl_s_link , ls_doc_data TYPE sofolenti1 , lt_objects TYPE sibflporbt , lt_link_a TYPE obl_t_link , lt_roles TYPE obl_t_rolt , lt_relations TYPE obl_t_relt , lt_content TYPE TABLE OF solisti1 , lt_contentx TYPE solix_tab. * The object Key MOVE : '0000009122' TO ls_object-instid , 'BUS2032' TO ls_object-typeid , 'BO' TO ls_object-catid . APPEND ls_object TO lt_objects. * The kind of object MOVE : 'I' TO ls_role-sign , 'EQ' TO ls_role-option , 'GOSAPPLOBJ' TO ls_role-low. APPEND ls_role TO lt_roles. MOVE : 'I' TO ls_relation-sign , 'EQ' TO ls_relation-option , 'ATTA' TO ls_relation-low . APPEND ls_relation TO lt_relations. MOVE : 'BIN' TO lw_file_type. * Extraction des liens. TRY. CALL METHOD cl_binary_relation=>read_links_of_objects EXPORTING it_objects = lt_objects it_role_options = lt_roles it_relation_options = lt_relations IMPORTING et_links_a = lt_link_a. CATCH cx_obl_model_error . CATCH cx_obl_parameter_error . CATCH cx_obl_internal_error . ENDTRY. LOOP AT lt_link_a INTO ls_link_a. ENDLOOP. MOVE ls_link_a-instid_b TO lw_doc_id . CALL FUNCTION 'SO_DOCUMENT_READ_API1' EXPORTING document_id = lw_doc_id IMPORTING document_data = ls_doc_data TABLES object_content = lt_content contents_hex = lt_contentx EXCEPTIONS document_id_not_exist = 1 operation_no_authorization = 2 x_error = 3 OTHERS = 4. * Ask user for the name and the location of the file CALL METHOD cl_gui_frontend_services=>file_save_dialog CHANGING filename = lw_file path = lw_path fullpath = lw_fullpath EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. * Save the file. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING * bin_filesize = lw_size filename = lw_file filetype = 'BIN' CHANGING data_tab = lt_contentx EXCEPTIONS OTHERS = 24. |