GOS를 활용하여 이미지 업로드/다운로드/삭제
SWO1 트랜젝션으로 만든 Object에 대해 별도의 GOS창 없이 이미지를 업로드/다운로드/삭제 한다.
Object type : ZOFCIMG
Method : ZOCIMG.GOSAddObjects 를 추가하였다.

***** Implementation of object type ZOFCIMG *****
INCLUDE <OBJECT>.
BEGIN_DATA OBJECT. " Do not change.. DATA is generated
DATA:
BEGIN OF KEY,
ZSUPPLIES_NO LIKE ZARMIQTA0013-ZSUPPLIES_NO,
END OF KEY.
END_DATA OBJECT. " Do not change.. DATA is generated
BEGIN_METHOD GOSADDOBJECTS CHANGING CONTAINER.
DATA:
SERVICE(255),
BUSIDENTIFS LIKE BORIDENT OCCURS 0.
SWC_GET_ELEMENT CONTAINER 'Service' SERVICE.
SWC_SET_TABLE CONTAINER 'BusIdentifs' BUSIDENTIFS.
END_METHOD.
이미지를 업로드/다운로드/삭제할 별도의 프로그램을 만든다.
아래 자료를 참조하였다.
Philip Johnston
https://blogs.sap.com/2013/05/23/the-gos-generic-object-services-class-that-does-all-the-work/
필수값 : SRGBTBREL-INSTID
SRGBTBREL-TYPEID 값
업로드 : 파일 경로

1) 업로드
구이 실행과는 별개로 데이터단이 입력되고 불러들이는 작업은 클래스로 정의하였다.
METHOD gos_attach_file.
DATA: ls_object TYPE borident,
ls_obj_data TYPE sood1,
ls_obj_id TYPE soodk,
ls_fol_id TYPE soodk,
ld_filename TYPE string,
lt_url_tab TYPE TABLE OF so_url,
ld_url_tab_size TYPE sytabix,
ls_folmem_k TYPE sofmk,
lv_ep_note TYPE borident-objkey,
ls_note TYPE borident.
DATA: it_objhead TYPE STANDARD TABLE OF soli.
ls_object-objtype = objtype.
ls_object-objkey = objkey.
IF NOT ls_object-objtype IS INITIAL AND NOT ls_object-objkey IS INITIAL.
CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
EXPORTING
it_contents_bin = it_content[]
IMPORTING
et_contents_bin = it_content[].
IF sy-subrc EQ 0.
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = folder_region
IMPORTING
folder_id = ls_fol_id
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
IF NOT file_name_with_path IS INITIAL.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = file_name_with_path
IMPORTING
stripped_name = ld_filename.
ELSE.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = file_name_no_path
IMPORTING
stripped_name = ld_filename.
ENDIF.
IF sy-subrc EQ 0.
SPLIT ld_filename AT '.' INTO TABLE lt_url_tab.
DESCRIBE TABLE lt_url_tab LINES ld_url_tab_size.
IF ld_url_tab_size GT 1.
READ TABLE lt_url_tab INDEX ld_url_tab_size INTO ls_obj_data-file_ext.
READ TABLE lt_url_tab INDEX 1 INTO ls_obj_data-objdes.
ELSE.
CLEAR ls_obj_data-file_ext.
ls_obj_data-objdes = ld_filename.
ENDIF.
ls_obj_data-objsns = 'O'.
ls_obj_data-objla = sy-langu.
ls_obj_data-objlen = lines( it_content ) * 255.
DATA: wa_content TYPE soli.
CLEAR wa_content.
CONCATENATE '&SO_FILENAME=' ld_filename INTO wa_content.
APPEND wa_content TO it_objhead.
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 = it_objhead
objcont = it_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.
IF sy-subrc = 0 AND ls_object-objkey IS NOT INITIAL.
COMMIT WORK AND WAIT.
ls_folmem_k-foltp = ls_fol_id-objtp.
ls_folmem_k-folyr = ls_fol_id-objyr.
ls_folmem_k-folno = ls_fol_id-objno.
ls_folmem_k-doctp = ls_obj_id-objtp.
ls_folmem_k-docyr = ls_obj_id-objyr.
ls_folmem_k-docno = ls_obj_id-objno.
lv_ep_note = ls_folmem_k.
ls_note-objtype = 'MESSAGE'.
ls_note-objkey = lv_ep_note.
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = ls_object
obj_roleb = ls_note
relationtype = 'ATTA'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
es_return-text = 'SUCCESS'.
COMMIT WORK AND WAIT.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ENDMETHOD.
FORM upload .
DATA: g_filename TYPE string,
g_attsize TYPE wsrm_error-wsrm_direction,
it_content TYPE soli_tab.
DATA: ta_srgbtbrel TYPE STANDARD TABLE OF srgbtbrel, wa_srgbtbrel TYPE srgbtbrel,
lta_sood TYPE STANDARD TABLE OF sood, lwa_sood TYPE sood.
DATA: t_st_return TYPE lcl=>ty_yreturn.
DATA dec_kb TYPE p.
* ATTACH
MOVE p_file TO g_filename.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = g_filename
filetype = 'BIN'
IMPORTING
filelength = g_attsize
TABLES
data_tab = it_content
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc EQ 0.
DATA: l_file_name_with_path TYPE avwctxcont.
MOVE g_filename TO l_file_name_with_path.
CALL METHOD lcl=>gos_attach_file
EXPORTING
objtype = p_type
objkey = p_key
folder_region = 'B'
file_name_with_path = l_file_name_with_path
IMPORTING
es_return = t_st_return
CHANGING
it_content = it_content.
IF t_st_return-type = 'S'.
MESSAGE t_st_return-text TYPE 'I'.
ELSE.
MESSAGE t_st_return-text TYPE 'W'.
ENDIF.
ENDIF.
"LIST
CALL METHOD lcl=>gos_get_file_list
EXPORTING
objtype = p_type
objkey = p_key
IMPORTING
t_attachments = lta_sood
CHANGING
es_return = t_st_return.
IF t_st_return-type = 'S'.
WRITE: /.
LOOP AT lta_sood INTO lwa_sood.
dec_kb = lwa_sood-objlen / 1024.
IF dec_kb < 1.
dec_kb = 1.
ENDIF.
WRITE: / lwa_sood-objdes, dec_kb, 'KB'.
ENDLOOP.
ELSE.
MESSAGE t_st_return-text TYPE 'S' DISPLAY LIKE 'W'.
ENDIF.
ENDFORM.
2) 다운로드
CLASS lcl IMPLEMENTATION.
METHOD gos_get_file_list.
TYPES: BEGIN OF ts_key,
foltp TYPE so_fol_tp,
folyr TYPE so_fol_yr,
folno TYPE so_fol_no,
objtp TYPE so_obj_tp,
objyr TYPE so_obj_yr,
objno TYPE so_obj_no,
forwarder TYPE so_usr_nam,
END OF ts_key,
BEGIN OF ts_attachment,
foltp TYPE so_fol_tp,
folyr TYPE so_fol_yr,
folno TYPE so_fol_no,
objtp TYPE so_obj_tp,
objyr TYPE so_obj_yr,
objno TYPE so_obj_no,
brelguid TYPE oblguid32,
roletype TYPE oblroltype,
END OF ts_attachment,
tt_attachment TYPE TABLE OF ts_attachment.
DATA: ta_srgbtbrel TYPE STANDARD TABLE OF srgbtbrel,
wa_srgbtbrel TYPE srgbtbrel,
lta_sood TYPE STANDARD TABLE OF sood,
lwa_sood TYPE sood, ltp_pathin(1000) TYPE c,
ltp_filename TYPE string,
ltp_sortfield TYPE char30,
lta_objcont TYPE soli_tab,
lta_attachments TYPE tt_attachment,
lwa_attachments LIKE LINE OF lta_attachments,
lo_boritem TYPE REF TO cl_sobl_bor_item,
lo_al_item TYPE REF TO cl_gos_al_item,
li_link TYPE REF TO if_browser_link,
ls_option TYPE obl_s_relt,
lt_options TYPE obl_t_relt,
ls_key TYPE ts_key,
ls_attachment TYPE ts_attachment,
lt_attachment TYPE tt_attachment,
lt_links TYPE obl_t_link,
ls_link TYPE obl_s_link,
lp_linkid TYPE blnk_inst,
gs_lpor TYPE sibflporb.
IF NOT objtype IS INITIAL AND NOT objkey IS INITIAL.
SELECT * FROM srgbtbrel INTO TABLE ta_srgbtbrel
WHERE instid_a EQ objkey
AND typeid_a EQ objtype
AND catid_a EQ 'BO'.
IF sy-subrc EQ 0.
SORT ta_srgbtbrel BY instid_a typeid_a catid_a.
DELETE ADJACENT DUPLICATES FROM ta_srgbtbrel COMPARING instid_a typeid_a catid_a.
LOOP AT ta_srgbtbrel INTO wa_srgbtbrel.
CLEAR: lt_attachment[], lta_attachments[].
gs_lpor-instid = wa_srgbtbrel-instid_a.
gs_lpor-typeid = wa_srgbtbrel-typeid_a.
gs_lpor-catid = wa_srgbtbrel-catid_a.
ls_option-sign = 'I'.
ls_option-option = 'EQ'.
ls_option-low = 'ATTA'.
APPEND ls_option TO lt_options.
ls_option-low = 'NOTE'.
APPEND ls_option TO lt_options.
ls_option-low = 'URL'.
APPEND ls_option TO lt_options.
TRY.
CALL METHOD cl_binary_relation=>read_links_of_binrels
EXPORTING
is_object = gs_lpor
it_relation_options = lt_options
ip_role = 'GOSAPPLOBJ'
IMPORTING
et_links = lt_links.
LOOP AT lt_links INTO ls_link.
CASE ls_link-typeid_b .
WHEN 'MESSAGE'.
ls_key = ls_link-instid_b.
MOVE-CORRESPONDING ls_key TO ls_attachment.
ls_attachment-roletype = ls_link-roletype_b.
IF ls_link-brelguid IS INITIAL.
ls_attachment-brelguid = ls_link-relguidold.
ELSE.
ls_attachment-brelguid = ls_link-brelguid.
ENDIF.
APPEND ls_attachment TO lt_attachment.
WHEN OTHERS.
CONTINUE.
ENDCASE.
ENDLOOP.
CATCH cx_obl_parameter_error .
CATCH cx_obl_internal_error .
CATCH cx_obl_model_error .
CATCH cx_root.
ENDTRY.
ENDLOOP.
lta_attachments[] = lt_attachment[].
CHECK lines( lta_attachments ) > 0.
SELECT * FROM sood INTO TABLE lta_sood
FOR ALL ENTRIES IN lta_attachments
WHERE
objtp = lta_attachments-objtp AND
objyr = lta_attachments-objyr AND
objno = lta_attachments-objno.
IF sy-subrc EQ 0.
t_attachments[] = lta_sood.
es_return-type = 'S'.
es_return-text = 'SUCCESS'.
ENDIF.
DATA rcode TYPE i.
DATA objhead_tab TYPE TABLE OF soli.
DATA objcont_tab TYPE TABLE OF soli.
DATA objpara_tab TYPE TABLE OF selc.
DATA objparb_tab TYPE TABLE OF soop1.
DATA sood_key TYPE soodk.
DATA hex_mode TYPE sonv-flag.
FIELD-SYMBOLS <fs> TYPE LINE OF ty_ysood_tab.
LOOP AT t_attachments ASSIGNING <fs>.
IF NOT ( <fs>-objtp IS INITIAL OR <fs>-objyr IS INITIAL OR <fs>-objno IS INITIAL ).
CONCATENATE <fs>-objtp <fs>-objyr <fs>-objno INTO sood_key.
PERFORM socx_select IN PROGRAM sapfsso0
TABLES objhead_tab objcont_tab
objpara_tab objparb_tab
USING sood_key
hex_mode
rcode.
IF rcode EQ 0.
DATA moff TYPE i.
DATA l_param_search TYPE soli-line.
DATA l_param_head TYPE soli-line.
DATA value TYPE soli-line.
DATA wa_objhead_tab LIKE LINE OF objhead_tab.
DATA lt_url_tab TYPE TABLE OF so_url.
DATA ld_url_tab_size TYPE sytabix.
l_param_search = '&SO_FILENAME'.
TRANSLATE l_param_search TO UPPER CASE.
LOOP AT objhead_tab INTO wa_objhead_tab.
CLEAR moff.
FIND '=' IN wa_objhead_tab-line MATCH OFFSET moff.
CHECK sy-subrc = 0.
l_param_head = wa_objhead_tab-line(moff).
TRANSLATE l_param_head TO UPPER CASE.
IF l_param_head = l_param_search.
ADD 1 TO moff.
value = wa_objhead_tab-line+moff.
IF NOT ( value IS INITIAL ).
SPLIT value AT '.' INTO TABLE lt_url_tab.
DESCRIBE TABLE lt_url_tab LINES ld_url_tab_size.
IF ld_url_tab_size GT 1.
READ TABLE lt_url_tab INDEX ld_url_tab_size INTO <fs>-acnam.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ENDMETHOD.
METHOD gos_attach_file.
DATA: ls_object TYPE borident,
ls_obj_data TYPE sood1,
ls_obj_id TYPE soodk,
ls_fol_id TYPE soodk,
ld_filename TYPE string,
lt_url_tab TYPE TABLE OF so_url,
ld_url_tab_size TYPE sytabix,
ls_folmem_k TYPE sofmk,
lv_ep_note TYPE borident-objkey,
ls_note TYPE borident.
DATA: it_objhead TYPE STANDARD TABLE OF soli.
ls_object-objtype = objtype.
ls_object-objkey = objkey.
IF NOT ls_object-objtype IS INITIAL AND NOT ls_object-objkey IS INITIAL.
CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
EXPORTING
it_contents_bin = it_content[]
IMPORTING
et_contents_bin = it_content[].
IF sy-subrc EQ 0.
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = folder_region
IMPORTING
folder_id = ls_fol_id
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
IF NOT file_name_with_path IS INITIAL.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = file_name_with_path
IMPORTING
stripped_name = ld_filename.
ELSE.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = file_name_no_path
IMPORTING
stripped_name = ld_filename.
ENDIF.
IF sy-subrc EQ 0.
SPLIT ld_filename AT '.' INTO TABLE lt_url_tab.
DESCRIBE TABLE lt_url_tab LINES ld_url_tab_size.
IF ld_url_tab_size GT 1.
READ TABLE lt_url_tab INDEX ld_url_tab_size INTO ls_obj_data-file_ext.
READ TABLE lt_url_tab INDEX 1 INTO ls_obj_data-objdes.
ELSE.
CLEAR ls_obj_data-file_ext.
ls_obj_data-objdes = ld_filename.
ENDIF.
ls_obj_data-objsns = 'O'.
ls_obj_data-objla = sy-langu.
ls_obj_data-objlen = lines( it_content ) * 255.
DATA: wa_content TYPE soli.
CLEAR wa_content.
CONCATENATE '&SO_FILENAME=' ld_filename INTO wa_content.
APPEND wa_content TO it_objhead.
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 = it_objhead
objcont = it_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.
IF sy-subrc = 0 AND ls_object-objkey IS NOT INITIAL.
COMMIT WORK AND WAIT.
ls_folmem_k-foltp = ls_fol_id-objtp.
ls_folmem_k-folyr = ls_fol_id-objyr.
ls_folmem_k-folno = ls_fol_id-objno.
ls_folmem_k-doctp = ls_obj_id-objtp.
ls_folmem_k-docyr = ls_obj_id-objyr.
ls_folmem_k-docno = ls_obj_id-objno.
lv_ep_note = ls_folmem_k.
ls_note-objtype = 'MESSAGE'.
ls_note-objkey = lv_ep_note.
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = ls_object
obj_roleb = ls_note
relationtype = 'ATTA'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
es_return-text = 'SUCCESS'.
COMMIT WORK AND WAIT.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ELSE.
es_return-type = 'E'.
ENDIF.
ENDMETHOD.
METHOD gos_download_file.
DATA: ex TYPE REF TO cx_root, text TYPE string.
DATA: ltp_sortfield TYPE char30,
lta_objcont TYPE soli_tab,
ltp_pathfile(1000) TYPE c,
ltp_filename TYPE string,
ltp_binfilesize TYPE so_doc_len.
TRY .
CONCATENATE attachment-objtp attachment-objyr attachment-objno INTO ltp_sortfield.
IMPORT objcont_tab TO lta_objcont FROM DATABASE soc3(dt) ID ltp_sortfield.
IF sy-subrc = 0.
CONCATENATE file_path '\' attachment-objdes '.' attachment-file_ext INTO ltp_pathfile.
REPLACE '\\' WITH '\' INTO ltp_pathfile+2.
TRANSLATE ltp_pathfile USING '/ '.
ltp_binfilesize = attachment-objlen.
CALL FUNCTION 'SO_OBJECT_DOWNLOAD'
EXPORTING
bin_filesize = ltp_binfilesize
filetype = 'BIN'
path_and_file = ltp_pathfile
extct = attachment-extct
no_dialog = 'X'
IMPORTING
act_filename = ltp_filename
TABLES
objcont = lta_objcont
EXCEPTIONS
file_write_error = 1
invalid_type = 2
x_error = 3
kpro_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
es_return-type = 'E'.
es_return-text = 'Error Calling: SO_OBJECT_DOWNLOAD'.
ELSE.
es_return-type = 'S'.
es_return-text = 'SUCCESS'.
ENDIF.
ELSE.
es_return-type = 'E'.
es_return-text = 'Error With Object Import From DB'.
ENDIF.
CATCH cx_root INTO ex.
es_return-text = ex->get_text( ).
ENDTRY.
ENDMETHOD.
FORM download.
DATA: lta_sood TYPE lcl=>ty_ysood_tab,
lwa_sood TYPE sood.
DATA: t_st_return TYPE lcl=>ty_yreturn.
CALL METHOD lcl=>gos_get_file_list
EXPORTING
objtype = p_type
objkey = p_key
IMPORTING
t_attachments = lta_sood
CHANGING
es_return = t_st_return.
IF t_st_return-type = 'S'.
DATA dec_kb TYPE p.
LOOP AT lta_sood INTO lwa_sood.
CALL METHOD lcl=>gos_download_file
EXPORTING
file_path = 'C:\TEMP'
attachment = lwa_sood
CHANGING
es_return = t_st_return.
IF t_st_return-type = 'S'.
dec_kb = lwa_sood-objlen / 1024.
IF dec_kb < 1.
dec_kb = 1.
ENDIF.
WRITE: / lwa_sood-objdes, dec_kb, 'KB'.
ELSE.
MESSAGE t_st_return-text TYPE 'W'.
ENDIF.
ENDLOOP.
ELSE.
MESSAGE t_st_return-text TYPE 'S' DISPLAY LIKE 'W'.
ENDIF.
ENDFORM.
3) 이미지 삭제
이미지 업로드를 할 경우 한번 사용했던 gos object에 다시 업로드를 할 경우 기존 파일을 덮어쓰지 않고 저장하며,
해당 object로 이미지를 불러올때는 새로운 이미지가 아닌 기존 이미지가 불러온다.
따라서 GOS 테이블인 SRGBTBREL 뿐만 아니라 Object 테이블인 SOOD/SOFM계열에 logical/physical id가 들어가며, 해당 위치정보를 이용해 데이터 삭제까지 필요하다.
METHOD gos_delete_file.
DATA : ls_folder_id TYPE soodk,
ls_object_id TYPE soodk,
i_region TYPE so_fol_rg,
i_object_hd TYPE sood2,
ls_folmem_k TYPE sofmk,
lv_ep_note TYPE borident-objkey,
ls_note_srgbtbrel TYPE borident,
ls_object_srgbtbrel TYPE borident.
DATA : lt_soli TYPE STANDARD TABLE OF soli,
ls_soli LIKE LINE OF lt_soli,
lv_off TYPE i,
lv_phid TYPE sdok_phid,
lv_loid type sdok_loid.
CLEAR ls_folder_id.
CLEAR ls_object_id.
CLEAR ls_folmem_k.
CLEAR lv_ep_note.
CLEAR ls_note_srgbtbrel.
CLEAR ls_object_srgbtbrel.
IF folder_region IS INITIAL.
i_region = 'Q'.
ELSE.
i_region = folder_region.
ENDIF.
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
owner = i_owner
region = i_region
IMPORTING
folder_id = ls_folder_id
EXCEPTIONS
OTHERS = 1.
IF ls_folder_id IS INITIAL.
RAISE no_folder.
ENDIF.
IF sy-subrc EQ 0.
ls_object_id-objtp = objtp.
ls_object_id-objyr = objyr.
ls_object_id-objno = objno.
ELSE.
RETURN.
ENDIF.
" logical identification object information (loio) 찾기
CLEAR : lt_soli, ls_soli, lv_off, lv_phid, lv_loid.
CALL FUNCTION 'SO_OBJECT_GET_CONTENT'
EXPORTING
object_id = ls_object_id
TABLES
objcont = lt_soli.
IF lt_soli IS NOT INITIAL.
READ TABLE lt_soli INTO ls_soli INDEX 1. "&SO_KProObjectID=SOFFLOIO 1866DAADE5081EDDA7BFFB7935F78AF1
CONDENSE ls_soli-line NO-GAPS. "&SO_KProObjectID=SOFFLOIO1866DAADE5081EDDA7BFFB7935F78AF1
FIND 'SOFFLOIO' IN ls_soli-line MATCH OFFSET lv_off.
lv_off = lv_off + 8.
ls_soli-line = ls_soli-line+lv_off. "1866DAADE5081EDDA7BFFB7935F78AF1
SELECT SINGLE phio_id FROM soffphio
INTO lv_phid
WHERE loio_id = ls_soli-line.
lv_loid = ls_soli-line.
IF sy-subrc = 0.
DATA : BEGIN OF ls_object_loio_phio,
class TYPE sdok_class,
objid TYPE sdok_docid,
END OF ls_object_loio_phio.
CLEAR ls_object_loio_phio.
ls_object_loio_phio-class = 'SOFFLOIO'.
ls_object_loio_phio-objid = lv_loid.
CALL FUNCTION 'SDOK_LOIO_DELETE'
EXPORTING
object_id = ls_object_loio_phio
EXCEPTIONS
not_existing = 1
not_allowed = 2
not_authorized = 3
exception_in_exit = 4
OTHERS = 5.
IF sy-subrc <> 0.
* MESSAGE 'sdok_loio_delete subrc check ' TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
CLEAR ls_object_loio_phio.
ls_object_loio_phio-class = 'SOFFPHIO'.
ls_object_loio_phio-objid = lv_phid.
CALL FUNCTION 'SDOK_PHIO_DELETE'
EXPORTING
object_id = ls_object_loio_phio
EXCEPTIONS
not_existing = 1
not_allowed = 2
not_authorized = 3
exception_in_exit = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE 'sdok_phio_delete subrc check ' TYPE 'I' DISPLAY LIKE 'E'.
RAISE phio_delete_error.
ENDIF.
ELSE.
RAISE no_object_id_found.
ENDIF.
IF sy-subrc = 0.
ls_folmem_k-foltp = ls_folder_id-objtp.
ls_folmem_k-folyr = ls_folder_id-objyr.
ls_folmem_k-folno = ls_folder_id-objno.
ls_folmem_k-doctp = ls_object_id-objtp.
ls_folmem_k-docyr = ls_object_id-objyr.
ls_folmem_k-docno = ls_object_id-objno.
lv_ep_note = ls_folmem_k.
ls_note_srgbtbrel-objtype = 'MESSAGE'.
ls_note_srgbtbrel-objkey = lv_ep_note.
ls_object_srgbtbrel-objtype = objtype_srgbtbrel.
ls_object_srgbtbrel-objkey = objkey_srgbtbrel.
CALL FUNCTION 'BINARY_RELATION_DELETE' "GOS object attachment link 추가
EXPORTING
obj_rolea = ls_object_srgbtbrel
obj_roleb = ls_note_srgbtbrel
relationtype = 'ATTA' "BRELTYP-RELTYPE
* FIRE_EVENTS = 'X'
EXCEPTIONS
entry_not_existing = 1
internal_error = 2
no_relation = 3
no_role = 4
OTHERS = 5.
"folder content 삭제
DELETE FROM sofm
WHERE foltp = ls_folder_id-objtp
AND folyr = ls_folder_id-objyr
AND folno = ls_folder_id-objno
AND doctp = ls_object_id-objtp
AND docyr = ls_object_id-objyr
AND docno = ls_object_id-objno.
IF sy-subrc <> 0.
RAISE no_content_sofm.
ELSE.
COMMIT WORK AND WAIT.
ENDIF.
"content information 삭제
DELETE FROM sood
WHERE objtp = ls_object_id-objtp
AND objyr = ls_object_id-objyr
AND objno = ls_object_id-objno.
IF sy-subrc <> 0.
RAISE no_content_sood.
ELSE.
COMMIT WORK AND WAIT.
ENDIF.
"SRGBTBREL (GOS Table) 삭제
DELETE FROM srgbtbrel
WHERE instid_a = objkey_srgbtbrel
AND typeid_a = objtype_srgbtbrel
AND catid_a = 'BO'.
ENDIF.
ENDIF.
ENDMETHOD.
FORM delete .
DATA: ta_srgbtbrel TYPE STANDARD TABLE OF srgbtbrel, wa_srgbtbrel TYPE srgbtbrel,
lta_sood TYPE STANDARD TABLE OF sood, lwa_sood TYPE sood.
DATA: t_st_return TYPE lcl=>ty_yreturn.
DATA: ls_sood LIKE LINE OF lta_sood.
DATA : ls_message TYPE bapiret2.
CALL METHOD lcl=>gos_get_file_list
EXPORTING
objtype = p_type
objkey = p_key
IMPORTING
t_attachments = lta_sood
CHANGING
es_return = t_st_return.
IF lta_sood IS INITIAL.
WRITE : / '삭제할 데이터 없음'.
RETURN.
ENDIF.
LOOP AT lta_sood INTO ls_sood.
CALL METHOD lcl=>gos_delete_file
EXPORTING
folder_region = 'B'
objtp = ls_sood-objtp
objyr = ls_sood-objyr
objno = ls_sood-objno
i_owner = ls_sood-ownnam
objtype_srgbtbrel = p_type
objkey_srgbtbrel = p_key
EXCEPTIONS
no_folder = 1
no_content_sofm = 2
no_content_sood = 3
fnc_binary_error = 4
no_object_id_found = 5
phio_delete_error = 6.
IF sy-subrc = 0.
WRITE : / p_key && '//' && p_type && '//' && ls_sood-objdes && '.' && ls_sood-file_ext && ' 삭제완료 '.
ELSE.
WRITE : /, '에러발생'.
EXIT.
ENDIF.
ENDLOOP.
ENDFORM.
이를 활용하면
ALV의 각 행마다 이미지를 첨부/삭제/확인이 가능한 프로그램을 만들 수 있다.