Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
vivek_anandhan
Participant
4,069
Introduction

This blog is the follow up blog for part 1 on downloading the GOS attachments and now we will be uploading and attaching a file to a specific document.

This is like the reverse process of the downloading GOS attachments.

Flow is as below.

  1. Choose the file from the desktop and this can be done by some standard class methods or FM TMP_GUI_DIRECTORY_LIST_FILES

  2. Upload the file using the FM SO_OBJECT_UPLOAD and you will be getting the content

  3. Create the Folder ID using the FM SO_OBJECT_UPLOAD

  4. Use the Function Module SO_OBJECT_INSERT to insert the object in the repository

  5. Now connect the object to the Document by creating a relationship using the function module BINARY_RELATION_CREATE_COMMIT


If you are looking for creating a log table on the files that are being uploaded using the program, it is pretty simple and you can add the same.

Code as follows
REPORT zbc_gos_attch_upload.

DATA: lt_file_table TYPE filetable,
lv_dir TYPE salfile-longname,
lt_file TYPE TABLE OF sdokpath,
lv_file_count TYPE i,
lt_dir TYPE TABLE OF sdokpath.
DATA: lt_goslog TYPE TABLE OF zgos_log,
ls_goslog TYPE zgos_log.

DATA: lv_rc TYPE i,
lv_action TYPE i,
lv_len TYPE so_doc_len,
lt_content TYPE soli_tab,
ls_fol_id TYPE soodk,
ls_obj_id TYPE soodk,
ls_obj_data TYPE sood1,
lt_objhead TYPE STANDARD TABLE OF soli,
lv_ext TYPE string,
lv_fname TYPE string,
lv_path TYPE string,
lv_path1 TYPE string,
lv_filename TYPE string,
ls_note TYPE borident,
lv_ep_note TYPE borident-objkey,
ls_object TYPE borident,
lo_objhead TYPE REF TO cl_bcs_objhead,
lv_object_type TYPE soodk-objtp,
lv_put_to_kpro TYPE sonv-flag,
i_objectno TYPE string,
i_otype TYPE string,
lv_filetype TYPE rlgrap-filetype.
*********************************************************************************************************
***Selection of upload folder
*********************************************************************************************************
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000.
SELECTION-SCREEN COMMENT 1(30) TEXT-003 FOR FIELD p_path.
PARAMETERS : p_path TYPE string LOWER CASE OBLIGATORY.
SELECTION-SCREEN: END OF BLOCK b1.
*SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
* SELECTION-SCREEN COMMENT 1(30) TEXT-004 FOR FIELD p_file.
* PARAMETERS: p_file TYPE string LOWER CASE OBLIGATORY.
* PARAMETERS: p_otype TYPE char24 DEFAULT 'BKPF'.
*SELECTION-SCREEN: END OF BLOCK b2.
************************************************************************
* At Selection-screen on Value-request for P_PATH
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = 'Select the Folder to upload the files'
CHANGING
selected_folder = p_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
RETURN.
ENDIF.
************************************************************************
* At Selection-screen on Value-request for P_FILE
************************************************************************
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* PERFORM f4_p_file CHANGING p_file.
************************************************************************
* Start of Selection
************************************************************************
START-OF-SELECTION.
DATA: lv_root_dir TYPE salfile-longname.
lv_root_dir = p_path.
DATA(lv_dir1) = 'C:\Users\VS0005\Desktop\GOS Upload'.
CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = lv_root_dir
filter = '*.*'
IMPORTING
file_count = lv_file_count
* DIR_COUNT =
TABLES
file_table = lt_file_table
dir_table = lt_dir
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
IF lt_dir IS NOT INITIAL. "Root 1
*Reading of files for each object folder
LOOP AT lt_dir INTO DATA(ls_dir).
*lv_dir = 'C:\Users\VS0005\Desktop\GOD Testing\1000\660\0048115569'.
*lv_dir = 'C:\Users\VS0005\Desktop\GOD Testing\1000\660\0048115569'.
*CONCATENATE lv_path '\' lv_file INTO lv_dir..
DATA: lv_fold TYPE salfile-longname.
CONCATENATE p_path '\' ls_dir-pathname into lv_fold.
CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = lv_fold "ls_dir-pathname
filter = '*.*'
IMPORTING
file_count = lv_file_count
* DIR_COUNT =
TABLES
file_table = lt_file_table
dir_table = lt_dir
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* Logic to add to multiple attachments
IF lt_file_table IS NOT INITIAL.
CLEAR: i_objectno,i_otype.
SPLIT ls_dir-pathname AT '_' INTO i_objectno i_otype.
LOOP AT lt_file_table ASSIGNING FIELD-SYMBOL(<lfs_file>).
CLEAR: lv_path, lv_filename, lv_fname, lv_ext, lv_len, lt_content, ls_fol_id,
ls_obj_data, ls_obj_id, ls_note, lo_objhead, lv_object_type,lv_put_to_kpro,
lv_filetype, lt_objhead .
CONCATENATE lv_fold '\' <lfs_file>-filename into lv_path.
BREAK-POINT.

TRY .
* method to split directory and filename
cl_bcs_utilities=>split_path( EXPORTING iv_path = lv_path IMPORTING ev_path = lv_path1 ev_name = lv_filename ).
* method to split filename to name & extension
cl_bcs_utilities=>split_name( EXPORTING iv_name = lv_filename IMPORTING ev_name = lv_fname ev_extension = lv_ext ).
CATCH cx_bcs.
CLEAR: lv_path,lv_path1,lv_filename, lv_fname, lv_ext.
ENDTRY.
IF lv_path IS NOT INITIAL.
CALL FUNCTION 'SO_OBJECT_UPLOAD'
EXPORTING
filetype = lv_filetype
path_and_file = lv_path
no_dialog = 'X'
IMPORTING
filelength = lv_len
act_filetype = lv_filetype
act_objtype = lv_object_type
file_put_to_kpro = lv_put_to_kpro
TABLES
objcont = lt_content
EXCEPTIONS
file_read_error = 1
invalid_type = 2
x_error = 3
object_type_not_allowed = 4
kpro_insert_error = 5
file_to_large = 6
OTHERS = 7.
##NEEDED
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
lo_objhead = cl_bcs_objhead=>create( lt_objhead[] ).
lo_objhead->set_filename( lv_filename ).
lo_objhead->set_format( lv_filetype ).
lo_objhead->set_vsi_profile( cl_bcs_vsi_profile=>get_profile( ) ).
lt_objhead[] = lo_objhead->mt_objhead.

* get the folder id where to add attachment for the BO
##FM_SUBRC_OK
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = 'B'
IMPORTING
folder_id = ls_fol_id
EXCEPTIONS
OTHERS = 1.
##NEEDED
IF sy-subrc <> 0.

ENDIF.
ls_obj_data-objdes = lv_fname.
ls_obj_data-file_ext = lv_object_type.
ls_obj_data-objlen = lv_len.
IF NOT lv_put_to_kpro IS INITIAL.
ls_obj_data-extct = 'K'.
ENDIF.

* add the attachment data to the folder
##FM_SUBRC_OK
CALL FUNCTION 'SO_OBJECT_INSERT'
EXPORTING
folder_id = ls_fol_id
object_type = 'EXT'
object_hd_change = ls_obj_data
IMPORTING
object_id = ls_obj_id
TABLES
objhead = lt_objhead
objcont = lt_content
EXCEPTIONS
active_user_not_exist = 35
folder_not_exist = 6
object_type_not_exist = 17
owner_not_exist = 22
parameter_error = 23
OTHERS = 1000.
##NEEDED
IF sy-subrc <> 0.

ENDIF.
ls_object-objkey = i_objectno. "'1000238392'.
"gs_lporb-instid.
ls_object-objtype = i_otype. "'BUS2091'.
"gs_lporb-typeid.
ls_note-objtype = 'MESSAGE'.

CONCATENATE ls_fol_id-objtp ls_fol_id-objyr ls_fol_id-objno ls_obj_id-objtp ls_obj_id-objyr ls_obj_id-objno INTO ls_note-objkey.

* link the folder data and BO for attachment in gos
##FM_SUBRC_OK
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = ls_object
obj_roleb = ls_note
relationtype = 'ATTA'
EXCEPTIONS
OTHERS = 1.
##NEEDED
IF sy-subrc <> 0.

ENDIF.


ENDIF.
CLEAR <lfs_file>.
CLEAR: ls_goslog.
ls_goslog-busobj = i_otype.
ls_goslog-cat = 'U'.
ls_goslog-ddate = sy-datum.
ls_goslog-dtime = sy-uzeit.
ls_goslog-filename = lv_fname.
ls_goslog-filetype = lv_object_type.
ls_goslog-objectid = i_objectno.
ls_goslog-userid = sy-uname.
APPEND ls_goslog TO lt_goslog.
TRY.
MODIFY zgos_log FROM TABLE lt_goslog.
CATCH cx_sy_open_sql_db INTO DATA(cx_sy_ref_is_initial).
ENDTRY.
* INSERT zgos_log FROM TABLE lt_goslog.
COMMIT WORK.
CLEAR: ls_goslog.
ENDLOOP.
ENDIF.
clear:ls_dir.
ENDLOOP.
ENDIF.
*&---------------------------------------------------------------------*
*& Form f4_p_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- P_FILE
*&---------------------------------------------------------------------*
FORM f4_p_file CHANGING p_upfile TYPE string..
*----------------------------------------------------------------------*
* Description:
* -----------
* -
*----------------------------------------------------------------------*

************************************************************************
* Declaration *
************************************************************************

*--- Local internal tables --------------------------------------------*
DATA: lt_dynp_values TYPE TABLE OF dynpread,
lt_fields TYPE dynpread_tabtype,
lt_files TYPE filetable.

*--- Local stuctures --------------------------------------------------*
DATA: ls_field LIKE LINE OF lt_fields.

*--- Local variables --------------------------------------------------*
DATA: lv_repid TYPE syrepid.


************************************************************************
* Programming *
************************************************************************
lv_repid = sy-repid.

CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = lv_repid
dynumb = '1000'
request = 'A'
TABLES
dynpfields = lt_fields
EXCEPTIONS
invalid_abapworkarea = 01
invalid_dynprofield = 02
invalid_dynproname = 03
invalid_dynpronummer = 04
invalid_request = 05
no_fielddescription = 06
undefind_error = 07.

IF sy-subrc = 0.
READ TABLE lt_fields
INTO ls_field
WITH KEY fieldname = 'P_FILE'.
IF sy-subrc = 0.
p_upfile = ls_field-fieldvalue.

cl_gui_frontend_services=>file_open_dialog(
EXPORTING
default_filename = p_upfile
file_filter = zcl_excel_common=>c_xlsx_file_filter
CHANGING
file_table = lt_files
rc = sy-tabix
EXCEPTIONS
OTHERS = 1 ).

IF sy-subrc = 0.
READ TABLE lt_files
INDEX 1
INTO p_upfile.
IF sy-subrc <> 0.
CLEAR : p_upfile.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

ENDFORM.

In the above program we tried uploading all the document under a folder and folder name is the combinqtion of Document number and the Object Type e.g 100025445565852022-BKPF

This way it is easier to upload lot of files pertaining to a document.

 

Thanks and Regards,

Vivek
1 Comment
Labels in this area