How to create attachment for your business object via code
For a complete list of all my blogs regarding content management, please see here.
I create a utility class with method CREATE_DOC. It has following four input parameters:
- iv_data type xstring – the binary data which you would like to store as attachment
- iv_bor_type type string – the BOR type of your business object. You can view view business object model in tcode SWO1
- iv_guid type raw16 – the guid of your business object instance
- iv_file_name type string – the file name which will appear in attachment assignment block.
The source code of method below: ( in fact all attributes for an attachment could be available in the input parameters of this method. For simplicity reason I
just hard code them in the sample code )
DATA:ls_bo TYPE sibflporb, ls_prop TYPE LINE OF sdokproptys, lt_prop TYPE sdokproptys, lt_properties_attr TYPE crmt_attr_name_value_t, ls_file_info TYPE sdokfilaci, lt_file_info TYPE sdokfilacis, lt_file_content TYPE sdokcntbins, lv_length TYPE i, lv_file_xstring TYPE xstring, ls_loio TYPE skwf_io, ls_phio TYPE skwf_io, ls_error TYPE skwf_error. ls_prop-name = 'DESCRIPTION'. ls_prop-value = 'created by Tool'. " replace it with your own description for attachment APPEND ls_prop TO lt_prop. ls_prop-name = 'KW_RELATIVE_URL'. ls_prop-value = iv_file_name. " in the sample code I just reuse file name as relative url APPEND ls_prop TO lt_prop. ls_prop-name = 'LANGUAGE'. ls_prop-value = sy-langu. APPEND ls_prop TO lt_prop. lv_file_xstring = iv_data. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_file_xstring IMPORTING output_length = lv_length TABLES binary_tab = lt_file_content. ls_file_info-binary_flg = 'X'. ls_file_info-file_name = iv_file_name. ls_file_info-file_size = lv_length. ls_file_info-mimetype = 'image/jpeg'. "use the correct mime type for your attachment APPEND ls_file_info TO lt_file_info. ls_bo-INSTID = iv_guid. ls_bo-typeid = iv_bor_type. ls_bo-catid = 'BO'. CALL METHOD cl_crm_documents=>create_with_table EXPORTING business_object = ls_bo properties = lt_prop properties_attr = lt_properties_attr file_access_info = lt_file_info file_content_binary = lt_file_content raw_mode = 'X' IMPORTING loio = ls_loio phio = ls_phio error = ls_error. " evaluate if there is anything wrong during creation COMMIT WORK.
I write a piece of code to test it. After report runs I could see the generated attachment.
You can also test whether the attachment is created successfully in the backend. Test class method get_info in SE24.
Specify importing parameter BUSINESS_OBJECT:
Execute and you should get result as below: one physical object and one logical object according to how-is-attachment-physically-stored-in-database-table-in-cm-framework.
Never forget to call COMMIT WORK in your code, since the persistence of the relationship between attachment and your business object are implemented via generic object service in a update process.You could easily find this via SAT trace on your code
or switch on update debugging in your debugger settings.