ZPPR015:BOM Matrix

44 篇文章 0 订阅

*&---------------------------------------------------------------------*
*& Progarm      :  ZPPR015                        Author : Jimmy Wong
*& Created      :  17 Oct 2012                    App    : PP
*& Title        :  BOM Matrix
*& Description  :  BOM Matrix
*&---------------------------------------------------------------------*
*&  Version       Author      Date        description
*&                Jimmy       17 Oct 2012 the first version
*& M1             Jimmy       08 Jan 2013 add download a file
*& M2             Jimmy       24 Jan 2013 Addd logcial group priority
*& M3             Oliver      18 Feb 2013 Enhancement
*& M4             Jimmy       add column "Change Component"
*&  the last update time  2013.03.12  18:00
*&---------------------------------------------------------------------*

report  zppr015 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : mara,marc,prps,rlgrap.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
data: begin of wa_itab occurs 0,
      index   type i,
      m_matnr like mara-matnr,
      zlgp    like mara-matnr,
      matnr   like mara-matnr,
      werks   like marc-werks,
      kdmat   like knmt-kdmat,  "Customer Material
      maktx   like makt-maktx,
      mfrnr   like mara-mfrnr,  "Order No.
      mfrpn   like mara-mfrpn,
      verpr   like mbew-verpr,  "net price
      zpurp   like mbew-verpr,  "Latest PUR price
      peinh   like mbew-peinh,
      plifz   like marc-plifz,  "Planned Deliv. Time
      bstmi   like marc-bstmi,  "Minimum Lot Size
      bstrf   like marc-bstrf,  "Rounding value
      zzcw    type p,"like zmmt_info_rec-zzcw, " CW
      zzrw    type p,"like zmmt_info_rec-zzrw, "RW
      mnglg   like ekpo-menge,  "replaced by Oliver from mngko
      clabs   like mchb-clabs,  "On Hand qty
      menge   like ekpo-menge,  "On Order Qty
      bdmng   like resb-bdmng,  "Reserved Qty
      stqty   like ekpo-menge,  "Shortage qty QTY
      lgort   like ekpo-lgort,
      meins   like marav-meins,
      alprf   like stpo-alprf,  "Priority
      matkl like mara-matkl,  " Material Group
      aennr like zrun_change-aennr,                         "M4 add
      end of wa_itab.
data: begin of it_mnglg occurs 0,
      m_matnr like mara-matnr,
      matnr   like mara-matnr,
      werks   like marc-werks,
      zlgp    like mara-matnr,
      mnglg   like ekpo-menge,
      end of  it_mnglg.

data: begin of it_matnr occurs 0,
      matkl   like mara-matkl,  " Material Group
      matnr   like mara-matnr,
      werks   like marc-werks,
      zlgp    like mara-matnr,
      end of it_matnr.
data: it_sub_matnr like it_matnr occurs 0 with header line.
*data: wa_matnr like it_matnr occurs 0 with header line.
data: begin of wa_matnr occurs 0,
      matnr   like mara-matnr,
      index   type i,
      end of wa_matnr.
field-symbols: <itab> type standard table,
               <w_itab>,
               <wa_field>.
data: it_structure type lvc_t_fcat,
      wa_structure type lvc_s_fcat,
      itab type ref to data.

data: begin of it_stpo occurs 0 .
        include structure stpox.
data: end of  it_stpo.
data: wa_stpo like it_stpo occurs 0 with header line.
data: begin of it_matcat occurs 0 .
        include structure cscmat.
data: end of it_matcat.
data: lv_i type i.
type-pools: slis.
data: fc_hier type slis_t_fieldcat_alv,
      wa_hier type slis_fieldcat_alv .
data: begin of ztab6 occurs 0,
         werks like resb-werks,
         lgort like resb-lgort,
         charg like resb-charg,
         matnr like resb-matnr,
         bdmng like resb-bdmng,
         bdmns like resb-bdmng,
         erfme like resb-erfme,
         erfmg like resb-erfmg,
      end of ztab6.
data: begin of ztab occurs 0,
         werks like ekpo-werks,
         lgort like ekpo-lgort,
         matnr like ekpo-matnr,
         menge like ekpo-menge,
         mengk like ekpo-menge,
      end of ztab.
ranges: xbdart for resb-bdart.
data:begin of it_marc occurs 0,
      matnr   like mara-matnr,
      werks   like marc-werks,
      plifz   like marc-plifz,  "Planned Deliv. Time
      bstmi   like marc-bstmi,  "Minimum Lot Size
      bstrf   like marc-bstrf,  "Rounding value
      end of it_marc.
data:begin of it_mara occurs 0,
      matnr   like mara-matnr,
      mfrnr   like mara-mfrnr,
      mfrpn   like mara-mfrpn,
end of it_mara.
data:begin of it_mbew occurs 0,
    matnr like mbew-matnr,
    bwkey like mbew-bwkey ,
    vprsv like mbew-vprsv,
    verpr like mbew-verpr ,
    stprs like mbew-stprs ,
    peinh like mbew-peinh ,
    end of it_mbew.
data:begin of it_info_rec occurs 0,
      matnr like mara-matnr,
      werks like resb-werks,
      zzcw like  zmmt_info_rec-zzcw,
      zzrw like  zmmt_info_rec-zzrw ,
     end of it_info_rec.
data:begin of it_knmt occurs 0,
      matnr like mara-matnr,
      vkorg like knmt-vkorg,
      kdmat like knmt-kdmat ,
     end of it_knmt.
data:begin of it_mchb1 occurs 0,
      matnr like mara-matnr,
      werks   like marc-werks,
      lgort   like mchb-lgort ,
      charg   like mchb-charg ,
      clabs   like mchb-clabs,
     end of it_mchb1.
data:it_mchb like it_mchb1 occurs 0 with header line.
data:it_mdrs like mdrs occurs 0 with header line.
data:it_mdur like mdur occurs 0 with header line.
data:it_mdbs like mdbs occurs 0 with header line.
data:lv_type type c length 50.
types:lv_types type c length 50.
data: begin of it_down occurs 0,
          line type c length 10000,
end of it_down .
data:lv_string type string.
data: gv_file like rlgrap-filename.
data:lv_matnr type c length 20.

* add by Oliver for latest PUR price
data : begin of t_a017_t occurs 0,
          lifnr like a017-lifnr,
          matnr like a017-matnr,
          ekorg like a017-ekorg,
          werks like a017-werks,
          esokz like a017-esokz,
          datbi like a017-datbi,
          datab like a017-datab,
          knumh like a017-knumh,
         end of t_a017_t.

data : begin of t_a017 occurs 0,
          lifnr like a017-lifnr,
          matnr like a017-matnr,
          ekorg like a017-ekorg,
          werks like a017-werks,
          esokz like a017-esokz,
          datbi like a017-datbi,
          datab like a017-datab,
          knumh like a017-knumh,
         end of t_a017.
data : begin of t_konp occurs 0,
         lifnr like a017-lifnr,
         matnr like a017-matnr,
         ekorg like a017-ekorg,
         werks like a017-werks,
         kbetr like konp-kbetr,   "AMount
         kbphk like konp-kbetr,   "HK Price
         konwa like konp-konwa,   "Cond. currency
         kpein like konp-kpein,   "Price unit
         kmein like konp-kmein,   "Unit of measure
         knumh like konp-knumh,
         kunnr like lfa1-kunnr,
         autet like eord-autet,
         atwrt like ausp-atwrt,
       end of t_konp.

data: p_datuv like stko-datuv,
      lv_equalto like eina-umrez,
      k1_netpr like bapicurr-bapicurr,
      k2_netpr like bapicurr-bapicurr,
      k3_netpr like konp-kbetr,
      k4_netpr like konp-kbetr.
*M4 add
data: begin of wa_aennr occurs 0,
      aennr like zrun_change-aennr,
      ncomponent like mara-matnr,
      rcomponent like mara-matnr,
      end of   wa_aennr.
data:it_aennr like wa_aennr occurs 0 with header line.
*M4 end
*----------------------------------------------------------------------*
*  Parameter & Select-Options                                          *
*----------------------------------------------------------------------*
selection-screen begin of block with frame title text-001.
parameters : s_werks like marc-werks default '8101' obligatory.
*    select-options : s_werks for marc-werks default '8101' obligatory.
select-options : s_pspnr for prps-pspnr.
select-options : s_matnr for mara-matnr .
select-options : s_mtart for mara-mtart. "default 'ZVFG'.
parameters: p_cal as checkbox  .
selection-screen end of block 1.
selection-screen begin of block with frame title text-002.  "M5 add
parameters: p_multi radiobutton group gp1 default 'X',
            p_single radiobutton group gp1.
selection-screen end of block 2.
selection-screen begin of block with frame title text-003.
parameters: p_txt as checkbox  .
parameters: p_file like rlgrap-filename default '/usr/sap/tmp'.
parameters: p_test as checkbox  .
selection-screen end of block 3.at selection-screen on value-request for  p_file.
  perform f4_filename using p_file .

*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
  perform get_material.
  perform get_data.
  if it_sub_matnr[] is initial  .
    message 'No Record Found' type 'I'.
    exit.
  endif.
  perform create_structure.
  perform create_dynamic_table.
  if p_txt = 'X'.
    perform add_header.
  endif.
  perform process_data.
  if p_txt = 'X'.
    if p_test = 'X'.
      perform download_local.
    else.
      perform download_server.
    endif.
  else.
    perform dispaly_data.
  endif.

end-of-selection.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_data .
  data: lv_mehrs type c.
  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text 'Getting Data........'.
  if p_multi 'X'. "M5 add
    lv_mehrs 'X'.
  endif.  loop at it_matnr.
    call function 'CS_BOM_EXPL_MAT_V2'
      exporting
        capid                 = 'PP01'
        datuv                 = sy-datum
        emeng                 = 1000
        mtnrv                 = it_matnr-matnr
        mehrs                 = 'X'
        mmory                 = 'X'
        werks                 = it_matnr-werks
        aumgb                 = 'X'
      tables
        stb                   = it_stpo
        matcat                = it_matcat
      exceptions
        material_not_found    = 4
        no_plant_data         = 8
        no_bom_found          = 12
        no_suitable_bom_found = 16
        alt_not_found         = 24
        missing_authorization = 28
        conversion_error      = 36.
    if sy-subrc eq 0 .
      if  it_stpo[] is not initial .
        wa_stpo[] = it_stpo[].
        delete adjacent duplicates from it_matcat comparing matnr index.
        loop at it_stpo where mtart ne 'ZLGP'.
          check it_stpo-postp = 'L'.

          wa_itab-m_matnr = it_matnr-matnr.
          wa_itab-index = it_stpo-index.
          wa_itab-maktx = it_stpo-ojtxp.
          wa_itab-werks = it_stpo-werks.
          wa_itab-mnglg = it_stpo-mnglg / 1000.   " replaced by Oliver from mngko
          wa_itab-lgort = it_stpo-lgpro.
          wa_itab-matnr = it_stpo-idnrk.
          wa_itab-meins = it_stpo-meins.
          wa_itab-alprf = it_stpo-alprf .
          wa_itab-matkl = it_stpo-matmk.
          wa_itab-aennr = it_stpo-aennr.                    "M4 add

          read table  it_matcat with key index = it_stpo-ttidx binary search.
          if sy-subrc eq 0.
            read table wa_stpo with key idnrk = it_matcat-matnr mtart = 'ZLGP'.
            if sy-subrc eq 0.
              it_sub_matnr-zlgp = it_matcat-matnr .
              wa_itab-zlgp = it_matcat-matnr .
            endif.
          endif.
          it_sub_matnr-matkl = it_stpo-matmk.
          it_sub_matnr-matnr = it_stpo-idnrk.
          it_sub_matnr-werks = it_stpo-werks.
          collect it_sub_matnr.
          clear:it_sub_matnr.

          wa_matnr-matnr = it_matnr-matnr.
          translate wa_matnr-matnr to upper case.
          collect wa_matnr.
          it_mnglg-m_matnr =  wa_itab-m_matnr .
          it_mnglg-matnr  =  wa_itab-matnr .
          it_mnglg-werks =  wa_itab-werks .
          it_mnglg-zlgp  =  wa_itab-zlgp   .
          it_mnglg-mnglg =  wa_itab-mnglg .
          collect it_mnglg.

*M4 add
          if  it_stpo-aennr is not initial.
            wa_aennr-aennr = it_stpo-aennr.
            wa_aennr-ncomponent = it_stpo-idnrk.
            collect wa_aennr.
          endif.
*M4 End

          append wa_itab.
          clear: wa_itab.
        endloop.
      endif.
    endif.
    clear:it_stpo,it_stpo[],it_matcat,it_matcat[],wa_stpo,wa_stpo[].
  endloop.
  sort it_sub_matnr by matkl zlgp matnr werks .
  sort wa_matnr by matnr.
  sort wa_itab by matnr werks zlgp m_matnr.
  sort it_mnglg by m_matnr matnr werks zlgp .

endform.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  GET_MATERIAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_material .
  clear:it_matnr,wa_itab,it_sub_matnr.
  refresh:it_matnr,wa_itab,it_sub_matnr.
  if s_pspnr is initial.
    select a~matnr b~werks
     into corresponding fields of table it_matnr
     from mara as a inner join marc as b on a~matnr = b~matnr
     where a~matnr in s_matnr
       and b~werks = s_werks
       and a~mtart in s_mtart.
  else.
    select a~matnr b~werks
     into corresponding fields of table it_matnr
     from mara as a inner join marc as b on a~matnr = b~matnr
     inner join zmm_prodlot as c on a~matnr = c~matnr  and b~werks = c~werks
     where a~matnr in s_matnr
       and b~werks = s_werks
       and a~mtart in s_mtart
       and c~ps_psp_pnr in s_pspnr.
  endif.
endform.                    " GET_MATERIAL
*&---------------------------------------------------------------------*
*&      Form  CREATE_STRUCTURE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form create_structure .
  data: lv_index type i.

  define create_stru.
    wa_structure-fieldname = &1.
*    wa_structure-col_pos   = &2.
    wa_structure-inttype = &2.
    wa_structure-intlen = &3.
    wa_structure-datatype =  &4.
    wa_structure-decimals = &5.
    append wa_structure to it_structure.
  end-of-definition.

  create_stru 'INDEX'  'I' '10' '' '' .
  create_stru 'MATKL'  'C' '9' '' '' .
  create_stru 'ZLGP'   'C' '20' '' '' .
  create_stru 'MATNR'  'C' '20' '' '' .
  create_stru 'RCOMPONENT'  'C' '255' '' '' .               "M4 add
  create_stru 'KDMAT'  'C' '20' '' '' .
  create_stru 'MAKTX'  'C' '40' '' '' .
  create_stru 'MFRNR'  'C' '10' '' '' .
  create_stru 'MFRPN'  'C' '40' '' '' .
  create_stru 'VERPR'  'P' '20' 'DEC' '2' .
  create_stru 'ZPURP'  'P' '20' 'DEC' '2' .  " add by Oliver
  create_stru 'PEINH'  'P' '20' 'DEC' '' .
  create_stru 'PLIFZ'  'P' '3' 'DEC' '' .
  create_stru 'BSTMI'  'P' '20' 'DEC' '3' .
  create_stru 'BSTRF'  'P' '20' 'DEC' '3' .
  create_stru 'ZZCW'   'C' '3' '' '' .
  create_stru 'ZZRW'   'C' '3' '' '' .
  create_stru 'MEINS'  'C' '3' '' '' .        " add by Oliver
  create_stru 'CLABS'  'P' '20' 'DEC' '3' .
  create_stru 'BDMNG'  'P' '20' 'DEC' '3' .
  create_stru 'MENGE'  'P' '20' 'DEC' '3' .
  create_stru 'STQTY'  'P' '20' 'DEC' '3' .
  create_stru 'ALPRF'  'C' '2' '' '' . "'P' '20' 'DEC' '' .

  lv_index = 1.
  loop at wa_matnr.
    create_stru  wa_matnr-matnr 'P' '20' 'DEC' '3' .
    wa_matnr-index = lv_index .
    modify wa_matnr.
    lv_index = lv_index + 1.
  endloop.

endform.                    " CREATE_STRUCTURE
*&---------------------------------------------------------------------*
*&      Form  CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form create_dynamic_table .
  call method cl_alv_table_create=>create_dynamic_table
    exporting
      it_fieldcatalog = it_structure
    importing
      ep_table        = itab.

  assign itab->* to <itab>.
endform.                    " CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form process_data .
  data:wa_new_line type ref to data,
       lv_matnr like mara-matnr,
       lv_clabs like mchb-clabs,
       lv_bdmng like resb-bdmng,
       lv_curindex type i,
       lv_m_index type i,
       lv_m_matnr like mara-matnr,
       lv_first type c,
       lv_rcomponent type c length 255.                     "M4 add

  create data wa_new_line like line of <itab>.
  assign wa_new_line->* to <w_itab>.


  perform get_other_data.
  if p_cal = 'X'.
    perform get_purprice .   " Add by Oliver
    perform get_hand_qty.
    perform get_reserved_qty .
    perform get_order_qty .
  endif.

 

  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Processing Data........'.
  lv_i = 1.

  loop at it_sub_matnr .
    clear:lv_clabs,lv_bdmng,lv_rcomponent.
    read table wa_itab with key matnr = it_sub_matnr-matnr werks = it_sub_matnr-werks zlgp =  it_sub_matnr-zlgp.

    read table it_marc with  key matnr = wa_itab-matnr werks = wa_itab-werks binary search.
    if sy-subrc eq 0.
      wa_itab-plifz = it_marc-plifz.
      wa_itab-bstmi = it_marc-bstmi.
      wa_itab-bstrf = it_marc-bstrf.
    endif.

    read table it_mara with  key matnr = wa_itab-matnr  binary search.
    if sy-subrc eq 0.
      wa_itab-mfrnr = it_mara-mfrnr.
      wa_itab-mfrpn = it_mara-mfrpn.
    endif.

    read table it_mbew with  key matnr = wa_itab-matnr bwkey = wa_itab-werks binary search.
    if sy-subrc eq 0.
      wa_itab-peinh = it_mbew-peinh .
      if it_mbew-vprsv = 'V'.
        wa_itab-verpr = it_mbew-verpr .
      else.
        wa_itab-verpr = it_mbew-stprs .
      endif.
    else.
      wa_itab-peinh  = 0.
      wa_itab-verpr = 0.
    endif.

* Add by Oliver, purchasing price
    read table t_konp with key matnr = wa_itab-matnr werks = wa_itab-werks. "binary search.
    if sy-subrc eq 0.
      wa_itab-zpurp = t_konp-kbetr.
    endif.

    read table   it_info_rec with key matnr = wa_itab-matnr werks = wa_itab-werks binary search.
    if sy-subrc eq 0.
      wa_itab-zzcw = it_info_rec-zzcw.
      wa_itab-zzrw = it_info_rec-zzrw .
    endif.
    "Customer Material
    read table   it_knmt with key matnr = wa_itab-matnr vkorg = wa_itab-werks binary search.
    if sy-subrc eq 0.
      wa_itab-kdmat = it_knmt-kdmat.
    endif.


* fill dynamic table
    assign component 'INDEX' of structure <w_itab> to <wa_field>.
    <wa_field>  =  lv_i.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MATKL' of structure <w_itab> to <wa_field>.
    <wa_field> = it_sub_matnr-matkl.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'ZLGP' of structure <w_itab> to <wa_field>.
    if p_txt = 'X'.
      perform tranfer_material   using it_sub_matnr-zlgp changing lv_matnr.
      <wa_field> = lv_matnr.
    else.
      <wa_field> = it_sub_matnr-zlgp.
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MATNR'  of structure <w_itab> to <wa_field>.
    if p_txt = 'X'.
      perform tranfer_material   using it_sub_matnr-matnr changing lv_matnr.
      <wa_field> = lv_matnr.
    else.
      <wa_field> = it_sub_matnr-matnr.
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

*M4 add
    assign component 'RCOMPONENT'  of structure <w_itab> to <wa_field>.
    read table it_aennr with key aennr = wa_itab-aennr ncomponent = it_sub_matnr-matnr.
    if sy-subrc eq 0.
      loop at it_aennr where aennr = wa_itab-aennr and ncomponent = it_sub_matnr-matnr.
        perform tranfer_material   using it_aennr-rcomponent changing it_aennr-rcomponent.
        if lv_rcomponent is INITIAL .
          lv_rcomponent  = it_aennr-rcomponent .
        else.
          CONCATENATE lv_rcomponent ',' it_aennr-rcomponent INTO lv_rcomponent.
        endif.
      endloop.
    endif.
    <wa_field> = lv_rcomponent.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.
*M4 End

    assign component 'KDMAT'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-kdmat.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MAKTX'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-maktx.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MFRNR'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-mfrnr.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MFRPN'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-mfrpn.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'VERPR'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-verpr.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'ZPURP'  of structure <w_itab> to <wa_field>.  " Add by Oliver
    <wa_field>  = wa_itab-zpurp.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'PEINH'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-peinh.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'PLIFZ'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-plifz.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'BSTMI'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-bstmi.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'BSTRF'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-bstrf.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'ZZCW'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-zzcw.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'ZZRW'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-zzrw.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MEINS'  of structure <w_itab> to <wa_field>.
    <wa_field>  = wa_itab-meins.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'CLABS'  of structure <w_itab> to <wa_field>.
    " On hand qty = mmbe Unrestricted use
    read table it_mchb with  key matnr = wa_itab-matnr werks = wa_itab-werks binary search.
    if sy-subrc eq 0.
      lv_clabs = it_mchb-clabs.
    endif.
    <wa_field> = lv_clabs  .
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'BDMNG'  of structure <w_itab> to <wa_field>.
    read table ztab6 with  key matnr = it_sub_matnr-matnr werks = it_sub_matnr-werks.
    if sy-subrc eq 0.
      loop at ztab6 where  matnr = it_sub_matnr-matnr and werks = it_sub_matnr-werks..
        lv_bdmng  = lv_bdmng  + ztab6-bdmng.
      endloop.
      <wa_field> = lv_bdmng .
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'MENGE'  of structure <w_itab> to <wa_field>.
    read table ztab with  key matnr = it_sub_matnr-matnr werks = it_sub_matnr-werks.
    if sy-subrc eq 0.
      loop at ztab where  matnr = it_sub_matnr-matnr and werks = it_sub_matnr-werks..
        <wa_field> = <wa_field> + ztab-menge.
      endloop.
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'STQTY'  of structure <w_itab> to <wa_field>.
    if lv_bdmng > lv_clabs.
      <wa_field> = lv_bdmng - lv_clabs.
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    assign component 'ALPRF'  of structure <w_itab> to <wa_field>.
    if wa_itab-alprf is not initial.
      <wa_field>  = wa_itab-alprf.
    endif.
    lv_type = <wa_field>.
    perform get_string using lv_type changing lv_string.

    lv_curindex = 0 .
    lv_first = 'Y' .
    loop at wa_itab where matnr = it_sub_matnr-matnr and werks = it_sub_matnr-werks and
             zlgp =  it_sub_matnr-zlgp .

      if lv_first <> 'Y' and wa_itab-m_matnr <> lv_m_matnr .
        lv_type = <wa_field>.
        if lv_type is not initial.
          read table wa_matnr with key matnr = lv_m_matnr binary search.
          lv_m_index = wa_matnr-index - lv_curindex - 1.
          do lv_m_index times.
            concatenate lv_string ' '
            into lv_string separated by cl_abap_char_utilities=>horizontal_tab.
          enddo.
          concatenate lv_string lv_type
            into lv_string separated by cl_abap_char_utilities=>horizontal_tab.
          lv_curindex = wa_matnr-index .
        endif.
      endif.

      assign component wa_itab-m_matnr of structure <w_itab> to <wa_field>.
      <wa_field>  = <wa_field> +  wa_itab-mnglg.
      lv_first = 'N' .
      lv_m_matnr = wa_itab-m_matnr.
    endloop.

* last one of current component
    lv_type = <wa_field>.
    if lv_type is not initial.
      read table wa_matnr with key matnr = lv_m_matnr binary search.
      lv_m_index = wa_matnr-index - lv_curindex - 1.
      do lv_m_index times.
        concatenate lv_string ' '
        into lv_string separated by cl_abap_char_utilities=>horizontal_tab.
      enddo.
      concatenate lv_string lv_type
        into lv_string separated by cl_abap_char_utilities=>horizontal_tab.
    endif.


    if p_txt = 'X' .
      it_down-line = lv_string.
      condense it_down .
      append it_down .
    endif.

    append <w_itab> to <itab>.
    clear:<wa_field>,<w_itab>,lv_string,it_down.
    add 1 to lv_i.
*111
    data : lv_text type string,
           lv_index(10).

    write lv_i to lv_index.
    condense lv_index.

    concatenate 'Current records' lv_index into lv_text separated by space.
    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = lv_text.

  endloop.
  free:it_mchb1,it_mchb,wa_itab,it_matnr,it_sub_matnr,it_stpo,
       ztab6,it_marc,it_mara,it_info_rec,it_knmt,it_mdrs,it_mdur,ztab,it_mdbs,it_mnglg.
endform.                    " PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  DELETE_PRE_ZREO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ITAB_LIFNR  text
*      <--P_ITAB_LIFNR  text
*----------------------------------------------------------------------*
form  tranfer_material using    p_old
                       changing p_new  .

  call function 'CONVERSION_EXIT_MATN1_OUTPUT'
    exporting
      input  = p_old
    importing
      output = p_new.
endform.                    "tranfer_material
*&---------------------------------------------------------------------*
*&      Form  GET_RESERVED_QTY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_reserved_qty .
  ranges: r_bdart for resb-bdart.
  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Getting reserved qty ........'.

  refresh xbdart.
  clear   xbdart.
  xbdart-sign   = 'I'.
  xbdart-option = 'EQ'.
  xbdart-low    = 'AR'.
  append xbdart.
  xbdart-low    = 'MR'.
  append xbdart.


  select * into corresponding fields of table it_mdrs
      from mdrs
    for all entries in  it_sub_matnr
    where matnr = it_sub_matnr-matnr
      and werks = it_sub_matnr-werks
      and xloek = space
      and kzear = space
      and bdart in r_bdart
      and bdart in xbdart.
  loop at it_mdrs.
    check it_mdrs-bdmng gt it_mdrs-enmng.
    check it_mdrs-ndisp = space.
    check it_mdrs-dumps ne 'X'.
    check it_mdrs-txtps ne 'X'.
    check it_mdrs-schgt ne 'X'.
    check it_mdrs-vorab is initial.

    clear ztab6.
    ztab6-matnr = it_mdrs-matnr.
    ztab6-werks = it_mdrs-werks.
    ztab6-lgort = it_mdrs-lgort.
    ztab6-charg = it_mdrs-charg.
*    if not x_kzwso is initial.
*      ztab6-erfme = mdrs-erfme.
*      ztab6-erfmg = mdrs-erfmg.
*    endif.
    if it_mdrs-dbskz is initial.
      if it_mdrs-shkzg ne 'S'.
        ztab6-bdmng = it_mdrs-bdmng - it_mdrs-enmng.
      else.
        ztab6-bdmns = it_mdrs-bdmng - it_mdrs-enmng.
      endif.
    endif.
    collect ztab6.

    if it_mdrs-umlgo ne space.
      if it_mdrs-umwrk = space or it_mdrs-umwrk = it_mdrs-werks.
        clear ztab6.
        ztab6-matnr = it_mdrs-matnr.
        ztab6-werks = it_mdrs-werks.
        ztab6-lgort = it_mdrs-umlgo.
        if it_mdrs-shkzg ne 'S'.
          ztab6-bdmns = it_mdrs-bdmng - it_mdrs-enmng.
        else.
          ztab6-bdmng = it_mdrs-bdmng - it_mdrs-enmng.
        endif.
        collect ztab6.
      endif.
    endif.
  endloop.


  select * into corresponding fields of table it_mdur
      from mdur
    for all entries in  it_sub_matnr
    where matnr = it_sub_matnr-matnr
      and werks = it_sub_matnr-werks
      and xloek = space
      and kzear = space
      and bdart in r_bdart
      and bdart in xbdart.
  loop at  it_mdur.

    check it_mdur-bdmng gt it_mdur-enmng.
    clear ztab6.
    ztab6-matnr = it_mdur-matnr.
    ztab6-werks = it_mdur-umwrk.
*    ZTAB6-LGORT = MDUR-LGORT.
    ztab6-lgort = it_mdur-umlgo.
    ztab6-charg = it_mdur-charg.
    if it_mdur-shkzg ne 'S'.
      ztab6-bdmns = it_mdur-bdmng - it_mdur-enmng.
    else.
      ztab6-bdmng = it_mdur-bdmng - it_mdur-enmng.
    endif.
    collect ztab6.
  endloop.
  sort ztab6 by matnr werks.

endform.                    " GET_RESERVED_QTY
*&---------------------------------------------------------------------*
*&      Form  GET_ORDER_QTY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_order_qty .
  data: xref-mng01 like ekpo-menge,
        xref-mng02 like ekpo-menge,
        xref-flp01 like ekpo-menge.

  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Getting order qty ........'.

  select * from  mdbs
   into corresponding fields of table it_mdbs
    for all entries in it_sub_matnr
      where  matnr  eq  it_sub_matnr-matnr
        and  werks  =  it_sub_matnr-werks
        and  loekz  eq space
        and  elikz  eq space
        and  bstyp  in ('F', 'L').
  loop at it_mdbs.
    if it_mdbs-wemng ge it_mdbs-menge.
      continue.
    endif.
    if it_mdbs-wepos eq space or           "Wareneigangsrelevant?
       it_mdbs-elikz ne space.             "Endlieferung?
      continue.
    endif.

    if not it_mdbs-stapo is initial.
      continue.
    endif.

    if it_mdbs-retpo = 'X'.
      it_mdbs-menge = it_mdbs-menge * -1.
      it_mdbs-wemng = it_mdbs-wemng * -1.                   "note136195
    endif.
    xref-mng01 = it_mdbs-menge.
    xref-mng01 = xref-mng01 - it_mdbs-wemng.
*--> Prüfen ob bei Umlagerungsbestellung               "n896701
*    Endauslieferungskennzeichen EGLKZ gesetzt ist     "n896701
*    wenn ja, dann bestellte Menge 0 oder Transit      "n896701
*    nur wenn FB aus Transaktion MMBE gerufen wird     "n896701
    if it_mdbs-eglkz = 'X' .                                "n896701
      if it_mdbs-wemng < it_mdbs-glmng.                     "n896701
*--> Dann entspricht Menge in Transit der              "n896701
*    bestellten Menge                                  "n896701
        xref-mng01 = it_mdbs-glmng - it_mdbs-wemng.         "n896701
      else.                                                 "n896701
        continue.                                           "n896701
      endif.                                                "n896701
    endif.                                                  "n896701

    read table wa_itab with  key matnr = it_mdbs-matnr werks = it_mdbs-werks.
    if sy-subrc eq 0.
      if it_mdbs-meins = wa_itab-meins."x_meins.
        xref-mng02 = xref-mng01.
      else.
        xref-flp01 = xref-mng01.
        xref-flp01 = xref-flp01 * it_mdbs-umrez / it_mdbs-umren.
        xref-mng02 = xref-flp01.
      endif.
    else.
      xref-flp01 = xref-mng01.
      xref-flp01 = xref-flp01 * it_mdbs-umrez / it_mdbs-umren.
      xref-mng02 = xref-flp01.
    endif.
*--> Bestellungen fuer Konsignation oder Normal.
    clear ztab.
    ztab-matnr = it_mdbs-matnr.
    ztab-werks = it_mdbs-werks.
    ztab-lgort = it_mdbs-lgort.
    if it_mdbs-pstyp = '2'.
*--> Konsibestellbestand
      ztab-mengk = xref-mng02.
    else.
      ztab-menge = xref-mng02.
    endif.
*--> Ende Selectschleife
    collect ztab.
    clear:xref-flp01,xref-mng02,xref-mng01.
  endloop.
  sort ztab by matnr werks.
endform.                    " GET_ORDER_QTY
*&---------------------------------------------------------------------*
*&      Form  GET_HAND_QTY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_hand_qty .
  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Getting hand qty ........'.
  select matnr werks lgort charg clabs
      into corresponding fields of table it_mchb1
      from mchb
      for all entries in it_sub_matnr
      where matnr = it_sub_matnr-matnr
        and werks = it_sub_matnr-werks .
  loop at it_mchb1.
    it_mchb-matnr = it_mchb1-matnr.
    it_mchb-werks = it_mchb1-werks.
    it_mchb-clabs = it_mchb1-clabs.
    collect it_mchb.
    clear :it_mchb.
  endloop.
  sort  it_mchb by matnr werks.
endform.                    " GET_HAND_QTY
*&---------------------------------------------------------------------*
*&      Form  GET_OTHER_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_other_data .

  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Getting Base Data........'.

  select matnr werks plifz bstmi  bstrf
    into corresponding fields of table it_marc
    from marc
    for all entries in it_sub_matnr
    where matnr = it_sub_matnr-matnr
      and werks = it_sub_matnr-werks .
  sort it_marc by matnr werks.

  select matnr mfrnr mfrpn
      into corresponding fields of  table it_mara
      from mara
      for all entries in it_sub_matnr
      where matnr = it_sub_matnr-matnr.
  sort it_mara by matnr.

  select  matnr  bwkey vprsv  verpr stprs  peinh
      into corresponding fields of table it_mbew
      from mbew
      for all entries in it_sub_matnr
      where matnr = it_sub_matnr-matnr
        and bwkey = it_sub_matnr-werks .
  sort it_mbew by matnr bwkey.

  select matnr werks zzcw zzrw
      into corresponding fields of table it_info_rec
      from zmmt_info_rec
      for all entries in it_sub_matnr
      where matnr = it_sub_matnr-matnr
        and werks = it_sub_matnr-werks .
  sort it_info_rec by matnr werks.

  select matnr vkorg kdmat
      into corresponding fields of table it_knmt
      from knmt
      for all entries in it_sub_matnr
      where vkorg = it_sub_matnr-werks
        and vtweg = '10'
        and matnr = it_sub_matnr-matnr.
  sort it_knmt by matnr vkorg.
*M4 add
  if wa_aennr[] is not initial.
    sort wa_aennr by aennr ncomponent.
    select aennr ncomponent rcomponent
        into corresponding fields of table it_aennr
      from zrun_change
      for all entries in wa_aennr
      where aennr = wa_aennr-aennr
        and ncomponent = wa_aennr-ncomponent.
    sort it_aennr by aennr ncomponent.
    free: wa_aennr.
  endif.
*M4 End

endform.                    " GET_OTHER_DATA
*&---------------------------------------------------------------------*
*&      Form  F4_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_FILE  text
*----------------------------------------------------------------------*
form f4_filename  using    p_filename.
  call function 'F4_FILENAME'
*    EXPORTING
*     PROGRAM_NAME        = SYST-CPROG
*     DYNPRO_NUMBER       = SYST-DYNNR
*     FIELD_NAME          =
    importing
      file_name           = p_filename.
endform.                    " F4_FILENAME
*&---------------------------------------------------------------------*
*&      Form  GET_STRING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_TYPE  text
*      <--P_LV_STRING  text
*----------------------------------------------------------------------*
form get_string  using    p_type type lv_types
                 changing p_string.
  shift p_type right deleting trailing space.
  shift p_type left deleting leading space.
  if p_string is initial.
    p_string = p_type.
  else.
    concatenate p_string
           p_type
          into p_string separated by cl_abap_char_utilities=>horizontal_tab.
  endif.

endform.                    " GET_STRING

*&---------------------------------------------------------------------*
*&      Form  DISPALY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form dispaly_data .
  define alv_field.
    clear:wa_hier.
    wa_hier-fieldname = &1.
    wa_hier-seltext_m = &2.
    wa_hier-seltext_l = &3.
    wa_hier-outputlen = &4.
    wa_hier-just = &5.
    wa_hier-do_sum = &6.
    wa_hier-ref_tabname = &7 .
    wa_hier-ref_fieldname = &8 .
    append wa_hier to fc_hier.
  end-of-definition.
  refresh: fc_hier.
  alv_field  'INDEX' 'Item' '' '6' 'R' '' '' ''.
  alv_field  'MATKL' '' 'Material Group' '6' 'L' '' '' ''.
  alv_field  'ZLGP' '' 'Logical Group' '18' 'L' '' 'MARA' 'MATNR'.
  alv_field  'MATNR' 'Material' '' '18' 'L' '' 'MARA' 'MATNR'.
  alv_field  'RCOMPONENT' 'Change Component' '' '18' 'L' '' '' ''.  "M4 Add
  alv_field  'KDMAT' '' 'Customer Material' '15' 'L' '' '' ''.
  alv_field  'MAKTX' '' 'Material Desc' '25' 'L' '' '' ''.
  alv_field  'MFRPN' '' 'Mfr Part Number' '' 'L' '' '' ''.
  alv_field  'MFRNR' '' 'Manufacturer' '' 'L' '' '' ''.
  alv_field  'VERPR' 'Net Price' '' '' 'R' '' '' ''.
  alv_field  'ZPURP' 'Latest PUR price' '' '' 'R' '' '' ''.
  alv_field  'PEINH' 'Price Unit' '' '' 'R' '' '' ''.
  alv_field  'PLIFZ' '' 'Planned Deliv. Time' '' 'L' '' '' ''.
  alv_field  'BSTMI' '' 'Minimum Lot Size' '' 'R' '' '' ''.
  alv_field  'BSTRF' '' 'Rounding value' '' 'R' '' '' ''.
  alv_field  'ZZCW' 'Can Win' '' '' 'R' '' '' ''.
  alv_field  'ZZRW' 'Res. Win' '' '' 'R' '' '' ''.
  alv_field  'MEINS' 'U/M' '' '4' 'L' '' '' ''.
  alv_field  'CLABS' '' 'On Hand Qty' '15' 'R' '' '' ''.
  alv_field  'BDMNG' '' 'Reserved Qty' '15' 'R' '' '' ''.
  alv_field  'MENGE' '' 'On Order Qty' '15' 'R' '' '' ''.
  alv_field  'STQTY' '' 'Shortage Qty' '15' 'R' '' '' ''.
  alv_field  'ALPRF' '' 'Priority' '6' 'R' '' '' ''.

  loop at wa_matnr.
    clear:lv_matnr.
    perform tranfer_material   using wa_matnr-matnr
                       changing lv_matnr.
    alv_field  wa_matnr-matnr '' lv_matnr '20' 'R' ''  '' ''.
  endloop.

  free:wa_matnr.

  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      it_fieldcat        = fc_hier[]
      i_save             = 'A'
      i_callback_program = sy-repid
    tables
      t_outtab           = <itab>
    exceptions
      program_error      = 1
      others             = 2.
endform.                    " DISPALY_DATA
*&---------------------------------------------------------------------*
*&      Form  ADD_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form add_header .
  perform get_string using 'Item' changing lv_string.
  perform get_string using 'Material Group' changing lv_string.
  perform get_string using 'Logical Group' changing lv_string.
  perform get_string using 'Material' changing lv_string.
  perform get_string using 'Change Component' changing lv_string. "M4 add
  perform get_string using 'Customer Material' changing lv_string.
  perform get_string using 'Material Desc' changing lv_string.
  perform get_string using 'Mfr Part Number' changing lv_string.
  perform get_string using 'Manufacturer' changing lv_string.
  perform get_string using 'Net Price' changing lv_string.
  perform get_string using 'Latest PUR Price' changing lv_string.   " add by Oliver
  perform get_string using 'Price Unit' changing lv_string.
  perform get_string using 'Planned Deliv. Time' changing lv_string.
  perform get_string using 'Minimum Lot Size' changing lv_string.
  perform get_string using 'Rounding value' changing lv_string.
  perform get_string using 'Can Win' changing lv_string.
  perform get_string using 'Res. Win' changing lv_string.
  perform get_string using 'U/M' changing lv_string.  " Add by Oliver
  perform get_string using 'On Hand Qty' changing lv_string.
  perform get_string using 'Reserved Qty' changing lv_string.
  perform get_string using 'On Order Qty' changing lv_string.
  perform get_string using 'Shortage Qty' changing lv_string.
  perform get_string using 'Priority' changing lv_string.

  loop at wa_matnr.
    clear:lv_type.
    perform tranfer_material   using wa_matnr-matnr
                       changing lv_type.
    perform get_string using lv_type
                      changing lv_string.
  endloop.
  it_down-line = lv_string.
  condense it_down .
  append it_down .
  clear:it_down ,lv_string.
endform.                    " ADD_HEADER
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_SERVER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  get_file
*&---------------------------------------------------------------------*
form get_file.
  data: wa_key(30) type c.
  data: lv_i type i.
  data: lv_c(1) type c.
  data: wa_date(8) type c.
  data: wa_time like sy-uzeit.
  data: lv_char type c.
  wa_date = sy-datum.
  wa_time =  sy-uzeit.
  concatenate 'ZPPR015' wa_date wa_time  into wa_key.
  concatenate wa_key '.txt' into wa_key.

  lv_i = strlen( p_file ).
  lv_i = lv_i - 1 .
  if lv_i > 1.
    lv_c = p_file+lv_i(1).
  endif.
  if p_test = 'X'.
    lv_char = '\' .
  else.
    lv_char = '/' .
  endif.
  if lv_c eq lv_char.
    concatenate p_file wa_key into gv_file.
  else.
    concatenate p_file lv_char wa_key into gv_file.
  endif.
endform.  "  get_file
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_LOCAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form download_local .
  data: lv_filename type string.

  perform get_file.
  lv_filename = gv_file.

  call function 'GUI_DOWNLOAD'
    exporting
      filename                = lv_filename
      filetype                = 'ASC'
      write_field_separator   = 'X'
    tables
      data_tab                = it_down
    exceptions
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      others                  = 22.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
          with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
endform.                    " DOWNLOAD_LOCAL
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_SERVER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form download_server .
  perform get_file.
  open dataset gv_file for output in text mode encoding default.
  loop at it_down.
    transfer it_down-line to gv_file.
  endloop.
  close dataset gv_file.
endform.                    " DOWNLOAD_SERVER
**&---------------------------------------------------------------------*
**&      Form  GET_PURPRICE
**&---------------------------------------------------------------------*
**  Add by Oliver
**----------------------------------------------------------------------*
*form get_purprice .
*
*  call function 'SAPGUI_PROGRESS_INDICATOR'
*    exporting
*      text = 'Getting purchasing price ........'.
*
*  p_datuv = sy-datum.
*
*  select * from a017
*    into corresponding fields of table t_a017_t
*    where ekorg = '8000'
*      and kappl = 'M' and kschl = 'PB00' and esokz in ('0', '2')
*      and datbi >= p_datuv and datab <= p_datuv.
*
*  loop at it_sub_matnr.
*    loop at t_a017_t where matnr = it_sub_matnr-matnr and werks = it_sub_matnr-werks.
*      move-corresponding t_a017_t to t_a017.
*      append t_a017.
*    endloop.
*  endloop.
*
*  select distinct * from konp
*    into corresponding fields of table t_konp
*    for all entries in t_a017
*    where knumh = t_a017-knumh and kopos = 01.
*
*  loop at t_konp.
*    read table t_a017 with key knumh = t_konp-knumh.
*    if sy-subrc = 0.
*      move-corresponding t_a017 to t_konp.
*
*      select single eord~autet into t_konp-autet from eord
*        where matnr = t_a017-matnr and werks = t_a017-werks
*                  and lifnr = t_a017-lifnr.
*
*      select single ausp~atwrt into t_konp-atwrt from ausp
*        where objek = t_a017-lifnr and atinn = '0000000111'
*          and klart = '010' and atwrt = '05'.
*
*      select single lfa1~kunnr into (t_konp-kunnr) from lfa1
*        where lifnr = t_a017-lifnr.
*
*      select single eina~umrez into lv_equalto from eina
*        where matnr = t_a017-matnr and lifnr = t_a017-lifnr .
*
*      if sy-subrc = 0 and lv_equalto <> 0 .
*        T_KONP-KBETR = T_KONP-KBETR / lv_equalto.
*      endif.
*
*      K1_NETPR = T_KONP-KBETR.
*      if T_KONP-KONWA <> 'HKD' and T_KONP-KONWA <> 'USD' and
*             T_KONP-KONWA <> 'EUR' and T_KONP-KONWA <> 'CNY' and T_KONP-KONWA <> 'GBP'.
*
*        call function 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
*          exporting
*            CURRENCY        = T_KONP-KONWA
*            AMOUNT_INTERNAL = K1_NETPR
*          importing
*            AMOUNT_EXTERNAL = K2_NETPR.
*
*        T_KONP-KBETR = K2_NETPR.
*      endif.
*
*
*      K4_NETPR = K1_NETPR.
*      call function 'CONVERT_TO_LOCAL_CURRENCY'
*        exporting
*          DATE             = P_DATUV
*          FOREIGN_AMOUNT   = K4_NETPR
*          FOREIGN_CURRENCY = T_KONP-KONWA
*          LOCAL_CURRENCY   = 'HKD'
*          TYPE_OF_RATE     = 'M'
*        importing
*          LOCAL_AMOUNT     = K3_NETPR
*        exceptions
*          NO_RATE_FOUND    = 1
*          others           = 2.
*      T_KONP-KBPHK = K3_NETPR.
*
*    endif.
*
*    modify t_konp.
*
*  endloop.
*
** delete customer/spot buy price
*  delete t_konp where kunnr <> ''.
*  delete t_konp where atwrt <> ''.
*
*  sort t_konp by werks matnr autet descending kbphk lifnr.
*endform.                    "get_purprice
**&---------------------------------------------------------------------*
**&      Form  GET_PURPRICE
**&---------------------------------------------------------------------*
**  Enhance by Jimmy M4
**----------------------------------------------------------------------*
form get_purprice .

  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      text = 'Getting purchasing price ........'.

  data:begin of it_eord occurs 0,
        matnr   like eord-matnr,
        werks   like eord-matnr,
        lifnr   like eord-matnr,
        autet   like eord-autet,
      end of it_eord.
  data: wa_konp like t_konp  occurs 0 with header line.
  data:begin of it_lfa1 occurs 0,
        lifnr   like lfa1-lifnr,
        kunnr   like lfa1-kunnr,
       end of it_lfa1.
  data:begin of it_eina occurs 0,
        matnr like eina-matnr,
        lifnr like eina-lifnr,
        umrez like eina-umrez,
        end of it_eina.

  p_datuv = sy-datum.

  select * from a017
    into corresponding fields of table t_a017
    for all entries in it_sub_matnr
    where kappl = 'M'
      and kschl = 'PB00'
      and matnr = it_sub_matnr-matnr
      and ekorg = '8000'
      and werks = it_sub_matnr-werks
      and esokz in ('0', '2')
      and datbi >= p_datuv
      and datab <= p_datuv.

  check t_a017[] is not initial.

  select distinct *
    from konp
    into corresponding fields of table wa_konp
    for all entries in t_a017
    where knumh = t_a017-knumh
      and kopos = 01.
  sort t_a017 by knumh.

  select  matnr werks lifnr autet
      into corresponding fields of table it_eord
      from eord
      for all entries in t_a017
    where matnr = t_a017-matnr
      and werks = t_a017-werks
      and lifnr = t_a017-lifnr.
  sort it_eord by matnr werks lifnr.


  select lifnr kunnr
      into corresponding fields of table it_lfa1
      from lfa1
      for all entries in t_a017
    where lifnr = t_a017-lifnr.
  sort it_lfa1 by lifnr.

  select matnr lifnr  umrez
      into corresponding fields of table it_eina
      from eina
      for all entries in t_a017
    where matnr = t_a017-matnr
      and lifnr = t_a017-lifnr
      and umrez ne 0 .
  sort it_eina by matnr lifnr.

  loop at wa_konp.
    read table t_a017 with key knumh = wa_konp-knumh ."binary search.
    if sy-subrc = 0.
      move-corresponding t_a017 to wa_konp.

      select single ausp~atwrt into wa_konp-atwrt from ausp
        where objek = t_a017-lifnr and atinn = '0000000111'
          and klart = '010' and atwrt = '05'.
      if sy-subrc eq 0 and wa_konp-atwrt ne ''.
        continue.
      endif.

      read table it_lfa1 with key lifnr = t_a017-lifnr .
      if sy-subrc eq 0 .
        if it_lfa1-kunnr ne ''.
          continue.
        endif.
      endif.

      read table it_eord with  key matnr = t_a017-matnr werks = t_a017-werks lifnr = t_a017-lifnr .
      if sy-subrc eq 0.
        wa_konp-autet = it_eord-autet.
      endif.

      read table it_eina with  key matnr = t_a017-matnr lifnr = t_a017-lifnr.
      if sy-subrc = 0 .
        wa_konp-kbetr = wa_konp-kbetr / it_eina-umrez.
      endif.

      k1_netpr = wa_konp-kbetr.
      if wa_konp-konwa <> 'HKD' and wa_konp-konwa <> 'USD' and
             wa_konp-konwa <> 'EUR' and wa_konp-konwa <> 'CNY' and wa_konp-konwa <> 'GBP'.

        call function 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
          exporting
            currency        = wa_konp-konwa
            amount_internal = k1_netpr
          importing
            amount_external = k2_netpr.

        wa_konp-kbetr = k2_netpr.
      endif.


      k4_netpr = k1_netpr.
      call function 'CONVERT_TO_LOCAL_CURRENCY'
        exporting
          date             = p_datuv
          foreign_amount   = k4_netpr
          foreign_currency = wa_konp-konwa
          local_currency   = 'HKD'
          type_of_rate     = 'M'
        importing
          local_amount     = k3_netpr
        exceptions
          no_rate_found    = 1
          others           = 2.
      wa_konp-kbphk = k3_netpr.

      move-corresponding wa_konp to t_konp.
      append t_konp.
    endif.
  endloop.

* delete customer/spot buy price
*  delete t_konp where kunnr <> ''.
*  delete t_konp where atwrt <> ''.

  sort t_konp by werks matnr autet descending kbphk lifnr.
endform.                    "get_purprice

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值