首页 > 其他分享 >ABAP:采购订单创建BAPI

ABAP:采购订单创建BAPI

时间:2022-12-16 16:55:53浏览次数:49  
标签:poheader BAPI TYPE zsdt007 lv 订单 ABAP ls poitem

采购订单创建BAPI:BAPI_PO_CREATE1

DATA:lt_zsdt008 LIKE TABLE OF zsdt008,
       ls_zsdt008 LIKE LINE OF lt_zsdt008,
       ls_zsdt001 TYPE zsdt001,
       lt_zsdt007 LIKE TABLE OF zsdt007,
       ls_zsdt007 LIKE LINE OF lt_zsdt007,
       r_zjylx    TYPE zrfcid.

  "获取采购源头数据
  CLEAR:lt_zsdt007,ls_zsdt007.
  SELECT * INTO TABLE lt_zsdt007 FROM zsdt007 WHERE zrfc_logid = i_id.

  IF lt_zsdt007 IS INITIAL.
    e_code = 'E'.
    e_msg  = '无可执行数据'.
    RETURN.
  ENDIF.

  READ TABLE lt_zsdt007 INTO ls_zsdt007 INDEX 1.

  IMPORT r_zjylx FROM MEMORY ID 'ZSDU001_F01_T001_LX'.

  IF r_zjylx IS INITIAL.
    r_zjylx = ls_zsdt007-zrfcid.
  ENDIF.

  CLEAR:ls_zsdt001.
  SELECT SINGLE *
    INTO ls_zsdt001
    FROM zsdt001
   WHERE zrfcid = r_zjylx
     AND canum = i_canum.
  PERFORM create_po TABLES lt_zsdt007 et_return USING i_id i_canum ls_zsdt001 CHANGING e_code e_msg e_flow_end.

FORM create_po  TABLES   p_lt_zsdt007    STRUCTURE zsdt007
                         p_et_return  STRUCTURE  zrfct005
                USING    p_i_id       TYPE zrfc_logid
                         p_i_canum    TYPE canum
                         p_ls_zsdt001 TYPE zsdt001
                CHANGING p_e_code     TYPE msgty
                         p_e_msg      TYPE msgtxt
                         p_e_flow_end TYPE char1.

  DATA:poheader    TYPE bapimepoheader,
       poheaderx   TYPE bapimepoheaderx,
       poitem      LIKE TABLE OF bapimepoitem        WITH HEADER LINE,
       poitemx     LIKE TABLE OF bapimepoitemx       WITH HEADER LINE,
       poschedule  LIKE TABLE OF bapimeposchedule    WITH HEADER LINE,
       poschedulex LIKE TABLE OF bapimeposchedulx    WITH HEADER LINE,
       pocond      LIKE TABLE OF bapimepocond        WITH HEADER LINE,
       pocond2     LIKE TABLE OF bapimepocond        WITH HEADER LINE,
       pocondx     LIKE TABLE OF bapimepocondx       WITH HEADER LINE,
       pocondx2    LIKE TABLE OF bapimepocondx       WITH HEADER LINE,
       popartner   LIKE TABLE OF bapiekkop           WITH HEADER LINE,
       return      LIKE TABLE OF bapiret2            WITH HEADER LINE,
       l_eblen     TYPE ebeln,
       lt_zsdt008  LIKE TABLE OF zsdt008,
       ls_zsdt008  LIKE LINE OF lt_zsdt008.
  DATA:ls_zsdt007 TYPE zsdt007.
  DATA:ls_zrfct002 TYPE zrfct002.
  DATA:ls_source TYPE TABLE OF zrfcs001,
       lv_waerk  TYPE waerk.
  CLEAR:poheader,
        poheaderx,
        lv_waerk,
        poitem[],poitem,
        poitemx[],poitem,
        poschedule[],poschedule,
        poschedulex[],poschedulex,
        pocond[],pocond,
        pocondx[],pocondx,
        return[],return.
  DATA:ls_zsdt007_1 TYPE zsdt007.
  DATA:lv_mtart TYPE mara-mtart.
  DATA:ebelp TYPE ekpo-ebelp.
  CLEAR:ebelp.

  DATA:lv_buspartno_dp TYPE gparn,
       lv_buspartno_mn TYPE gparn,
       lv_buspartno_se TYPE gparn,
       lv_buspartno_vd TYPE gparn.
  DATA:lv_menge_in  TYPE ekpo-menge,
       lv_menge_out TYPE ekpo-menge,
       lv_matnr     TYPE mara-matnr,
       lv_meins_in  TYPE mara-meins,
       lv_meins_out TYPE mara-meins.
  IMPORT gv_waerk TO lv_waerk FROM MEMORY ID 'ZSDU001_F01_T001'.
  DATA:lv_from_cur TYPE bapi1093_1-from_curr,
       lv_to_cur   TYPE bapi1093_1-to_currncy,
       ls_rate     TYPE bapi1093_0,
       ls_return   TYPE bapiret1.

  DATA:lv_lifnr TYPE lifnr,
       lv_ekorg TYPE ekorg,
       lv_bukrs TYPE bukrs.
  DATA:lv_menge TYPE bapimepoitem-quantity.
  SORT p_lt_zsdt007 BY lifnr bukrs ekorg.
  DATA:lv_string TYPE p DECIMALS 10.
  LOOP AT p_lt_zsdt007 INTO ls_zsdt007.
    ebelp = ebelp + 10.
    MOVE-CORRESPONDING ls_zsdt007 TO ls_zsdt007_1.
****按照供应商+采购组织进行拆分创建采购订单
    AT FIRST.

      poheader-doc_type    = ls_zsdt007_1-bsart. "订单类型(采购)
      poheader-vendor      = ls_zsdt007_1-lifnr. "供应商
****UPDATE BY JT 20221128 S 抬头数据赋值调整
      IF poheader-doc_type = 'ZITO' OR poheader-doc_type = 'ZFTO'.

*      poheader-purch_org   = ls_zsdt007_1-ekorg. "采购组织
*      poheader-pur_group   = ls_zsdt007_1-ekgrp. "采购组
        IF ls_zsdt007_1-ekorg IS NOT INITIAL.
          poheader-purch_org = ls_zsdt007_1-ekorg.
        ELSE.
          poheader-purch_org = p_ls_zsdt001-ekorg.
        ENDIF.

        IF ls_zsdt007_1-ekgrp IS NOT INITIAL.
          poheader-pur_group = ls_zsdt007_1-ekgrp.
        ELSE.
          poheader-pur_group = p_ls_zsdt001-ekgrp.
        ENDIF.
      ELSE.
        poheader-purch_org   = ls_zsdt007_1-ekorg. "采购组织
        poheader-pur_group   = ls_zsdt007_1-ekgrp. "采购组
      ENDIF.

      poheader-comp_code   = ls_zsdt007_1-bukrs. "公司代码
      poheader-ref_1       = ls_zsdt007_1-ihrez. "您得参考
*      poheader-doc_date    = sy-datum.         "凭证日期
      poheader-doc_date = ls_zsdt007_1-bedat. "凭证日期
      poheader-langu       = sy-langu.         "语言


*      IF p_ls_zsdt001-waers IS NOT INITIAL.
      poheader-currency    = p_ls_zsdt001-waers. "采购订单货币
*      ELSE.
*        poheader-currency    = ls_zsdt007-koein. "货币
*      ENDIF.

****UPDATE BY JT 20221128 E  抬头数据赋值调整
      poheaderx-doc_type   = 'X'.
      poheaderx-vendor     = 'X'.
      poheaderx-purch_org  = 'X'.
      poheaderx-pur_group  = 'X'.
      poheaderx-comp_code  = 'X'.
      poheaderx-ref_1      = 'X'.
      poheaderx-doc_date   = 'X'.
      poheaderx-langu      =  'X'.
      poheaderx-currency   = 'X'."货币
    ENDAT.
*    AT NEW banfn. "采购订单抬头数据

*    ENDAT.

    "采购订单行项目数据
    poitem-po_item  = ebelp.
    poitemx-po_item = ebelp.
    poitem-material = ls_zsdt007-matnr."物料
    poitemx-material = 'X'.

    poitem-plant = ls_zsdt007-werks."工厂
    poitemx-plant = 'X'.
    IF ls_zsdt007-retpo <> 'X'."退货项目判断
*      IF ls_zsdt007-werks = '7888'.
*        SELECT SINGLE lgfsb INTO poitem-stge_loc FROM marc WHERE matnr = ls_zsdt007-matnr AND werks = ls_zsdt007-werks.
*      ELSE.
*        CLEAR:lv_mtart.
*        SELECT SINGLE mtart INTO lv_mtart FROM mara WHERE matnr = ls_zsdt007-matnr.
*        SELECT SINGLE lgort INTO poitem-stge_loc FROM zsdt003 WHERE mtart = lv_mtart AND werks = ls_zsdt007-werks.
*      ENDIF.

      poitem-preq_no = ls_zsdt007-banfn."采购申请
      poitemx-preq_no = 'X'.
      poitem-preq_item = ls_zsdt007-bnfpo."采购申请项目
      poitemx-preq_item = 'X'.
    ELSE.
      poitem-stge_loc = ls_zsdt007-lgort.
      poitem-ret_item = 'X'."退货
      poitemx-ret_item = 'X'.
    ENDIF.
    poitemx-stge_loc = 'X'.
*    SELECT SINGLE
    poitem-quantity = ls_zsdt007-menge.

****UPDATE BY JT 20221128 S 行项目数量及单位
    IF poheader-doc_type = 'ZITO' OR poheader-doc_type = 'ZFTO'.
      SELECT SINGLE meins FROM eban
                          INTO poitem-po_unit
                         WHERE banfn = ls_zsdt007-banfn
                           AND bnfpo = ls_zsdt007-bnfpo.


*      SELECT SINGLE meins FROM zsdt035 INTO poitem-po_unit WHERE werks = ls_zsdt007-werks
*                                                             AND matnr = ls_zsdt007-matnr
*                                                             AND datab <= sy-datum
*                                                             AND datbi >= sy-datum.
    ENDIF.

    IF poheader-doc_type = 'ZIMP' OR
       poheader-doc_type = 'ZAIM' OR
       poheader-doc_type = 'ZFAI' OR
       poheader-doc_type = 'ZPTO'.

      SELECT SINGLE meins FROM eban
                          INTO @DATA(lv_meins)
                         WHERE banfn = @ls_zsdt007-banfn
                           AND bnfpo = @ls_zsdt007-bnfpo.
      poitem-po_unit = ls_zsdt007-bprme.

      IF poitem-po_unit NE lv_meins AND ls_zsdt007-umrez NE 0.
        lv_string = poitem-quantity * ls_zsdt007-umren / ls_zsdt007-umrez.

        CALL FUNCTION 'ROUND'
          EXPORTING
            decimals = 3
            input    = lv_string
            sign     = '-'
          IMPORTING
            output   = poitem-quantity.
      ENDIF.
      lv_menge = poitem-quantity.
      CLEAR:lv_meins.
    ELSE.
      lv_menge = ls_zsdt007-menge."数量
    ENDIF.
****UPDATE BY JT 20221128  E 行项目数量及单位
*    SELECT SINGLE meins FROM mara INTO @DATA(lv_meins) WHERE matnr = @ls_zsdt007-matnr."单位
*    SELECT SINGLE * INTO @DATA(ls_eina) FROM eina WHERE matnr = @ls_zsdt007-matnr AND lifnr = @poheader-vendor.
*    IF ls_eina-meins IS INITIAL.
*      SELECT SINGLE bstme FROM mara INTO poitem-po_unit WHERE matnr = ls_zsdt007-matnr."单位
*      IF poitem-po_unit IS INITIAL.
*        SELECT SINGLE meins FROM mara INTO poitem-po_unit WHERE matnr = ls_zsdt007-matnr."单位
*      ELSE.
*        IF poitem-po_unit NE lv_meins.
*          CLEAR:lv_menge_in,lv_matnr,lv_meins_in,lv_meins_out,lv_menge_out.
*          lv_menge_in = ls_zsdt007-menge.
*          lv_meins_out = poitem-po_unit.
*          lv_meins_in = lv_meins.
*          lv_matnr = ls_zsdt007-matnr.
*          CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
*            EXPORTING
*              i_matnr              = lv_matnr
*              i_in_me              = lv_meins_in
*              i_out_me             = lv_meins_out
*              i_menge              = lv_menge_in
*            IMPORTING
*              e_menge              = lv_menge_out
*            EXCEPTIONS
*              error_in_application = 1
*              error                = 2
*              OTHERS               = 3.
*          poitem-po_unit = lv_meins_out.
*          poitem-quantity = lv_menge_out.
*        ENDIF.
*
*      ENDIF.
*    ELSE.
*      IF ls_eina-meins NE lv_meins.
*        poitem-quantity = ls_zsdt007-menge * ls_eina-umren / ls_eina-umrez.
*        poitem-po_unit = ls_eina-meins.
*      ELSE.
*        poitem-quantity = ls_zsdt007-menge.
*        poitem-po_unit = ls_eina-meins.
*      ENDIF.
*    ENDIF.
*    CLEAR:lv_meins.
*    poitem-quantity = lv_menge_out."数量
    poitemx-quantity = 'X'.
    poitemx-po_unit = 'X'.
****UPDATE BY JT 20221128 S 税码
*    poitem-tax_code = ls_zsdt007-mwskz. " 税码
    IF p_ls_zsdt001-mwskz IS NOT INITIAL.
      poitem-tax_code = p_ls_zsdt001-mwskz.
    ELSE.
      poitem-tax_code = ls_zsdt007-mwskz.
    ENDIF.
****UPDATE BY JT 20221128 E 税码
    poitemx-tax_code  = 'X'.
    poitem-no_rounding = 'X'.
    poitemx-no_rounding = 'X'.
    APPEND:poitem,poitemx.
    CLEAR:poitem,poitemx.

    poschedule-po_item = ebelp."行项目
    poschedulex-po_item = ebelp.
    poschedule-del_datcat_ext = 'D'.           "交货日期的类别
    poschedulex-del_datcat_ext = 'X'.

    IF ls_zsdt007-retpo <> 'X'. "退货项目
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = ls_zsdt007-banfn
        IMPORTING
          output = ls_zsdt007-banfn.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = ls_zsdt007-bnfpo
        IMPORTING
          output = ls_zsdt007-bnfpo.
      "交货日期
      poschedule-delivery_date = ls_zsdt007-lfdat.
    ELSE.
      poschedule-delivery_date = sy-datum.
    ENDIF.
    poschedulex-delivery_date = 'X'.
*    poschedule-quantity = ls_zsdt007-menge."数量
    poschedule-quantity = lv_menge.
    CLEAR:lv_menge.
    poschedulex-quantity = 'X'.
    APPEND:poschedule,poschedulex.
    CLEAR:poschedule,poschedulex.


    pocond-itm_number = ebelp.
    pocond-cond_type = 'PB00'.    " Give the pricing condition type that derives netprice
    pocond-cond_value = ls_zsdt007-brtwr.

    IF poheader-doc_type = 'ZIMP' OR
       poheader-doc_type = 'ZAIM' OR
       poheader-doc_type = 'ZFAI' OR
       poheader-doc_type = 'ZPTO'.
      pocond-currency = ls_zsdt007-koein.
      pocond-cond_unit = ls_zsdt007-kmein.
      pocondx-cond_unit = 'X'.

      pocond-numconvert = ls_zsdt007-kumza.
      pocondx-numconvert = 'X'.

      pocond-denominato = ls_zsdt007-kumne.
      pocondx-denominato = 'X'.
    ENDIF.
*    pocond-change_id = 'U'.
*====================================================================*
    "*== add Tuq 17.11.2022 12:12:51
*    IF poheader-doc_type = 'ZITO' OR poheader-doc_type = 'ZFTO'.
*      pocond-cond_value = ls_zsdt007-brtwr * ls_zsdt007-kpein.
*    ELSE.

*    ENDIF.
    "*== end Tuq 17.11.2022 12:12:51
****UPDATE BY JT 20221128 S 条件货币
*    pocond-currency = ls_zsdt007-koein.


****UPDATE BY JT 20221128 S 条件货币
    pocond-cond_p_unt = ls_zsdt007-kpein.


    IF poheader-doc_type = 'ZITO' OR poheader-doc_type = 'ZFTO'.
*      SELECT SINGLE waers INTO pocond-currency FROM zsdt035 WHERE werks = ls_zsdt007-werks
*                                                              AND matnr = ls_zsdt007-matnr
*                                                              AND datab <= sy-datum
*                                                              AND datbi >= sy-datum.
      pocond-itm_number = ebelp.
      pocond-currency = ls_zsdt007-koein.
*      SELECT SINGLE meins FROM mara INTO poitem-po_unit WHERE matnr = ls_zsdt007-matnr."单位
*      poitem-quantity = ls_zsdt007-menge.
      IF p_ls_zsdt001-kschl IS NOT INITIAL.
        SELECT COUNT(*)
        FROM a017
       WHERE lifnr = poheader-vendor
         AND matnr = ls_zsdt007-matnr
         AND ekorg = poheader-purch_org
         AND werks = ls_zsdt007-werks             "删除标识
         AND a017~datbi >= ls_zsdt007-bedat"sy-datum         "有效期至
         AND a017~datab <= ls_zsdt007-bedat" sy-datum        "有效期自
         AND a017~kschl = p_ls_zsdt001-kschl        "条件类型
         AND a017~esokz = '0'.
        IF sy-subrc = 0.
          pocond-change_id = 'U'.
          pocond-cond_type = p_ls_zsdt001-kschl.
        ELSE.
          SELECT COUNT(*)
            FROM a018
           WHERE lifnr = poheader-vendor
             AND matnr = ls_zsdt007-matnr
             AND ekorg = poheader-purch_org
             AND a018~datbi >= ls_zsdt007-bedat"sy-datum         "有效期至
             AND a018~datab <= ls_zsdt007-bedat"sy-datum        "有效期自
             AND a018~kschl = p_ls_zsdt001-kschl        "条件类型
             AND a018~esokz = '0'.
          IF sy-subrc = 0.
            pocond-change_id = 'U'.
            pocond-cond_type = p_ls_zsdt001-kschl .
          ELSE.
            pocond-change_id = 'U'.
            pocond-cond_type = 'PBXX'.
          ENDIF.
        ENDIF.
      ELSE.
        pocond-change_id = 'U'.
        pocond-cond_type = 'PBXX'.
      ENDIF.
    ENDIF.
    IF pocond-currency NE poheader-currency.
      CLEAR:lv_from_cur,lv_to_cur,ls_rate,ls_return.
      lv_from_cur = poheader-currency.
      lv_to_cur = pocond-currency.
      CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
        EXPORTING
          rate_type  = 'M'
          from_curr  = lv_from_cur
          to_currncy = lv_to_cur
          date       = sy-datum
        IMPORTING
          exch_rate  = ls_rate
          return     = ls_return.
      IF ls_return-type NE 'E'.
        pocond-conexchrat = ls_rate-exch_rate.
        pocondx-conexchrat = 'X'.
      ENDIF.
    ENDIF.
*    SELECT COUNT(*)
*      FROM a017
*      WHERE lifnr = poheader-vendor
*      AND matnr = ls_zsdt007-matnr
*      AND ekorg = ls_zsdt007-ekorg
*      AND werks = ls_zsdt007-werks              "删除标识
*      AND a017~datbi >= sy-datum         "有效期至
*      AND a017~datab <= sy-datum        "有效期自
*      AND a017~kschl = 'PB00'        "条件类型
*      AND a017~esokz = '0'.
*    IF sy-subrc = 0.
*      pocond-change_id = 'U'.
*    ELSE.
*      SELECT COUNT(*)
*        FROM a018
*        WHERE lifnr = poheader-vendor
*        AND matnr = ls_zsdt007-matnr
*        AND ekorg = ls_zsdt007-ekorg
*        AND a018~datbi >= sy-datum         "有效期至
*        AND a018~datab <= sy-datum        "有效期自
*        AND a018~kschl = 'PB00'        "条件类型
*        AND a018~esokz = '0'.
*      IF sy-subrc = 0.
*        pocond-change_id = 'U'.
*      ELSE.
*        pocond-change_id = 'I'.
*        pocond-cond_type = 'PBXX'.
*      ENDIF.
*    ENDIF.
*    pocond-change_id = 'U'.
    pocondx-itm_number = ebelp.
    pocondx-itm_numberx = 'X'.
    pocondx-cond_type = 'X'.
    pocondx-cond_value = 'X'.
    pocondx-currency = 'X'.
    pocondx-cond_p_unt = 'X'.
    pocondx-change_id = 'X'.
    IF poheader-doc_type = 'ZIMP' OR
       poheader-doc_type = 'ZAIM' OR
       poheader-doc_type = 'ZFAI' OR
       poheader-doc_type = 'ZPTO'.
      DO 2 TIMES.
        pocond-change_id = 'D'.
        IF sy-index = 2.
          pocond-change_id = 'I'.
        ENDIF.
        APPEND pocond.
        APPEND pocondx.
      ENDDO.
      pocond2-change_id = 'D'.
      pocond2-cond_type = 'PBXX'.
      pocond2-itm_number = ebelp.
      APPEND pocond2 TO pocond.
      CLEAR:pocond2.
      pocondx2-change_id = 'X'.
      pocondx2-cond_type = 'X'.
      pocondx2-itm_number = 'X'.
      APPEND pocondx2 TO pocondx.
      CLEAR:pocondx2.
    ELSE.
      APPEND pocond.
      APPEND pocondx.
    ENDIF.
    CLEAR:pocond,pocondx.
    CLEAR:ls_zsdt007_1,ls_zsdt007.
  ENDLOOP.

  DATA:ls_zsdt001 TYPE zsdt001,
       lt_zsdt001 TYPE TABLE OF zsdt001.

  SELECT * INTO TABLE lt_zsdt001 FROM zsdt001 WHERE zrfcid = p_ls_zsdt001-zrfcid.

  IF poheader-doc_type = 'ZITO' OR poheader-doc_type = 'ZFTO'.
    READ TABLE p_lt_zsdt007 INTO ls_zsdt007 INDEX 1.

    IF ls_zsdt007-zjsgc IS NOT INITIAL.
      lv_buspartno_dp = ls_zsdt007-zjsgc.
    ELSE.
      READ TABLE lt_zsdt001 INTO ls_zsdt001 WITH KEY canum = '0040'.
      lv_buspartno_dp = ls_zsdt001-werks.
    ENDIF.
    IF lv_buspartno_dp IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_buspartno_dp
        IMPORTING
          output = lv_buspartno_dp.
      popartner-partnerdesc = 'DP'.
      popartner-langu = sy-langu.
      popartner-buspartno = lv_buspartno_dp.
      APPEND popartner.
      CLEAR:popartner.
    ENDIF.
    IF ls_zsdt007-zjhgc IS NOT INITIAL.
      lv_buspartno_mn = ls_zsdt007-zjhgc.
    ELSE.
      READ TABLE lt_zsdt001 INTO ls_zsdt001 WITH KEY canum = '0010'.
      lv_buspartno_mn = ls_zsdt001-zwerks.
    ENDIF.
    IF lv_buspartno_mn IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_buspartno_mn
        IMPORTING
          output = lv_buspartno_mn.
      popartner-partnerdesc = 'MN'.
      popartner-langu = sy-langu.
      popartner-buspartno = lv_buspartno_mn.
      APPEND popartner.
      CLEAR:popartner.
    ENDIF.
  ENDIF.

  IF poheader-doc_type = 'ZPTO'.
    READ TABLE p_lt_zsdt007 INTO ls_zsdt007 INDEX 1.
    IF ls_zsdt007-zjsgc IS NOT INITIAL.
      lv_buspartno_dp = ls_zsdt007-zjsgc.
    ELSE.
      READ TABLE lt_zsdt001 INTO ls_zsdt001 WITH KEY canum = '0040'.
      lv_buspartno_dp = ls_zsdt001-werks.
    ENDIF.
    IF lv_buspartno_dp IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_buspartno_dp
        IMPORTING
          output = lv_buspartno_dp.
      popartner-partnerdesc = 'DP'.
      popartner-langu = sy-langu.
      popartner-buspartno = lv_buspartno_dp.
      APPEND popartner.
      CLEAR:popartner.
    ENDIF.

    IF ls_zsdt007-zzcgc IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = ls_zsdt007-zzcgc
        IMPORTING
          output = lv_buspartno_se.
      popartner-partnerdesc = 'SE'.
      popartner-langu = sy-langu.
      popartner-buspartno = lv_buspartno_se.
      APPEND popartner.
      CLEAR:popartner.
    ENDIF.

    IF ls_zsdt007-zcggys IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = ls_zsdt007-zcggys
        IMPORTING
          output = lv_buspartno_vd.
      popartner-partnerdesc = 'VD'.
      popartner-langu = sy-langu.
      popartner-buspartno = lv_buspartno_vd.
      APPEND popartner.
      CLEAR:popartner.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader         = poheader
      poheaderx        = poheaderx
      no_price_from_po = 'X'
    IMPORTING
      exppurchaseorder = l_eblen
    TABLES
      return           = return
      poitem           = poitem
      poitemx          = poitemx
      poschedule       = poschedule
      poschedulex      = poschedulex
      pocond           = pocond
      pocondx          = pocondx
      popartner        = popartner.

  LOOP AT return WHERE type = 'E' OR type = 'A'.
    CONCATENATE p_e_msg return-message INTO p_e_msg SEPARATED BY '/'.
  ENDLOOP.
  IF sy-subrc <> '0'.
    CALL METHOD zcl_rfc=>get_source
      EXPORTING
        i_id       = p_i_id
        i_canum    = p_i_canum
      IMPORTING
        e_zrfct002 = ls_zrfct002.
*      RECEIVING
*        R_SOURCE   = LS_SOURCE.

    CLEAR:ls_zsdt008.
    ls_zsdt008-canum      = ls_zrfct002-canum.
    ls_zsdt008-objtype    = ls_zrfct002-objtype_save.
    ls_zsdt008-objkey     = l_eblen.
    ls_zsdt008-zrfcid     = ls_zrfct002-zrfcid.
    ls_zsdt008-zrfc_logid = p_i_id.
    APPEND ls_zsdt008 TO lt_zsdt008.

    MODIFY zsdt008 FROM TABLE lt_zsdt008.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    p_e_code = 'S'.
    CONCATENATE 'PO:' l_eblen '创建成功' INTO p_e_msg.
    DATA:ls_zrfct005 TYPE zrfct005.
    CLEAR:ls_zrfct005.
    ls_zrfct005-status = '53'.
    ls_zrfct005-msgty = p_e_code.
    ls_zrfct005-msgid = '00'.
    ls_zrfct005-msgno = '001'.
    ls_zrfct005-msgv1 = p_e_msg.
    ls_zrfct005-msgv4 = l_eblen.
    APPEND ls_zrfct005 TO p_et_return.
*    P_ET_RETURN[] = VALUE #( (
*                            STATUS = '53'  "通过状态53来保存KEY数据
*                            MSGTY = P_E_CODE
*                            MSGID = '00'
*                            MSGNO = '001'
*                            MSGV1 = P_E_MSG
*                            MSGV4 = L_EBLEN ) ).

*------------------写入长文本-------------------
    DATA:ls_ekpo TYPE ekpo,
         lt_ekpo TYPE TABLE OF ekpo.
    DO 20 TIMES.
      SELECT * INTO TABLE lt_ekpo FROM ekpo WHERE ebeln = l_eblen.
      IF sy-subrc = 0.
        EXIT.
      ENDIF.
      WAIT UP TO '0.1' SECONDS.
    ENDDO.

    LOOP AT lt_ekpo INTO ls_ekpo.
      READ TABLE p_lt_zsdt007 INTO ls_zsdt007 INDEX sy-tabix.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.
      IF ls_zsdt007-ztext1 IS NOT INITIAL.
        PERFORM  frm_text_save USING 'F07' ls_zsdt007-ztext1 ls_ekpo-ebeln ls_ekpo-ebelp 'EKPO'.
      ENDIF.
      IF ls_zsdt007-ztext2 IS NOT INITIAL.
        PERFORM  frm_text_save USING 'F01' ls_zsdt007-ztext2 ls_ekpo-ebeln ls_ekpo-ebelp 'EKPO'.
      ENDIF.
      IF ls_zsdt007-ztext3 IS NOT INITIAL.
        PERFORM  frm_text_save USING 'F02' ls_zsdt007-ztext3 ls_ekpo-ebeln ls_ekpo-ebelp 'EKPO'.
      ENDIF.
      IF ls_zsdt007-ztext4 IS NOT INITIAL.
        PERFORM  frm_text_save USING 'F03' ls_zsdt007-ztext4 ls_ekpo-ebeln ls_ekpo-ebelp 'EKPO'.
      ENDIF.
    ENDLOOP.
*------------------写入长文本-------------------
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    p_e_code = 'E'.
  ENDIF.
ENDFORM.   

 

标签:poheader,BAPI,TYPE,zsdt007,lv,订单,ABAP,ls,poitem
From: https://www.cnblogs.com/ap-ad-java-abap/p/16987775.html

相关文章