如何查找BAPI SD_SALESDOCUMENT_CHANGE里字段对应的数据库存储表
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的原创文章,请关注公众号"汪子熙"。
- 点赞
- 收藏
- 关注作者
评论(0)