cancel
Showing results for 
Search instead for 
Did you mean: 

Help on BAPI BAPI_PBSRVAPS_CHANGEKEYFIGVAL2.

0 Kudos

Hi,

We have a requirement in which it is needed to upload some record into planning Area. Found one BAPI FM to insert data in the planning area called u2018BAPI_PBSRVAPS_CHANGEKEYFIGVAL2u2019.

I donu2019t know how to call the BAPI u2018BAPI_PBSRVAPS_CHANGEKEYFIGVAL2u2019, I have read the documentation of the FM but could not understand it.

Does any one give me code to call the FM u2018BAPI_PBSRVAPS_CHANGEKEYFIGVAL2u2019.

Any documentation or code will be a great helpu2026

Kind Regards,

Abhishek.

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos

REPORT ZPLIUSFCAST MESSAGE-ID zj01

LINE-SIZE 132.

************************************************************************

  • PROGRAM....... ZPLIUSFCAST

  • TITLE......... APO Forecast Interface

  • AUTHOR........ Aveek Ghose

  • DATE WRITTEN.. 15/09/2006

  • R/3 RELEASE... 4.6C

  • =====================================================================*

  • COPIED FROM... N/A

  • DESCRIPTION... This program reads a forecast file from PPC and loads

  • forecast quantities into APO Demand Planning LiveCache

  • - Key Figure 'Customer Forecast Units' (Z_CUSFU).

  • Include change request PD7K900203 in initial transport.

  • =====================================================================*

  • PROGRAM TYPE.. Inbound Interface

  • DEV. CLASS.... ZPLN

  • LOGICAL DB.... N/A

  • =====================================================================*

  • SCREENS....... N/A

  • GUI TITLE..... N/A

  • GUI STATUS.... N/A

  • TRANSACTIONS.. N/A

  • USER EXITS.... N/A

  • =====================================================================*

  • CHANGE HISTORY *

  • Date By Correction Number & Brief Description Release

----


  • Tables / Structures

----


*MOD-011

*TABLES: zpln_ppc_loc,

  • zpln_ppc_mat.

*MOD-011

  • Selection table for BAPI function modules

DATA: t_selection TYPE STANDARD TABLE OF bapi10030pbselection,

g_selection_wa LIKE LINE OF t_selection.

  • Key Figure table for BAPI function module

DATA: t_key_figure_selection TYPE STANDARD TABLE OF bapi10030keyfigure,

g_key_figure_selection_wa LIKE LINE OF t_key_figure_selection.

  • Group By table for BAPI function module

DATA: t_group_by TYPE STANDARD TABLE OF bapi10030pbgroupby,

g_group_by_wa LIKE LINE OF t_group_by.

  • Time Series table output from BAPI_PBSRVAPS_GETDETAIL

DATA: t_time_series TYPE STANDARD TABLE OF bapi10030pbtimeserieso,

g_time_series_wa LIKE LINE OF t_time_series.

  • Time Series table input to BAPI_PBSRVAPS_CHANGEKEYFIGVAL

DATA: t_time_series_chg TYPE STANDARD TABLE OF bapi10030pbtimeseries,

g_time_series_chg_wa LIKE LINE OF t_time_series_chg.

  • Time Bucket data input to BAPI_PBSRVAPS_CHANGEKEYFIGVAL

DATA: t_time_series_item TYPE STANDARD TABLE OF

bapi10030pbtimeseriesitem,

g_time_series_item_wa LIKE LINE OF t_time_series_item.

  • Characteristic Combination table for BAPI_PBSRVAPS_CHANGEKEYFIGVAL

DATA: t_char_comb TYPE STANDARD TABLE OF bapi10030pbcharacteristics,

g_char_comb_wa LIKE LINE OF t_char_comb.

  • Return table from BAPI function modules

DATA: t_return TYPE STANDARD TABLE OF bapiret2,

g_return_wa LIKE LINE OF t_return.

TYPES: BEGIN OF ty_forecast_data,

source_code(2) type c, "Source Code

lang_group(21) type c, "Language Group

pres_code(6) type c, "Presentation Code

pres_name(40) type c, "Presentation Name

site(4) TYPE c, " PPC Location

indication(3) type c, "Indication

date type datum, "Date

gi_date type datum, "Date

ord_number(8) type c, "Order Number

ord_line(6) type c, "Order Line Number

units(20) type c, "Units

END OF ty_forecast_data.

TYPES: BEGIN OF ty_forecast_data1,

source_code(2) type c, "Source Code

lang_group(21) type c, "Language Group

pres_code(6) type c, "Presentation Code

r3_material(40) TYPE c, " R/3 Material Code

pres_name(40) type c, "Presentation Name

site(4) TYPE c, " PPC Location

r3_loc(10) TYPE c, " R/3 Location

indication(3) type c, "Indication

date type datum, "Date

gi_date type datum, "Date

ord_number(8) type c, "Order Number

ord_line(6) type c, "Order Line Number

units(20) type c, "Units

forecast_cv(20) type c, " Forecast Quantity (converted)

calweek like scal-week, " Calendar Week

calweek_end like scal-week, " Calendar Week

calmonth(6) type c, " Calendar Month

calweekend_date type scal-date, " Calendar Week End date

calyear(6) type c, " Calendar Year

calweek_diff(4) type c, "Week Diff

startweek like scal-week,

endweek like scal-week,

start_day like scal-date,

end_day like scal-date,

calyear_start(4) type c, " Year Start

calyear_end(4) type c, " Year End

delete(1) type c, "Delete Flag

END OF ty_forecast_data1.

TYPES: BEGIN OF ty_forecast_data2,

source_code(2) type c, "Source Code

lang_group(21) type c, "Language Group

pres_code(6) type c, "Presentation Code

r3_material(40) TYPE c, " R/3 Material Code

pres_name(40) type c, "Presentation Name

site(4) TYPE c, " PPC Location

r3_loc(10) TYPE c, " R/3 Location

indication(3) type c, "Indication

calweek like scal-week, " Calendar Week

calweek_end type scal-week, " Calendar Week

endweek like scal-week,

forecast_cv(20) type c, " Forecast Quantity (converted)

date type datum, "Date

gi_date type datum, "Date

ord_number(8) type c, "Order Number

ord_line(6) type c, "Order Line Number

units(20) type c, "Units

calyear_start(4) type c, " Year Start

calyear_end(4) type c, " Year End

calmonth(6) type c, " Calendar Month

calyear(6) type c, " Calendar Year

startweek like scal-week,

start_day like scal-date,

end_day like scal-date,

delete(1) type c, "Delete Flag

END OF ty_forecast_data2.

TYPES: BEGIN OF ty_forecast_data4,

r3_material(40) TYPE c, " R/3 Material Code

site(4) TYPE c, " PPC Location

r3_loc(10) TYPE c, " R/3 Location

indication(3) type c, "Indication

calweek like scal-week, " Calendar Week

source_code(2) type c, "Source Code

lang_group(21) type c, "Language Group

pres_code(6) type c, "Presentation Code

pres_name(40) type c, "Presentation Name

calweek_end type scal-week, " Calendar Week

endweek like scal-week,

forecast_cv(20) type c, " Forecast Quantity (converted)

date type datum, "Date

gi_date type datum, "Date

ord_number(8) type c, "Order Number

ord_line(6) type c, "Order Line Number

units(20) type c, "Units

calyear_start(4) type c, " Year Start

calyear_end(4) type c, " Year End

calmonth(6) type c, " Calendar Month

calyear(6) type c, " Calendar Year

startweek like scal-week,

start_day like scal-date,

end_day like scal-date,

delete(1) type c, "Delete Flag

END OF ty_forecast_data4.

DATA: t_forecast_data2 TYPE STANDARD TABLE OF

ty_forecast_data2 initial size 0 with header line.

DATA: t_forecast_data3 TYPE STANDARD TABLE OF

ty_forecast_data2 initial size 0 with header line.

DATA: t_forecast_data4 TYPE STANDARD TABLE OF

ty_forecast_data4 initial size 0 with header line.

DATA: t_forecast_data TYPE STANDARD TABLE OF

ty_forecast_data initial size 0 with header line,

t_forecast_data1 TYPE STANDARD TABLE OF

ty_forecast_data1 initial size 0 with header line,

g_forecast_data_wa LIKE LINE OF t_forecast_data1,

g_forecast_data_wa2 LIKE LINE OF t_forecast_data2,

g_forecast_data_wa3 LIKE LINE OF t_forecast_data3,

l_forecast_data TYPE STANDARD TABLE OF ty_forecast_data1,

l_forecast_data_wa like line of t_forecast_data1,

l_forecast_data2 TYPE STANDARD TABLE OF ty_forecast_data2,

l_forecast_data_wa2 like line of t_forecast_data2.

  • Smaller forecast table to hold data for specific product/plant

  • combination]

*MOD-006

*DATA: t_forecast_sub TYPE STANDARD TABLE OF ty_forecast_data1,

  • g_forecast_sub_wa LIKE LINE OF t_forecast_sub.

*MOD-006

DATA: t_forecast_sub TYPE STANDARD TABLE OF ty_forecast_data2,

t_forecast_sub1 TYPE STANDARD TABLE OF ty_forecast_data2,

g_forecast_sub_wa LIKE LINE OF t_forecast_sub.

  • Error table

TYPES: BEGIN OF ty_error_data.

INCLUDE TYPE ty_forecast_data1.

TYPES: error_type(1) TYPE c,

END OF ty_error_data.

DATA: t_error_data TYPE STANDARD TABLE OF ty_error_data,

g_error_data_wa LIKE LINE OF t_error_data.

  • Structure to hold input file data

TYPES: BEGIN OF g_input_data1,

line(255) type c,

END OF g_input_data1.

DATA: g_input_data type standard table of

g_input_data1 initial size 0 with header line.

----


  • Global Variables

----


DATA: g_date_from TYPE /sapapo/cdps_eval_date_from, " From Date

g_date_to TYPE /sapapo/cdps_eval_date_to. " To Date

DATA: g_file LIKE dxfile-filename, " Filename

g_material TYPE /sapapo/matnr, " Material

g_cnt_input_recs TYPE i, " Number of file records

g_cnt_changes TYPE i, " Number of changes attempted

g_cnt_error_recs TYPE i, " Number of records with errors

g_flg_error. " Error

----


  • Objects

----


DATA: i_file TYPE REF TO zcl_file.

----


  • Constants

----


CONSTANTS: c_planningbook TYPE /sapapo/pb_mview " Planning Book

VALUE 'Z_PPC_FCST_DP',

c_period_type TYPE /sapapo/cdps_eval_type " Period Type

VALUE 'A'.

CONSTANTS:

c_version(22) TYPE c VALUE '000', " Version

c_log_type TYPE c VALUE 'L', " Logical Filetype

c_logqs TYPE /sapapo/logqs VALUE 'PSGA', " Business Sys Grp

c_ppc_mat_error(1) TYPE c VALUE '1',

" PPC Material not found in custom mapping table

c_ppc_loc_error(1) TYPE c VALUE '2',

" PPC Location not found in custom mapping table

c_r3_mat_error(1) TYPE c VALUE '3',

" R/3 to APO material mapping error

c_r3_loc_error(1) TYPE c VALUE '4',

" R/3 to APO location mapping error

c_pbook_error(1) TYPE c VALUE '5',

" Error getting planning book information

c_date_error(1) TYPE c VALUE '6',

" Invalid date error

c_change_error(1) TYPE c VALUE '7',

" Error changing key figure values

c_per_ind TYPE /sapapo/perkz VALUE 'P', " Period Indicator

c_fisc_var TYPE /sapapo/periv VALUE 'JJ', " Fiscal year variant

c_separator TYPE c VALUE ',', " Field separator

c_no_hdr_material(1) TYPE c VALUE '1',

C_LOCTYPE TYPE /SAPAPO/C_LOCTYPE VALUE '1002'.

" No header material in file record

----


  • Selection Screen

----


  • Files to process

SELECTION-SCREEN BEGIN OF BLOCK file WITH FRAME TITLE text-001.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF BLOCK infile WITH FRAME TITLE text-002.

PARAMETERS: p_login LIKE filename-fileintern OBLIGATORY

DEFAULT 'Z_DDS_43525_GPSG_EMEA_DEMAND'.

PARAMETERS: p_phyin LIKE filename-fileextern.

PARAMETERS: p_horz(4) type c default '60'.

PARAMETERS: P_DIST(4) TYPE C default '0200'.

PARAMETERS: P_LOGSYS TYPE EDIPPARNUM DEFAULT 'PD1120DEV'.

SELECTION-SCREEN END OF BLOCK infile.

SELECTION-SCREEN END OF BLOCK file.

&----


  • At Selection Screen

&----


AT SELECTION-SCREEN.

PERFORM sub_get_physical_file USING p_login p_phyin.

&----


  • At Selection Screen Output

&----


  • Make the physical file name display only

AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.

IF screen-name = 'P_PHYIN'.

screen-input = 0.

MODIFY SCREEN.

ENDIF.

ENDLOOP.

&----


  • INITIALIZATION.

&----


INITIALIZATION.

CLEAR: g_return_wa,

g_selection_wa,

g_key_figure_selection_wa,

g_group_by_wa,

g_time_series_wa,

g_time_series_chg_wa,

g_time_series_item_wa,

g_char_comb_wa,

g_forecast_data_wa,

g_forecast_sub_wa,

g_error_data_wa,

g_input_data,

g_date_from,

g_date_to,

g_cnt_input_recs,

g_cnt_changes,

g_cnt_error_recs,

g_flg_error.

REFRESH: t_return,

t_selection,

t_key_figure_selection,

t_group_by,

t_time_series,

t_time_series_chg,

t_time_series_item,

t_char_comb,

t_forecast_data,

t_forecast_sub,

t_error_data.

PERFORM sub_get_physical_file USING p_login p_phyin.

&----


  • Start-Of-Selection

&----


START-OF-SELECTION.

  • Read input file into internal table

PERFORM sub_read_file.

PERFORM validate_locmap.

IF NOT t_forecast_data[] IS INITIAL.

  • Map data to format for processing

PERFORM sub_map_data.

IF NOT t_forecast_data2[] IS INITIAL.

    • Process valid data records

PERFORM sub_process_data.

ENDIF.

ENDIF.

  • Display program results

PERFORM sub_display_results.

**&----


**

*& Form sub_display_results

&----


  • Write results to spool

----


FORM sub_display_results.

      • Program Results

SKIP.

WRITE: / text-025.

      • File locations

  • Input File

SKIP.

WRITE: / text-026,

15 p_phyin.

      • Record Counts

SKIP.

  • Number of records in input file

WRITE: / text-027,

48 g_cnt_input_recs.

  • Number of records with errors

WRITE: / text-028,

48 g_cnt_error_recs.

  • Number of records successfully updated in planning book

WRITE: / text-029,

48 g_cnt_changes.

*MOD-010

IF NOT t_error_data[] IS INITIAL.

  • Error Details:

SKIP.

WRITE: / text-024.

SKIP.

WRITE: / text-006,

13 text-007,

29 text-008,

41 text-009,

61 text-010.

WRITE: / text-011 UNDER text-006,

text-012 UNDER text-007,

text-013 UNDER text-008,

text-014 UNDER text-009,

text-015 UNDER text-010.

*MOD-010

SORT T_ERROR_DATA BY pres_code

site

date

forecast_cv.

Delete adjacent duplicates from t_error_data comparing pres_code

site

date

forecast_cv.

*MOD-010

LOOP AT t_error_data INTO g_error_data_wa.

WRITE: / g_error_data_wa-pres_code UNDER text-006,

g_error_data_wa-site UNDER text-007,

g_error_data_wa-date UNDER text-008,

48 g_error_data_wa-forecast_cv RIGHT-JUSTIFIED.

CASE g_error_data_wa-error_type.

WHEN c_ppc_mat_error.

WRITE text-031 UNDER text-010.

WHEN c_r3_mat_error.

WRITE text-019 UNDER text-010.

WHEN c_r3_loc_error.

WRITE text-020 UNDER text-010.

WHEN c_pbook_error.

WRITE text-021 UNDER text-010.

WHEN c_date_error.

WRITE text-022 UNDER text-010.

WHEN c_change_error.

WRITE text-023 UNDER text-010.

ENDCASE.

CLEAR: g_error_data_wa.

ENDLOOP.

IF sy-batch IS INITIAL.

MESSAGE i000 WITH text-030.

ELSE.

  • MESSAGE e000 WITH text-030. "TPR1336-

MESSAGE i000 WITH text-030. "TPR1336+

ENDIF.

ENDIF.

ENDFORM. " sub_display_results

&----


*& Form sub_map_data

&----


  • Map PPC codes to SAP codes and convert input values

----


FORM sub_map_data.

DATA: l_forecast(6) type c,

l_uom TYPE i.

DATA:

l_sold_num(10) TYPE n, " Sold To Quantity (numerical char.)

l_sold(7) TYPE p DECIMALS 3, " Sold To Quantity (Packed, 3 dec.)

l_calweek like scal-week, " Calendar Week

l_calweek_end like scal-week, " Calendar Week

l_startcalweek like scal-week, " Calendar Week

l_calweek1(2) type c, " Calendar Week

l_calweek_end1(2) type c, " Calendar Week

l_calweekend_date like scal-week, " Calendar Week

l_calmonth(6) type c, " Calendar Month

l_calyear_start(4) type c, " Calendar Year

l_calyear_end(4) type c, " Calendar Year

l_calweek_diff type scal-week, " Diff in week

l_fiscper(7) TYPE c. " Fiscal Period

DATA: l_temp_wa LIKE g_forecast_data_wa2,

l_hold_wa LIKE g_forecast_data_wa2.

DATA: lt_forecast_data2 TYPE STANDARD TABLE OF

ty_forecast_data2 initial size 0 with header line.

DATA: lt_forecast_data3 TYPE STANDARD TABLE OF

ty_forecast_data2 initial size 0 with header line.

DATA: lt_forecast_data4 TYPE STANDARD TABLE OF

ty_forecast_data2 initial size 0 with header line.

DATA: l_wa_forecast_data type ty_forecast_data2.

DATA: l_wa_forecast_data1 type ty_forecast_data1.

DATA: l_wa_forecast_data2 type ty_forecast_data2.

*MOD-008

  • Local variables

DATA: l_curr_date TYPE sydatum, " Program Run Date

l_record_date TYPE sydatum, " Formatted Record Date

l_curr_year(2) TYPE c, " Program Year (without century)

l_curr_year_num TYPE i, " Integer value of Program Year

l_century(2) TYPE c, " Program Century (without year)

l_century_num TYPE i, " Integer value of Century

l_input_year_num TYPE i. " Integer value of Record Year

  • Record date - format MM/DD/YY

DATA: BEGIN OF l_input_date,

month(2) TYPE c,

filler1(1) TYPE c,

day(2) TYPE c,

filler2(1) TYPE c,

year(2) TYPE c,

END OF l_input_date.

*MOD-008

FIELD-SYMBOLS:

<L_WA_FORECAST> TYPE ty_forecast_data2.

DATA: LV_FORECAST_CV type f.

CLEAR: lv_forecast_cv.

DATA: l_first_day LIKE SCAL-DATE,

l_last_day LIKE SCAL-DATE.

DATA: l_first_day1 LIKE SCAL-DATE,

l_last_day1 LIKE SCAL-DATE.

DATA: l_start_week LIKE SCAL-WEEK,

l_end_week LIKE SCAL-WEEK.

DATA: l_start_week1 LIKE SCAL-WEEK,

l_end_week1 LIKE SCAL-WEEK.

DATA: lv_sap_code(50) type c.

DATA: RETURN TYPE BAPIRET2.

DATA: l_date_tabix like sy-tabix.

DATA: L_TABIX TYPE SY-TABIX.

DATA: l_start_year(4) type c,

l_end_year(4) type c,

l_calyear_diff(4) type c,

l_calyear_data_start(4) type c.

LOOP AT T_FORECAST_DATA.

MOVE-CORRESPONDING T_FORECAST_DATA TO T_FORECAST_DATA1.

APPEND T_FORECAST_DATA1.

CLEAR: T_FORECAST_DATA1.

ENDLOOP.

  • Loop through internal table

LOOP AT t_forecast_data1 INTO g_forecast_data_wa.

  • Map Material code to SAP product and conversion factor using

  • cross-reference table; if not found, delete record and store

  • error.

CLEAR: LV_SAP_CODE.

CALL FUNCTION 'Z_XREF_LOOKUP' DESTINATION P_LOGSYS

EXPORTING

TRANSID = 'ZELCUSMATLOOKUP'

INVALUE = g_forecast_data_wa-pres_code

IMPORTING

OUTVALUE = lv_sap_code

RETURN = RETURN.

  • IF SY-SUBRC = 0.

IF NOT LV_SAP_CODE IS INITIAL. "RETURN IS INITIAL.

  • Convert SAP Material Code to APO Material Number; if not found,

  • delete record and store error

SELECT SINGLE matnr FROM /sapapo/matmap

INTO g_forecast_data_wa-r3_material

WHERE ext_matnr = lv_sap_code

AND logqs = c_logqs.

IF sy-subrc <> 0.

MOVE-CORRESPONDING g_forecast_data_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_r3_mat_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_data1.

CLEAR g_forecast_data_wa.

ADD 1 TO g_cnt_error_recs.

CONTINUE.

ENDIF.

*MOD-011

  • l_uom = 1.

*MOD-011

ELSE.

  • Store material in error table; delete current record of data

  • table; continue

MOVE-CORRESPONDING g_forecast_data_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_ppc_mat_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_data1.

CLEAR g_forecast_data_wa.

ADD 1 TO g_cnt_error_recs.

CONTINUE.

ENDIF.

    • Convert Forecast Quantity using conversion factor

l_forecast = g_forecast_data_wa-units.

g_forecast_data_wa-forecast_cv = g_forecast_data_wa-units.

*MOD-009

*MOD-006

CLEAR: l_calweek,

l_calweek_end,

l_calweekend_date,

l_calweek_diff,

l_fiscper,

l_calmonth,

l_calyear_start,

l_calyear_end,

l_start_week,

l_first_day,

l_end_week,

l_last_day.

*MOD-006

*MOD-006

*Convert Monday Date to Calendar Week and Fiscal Period

*MOD-010

PERFORM sub_format_dates USING g_forecast_data_wa-gi_date

l_calweek

l_calweek_end

l_calweekend_date

l_calweek_diff

l_fiscper

l_calmonth

l_calyear_start

l_calyear_end

l_start_week

l_first_day

l_end_week

l_last_day.

g_forecast_data_wa-calweek = l_calweek.

g_forecast_data_wa-calweek_end = l_calweek_end.

g_forecast_data_wa-calmonth = l_calmonth.

g_forecast_data_wa-calyear_start = l_calyear_start.

g_forecast_data_wa-calyear_end = l_calyear_end.

g_forecast_data_wa-startweek = l_start_week.

g_forecast_data_wa-endweek = l_end_week.

g_forecast_data_wa-start_day = l_first_day.

g_forecast_data_wa-end_day = l_last_day.

*MOD-010

  • Modify table record

MODIFY t_forecast_data1 FROM g_forecast_data_wa.

CLEAR g_forecast_data_wa.

ENDLOOP.

*MOD-010

LOOP AT T_FORECAST_DATA1 INTO L_WA_FORECAST_DATA1.

L_WA_FORECAST_DATA2-source_code =

L_WA_FORECAST_DATA1-source_code.

L_WA_FORECAST_DATA2-lang_group =

L_WA_FORECAST_DATA1-lang_group.

L_WA_FORECAST_DATA2-pres_code = L_WA_FORECAST_DATA1-pres_code.

L_WA_FORECAST_DATA2-r3_material = L_WA_FORECAST_DATA1-r3_material.

L_WA_FORECAST_DATA2-pres_name = L_WA_FORECAST_DATA1-pres_name.

L_WA_FORECAST_DATA2-site = L_WA_FORECAST_DATA1-site.

L_WA_FORECAST_DATA2-r3_loc = L_WA_FORECAST_DATA1-r3_loc.

L_WA_FORECAST_DATA2-indication = L_WA_FORECAST_DATA1-indication.

L_WA_FORECAST_DATA2-date = L_WA_FORECAST_DATA1-date.

L_WA_FORECAST_DATA2-gi_date = L_WA_FORECAST_DATA1-gi_date.

L_WA_FORECAST_DATA2-ord_number = L_WA_FORECAST_DATA1-ord_number.

L_WA_FORECAST_DATA2-ord_line = L_WA_FORECAST_DATA1-ord_line.

L_WA_FORECAST_DATA2-units = L_WA_FORECAST_DATA1-units.

L_WA_FORECAST_DATA2-forecast_cv = L_WA_FORECAST_DATA1-forecast_cv.

L_WA_FORECAST_DATA2-calweek = L_WA_FORECAST_DATA1-calweek.

L_WA_FORECAST_DATA2-calweek_end = L_WA_FORECAST_DATA1-calweek_end.

L_WA_FORECAST_DATA2-startweek = L_WA_FORECAST_DATA1-startweek.

L_WA_FORECAST_DATA2-endweek = L_WA_FORECAST_DATA1-endweek.

L_WA_FORECAST_DATA2-start_day = L_WA_FORECAST_DATA1-start_day.

L_WA_FORECAST_DATA2-end_day = L_WA_FORECAST_DATA1-end_day.

L_WA_FORECAST_DATA2-calyear_start =

L_WA_FORECAST_DATA1-calyear_start.

L_WA_FORECAST_DATA2-calyear_end = L_WA_FORECAST_DATA1-calyear_end.

L_WA_FORECAST_DATA2-delete = L_WA_FORECAST_DATA1-delete.

APPEND l_wa_forecast_data2 TO t_forecast_data2.

CLEAR: l_wa_forecast_data1.

Clear: t_forecast_data2.

ENDLOOP.

*MOD-010

SORT T_FORECAST_DATA2 BY

source_code

lang_group

pres_code

r3_material

pres_name

site

r3_loc

indication

calweek

endweek

calmonth

calyear_start

calyear_end

calweek_end

startweek

start_day

end_day

delete.

*****************************************************************

**MOD-010

*****************************************************************

clear: lv_forecast_cv.

  • collecting the product Variant.

*MOD-007

lt_forecast_data2[] = t_forecast_data2[].

  • Aggregation for JOR and NOR.

delete lt_forecast_data2 where indication <> 'JOR'

and indication <> 'NOR'.

IF NOT lt_forecast_data2[] is initial.

LOOP AT lt_forecast_data2 ASSIGNING <L_WA_FORECAST>.

LV_FORECAST_CV = LV_FORECAST_CV + <L_WA_FORECAST>-forecast_cv.

<L_WA_FORECAST>-DELETE = 'X'.

AT END OF CALWEEK.

<L_WA_FORECAST>-DELETE = ' '.

<L_WA_FORECAST>-forecast_cv = lv_forecast_cv.

CLEAR lv_forecast_cv.

ENDAT.

ENDLOOP.

ENDIF.

DELETE lt_forecast_data2 WHERE delete = 'X'.

  • Aggregation where Indication ne JOR and NOR.

lt_forecast_data3[] = t_forecast_data2[].

loop at lt_forecast_data3.

if lt_forecast_data3-indication = 'JOR'

or lt_forecast_data3-indication = 'NOR'.

delete lt_forecast_data3.

else.

*MOD-009

*if lt_forecast_data3-calweek > lt_forecast_data3-calweek_end.

*MOD-009

***MOD-011

  • if lt_forecast_data3-calweek > lt_forecast_data3-endweek.

  • delete lt_forecast_data3.

  • else.

  • append lt_forecast_data3 to lt_forecast_data4.

  • endif.

***MOD-011

append lt_forecast_data3 to lt_forecast_data4.

**MOD-011

*MOD-010

  • endif.

*MOD-010

endif.

endloop.

  • Aggregation beyond the horizon for all indication.

IF NOT lt_forecast_data3[] is initial.

LOOP AT lt_forecast_data3 ASSIGNING <L_WA_FORECAST>.

LV_FORECAST_CV = LV_FORECAST_CV + <L_WA_FORECAST>-forecast_cv.

<L_WA_FORECAST>-DELETE = 'X'.

AT END OF CALWEEK.

<L_WA_FORECAST>-DELETE = ' '.

<L_WA_FORECAST>-forecast_cv = lv_forecast_cv.

CLEAR lv_forecast_cv.

ENDAT.

ENDLOOP.

ENDIF.

DELETE lt_forecast_data3 WHERE delete = 'X'.

append lines of lt_forecast_data3 to lt_forecast_data2.

*MOD-007

*MOD-007

Refresh: t_forecast_data2.

append lines of lt_forecast_data2 to t_forecast_data2.

SORT T_FORECAST_DATA2 BY

source_code

lang_group

pres_code

r3_material

pres_name

site

r3_loc

indication

calweek

endweek

calweek_end

startweek

start_day

end_day

calyear_start

calyear_end

delete.

lt_forecast_data2[] = t_forecast_data2[].

READ TABLE lt_FORECAST_DATA2 INDEX 1.

l_start_year = lt_forecast_data2-calyear_start.

DESCRIBE TABLE lt_forecast_data2 lines l_tabix.

READ TABLE lt_forecast_data2 index l_tabix.

l_end_year = lt_forecast_data2-calyear_end.

loop at lt_forecast_data2.

if sy-tabix = 1.

l_calyear_data_start = ( lt_forecast_data2-calyear_start + 2 ).

endif.

exit.

endloop.

*MOD-009

delete lt_forecast_data2 where

calyear_start > l_calyear_data_start. "#EC PORTABLE

*MOD-009

delete lt_forecast_data2 where gi_date < sy-datum.

*MOD-009

Refresh: t_forecast_data2.

append lines of lt_forecast_data2 to t_forecast_data2.

*MOD-009

*****************************************************************

**MOD-010

*****************************************************************

ENDFORM. " sub_map_data

**&----


**

**& Form sub_process_data

**&----


**

    • Loop through data records, separate into product/location

    • sub-groups, and process

**----


**

FORM sub_process_data.

DATA: l_temp_wa LIKE g_forecast_data_wa2,

l_hold_wa LIKE g_forecast_data_wa2.

CLEAR l_hold_wa.

**MOD-010

SORT t_forecast_data2 BY r3_material

r3_loc

date

calweek ASCENDING.

**MOD-010

      • Loop through internal table, collecting sub-table for each

      • material/plant

LOOP AT t_forecast_data2 INTO g_forecast_data_wa2.

l_temp_wa = g_forecast_data_wa2.

  • Initial Loop Pass -

  • Save hold variables during first loop pass

AT FIRST.

l_hold_wa = l_temp_wa.

ENDAT.

  • Normal Loop Processing -

  • If control break occurs:

  • (1) process existing sub-table for

  • material plant combination;

  • (2) clear sub-table;

  • (3) set new hold values;

  • (4) append current work area to sub-table.

*

  • Otherwise, append current work area to sub-table

IF ( l_hold_wa-r3_material <> g_forecast_data_wa2-r3_material ) OR

( l_hold_wa-r3_loc <> g_forecast_data_wa2-r3_loc ) OR

( l_hold_wa-calweek <> g_forecast_data_wa2-calweek ).

  • Process sub-table; clear sub-table

  • Set new hold values; append sub-table.

l_hold_wa = l_temp_wa.

APPEND g_forecast_data_wa2 TO t_forecast_sub.

CLEAR g_forecast_data_wa2.

*MOD-009

PERFORM sub_call_bapi.

REFRESH t_forecast_sub.

*MOD-009

ELSE.

  • Append sub-table

APPEND g_forecast_data_wa2 TO t_forecast_sub.

CLEAR g_forecast_data_wa2.

ENDIF.

  • Final Loop Pass -

  • Process existing sub-table

AT LAST.

PERFORM sub_call_bapi.

ENDAT.

ENDLOOP.

ENDFORM. " sub_process_data

**&----


**

*& Form sub_read_file

&----


  • Read interface file

----


FORM sub_read_file.

  • Get Physical Filename

IF p_phyin IS INITIAL.

PERFORM sub_get_physical_file USING p_login p_phyin.

ENDIF.

  • Open a file object based on the selection screen information.

g_file = p_login.

CREATE OBJECT i_file EXPORTING u_f_filename = g_file

u_f_filetype = c_log_type.

  • Check authority for reading the interface file.

CALL METHOD i_file->check_read_authority.

  • Attempt to open file

CALL METHOD i_file->open_for_input.

  • Read file into data record and append to internal table

PERFORM sub_read_data.

  • Close file.

CALL METHOD i_file->close.

ENDFORM. " sub_read_file

&----


*& Form sub_get_physical_file

&----


  • Determine Physical filename from Logical Filename

----


  • -->P_LFILE Logical Filename

  • -->P_PFILE Physical Filename

----


FORM sub_get_physical_file USING p_lfile

p_pfile.

CHECK NOT p_lfile IS INITIAL.

CALL FUNCTION 'FILE_GET_NAME'

EXPORTING

client = sy-mandt

logical_filename = p_lfile

operating_system = sy-opsys

IMPORTING

file_name = p_pfile

EXCEPTIONS

file_not_found = 1

OTHERS = 2.

IF sy-subrc NE 0.

p_pfile = '' .

MESSAGE e002 WITH p_lfile.

ENDIF.

ENDFORM. " sub_get_physical_file

&----


*& Form sub_read_data

&----


  • Read data from input file

----


FORM sub_read_data.

DATA: DELIMETER(2) TYPE C VALUE ';'.

DATA: L_WA_INPUT_DATA TYPE G_INPUT_DATA1.

DO.

READ DATASET i_file->phys_filename INTO g_input_data.

IF sy-subrc NE 0.

IF g_cnt_input_recs = 0.

MESSAGE s000 WITH Text-004 i_file->phys_filename

Text-005.

  • MESSAGE s000 WITH 'Input file' i_file->phys_filename

  • 'is empty'.

g_flg_error = 'Y'.

STOP.

ENDIF.

EXIT.

ELSE.

APPEND g_input_data.

ADD 1 TO g_cnt_input_recs.

CLEAR: g_input_data,

g_forecast_data_wa.

ENDIF.

ENDDO.

*MOD-002

LOOP AT g_input_data.

t_forecast_data-source_code = g_input_data-line+0(4).

SEARCH t_forecast_data-source_code FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-source_code+sy-fdpos = space.

ENDIF.

t_forecast_data-lang_group = g_input_data-line+6(24).

CONDENSE t_forecast_data-lang_group.

SEARCH t_forecast_data-lang_group FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-lang_group+sy-fdpos = space.

ENDIF.

t_forecast_data-pres_code = g_input_data-line+30(9).

CONDENSE t_forecast_data-pres_code.

SEARCH t_forecast_data-pres_code FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-pres_code+sy-fdpos = space.

ENDIF.

t_forecast_data-pres_name = g_input_data-line+39(38).

CONDENSE t_forecast_data-pres_name.

SEARCH t_forecast_data-pres_name FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-pres_name+sy-fdpos = space.

ENDIF.

t_forecast_data-site = p_dist.

t_forecast_data-indication = g_input_data-line+77(6).

CONDENSE t_forecast_data-indication.

SEARCH t_forecast_data-indication FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-indication+sy-fdpos = space.

ENDIF.

t_forecast_data-date = g_input_data-line+83(11).

CONDENSE t_forecast_data-date.

SEARCH t_forecast_data-date FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-date+sy-fdpos = space.

ENDIF.

t_forecast_data-gi_date = g_input_data-line+94(12).

CONDENSE t_forecast_data-gi_date.

SEARCH t_forecast_data-gi_date FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-gi_date+sy-fdpos = space.

ENDIF.

t_forecast_data-ord_number = g_input_data-line+106(10).

CONDENSE t_forecast_data-ord_number.

SEARCH t_forecast_data-ord_number FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-ord_number+sy-fdpos = space.

ENDIF.

t_forecast_data-ord_line = g_input_data-line+116(8).

CONDENSE t_forecast_data-ord_line.

SEARCH t_forecast_data-ord_line FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-ord_line+sy-fdpos = space.

ENDIF.

t_forecast_data-units = g_input_data-line+124(28).

CONDENSE t_forecast_data-units.

SEARCH t_forecast_data-units FOR ';'.

IF sy-subrc EQ 0.

t_forecast_data-units+sy-fdpos = space.

ENDIF.

APPEND t_forecast_data.

CLEAR t_forecast_data.

CLEAR: g_input_data,

g_forecast_data_wa.

ENDLOOP.

*MOD-002

ENDFORM. " sub_read_data

&----


*& Form sub_call_bapi

&----


  • Read values of sub-table and update the Customer Forecast

  • key figure in the correct time buckets

----


FORM sub_call_bapi.

DATA: l_date TYPE sydatum,

l_start_date TYPE sydatum,

l_end_date TYPE sydatum,

l_period_start TYPE bapi10030pbperiodstart,

l_period_end TYPE bapi10030pbperiodend,

l_matnr TYPE /sapapo/matnr,

l_locno TYPE /sapapo/locno,

l_lines TYPE i.

*MOD-011

DATA:

l_calweek like scal-week, " Calendar Week

l_calweek_end like scal-week, " Calendar Week

l_startcalweek like scal-week, " Calendar Week

l_calweek1(2) type c, " Calendar Week

l_calweek_end1(2) type c, " Calendar Week

l_calweekend_date like scal-week, " Calendar Week

l_calmonth(6) type c, " Calendar Month

l_calyear_start(4) type c, " Calendar Year

l_calyear_end(4) type c, " Calendar Year

l_calweek_diff type scal-week, " Diff in week

p_calweek like scal-week, " Calendar Week

p_calweek_end like scal-week, " Calendar Week

p_startcalweek like scal-week, " Calendar Week

p_calweek1(2) type c, " Calendar Week

p_calweek_end1(2) type c, " Calendar Week

p_calweekend_date like scal-week, " Calendar Week

p_calmonth(6) type c, " Calendar Month

p_calyear_start(4) type c, " Calendar Year

p_calyear_end(4) type c, " Calendar Year

p_calweek_diff type scal-week, " Diff in week

p_calweek_start type scal-week, " Diff in week

p_start_week_day type SCDATUM, " Date

l_record_date type sy-datum, " Date

lv_year_start type CYEAR, " Year

lv_week_start type scal-week, " Week

lv_week_end type scal-week. " Week

*MOD-011

DATA: l_time_series_id TYPE /sapapo/mxrow.

*MOD-011

DATA: t_periotab type /SAPAPO/PERIOTAB OCCURS 0 WITH HEADER LINE.

DATA: g_periotab_wa type /SAPAPO/PERIOTAB.

*MOD-011

REFRESH: t_selection,

t_group_by,

t_key_figure_selection,

t_time_series,

t_time_series_chg,

t_time_series_item,

t_return.

READ TABLE t_forecast_sub INDEX 1 INTO g_forecast_sub_wa.

l_matnr = g_forecast_sub_wa-r3_material.

l_locno = g_forecast_sub_wa-r3_loc.

**********************************************************

      • Fill parameters/tables for BAPI_PBSRVAPS_GETDETAIL ***

**********************************************************

**MOD-006

      • Date Parameters

g_date_from = g_forecast_sub_wa-date.

g_date_to = g_forecast_sub_wa-gi_date.

**MOD-006

*MOD-006

  • Selection table

g_selection_wa-characteristic_name = '9AVERSION'. " Version

g_selection_wa-char_val_sign = 'I'.

g_selection_wa-char_val_option = 'EQ'.

g_selection_wa-char_val_low = c_version. " Default '000'

APPEND g_selection_wa TO t_selection.

CLEAR g_selection_wa.

      • Begin of change for TPR0817

g_selection_wa-characteristic_name = 'ZMATNR'. " APO-DP Product

      • End of change for TPR0817

g_selection_wa-char_val_sign = 'I'.

g_selection_wa-char_val_option = 'EQ'.

g_selection_wa-char_val_low = l_matnr.

APPEND g_selection_wa TO t_selection.

CLEAR g_selection_wa.

*MOD-006

g_selection_wa-characteristic_name = 'ZDCENTER'. " Location

g_selection_wa-char_val_sign = 'I'.

g_selection_wa-char_val_option = 'EQ'.

g_selection_wa-char_val_low = P_DIST.

APPEND g_selection_wa TO t_selection.

CLEAR g_selection_wa.

*MOD-006

  • Group By Table

      • Begin of change for TPR0817

g_group_by_wa-characteristic_name = 'ZMATNR'.

      • End of change for TPR0817

APPEND g_group_by_wa TO t_group_by.

CLEAR g_group_by_wa.

  • Key Figure Table - Customer Forecast in Units

g_key_figure_selection_wa-key_figure = 'Z_CUSFU'.

APPEND g_key_figure_selection_wa TO t_key_figure_selection.

CLEAR g_key_figure_selection_wa.

REFRESH t_return.

*MOD-006

  • Call FM to get time series number

CALL FUNCTION 'BAPI_PBSRVAPS_GETDETAIL'

EXPORTING

planningbook = c_planningbook

  • SELECTION_ID =

period_type = c_period_type

date_from = g_date_from

date_to = g_date_to

TABLES

selection = t_selection

group_by = t_group_by

key_figure_selection = t_key_figure_selection

time_series = t_time_series

return = t_return.

*MOD-006

IF NOT t_return[] IS INITIAL.

LOOP AT t_forecast_sub INTO g_forecast_sub_wa.

MOVE-CORRESPONDING g_forecast_sub_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_pbook_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_sub.

CLEAR g_forecast_sub_wa.

ADD 1 TO g_cnt_error_recs.

ENDLOOP.

EXIT.

ENDIF.

****************************************************************

      • Fill parameters/tables for BAPI_PBSRVAPS_CHANGEKEYFIGVAL ***

****************************************************************

  • Time Series table (containing time series ID)

READ TABLE t_time_series INDEX 1 INTO g_time_series_wa.

MOVE-CORRESPONDING g_time_series_wa TO g_time_series_chg_wa.

APPEND g_time_series_chg_wa TO t_time_series_chg.

l_time_series_id = g_time_series_wa-time_series_id.

CLEAR g_time_series_chg_wa.

*MOD-009

T_FORECAST_SUB1[] = T_FORECAST_SUB[].

  • Time Series Item table (contains all values to be loaded)

LOOP AT t_forecast_sub INTO g_forecast_sub_wa.

  • Time Series ID

g_time_series_item_wa-time_series_id = l_time_series_id.

  • Check date validity

CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'

EXPORTING

date = g_forecast_sub_wa-gi_date

EXCEPTIONS

plausibility_check_failed = 1

OTHERS = 2.

IF sy-subrc <> 0.

*MOD-010

MOVE-CORRESPONDING g_forecast_sub_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_date_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_sub.

CLEAR g_forecast_sub_wa.

ADD 1 TO g_cnt_error_recs.

CONTINUE.

ENDIF.

  • Get Date Range for given date

CALL FUNCTION '/SAPAPO/MC_DATE_GET_FIRST_LAST'

EXPORTING

i_date = g_forecast_sub_wa-gi_date

i_perkz = 'W'

  • I_FABKL = ' '

  • I_PERIV = ' '

IMPORTING

i_firstdate = l_start_date

i_lastdate = l_end_date

.

**********

*MOD-011

**********

    • Starting Timestamp

  • CONVERT DATE l_start_date INTO TIME STAMP l_period_start

  • TIME ZONE 'UTC '.

  • g_time_series_item_wa-period_begin = l_period_start.

*

    • Ending Timestamp

  • CONVERT DATE l_end_date TIME '235959' INTO TIME STAMP l_period_end

  • TIME ZONE 'UTC '.

  • g_time_series_item_wa-period_end = l_period_end.

*MOD-011

*********

*MOD-011

*********

  • Data for forecast run date.

l_record_date = sy-datum.

CALL FUNCTION '/SAPAPO/DATE_GET_WEEK'

EXPORTING

date = l_record_date

IMPORTING

week = l_calweek

EXCEPTIONS

date_invalid = 1

OTHERS = 2.

IF sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calweek(2) = l_calweek+4(2).

p_calweek+2(4) = l_calweek(4).

ENDIF.

lv_year_start = p_calweek+2(4).

lv_week_start = p_calweek+0(2).

lv_week_end = lv_week_start + 1.

concatenate lv_year_start lv_week_end+4(2) into p_calweek_start.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'

EXPORTING

WEEK = p_calweek_start

IMPORTING

DATE = p_start_week_day

EXCEPTIONS

WEEK_INVALID = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

CALL FUNCTION '/SAPAPO/SDP_TB_GET_PERIOTAB'

EXPORTING

I_TBID = '104 WEEKS'

I_DIRECTION = '+'

I_STARTDATE = p_start_week_day

I_OFFSET_IN_DAYS = '0'

TABLES

E_PERIOTAB = t_periotab

EXCEPTIONS

TB_NOT_EXISTS = 1

NO_TB_DEFINED = 2

WRONG_TB_DEFINITION = 3

OTHERS = 4.

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

LOOP AT T_PERIOTAB INTO G_PERIOTAB_WA.

    • Starting Timestamp

CONVERT DATE G_PERIOTAB_WA-ertag

INTO TIME STAMP l_period_start

TIME ZONE 'UTC '.

g_time_series_item_wa-period_begin = l_period_start.

  • Ending Timestamp

CONVERT DATE G_PERIOTAB_WA-bistag

TIME '235959' INTO TIME STAMP l_period_end

TIME ZONE 'UTC '.

g_time_series_item_wa-period_end = l_period_end.

  • Forecast Value

g_time_series_item_wa-time_series_value = 0.

g_time_series_item_wa-time_series_id = l_time_series_id.

APPEND g_time_series_item_wa TO t_time_series_item.

CLEAR g_time_series_item_wa.

ENDLOOP.

*MOD-011

ENDLOOP.

REFRESH: t_return,

t_char_comb.

SORT t_time_series_item by TIME_SERIES_ID

period_begin

period_end.

delete adjacent duplicates from t_time_series_item

comparing

TIME_SERIES_ID

PERIOD_BEGIN

PERIOD_END.

*********

**MOD-011

*********

*Delete the first and the last record from the time series table.

data: l_tabix type sy-tabix.

DESCRIBE TABLE t_time_series_item lines l_tabix.

if l_tabix ne 0.

delete t_time_series_item index l_tabix.

delete t_time_series_item index 1.

endif.

*********

**MOD-011

*********

*MOD-011

if g_material ne g_forecast_sub_wa-r3_material.

*MOD-011

  • Refresh the Planning Book

CALL FUNCTION 'BAPI_PBSRVAPS_CHANGEKEYFIGVAL'

EXPORTING

planningbook = c_planningbook

commit_control = 'E'

TABLES

selection = t_selection

time_series = t_time_series_chg

time_series_item = t_time_series_item

characteristics_combination = t_char_comb

return = t_return.

  • If error in return table, store message in error table and attempt

  • rollback; otherwise commit

IF NOT t_return[] IS INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ELSE.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

ENDIF.

*MOD-011

g_material = g_forecast_sub_wa-r3_material.

ENDIF.

*MOD-011

*MOD-009

Refresh: t_time_series_item.

**************

***MOD-011

**************

  • Time Series Item table (contains all values to be loaded)

LOOP AT t_forecast_sub1 INTO g_forecast_sub_wa.

  • Time Series ID

g_time_series_item_wa-time_series_id = l_time_series_id.

  • Check date validity

CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'

EXPORTING

date = g_forecast_sub_wa-gi_date

EXCEPTIONS

plausibility_check_failed = 1

OTHERS = 2.

IF sy-subrc <> 0.

MOVE-CORRESPONDING g_forecast_sub_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_date_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_sub1.

CLEAR g_forecast_sub_wa.

ADD 1 TO g_cnt_error_recs.

CONTINUE.

ENDIF.

  • Get Date Range for given date

CALL FUNCTION '/SAPAPO/MC_DATE_GET_FIRST_LAST'

EXPORTING

i_date = g_forecast_sub_wa-gi_date

i_perkz = 'W'

  • I_FABKL = ' '

  • I_PERIV = ' '

IMPORTING

i_firstdate = l_start_date

i_lastdate = l_end_date

.

  • Starting Timestamp

CONVERT DATE l_start_date INTO TIME STAMP l_period_start

TIME ZONE 'UTC '.

g_time_series_item_wa-period_begin = l_period_start.

  • Ending Timestamp

CONVERT DATE l_end_date TIME '235959' INTO TIME STAMP l_period_end

TIME ZONE 'UTC '.

g_time_series_item_wa-period_end = l_period_end.

  • Forecast Value

g_time_series_item_wa-time_series_value =

g_forecast_sub_wa-forecast_cv.

APPEND g_time_series_item_wa TO t_time_series_item.

CLEAR g_time_series_item_wa.

ENDLOOP.

  • Call FM BAPI_PBSRVAPS_CHANGEKEYFIGVAL to change Z_CUSFU for all

  • time buckets

REFRESH: t_return,

t_char_comb.

*MOD-006

SORT t_time_series_item by TIME_SERIES_ID

period_begin

period_end.

delete adjacent duplicates from t_time_series_item

comparing

TIME_SERIES_ID

PERIOD_BEGIN

PERIOD_END.

*MOD-006

CALL FUNCTION 'BAPI_PBSRVAPS_CHANGEKEYFIGVAL'

EXPORTING

planningbook = c_planningbook

commit_control = 'E'

TABLES

selection = t_selection

time_series = t_time_series_chg

time_series_item = t_time_series_item

characteristics_combination = t_char_comb

return = t_return.

  • If error in return table, store message in error table and attempt

  • rollback; otherwise commit

IF NOT t_return[] IS INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'

  • IMPORTING

  • RETURN =

.

LOOP AT t_forecast_sub1 INTO g_forecast_sub_wa.

*MOD-010

MOVE-CORRESPONDING g_forecast_sub_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_change_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

DELETE t_forecast_sub1.

CLEAR g_forecast_sub_wa.

ADD 1 TO g_cnt_error_recs.

CONTINUE.

ENDLOOP.

ELSE.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' .

DESCRIBE TABLE t_forecast_sub1 LINES l_lines.

g_cnt_changes = g_cnt_changes + l_lines.

ENDIF.

************

*MOD-011

************

ENDFORM. " sub_call_bapi

&----


*& Form sub_format_dates

&----


  • text

----


  • -->P_L_HOLD_WA_DATE text

  • -->P_L_CALWEEK text

  • -->P_L_FISCPER text

  • -->P_L_CALMONTH text

----


FORM sub_format_dates USING p_date

p_calweek

p_calweek_end

p_weekend_date

p_week_diff

p_fiscper

p_calmonth

p_calyear_start

p_calyear_end

p_start_week

p_start_week_day

p_end_week

p_end_week_day.

  • Local variables

DATA: l_curr_date TYPE sydatum, " Program Run Date

l_record_date TYPE sydatum, " Formatted Record Date

l_curr_year(2) TYPE c, " Program Year (without century)

l_curr_year_num TYPE i, " Integer value of Program Year

l_century(2) TYPE c, " Program Century (without year)

l_century_num TYPE i, " Integer value of Century

l_input_year_num TYPE i. " Integer value of Record Year

DATA: con_period_week type /SAPAPO/PERKZ value 'W'.

  • Record date - format MM/DD/YY

DATA: BEGIN OF l_input_date,

month(2) TYPE c,

filler1(1) TYPE c,

day(2) TYPE c,

filler2(1) TYPE c,

year(2) TYPE c,

END OF l_input_date.

DATA: l_calweek TYPE kweek,

l_fiscper TYPE /sapapo/perid.

*MOD-006

data: l_calmonth(6) type c,

l_calyear(6) type c,

l_month(2) type c,

l_year(4) type c,

l_perid type /SAPAPO/PERID.

DATA: p_calweek_start like scal-week.

DATA: F_DATE TYPE D,

L_FROMDATE LIKE SCAL-DATE,

L_TODATE LIKE SCAL-DATE.

DATA: lv_year_start(4) type c,

lv_week_start(2) type c,

lv_week_end(2) type c.

DATA: lv_calweek_start type scal-week.

DATA: lv_start_week_day type scal-date.

DATA: lv_end_week_day type scal-date.

DATA: lv_length type i.

clear: l_perid.

**MOD-006

  • Data for forecast run date.

l_record_date = sy-datum.

  • Use /SAPAPO/DATE_GET_WEEK, /SAPAPO/PERIOD_GET_FOR_DATE (P/JJ)... but

  • must convert to DATS format first

CALL FUNCTION '/SAPAPO/DATE_GET_WEEK'

EXPORTING

date = l_record_date

IMPORTING

week = l_calweek

EXCEPTIONS

date_invalid = 1

OTHERS = 2.

IF sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calweek(2) = l_calweek+4(2).

p_calweek+2(4) = l_calweek(4).

ENDIF.

lv_year_start = p_calweek+2(4).

lv_week_start = p_calweek+0(2).

lv_week_end = lv_week_start + 1.

concatenate lv_year_start lv_week_end into p_calweek_start.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'

EXPORTING

WEEK = p_calweek_start

IMPORTING

DATE = p_start_week_day

EXCEPTIONS

WEEK_INVALID = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

p_end_week_day = p_start_week_day + p_horz.

l_record_date = p_end_week_day.

CLEAR: l_calweek.

CALL FUNCTION '/SAPAPO/DATE_GET_WEEK'

EXPORTING

date = l_record_date

IMPORTING

week = l_calweek

EXCEPTIONS

date_invalid = 1

OTHERS = 2.

IF sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calweek_end = l_calweek.

p_calyear_end = l_calweek+2(4).

ENDIF.

CLEAR: P_END_WEEK_DAY.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'

EXPORTING

WEEK = p_calweek_end

IMPORTING

DATE = p_end_week_day

EXCEPTIONS

WEEK_INVALID = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

Clear: lv_week_start, lv_week_end.

*MOD-006

lv_week_start = p_calweek_start+4(2).

lv_year_start = p_calweek_start+0(4).

concatenate lv_week_start lv_year_start into p_start_week.

p_calyear_start = lv_year_start.

lv_week_start = p_calweek_end+4(2).

lv_year_start = p_calweek_end+0(4).

concatenate lv_week_start lv_year_start into p_end_week.

*MOD-006

p_week_diff = p_calweek_end0(2) - p_calweek0(2).

condense p_week_diff.

p_week_diff = ceil( p_week_diff ).

*MOD-006

*Data for availability date.

l_record_date = p_date.

  • Use /SAPAPO/DATE_GET_WEEK, /SAPAPO/PERIOD_GET_FOR_DATE (P/JJ)... but

  • must convert to DATS format first

CALL FUNCTION '/SAPAPO/DATE_GET_WEEK'

EXPORTING

date = l_record_date

IMPORTING

week = l_calweek

EXCEPTIONS

date_invalid = 1

OTHERS = 2.

IF sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calweek(2) = l_calweek+4(2).

p_calweek+2(4) = l_calweek(4).

ENDIF.

lv_year_start = p_calweek+2(4).

lv_week_start = p_calweek+0(2).

lv_week_end = lv_week_start + 1.

lv_length = strlen( lv_week_end ).

if lv_length < 2.

concatenate '0' lv_week_end into lv_week_end.

endif.

CONSTANTS: C_52(2) TYPE C VALUE '52'.

concatenate lv_year_start lv_week_end into lv_calweek_start.

if lv_calweek_start+4(2) > c_52.

lv_calweek_start+4(2) = c_52.

endif.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'

EXPORTING

WEEK = lv_calweek_start

IMPORTING

DATE = lv_start_week_day

EXCEPTIONS

WEEK_INVALID = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

lv_end_week_day = lv_start_week_day + p_horz.

l_record_date = lv_end_week_day.

CLEAR: l_calweek.

CALL FUNCTION '/SAPAPO/DATE_GET_WEEK'

EXPORTING

date = l_record_date

IMPORTING

week = l_calweek

EXCEPTIONS

date_invalid = 1

OTHERS = 2.

IF sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calweek_end = l_calweek.

ENDIF.

lv_year_start = p_calweek_end+0(4).

lv_week_start = p_calweek_end+4(2).

concatenate lv_week_start lv_year_start into p_calweek_end.

p_calyear_end = lv_year_start.

*MOD-008

clear: l_perid.

l_record_date = p_date.

call function '/SAPAPO/PERIOD_GET_FOR_DATE'

EXPORTING

i_date = l_record_date

i_perkz = 'M'

I_PERIV = 'K0'

IMPORTING

E_PERID = l_perid

EXCEPTIONS

WRONG_PERKZ = 1

WRONG_DATE = 2

WRONG_PERIV = 3

OTHERS = 4.

if sy-subrc <> 0.

g_flg_error = 'X'.

EXIT.

ELSE.

p_calmonth(2) = l_perid+4(2).

p_calmonth+2(4) = l_perid(4).

p_calyear_start = l_perid+0(4).

endif.

*MOD-008

ENDFORM. " sub_format_dates

&----


*& Form validate_locmap

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM validate_locmap .

*MOD-011

    • Convert SAP Location Code to APO Location

if not t_forecast_data[] is initial.

READ TABLE t_forecast_data into g_forecast_data_wa index 1.

SELECT SINGLE locno FROM /sapapo/locmap

INTO g_forecast_data_wa-r3_loc

WHERE ext_locno = p_dist

AND loctype = c_loctype

AND LOGQS = c_logqs.

IF sy-subrc <> 0.

MOVE-CORRESPONDING g_forecast_data_wa TO g_error_data_wa.

g_error_data_wa-error_type = c_r3_loc_error.

APPEND g_error_data_wa TO t_error_data.

CLEAR g_error_data_wa.

CLEAR g_forecast_data_wa.

ADD 1 TO g_cnt_error_recs.

ENDIF.

ENDIF.

*MOD-011

ENDFORM. " validate_locmap

Former Member
0 Kudos

Hi Abishek,

Check the below code .

w_groupby-characteristic_name = '9AMATNR'.
APPEND w_groupby TO i_groupby.

w_keyfig_sel-key_figure = 'APODPDANT'.
APPEND w_keyfig_sel TO i_keyfig_sel.

w_read_opt-macro_execution_flag = c_x.
w_read_opt-max_number_of_char_combs = 999999.
w_read_opt-kfig_preselection_flag = c_x.
w_read_opt-time_preselection_flag = c_x.
w_read_opt-nav_attributes_flag = c_x.
w_read_opt-no_zero_values_flag = c_x.
w_read_opt-no_initial_values_flag = c_x.

CALL FUNCTION 'BAPI_PBSRVAPS_GETDETAIL2'
EXPORTING
planningbook = p_plnbk
data_view = p_datvw
planning_version = '000'
selection_id = 'ALL-SKU'
read_options = w_read_opt
period_type = 'B'
date_from = '012001'
date_to = '012011'
TABLES
group_by = i_groupby
key_figure_selection = i_keyfig_sel
key_figure = i_keyfig
key_figure_value = i_keyfig_val
characteristics_combination = i_char_comb
return = i_return.

break dgoud.

IF i_return IS INITIAL.

LOOP AT i_char_comb INTO w_char_comb
WHERE characteristic_name = '9AMATNR'.

READ TABLE i_lcprof INTO w_lcprof
WITH KEY merkmal1 = w_char_comb-characteristic_value.
IF sy-subrc EQ 0.
READ TABLE i_keyfig INTO w_keyfig
WITH KEY char_comb_id = w_char_comb-char_comb_id.
IF sy-subrc EQ 0.
LOOP AT i_keyfig_val INTO w_keyfig_val WHERE key_figure_id = w_keyfig-key_figure_id.

v_index = sy-tabix.

CALL FUNCTION 'IB_CONVERT_FROM_TIMESTAMP'
EXPORTING
i_timestamp = w_keyfig_val-period_begin
i_tzone = sy-zonlo
IMPORTING
e_datlo = v_date.

IF v_date GE w_lcprof-phout_from.
w_keyfig_val-value = 0.
MODIFY i_keyfig_val FROM w_keyfig_val INDEX v_index TRANSPORTING value.
fl_update = c_x.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

CLEAR : w_char_comb,w_keyfig_val,v_date,w_lcprof,v_index,w_keyfig.
ENDLOOP.

IF fl_update = c_x.

w_sav_opt-macro_execution_flag = c_x.
w_sav_opt-retry_number = 5.

w_sav_opt-RETRY_WAITING_TIME 

LOOP AT i_keyfig INTO w_keyfig.
MOVE-CORRESPONDING w_keyfig TO w_keyfig1 .
APPEND w_keyfig1 TO i_keyfig1.
ENDLOOP.

LOOP AT i_keyfig_val INTO w_keyfig_val.
MOVE-CORRESPONDING w_keyfig_val to w_keyfig_val1.
APPEND w_keyfig_val1 TO i_keyfig_val1.
CLEAR : w_keyfig_val, w_keyfig_val1.
ENDLOOP.

LOOP AT i_char_comb INTO w_char_comb.
MOVE-CORRESPONDING w_char_comb to w_char_comb1.
APPEND w_char_comb1 TO i_char_comb1.
CLEAR : w_char_comb, w_char_comb1.
ENDLOOP.

CALL FUNCTION 'BAPI_PBSRVAPS_CHANGEKEYFIGVAL2'
EXPORTING
planningbook = p_plnbk
data_view = p_datvw
planning_version = '000'
save_options = w_sav_opt
TABLES
key_figure = i_keyfig1
key_figure_value = i_keyfig_val
characteristics_combination = i_char_comb1
return = i_return1.

IF i_return1 IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' .
ENDIF.
ENDIF.
ENDIF.

0 Kudos

Hi,

Applied an OSS note to solve the problem related to BAPI.

Thanks,

Abhishek

Edited by: Abhshk Bhatta on Jul 21, 2008 11:10 PM