什么是 CRM Attachment 创建的 Internal mode

举报
Jerry Wang 发表于 2024/04/05 20:40:37 2024/04/05
【摘要】 我近日工作中,使用  CRM Attachment API,创建 attachment 实例时,遇到了一个问题:```sql  ls_prop-name = 'DESCRIPTION'.  ls_prop-value = 'created by Tool'.  APPEND ls_prop TO lt_prop.  ls_prop-name = 'CREATED_BY'.  ls_prop-...


我近日工作中,使用  CRM Attachment API,创建 attachment 实例时,遇到了一个问题:

```sql
  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`:

![](https://img-blog.csdnimg.cn/img_convert/6479d6965272bf5be48de4b4adcbf671.webp?x-oss-process=image/format,png)

单步调试进去,发现这是因为如果内部模式处于`非活动状态(inactive)`,内容管理代码将“CREATED_BY”字段视为只读(受保护字段)。

![](https://img-blog.csdnimg.cn/img_convert/1180a0876f556fff38edbdcc50ee6e05.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/674d67bc508061b1cc87f6d50288790a.webp?x-oss-process=image/format,png)

使用 `where use list`, 查找所有使用了 `internal_mode` 的代码,然后发现下面这个 Function Module `SDOK_INTERNAL_MODE_ACCESS` 可以开启 internal mode:

![](https://img-blog.csdnimg.cn/img_convert/11ff2d2ea482a0e4f814850a06d7db90.webp?x-oss-process=image/format,png)

需要传递 `02` 参数进去,02 参数代表 `Internal Mode Active`, 这个值定义在 ABAP Domain `SDOK_INTRN` 上:
![](https://img-blog.csdnimg.cn/img_convert/c9b984ee6f0ed640f6e19d419d058df5.webp?x-oss-process=image/format,png)

在我的程序中调用该 FM 后,错误消失,并且可以创建附件。 

值得一提的是,我仍然无法指定 `created_by` 字段,我发现它总是在第298行填充为 `sy-uname`.

![](https://img-blog.csdnimg.cn/img_convert/291380f66e22b2db59e85babe3bffadf.webp?x-oss-process=image/format,png)

sy-uname 在  ABAP 编程语言中是一个系统变量,用于获取当前用户的用户名。它是系统提供的一种便捷方式,能够帮助开发人员在编写代码时获取当前用户的信息,以便根据不同用户的需求执行不同的逻辑或提供个性化的功能。

在 ABAP 中,`sy-uname` 变量可以被用于访问当前登录用户的用户名。这在很多场景下都是非常有用的,比如在开发涉及权限管理的应用程序时,可以根据不同的用户来限制其对特定数据或功能的访问权限。同时,在系统日志记录、审计跟踪等功能中,也经常需要记录下当前操作是由哪个用户执行的,这时候就可以使用 `sy-uname` 来获取用户名信息。

举例来说,假设我们正在开发一个销售订单管理系统,在这个系统中,不同的销售代表可能有不同的权限,比如一些高级销售代表能够修改订单价格,而一些普通销售代表只能查看订单信息而不能修改。在这种情况下,我们可以使用 `sy-uname` 来获取当前用户的用户名,然后根据用户名来判断该用户的权限级别,从而控制其对订单的操作权限。

```sql
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` 获取当前用户的用户名,然后根据不同的用户名来判断用户的权限级别,最后根据权限级别执行相应的操作。这样就能够根据不同用户的需求来提供个性化的功能和权限控制,提高系统的安全性和灵活性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。