如何查找BAPI SD_SALESDOCUMENT_CHANGE里字段对应的数据库存储表

举报
汪子熙 发表于 2021/12/25 20:49:54 2021/12/25
【摘要】 BAPI函数SD_SALESDOCUMENT_CHANGE可以让我们很方便地通过ABAP代码来修改Sales Order。其输入参数ORDER_HEADER_IN的类型是BAPISDHD1, 里面包含了这个字段,比如SERV_DATE: service rendered date。如果想知道一个Sales Order的SERV_DATE字段存储在哪张表,该怎么找呢?注意上图提示,SERV_D...

BAPI函数SD_SALESDOCUMENT_CHANGE可以让我们很方便地通过ABAP代码来修改Sales Order。

其输入参数ORDER_HEADER_IN的类型是BAPISDHD1, 里面包含了这个字段,比如SERV_DATE: service rendered date。

如果想知道一个Sales Order的SERV_DATE字段存储在哪张表,该怎么找呢?注意上图提示,SERV_DATE的类型是FBUDA. 记住这个FBUDA名称。

使用SE37的where used list搜索SERV_DATE在哪里赋的值,很快找到是表VBKD

假设我想修改S/4HANA里Sales Order抬头的Service Date字段SERV_DATE:

首先从数据库表VBKD里查找到SERV_DATE修改之前的值为2020年1月1日

使用如下代码,将这个字段的值改成2020年1月2日。


REPORT zchange_so1.

DATA: lv_num        TYPE bapivbeln-vbeln,
      ls_doc_header TYPE bapisdhd1,
      lt_vbap       TYPE STANDARD  TABLE OF vbap.

lv_num = '0000000268'.

CALL FUNCTION 'SD_VBAP_READ_WITH_VBELN'
  EXPORTING
    i_vbeln          = lv_num
  TABLES
    et_vbap          = lt_vbap
  EXCEPTIONS
    record_not_found = 1
    OTHERS           = 2.

BREAK-POINT.

DATA: i_order_header_in  LIKE bapisdhd1 .
DATA: i_order_header_inx LIKE bapisdhd1x,
      lt_bapiret2        LIKE bapiret2   OCCURS 0 WITH HEADER LINE.

i_order_header_inx-updateflag = 'U'.
i_order_header_in-serv_date = '20200102' .
i_order_header_inx-serv_date = 'X'.


CALL FUNCTION 'SD_SALESDOCUMENT_CHANGE'
  EXPORTING
    salesdocument    = lv_num
    order_header_in  = i_order_header_in
    order_header_inx = i_order_header_inx
  TABLES
    return           = lt_bapiret2.

clear: lt_bapiret2.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  IMPORTING
     RETURN = lt_bapiret2.

BREAK-POINT.

执行之后,从输出参数lt_bapiret2里查看到这个Sales Order已经成功被更新了。

从后台数据库表VBKD里查看到这个字段的值也已经成功更新了:

错误消息KI 180:You must enter a company code for transaction Create sales document

代码:

REPORT zcreate_so.


DATA: ls_header   TYPE bapisdhd1,
      ls_headerx  TYPE bapisdhd1x,
      lt_bapiret2 LIKE bapiret2   OCCURS 0 WITH HEADER LINE.


ls_header-serv_date = '20200101'.
ls_header-doc_type = 'TA'.

ls_headerx-doc_type = 'X'.
ls_headerx-updateflag = 'U'.

CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
  EXPORTING
    sales_header_in       = ls_header
    sales_header_inx      = ls_headerx
    int_number_assignment = 'X'
  TABLES
    return                = lt_bapiret2.

LOOP AT lt_bapiret2 ASSIGNING FIELD-SYMBOL(<return>) WHERE type = 'E'.
  WRITE:/ 'Error:', <return>-message COLOR COL_NEGATIVE.
  RETURN.
ENDLOOP.

通过调试,发现错误消息是在下面的函数里抛出的:

原因:事务码VA03,打开一个已有的Sales Order,Goto->Header->Billing, 查看Company code:

得知Company code存储于表VBAK的字段BUKRS里。

解决方案:上述代码加上下面两行,问题即解决:

ls_header-comp_cde_b = '0001'.

ls_headerx-comp_cde_b = 'X'.

要获取更多Jerry的原创文章,请关注公众号"汪子熙"。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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