ZSDR004 : Upload Forecast MD63

本文介绍了一个用于SAP系统中的ABAP程序ZSDR004,该程序主要用于上传销售预测数据。文章详细解释了程序的功能、创建历史、内部结构以及关键操作流程。包括数据验证、错误处理及需求计划的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& Progarm      :  ZSDR004                        Author : Jimmy Wong
*& Created      :  17 Sep 2012                    App    : SD
*& Title        :  Upload Forecast
*& Description  :  Upload Forecast
*&---------------------------------------------------------------------*
*&  Version       Author      Date        description
*&                Jimmy       17 Sep 2012 the first version
*&  the last update time  2013.03.11 17:00
*&---------------------------------------------------------------------*
report  zsdr004 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : rlgrap,pbim.",tprg,pbed.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
include zsd_forecast.
*----------------------------------------------------------------------*
*  Parameter & Select-Options                                          *
*----------------------------------------------------------------------*
selection-screen begin of block with frame title text-001.
parameters filename type rlgrap-filename obligatory.
selection-screen end of block 1.
*----------------------------------------------------------------------*
*  Initialize                                                          *
*----------------------------------------------------------------------*
initialization.
*----------------------------------------------------------------------*
*  AT SELECTION-SCREEN
*----------------------------------------------------------------------*
at selection-screen on value-request for filename.
  call function 'WS_FILENAME_GET'
    exporting
      def_path         'C:\'
      mask             ',Excel Files,*.xls,All Files,*.*.'(101)
      mode             'O'
      title            'Select file'(100)
    importing
      filename         filename
    exceptions
      selection_cancel 1
      selection_error  2
      others           3.
  if sy-subrc ne 0.
    "     .
  endif.
*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
  refresh: it_record,lt_gt_data,it_create,it_change,it_err2,itab_create,itab_change.
  clear: it_record,lt_gt_data,it_create,it_change,it_err2,itab_create,itab_change.
  perform manual_upld.
  if sy-subrc ne 0.
    clear msg.
    concatenate 'Upload Filename ' filename ' is Error' into msg.
    message msg type 'I'.
    exit.
  endif.
  sort lt_gt_data by row col value.
  read table lt_gt_data index 1.
  if sy-subrc ne 0.
    clear : msg.
    concatenate 'Upload File ' filename  ' Is Null!' into msg.
    message msg type 'I'.
    exit.
  endif.

  perform get_it_record.
  if it_record[] is initial.
    message 'No Record Found' type 'I'.
    exit.
  endif.
  perform get_check_data.
  perform check_it_record using '04'.
  perform process_data.
  perform write_data.

end-of-selection.
*&---------------------------------------------------------------------*
*&      Form  MANUAL_UPLD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form manual_upld .
  call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    exporting
      filename    filename
      i_begin_col '1'
      i_begin_row '3'
      i_end_col   '9'
      i_end_row   '50000'
    tables
      intern      lt_gt_data
    exceptions
      upload_ole  1.
  if sy-subrc ne 0.
    "     message i004(zmm)
  endif.
endform.                    " MANUAL_UPLD
*&---------------------------------------------------------------------*
*&      Form  GET_IT_RECORD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_it_record .
  data:lv_order type i.
  check not lt_gt_data[] is initial.
  lv_order 1.
  describe table lt_gt_data lines lv_total_line.
  loop at lt_gt_data.
    lv_line =  sy-tabix  / lv_total_line * 100.
    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        percentage lv_line
        text       'Get Data........'.
    shift lt_gt_data-value right deleting trailing space.
    shift lt_gt_data-value left deleting leading space.
    case lt_gt_data-col.
      when '1'.
        it_record-pbdnr lt_gt_data-value .
        translate it_record-pbdnr to upper case.
      when '2'.
        it_record-werks lt_gt_data-value .
      when '3'.
        it_record-versb lt_gt_data-value .
        perform add_pre_zero using it_record-versb
             changing it_record-versb.
      when '4'.
        it_record-matnr_c lt_gt_data-value.
        perform  tranfer_material using it_record-matnr_c
                                  changing it_record-matnr.
      when '5'.
        it_record-prgbz lt_gt_data-value .
        translate it_record-prgbz to upper case.
      when '6'.
        perform process_num using lt_gt_data-value
                 changing it_record-weeks_i.
        it_record-weeks_c lt_gt_data-value.
        perform add_pre_zero using it_record-weeks_c
                             changing it_record-weeks_c.
      when '7'.
        perform process_num using lt_gt_data-value
                 changing it_record-year_i.
        it_record-year_c lt_gt_data-value.
      when '8'.
        perform process_num using lt_gt_data-value
                 changing it_record-plnmg.
        it_record-plnmg_c lt_gt_data-value.

      when '9'.
        it_record-posid lt_gt_data-value .
        if it_record-posid is not initial .
          perform  tranfer_wbs using it_record-posid
                                    changing it_record-pspnr.
        endif.
    endcase.
    at end of row.
      it_record-order lv_order.
      append it_record.
      add to lv_order.
      clear:it_record.
    endat.
  endloop.
endform.                    " GET_IT_RECORD

*&---------------------------------------------------------------------*
*&  Include           ZSD_FORECAST
*&---------------------------------------------------------------------*
data:begin of it_record occurs 0,
      order type i,
      pbdnr like pbim-pbdnr,
      werks like pbim-werks,
      versb like pbim-versb,
      matnr like pbim-matnr,
      matnr_c(20type c,
      prgbz like tprg-prgbz,
      prgrs like tprg-prgrs,
      weeks_c(2type c,
      weeks_i type i,
      year_c(4type c,
      year_i type i,
      week like scal-week,
      pdatu like pbed-pdatu,
      plnmg_c(20type c,
      plnmg like pbed-plnmg,
      pspnr like prps-pspnr,
      posid like prps-posid,
      meins  like pbed-meins,
      iscreate    type c,
      message(700type c,
    end of it_record.
data: it_err2 like it_record occurs with header line.
data: it_err3 like it_record occurs with header line.
data: it_create like it_record occurs with header line.
data: it_change like it_record occurs with header line.
data: begin of wa_itab,
      pbdnr like pbim-pbdnr,
      werks like pbim-werks,
      versb like pbim-versb,
      matnr like pbim-matnr,
      message(700type c,
      end of wa_itab.
data: itab_create like wa_itab occurs with header line.
data: itab_change like wa_itab occurs with header line.
data: req_item like bapisitemr.
data: req_data like bapisshdin occurs with header line.
data: it_return like bapireturn1 occurs with header line.
data: matemp like bapisitemr-material.

data:begin of it_t001w occurs 50,
    werks   like t001w-werks,
    end of it_t001w.
data:begin of it_t459v occurs 0,
    versb   like t459v-versb,
    end of it_t459v.
data:begin of it_mara occurs 0,
   matnr   like mara-matnr,
   mtart   like mara-mtart,
   end of it_mara.
data:begin of it_pbim occurs 0,
      pbdnr like pbim-pbdnr,
      werks like pbim-werks,
      versb like pbim-versb,
      matnr like pbim-matnr,
   end of it_pbim.
data:begin of it_tprg occurs 20,
    prgbz  like tprg-prgbz,
    prgrs  like tprg-prgrs,
    end of it_tprg.
define alv_field.
  clear:wa_hier.
  wa_hier-col_pos &1.
  wa_hier-fieldname &2.
  wa_hier-seltext_m &3.
  wa_hier-seltext_l &4.
  wa_hier-outputlen &5.
  wa_hier-just &6.
  wa_hier-do_sum &7.
  wa_hier-ref_tabname &8 .
  wa_hier-ref_fieldname &9 .
  append wa_hier to fc_hier.
end-of-definition.
type-pools: slis.
data: fc_hier type slis_t_fieldcat_alv,
      wa_hier type slis_fieldcat_alv .
data: lt_gt_data type alsmex_tabline occurs with header line.
data:lv_tabix like sy-tabix,
     lv_pspnr like prps-pspnr,
     lv_vervs type vervs,
     msg   type string,
     lv_col type i,
     lv_dt1  type i,
     lv_dt2  type i.
data:lv_total_line type i,
   lv_line type decimals 3.
constants:c_chk_num like pa0001-ename value '0123456789.,'.

*&---------------------------------------------------------------------*
*&      Form  TRANFER_MATERIAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_it_record_MATNR  text
*      <--P_it_record_MATNR_C  text
*----------------------------------------------------------------------*
form  tranfer_material using    p_old
                       changing p_new  .
  translate p_old to upper case.
  call function 'CONVERSION_EXIT_MATN1_INPUT'
    exporting
      input        p_old
    importing
      output       p_new
    exceptions
      length_error 1
      others       2.
  if sy-subrc <> 0.
  endif.
endform.                    "tranfer_material
*&---------------------------------------------------------------------*
*&      Form  TRANFER_WBS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RECORD_POSID  text
*      <--P_IT_RECORD_PSPNR  text
*----------------------------------------------------------------------*
form tranfer_wbs  using    p_old
                  changing p_new  .
  translate p_old to upper case.
  call function 'CONVERSION_EXIT_ABPSP_INPUT'
    exporting
      input     p_old
    importing
      output    p_new
    exceptions
      not_found 1
      others    2.
  if sy-subrc <> 0.
    clear:p_new.
  endif.
endform.                    " TRANFER_WBS
*&---------------------------------------------------------------------*
*&      Form  ADD_PRE_ZERO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RECORD_WEEKS_C  text
*      <--P_IT_RECORD_WEEKS_C  text
*----------------------------------------------------------------------*
form add_pre_zero  using    p_old
                   changing p_new .

  call function 'CONVERSION_EXIT_ALPHA_INPUT'
    exporting
      input  p_old
    importing
      output p_new.
endform.                    " ADD_PRE_ZERO
*&---------------------------------------------------------------------*
*&      Form  PROCESS_NUM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_GT_DATA_VALUE  text
*      <--P_IT_RECORD_KPEIN  text
*----------------------------------------------------------------------*
form process_num  using    p_value
                  changing p_change.
  data :lv_value type length 30 .
  if p_value cn c_chk_num.
    p_change -1.
  else.
    lv_value  p_value.
    call function 'C14DG_CHAR_NUMBER_CONVERSION'
      exporting
        i_string                   lv_value
      importing
*       E_FLOAT                    =
        e_dec                      p_change
*       E_DECIMALS                 =
      exceptions
        wrong_characters           1
        first_character_wrong      2
        arithmetic_sign            3
        multiple_decimal_separator 4
        thousandsep_in_decimal     5
        thousand_separator         6
        number_too_big             7
        others                     8.
    if sy-subrc 7.
      p_change p_value.
    endif.
  endif.
endform.                    " PROCESS_NUM
*&---------------------------------------------------------------------*
*&      Form  GET_CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_check_data .
  select   werks into table it_t001w
     from t001w.
  sort it_t001w by   werks.

  select  versb into table it_t459v
      from t459v
      where spras sy-langu .
  sort it_t459v by   versb.

  select matnr mtart into table it_mara
      from mara
      for all entries in it_record
      where matnr it_record-matnr.
  sort it_mara by  matnr.

  select prgbz prgrs
    into corresponding fields of table it_tprg
      from tprg
      where  spras sy-langu.
  sort it_tprg by prgbz prgrs .

  select matnr werks versb  pbdnr
    into corresponding fields of table it_pbim
    from pbim
    for all entries in it_record
    where matnr it_record-matnr
        and werks it_record-werks
        and bedae 'VSFB'
        and versb it_record-versb
        and pbdnr it_record-pbdnr.
  sort it_pbim by matnr werks versb pbdnr.
endform.                    " GET_CHECK_DATA
*&---------------------------------------------------------------------*
*&      Form  CHECK_IT_RECORD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form check_it_record using p_type .
  data: lv_flag2 type c,
         lv_week  like scal-week,
         lv_week_i type i,
         lv_week_c(2type c ,
         lv_data   like sy-datum,
         lv_fabkl  like t001w-fabkl,
         l_objkey type sibfboriid,
         wfstate type char1,
         lv_msg type length 100.
  clear:lv_flag2.
  describe table it_record lines lv_total_line.
  sort it_record by pbdnr werks versb matnr.
  loop at it_record.
    lv_tabix sy-tabix.
    lv_line =  sy-tabix  / lv_total_line * 100.
    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        percentage lv_line
        text       'Check Data........'.
    clear:lv_flag2,it_record-message.

    "plant
    read table it_t001w with key  werks it_record-werks binary search.
    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.
    "version
    read table it_t459v with key  versb =  it_record-versb binary search .
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Version Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    else.
      if p_type '11'.
        if  it_record-versb ='00'.
          lv_flag2 'X'.
          concatenate it_record-message  ' Version<>00 error.'
                 into it_record-message.
          modify it_record index lv_tabix.
        endif.
      endif.
    endif.
    " Material code
    read table it_mara with key matnr it_record-matnr binary search.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Material Code Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.

    "Period
    read table it_tprg with key prgbz it_record-prgbz binary search.
    if sy-subrc <> 0.
      lv_flag2 'X'.
      concatenate it_record-message  ' Period Not Exists.'
             into it_record-message.
      modify it_record index lv_tabix.
    else.
      if p_type '04'.
        clear:it_record-prgrs.
        it_record-prgrs it_tprg-prgrs.
      endif.
      if  it_record-prgbz <> 'W' and it_record-prgbz <> 'M'.
        lv_flag2 'X'.
        concatenate it_record-message  ' Period <>W or Period <>M error.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    endif.
    "M no. or W no.
    if it_record-weeks_i < or it_record-year_i < 0.
      if it_record-weeks_i < 0.
        lv_flag2 'X'.
        concatenate it_record-message  ' M no. or W no. error.'
               into it_record-message.
        modify it_record index lv_tabix.
      elseif   it_record-year_i < 0.

        lv_flag2 'X'.
        concatenate it_record-message  ' Y no. error.'
               into it_record-message.
        modify it_record index lv_tabix.
      endif.
    else.
      if p_type '04'.
        clear:it_record-pdatu,it_record-week,lv_week_c,lv_week_i.
        if it_record-prgbz 'W'.
          call function 'BKK_GET_LASTWEEK_OF_YEAR'
            exporting
              i_year it_record-year_i
            importing
              e_week lv_week
            exceptions
              others 1.
          lv_week_i lv_week+4(2).
          lv_week_c lv_week_i .
          if it_record-weeks_i > lv_week_i.
            lv_flag2 'X'.
            concatenate it_record-message  '  W no.>' lv_week_c ' error.'
                   into it_record-message.
            modify it_record index lv_tabix.
          else.
            concatenate it_record-year_c it_record-weeks_c into it_record-week.
            call function 'HRIQ_WEEK_GET_FIRST_DAY'
              exporting
                week         it_record-week
              importing
                date         it_record-pdatu
              exceptions
                week_invalid 1
                others       2.
            if sy-subrc ne 0 .
              lv_flag2 'X'.
              concatenate it_record-message  ' M no. or W no. error.'
                     into it_record-message.
            endif.
            modify it_record index lv_tabix.
          endif.
        else.
          if it_record-weeks_i > 12.
            lv_flag2 'X'.
            concatenate it_record-message  ' M no.>12 error.'
                   into it_record-message.
            modify it_record index lv_tabix.
          else.
            clear: lv_data,lv_fabkl.
            concatenate it_record-year_c it_record-weeks_c '01' into lv_data.
            select single fabkl into lv_fabkl from t001w where werks it_record-werks.
            call function 'DATE_CONVERT_TO_FACTORYDATE'
              exporting
                date                         lv_data
                factory_calendar_id          lv_fabkl
              importing
                date                         it_record-pdatu
              exceptions
                calendar_buffer_not_loadable 1
                correct_option_invalid       2
                date_after_range             3
                date_before_range            4
                date_invalid                 5
                factory_calendar_not_found   6
                others                       7.

          endif.
        endif.
      endif.
    endif.

    "Quantity
    if it_record-plnmg 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-plnmg < 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.
    "Production Lot
*    if it_record-pspnr is  initial.
*      lv_flag2 = 'X'.
*      concatenate it_record-message  ' Production Lot  error.'
*             into it_record-message.
*      modify it_record index lv_tabix.
*    endif.
    "Requirement Plan
    if it_record-pbdnr space or it_record-pbdnr is initial .
      lv_flag2 'X'.
      concatenate it_record-message  ' Requirement Plan is empty.'
             into it_record-message.
      modify it_record index lv_tabix.
    endif.
*M2 add
    if p_type '11'.
      on change of  it_record-pbdnr or  it_record-werks or  it_record-versb  .
        clear: l_objkey,wfstate,lv_msg.
        l_objkey+0(4it_record-werks.
        l_objkey+4(2it_record-versb.
        l_objkey+6(10it_record-pbdnr.

        call function 'ZWF_GET_CURRENTSPSTEPID'
          exporting
            wfid    'WFSD0002'
            instid  l_objkey
          importing
            wfstate wfstate.
        if wfstate 2.
          lv_msg 'pir is being processed, you cannot make changes!'.
        endif.
      endon.
    endif.
    if lv_msg is not initial.
      lv_flag2 'X'.
      concatenate it_record-message  lv_msg
             into it_record-message separated by space.
      modify it_record index lv_tabix.
    endif.
*M2 end
    if lv_flag2 <> 'X'.
      " is Create
      read table it_pbim with key matnr it_record-matnr
                                  werks it_record-werks
                                  versb it_record-versb
                                  pbdnr it_record-pbdnr  binary search.
      if sy-subrc ne 0.
        it_record-iscreate 'X'.
      endif.
      it_record-message ' OK.'.
      modify it_record index lv_tabix.
    endif.
  endloop.
endform.                    " CHECK_IT_RECORD
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form process_data .

  loop at it_record.
    if not it_record-message ' OK.'.
      move-corresponding it_record to it_err2.
      append it_err2.
      clear it_err2.
    else.
      if it_record-iscreate 'X'.
        move-corresponding it_record to it_create.
        append  it_create.
        itab_create-pbdnr it_record-pbdnr.
        itab_create-werks it_record-werks.
        itab_create-versb it_record-versb.
        itab_create-matnr it_record-matnr.
        collect itab_create.
        clear:  it_create,itab_create.
      else.
        move-corresponding it_record to it_change.
        append  it_change.
        itab_change-pbdnr it_record-pbdnr.
        itab_change-werks it_record-werks.
        itab_change-versb it_record-versb.
        itab_change-matnr it_record-matnr.
        collect itab_change.
        clear:  it_change,itab_change.
      endif.
    endif.
  endloop.

  "Create Requirement Plan
  if not itab_create[] is initial.
    describe table itab_create lines lv_total_line.
    sort itab_create by pbdnr werks versb matnr.
    loop at itab_create.
      lv_line =  sy-tabix  / lv_total_line * 100.
      call function 'SAPGUI_PROGRESS_INDICATOR'
        exporting
          percentage lv_line
          text       'Processing Create Data........'.
      lv_tabix sy-tabix.
      req_item-material itab_create-matnr.
      req_item-plant itab_create-werks.
      req_item-requ_type 'VSFB'.
      req_item-version itab_create-versb.
      if itab_create-versb '00'.
        req_item-vers_activ 'X'.
      else.
        req_item-vers_activ ''.
      endif.
      req_item-req_number itab_create-pbdnr .
      loop at it_create where pbdnr =   itab_create-pbdnr
                            and werks itab_create-werks
                            and versb itab_create-versb
                            and matnr itab_create-matnr.
        req_data-date_type it_create-prgrs.
        req_data-req_date it_create-pdatu.
        req_data-req_qty it_create-plnmg.
        lv_pspnr  it_create-pspnr.
        append req_data.
      endloop.
      call function 'BAPI_REQUIREMENTS_CREATE'
        exporting
          requirements_item        req_item
        importing
          material                 matemp
        tables
          requirements_schedule_in req_data
          return                   it_return.

      read table it_return with key type 'E'.
      if sy-subrc eq 0.
        loop at it_return where type 'E'.
          concatenate itab_create-message  ' E: ' it_return-message into itab_create-message.
        endloop.
        "concatenate 'E:' itab_create-message into itab_create-message.
        modify itab_create index lv_tabix transporting message .
      else.
        call function 'BAPI_TRANSACTION_COMMIT'
          exporting
            wait 'X'.
*
*        if lv_pspnr is not initial.
*          select * from pbim where matnr = itab_create-matnr
*                               and werks = itab_create-werks
*                               and bedae = 'VSFB'
*                               and versb = itab_create-versb
*                               and pbdnr = itab_create-pbdnr.
*          endselect.
*          if sy-subrc eq 0.
*            update pbim set knttp = 'Q'
*                            sobkz = 'Q'
*                            kzvbr = 'P'
*                            pspel  = lv_pspnr
*                            kzbws = 'M'
*                               where matnr = itab_create-matnr
*                                 and werks = itab_create-werks
*                                 and bedae = 'VSFB'
*                                 and versb = itab_create-versb
*                                 and pbdnr = itab_create-pbdnr.
*            if sy-subrc eq 0.
*              itab_create-message = 'Success.'.
*              modify itab_create index lv_tabix transporting message .
*            endif.
*          else.
*            itab_create-message = 'Update wbs failing'.
*            modify itab_create index lv_tabix transporting message .
*          endif.
*        else.
        itab_create-message 'Success.'.
        modify itab_create index lv_tabix transporting message .
*        endif.
      endif.
      clear:req_item,req_data,it_return,it_return[],req_data[],lv_pspnr,itab_create-message.
    endloop.
    " update wbs
    wait up to seconds.
    loop at itab_create.
      check itab_create-message 'Success.'.
      read table it_create  with  key pbdnr itab_create-pbdnr
                                      werks itab_create-werks
                                      versb itab_create-versb
                                      matnr itab_create-matnr.
      if sy-subrc eq  0.
        lv_pspnr  it_create-pspnr.
        if lv_pspnr is  not initial.
          update pbim set knttp 'Q'
                          sobkz 'Q'
                          kzvbr 'P'
                          pspel  lv_pspnr
                          kzbws 'M'
                             where matnr itab_create-matnr
                               and werks itab_create-werks
                               and bedae 'VSFB'
                               and versb itab_create-versb
                               and pbdnr itab_create-pbdnr.
          commit work and wait.
        endif.
      endif.
    endloop.

    sort itab_create by pbdnr werks versb  matnr.
    loop at it_create.
      lv_tabix sy-tabix.
      read table itab_create with key pbdnr it_create-pbdnr
                                      werks it_create-werks
                                      versb it_create-versb
                                      matnr it_create-matnr binary search.
      if sy-subrc eq 0.
        it_create-message itab_create-message .
        modify it_create index  lv_tabix transporting message.
      endif.
    endloop.
  endif.

  "Change Requirement Plan
  if not  itab_change[] is initial.
    describe table itab_change lines lv_total_line.
    loop at itab_change.
      lv_line =  sy-tabix  / lv_total_line * 100.
      call function 'SAPGUI_PROGRESS_INDICATOR'
        exporting
          percentage lv_line
          text       'Processing Change Data........'.
      lv_tabix sy-tabix.
      loop at it_change where pbdnr =   itab_change-pbdnr
                            and werks itab_change-werks
                            and versb itab_change-versb
                            and matnr itab_change-matnr.
        req_data-date_type it_change-prgrs.
        req_data-req_date it_change-pdatu.
        req_data-req_qty it_change-plnmg.
        lv_pspnr  it_change-pspnr.
        append req_data.
      endloop.
      if itab_change-versb '00'.
        lv_vervs 'X'.
      else.
        lv_vervs ''.
      endif.
      call function 'BAPI_REQUIREMENTS_CHANGE'
        exporting
          material                 itab_change-matnr
          plant                    itab_change-werks
          requirementstype         'VSFB'
          version                  itab_change-versb
          vers_activ               lv_vervs
          reqmtsplannumber         itab_change-pbdnr
          NO_WITHDR                'X'
        importing
          requirement_item_out     req_item
        tables
          requirements_schedule_in req_data
          return                   it_return.

      read table it_return with key type 'E'.
      if sy-subrc eq 0.
        loop at it_return where type 'E'.
          concatenate itab_change-message ' E: ' it_return-message into itab_change-message.
        endloop.
        modify itab_change index lv_tabix transporting message .
      else.
        call function 'BAPI_TRANSACTION_COMMIT'
          exporting
            wait 'X'.
*        wait up to 1 seconds.
*
*        if lv_pspnr is not initial.
*          select * from pbim  where matnr = itab_change-matnr
*                               and werks = itab_change-werks
*                               and bedae = 'VSFB'
*                               and versb = itab_change-versb
*                               and pbdnr = itab_change-pbdnr.
*          endselect.
*          if sy-subrc eq 0.
*            update pbim set knttp = 'Q'
*                            sobkz = 'Q'
*                            kzvbr = 'P'
*                            pspel  = lv_pspnr
*                            kzbws = 'M'
*                               where matnr = itab_change-matnr
*                                 and werks = itab_change-werks
*                                 and bedae = 'VSFB'
*                                 and versb = itab_change-versb
*                                 and pbdnr = itab_change-pbdnr.
*            if sy-subrc eq 0.
*              itab_change-message = 'Success.'.
*              modify itab_change index lv_tabix transporting message.
*            endif.
*          else.
*            itab_change-message = 'Update wbs failing'.
*            modify itab_change index lv_tabix transporting message.
*          endif.
*        else.
        itab_change-message 'Success.'.
        modify itab_change index lv_tabix transporting message.
*        endif.
      endif.
      clear:req_data,it_return,it_return[],req_data[],req_item,lv_pspnr,itab_change-message.
    endloop.
    " update wbs
    wait up to seconds.
    loop at itab_change.
      check itab_change-message 'Success.'.
      read table it_change  with  key pbdnr itab_change-pbdnr
                                      werks itab_change-werks
                                      versb itab_change-versb
                                      matnr itab_change-matnr.
      if sy-subrc eq  0.
        lv_pspnr  it_change-pspnr.
        if lv_pspnr is  not initial .
          update pbim set knttp 'Q'
                          sobkz 'Q'
                          kzvbr 'P'
                          pspel  lv_pspnr
                          kzbws 'M'
                             where matnr itab_change-matnr
                               and werks itab_change-werks
                               and bedae 'VSFB'
                               and versb itab_change-versb
                               and pbdnr itab_change-pbdnr.
          commit work and wait.
        endif.
      endif.
    endloop.

    sort itab_change by pbdnr werks versb  matnr.
    loop at it_change.
      lv_tabix sy-tabix.
      read table itab_change with key pbdnr it_change-pbdnr
                                      werks it_change-werks
                                      versb it_change-versb
                                      matnr it_change-matnr binary search.
      if sy-subrc eq 0.
        it_change-message itab_change-message .
        modify it_change index  lv_tabix transporting message .
      endif.
    endloop.
  endif.

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


endform.                    " PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  WRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0275   text
*----------------------------------------------------------------------*
form write_data  .
  refresh fc_hier.
  alv_field '1' 'PBDNR' '' 'Requirement Plan' '12' '' '' ''  ''.
  alv_field '2' 'WERKS' 'Plant' '' ''  '' '' '' ''.
  alv_field '3' 'VERSB' 'Version' '' '6'  '' '' ''  ''.
  alv_field '4' 'MATNR' '' 'Material Number' '20'  '' '' 'MARA'  'MATNR'.
  alv_field '5' 'PRGBZ' 'Period' '' ''  '' '' ''  ''.
  alv_field '6' 'WEEKS_C' '' 'M no. or W no.' ''  '' '' '' ''.
  alv_field '7' 'YEAR_C' 'Year' '' ''  '' '' ''  ''.
  alv_field '8' 'PDATU' 'Deliv. Finish date' '' '10'  '' '' ''  ''.
  alv_field '9' 'PLNMG' 'Quantity' '' ''  '' '' ''  ''.
  alv_field '10' 'POSID' '' 'WBS element' ''  '' '' ''  ''.
  alv_field '11' 'MESSAGE' 'Message' '' '30'  '' '' '' ''.

  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      it_fieldcat   fc_hier[]
    tables
      t_outtab      it_err3[]
    exceptions
      program_error 1
      others        2.
  if sy-subrc ne 0.
    "     message i004(zmm)
  endif.

endform.                    " WRITE_DATA

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值