ABAP | GOS | 이미지 업다운 및 삭제

a·2023년 5월 12일

ABAP

목록 보기
3/3

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의 각 행마다 이미지를 첨부/삭제/확인이 가능한 프로그램을 만들 수 있다.

0개의 댓글