Hi i have one zprogram, it is written for to get the data from application server ,
now i need to change the code to take the file from local drive.
here iam giving the code ,could any one help me in this.
INCLUDE zppiforecasttop.
INCLUDE zppiforecastf01.
----
SELECTION SCREEN EVENTS
----
*Check the splitting rules against source file format
AT SELECTION-SCREEN ON RADIOBUTTON GROUP r4.
IF rb_spmon = 'X' AND rb_week = 'X'.
MESSAGE e005(z1) WITH text-t13.
ENDIF.
IF rb_spday <> 'X' AND rb_daily = 'X'.
MESSAGE e005(z1) WITH text-t14.
ENDIF.
F4 value help on filename field
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CLEAR: w_choice, t_filelist.
REFRESH: t_filelist.
w_proc = 'proc'.
w_txt = 'txt'.
get and open logical filename
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
logical_filename = p_lognam
parameter_1 = i_para_1
parameter_2 = i_para_2
parameter_3 = i_para_3
IMPORTING
file_name = w_dir
EXCEPTIONS
file_not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE e005(z1) WITH text-t18.
ENDIF.
CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
EXPORTING
dir_name = w_dir
file_mask = '.'
TABLES
dir_list = t_files
EXCEPTIONS
invalid_eps_subdir = 1
sapgparam_failed = 2
build_directory_failed = 3
no_authorization = 4
read_directory_failed = 5
too_many_read_errors = 6
empty_directory_list = 7
OTHERS = 8.
*If the return code is not 0 exit from event
IF sy-subrc <> 0.
EXIT.
ELSE.
*Loop at list of files and convert to display format
LOOP AT t_files.
only show processed files with filename 'proc'
SEARCH t_files-name FOR w_proc.
IF sy-subrc = 0.
t_filelist-name = t_files-name.
t_filelist-size = t_files-size.
APPEND t_filelist.
ENDIF.
only show processed files with filename 'txt'
SEARCH t_files-name FOR w_txt.
IF sy-subrc = 0.
t_filelist-name = t_files-name.
t_filelist-size = t_files-size.
APPEND t_filelist.
ENDIF.
ENDLOOP.
IF t_filelist[] IS INITIAL.
EXIT.
ENDIF.
ENDIF.
*Display list of available files in a popup screen
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING
endpos_col = '100'
endpos_row = '23'
startpos_col = '10'
startpos_row = '5'
titletext = 'Select File'
IMPORTING
choise = w_choice
TABLES
valuetab = t_filelist
EXCEPTIONS
break_off = 1
OTHERS = 2.
IF sy-subrc = 0.
READ TABLE t_filelist INDEX w_choice.
CONCATENATE w_dir t_filelist-name INTO p_file.
ELSE.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
----
Start of Selection
----
START-OF-SELECTION.
*Check that the filetype corresponds to the selection
PERFORM check_file.
*Upload the file by resolving logical filename.
PERFORM upload_file.
*Depending on the selection criteria, alter the input data into the
*desired format and store.
PERFORM populate_post_split_table.
*Build the idoc of type SOPGEN01
PERFORM post_idoc.
Rename the file extension from '.txt' to '*.proc_yyyymmdd', if
*reprocessing a file do nothing
SEARCH p_file FOR '*txt'.
IF sy-subrc = 0.
PERFORM rename_file.
ENDIF.
----
End of Selection
----
END-OF-SELECTION.
*Output error report
PERFORM error_report.
----
Top of Page
----
TOP-OF-PAGE.
PERFORM top_of_page.
◄.........this is the first include........................
◄----
INCLUDE ZPPIFORECASTTOP *
----
TABLES
----
TABLES: marc, "Plant Data for Material
marm, "Units of Measure for Material
edidd, "Data record (IDoc)
edidc, "Control Segment
e1lipm0, "General characteristic segment
e1lipv0, "General version segment
e1lipp0. "Performance measure segment
----
SELECTION SCREEN
----
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t01.
PARAMETERS: rb_1000 RADIOBUTTON GROUP r1 DEFAULT 'X',
rb_1005 RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t02.
PARAMETERS: rb_mgx RADIOBUTTON GROUP r2 DEFAULT 'X',
rb_other RADIOBUTTON GROUP r2.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-t03.
PARAMETERS: rb_month RADIOBUTTON GROUP r3 DEFAULT 'X',
rb_week RADIOBUTTON GROUP r3,
rb_daily RADIOBUTTON GROUP r3.
SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-t04.
PARAMETERS: rb_spmon RADIOBUTTON GROUP r4 DEFAULT 'X',
rb_spwk RADIOBUTTON GROUP r4,
rb_spday RADIOBUTTON GROUP r4.
SELECTION-SCREEN END OF BLOCK b5.
SELECT-OPTIONS: so_datum FOR sy-datum, " (Planning time horizon)
so_matnr FOR marc-matnr. " (Material Master)
PARAMETERS: p_lognam LIKE filenameci-fileintern
DEFAULT 'ZPPIFORECAST_FILENAME' NO-DISPLAY,
p_file LIKE rlgrap-filename OBLIGATORY. "(Input file)
SELECTION-SCREEN END OF BLOCK b1.
----
TYPES
----
TYPES: BEGIN OF workdate,
datum LIKE sy-datum,
day TYPE p,
workday(1) TYPE c,
END OF workdate.
TYPES: BEGIN OF postsplit.
INCLUDE STRUCTURE zppiforecast.
TYPES: fromdat LIKE sy-datum,
todat LIKE sy-datum,
split_date LIKE sy-datum,
split_value(10) TYPE c,
flg_noscp(1) TYPE c,
END OF postsplit.
TYPES: BEGIN OF exception.
INCLUDE STRUCTURE zppiforecast.
TYPES: docnum TYPE docnum,
message TYPE edi_statx_,
END OF exception.
TYPES: BEGIN OF filelist,
name TYPE epsfilnam,
size(10) TYPE c,
END OF filelist.
----
DATA
----
DATA: t_files TYPE TABLE OF epsfili INITIAL SIZE 0 WITH HEADER LINE,
i_file TYPE TABLE OF zppiforecast INITIAL SIZE 0 WITH HEADER LINE,
t_exception TYPE TABLE OF exception INITIAL SIZE 0
WITH HEADER LINE,
i_post_split TYPE TABLE OF postsplit INITIAL SIZE 0
WITH HEADER LINE,
t_workdates TYPE TABLE OF workdate INITIAL SIZE 0
WITH HEADER LINE,
t_filelist TYPE TABLE OF filelist INITIAL SIZE 0 WITH HEADER LINE.
DATA: t_edidc TYPE TABLE OF edidc INITIAL SIZE 0 WITH HEADER LINE,
t_edidd TYPE TABLE OF edidd INITIAL SIZE 0 WITH HEADER LINE,
t_edids TYPE TABLE OF edids INITIAL SIZE 0 WITH HEADER LINE.
DATA: w_choice TYPE sy-tabix, "Index of chosen file
w_line(100), "100 character string
w_dir LIKE epsf-epsdirnam, "Directory path
w_hiper LIKE t445p-hiper, "Forecast lower limit
w_fuper LIKE t445p-fuper, "Forecast upper limit
w_count TYPE i, "Counter
w_total TYPE i, "Total
w_start LIKE sy-datum, "Start date in the range
w_end LIKE sy-datum, "End date in the range
w_date LIKE sy-datum, "Curent Date
w_first LIKE sy-datum, "First working date in range
w_flg_noscp(1) TYPE c, "No SCP UoM flag
w_days TYPE butag, "No of days
w_day TYPE p, "Day of the week indicator
w_value LIKE zppiforecast-value, "Record Value
w_post_split TYPE postsplit, "Work area for post split table line
w_docnum LIKE edidc-docnum, "IDOC number
w_docnum_no_zero LIKE w_docnum, " IDOC number wthout zeros
w_statva LIKE stacust-statva,
w_error(1) TYPE c,
w_matnr TYPE matnr,
w_tabix TYPE sytabix,
w_messg TYPE message,
w_msgln TYPE i,
w_todat LIKE sy-datum,
w_fromdat LIKE sy-datum,
w_lines TYPE i,
w_count_idoc_errors TYPE i,
w_count_recs_uploaded TYPE i,
w_count_idoc_posted TYPE i.
DATA: w_proc(4) TYPE c.
DATA: w_txt(4) TYPE c.
DATA: logsys LIKE tbdls-logsys.
----
CONSTANTS
----
CONSTANTS: c_uom LIKE marm-meinh VALUE 'SCP', "Unit of measure
c_delim TYPE x VALUE '09',
c_type LIKE rlgrap-filetype VALUE 'DAT',
c_werks_1000 LIKE marc-werks VALUE '1000',
c_werks_1005 LIKE marc-werks VALUE '1005',
c_pltyp_805 LIKE t445p-sctyp VALUE 'Z_805',
c_pltyp_810 LIKE t445p-sctyp VALUE 'Z_810',
c_mestyp_805 TYPE edi_mestyp VALUE 'LIP805',
c_mestyp_810 TYPE edi_mestyp VALUE 'LIP810',
c_rcvprt TYPE edi_rcvprt VALUE 'LS',
c_sndprn TYPE edi_sndprn VALUE 'WEBM_LS',
c_sndprt TYPE edi_sndprt VALUE 'LS'.
◄..............this is the second include.................
◄----
INCLUDE ZPPIFORECASTF01 *
----
&----
*& Form upload_file
&----
form upload_file.
data: w_matnr like mara-matnr,
w_datum like sy-datum.
*Open file in read mode
open dataset p_file for input in text mode.
if sy-subrc = 0.
do.
clear: t_exception.
*Read line of data into text string variable
read dataset p_file into w_line.
*If successful. append the internal file table
if sy-subrc = 0.
add 1 to w_count_recs_uploaded.
*Split the string at delimiter into internal file table
split w_line at c_delim into i_file-matnr
i_file-datum
i_file-value.
call function 'CONVERSION_EXIT_MATN1_INPUT'
exporting
input = i_file-matnr
importing
output = w_matnr
exceptions
length_error = 1
others = 2.
i_file-index = sy-index.
*Check that the date is in the correct format.
call function 'CONVERT_DATE_TO_INTERN_FORMAT'
exporting
datum = i_file-datum
dtype = 'DATS'
importing
error = w_error
idate = i_file-datum
messg = w_messg
msgln = w_msgln.
*If an error has occurred write entry to error table, otherwise append
*record list
if not w_error is initial.
t_exception = i_file.
t_exception-message = text-006.
append t_exception.
else.
check i_file-datum in so_datum.
append i_file.
endif.
else.
exit.
endif.
enddo.
else.
message w005(z1) with 'File ' p_file ' cannot be opened'.
endif.
*Close the file
close dataset p_file.
endform. " upload_file
&----
*& Form process_monthly
&----
form process_monthly.
data: w_mm type bumon,
w_yyyy type bdatj.
w_mm = i_file-datum+4(2).
w_yyyy = i_file-datum(4).
*Get the number of days in the month
call function 'NUMBER_OF_DAYS_PER_MONTH_GET'
exporting
par_month = w_mm
par_year = w_yyyy
importing
par_days = w_days.
*Set date variable to first day
w_date = i_file-datum.
*Get the first working day in the month
perform get_first_day.
*Set date variable to last day in the month
w_date = i_file-datum + w_days - 1.
*Get the last working day in the month
perform get_last_day.
*Populate the post split table with monthly value
i_post_split-split_value = w_value.
i_post_split-matnr = i_file-matnr.
i_post_split-fromdat = w_fromdat.
i_post_split-todat = w_todat.
i_post_split-datum = i_file-datum.
i_post_split-value = i_file-value.
i_post_split-index = i_file-index.
i_post_split-split_date = i_file-datum.
i_post_split-flg_noscp = w_flg_noscp.
append i_post_split.
endform. " process_monthly
&----
*& Form check_material
&----
form check_material using value(plant) value(pltyp).
*Check that the material plant combination exists
select single matnr from marc into w_matnr
where matnr = i_file-matnr
and werks = plant.
*Check return code, if no record found, write to error table and delete
if sy-subrc <> 0.
w_tabix = sy-tabix.
t_exception = i_file.
t_exception-message = text-001.
append t_exception.
delete i_file index w_tabix.
w_error = 'X'.
exit.
endif.
Start DEVK931385
if plant = c_werks_1000. "DEVK931385
*Check that the material exists in the infotype hierarchy
select single matnr from s805e into w_matnr where ssour = space
and werks = plant
and matnr = i_file-matnr.
else. "DEVK931385
*Check that the material exists in the infotype hierarchy S810e
select single matnr from s810e into w_matnr where ssour = space
and werks = plant
and matnr = i_file-matnr.
endif. "DEVK931385
End DEVK931385
if sy-subrc <> 0.
w_tabix = sy-tabix.
t_exception = i_file.
t_exception-message = text-006.
append t_exception.
delete i_file index w_tabix.
w_error = 'X'.
exit.
endif.
*Get the forcast limits from info structure
select single hiper fuper from t445p into (w_hiper, w_fuper)
where sctyp = pltyp.
*Determine start and end limits for forecasting based on current date
w_start = sy-datum - w_hiper.
Start DEVK931340
w_end = sy-datum + w_fuper. "DEL
w_end = sy-datum + ( ( w_fuper * 7 ) / 5 ).
END DEVK931340
endform. " check_material
12:33:06 PM◄&----
*
*& Form process_weekly
&----
form process_weekly.
data: w_mm type bumon,
w_yyyy type bdatj.
clear: w_total.
w_date = i_file-datum.
w_mm = i_file-datum+4(2).
w_yyyy = i_file-datum(4).
*If the souce file is in monthly format
if rb_month = 'X'.
*Get the number of days in the current month
call function 'NUMBER_OF_DAYS_PER_MONTH_GET'
exporting
par_month = w_mm
par_year = w_yyyy
importing
par_days = w_days.
*Set date variable to last day in the month
w_date = i_file-datum + w_days - 1.
*Get the last working day in the month
perform get_last_day.
*Set date variable to first day
w_date = i_file-datum.
*Get the first working day in the month
perform get_first_day.
else.
*Otherwise set for days in week
w_days = 7.
endif.
do w_days times.
*Clear the table of workdates
clear: t_workdates.
*Check if the day is a working day
call function 'DATE_CHECK_WORKINGDAY'
exporting
date = w_date
factory_calendar_id = 'GB'
message_type = 'I'
exceptions
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
others = 5.
*If successful, set the workday flag to (Y)es
if sy-subrc = 0.
t_workdates-datum = w_date.
t_workdates-workday = 'Y'.
*Increment the counter for total number of workdays
add 1 to w_total.
else.
*Otherwise (N)o
t_workdates-datum = w_date.
t_workdates-workday = 'N'.
endif.
*Get the day in the week of the current date, (1 = Monday, 7 = Sunday)
call function 'DAY_IN_WEEK'
exporting
datum = w_date
importing
wotnr = t_workdates-day.
append t_workdates.
add 1 to w_date.
enddo.
loop at t_workdates.
*If the day is a workday
if t_workdates-workday = 'Y'.
*If the fromdate is blank, set to current date in loop (first working
*day)
if i_post_split-fromdat is initial.
i_post_split-fromdat = t_workdates-datum.
i_post_split-split_date = t_workdates-datum.
endif.
*Set variable to pick up last working date
i_post_split-todat = t_workdates-datum.
*Increment loop counter
add 1 to w_count.
endif.
*If the day is a Sunday
if ( ( t_workdates-day = 7 or t_workdates-datum+6(2) = w_days )
and w_count <> 0 ).
*Poplulate the post split table
if rb_month = 'X'.
i_post_split-fromdat = w_fromdat.
i_post_split-todat = w_todat.
endif.
i_post_split-matnr = i_file-matnr.
i_post_split-datum = i_file-datum.
i_post_split-value = i_file-value.
i_post_split-index = i_file-index.
i_post_split-split_value = ( ( w_value / w_total ) * w_count ).
i_post_split-flg_noscp = w_flg_noscp.
append i_post_split.
clear: w_count,
i_post_split.
endif.
endloop.
endform. " process_weekly
&----
*& Form get_first_day
&----
form get_first_day.
do w_days times.
call function 'DATE_CHECK_WORKINGDAY'
exporting
date = w_date
factory_calendar_id = 'GB'
message_type = 'I'
exceptions
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
others = 5.
if sy-subrc = 0.
w_fromdat = w_date.
exit.
endif.
add 1 to w_date.
enddo.
endform. " get_first_day
&----
*& Form get_last_day
&----
form get_last_day.
do w_days times.
call function 'DATE_CHECK_WORKINGDAY'
exporting
date = w_date
factory_calendar_id = 'GB'
message_type = 'I'
exceptions
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
others = 5.
if sy-subrc = 0.
w_todat = w_date.
exit.
endif.
subtract 1 from w_date.
enddo.
endform. " get_last_day
12:33:30 PM◄
&----
*& Form process_daily
&----
form process_daily.
data: w_mm type bumon,
w_yyyy type bdatj,
new_w_date like w_date.
clear: w_total.
w_mm = i_file-datum+4(2).
w_yyyy = i_file-datum(4).
w_date = i_file-datum.
if rb_month = 'X'.
*Get the number of days in the current month
call function 'NUMBER_OF_DAYS_PER_MONTH_GET'
exporting
par_month = w_mm
par_year = w_yyyy
importing
par_days = w_days.
*If the source file is in weekly format set to days in week
elseif rb_week = 'X'.
w_days = 7.
else.
*If source file is daily, set to day
w_days = 1.
endif.
do w_days times.
clear: t_workdates.
*Check the current day is a workday
call function 'DATE_CHECK_WORKINGDAY'
exporting
date = w_date
factory_calendar_id = 'GB'
message_type = 'I'
exceptions
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
others = 5.
*If successful, set workday flag to (Y)es and append workday table
if sy-subrc = 0.
t_workdates-datum = w_date.
t_workdates-workday = 'Y'.
append t_workdates.
*Increment total
add 1 to w_total.
START PKA01
else.
Add 1 to w_date and w_days to make it loop again until a the next work
day is found!!!!!
END PKA01
if rb_daily = 'X'.
new_w_date = w_date.
while new_w_date ne ''.
add 1 to new_w_date.
*Check the current day is a workday
call function 'DATE_CHECK_WORKINGDAY'
exporting
date = new_w_date
factory_calendar_id = 'GB'
message_type = 'I'
exceptions
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
others = 5.
if sy-subrc = 0.
t_workdates-datum = new_w_date.
t_workdates-workday = 'Y'.
append t_workdates.
add 1 to w_total.
exit.
endif.
endwhile.
endif.
endif.
*Increment date
add 1 to w_date.
enddo.
*Get the number of workdays in the period
describe table t_workdates lines w_lines.
*Get the first entry in the table
read table t_workdates index 1.
w_fromdat = t_workdates-datum.
*Get the last entry in the table
read table t_workdates index w_lines.
w_todat = t_workdates-datum.
loop at t_workdates.
*Populate the post split table
i_post_split-fromdat = w_fromdat.
i_post_split-todat = w_todat.
i_post_split-split_date = t_workdates-datum.
i_post_split-matnr = i_file-matnr.
i_post_split-datum = i_file-datum.
i_post_split-value = i_file-value.
i_post_split-index = i_file-index.
i_post_split-split_value = w_value / w_total.
i_post_split-flg_noscp = w_flg_noscp.
START PKA01
For daily sorce data which is split daily check that an entry doesnt
already exist in the post split table for this date - only the fromdat
is checked because for daily split fromdat = todat
read table i_post_split into w_post_split
with key matnr = i_file-matnr
fromdat = i_file-datum
split_date = t_workdates-datum.
if sy-subrc = 0.
...an entry exist so add the new value to the existing one and update
the table record
i_post_split-split_value = i_post_split-split_value +
w_post_split-split_value.
append i_post_split.
MODIFY i_post_split from w_post_split index sy-tabix.
else.
END PKA01
append i_post_split.
START PKA01
endif.
END PKA01
endloop.
endform. " process_daily
&----
*& Form check_range
&----
form check_range.
*If file date is not in forcast range discard
if i_file-datum < w_start or i_file-datum > w_end.
w_tabix = sy-tabix.
t_exception = i_file.
t_exception-message = text-002.
append t_exception.
delete i_file index w_tabix.
w_error = 'X'.
endif.
endform. " check_range
&----
*& Form check_uom
&----
form check_uom.
*Get the alternative UoM for Material
select single * from marm where matnr = i_file-matnr
and meinh = c_uom.
if sy-subrc = 0.
w_value = ( i_file-value * ( marm-umren / marm-umrez ) ).
else.
w_value = i_file-value.
w_flg_noscp = 'X'.
endif.
w_flg_noscp = 'X'. "jsa01
endform. " check_uom
&----
*& Form check_first_day
&----
form check_first_day.
*If the date is not the first of the month, copy to error table, delete
*and end current loop process
if i_file-datum+6(2) <> '01'.
w_tabix = sy-tabix.
t_exception = i_file.
t_exception-message = text-003.
append t_exception.
delete i_file index w_tabix.
w_error = 'X'.
endif.
endform. " check_first_day
12:34:00 PM◄&----
*& Form check_monday
&----
form check_monday.
call function 'DAY_IN_WEEK'
exporting
datum = i_file-datum
importing
wotnr = w_day.
*If the day is not a monday, copy to error table, delete
*and end current loop process
if w_day <> 1.
w_tabix = sy-tabix.
t_exception = i_file.
t_exception-message = text-004.
append t_exception.
delete i_file index w_tabix.
w_error = 'X'.
endif.
endform. " check_monday
&----
*& Form populate_post_split_table
&----
form populate_post_split_table.
*Sort the uploaded table by material and date
sort i_file by matnr datum.
loop at i_file.
perform material_internal_format.
*clear loop variables
clear: w_hiper,
w_fuper,
w_count,
w_error,
w_fromdat,
w_todat,
w_flg_noscp,
t_exception.
*Clear the contents of the internal table which holds work days
refresh: t_workdates.
*If plant radiobutton is set
if rb_1000 = 'X'.
*Check the material/plant combination
perform check_material using c_werks_1000 c_pltyp_805.
else.
*Check the material/plant combination
perform check_material using c_werks_1005 c_pltyp_810.
endif.
if w_error = 'X'.
continue.
endif.
*If the uploaded file is in monthly format
if rb_month = 'X'.
*Check that the record is for the first day of the month
perform check_first_day.
if w_error = 'X'.
continue.
endif.
*Check the value is within the range for the infotype
perform check_range.
if w_error = 'X'.
continue.
endif.
*Check that an 'SCP' unit of measure exists and convert value
perform check_uom.
*Otherwise if the file is in weekly format
elseif rb_week = 'X'.
*Check that the record corresponds to a monday
perform check_monday.
if w_error = 'X'.
continue.
endif.
*Check the value is within the range for the infotype
perform check_range.
if w_error = 'X'.
continue.
endif.
*Check that an 'SCP' unit of measure exists and convert value
perform check_uom.
else.
*Check the value is within the range for the infotype
perform check_range.
if w_error = 'X'.
continue.
endif.
*Check that an 'SCP' unit of measure exists and convert value
perform check_uom.
endif.
*If split monthly flag has been chosen
if rb_spmon = 'X'.
*Process value using split monthly process
perform process_monthly.
*Otherwise, if weekly split
elseif rb_spwk = 'X'.
*Process value using split weekly process
perform process_weekly.
*Otherwise daily split
else.
*Process value using split daily process
perform process_daily.
endif.
endloop.
endform. " populate_post_split_table
&----
*& Form build_idoc
&----
Build and submit the idoc for processing
----
form post_idoc.
*Get the logical system for ALE processing
perform get_ale_data.
check not logsys is initial.
*Populate the IDOC control record
perform build_control_data.
*Sort the data by material, date and value
sort i_post_split by matnr datum value fromdat todat split_date.
*Build idocs and post them
loop at i_post_split.
clear: e1lipp0,
t_exception.
*Move i_post_split header to a work area
w_post_split = i_post_split.
at new datum.
clear: e1lipm0, e1lipv0, t_edidd.
refresh t_edidd.
*Build the general characteristic segment
perform build_e1lipm0_segment.
*Build the general version segment
perform build_e1lipv0_segment.
endat.
*Build the performance measure segment
perform build_e1lipp0_segment.
at end of datum.
*Submit IDOC for inbound processing
perform submit_idoc.
endat.
endloop.
endform. " build_idoc
12:34:22 PM◄&----
*& Form submit_idoc
&----
Start inbound processing of IDOC
----
form submit_idoc.
clear: w_docnum_no_zero.
call function 'IDOC_WRITE_AND_START_INBOUND'
exporting
i_edidc = edidc
do_commit = 'X'
importing
docnum = w_docnum
tables
i_edidd = t_edidd
exceptions
idoc_not_saved = 1
others = 2.
if sy-subrc = 0.
call function 'CONVERSION_EXIT_ALPHA_OUTPUT'
exporting
input = w_docnum
importing
output = w_docnum_no_zero.
perform check_idoc_status_records.
else.
t_exception-index = w_post_split-index.
t_exception-matnr = w_post_split-matnr.
t_exception-datum = w_post_split-datum.
t_exception-message = t_edids-statxt.
append t_exception.
w_error = 'X'.
endif.
*If the no SCP UoM flag is set, write an entry to exception table
if w_post_split-flg_noscp = 'X'.
t_exception-index = w_post_split-index.
t_exception-matnr = w_post_split-matnr.
t_exception-datum = w_post_split-datum.
t_exception-value = w_post_split-value.
t_exception-docnum = w_docnum_no_zero.
t_exception-message = text-005.
append t_exception.
endif.
endform. " write_idoc
&----
*& Form build_control_data
&----
*& Build the IDOC control record
&----
form build_control_data.
clear edidc.
edidc-idoctp = 'SOPGEN01'. " Basic type
if rb_1000 = 'X'.
edidc-mestyp = c_mestyp_805. " Message type
else.
edidc-mestyp = c_mestyp_810. " Message type
endif.
edidc-rcvprt = c_rcvprt. " Partner type of receiver
concatenate 'SAP' sy-sysid(3) into edidc-rcvpor. " Receiver port
concatenate sy-sysid(3) 'CLNT' sy-mandt into edidc-rcvprn.
edidc-direct = '2'. " Inbound
concatenate 'SAP' sy-sysid(3) into edidc-sndpor.
edidc-sndprt = c_sndprt. " Partner type of sender
edidc-sndprn = c_sndprn. " Partner number of sender
endform. " get_control_data
&----
*& Form get_ale_data
&----
Get logical system for ALE processing
----
form get_ale_data.
call function 'OWN_LOGICAL_SYSTEM_GET'
importing
own_logical_system = logsys
exceptions
own_logical_system_not_defined = 1
others = 2.
if sy-subrc <> 0.
clear logsys.
endif.
endform. " get_ale_data
&----
*& Form build_e1lipv0_segment
&----
Create the general version segment
----
form build_e1lipv0_segment.
e1lipv0-vrsio = 'A00'.
e1lipv0-avrsi = 'X'.
e1lipv0-vetxt = 'Active Version'.
move e1lipv0 to t_edidd-sdata.
move 'E1LIPV0' to t_edidd-segnam.
t_edidd-hlevel = '02'.
append t_edidd.
endform. " send_idoc
&----
*& Form build_e1lipm0_segment
&----
form build_e1lipm0_segment.
e1lipm0-vontg = w_post_split-fromdat.
e1lipm0-bistg = w_post_split-todat.
e1lipm0-perio = '0'.
if rb_1000 = 'X'.
e1lipm0-m01 = c_werks_1000.
else.
e1lipm0-m01 = c_werks_1005.
endif.
e1lipm0-m02 = w_post_split-matnr.
e1lipm0-m03 = 'SCP'.
e1lipm0-m06 = 'T'.
move e1lipm0 to t_edidd-sdata.
move 'E1LIPM0' to t_edidd-segnam.
t_edidd-hlevel = '01'.
append t_edidd.
endform. " build_e1lipm0_segment
&----
*& Form build_e1lipp0_segment
&----
form build_e1lipp0_segment.
e1lipp0-sptag = w_post_split-split_date.
if rb_mgx = 'X'.
e1lipp0-kz02 = w_post_split-split_value.
e1lipp0-kz03 = '/'.
else.
e1lipp0-kz02 = '/'.
e1lipp0-kz03 = w_post_split-split_value.
endif.
move e1lipp0 to t_edidd-sdata.
move 'E1LIPP0' to t_edidd-segnam.
t_edidd-hlevel = '03'.
append t_edidd.
endform. " build_e1lipp0_segment
&----
*& Form check_idoc_status_records
&----
form check_idoc_status_records.
clear: t_edids.
refresh: t_edids.
select * from edids into table t_edids where docnum = w_docnum.
clear: w_error.
loop at t_edids.
clear: w_statva.
select single statva from stacust into w_statva
where status = t_edids-status.
case w_statva.
*When the status group is of type 'E' or 'F'.
when 'E' or 'F'.
t_exception-value = w_post_split-value.
t_exception-index = w_post_split-index.
t_exception-matnr = w_post_split-matnr.
t_exception-datum = w_post_split-datum.
t_exception-docnum = w_docnum_no_zero.
t_exception-message = t_edids-statxt.
append t_exception.
w_error = 'X'.
when others.
endcase.
endloop.
if w_error is initial.
add 1 to w_count_idoc_posted.
else.
add 1 to w_count_idoc_errors.
endif.
endform. " check_idoc_status_records
12:34:35 PM◄&----
*& Form rename_file
&----
Form to rename file
----
form rename_file.
data: l_filename_new(120), " New filename
l_filename_temp(120), " Temporary filename
l_command(250), " Unix command line
w_extension(14).
move p_file to l_filename_new.
*Replace the file extension of the file to indicate that it has been
*processed
concatenate '.proc_' sy-datum into w_extension.
replace '.txt' with w_extension into l_filename_new.
Create UNIX rename command
concatenate 'mv' p_file l_filename_new
into l_command separated by space.
Create temporary unique file name
concatenate p_file 'TEMP'
into l_filename_temp.
move l_filename_new to p_file.
************************************************************************
Open temporary dataset but use the filter command to execute the UNIX
rename command 'mv'.
This method has been used instead of SAP external commands because
of file length limitations. The external command only allows a line of
128 chars which means filenames can only be about 62chars when doing
a move i.e. mv <file1> <file2>
************************************************************************
open dataset l_filename_temp for output filter l_command.
if sy-subrc ne 0.
message e005(z1) with text-007.
exit.
endif.
Close the temporary dataset
close dataset l_filename_temp.
if sy-subrc ne 0.
message e005(z1) with text-007.
exit.
endif.
Delete the temporary dataset
delete dataset l_filename_temp.
if sy-subrc ne 0.
message e005(z1) with text-007.
exit.
endif.
endform. " rename_file
&----
*& Form material_internal_format
&----
form material_internal_format.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = i_file-matnr
importing
output = i_file-matnr.
endform. " material_internal_format
&----
*& Form error_report
&----
form error_report.
format color col_normal.
skip.
*Loop at exception table and output contents
loop at t_exception.
write: / t_exception-index,
t_exception-matnr,
24 t_exception-datum,
t_exception-value right-justified,
t_exception-docnum,
t_exception-message.
endloop.
if t_exception[] is initial.
message s005(z1) with text-s01.
else.
message s005(z1) with text-s02.
endif.
skip.
format reset.
write : /40 text-eor.
endform. " error_report
&----
*& Form check_file
&----
form check_file.
*The source format in the report selection should match the upload file
*naming conventions
*start of insert - mpc01
if not t_filelist is initial.
refresh: t_filelist.
clear: t_filelist.
endif.
split p_file at '/' into table t_filelist.
describe table t_filelist lines sy-tabix.
sy-tabix = sy-tabix - 1.
delete t_filelist from 1 to sy-tabix.
read table t_filelist index 1.
*end of insert - mpc01
case t_filelist-name(1).
when 'M'.
if rb_month <> 'X'.
message e005(z1) with text-t15.
endif.
when 'W'.
if rb_week <> 'X'.
message e005(z1) with text-t16.
endif.
when 'D'.
if rb_daily <> 'X'.
message e005(z1) with text-t17.
endif.
endcase.
endform. " check_file
&----
*& Form top_of_page
&----
form top_of_page.
FORMAT COLOR COL_HEADING INTENSIFIED OFF.
format reset.
START PKA01
if rb_1000 = 'X'.
write: / 'Plant: ', 25 c_werks_1000.
else.
write: / 'Plant: ', 25 c_werks_1005.
endif.
if rb_mgx = 'X'.
write: / text-t02, 25 'MGX'.
else.
write: / text-t02, 25 'Other'.
endif.
if rb_month = 'X'.
write: / text-t03, 25 'Monthly'.
elseif rb_week = 'X'.
write: / text-t03, 25 'Weekly'.
else.
write: / text-t03, 25 'Daily'.
endif.
if rb_spmon = 'X'.
write: / text-t04, 25 'Month'.
elseif rb_spwk = 'X'.
write: / text-t04, 25 'Weekly'.
else.
write: / text-t04, 25 'Daily'.
endif.
skip.
write: / 'Number of records uploaded: ', w_count_recs_uploaded.
write: / 'Number of IDOCs posted : ', w_count_idoc_posted.
write: / 'Number of IDOC errors : ', w_count_idoc_errors.
skip.
write: / 'File: ', p_file.
skip.
format color col_heading intensified on.
uline.
write: /6 'File',
13 'Material',
24 'Forecast',
40 'Value',
46 'IDOC',
67(70) 'Error '.
write: /6 'Index',
13 'Number',
24 'Date',
67(70) 'Message'.
uline.
format color col_heading intensified off.
endform. " top_of_page