ABAP-修改采购单

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

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

全部回复

上滑加载中

设置昵称

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

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

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