ABAP-创建采购单
【摘要】 告别忙碌低效!本文提供示例,帮助您用更少时间完成更多高质量工作,重获工作与生活平衡。
FUNCTION ZMM_FM_CREATE_PO. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(I_JSON) TYPE STRING *" EXPORTING *" REFERENCE(O_JSON) TYPE STRING *"---------------------------------------------------------------------- DATA: BEGIN OF LS_EKET, ETENR TYPE EKET-ETENR, EINDT TYPE EKET-EINDT, MENGE TYPE EKET-MENGE, END OF LS_EKET, BEGIN OF LS_EKKN, ZEKKN TYPE EKKN-ZEKKN, KOSTL TYPE EKKN-KOSTL, SAKTO TYPE EKKN-SAKTO, END OF LS_EKKN, BEGIN OF LS_KONV, ZAEHK TYPE KONV-ZAEHK, KSCHL TYPE KONV-KSCHL, KBETR TYPE KONV-KBETR, KPEIN TYPE KONV-KPEIN, KMEIN TYPE KONV-KMEIN, END OF LS_KONV, BEGIN OF LS_EKPO, SYSLN TYPE EKPO-SYSLN, MATNR TYPE EKPO-MATNR, MENGE TYPE EKPO-MENGE, MEINS TYPE EKPO-MEINS, WERKS TYPE EKPO-WERKS, LGORT TYPE EKPO-LGORT, RESLO TYPE EKPO-RESLO, 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, ELIKZ TYPE EKPO-ELIKZ, BSTAE TYPE EKPO-BSTAE, EKET LIKE TABLE OF LS_EKET, EKKN LIKE TABLE OF LS_EKKN, KONV LIKE TABLE OF LS_KONV, END OF LS_EKPO, BEGIN OF LS_EKKO, BUKRS TYPE EKKO-BUKRS, EKORG TYPE EKKO-EKORG, EKGRP TYPE EKKO-EKGRP, BSART TYPE EKKO-BSART, RESWK TYPE EKKO-RESWK, LIFNR TYPE EKKO-LIFNR, WAERS TYPE EKKO-WAERS, BEDAT TYPE EKKO-BEDAT, EKPO LIKE TABLE OF LS_EKPO, "行项目数据 END OF LS_EKKO, BEGIN OF LS_IN, KEY TYPE EKPO-SYSNO, EKKO LIKE LS_EKKO, END OF LS_IN, LS_POHEAD TYPE BAPIMEPOHEADER, LS_POHEADX TYPE BAPIMEPOHEADERX, 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_POACCOUNT TYPE TABLE OF BAPIMEPOACCOUNT WITH HEADER LINE, LT_POACCOUNTX TYPE TABLE OF BAPIMEPOACCOUNTX WITH HEADER LINE, LT_POSHIPPING TYPE TABLE OF BAPIITEMSHIP WITH HEADER LINE, LT_POSHIPPINGX TYPE TABLE OF BAPIITEMSHIPX WITH HEADER LINE, LV_EBELN TYPE BAPIMEPOHEADER-PO_NUMBER, 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_RESKEY TYPE STRING, LV_EBELP TYPE EKPO-EBELP, LV_CRT TYPE ZSCA_CRT, LS_RET TYPE ZSBC_RETURN. DATA: BEGIN OF LS_ITEMS, SYSLN TYPE EKPO-SYSLN, EBELP TYPE I, END OF LS_ITEMS, BEGIN OF LS_OUT, EBELN TYPE EKKO-EBELN. INCLUDE TYPE ZSBC_RETURN. DATA: ITEMS LIKE TABLE OF LS_ITEMS, END OF LS_OUT. 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-KEY IS NOT INITIAL. "重复检查 SELECT EBELN,EBELP,SYSLN FROM EKPO INTO TABLE @DATA(LT_EKPO_D) WHERE SYSNO EQ @LS_IN-KEY. IF SY-SUBRC = 0. READ TABLE LT_EKPO_D INTO DATA(LS_EKPO_D) INDEX 1. LS_OUT-EBELN = LS_EKPO_D-EBELN. LS_OUT-TYPE = 'S'. LS_OUT-MESSAGE = '请勿重复创建'. LS_OUT-ITEMS = CORRESPONDING #( LT_EKPO_D ). ELSE. "抬头 LS_POHEAD-COMP_CODE = LS_IN-EKKO-BUKRS. LS_POHEADX-COMP_CODE = 'X'. LS_POHEAD-PURCH_ORG = LS_IN-EKKO-EKORG. LS_POHEADX-PURCH_ORG = 'X'. LS_POHEAD-PUR_GROUP = LS_IN-EKKO-EKGRP. LS_POHEADX-PUR_GROUP = 'X'. LS_POHEAD-DOC_TYPE = LS_IN-EKKO-BSART. LS_POHEADX-DOC_TYPE = 'X'. IF LS_IN-EKKO-RESWK IS NOT INITIAL. LS_POHEAD-SUPPL_PLNT = LS_IN-EKKO-RESWK. LS_POHEADX-SUPPL_PLNT = 'X'. ENDIF. LS_POHEAD-VENDOR = LS_IN-EKKO-LIFNR = |{ LS_IN-EKKO-LIFNR ALPHA = IN }|. LS_POHEADX-VENDOR = 'X'. IF LS_IN-EKKO-WAERS IS NOT INITIAL. LS_POHEAD-CURRENCY = LS_IN-EKKO-WAERS. LS_POHEADX-CURRENCY = 'X'. ENDIF. IF LS_IN-EKKO-BEDAT IS NOT INITIAL. LS_POHEAD-DOC_DATE = LS_IN-EKKO-BEDAT. LS_POHEADX-DOC_DATE = 'X'. ENDIF. LS_POHEAD-CREAT_DATE = SY-DATUM. LS_POHEADX-CREAT_DATE = 'X'. LS_POHEAD-CREATED_BY = SY-UNAME. LS_POHEADX-CREATED_BY = 'X'. LS_POHEADX-ITEM_INTVL = 'X'. LOOP AT LS_IN-EKKO-EKPO INTO LS_EKPO. ADD 10 TO LV_EBELP. APPEND VALUE #( EBELP = LV_EBELP SYSLN = LS_EKPO-SYSLN ) TO LS_OUT-ITEMS. "增强 LS_MEPOITEM-PO_ITEM = LV_EBELP. LS_MEPOITEM-SYSNO = LS_IN-KEY. 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 = LV_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 = LV_EBELP. LT_POITEMX-PO_ITEM = LV_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_IN-EKKO-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 = LV_EBELP. LT_POSCHEDULEX-PO_ITEM = LV_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. "科目分配 LOOP AT LS_EKPO-EKKN INTO LS_EKKN. LT_POACCOUNT-PO_ITEM = LV_EBELP. LT_POACCOUNTX-PO_ITEM = LV_EBELP. LT_POACCOUNT-SERIAL_NO = LS_EKKN-ZEKKN. LT_POACCOUNTX-SERIAL_NO = LS_EKKN-ZEKKN. LT_POACCOUNT-COSTCENTER = LS_EKKN-KOSTL = |{ LS_EKKN-KOSTL ALPHA = IN }|. LT_POACCOUNTX-COSTCENTER = 'X'. LT_POACCOUNT-GL_ACCOUNT = LS_EKKN-SAKTO = |{ LS_EKKN-SAKTO ALPHA = IN }|. LT_POACCOUNTX-GL_ACCOUNT = 'X'. APPEND LT_POACCOUNT.CLEAR LT_POACCOUNT. APPEND LT_POACCOUNTX.CLEAR LT_POACCOUNTX. ENDLOOP. "条件 LOOP AT LS_EKPO-KONV INTO LS_KONV. LT_POCOND-ITM_NUMBER = LV_EBELP. LT_POCONDX-ITM_NUMBER = LV_EBELP. LT_POCOND-COND_COUNT = LS_KONV-ZAEHK. LT_POCONDX-COND_COUNT = LS_KONV-ZAEHK. LT_POCOND-COND_TYPE = LS_KONV-KSCHL. LT_POCONDX-COND_TYPE = 'X'. LT_POCOND-COND_VALUE = LS_KONV-KBETR. LT_POCONDX-COND_VALUE = 'X'. LT_POCOND-CURRENCY = LS_IN-EKKO-WAERS. LT_POCONDX-CURRENCY = 'X'. LT_POCOND-COND_P_UNT = LS_KONV-KPEIN. LT_POCONDX-COND_P_UNT = 'X'. LT_POCOND-COND_UNIT = LS_KONV-KMEIN. LT_POCONDX-COND_UNIT = 'X'. LT_POCOND-CHANGE_ID = 'U'. LT_POCONDX-CHANGE_ID = 'X'. APPEND LT_POCOND.CLEAR LT_POCOND. APPEND LT_POCONDX.CLEAR LT_POCONDX. ENDLOOP. ENDLOOP. "采购订单 CALL FUNCTION 'BAPI_PO_CREATE1' EXPORTING POHEADER = LS_POHEAD POHEADERX = LS_POHEADX IMPORTING EXPPURCHASEORDER = LV_EBELN TABLES RETURN = LT_RETURN POITEM = LT_POITEM POITEMX = LT_POITEMX POSCHEDULE = LT_POSCHEDULE POSCHEDULEX = LT_POSCHEDULEX POACCOUNT = LT_POACCOUNT POACCOUNTX = LT_POACCOUNTX POCOND = LT_POCOND POCONDX = LT_POCONDX EXTENSIONIN = LT_EXTENSIONIN POSHIPPING = LT_POSHIPPING POSHIPPINGX = LT_POSHIPPINGX. IF LV_EBELN IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LS_OUT-TYPE = 'E'. LOOP AT LT_RETURN WHERE TYPE EQ 'E'. LS_OUT-MESSAGE = LS_OUT-MESSAGE && LT_RETURN-MESSAGE && '/'. ENDLOOP. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. LS_OUT-EBELN = LV_EBELN. LS_OUT-TYPE = 'S'. LS_OUT-MESSAGE = '创建成功'. ENDIF. 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)