ABAP-修改采购单
【摘要】 告别忙碌低效!本文提供示例,帮助您用更少时间完成更多高质量工作,重获工作与生活平衡。
FUNCTION ZMM_FM_CHANGE_PO.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(I_JSON) TYPE STRING
*" EXPORTING
*" REFERENCE(O_JSON) TYPE STRING
*"----------------------------------------------------------------------
DATA:
BEGIN OF LS_EKETX,
EINDT TYPE BAPIUPDATE,
MENGE TYPE BAPIUPDATE,
END OF LS_EKETX,
BEGIN OF LS_EKET,
ETENR TYPE EKET-ETENR,
EINDT TYPE EKET-EINDT,
MENGE TYPE EKET-MENGE,
CHGID LIKE LS_EKETX,
END OF LS_EKET,
BEGIN OF LS_KONVX,
KBETR TYPE BAPIUPDATE,
KPEIN TYPE BAPIUPDATE,
END OF LS_KONVX,
BEGIN OF LS_KONV,
ZAEHK TYPE KONV-ZAEHK,
KBETR TYPE KONV-KBETR,
KPEIN TYPE KONV-KPEIN,
CHGID LIKE LS_KONVX,
END OF LS_KONV,
BEGIN OF LS_EKPOX,
MENGE TYPE BAPIUPDATE,
ELIKZ TYPE BAPIUPDATE,
LOEKZ TYPE BAPIUPDATE,
RESLO TYPE BAPIUPDATE,
BSTAE TYPE BAPIUPDATE,
END OF LS_EKPOX,
BEGIN OF LS_EKPO,
EBELP TYPE EKPO-EBELP,
MENGE TYPE EKPO-MENGE,
ELIKZ TYPE EKPO-ELIKZ,
LOEKZ TYPE EKPO-LOEKZ,
RESLO TYPE EKPO-RESLO,
BSTAE TYPE EKPO-BSTAE,
SYSLN TYPE EKPO-SYSLN,
MATNR TYPE EKPO-MATNR,
MEINS TYPE EKPO-MEINS,
WERKS TYPE EKPO-WERKS,
LGORT TYPE EKPO-LGORT,
RETPO TYPE EKPO-RETPO,
UMSON TYPE EKPO-RETPO,
KUNNR TYPE EKPO-KUNNR,
LABNR TYPE EKPO-LABNR,
NETPR TYPE EKPO-NETPR,
MWSKZ TYPE EKPO-MWSKZ,
UEBTO TYPE EKPO-UEBTO,
UNTTO TYPE EKPO-UNTTO,
KNTTP TYPE EKPO-KNTTP,
CHGID LIKE LS_EKPOX,
EKET LIKE TABLE OF LS_EKET,
KONV LIKE TABLE OF LS_KONV,
END OF LS_EKPO,
BEGIN OF LS_EKKO,
EBELN TYPE EKKO-EBELN,
EKPO LIKE TABLE OF LS_EKPO, "行项目数据
END OF LS_EKKO,
BEGIN OF LS_IN,
EKKO LIKE LS_EKKO,
END OF LS_IN,
BEGIN OF LS_ITEMS,
SYSLN TYPE EKPO-SYSLN,
EBELP TYPE I,
END OF LS_ITEMS,
BEGIN OF LS_OUT.
INCLUDE TYPE ZSBC_RETURN.
DATA: ITEMS LIKE TABLE OF LS_ITEMS,
END OF LS_OUT,
LT_POITEM TYPE TABLE OF BAPIMEPOITEM WITH HEADER LINE,
LT_POITEMX TYPE TABLE OF BAPIMEPOITEMX WITH HEADER LINE,
LT_POSCHEDULE TYPE TABLE OF BAPIMEPOSCHEDULE WITH HEADER LINE,
LT_POSCHEDULEX TYPE TABLE OF BAPIMEPOSCHEDULX WITH HEADER LINE,
LT_POCOND TYPE TABLE OF BAPIMEPOCOND WITH HEADER LINE,
LT_POCONDX TYPE TABLE OF BAPIMEPOCONDX WITH HEADER LINE,
LT_POSHIPPING TYPE TABLE OF BAPIITEMSHIP WITH HEADER LINE,
LT_POSHIPPINGX TYPE TABLE OF BAPIITEMSHIPX WITH HEADER LINE,
LT_POSHIPPINGEXP TYPE TABLE OF BAPIMEPOSHIPPEXP WITH HEADER LINE,
LS_MEPOITEM TYPE BAPI_TE_MEPOITEM,
LS_MEPOITEMX TYPE BAPI_TE_MEPOITEMX,
LT_EXTENSIONIN TYPE TABLE OF BAPIPAREX WITH HEADER LINE,
LT_RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE,
LV_SUBKEY TYPE STRING,
LV_CRT TYPE ZSCA_CRT,
LS_RET TYPE ZSBC_RETURN.
LV_CRT-ERDAT = SY-DATUM.
LV_CRT-ERTIM = SY-UZEIT.
"JSON转ABAP
/UI2/CL_JSON=>DESERIALIZE(
EXPORTING
JSON = I_JSON
CHANGING
DATA = LS_IN ).
IF LS_IN-EKKO-EBELN IS NOT INITIAL.
LS_IN-EKKO-EBELN = |{ LS_IN-EKKO-EBELN ALPHA = IN }|.
SELECT SINGLE *
FROM EKKO
INTO @DATA(LS_EKKO_D)
WHERE EBELN = @LS_IN-EKKO-EBELN.
IF SY-SUBRC = 0.
SELECT *
FROM EKPO
INTO TABLE @DATA(LT_EKPO_D)
WHERE EBELN = @LS_IN-EKKO-EBELN.
LOOP AT LS_IN-EKKO-EKPO INTO LS_EKPO.
IF LS_EKPO-EBELP IS NOT INITIAL.
"明细
LT_POITEM-PO_ITEM = LS_EKPO-EBELP.
LT_POITEMX-PO_ITEM = LS_EKPO-EBELP.
IF LS_EKPO-CHGID-MENGE IS NOT INITIAL.
LT_POITEM-QUANTITY = LS_EKPO-MENGE.
LT_POITEMX-QUANTITY = 'X'.
ENDIF.
IF LS_EKPO-CHGID-LOEKZ IS NOT INITIAL.
LT_POITEM-DELETE_IND = LS_EKPO-LOEKZ.
LT_POITEMX-DELETE_IND = 'X'.
ENDIF.
IF LS_EKPO-CHGID-ELIKZ IS NOT INITIAL.
LT_POITEM-NO_MORE_GR = LS_EKPO-ELIKZ.
LT_POITEMX-NO_MORE_GR = 'X'.
ENDIF.
IF LS_EKPO-CHGID-BSTAE IS NOT INITIAL.
LT_POITEM-CONF_CTRL = LS_EKPO-BSTAE.
LT_POITEMX-CONF_CTRL = 'X'.
ENDIF.
APPEND LT_POITEM.CLEAR LT_POITEM.
APPEND LT_POITEMX.CLEAR LT_POITEMX.
IF LS_EKKO_D-BSART = 'Z01' AND LS_EKPO-CHGID-RESLO IS NOT INITIAL.
LS_MEPOITEM-PO_ITEM = LS_EKPO-EBELP.
LS_MEPOITEM-RESLO = LS_EKPO-RESLO.
LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEM'.
CALL METHOD CL_ABAP_CONTAINER_UTILITIES=>FILL_CONTAINER_C
EXPORTING
IM_VALUE = LS_MEPOITEM
IMPORTING
EX_CONTAINER = LT_EXTENSIONIN-VALUEPART1.
APPEND LT_EXTENSIONIN.CLEAR LT_EXTENSIONIN.
LS_MEPOITEMX-PO_ITEM = LS_EKPO-EBELP.
LS_MEPOITEMX-RESLO = 'X'.
LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEMX'.
LT_EXTENSIONIN+30 = LS_MEPOITEMX.
APPEND LT_EXTENSIONIN.CLEAR LT_EXTENSIONIN.
ENDIF.
"交货计划
LOOP AT LS_EKPO-EKET INTO LS_EKET.
LT_POSCHEDULE-PO_ITEM = LS_EKPO-EBELP.
LT_POSCHEDULEX-PO_ITEM = LS_EKPO-EBELP.
LT_POSCHEDULE-SCHED_LINE = LS_EKET-ETENR.
LT_POSCHEDULEX-SCHED_LINE = LS_EKET-ETENR.
IF LS_EKET-CHGID-EINDT IS NOT INITIAL.
LT_POSCHEDULE-DELIVERY_DATE = LS_EKET-EINDT.
LT_POSCHEDULEX-DELIVERY_DATE = 'X'.
ENDIF.
IF LS_EKET-CHGID-MENGE IS NOT INITIAL.
LT_POSCHEDULE-QUANTITY = LS_EKET-MENGE.
LT_POSCHEDULEX-QUANTITY = 'X'.
ENDIF.
APPEND LT_POSCHEDULE.CLEAR LT_POSCHEDULE.
APPEND LT_POSCHEDULEX.CLEAR LT_POSCHEDULEX.
ENDLOOP.
"条件
LOOP AT LS_EKPO-KONV INTO LS_KONV.
SELECT SINGLE *
FROM KONV
INTO @DATA(LS_KONV_D)
WHERE KNUMV = @LS_EKKO_D-KNUMV
AND KPOSN = @LS_EKPO-EBELP
AND ZAEHK = @LS_KONV-ZAEHK.
LT_POCOND-ITM_NUMBER = LS_EKPO-EBELP.
LT_POCONDX-ITM_NUMBER = LS_EKPO-EBELP.
LT_POCOND-COND_COUNT = LS_KONV-ZAEHK.
LT_POCONDX-COND_COUNT = LS_KONV-ZAEHK.
LT_POCOND-COND_TYPE = LS_KONV_D-KSCHL.
LT_POCONDX-COND_TYPE = 'X'.
IF LS_KONV-CHGID-KBETR IS NOT INITIAL.
LT_POCOND-COND_VALUE = LS_KONV-KBETR.
LT_POCONDX-COND_VALUE = 'X'.
ENDIF.
IF LS_KONV-CHGID-KPEIN IS NOT INITIAL.
LT_POCOND-COND_P_UNT = LS_KONV-KPEIN.
LT_POCONDX-COND_P_UNT = 'X'.
ENDIF.
LT_POCOND-COND_UNIT = LS_KONV_D-KMEIN.
LT_POCONDX-COND_UNIT = 'X'.
LT_POCOND-CURRENCY = LS_KONV_D-WAERS.
LT_POCONDX-CURRENCY = 'X'.
LT_POCOND-CHANGE_ID = 'U'.
LT_POCONDX-CHANGE_ID = 'X'.
APPEND LT_POCOND.CLEAR LT_POCOND.
APPEND LT_POCONDX.CLEAR LT_POCONDX.
ENDLOOP.
ELSE.
"最大行
SORT LT_EKPO_D BY EBELN EBELP DESCENDING.
READ TABLE LT_EKPO_D INTO DATA(LS_EKPO_M) INDEX 1.
ADD 10 TO LS_EKPO_M-EBELP.
APPEND VALUE #( EBELP = LS_EKPO_M-EBELP
SYSLN = LS_EKPO-SYSLN ) TO LS_OUT-ITEMS.
"增强
LS_MEPOITEM-PO_ITEM = LS_EKPO_M-EBELP.
LS_MEPOITEM-SYSNO = LS_EKPO_M-SYSNO.
LS_MEPOITEM-SYSLN = LS_EKPO-SYSLN.
IF LS_EKPO-RESLO IS NOT INITIAL.
LS_MEPOITEM-RESLO = LS_EKPO-RESLO.
ENDIF.
LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEM'.
CALL METHOD CL_ABAP_CONTAINER_UTILITIES=>FILL_CONTAINER_C
EXPORTING
IM_VALUE = LS_MEPOITEM
IMPORTING
EX_CONTAINER = LT_EXTENSIONIN-VALUEPART1.
APPEND LT_EXTENSIONIN.CLEAR LT_EXTENSIONIN.
LS_MEPOITEMX-PO_ITEM = LS_EKPO_M-EBELP.
LS_MEPOITEMX-SYSNO = 'X'.
LS_MEPOITEMX-SYSLN = 'X'.
IF LS_EKPO-RESLO IS NOT INITIAL.
LS_MEPOITEMX-RESLO = 'X'.
ENDIF.
LT_EXTENSIONIN-STRUCTURE = 'BAPI_TE_MEPOITEMX'.
LT_EXTENSIONIN+30 = LS_MEPOITEMX.
APPEND LT_EXTENSIONIN.CLEAR LT_EXTENSIONIN.
"明细
LT_POITEM-PO_ITEM = LS_EKPO_M-EBELP.
LT_POITEMX-PO_ITEM = LS_EKPO_M-EBELP.
LT_POITEMX-PO_ITEMX = 'X'.
LT_POITEM-MATERIAL = LS_EKPO-MATNR = |{ LS_EKPO-MATNR ALPHA = IN }|.
LT_POITEMX-MATERIAL = 'X'.
LT_POITEM-QUANTITY = LS_EKPO-MENGE.
LT_POITEMX-QUANTITY = 'X'.
LT_POITEM-PO_UNIT = LS_EKPO-MEINS.
LT_POITEMX-PO_UNIT = 'X'.
LT_POITEM-PLANT = LS_EKPO-WERKS.
LT_POITEMX-PLANT = 'X'.
LT_POITEM-STGE_LOC = LS_EKPO-LGORT.
LT_POITEMX-STGE_LOC = 'X'.
IF LS_EKPO-RETPO IS NOT INITIAL.
LT_POITEM-RET_ITEM = LS_EKPO-RETPO.
LT_POITEMX-RET_ITEM = 'X'.
ENDIF.
IF LS_EKPO-UMSON IS NOT INITIAL.
LT_POITEM-FREE_ITEM = LS_EKPO-UMSON.
LT_POITEMX-FREE_ITEM = 'X'.
ENDIF.
IF LS_EKPO-KUNNR IS NOT INITIAL.
LT_POITEM-CUSTOMER = LS_EKPO-KUNNR = |{ LS_EKPO-KUNNR ALPHA = IN }|.
LT_POITEMX-CUSTOMER = 'X'.
ENDIF.
IF LS_EKPO-LABNR IS NOT INITIAL.
LT_POITEM-ACKNOWL_NO = LS_EKPO-LABNR.
LT_POITEMX-ACKNOWL_NO = 'X'.
ENDIF.
IF LS_EKKO_D-BSART NE 'Z01'.
LT_POITEM-NET_PRICE = LS_EKPO-NETPR.
LT_POITEMX-NET_PRICE = 'X'.
ENDIF.
IF LS_EKPO-MWSKZ IS NOT INITIAL.
LT_POITEM-TAX_CODE = LS_EKPO-MWSKZ.
LT_POITEMX-TAX_CODE = 'X'.
ENDIF.
IF LS_EKPO-UEBTO IS NOT INITIAL.
LT_POITEM-OVER_DLV_TOL = LS_EKPO-UEBTO.
LT_POITEMX-OVER_DLV_TOL = 'X'.
ENDIF.
IF LS_EKPO-UNTTO IS NOT INITIAL.
LT_POITEM-UNDER_DLV_TOL = LS_EKPO-UNTTO.
LT_POITEMX-UNDER_DLV_TOL = 'X'.
ENDIF.
IF LS_EKPO-KNTTP IS NOT INITIAL.
LT_POITEM-ACCTASSCAT = LS_EKPO-KNTTP.
LT_POITEMX-ACCTASSCAT = 'X'.
ENDIF.
IF LS_EKPO-ELIKZ IS NOT INITIAL.
LT_POITEM-NO_MORE_GR = LS_EKPO-ELIKZ.
LT_POITEMX-NO_MORE_GR = 'X'.
ENDIF.
IF LS_EKPO-BSTAE IS NOT INITIAL.
LT_POITEM-CONF_CTRL = LS_EKPO-BSTAE.
LT_POITEMX-CONF_CTRL = 'X'.
ENDIF.
APPEND LT_POITEM.CLEAR LT_POITEM.
APPEND LT_POITEMX.CLEAR LT_POITEMX.
"交货计划
LOOP AT LS_EKPO-EKET INTO LS_EKET.
LT_POSCHEDULE-PO_ITEM = LS_EKPO_M-EBELP.
LT_POSCHEDULEX-PO_ITEM = LS_EKPO_M-EBELP.
LT_POSCHEDULE-SCHED_LINE = LS_EKET-ETENR.
LT_POSCHEDULEX-SCHED_LINE = LS_EKET-ETENR.
LT_POSCHEDULE-DEL_DATCAT_EXT = 'D'.
LT_POSCHEDULEX-DEL_DATCAT_EXT = 'X'.
LT_POSCHEDULE-DELIVERY_DATE = LS_EKET-EINDT.
LT_POSCHEDULEX-DELIVERY_DATE = 'X'.
LT_POSCHEDULE-QUANTITY = LS_EKET-MENGE.
LT_POSCHEDULEX-QUANTITY = 'X'.
APPEND LT_POSCHEDULE.CLEAR LT_POSCHEDULE.
APPEND LT_POSCHEDULEX.CLEAR LT_POSCHEDULEX.
ENDLOOP.
ENDIF.
ENDLOOP.
"采购订单
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
PURCHASEORDER = LS_IN-EKKO-EBELN
TABLES
RETURN = LT_RETURN
POITEM = LT_POITEM
POITEMX = LT_POITEMX
POSCHEDULE = LT_POSCHEDULE
POSCHEDULEX = LT_POSCHEDULEX
POSHIPPING = LT_POSHIPPING
POSHIPPINGX = LT_POSHIPPINGX
EXTENSIONIN = LT_EXTENSIONIN
POSHIPPINGEXP = LT_POSHIPPINGEXP
POCOND = LT_POCOND
POCONDX = LT_POCONDX.
LOOP AT LT_RETURN WHERE TYPE CA 'AEI'.
LS_OUT-MESSAGE = LS_OUT-MESSAGE && LT_RETURN-MESSAGE && '/'.
ENDLOOP.
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LS_OUT-TYPE = 'E'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
LS_OUT-TYPE = 'S'.
LS_OUT-MESSAGE = '修改成功'.
ENDIF.
ELSE.
LS_OUT-TYPE = 'E'.
LS_OUT-MESSAGE = '采购订单不存在,请检查'.
ENDIF.
ELSE.
LS_OUT-TYPE = 'E'.
LS_OUT-MESSAGE = '报文有误,请检查'.
ENDIF.
"ABAP转JSON
CALL METHOD /UI2/CL_JSON=>SERIALIZE
EXPORTING
DATA = LS_OUT
RECEIVING
R_JSON = O_JSON.
"保存日志
ENDFUNCTION.
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)