cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Create GOS attachment from xstring document

Missschaaa
Participant
19,209

Hello everyone,

I'm now facing a problem which is well discussed here and in other forums. In spite of reading lots of tutorials, blogs and other questions here I was not able to solve it. I'm trying to upload a document (pdf, jpg, xlsx, docx) and attach it as GOS document to a business object. I'm doing this in FIORI app context so the uploaded file will imported to me as an xstring. So all I have to do is put this xstring into GOS document. I followed the guidelines here and tried it like this.

* Get folder id
  CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
    EXPORTING
      region                = 'B'
    IMPORTING
      folder_id             = ls_fol_id
    EXCEPTIONS
      communication_failure = 1
      owner_not_exist       = 2
      system_failure        = 3
      x_error               = 4
      OTHERS                = 5.

* To get the extension from the file name
  IF iv_slug IS NOT INITIAL.
    SPLIT iv_slug AT '/' INTO lv_qmnum lv_file.
    CALL FUNCTION 'TRINT_FILE_GET_EXTENSION'
      EXPORTING
        filename  = lv_file
        uppercase = 'X'
      IMPORTING
        extension = lv_extensions.
  ENDIF.


* Transfer Importing Xstring to binary solix table
lt_solix = cl_bcs_convert=>xstring_to_solix( iv_xstring = is_media_resource-value ).

* Fill Doc Data
*  ls_doc_data-doc_size = XSTRLEN( is_media_resource-value ).
  ls_doc_data-obj_descr = 'TEST'.
  ls_doc_data-obj_name = lv_file.
  MOVE lv_extensions TO ld_doc_type.

  ls_object-objkey     =  lv_qmnum.
  ls_object-objtype    = 'BUS2038'.

* Create Document
  CALL FUNCTION 'SO_DOCUMENT_INSERT_API1'
    EXPORTING
      folder_id                  = ls_fol_id
      document_data              = ls_doc_data
      document_type              = ld_doc_type
    IMPORTING
      document_info              = ls_doc_info
    TABLES
      contents_hex               = lt_solix
    EXCEPTIONS
      folder_not_exist           = 1
      document_type_not_exist    = 2
      operation_no_authorization = 3
      parameter_error            = 4
      x_error                    = 5
      enqueue_error              = 6
      OTHERS                     = 7.

* To link the document attachment and business object
  IF sy-subrc = 0 AND ls_object-objkey IS NOT INITIAL.
    ls_object-instid  = lv_qmnum.
    ls_object-typeid  = 'BUS2038'.
    ls_object-catid   = 'BO'.
    ls_objtgt-instid =  ls_doc_info-doc_id.
    ls_objtgt-typeid  = 'MESSAGE'.
    ls_objtgt-catid   = 'BO'.

    TRY.
        cl_binary_relation=>create_link(
          EXPORTING
            is_object_a = ls_object
            is_object_b = ls_objtgt
            ip_reltype  = 'ATTA' ).
        COMMIT WORK AND WAIT.
      CATCH cx_obl_parameter_error cx_obl_model_error cx_obl_internal_error.
    ENDTRY.
  ENDIF.

Can anyone tell me what I did wrong? File gets transfered and uploaded correctly to business object, but when trying to open it, it only works for pdf files. All the other document types get opened with error that data is corrupt or document type gets not supported. Document type can not be the problem because I uploaded the files manually and can open them, so it must have to do with the creation here.

I tried several things, using the 'SO_OBJECT_INSERT' function instead, using the 'SCMS_XSTRING_TO_BINARY' function for convert instead, working with '&SO_FILENAME=' etc., working with document size. Nothing helped. Evertytime I got the same error when opening the uploaded document.

In some blogs it says that it has to do with SAP ECC 6 and unicode system that many user have problems, I have that too and dont know how to solve it. Maybe any ideas here?

Thanks a lot

Regards Michael

View Entire Topic
MateuszAdamus
Active Contributor

Hello missschaaa

Try adding the OBJECT_HEADER parameter.

APPEND INITIAL LINE TO lt_header REFERENCE INTO DATA(ld_header).
CONCATENATE '&SO_FILENAME=' lv_file INTO ls_header->line.
APPEND INITIAL LINE TO lt_header REFERENCE INTO ld_header.
ld_header->line = '&SO_FORMAT=BIN'.
 
CALL FUNCTION 'SO_DOCUMENT_INSERT_API1'
  exporting
    folder_id                        = g_folderid
    document_data                    = g_docdata
    document_type                    = g_extension
  importing
    document_info                    =  g_docinfo
  tables
    object_header                    = lt_header " <---
    contents_hex                     = git_hexcont
  exceptions
    folder_not_exist                 = 1
    document_type_not_exist          = 2
    operation_no_authorization       = 3
    parameter_error                  = 4
    x_error                          = 5
    enqueue_error                    = 6
    others                           = 7

Update: I would also keep the DOC_SIZE field filled with the size of the binary data.

Kind regards,

Mateusz

Missschaaa
Participant
0 Likes

How would you calculate it? Just the size of the binary data or multiplied with 255 or some weird calculation that I found somewhere

* ls_obj_data-objlen = ( ld_lines - 1 ) * 255 + strlen( ls_data ).

MateuszAdamus
Active Contributor
0 Likes

The line you have in your code seems fine to me. Not sure why it's commented out.

ls_doc_data-doc_size = XSTRLEN( is_media_resource-value ).
Kind regards,
Mateusz