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)