In the beginning I consider it is very easy to delete attachments via code, just like below.
I have defined one method with following two importing parameters and one returning parameter:
(1) iv_bor_type type string – the BOR type of your business object
(2) iv_uuid type raw16 – the guid of your business object instance
(3) rv_successful type abap_bool – indicates whether the deletion is successful
DATA: ls_bo TYPE SIBFLPORB,
lt_loios TYPE SKWF_IOS,
ls_loios TYPE SKWF_IO,
ls_error TYPE SKWF_ERROR,
lt_badios TYPE SKWF_IOERRS,
lv_del_flag TYPE ABAP_BOOL.
ls_bo-instid = iv_uuid.
ls_bo-typeid = iv_bor_type.
ls_bo-catid = 'BO'.
rv_successful = abap_false.
CALL METHOD cl_crm_documents=>get_info
EXPORTING
business_object = ls_bo
IMPORTING
loios = lt_loios.
LOOP AT lt_loios INTO ls_loios.
CALL METHOD cl_crm_documents=>lock
EXPORTING
is_bo = ls_bo
is_loio = ls_loios
IMPORTING
es_error = ls_error.
IF ls_error IS NOT INITIAL.
RETURN.
ENDIF.
ENDLOOP.
CALL METHOD cl_crm_documents=>delete
EXPORTING
business_object = ls_bo
ios = lt_loios
IMPORTING
bad_ios = lt_badios
error = ls_error.
IF ls_error IS INITIAL. " deletion failed
rv_successful = abap_true.
ENDIF.
Through testing I found it works perfectly well with most of BOR type like product, IBASE, BP, and one order.
However, it does not work for my new BOR type CRMSOCPOST in CRM7.0 EHP3 – the relationship between my BO and the attachments is not really deleted until an explicit call COMMIT WORK is written in the report. However, for any other standard CRM BOR type, the COMMIT WORK is not needed. Why?
After some debugging finally I find answer. Have you already observed the comments below? It is written quite clearly: if the business object exists in the database, the COMMIT WORK is not needed.