ABAP-创建采购单

举报
Mr_blank 发表于 2025/08/06 14:44:01 2025/08/06
【摘要】 告别忙碌低效!本文提供示例,帮助您用更少时间完成更多高质量工作,重获工作与生活平衡。
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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。