在我的日常工作中,出于复用性考虑,我使用方法 CREATE_DOC 创建一个实用程序类。 它有以下四个输入参数:
- iv_data type xstring - 想要存储为附件的二进制数据
- iv_bor_type type string - 业务对象的 BOR 类型。 您可以在tcode SWO1中查看查看业务对象模型
- iv_guid type raw16 - 您的业务对象实例的 guid
- iv_file_name 类型 string - 将出现在附件分配块中的文件名。
下面是该方法的完整源代码。
事实上,附件的所有属性都可以在此方法的输入参数中使用。为简单起见,我只需将它们硬编码到示例代码中即可。
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.
我写了一段代码来测试一下。ABAP 报表运行后,我可以在 WebClient UI 上看到生成的附件。
我们还可以在后台测试附件是否创建成功。 在 SE24 中测试类方法 get_info。
指定输入参数 BUSINESS_OBJECT:
记得在代码中调用 COMMIT WORK,因为附件和业务对象之间关系的持久性是通过更新过程中的通用对象服务实现的。我们可以通过代码上的 SAT 跟踪轻松找到这一点。
COMMIT WORK 是 SAP ABAP 中的一个关键字,用于提交数据库事务。在 ABAP 程序中,当需要对数据库进行更新操作时,通常会开启一个事务,将所有相关的数据库操作打包在一起,以确保这些操作要么全部成功执行,要么全部失败回滚,保持数据库的一致性。COMMIT WORK 的作用就是将当前事务中的所有数据库更新操作提交,使其永久生效,同时释放数据库锁定并结束当前事务。
在 SAP 系统中,COMMIT WORK 的使用非常普遍,特别是在需要保证数据完整性和一致性的场景下,比如在修改或创建重要的业务数据时,如订单、发票、付款等。通过提交事务,可以确保数据的修改是持久的,并且其他事务能够看到这些变化。
或者在调试器中,启用 update debugging
: