Upload PO

*&---------------------------------------------------------------------*
*& Progarm      :  ZPPR006                        Author : Jimmy Wong
*& Created      :  21 Sep 2012                    App    : PP
*& Title        :  Upload PO Data
*& Description  :  Upload PO Data
*&---------------------------------------------------------------------*
*&  Version       Author      Date        description
*&                Jimmy       21 Sep 2012 the first version
*&                Jimmy       06 Mar 2013 Add Auto generate PO Number & PO Item
*&  the last update time  2013.03.06 17:00
*&---------------------------------------------------------------------*

report  zppr006 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : rlgrap.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
data:begin of it_record occurs 0,
      order type i,
      bsart like ekko-bsart,  "Order Type
      ebeln like ekko-ebeln,  "PO
      lifnr like ekko-lifnr,  "Vendor
      lifnr_c like ekko-lifnr,  "Vendor
      bedat like ekko-bedat,  "Doc. Date
      bedat_c type length 10,
      zterm like ekko-zterm,  "Payment Terms
      inco1 like ekko-inco1,  "Incoterms
      waers like ekko-waers,  "currency
      ekorg like ekko-ekorg,  "Purchasing Org
      ekgrp like ekko-ekgrp,  "Purchasing Group
      bukrs like ekko-bukrs,  "Company Code
      ebelp like ekpo-ebelp,  "Item Number PO
      ebelp_c like ekpo-ebelp,  "Item Number PO
      pstyp like ekpo-pstyp,  "Item category in purchasing document
      epstp like t163y-epstp,
      matnr like ekpo-matnr,  "Material Number
      matnr_c type length 20,
      menge like ekpo-menge,  "quantity
      menge_c type  length 18,
      menge_r like ekpo-menge,  "quantity
      bstrf like marc-bstrf,
      meins like ekpo-meins,  "Order Unit
      meins_c type  length 3,
      eindt like eket-eindt,  "Delivery date
      eindt_c type  length 10,
      netpr like ekpo-netpr,  "Net Price
      netpr_c  type  length 17,
      waers_d like ekko-waers,  "Currency
      waers_dc type  length 5,
      peinh like ekpo-peinh,  "Price unit
      peinh_c type  length 5,
      werks like ekpo-werks,  "Plant
      lgort like ekpo-lgort,  "Storage location
      message type length 700,
    end of it_record.
data: it_err like it_record occurs with header line.
data: it_err2 like it_record occurs with header line.
data: it_err3 like it_record occurs with header line.
types:lv_type type length 50.
data:begin of itab occurs 0,
      bsart type lv_type,
      ebeln  type lv_type,
      lifnr_c type lv_type,
      bedat_c type lv_type,
      zterm type lv_type,
      inco1 type lv_type,
      waers type lv_type,
      ekorg type lv_type,
      ekgrp type lv_type,
      bukrs type lv_type,
      ebelp_c type lv_type,
      epstp type lv_type,
      matnr_c type lv_type,
      menge_c type lv_type,
      meins_c type lv_type,
      eindt_c type lv_type,
      netpr_c type lv_type,
      waers_dc type lv_type,
      peinh_c type lv_type,
      werks type lv_type,
      lgort type lv_type,
    end of itab.
data:begin of it_tab occurs 0.
        include structure itab.
data: message(700type c,
    end of it_tab.
data:begin of it_ebeln occurs 0,
     lifnr like ekko-lifnr,  "Vendor
     ekgrp like ekko-ekgrp,  "Purchasing Group
     ebeln like ekko-ebeln,
     message type length 700,
     end of it_ebeln.
data:it_ebeln_err like it_ebeln occurs with header line.
data: msg   type string,
      lv_tabix like sy-tabix,
      wa_tabix like sy-tabix.
data: p_header like bapimepoheader ,                       "for pr to po header
      p_headerx like bapimepoheaderx .
data: p_item like table of bapimepoitem with header line ,  "for pr to po item
      it_return like table of bapiret2 with header line ,
      p_itemx like table of bapimepoitemx with header line ,
      p_schedule like table of bapimeposchedule with header line ,
      p_schedulex like table of bapimeposchedulx with header line ,
      ex_ebeln like bapimepoheader-po_number,
      p_cond like table of bapimepocond with header line,
      p_condx like table of bapimepocondx with header line,
      i_item like table of bapimepoitem with header line,
      i_itemx like table of bapimepoitemx with header line .
data: begin of it_down occurs 0,
          line(1000type c,
end of it_down .
data: begin of i_file occurs 0,
        line(1000type c,
      end of i_file.
data: gv_file like rlgrap-filename.
data: purchaseorder type bapimmpara-po_number,
      po_rel_code1 type bapimmpara-po_rel_cod,
      po_rel_code2 type bapimmpara-po_rel_cod,
      po_rel_code3 type bapimmpara-po_rel_cod,
      po_rel_code4 type bapimmpara-po_rel_cod,
      po_rel_code5 type bapimmpara-po_rel_cod.
data:lv_frgsx like ekko-frgsx ,
     return type standard table of bapireturn with header line.
include zsapinclude01.
*----------------------------------------------------------------------*
*  Parameter & Select-Options                                          *
*----------------------------------------------------------------------*
selection-screen begin of block with frame title text-001.
parameters filename type rlgrap-filename obligatory.
parameters: pr_error like rlgrap-filename default '/usr/sap/tmp'.
parameters: p_test as checkbox   .
parameters: p_auto as checkbox   .
selection-screen end of block 1.
*-----------------------------------
*----------------------------------------------------------------------*
*  Initialize                                                          *
*----------------------------------------------------------------------*
initialization.
*----------------------------------------------------------------------*
*  AT SELECTION-SCREEN
*----------------------------------------------------------------------*
at selection-screen on value-request for filename.
  perform f4_filename using filename.

at selection-screen on value-request for  pr_error.
  perform f4_filename using pr_error.
*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
  refresh:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
  clear:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
  perform get_data.
  perform get_it_record.
  "perform process_data.
  perform check_it_record.
  if p_auto 'X'.
    perform create_po_autopono.
  else.
    perform create_po.
  endif.
  perform display_result.

end-of-selection.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_data .
  data: p_subrc like sy-subrc.
  if p_test 'X'.
    clear:itab,itab[] .
    perform upload_local tables itab  using  filename  changing  p_subrc.
    if p_subrc ne 0.
      clear : msg.
      concatenate 'Upload Filename ' filename  ' Is Error!' into msg.
      message msg type 'I'.
      exit.
    endif.
  else.
    clear:i_file,i_file[].
    perform upload_server tables i_file using filename changing  p_subrc.
    if sy-subrc ne 0.
      clear : msg.
      concatenate 'Upload Filename ' filename  ' Is Error!' into msg.
      message msg type 'I'.
      exit.
    endif.
    if not i_file[] is initial.
      loop at i_file.
        split i_file-line at cl_abap_char_utilities=>horizontal_tab
                                 into itab-bsart itab-ebeln
                                      itab-lifnr_c itab-bedat_c itab-zterm itab-inco1
                                      itab-waers itab-ekorg itab-ekgrp itab-bukrs
                                      itab-ebelp_c itab-epstp itab-matnr_c
                                      itab-menge_c itab-meins_c itab-eindt_c itab-netpr_c
                                      itab-waers_dc itab-peinh_c itab-werks itab-lgort .
        append itab.
        clear:itab.
      endloop.
    endif.
  endif.
endform.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  GET_IT_RECORD2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_it_record.
  data:lv_order type i.
  check not itab[] is initial.
  lv_order 1.
  loop at itab.
    move-corresponding itab to it_record.

    perform add_remove_pre_zero using it_record-lifnr_c  ''
                                changing it_record-lifnr.

    perform change_date_format using it_record-bedat_c ''
                              changing it_record-bedat.

    perform add_remove_pre_zero using it_record-ebelp_c  ''
                                changing it_record-ebelp.
    perform tranfer_material using it_record-matnr_c ''
                            changing it_record-matnr.

*    perform process_num using it_record-menge_c
*              changing it_record-menge.
    it_record-menge it_record-menge_c.
    it_record-meins it_record-meins_c.
    perform change_date_format using it_record-eindt_c ''
                              changing it_record-eindt.

    it_record-netpr it_record-netpr_c.
*    perform process_num using it_record-netpr_c
*              changing it_record-netpr.
    it_record-waers_d it_record-waers_dc .
*    perform process_num using  it_record-peinh_c
*              changing it_record-peinh.
    it_record-peinh it_record-peinh_c .
    it_record-order lv_order.
    append it_record.
    lv_order lv_order + 1.
    clear : it_record.
  endloop.
endform.                    " GET_IT_RECORD2
*&---------------------------------------------------------------------*
*&      Form  CHECK_IT_RECORD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form check_it_record .
  data: lv_flag2 type c,
        lv_bsart  like t161-bsart,
        lv_ebeln like ekko-ebeln,
        lv_lifnr like lfa1-lifnr,
        lv_zterm like t052-zterm,
        lv_inco1 like tinc-inco1,
        lv_waers like tcurc-waers,
        lv_ekorg like t024e-ekorg,
        lv_ekgrp like t024-ekgrp,
        lv_bukrs like t001-bukrs,
        lv_mtart like mara-mtart,
        lv_meins like t006-msehi,
        lv_werks like t001w-werks,
        lv_lgort like t001l-lgort  .
  clear: lv_flag2.
  loop at it_record.
    lv_tabix sy-tabix.
    clear:lv_flag2,it_record-message.
    " Order Type
    select  single bsart into lv_bsart
         from  t161
         where bsart it_record-bsart.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Order Type Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    if p_auto is initial.
      " PO NO.
      select single ebeln into lv_ebeln
            from ekko
            where ebeln it_record-ebeln.
      if sy-subrc eq 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' PO No. Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    " Vendor Code
    select single lifnr into lv_lifnr
        from lfa1
        where lifnr it_record-lifnr.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Vendor Code Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Doc. Date
    if it_record-bedat '00000000'.
      lv_flag2 'X'.
      concatenate it_record-message  ' Doc. Date Format MM/dd/yyyy.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Payment Terms
    if it_record-zterm ne space .
      select single zterm into lv_zterm
          from  t052
          where zterm it_record-zterm.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Payment Terms Not Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "Incoterms
    if it_record-inco1 ne space .
      select single inco1 into lv_inco1
          from tinc
          where inco1 it_record-inco1.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Incoterms Not Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "Currency
    if it_record-waers ne space .
      select single waers into lv_waers
          from tcurc
          where waers it_record-waers.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Currency Not Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "Purchasing Org.
    select single ekorg into lv_ekorg
        from t024e
        where ekorg it_record-ekorg.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Purchasing Org. Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Purchasing Group
    select single ekgrp into lv_ekgrp
        from t024
        where ekgrp it_record-ekgrp.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Purchasing Group Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Company Code
    select single bukrs into lv_bukrs
        from t001
        where bukrs it_record-bukrs.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Company Code Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Item Number
    if p_auto is initial.
      if it_record-ebelp is initial.
        lv_flag2 'X'.
        concatenate it_record-message  ' Item Number Error.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "Item category
    if it_record-epstp ne space .
      select single pstyp into it_record-pstyp
          from t163y
          where epstp it_record-epstp.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Item category Not Exists.'
               into it_record-message.
      endif.
      modify it_record index lv_tabix.
    endif.
    "Material Number
    select single mtart into lv_mtart
        from mara
        where matnr it_record-matnr.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Material Number Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Quantity
    if it_record-menge 0.
      lv_flag2 'X'.
      concatenate it_record-message
        ' Quantity = 0 is error.' into it_record-message.
      modify it_record index lv_tabix.
    elseif it_record-menge < 0.
      lv_flag2 'X'.
      concatenate it_record-message
        ' Quantity is negative or Quantity not is number.'
        into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Order Unit
    if it_record-meins ne space .
      select single msehi  into lv_meins
          from t006
          where msehi  it_record-meins.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Order Unit Not Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "Delivery date
    if it_record-eindt '00000000'.
      lv_flag2 'X'.
      concatenate it_record-message  ' Delivery date Format MM/dd/yyyy.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Net Price
*    if IT_RECORD-BSART+3(1) = '1'.
*      if IT_RECORD-NETPR = 0.
*        LV_FLAG = 'X'.
*        LV_FLAG2 = 'X'.
*        concatenate IT_RECORD-MESSAGE
*          ' Net Price = 0 is error.' into IT_RECORD-MESSAGE.
*        modify IT_RECORD index LV_TABIX.
*      elseif IT_RECORD-NETPR < 0.
*        LV_FLAG = 'X'.
*        LV_FLAG2 = 'X'.
*        concatenate IT_RECORD-MESSAGE
*          ' Net Price is negative or Net Price not is number.'
*          into IT_RECORD-MESSAGE.
*        modify IT_RECORD index LV_TABIX.
*      endif.
*    endif.
    "Price unit
    if it_record-peinh 0.
      lv_flag2 'X'.
      concatenate it_record-message
        ' Price unit = 0 is error.' into it_record-message.
      modify it_record index lv_tabix.
    elseif it_record-peinh < 0.
      lv_flag2 'X'.
      concatenate it_record-message
        ' Price unit is negative or Net Price not is number.'
        into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "plant
    select single werks into  lv_werks
       from t001w
       where werks it_record-werks.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Plant Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
    "Storage location
    if it_record-lgort ne space .
      select single lgort  into lv_lgort
          from t001l
          where lgort  it_record-lgort
            and werks  it_record-werks.
      if sy-subrc <> 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' Storage location Not Exists.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.

    if lv_flag2 <> 'X'.
      it_record-message ' OK.'.
      modify it_record index lv_tabix.
    endif.
  endloop.
endform.                    " CHECK_IT_RECORD

*&---------------------------------------------------------------------*
*&      Form  CREATE_PO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form create_po .
  loop at it_record.
    if not it_record-message ' OK.'.
      it_ebeln_err-ebeln =  it_record-ebeln.
      collect it_ebeln_err.
    endif.
    it_ebeln-ebeln =  it_record-ebeln.
    collect it_ebeln.
  endloop.
  if not it_ebeln_err[] is initial.
    loop at it_ebeln_err.
      loop at it_record where ebeln it_ebeln_err-ebeln.
        move-corresponding it_record to it_err2.
        append it_err2.
        clear it_err2.
      endloop.
      delete  it_ebeln where ebeln it_ebeln_err-ebeln.
    endloop.
  endif.


  sort it_ebeln by ebeln.
  delete adjacent duplicates from it_ebeln comparing all fields.
  sort it_record  by ebeln.
  loop at it_ebeln.
    lv_tabix sy-tabix.
    clear:it_ebeln-message.
    read table it_record with key ebeln it_ebeln-ebeln binary search.
    check sy-subrc eq 0.
    p_header-po_number it_ebeln-ebeln.
    p_header-doc_type it_record-bsart.
    p_header-vendor it_record-lifnr.
    p_header-doc_date it_record-bedat.
    p_header-pmnttrms it_record-zterm.
    "    p_header-item_intvl = 10.  "不可以赋值 赋值就会按它开始 间隔
    p_header-incoterms1 it_record-inco1.
    p_header-currency it_record-waers.
    p_header-purch_org it_record-ekorg.
    p_header-pur_group it_record-ekgrp.
    p_header-comp_code it_record-bukrs.

    p_headerx-po_number 'X'.
    p_headerx-doc_type 'X'.
    p_headerx-vendor 'X'.
    p_headerx-doc_date 'X'.
    p_headerx-pmnttrms 'X'.
    p_headerx-item_intvl 'X'.  "控制PO item是否从10 或 1
    p_headerx-incoterms1 'X'.
    p_headerx-currency 'X'.
    p_headerx-purch_org 'X'.
    p_headerx-pur_group 'X'.
    p_headerx-comp_code 'X'.

    loop at it_record where ebeln it_ebeln-ebeln.

      p_item-po_item it_record-ebelp.
      p_item-item_cat it_record-pstyp.
      p_item-material it_record-matnr.
      p_item-quantity it_record-menge.
      p_item-po_unit it_record-meins.
      p_item-orderpr_un it_record-meins.
      p_item-net_price it_record-netpr.
      p_item-price_unit it_record-peinh.
      if it_record-netpr 0.
        p_item-free_item 'X'.
      endif.
      p_item-plant it_record-werks.
      p_item-stge_loc it_record-lgort.
*        p_item-EMATERIAL = ''.
      append p_item.

      p_itemx-po_item it_record-ebelp.
      p_itemx-po_itemx 'X'.
      p_itemx-item_cat 'X'.
      p_itemx-material 'X'.
      p_itemx-quantity 'X'.
      p_itemx-po_unit 'X'.
      p_item-orderpr_un  'X'.
      p_itemx-net_price 'X'.
      p_itemx-price_unit 'X'.
      p_itemx-plant 'X'.
      p_itemx-stge_loc 'X'.
*        p_itemx-EMATERIAL = 'X'.
      append p_itemx.
      "change
      i_item-po_item it_record-ebelp.
      i_item-quantity it_record-menge.
      append i_item.

      i_itemx-po_item it_record-ebelp.
      i_itemx-quantity 'X'.
      append i_itemx.




      p_schedule-po_item it_record-ebelp.
      p_schedule-sched_line 10.
      p_schedule-delivery_date it_record-eindt.
      p_schedule-quantity it_record-menge.
      append p_schedule.

      p_schedulex-po_item it_record-ebelp.
      p_schedulex-sched_line 10.
      p_schedulex-po_itemx  'X'.
      p_schedulex-sched_linex  'X'.
      p_schedulex-delivery_date 'X'.
      p_schedulex-quantity 'X'.
      append p_schedulex.

      if it_record-bsart+3(1'1'.
        p_cond-itm_number it_record-ebelp.
        p_cond-cond_st_no '001'.
        p_cond-cond_count '01'.
        p_cond-cond_type 'PB00'.  "Condition Type
        p_cond-cond_value it_record-netpr.   "Amount
        p_cond-currency it_record-waers_d.  "Currency
        p_cond-cond_p_unt it_record-peinh .    "Per
        p_cond-cond_unit it_record-meins.   "Condition Unit
        p_cond-change_id 'U'.
        append p_cond.

        p_condx-itm_number it_record-ebelp.
        p_condx-cond_st_no '001'.
        p_condx-itm_numberx 'X'.
        p_condx-cond_st_nox 'X'.
        p_condx-cond_count 'X'.
        p_condx-cond_type 'X'.
        p_condx-cond_value 'X'.
        p_condx-currency 'X'.
        p_condx-cond_p_unt 'X'.
        p_condx-cond_unit 'X'.
        p_condx-change_id 'X'.
        append p_condx.
      endif.
    endloop.


    call function 'BAPI_PO_CREATE1'
      exporting
        poheader         p_header
        poheaderx        p_headerx
      importing
        exppurchaseorder ex_ebeln
      tables
        return           it_return
        poitem           p_item
        poitemx          p_itemx
        poschedule       p_schedule
        poschedulex      p_schedulex
        pocond           p_cond
        pocondx          p_condx.
    read table it_return with key type 'E'.
    if sy-subrc eq 0.
      loop at it_return where type 'E'.
        if it_ebeln-message is initial.
          concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
        else.
          concatenate it_ebeln-message  it_return-message into it_ebeln-message.
        endif.
      endloop.
      modify it_ebeln index lv_tabix.
    else.
      call function 'BAPI_TRANSACTION_COMMIT'
        exporting
          wait 'X'.
      " wait up to 1 seconds.
      concatenate ex_ebeln  ' Success.' into it_ebeln-message.
      modify it_ebeln index lv_tabix.

      refresh: it_return.
      clear:it_return .
      " change qty
      call function 'BAPI_PO_CHANGE'
        exporting
          purchaseorder ex_ebeln
        tables
          return        it_return
          poitem        i_item
          poitemx       i_itemx.
      commit work and wait.
      read table it_return with key type 'E'.
      if sy-subrc eq 0.
        concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
        modify it_ebeln index lv_tabix.
      else.
        purchaseorder ex_ebeln.
        select single  frgsx  into lv_frgsx
            from ekko
            where ebeln purchaseorder .
        if not purchaseorder is initial.
          select single frgc1 frgc2 frgc3 frgc4 frgc5
              into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
              from t16fs
              where frggr 'PO'
                and frgsx lv_frgsx.
          if po_rel_code1 is not initial.
            clear:return[],return.
            perform approved_po tables return using purchaseorder  po_rel_code1.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code2 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code2.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code3 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code3.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code4 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code4.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code5 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code5.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
        endif.
      endif.
    endif.
    clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
         ,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
         ,return.
    refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
  endloop.

  loop at it_ebeln.
    loop at it_record where ebeln it_ebeln-ebeln.
      move-corresponding it_record to it_err.
      it_err-message it_ebeln-message.
      append it_err.
      clear it_err.
    endloop  .
  endloop.
endform.                    " CREATE_PO
*&---------------------------------------------------------------------*
*&      Form  CREATE_PO_AUTOPONO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form create_po_autopono .
  loop at it_record.
    if not it_record-message ' OK.'.
      it_ebeln_err-lifnr =  it_record-lifnr.
      it_ebeln_err-ekgrp =  it_record-ekgrp.
      collect it_ebeln_err.
    endif.
    it_ebeln-lifnr =  it_record-lifnr.
    it_ebeln-ekgrp =  it_record-ekgrp.
    collect it_ebeln.
  endloop.

  if not it_ebeln_err[] is initial.
    sort it_ebeln_err by  lifnr ekgrp .
    loop at it_ebeln_err.
      loop at it_record where lifnr it_ebeln_err-lifnr and ekgrp it_ebeln_err-ekgrp .
        move-corresponding it_record to it_err2.
        append it_err2.
        clear it_err2.
      endloop.
      delete  it_ebeln where lifnr it_ebeln_err-lifnr and ekgrp it_ebeln_err-ekgrp .
    endloop.
  endif.

  sort it_ebeln by  lifnr ekgrp .
  delete adjacent duplicates from it_ebeln comparing all fields.

  sort it_record  by lifnr ekgrp .
  loop at it_ebeln.
    lv_tabix sy-tabix.
    clear:it_ebeln-message,it_ebeln-ebeln.
    read table it_record with key lifnr it_ebeln-lifnr ekgrp it_ebeln-ekgrp .
    check sy-subrc eq 0.
*    p_header-po_number = it_ebeln-ebeln.
    p_header-doc_type it_record-bsart.
    p_header-vendor it_record-lifnr.
    p_header-doc_date it_record-bedat.
    p_header-pmnttrms it_record-zterm.
    "    p_header-item_intvl = 10.  "不可以赋值 赋值就会按它开始 间隔
    p_header-incoterms1 it_record-inco1.
    p_header-currency it_record-waers.
    p_header-purch_org it_record-ekorg.
    p_header-pur_group it_record-ekgrp.
    p_header-comp_code it_record-bukrs.

*    p_headerx-po_number = 'X'.
    p_headerx-doc_type 'X'.
    p_headerx-vendor 'X'.
    p_headerx-doc_date 'X'.
    p_headerx-pmnttrms 'X'.
*    p_headerx-item_intvl = 'X'.  "控制PO item是否从10 或 1
    p_headerx-incoterms1 'X'.
    p_headerx-currency 'X'.
    p_headerx-purch_org 'X'.
    p_headerx-pur_group 'X'.
    p_headerx-comp_code 'X'.

    wa_tabix 1.
    loop at it_record where lifnr it_ebeln-lifnr and ekgrp it_ebeln-ekgrp .
      p_item-po_item wa_tabix * 10.
      p_item-item_cat it_record-pstyp.
      p_item-material it_record-matnr.
      p_item-quantity it_record-menge.
      p_item-po_unit it_record-meins.
      p_item-orderpr_un it_record-meins.
      p_item-net_price it_record-netpr.
      p_item-price_unit it_record-peinh.
      if it_record-netpr 0.
        p_item-free_item 'X'.
      endif.
      p_item-plant it_record-werks.
      p_item-stge_loc it_record-lgort.
*        p_item-EMATERIAL = ''.
      append p_item.

      p_itemx-po_item wa_tabix * 10.
      p_itemx-po_itemx 'X'.
      p_itemx-item_cat 'X'.
      p_itemx-material 'X'.
      p_itemx-quantity 'X'.
      p_itemx-po_unit 'X'.
      p_item-orderpr_un  'X'.
      p_itemx-net_price 'X'.
      p_itemx-price_unit 'X'.
      p_itemx-plant 'X'.
      p_itemx-stge_loc 'X'.
*        p_itemx-EMATERIAL = 'X'.
      append p_itemx.
      "change
      i_item-po_item wa_tabix * 10.
      i_item-quantity it_record-menge.
      append i_item.

      i_itemx-po_item wa_tabix * 10.
      i_itemx-quantity 'X'.
      append i_itemx.




      p_schedule-po_item wa_tabix * 10.
      p_schedule-sched_line 10.
      p_schedule-delivery_date it_record-eindt.
      p_schedule-quantity it_record-menge.
      append p_schedule.

      p_schedulex-po_item wa_tabix * 10.
      p_schedulex-sched_line 10.
      p_schedulex-po_itemx  'X'.
      p_schedulex-sched_linex  'X'.
      p_schedulex-delivery_date 'X'.
      p_schedulex-quantity 'X'.
      append p_schedulex.

      if it_record-bsart+3(1'1'.
        p_cond-itm_number wa_tabix * 10.
        p_cond-cond_st_no '001'.
        p_cond-cond_count '01'.
        p_cond-cond_type 'PB00'.  "Condition Type
        p_cond-cond_value it_record-netpr.   "Amount
        p_cond-currency it_record-waers_d.  "Currency
        p_cond-cond_p_unt it_record-peinh .    "Per
        p_cond-cond_unit it_record-meins.   "Condition Unit
        p_cond-change_id 'U'.
        append p_cond.

        p_condx-itm_number wa_tabix * 10.
        p_condx-cond_st_no '001'.
        p_condx-itm_numberx 'X'.
        p_condx-cond_st_nox 'X'.
        p_condx-cond_count 'X'.
        p_condx-cond_type 'X'.
        p_condx-cond_value 'X'.
        p_condx-currency 'X'.
        p_condx-cond_p_unt 'X'.
        p_condx-cond_unit 'X'.
        p_condx-change_id 'X'.
        append p_condx.
      endif.
      wa_tabix wa_tabix + 1.
    endloop.


    call function 'BAPI_PO_CREATE1'
      exporting
        poheader         p_header
        poheaderx        p_headerx
      importing
        exppurchaseorder ex_ebeln
      tables
        return           it_return
        poitem           p_item
        poitemx          p_itemx
        poschedule       p_schedule
        poschedulex      p_schedulex
        pocond           p_cond
        pocondx          p_condx.
    read table it_return with key type 'E'.
    if sy-subrc eq 0.
      loop at it_return where type 'E'.
        if it_ebeln-message is initial.
          concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
        else.
          concatenate it_ebeln-message  it_return-message into it_ebeln-message.
        endif.
      endloop.
      modify it_ebeln index lv_tabix.
    else.
      call function 'BAPI_TRANSACTION_COMMIT'
        exporting
          wait 'X'.
      " wait up to 1 seconds.
      concatenate ex_ebeln  ' Success.' into it_ebeln-message.
      it_ebeln-ebeln ex_ebeln.
      modify it_ebeln index lv_tabix.

      refresh: it_return.
      clear:it_return .
      " change qty
      call function 'BAPI_PO_CHANGE'
        exporting
          purchaseorder ex_ebeln
        tables
          return        it_return
          poitem        i_item
          poitemx       i_itemx.
      commit work and wait.
      read table it_return with key type 'E'.
      if sy-subrc eq 0.
        concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
        modify it_ebeln index lv_tabix.
      else.
        purchaseorder ex_ebeln.
        select single  frgsx  into lv_frgsx
            from ekko
            where ebeln purchaseorder .
        if not purchaseorder is initial.
          select single frgc1 frgc2 frgc3 frgc4 frgc5
              into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
              from t16fs
              where frggr 'PO'
                and frgsx lv_frgsx.
          if po_rel_code1 is not initial.
            clear:return[],return.
            perform approved_po tables return using purchaseorder  po_rel_code1.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code2 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code2.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code3 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code3.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code4 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code4.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
          if po_rel_code5 is not initial.
            clear:return[],return.
            wait up to seconds.
            perform approved_po tables return using purchaseorder  po_rel_code5.
            read table return with key type 'E'.
            if sy-subrc eq 0.
              concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
              modify it_ebeln index lv_tabix.
            endif.
          endif.
        endif.
      endif.
    endif.
    clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
         ,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
         ,return.
    refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
  endloop.

  loop at it_ebeln.
    loop at it_record where lifnr it_ebeln-lifnr and ekgrp it_ebeln-ekgrp .
      move-corresponding it_record to it_err.
      it_err-ebeln it_ebeln-ebeln.
      it_err-message it_ebeln-message.
      append it_err.
      clear it_err.
    endloop  .
  endloop.
endform.                    " CREATE_PO_AUTOPONO


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_RESULT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form display_result .

  clear it_err3.
  refresh it_err3.
  append lines of it_err to it_err3.
  append lines of it_err2 to it_err3.
  sort it_err3 by order ascending.


  check not it_err3[] is initial.
  perform down_file .
  perform get_file using 'PO' pr_error  p_test  '.txt'
                   changing gv_file.
  if p_test 'X'.
    perform download_local tables it_down using gv_file.
    perform write_data.
  else.
    perform download_server tables  it_down  using gv_file.
  endif.
endform.                    " DISPLAY_RESULT
*&---------------------------------------------------------------------*
*&      Form  DOWN_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form down_file .
  clear:it_down,it_down[].
  concatenate
          'Order Type'
          'Purchase Document No.'
          'Vendor Code'
          'Doc. Date'
          'Payment Terms'
          'Incoterms'
          'Currency'
          'Purchasing Org.'
          'Purchasing Group'
          'Company Code'
          'Item Number'
          'Item category'
          'Material Number'
          'Quantity'
          'Order Unit'
          'Delivery date'
          'Net Price'
          'Currency'
          'Price unit'
          'Plant'
          'Storage location'
          'Message'
            into it_down separated by  cl_abap_char_utilities=>horizontal_tab.
  append it_down.
  loop at it_err3.
    move-corresponding it_err3 to it_tab.
    concatenate it_tab-bsart it_tab-ebeln
                it_tab-lifnr_c it_tab-bedat_c it_tab-zterm it_tab-inco1
                it_tab-waers it_tab-ekorg it_tab-ekgrp it_tab-bukrs
                it_tab-ebelp_c it_tab-epstp it_tab-matnr_c
                it_tab-menge_c it_tab-meins_c it_tab-eindt_c it_tab-netpr_c
                it_tab-waers_dc it_tab-peinh_c it_tab-werks it_tab-lgort
                it_tab-message
                into it_down separated by cl_abap_char_utilities=>horizontal_tab.
    condense it_down .
    append it_down .
  endloop.
endform.                    " DOWN_FILE
*&---------------------------------------------------------------------*
*&      Form  WRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form write_data .
  refresh: fc_hier.
  alv_field 'BSART' 'Order Type' '' '' '' '' '' '' .
  alv_field 'EBELN' 'Purchase Document No.' '' '' '' '' '' ''.
  alv_field 'LIFNR_C' 'Vendor Code' '' '' '' '' '' ''.
  alv_field 'BEDAT' 'Doc. Date' '' '' '' '' '' '' .
  alv_field 'ZTERM' 'Payment Terms' '' '' '' '' '' '' .
  alv_field 'INCO1' 'Incoterms' '' '' '' '' '' '' .
  alv_field 'WAERS' 'Currency' '' '' '' '' '' '' .
  alv_field 'EKORG' 'Purchasing Org.' '' '' '' '' '' '' .
  alv_field 'EKGRP' 'Purchasing Group' '' '' '' '' '' '' .
  alv_field 'BUKRS' 'Company Code' '' '' '' '' '' '' .
  alv_field 'EBELP_C' 'Item Number' '' '' '' '' '' '' .
  alv_field 'EPSTP' 'Item category' '' '' '' '' '' '' .
  alv_field 'MATNR_C' 'Material Number' '' '' '' '' '' '' .
  alv_field 'MENGE' 'Quantity' '' '' '' '' '' '' .
  alv_field 'MEINS' 'Order Unit' '' '' '' '' '' '' .
  alv_field 'EINDT' 'Delivery date' '' '' '' '' '' '' .
  alv_field 'NETPR' 'Net Price' '' '' '' '' '' '' .
  alv_field 'WAERS_D' 'Currency' '' '' '' '' '' '' .
  alv_field 'PEINH' 'Price unit' '' '' '' '' '' '' .
  alv_field 'WERKS' 'Plant' '' '' '' '' '' '' .
  alv_field 'LGORT' 'Storage location' '' '' '' '' '' ''.
  alv_field 'MESSAGE' 'Message' '' '100' '' '' '' '' .
  perform display_alv tables  fc_hier it_err3 using  'A'.
endform.                    " WRITE_DATA
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form process_data .
  data: lv_mod like marc-bstrf,
        lv_int type i,
        lv_bstrf like marc-bstrf.
  loop at it_record.
    clear:lv_bstrf,lv_mod,lv_int,it_record-bstrf,it_record-menge_r.
    lv_tabix sy-tabix.
    select single bstrf into lv_bstrf
    from marc
    where matnr it_record-matnr
        and werks  it_record-werks.
    if sy-subrc eq 0.
      lv_mod =  it_record-menge mod lv_bstrf.
      lv_int =  it_record-menge / lv_bstrf.
      if lv_mod ne 0.
        lv_int lv_int + 1.
      endif.
      it_record-bstrf lv_bstrf.
      it_record-menge_r lv_int  * lv_bstrf.
    else.
      it_record-menge_r =  it_record-menge.
    endif.
    modify it_record index lv_tabix.
  endloop.
endform.                    " PROCESS_DATA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值