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)