Teknologi

LightBlog

Breaking

LightBlog

Monday, 7 August 2017

How to Download Archived and Non-Archived GOS attachments into your PC (attachments from Generic Object Services (GOS) Documentum)

***Attaching files to documentum using GOS services can have two ways either manual or automatic (early or late archival). Recently I came across some requirement where my customer wanted to download the attachments of an invoice for auditing purpose. This is something very rare and you would not find a straight away solution for it.
***In my requirement the invoice document could have both archived and non-archived files which was needed to be downloaded. Here is how I achieved it.
***
***Non-Archived /Manually attached Files

* Local Data Declartions
  DATA l_i_rel     TYPE obl_t_relt.
  DATA l_wa_rel    TYPE obl_s_relt.
  DATA l_wa_object TYPE sibflporb.
  DATA l_v_sys     TYPE logsys.
  DATA l_i_links   TYPE obl_t_link.
  DATA l_v_documnt TYPE so_entryid.
  DATA l_wa_document_data TYPE  sofolenti1.
  DATA l_i_header  TYPE STANDARD TABLE OF solisti1.
  DATA l_wa_text   TYPE text200.
  DATA l_v_filenam TYPE cacl_string.
  DATA l_v_filetyp TYPE sychar10.
  DATA l_v_var     TYPE cacl_string.
  DATA l_v_sortfi  TYPE sychar30.
  DATA l_wa_documntid TYPE sofmk.
  DATA l_i_content TYPE swftlisti1.
  DATA l_v_extct   TYPE so_extct.
  DATA l_v_doc_siz TYPE so_doc_len.
  DATA l_v_flename TYPE cacl_string.

  DATAl_i_tbl1024 TYPE STANDARD TABLE OF tbl1024,
      l_i_toa02 TYPE STANDARD TABLE OF toa02,
      l_v_length TYPE syindex,
      l_v_mime TYPE sychar132,
      l_cnt TYPE belnr_d,
      l_v_archived_filename TYPE sychar132.

  FIELD-SYMBOLS<l_fs_tab> TYPE toa02 ."toav0.
  FIELD-SYMBOLS <l_fs_links>   TYPE obl_s_link.
  FIELD-SYMBOLS <l_fs_header>  TYPE solisti1.
  FIELD-SYMBOLS <l_fs_content> TYPE solisti1.

  CONSTANTS l_c_i    TYPE ddsign     VALUE 'I'.
  CONSTANTS l_c_eq   TYPE ddoption   VALUE 'EQ'.
  CONSTANTS l_c_atta TYPE oblreltype VALUE 'ATTA'.
  CONSTANTS l_c_note TYPE oblreltype VALUE 'NOTE'.
  CONSTANTS l_c_dot  TYPE sychar01   VALUE '.'.
  CONSTANTS l_c_slas TYPE sychar01   VALUE '\'.
  CONSTANTS l_c_equ  TYPE sychar01   VALUE '='.
  CONSTANTS l_c_k    TYPE so_extct   VALUE 'K'.
  CONSTANTS l_c_und  TYPE sychar01   VALUE '_'.

  l_wa_rel-sign   l_c_i.
  l_wa_rel-option l_c_eq.
  l_wa_rel-low    l_c_atta.
  APPEND l_wa_rel TO l_i_rel.
  CLEAR l_wa_rel-low.
  l_wa_rel-low    l_c_note.
  APPEND l_wa_rel TO l_i_rel.
  CLEAR l_wa_rel.

  l_wa_object-instid 510000062009(Your Object key e.gDoc No+DocYear).
  l_wa_object-typeid 'BUS2081' (For Invoice Document)
  l_wa_object-catid  'BO' (Keep it as it is)

* Download NON-ARCHIVED Files.
  TRY.
      CALL METHOD cl_binary_relation=>read_links
        EXPORTING
          is_object           l_wa_object
          ip_logsys           l_v_sys
          it_relation_options l_i_rel
        IMPORTING
          et_links            l_i_links.
    CATCH cx_obl_parameter_error
          cx_obl_internal_error
          cx_obl_model_error.
      RAISE no_link_found.
  ENDTRY.


  TRY.
      LOOP AT l_i_links ASSIGNING <l_fs_links>.
        MOVE <l_fs_links>-instid_b  TO l_v_documnt.
        IF l_v_documnt IS NOT INITIAL.
          CALL FUNCTION 'SO_DOCUMENT_READ_API1'
            EXPORTING
              document_id                l_v_documnt
            IMPORTING
              document_data              l_wa_document_data
            TABLES
              object_header              l_i_header
            EXCEPTIONS
              document_id_not_exist      1
              operation_no_authorization 2
              x_error                    3
              OTHERS                     4.
          IF sy-subrc <> 0.
            RAISE no_link_found.
          ELSE.
          
              CONCATENATE l_wa_document_data-obj_descr l_c_dot
                          l_wa_document_data-obj_type
              INTO l_v_filenam.
           
          ENDIF.

          MOVE l_wa_document_data-obj_type TO l_v_filetyp.

          READ TABLE l_i_header ASSIGNING <l_fs_header> INDEX 2.
          IF sy-subrc IS INITIAL.
            SPLIT <l_fs_header>-line AT l_c_equ INTO l_v_var l_v_filetyp.
          ENDIF.
          CONDENSE l_v_filetyp.

          l_wa_documntid <l_fs_links>-instid_b.
          CONCATENATE l_wa_documntid-doctp
                      l_wa_documntid-docyr
                      l_wa_documntid-docno INTO l_v_sortfi.

          IMPORT objcont_tab TO l_i_content
          FROM DATABASE soc3(dtID l_v_sortfi.
          IF sy-subrc IS INITIAL.
            READ TABLE l_i_content ASSIGNING <l_fs_content> INDEX 1.
            IF sy-subrc IS INITIAL.
              IF <l_fs_content>-line CP 'KPro'
                l_v_extct l_c_k.
              ELSE.
                CLEAR l_v_extct.
              ENDIF.
            ENDIF.
          ENDIF.

          MOVE l_wa_document_data-doc_size TO l_v_doc_siz.
          CALL FUNCTION 'SO_OBJECT_DOWNLOAD'
            EXPORTING
              bin_filesize     l_v_doc_siz
              filetype         l_v_filetyp
              path_and_file    l_v_filenam
              extct            l_v_extct
              no_dialog        abap_true
            IMPORTING
              act_filename     l_v_flename
            TABLES
              objcont          l_i_content
            EXCEPTIONS
              file_write_error 1
              invalid_type     2
              x_error          3
              kpro_error       4
              OTHERS           5.
          IF sy-subrc <> 0.
            RAISE no_link_found.
          ENDIF.
        ENDIF.
        CLEARl_i_contentl_v_extct.
      ENDLOOP.

    CATCH cx_sy_conversion_no_number
          cx_sy_conversion_overflow
          cx_sy_move_cast_error
          cx_sy_conversion_codepage
          cx_sy_import_format_error
          cx_sy_import_mismatch_error.
      RAISE no_link_found.
  ENDTRY.



* Download Archived Files
*We need the SAP to Documentum link, this is available in TOA*  tables, and it depends in which table you find the relation. For me its TOA02, it may not be same for you.
*In case you dont find use Function module ARCHIV_CONNECTINFO_GET_META and use the parameters sap_object and object_id as in below select.
*
*I am using table TOA02 to get all Archive ids.


SELECT *  FROM toa02 INTO TABLE l_i_toa02 WHERE
            sap_object 'BUS2081' AND
            object_id 5100000062009(for me its Invoice document)
  IF sy-subrc NE 0.
    RETURN.
  ELSE.

    LOOP AT l_i_toa02 ASSIGNING <l_fs_tab>.
      l_cnt l_cnt + 1.
      CLEARl_v_archived_filenamel_v_lengthl_i_tbl1024.

      CONCATENATE ' C:\DATA\DOCUMENTUM' '\'  '_Arc_' l_cnt '.' <l_fs_tab>-reserve
      INTO l_v_archived_filename.
      CONDENSE l_v_archived_filename.
      CALL FUNCTION 'SCMS_AO_TABLE_GET'
        EXPORTING
          arc_id       <l_fs_tab>-archiv_id
          doc_id       <l_fs_tab>-arc_doc_id
        IMPORTING
          length       l_v_length
        TABLES
          data         l_i_tbl1024
        EXCEPTIONS
          error_http   1
          error_archiv 2
          error_kernel 3
          error_config 4
          OTHERS       5.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

      CALL FUNCTION 'SCMS_DOWNLOAD'
        EXPORTING
          filename l_v_archived_filename "'C:\DATA\DOCUMENTUM\....
          filesize l_v_length
          mimetype l_v_mime
        TABLES
          data     l_i_tbl1024
        EXCEPTIONS
          error    1
          OTHERS   2.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.
    ENDLOOP.
  ENDIF.



This complete code will create a folder C:\Data\Documentum in your PC and you will find all downloaded attachments thereHappy Downloading

No comments:

Post a Comment

Note: only a member of this blog may post a comment.

Adbox