使用如下bapi 可以实现确认行的插入修改更新
1.BAPI_PO_CHANGE ” 确认行的控制 01 确认 02 粗收货 。。。
2.ME_CONFIRMATION_UPDATE “ 更新确认行数据
3.EINKBELEG_WRITE_DOCUMENT ” 更新数据历史记录的记载
在确认中主要注意以下几个点
1.一定要使用 BAPI_PO_CHANGE有两个因素
1.1 会出现界面不显示而 数据库中存在数据
1.2 无法定位是哪个确认控制类型 会对收货造成影响
1.3 当用户正在更改项目时容易出现数据问题,数据不一
2.对于ME_CONFIRMATION_UPDATE中的参数解读
2.1 yekes 都是指old 数据, 常常在删除时使用 ,删除时要带上xekes 必选 可以设置空的内表
2.2 更新和修改时不必带入 yekes 直接在xekes 中更改你想要更改的数据,最好先获取数据库中的数据确保原始数据准确,其次 I U D 分别是插入 更新 删除。
3.EINKBELEG_WRITE_DOCUMENT 更改历史记录
3.1 获取函数的规律是 对象值+_WRITE_DOCUMENT ,对象值可以在cdpos 中查看,
3.2 具体使用时的代码如下
CALL FUNCTION 'EINKBELEG_WRITE_DOCUMENT'
EXPORTING
objectid = lv_objectid
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
* PLANNED_CHANGE_NUMBER = ' '
object_change_indicator = 'U'
planned_or_real_changes = 'R'
upd_ekes = 'U'
TABLES
icdtxt_einkbeleg = lt_cdtxt
xekes = lt_xekes
yekes = lt_yekes
.
IF sy-subrc = 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
lv_objectid 就是你要更改的po ,所有的更改都是以po 为 依据的。
我当前的业务需要添加确认行 自定义类型,在spro中路径 物料管理--采购---确认---定义外部确认类别 设置你自己的类型。
确认行数据.png
IF lt_xekes IS NOT INITIAL.
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
purchaseorder = ls_input-ebeln
TABLES
return = gt_return
poitem = gt_poitem
poitemx = gt_poitemx.
READ TABLE gt_return INTO gs_return WITH KEY type = 'E'."判断是否可以更改>
IF sy-subrc = 0.
ls_log-message = '@0A@PO更新失败,无法更新 更新异常,po 被占用. '.
gv_error_mess = 'X'.
ELSE.
SELECT *
FROM ekes
FOR ALL ENTRIES IN @lt_xekes
WHERE ebeln = @lt_xekes-ebeln
AND ebelp = @lt_xekes-ebelp
AND ebtyp = @lv_type
INTO TABLE @lt_yekes.
LOOP AT lt_yekes ASSIGNING FIELD-SYMBOL(<fs_yekes>).
<fs_yekes>-kz = 'D'.
ENDLOOP.
CALL FUNCTION 'ME_CONFIRMATION_UPDATE'
EXPORTING
i_ebeln = ls_input-ebeln
TABLES
* yekes = lt_yekes
xekes = lt_xekes "new 新增和修改
.
IF sy-subrc EQ 0.
ls_log-message = '@08@更新成功'.
COMMIT WORK .
lv_objectid = ls_input-ebeln.
CALL FUNCTION 'EINKBELEG_WRITE_DOCUMENT'
EXPORTING
objectid = lv_objectid
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
* PLANNED_CHANGE_NUMBER = ' '
object_change_indicator = 'U'
planned_or_real_changes = 'R'
upd_ekes = 'U'
TABLES
icdtxt_einkbeleg = lt_cdtxt
xekes = lt_xekes
yekes = lt_yekes
.
IF sy-subrc = 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
ELSE.
ls_log-message = '@0A@更新失败,插入失败'.
gv_error_mess = 'X'.
ROLLBACK WORK .
ENDIF.
ENDIF.
网友评论