销售订单内部处理时间表

S_KUNNR 售达方 
S_MATNR 物料号 
S_UDATE 需求释放日期(速度慢)
S_VBELN 销售凭证 
S_WERKS 工厂
*&---------------------------------------------------------------------*

*& Report  ZSD_R_12
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  zsd_r_12.
type-poolsslis.
typesslis_t_fieldcat_alv type slis_fieldcat_alv occurs 1.

datag_events_t   type slis_t_event,
      g_fieldcat_t type slis_t_fieldcat_alv,
      g_layout_s   type slis_layout_alv,
      l_fieldcat_s type slis_fieldcat_alv.

datav_objectid type cdhdr-objectid.
dataz_cdpos    type cdpos_tab .
datazcdpos1    like cdpos occurs with header line.
dataz_cdhdr    like cdhdr occurs with header line.
dataz_cdhdr1   like cdhdr occurs with header line.
datastabkey    type string.

tablescdhdr,cdpos,marc,vbak,vbap,makt,afpo,aufm.

data:begin of itab occurs 0,
       werks  like marc-werks,    "工厂
       vbeln  like vbak-vbeln,    "销售订单
       posnr  like vbap-posnr,    "项目
       matnr  like marc-matnr,    "物料编码
       maktx  like makt-maktx,    "物料描述
       kbmeng like vbap-kbmeng,   "销售订单数量
       edatu  like vbep-edatu,    "销售订单交货日期
       ettyp  like vbep-ettyp,    "销售订单状态
       erdat  like vbap-erdat,    "cdhdr-udate, 销售订单下达日期(CN改成CP的时间)cdpos里面的修改时间
       aufnr  like afpo-aufnr,    "生产工单号
       psmng  like afpo-psmng,    "生产工单数量
       wemng  like afpo-wemng,    "报工数量(总报工数量)
       bldat  like aufm-bldat,    "每次报工入库入库时间(每次)
       menge  like aufm-menge,    "每次报工入库数量
       smenge like aufm-menge,    "总计入库数量
       kalab  like mska-kalab,    "现有库存
       rfmng  like vbfa-rfmng,    "出货数量
       lerdat like vbfa-erdat,    "最后一次发货日期
       kunnr  like vbak-kunnr,    "客户(售达方)
       name1  like kna1-name1,    "客户(售达方)
       stat   like jcds-stat,     "工单状态
     end of itab.

data:begin of itab_out occurs 0,
        werks  like marc-werks,    "工厂
        vbeln  like vbak-vbeln,    "销售订单
        posnr  like vbap-posnr,    "项目
        matnr  like marc-matnr,    "物料编码
        maktx  like makt-maktx,    "物料描述
        kbmeng like vbap-kbmeng,   "销售订单数量
        edatu  like vbep-edatu,    "销售订单交货日期
        ettyp  like vbep-ettyp,    "销售订单状态
        erdat  like vbap-erdat,    "cdhdr-udate, "销售订单下达日期(CN改成CP的时间)cdpos里面的修改时间
        aufnr  like afpo-aufnr,    "生产工单号
        psmng  like afpo-psmng,    "生产工单数量
        wemng  like afpo-wemng,    "报工数量(总报工数量)
        bldat  like aufm-bldat,    "每次报工入库入库时间(每次)
        bwart  like  aufm-bwart,   "移动类型
        menge  like aufm-menge,    "每次报工入库数量
        smenge like aufm-menge,    "总计入库数量
        kalab  like mska-kalab,    "现有库存
        rfmng  like vbfa-rfmng,    "出货数量
        lerdat like vbfa-erdat,    "最后一次发货日期
        kunnr  like vbak-kunnr,    "客户(售达方)
        name1  like kna1-name1,    "客户(售达方)
        stat   like jest-stat,     "工单状态
        txt30  like wusl6-txt,     "工单状态
        objnr  like aufk-objnr,
      end of itab_out.

data w_txt30 like wusl6-txt.

data:begin of itab_temp occurs 0,
       vbeln like vbak-vbeln,    "销售订单
       posnr like vbap-posnr,    "项目
       matnr like marc-matnr,    "物料编码
       aufnr like afpo-aufnr,    "生产工单号
       menge like aufm-menge,    "每次报工入库数量
     end of itab_temp.

data:begin of itab_vbfa occurs 0,
       vbelv like vbfa-vbelv,    "销售订单
       posnv like vbfa-posnv,    "项目
       bwart like vbfa-bwart,
       rfmng like vbfa-rfmng,
       erdat like vbfa-erdat,
     end of itab_vbfa.

data:begin of itab_vbfa_temp occurs 0,
       vbelv like vbfa-vbelv,    "销售订单
       posnv like vbfa-posnv,    "项目
       rfmng like vbfa-rfmng,
    end of itab_vbfa_temp.

data:begin of itab_vbeln occurs 0,
       vbelv like vbfa-vbelv,    "销售订单
       posnv like vbfa-posnv,    "项目
     end of itab_vbeln.

*查询条件(工厂\销售订单\物料编码\售达方)
selection-screen begin of block bl1 with frame title text-001.
select-optionss_werks for marc-werks default '1000',
                s_vbeln for vbak-vbeln,
                s_matnr for marc-matnr,
                s_kunnr for vbak-kunnr.
selection-screen end of block bl1.

selection-screen begin of block bl2 with frame title text-002.
select-optionss_udate for cdhdr-udate .
selection-screen end of block bl2.

initialization.
  perform layout_init    using g_layout_s.    "ALV GRID LAYOUT
  perform eventtab_build using g_events_t[].  "ALV GRID EVENT

start-of-selection.
  perform get_data.
  perform displaycatalog_merge using g_fieldcat_t[] 'ITAB'.
  perform alv_display          tables itab_out[].

*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form get_data.

  if s_udate  is not initial.

    select into corresponding fields of table z_cdhdr1
      from cdhdr
      where objectclas 'VERKBELEG'
        and tcode 'VA02'
        and udate in s_udate.

  endif.

  if not z_cdhdr1[] is  initial ).
    select objectid tabkey
      into corresponding fields of table zcdpos1
      from cdpos
      for all entries in  z_cdhdr1
      where objectclas 'VERKBELEG'
        and changenr   z_cdhdr1-changenr
        and tabname    'VBEP'
        and fname      'ETTYP'
        and value_new  'CP'.
  endif.

  loop at zcdpos1.
    itab_vbeln-vbelv zcdpos1-objectid.
    itab_vbeln-posnv zcdpos1-tabkey+13(6).

    append  itab_vbeln.
  endloop.

  delete adjacent duplicates from itab_vbeln comparing vbelv posnv.

  if s_udate  is not initial and itab_vbeln[] is not initial ).
    select vbap~werks vbap~vbeln vbap~posnr vbap~matnr vbap~kbmeng vbap~erdat
           vbep~edatu vbep~ettyp
           vbak~kunnr
           kna1~name1
           mska~kalab
           makt~maktx
      into corresponding fields of table itab
      from  vbap
      inner join vbak on vbap~vbeln vbak~vbeln
      inner join kna1 on vbak~kunnr kna1~kunnr
      inner join vbep on vbap~vbeln vbep~vbeln
                     and vbap~posnr vbep~posnr   " vbep会存在多行的问题
      inner join mska on vbap~vbeln mska~vbeln
                     and vbap~posnr mska~posnr
      inner join makt on vbap~matnr makt~matnr
                     and makt~spras sy-langu
      for all entries in  itab_vbeln
      where vbap~vbeln in s_vbeln
        and vbap~matnr in s_matnr
        and vbap~werks in s_werks
        and vbak~kunnr in s_kunnr
        and vbap~vbeln itab_vbeln-vbelv
        and vbap~posnv itab_vbeln-posnv.

  else.
    if s_udate  is not initial and itab_vbeln[] is  initial ).
      message '没有符合条件的销售订单.' type 'E'.
    endif.
  endif.

  if s_udate is initial.
    select vbap~werks vbap~vbeln  vbap~posnr vbap~matnr vbap~kbmeng vbap~erdat
           vbep~edatu vbep~ettyp
           vbak~kunnr
           kna1~name1
           mska~kalab
           makt~maktx
      into corresponding fields of table itab
      from  vbap
      inner join vbak on vbap~vbeln vbak~vbeln
      inner join kna1 on vbak~kunnr kna1~kunnr
      inner join vbep on vbap~vbeln vbep~vbeln
                     and vbap~posnr vbep~posnr   " vbep会存在多行的问题
      inner join mska on vbap~vbeln mska~vbeln
                     and vbap~posnr mska~posnr
      inner join makt on vbap~matnr makt~matnr
                     and makt~spras sy-langu
      where vbap~vbeln in s_vbeln
        and vbap~matnr in s_matnr
        and vbap~werks in s_werks
        and vbak~kunnr in s_kunnr.
  endif.

  if  itab[] is  initial ).
    message '没有符合条件的销售订单.' type 'E'.
  endif.

  delete adjacent duplicates from itab comparing vbeln posnr.

*取已发货数和最后发货的时间。

  select vbelv posnv bwart rfmng erdat vbeln posnn
    into corresponding fields of table  itab_vbfa
    from  vbfa
    for all entries in itab
    where vbfa~vbelv itab-vbeln
      and vbfa~posnv itab-posnr
      and vbtyp_n 'J'
      and rfmng <> 0.

  loop at itab_vbfa.   "计算总发货数
    if itab_vbfa-bwart '602'.
      itab_vbfa-rfmng itab_vbfa-rfmng.
      modify itab_vbfa.
    endif.
    move-corresponding itab_vbfa to itab_vbfa_temp.
    collect itab_vbfa_temp.
  endloop.

  sort itab_vbfa by vbelv posnv erdat descending."为读取最后发货时间做准备

  loop at itab.
*  "取需求下达时间
    field-symbols  like line of z_cdpos.
    move itab-vbeln to v_objectid .
    call function 'CHANGEDOCU_CDPOS_READ'
      exporting
        iv_objectclas      'VERKBELEG'
        iv_objectid        v_objectid
        iv_tabname         'VBEP'
        iv_fname           'ETTYP'
        iv_client          sy-mandt
      importing
        et_cdpos           z_cdpos
      exceptions
        no_importparameter 1
        others             2.

    call function 'BUS_CDHDR_GET'
      exporting
        i_objectclas 'VERKBELEG'
        i_objectid   v_objectid
      tables
        t_cdhdr      z_cdhdr.

    sort z_cdpos by objectid.

    loop at z_cdpos assigning  where value_old 'CN'   "对于从CP又转CN的,不属于第一次下达时间
                                        and value_new 'CP'
                                        and objectid itab-vbeln.
      clear stabkey.
      concatenate sy-mandt itab-vbeln itab-posnr into stabkey.
      find stabkey in -tabkey.
      if sy-subrc 0.
        read table z_cdhdr with key changenr -changenr.
        itab-erdat z_cdhdr-udate.
        itab-ettyp 'CP' .
        exit.
      elseif itab-ettyp 'CP'.
        itab-erdat itab-erdat.
      endif.
    endloop.

*    已发货数量
    read table itab_vbfa_temp with key vbelv itab-vbeln posnv itab-posnr.
    if sy-subrc 0.
      itab-rfmng itab_vbfa_temp-rfmng.
    endif.

*    最后一次发货时间
    read table itab_vbfa with key vbelv itab-vbeln posnv itab-posnr.
    if sy-subrc 0.
      itab-lerdat itab_vbfa-erdat.
    endif.
    modify itab.
  endloop.


  if itab[] is not initial.
    select afpo~kdauf as vbeln afpo~kdpos as posnr
           afpo~matnr afpo~aufnr afpo~psmng afpo~wemng
           aufm~mblnr aufm~bldat aufm~bwart aufm~menge
           aufk~objnr
      into corresponding fields of table itab_out
      from afpo
      inner join aufk on afpo~aufnr aufk~aufnr
      left  join aufm on afpo~aufnr aufm~aufnr
      for all entries in itab
      where afpo~kdauf itab-vbeln
        and afpo~kdpos itab-posnr
        and afpo~matnr itab-matnr.

    loop at itab_out.
      if not itab_out-bwart '101' or itab_out-bwart '102' ).
        itab_out-menge 0.
        modify itab_out.
      endif.

      if itab_out-bwart '102'.
        itab_out-menge itab_out-menge.
        modify itab_out.
      endif.

      move-corresponding itab_out to itab_temp.

      collect itab_temp.
      read table itab with key vbeln itab_out-vbeln
                               posnr itab_out-posnr
                               matnr itab_out-matnr.
      if sy-subrc 0.
        itab_out-werks itab-werks.
        itab_out-vbeln itab-vbeln.
        itab_out-ettyp =  itab-ettyp.
        itab_out-kbmeng itab-kbmeng.
        itab_out-erdat itab-erdat.
        itab_out-edatu  itab-edatu.

        itab_out-aufnr  itab_out-aufnr.
        itab_out-kunnr itab-kunnr.

        itab_out-name1 itab-name1.
        itab_out-kalab itab-kalab.
        itab_out-maktx itab-maktx.
        itab_out-rfmng itab-rfmng.
        itab_out-lerdat itab-lerdat.
        modify itab_out.
      endif.
    endloop.
  endif.

  delete itab_out where menge 0.

  loop at itab_out.
    read table itab_temp with key vbeln itab_out-vbeln
                                  posnr itab_out-posnr
                                  matnr itab_out-matnr
                                  aufnr itab_out-aufnr.
    if sy-subrc 0.
      itab_out-smenge itab_temp-menge.
    endif.

*生产订单状态处理
    select txt04 into w_txt30
      from jest
      inner join tj02t on jest~stat tj02t~istat
                      and tj02t~spras sy-langu
      where jest~objnr itab_out-objnr
        and inact space
        and jest~stat 'I0001' or jest~stat 'I0002' or
              jest~stat 'I0012' or jest~stat 'I0016' or
              jest~stat 'I0028' or jest~stat 'I0033' or
              jest~stat 'I0118' or jest~stat 'I0321' or
              jest~stat 'I0369' or jest~stat 'I0420' ).

      concatenate itab_out-txt30  w_txt30 into itab_out-txt30 separated by ' '.
    endselect.
    modify itab_out.
  endloop.

endform.                    "get_data

*&---------------------------------------------------------------------*
*&      Form  layout_init
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_LAYOUT_S  text
*----------------------------------------------------------------------*
form layout_init using p_g_layout_s type slis_layout_alv.
  p_g_layout_s-detail_popup 'X'.
  p_g_layout_s-colwidth_optimize 'X'.
endform.  " LAYOUT_INIT
*--------------------------------------------------------------------
*       FORM EVENTTAB_BUILD
*--------------------------------------------------------------------
form eventtab_build using  p_g_events_t  type slis_t_event.
  datal_event type slis_alv_event.
  call function 'REUSE_ALV_EVENTS_GET'
    exporting
      i_list_type 0
    importing
      et_events   p_g_events_t.
* GUI STATUS
  read table p_g_events_t with key name slis_ev_pf_status_set
                          into l_event.
  if sy-subrc eq 0.
    move 'PF_STATUS_SET' to l_event-form.
    append l_event      to p_g_events_t.
  endif.
endform.  " EVENTTAB_BUILD

*&---------------------------------------------------------------------*
*&      Form  displaycatalog_merge
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_FIELDCAT_T  text
*      -->P_TABNAME       text
*----------------------------------------------------------------------*
form displaycatalog_merge using p_g_fieldcat_t
                                type slis_t_fieldcat_alv
                                p_tabname.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'WERKS'.
  l_fieldcat_s-seltext_m '工厂'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'VBELN'.
  l_fieldcat_s-seltext_m '销售订单号'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'POSNR'.
  l_fieldcat_s-seltext_m '项目'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'MATNR'.
  l_fieldcat_s-seltext_m '物料编码'.
  l_fieldcat_s-no_zero 'X'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'MAKTX'.
  l_fieldcat_s-seltext_m '物料描述'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'KBMENG'.
  l_fieldcat_s-seltext_m '销售订单数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'EDATU'.
  l_fieldcat_s-seltext_m '订单要求交期'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'ETTYP'.
  l_fieldcat_s-seltext_m '销售订单状态'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'ERDAT'.
  l_fieldcat_s-seltext_m '销售订单下达日期'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'AUFNR'.
  l_fieldcat_s-seltext_m '生产工单号'.
  l_fieldcat_s-no_zero 'X'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'TXT30'.
  l_fieldcat_s-seltext_m '工单状态'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'PSMNG'.
  l_fieldcat_s-seltext_m '工单数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'WEMNG'.
  l_fieldcat_s-seltext_m '报工数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'BLDAT'.
  l_fieldcat_s-seltext_m '入库时间'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'BWART'.
  l_fieldcat_s-seltext_m '移动类型'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'MENGE'.
  l_fieldcat_s-seltext_m '入库数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'SMENGE'.
  l_fieldcat_s-seltext_m '工单总计入库数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'KALAB'.
  l_fieldcat_s-seltext_m '订单库存数'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'RFMNG'.
  l_fieldcat_s-seltext_m '出货数量'.
  l_fieldcat_s-decimals_out 0.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'LERDAT'.
  l_fieldcat_s-seltext_m '最后一次发货日期'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'KUNNR'.
  l_fieldcat_s-seltext_m '客户编号(售达方)'.
  l_fieldcat_s-no_zero 'X'.
  append l_fieldcat_s to p_g_fieldcat_t.

  clear l_fieldcat_s.
  l_fieldcat_s-fieldname 'NAME1'.
  l_fieldcat_s-seltext_m '客户名称(售达方)'.
  append l_fieldcat_s to p_g_fieldcat_t.

endform.  " FIELDCATALOG_MERGE
*&--------------------------------------------------------------------*
*&      Form  user_callback
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->RF_UCOMM   text
*      -->RS_SELFIELDtext
*---------------------------------------------------------------------*
form user_callback using rf_ucomm type sy-ucomm
                        rs_selfield type slis_selfield.
  case rf_ucomm.
    when '&IC1'.
      data msg type string.
      field-symbols  like line of itab.
      read table itab index rs_selfield-tabindex assigning .
      if sy-subrc 0.
        set parameter id'AUN' field -vbeln.
        call transaction 'VA03' and skip first screen.
      endif.
  endcase.
endform.   " user_callback


*&---------------------------------------------------------------------*
*&      Form  ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RESULT1[]  text
*----------------------------------------------------------------------*
form alv_display tables p_int_t.
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program      sy-repid "G_REPID
      i_callback_user_command 'USER_CALLBACK'
      is_layout               g_layout_s
      it_fieldcat             g_fieldcat_t[]
      i_save                  'A'
    tables
      t_outtab                p_int_t
    exceptions
      program_error           1
      others                  2.

endform.                    " ALV_DISPLAY
请使用浏览器的分享功能分享到微信等