Program :ZSDR011
T-Code: ZSD011
Upload Requirements Plan Data
1、注意是用zsd010download下来的格式
2、在每周、月全都输入空的话,是更改、创建不了的,输入0的话可以修改、创建,如果只有一个月、周输入0,其他的不输入,则会把其他的删除,如果不想删除的话,其他栏位必需要输入以前一样的值
*&---------------------------------------------------------------------*
*& Progarm : ZSDR011 Author : Jimmy Wong
*& Created : 21 Nov 2012 App : SD
*& Title : Upload Requirements Plan Data
*& Description : Upload Requirements Plan Data
*&---------------------------------------------------------------------*
*& Version Author Date description
*& Jimmy 21 Nov 2012 the first version
*& M1 Jimmy 11 Dec 2012 enhance duplication date
*& M2 Jimmy 07 Mar 2013 add check "PIR is being processed, you cannot make changes!"
*& M3 Jimmy 11 Mar 2013 No_withdr = 'X'
*& the last update time 2013.03.11 14:00
*&---------------------------------------------------------------------*
report zsdr011 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : rlgrap,pbim.",tprg,pbed.
data:begin of it_field occurs 0,
col type i,
pdatu like pbed-pdatu,
prgbz like tprg-prgbz,
prgrs like tprg-prgrs,
fdnam type c length 20,
fdfield type c length 20,
flag type c,
weeks_c(2) type c ,
year_c(4) type c,
end of it_field.
data:begin of it_pdatu occurs 0,
pdatu like pbed-pdatu,
prgbz like tprg-prgbz,
end of it_pdatu.
field-symbols: <gt_output> type standard table,
<wa_output>,
<wa_field>.
data: it_structure type lvc_t_fcat,
wa_structure type lvc_s_fcat,
gt_output type ref to data,
wa_new_line type ref to data .
include zsd_forecast.
*----------------------------------------------------------------------*
* Parameter & Select-Options *
*----------------------------------------------------------------------*
selection-screen begin of block 1 with frame title text-001.
parameters filename type rlgrap-filename obligatory.
parameters: p_ver as checkbox modif id ver.
selection-screen end of block 1.
*----------------------------------------------------------------------*
* Initialize *
*----------------------------------------------------------------------*
initialization.
if sy-uname ne 'SAPADMIN' and sy-uname ne 'LISA_WONG' and sy-uname ne 'OLIVER_LEE' .
loop at screen.
if screen-group1 = 'VER'.
screen-intensified = '0'.
screen-required = '0'.
screen-active = 0.
screen-display_3d = '0'.
modify screen.
endif.
endloop.
endif.
*----------------------------------------------------------------------*
* 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,lv_col.
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_header.
sort it_pdatu by pdatu prgbz. "M1 add
describe table it_pdatu lines lv_dt1.
delete adjacent duplicates from it_pdatu comparing all fields .
describe table it_pdatu lines lv_dt2.
read table it_field with key flag = 'X'.
if sy-subrc eq 0 or lv_dt1 ne lv_dt2.
perform display_error_data.
exit.
endif.
describe table it_field lines lv_col.
if lv_col = 0.
message 'Excel header not first row' type 'I'.
exit.
endif.
* perform create_structure.
* perform create_dynamic_table.
perform get_data.
if it_record[] is initial.
message 'No Record Found' type 'I'.
exit.
endif.
perform get_check_data.
if p_ver = 'X'.
perform check_it_record using '04'.
else.
perform check_it_record using '11'.
endif.
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 = '1'
i_end_col = '100'
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_HEADER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_it_header .
data:lv_total type i,
lv_i type i,
lv_j type i,
lv_len type i,
lv_c type c length 6,
lv_week like scal-week,
lv_field type c length 20.
lv_i = 1.
select prgbz prgrs
into corresponding fields of table it_tprg
from tprg
where spras = sy-langu.
sort it_tprg by prgbz prgrs .
loop at lt_gt_data where row = 1.
shift lt_gt_data-value right deleting trailing space.
shift lt_gt_data-value left deleting leading space.
it_field-fdnam = lt_gt_data-value.
it_field-col = lt_gt_data-col.
case lt_gt_data-col.
when '1'.
it_field-fdfield = 'PBDNR' .
when '2'.
it_field-fdfield = 'MATNR' .
when '3'.
it_field-fdfield = 'WERKS' .
when '4'.
it_field-fdfield = 'VERSB' .
when '5'.
it_field-fdfield = 'POSID' .
when '6'.
it_field-fdfield = 'MEINS' .
when others.
lv_c = lv_i.
condense lv_c.
lv_len = strlen( lv_c ).
if lv_len = 1.
concatenate '0' lv_c into lv_c.
endif.
concatenate 'FIELD' lv_c into lv_field.
it_field-fdfield = lv_field.
add 1 to lv_i.
lv_len = strlen( it_field-fdnam ).
if lv_len = 9.
it_field-prgbz = it_field-fdnam+0(1) .
read table it_tprg with key prgbz = it_field-prgbz binary search.
if sy-subrc eq 0.
it_field-prgrs = it_tprg-prgrs.
concatenate it_field-fdnam+5(4) it_field-fdnam+2(2) into lv_week .
if it_field-prgrs = '2'.
call function 'HRIQ_WEEK_GET_FIRST_DAY'
exporting
week = lv_week
importing
date = it_field-pdatu
exceptions
week_invalid = 1
others = 2.
if sy-subrc ne 0.
it_field-flag = 'X' .
endif.
elseif it_field-prgrs = '3'.
concatenate lv_week '01' into it_field-pdatu .
endif.
it_pdatu-pdatu = it_field-pdatu.
it_pdatu-prgbz = it_field-prgbz. "M1 add
it_field-weeks_c = it_field-fdnam+2(2).
perform add_pre_zero using it_field-weeks_c
changing it_field-weeks_c.
it_field-year_c = it_field-fdnam+5(4).
append it_pdatu.
else.
it_field-flag = 'X' .
endif.
else.
it_field-flag = 'X' .
endif.
endcase.
append it_field.
clear:it_field.
endloop.
endform. " GET_IT_HEADER
*&---------------------------------------------------------------------*
*& Form DISPLAY_ERROR_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form display_error_data .
refresh: fc_hier.
alv_field '1' 'PDATU' '' 'Delivery/order finish date' '15' 'L' '' '' ''.
alv_field '2' 'PRGBZ' 'Date type' '' '5' 'L' '' '' ''.
alv_field '3' 'prgrs' '' 'Period indicator' '10' 'L' '' '' ''.
alv_field '4' 'FDNAM' 'Field Desc' '' '20' 'L' '' '' ''.
alv_field '5' 'FDFIELD' 'Field Name' '' '10' 'L' '' '' ''.
alv_field '6' 'FLAG' 'Is error' '' '5' 'L' '' '' ''.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
it_fieldcat = fc_hier[]
i_save = 'A'
i_callback_program = sy-repid
tables
t_outtab = it_field[]
exceptions
program_error = 1
others = 2.
endform. " DISPLAY_ERROR_DATA
*&---------------------------------------------------------------------*
*& Form CREATE_STRUCTURE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_structure .
define create_stru.
wa_structure-fieldname = &1.
wa_structure-col_pos = &2.
wa_structure-inttype = &3.
wa_structure-intlen = &4.
append wa_structure to it_structure.
end-of-definition.
loop at it_field.
create_stru it_field-fdfield sy-tabix 'C' '20' .
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 = gt_output.
assign gt_output->* to <gt_output>.
endform. " CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_data .
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 where row > 1.
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-matnr_c = lt_gt_data-value.
perform tranfer_material using it_record-matnr_c
changing it_record-matnr.
when '3'.
it_record-werks = lt_gt_data-value.
when '4'.
it_record-versb = lt_gt_data-value.
perform add_pre_zero using it_record-versb
changing it_record-versb.
when '5'.
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.
when '6'.
it_record-meins = lt_gt_data-value.
when others.
check lt_gt_data-col <= lv_col.
read table it_field with key col = lt_gt_data-col .
if sy-subrc eq 0.
it_record-prgrs = it_field-prgrs.
it_record-prgbz = it_field-prgbz.
it_record-pdatu = it_field-pdatu.
it_record-weeks_c = it_field-weeks_c.
it_record-year_c = it_field-year_c .
perform process_num using it_record-weeks_c
changing it_record-weeks_i.
perform process_num using it_record-year_c
changing it_record-year_i.
it_record-plnmg_c = lt_gt_data-value .
perform process_num using lt_gt_data-value
changing it_record-plnmg.
it_record-order = lv_order.
append it_record.
add 1 to lv_order.
endif.
endcase.
at end of row.
clear: it_record.
endat.
endloop.
endform. " GET_DATA
*&---------------------------------------------------------------------*
*& 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(20) type c,
prgbz like tprg-prgbz,
prgrs like tprg-prgrs,
weeks_c(2) type c,
weeks_i type i,
year_c(4) type c,
year_i type i,
week like scal-week,
pdatu like pbed-pdatu,
plnmg_c(20) type c,
plnmg like pbed-plnmg,
pspnr like prps-pspnr,
posid like prps-posid,
meins like pbed-meins,
iscreate type c,
message(700) type c,
end of it_record.
data: it_err2 like it_record occurs 0 with header line.
data: it_err3 like it_record occurs 0 with header line.
data: it_create like it_record occurs 0 with header line.
data: it_change like it_record occurs 0 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(700) type c,
end of wa_itab.
data: itab_create like wa_itab occurs 0 with header line.
data: itab_change like wa_itab occurs 0 with header line.
data: req_item like bapisitemr.
data: req_data like bapisshdin occurs 0 with header line.
data: it_return like bapireturn1 occurs 0 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 0 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 p 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 c 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(2) type c ,
lv_data like sy-datum,
lv_fabkl like t001w-fabkl,
l_objkey type sibfboriid,
wfstate type char1,
lv_msg type c 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 < 0 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(4) = it_record-werks.
l_objkey+4(2) = it_record-versb.
l_objkey+6(10) = it_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 1 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 1 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