ABAP BAPI创建销售订单 SD_SALESDOCUMENT_CREATE,实例

销售订单事务代码:VA01,VA02,VA03

BAPI :SD_SALESDOCUMENT_CREATE

FUNCTION ZSNSDFM_SH_003.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(ZDATA_IN) TYPE  ZYKE_JSON
*"  EXPORTING
*"     REFERENCE(ZTYPE) TYPE  ZYKE_TYPE
*"     REFERENCE(ZMESSAGE) TYPE  ZYKE_MESSAGE
*"     REFERENCE(ZDATA_OUT) TYPE  ZYKE_JSON
*"----------------------------------------------------------------------

  DATA: LT_INPUT TYPE ZSNSDTSH001 .
  DATA:BEGIN OF LT_OUT OCCURS 0 ,
         ZCLIMNO  TYPE BSTKD , "理赔单号 .
         VBELN    TYPE VBAP-VBELN,
         ZMESSAGE TYPE ZYKE_MESSAGE,
       END OF LT_OUT .

  DATA LV_MATNR TYPE N LENGTH 18 .
  DATA LV_NEXT TYPE C .
  DATA: LS_SALES_HEADER_IN      TYPE BAPISDHD1,
        LS_SALES_HEADER_INX     TYPE BAPISDHD1X,
        LV_VBELN                TYPE BAPIVBELN-VBELN,
        LT_SALES_ITEMS          TYPE STANDARD TABLE OF BAPISDITM  WITH HEADER LINE,
        LT_SALES_ITEMSX         TYPE STANDARD TABLE OF BAPISDITMX WITH HEADER LINE,
        LT_RETURN               TYPE STANDARD TABLE OF BAPIRET2   WITH HEADER LINE,
        LT_SALES_PARTNERS       TYPE STANDARD TABLE OF BAPIPARNR  WITH HEADER LINE,
        LT_SALES_CONDITIONS_IN  LIKE TABLE OF BAPICOND   WITH HEADER LINE,
        LT_SALES_CONDITIONS_INX LIKE TABLE OF BAPICONDX  WITH HEADER LINE,
        LT_SALES_SCHEDULES_IN   LIKE TABLE OF BAPISCHDL  WITH HEADER LINE,
        LT_SALES_SCHEDULES_INX  LIKE TABLE OF BAPISCHDLX WITH HEADER LINE,
        LT_PARTNERS_EX          TYPE STANDARD TABLE OF BAPISDPART WITH HEADER LINE,
        LT_SALES_TEXT           LIKE TABLE OF BAPISDTEXT WITH HEADER LINE,
        LV_POSNR                TYPE VBAP-POSNR,
        LV_MSG                  TYPE C LENGTH 255.

  /UI2/CL_JSON=>DESERIALIZE(
    EXPORTING
      JSON             = ZDATA_IN
    CHANGING
      DATA             = LT_INPUT[]  ).

  LOOP AT LT_INPUT INTO DATA(LS_INPUT).
    CLEAR: LS_SALES_HEADER_IN ,LS_SALES_HEADER_INX , LV_VBELN,
           LT_SALES_ITEMS, LT_SALES_ITEMS[],
           LT_SALES_ITEMSX,LT_SALES_ITEMSX[],
           LT_RETURN,LT_RETURN[],
           LT_PARTNERS_EX,LT_PARTNERS_EX[],
           LT_SALES_PARTNERS,LT_SALES_PARTNERS[].

    CLEAR LT_OUT .
    LT_OUT-ZCLIMNO = LS_INPUT-ZSALESORDER-ZCLIMNO .
    READ TABLE LS_INPUT-ZITEM INTO DATA(LS_ITEMS) INDEX 1 .
    CASE LS_ITEMS-ZPRICE.
        WHEN 0.
        LS_INPUT-ZSALESORDER-AUART = 'ZC11'.
        WHEN OTHERS.
        LS_INPUT-ZSALESORDER-AUART = 'ZC02'.
    ENDCASE.
    "销售订单抬头
    LS_SALES_HEADER_IN = VALUE #( PURCH_NO_C  = LS_INPUT-ZSALESORDER-ZCLIMNO
                                  DOC_TYPE    = LS_INPUT-ZSALESORDER-AUART
                                  DOC_DATE    = LS_INPUT-ZSALESORDER-AUDAT
                                  SALES_ORG   = LS_INPUT-ZSALESORDER-VKORG
                                  DISTR_CHAN  = LS_INPUT-ZSALESORDER-VTWEG
                                  SALES_GRP   = LS_INPUT-ZSALESORDER-VKGRP
                                  SALES_OFF   = LS_INPUT-ZSALESORDER-VKBUR
                                  ORD_REASON  = LS_INPUT-ZSALESORDER-AUGRU

                                 ).

    LS_SALES_HEADER_INX = VALUE #( PURCH_NO_C  =  'X'
                                   DOC_TYPE    =  'X'
                                   DOC_DATE    =  'X'
                                   SALES_ORG   =  'X'
                                   DISTR_CHAN  =  'X'
                                   SALES_GRP   =  'X'
                                   SALES_OFF   =  'X'
                                   ORD_REASON  =  'X'

                                  ).

******** Header texts
    LT_SALES_TEXT-ITM_NUMBER = SPACE.
    LT_SALES_TEXT-TEXT_ID    = '0001'.
    LT_SALES_TEXT-LANGU      = SY-LANGU.
    LT_SALES_TEXT-FORMAT_COL = '*'.
    LT_SALES_TEXT-TEXT_LINE  = LS_INPUT-ZSALESORDER-ZREMARK.
    APPEND LT_SALES_TEXT .

    "销售合作伙伴


    LS_INPUT-ZSALESORDER-KUNNR = |{ LS_INPUT-ZSALESORDER-KUNNR ALPHA = IN }| .
*
    LT_SALES_PARTNERS = VALUE #(
                                  PARTN_ROLE =  'AG' "售达方
                                  PARTN_NUMB = LS_INPUT-ZSALESORDER-KUNNR

                                 ).
    APPEND LT_SALES_PARTNERS .

    "合作伙伴
    LT_PARTNERS_EX = VALUE #( PARTN_ROLE = 'ZM'
                              CUSTOMER   = LS_INPUT-ZSALESORDER-KUNNR
                              PERSON_NO  = LS_INPUT-ZSALESORDER-PERNR

                            ).

    APPEND LT_PARTNERS_EX .
    "销售订单行项目
    CLEAR LV_POSNR .
    LOOP AT LS_INPUT-ZITEM INTO DATA(LS_ITEM).
      CLEAR: LT_SALES_ITEMS ,LT_SALES_ITEMSX.
      LV_POSNR = LV_POSNR + 10 .
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT  = LS_ITEM-MATNR
        IMPORTING
          OUTPUT = LS_ITEM-MATNR.
      LT_SALES_ITEMS = VALUE #(
                                ITM_NUMBER = LV_POSNR
                                MATERIAL   = LS_ITEM-MATNR
                                TARGET_QTY = LS_ITEM-KWMENG
                                TARGET_QU  = LS_ITEM-VRKME
                                PLANT  =  LS_ITEM-WERKS
                               ).
      LT_SALES_ITEMSX = VALUE #(
                                 ITM_NUMBER = LV_POSNR
                                 MATERIAL   =  'X'
                                 TARGET_QTY = 'X'
                                 TARGET_QU  = 'X'
                                 PLANT      = 'X'
                                ).
      APPEND LT_SALES_ITEMS.
      APPEND LT_SALES_ITEMSX .

******** sales Schedule Line
      LT_SALES_SCHEDULES_IN-ITM_NUMBER = LV_POSNR.
      LT_SALES_SCHEDULES_IN-SCHED_LINE = '0001'.       " L_TABIX.
      LT_SALES_SCHEDULES_IN-REQ_DATE   = SY-DATUM.     " 计划行日期
      LT_SALES_SCHEDULES_IN-REQ_QTY    = LS_ITEM-KWMENG. "以销售单位计的 订单数量

      LT_SALES_SCHEDULES_INX-ITM_NUMBER = LV_POSNR.
      LT_SALES_SCHEDULES_INX-SCHED_LINE = '0001'.
      LT_SALES_SCHEDULES_INX-REQ_DATE   = ABAP_TRUE.
      LT_SALES_SCHEDULES_INX-REQ_QTY    = ABAP_TRUE.

      APPEND: LT_SALES_SCHEDULES_IN, LT_SALES_SCHEDULES_INX.
      CLEAR:  LT_SALES_SCHEDULES_IN, LT_SALES_SCHEDULES_INX.


      LT_SALES_CONDITIONS_IN-ITM_NUMBER  = LV_POSNR.
      LT_SALES_CONDITIONS_IN-COND_TYPE   = 'ZP01'.    " 条件类型 定价条件
      LT_SALES_CONDITIONS_IN-COND_VALUE  = LS_ITEM-ZPRICE. " 价格 定价比率
      LT_SALES_CONDITIONS_IN-CURRENCY    = 'CNY'.          " 货币码


      LT_SALES_CONDITIONS_INX-ITM_NUMBER = LV_POSNR.
      LT_SALES_CONDITIONS_INX-COND_TYPE  = 'ZP01'.
      LT_SALES_CONDITIONS_INX-CURRENCY   = ABAP_TRUE.
      LT_SALES_CONDITIONS_INX-COND_VALUE = ABAP_TRUE.
*
      APPEND: LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX.
      CLEAR:  LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX .

    ENDLOOP.


    CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
      EXPORTING
*       SALESDOCUMENT        =
        SALES_HEADER_IN      = LS_SALES_HEADER_IN
        SALES_HEADER_INX     = LS_SALES_HEADER_INX
*       SENDER               =
*       BINARY_RELATIONSHIPTYPE       = ' '
*       INT_NUMBER_ASSIGNMENT         = ' '
*       BEHAVE_WHEN_ERROR    = ' '
*       LOGIC_SWITCH         = ' '
*       BUSINESS_OBJECT      = ' '
*       TESTRUN              =
*       CONVERT_PARVW_AUART  = ' '
*       STATUS_BUFFER_REFRESH         = 'X'
*       CALL_ACTIVE          = ' '
*       I_WITHOUT_INIT       = ' '
      IMPORTING
        SALESDOCUMENT_EX     = LV_VBELN
*       SALES_HEADER_OUT     =
*       SALES_HEADER_STATUS  =
      TABLES
        RETURN               = LT_RETURN[]
        SALES_ITEMS_IN       = LT_SALES_ITEMS[]
        SALES_ITEMS_INX      = LT_SALES_ITEMSX[]
        SALES_PARTNERS       = LT_SALES_PARTNERS[]
        SALES_SCHEDULES_IN   = LT_SALES_SCHEDULES_IN
        SALES_SCHEDULES_INX  = LT_SALES_SCHEDULES_INX
        SALES_CONDITIONS_IN  = LT_SALES_CONDITIONS_IN[]
        SALES_CONDITIONS_INX = LT_SALES_CONDITIONS_INX[]
*       SALES_CFGS_REF       =
*       SALES_CFGS_INST      =
*       SALES_CFGS_PART_OF   =
*       SALES_CFGS_VALUE     =
*       SALES_CFGS_BLOB      =
*       SALES_CFGS_VK        =
*       SALES_CFGS_REFINST   =
*       SALES_CCARD          =
        SALES_TEXT           = LT_SALES_TEXT[]
*       SALES_KEYS           =
*       SALES_CONTRACT_IN    =
*       SALES_CONTRACT_INX   =
*       EXTENSIONIN          =
*       PARTNERADDRESSES     =
*       SALES_SCHED_CONF_IN  =
*       ITEMS_EX             =
*       SCHEDULE_EX          =
*       BUSINESS_EX          =
*       INCOMPLETE_LOG       =
*       EXTENSIONEX          =
*       CONDITIONS_EX        =
        PARTNERS_EX          = LT_PARTNERS_EX[]
*       TEXTHEADERS_EX       =
*       TEXTLINES_EX         =
*       BATCH_CHARC          =
*       CAMPAIGN_ASGN        =
*       SALES_ETAX           =
*       SALES_ETAXX          =
*       SALES_TRANSP         =
*       SALES_TRANSPX        =
      .
    DELETE LT_RETURN WHERE  TYPE <> 'E'
                       AND TYPE <> 'A'.
    IF LT_RETURN[] IS INITIAL AND LV_VBELN IS NOT INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      LT_OUT-VBELN    = LV_VBELN .
      LT_OUT-ZMESSAGE = '订单创建成功!'.
      APPEND LT_OUT .
      CLEAR LT_OUT .
      ZTYPE    = 'S'.
      ZMESSAGE = 'Successful'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      LOOP AT LT_RETURN WHERE TYPE = 'E'.
        CLEAR LV_MSG .
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            MSGID               = LT_RETURN-ID
            MSGNR               = LT_RETURN-NUMBER
            MSGV1               = LT_RETURN-MESSAGE_V1
            MSGV2               = LT_RETURN-MESSAGE_V2
            MSGV3               = LT_RETURN-MESSAGE_V3
            MSGV4               = LT_RETURN-MESSAGE_V4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_MSG.
        ZTYPE = 'E'.
        ZMESSAGE = ZMESSAGE && LV_MSG .
        EXIT.
      ENDLOOP.
      LT_OUT-ZMESSAGE = '订单创建失败,请检查!'&& ZMESSAGE.
      APPEND LT_OUT .
      CLEAR LT_OUT .
    ENDIF.

  ENDLOOP.
  CALL METHOD /UI2/CL_JSON=>SERIALIZE
    EXPORTING
      DATA   = LT_OUT[]
    RECEIVING
      R_JSON = ZDATA_OUT.


ENDFUNCTION.

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值