我近日工作中,使用 SAP CRM Attachment API,创建 attachment 实例时,遇到了一个问题:
ls_prop-name = 'DESCRIPTION'.
ls_prop-value = 'created by Tool'.
APPEND ls_prop TO lt_prop.
ls_prop-name = 'CREATED_BY'.
ls_prop-value = XXX - some one else other than sy-uname
APPEND ls_prop TO lt_prop.
CALL METHOD cl_crm_documents=>create_with_table
EXPORTING
business_object = ls_bo
properties = lt_pro
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.
执行上述代码后,遇到了一个错误消息:
Characteristic of class CRM_L_DOC is not valid
该错误消息对应的 message class 为 SKWF_SDOKERRS
, id 为 030, 错误参数为 CRM_L_DOC
:
单步调试进去,发现这是因为如果内部模式处于非活动状态(inactive)
,内容管理代码将“CREATED_BY”字段视为只读(受保护字段)。
使用 where use list
, 查找所有使用了 internal_mode
的代码,然后发现下面这个 Function Module SDOK_INTERNAL_MODE_ACCESS
可以开启 internal mode:
需要传递 02
参数进去,02 参数代表 Internal Mode Active
, 这个值定义在 ABAP Domain SDOK_INTRN
上:
在我的程序中调用该 FM 后,错误消失,并且可以创建附件。
值得一提的是,我仍然无法指定 created_by
字段,我发现它总是在第298行填充为 sy-uname
.
sy-uname 在 SAP ABAP 编程语言中是一个系统变量,用于获取当前用户的用户名。它是系统提供的一种便捷方式,能够帮助开发人员在编写代码时获取当前用户的信息,以便根据不同用户的需求执行不同的逻辑或提供个性化的功能。
在 ABAP 中,sy-uname
变量可以被用于访问当前登录用户的用户名。这在很多场景下都是非常有用的,比如在开发涉及权限管理的应用程序时,可以根据不同的用户来限制其对特定数据或功能的访问权限。同时,在系统日志记录、审计跟踪等功能中,也经常需要记录下当前操作是由哪个用户执行的,这时候就可以使用 sy-uname
来获取用户名信息。
举例来说,假设我们正在开发一个销售订单管理系统,在这个系统中,不同的销售代表可能有不同的权限,比如一些高级销售代表能够修改订单价格,而一些普通销售代表只能查看订单信息而不能修改。在这种情况下,我们可以使用 sy-uname
来获取当前用户的用户名,然后根据用户名来判断该用户的权限级别,从而控制其对订单的操作权限。
DATA: lv_username TYPE sy-uname.
" 获取当前用户的用户名
lv_username = sy-uname.
" 根据用户名来判断用户权限
IF lv_username = 'ADMIN'.
" 管理员权限,可以修改订单价格
MODIFY sales_order SET price = 100 WHERE order_id = '123'.
ELSEIF lv_username = 'SALES1'.
" 普通销售代表权限,只能查看订单信息
SELECT * FROM sales_order INTO TABLE @DATA(lt_sales_order) WHERE sales_rep = lv_username.
" 显示订单信息
LOOP AT lt_sales_order INTO DATA(ls_sales_order).
WRITE: / ls_sales_order-order_id, ls_sales_order-customer_name, ls_sales_order-order_amount.
ENDLOOP.
ELSE.
" 其他用户,无权限操作
WRITE: / '您无权操作订单信息。'.
ENDIF.
在上面的例子中,我们首先使用 sy-uname
获取当前用户的用户名,然后根据不同的用户名来判断用户的权限级别,最后根据权限级别执行相应的操作。这样就能够根据不同用户的需求来提供个性化的功能和权限控制,提高系统的安全性和灵活性。