cancel
Showing results for 
Search instead for 
Did you mean: 

SAP APO Upgrade issue

joginder_singh
Active Participant
0 Kudos

Hi All,

I am working in APO Upgrade project where in , change is required to move from PPM to PDS data structures. Unable to find equivalent tables of PPM to PDS conversion . Tables in PPM are following.. need to replace these..

/sapapo/plan

/sapapo/planact

/sapapo/compalt

I am trying to replace the following code with PDS data structure..

SELECT SINGLE dactid epar1

FROM /sapapo/matmap AS a

JOIN /sapapo/trprod AS b ON amatid = bmatid

JOIN /sapapo/plan AS c ON bplanid = cplanid

JOIN /sapapo/planact AS d ON cplanid = dplanid

JOIN /sapapo/compalt AS e ON bamatid = eamatid

AND bmatid = ematid

INTO (lv_actid, lv_per)

WHERE a~ext_matnr = it_matkey-ext_matnr

AND b~valto >= lv_today "still valid

AND b~trptype = '002' "PPM

AND b~beskz = 'E' "int.production

AND c~cost1 = 10 "preferred line

AND c~state = '1' "plan active

Please let me know if this is possible through tables or using FM /SAPAPO/PPM_GET_PLAN.

Accepted Solutions (0)

Answers (1)

Answers (1)

joginder_singh
Active Participant
0 Kudos

Found the answer to the solution

Former Member
0 Kudos

Can you let us know what the answer is?

Thanks.

joginder_singh
Active Participant
0 Kudos

Hi,

Solution is to use the BAPI "BAPI_PDSSRVAPS_GETLIST" which gives PDS equivalent of PPM data structures.

The internal tables lt_pds_head , lt_pds_component , lt_pds_activity etc in BAPI holds all

the data equivalent to PPM data structure.

This BAPI can be tested independetly by passing

LOGICAL_SYSTEM as current APO system and

PRODUCT_SELECTION as range which contains PRODUCT details and

LOCATION_SELECTION as range which contains LOCATION details and

PLANNING_VERSION as '000' (ACTIVE VERSION) and

PLAN_USAGE as 'S' .

The sample code is as below :

METHOD if_ex_smod_apocf005~exit_/sapapo/saplcif_prod_001.

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

  • Program ID : CIF_IMPORT Helpdesk ID: PPDS4 *

  • Description: This methid is copied from User Exit ZXCIFUSERU08 for mapping *

  • the data structures within the program to adapt BADI tables. *

*

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

  • Revision History *

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

  • Date : Changed By : *

  • Revision ID: Helpdesk ID: *

  • Description: *

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

DATA: lv_baserate TYPE zbaserate,

lv_rate TYPE /sapapo/bcap1,

lv_per TYPE /sapapo/par1,

lv_qty TYPE /sapapo/par1,

lv_actid TYPE /sapapo/actid,

lv_resid TYPE /sapapo/resid,

lv_ndpen_ord TYPE /sapapo/snpndpend,

lv_ndpen_fc TYPE /sapapo/snpndpend,

lv_ndpen_ordc TYPE /sapapo/snpndpend, "component ND penalty

lv_ndpen_fcc TYPE /sapapo/snpndpend, "component ND penalty

lv_today TYPE /sapapo/scc_valtotstmp,

ls_matloc TYPE /sapapo/cif_matloc,

ls_matlocx TYPE /sapapo/cif_matlocx,

ls_matkey TYPE /sapapo/cif_matkey,

ls_penalty1 TYPE /sapapo/cif_penalty1,

ls_marm TYPE /sapapo/cif_marm,

lv_tzone TYPE tzonref-tzone,

lv_matnr TYPE /SAPAPO/CIF_MATLOC-ext_matnr,

lv_no_pds TYPE bapi10014genfields-no_of_pds,

lv_matid TYPE /sapapo/matkey-matid,

lr_prod TYPE TABLE OF bapiproductrange,

ls_prod TYPE bapiproductrange,

lr_loc TYPE TABLE OF bapilocrange,

ls_loc TYPE bapilocrange,

lt_plan TYPE TABLE OF bapiversrange,

lt_usage TYPE TABLE OF bapi10014pdsusage,

lt_pds_head TYPE TABLE OF bapi10014pdsheado,

lt_pds_component TYPE TABLE OF bapi10014pdscompo,

lt_pds_component_final TYPE TABLE OF bapi10014pdscompo,

lt_pds_activity TYPE TABLE OF bapi10014pdsacto,

lt_pds_mode TYPE TABLE OF bapi10014pdsmodeo,

lt_pds_mode_final TYPE TABLE OF bapi10014pdsmodeo,

lt_pds_capacity_requirement TYPE TABLE OF bapi10014pdscapreqo,

lt_pds_capacity_requirement_f TYPE TABLE OF bapi10014pdscapreqo,

lt_pds_activity_final TYPE TABLE OF bapi10014pdsacto,

ls_pds_head TYPE bapi10014pdsheado,

ls_plan TYPE bapiversrange,

ls_usage TYPE bapi10014pdsusage,

ls_pds_component_final TYPE bapi10014pdscompo,

ls_pds_component TYPE bapi10014pdscompo,

ls_pds_capacity_requirement TYPE bapi10014pdscapreqo,

ls_pds_mode TYPE bapi10014pdsmodeo,

ls_pds_activity TYPE bapi10014pdsacto.

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

*Create the range for BAPI for product and locations

LOOP AT it_matloc INTO ls_matloc.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

input = ls_matloc-ext_matnr

IMPORTING

OUTPUT = lv_matnr

.

  • ls_prod holds the products

MOVE : 'I' TO ls_prod-sign,

'EQ' TO ls_prod-option,

lv_matnr TO ls_prod-low,

lv_matnr TO ls_prod-high.

APPEND ls_prod TO lr_prod.

CLEAR ls_prod.

  • ls_loc holds the location

MOVE : 'I' TO ls_loc-sign,

'EQ' TO ls_loc-option,

ls_matloc-ext_locno TO ls_loc-low,

ls_matloc-ext_locno TO ls_loc-high.

APPEND ls_loc TO lr_loc.

CLEAR ls_loc.

ENDLOOP.

MOVE : 'I' TO ls_plan-sign,

'EQ' TO ls_plan-option,

'000' TO ls_plan-low.

APPEND ls_plan TO lt_plan.

CLEAR ls_plan.

MOVE :'S' TO ls_usage-pds_usage.

APPEND ls_usage TO lt_usage.

CLEAR ls_usage.

  • Process all finished product material types

  • FERT - Finished goods

  • ZSUN - Sundries

  • HAWA - Trading goods

LOOP AT it_matkey INTO ls_matkey WHERE att01 = 'FERT'

OR att01 = 'ZSUN'

OR att01 = 'HAWA'.

CLEAR: lv_baserate, lv_rate, lv_baserate, lv_per, lv_actid,

lv_resid, lv_ndpen_ord, lv_ndpen_fc, lv_ndpen_ordc,

lv_ndpen_fcc.

  • use material specific default if one exists

SELECT SINGLE bndpen_ord bndpen_fc

FROM /sapapo/matmap AS a

JOIN zndpenalty AS b ON amatnr = bmatnr

INTO (lv_ndpen_ord, lv_ndpen_fc)

WHERE a~ext_matnr = ls_matkey-ext_matnr.

IF sy-subrc = 0.

CLEAR: it_penalty1,ls_penalty1.

ls_penalty1-method = 'M'.

ls_penalty1-ext_matnr = ls_matkey-ext_matnr.

ls_penalty1-demcl = 1.

ls_penalty1-ndpen = lv_ndpen_ord.

APPEND ls_penalty1 TO it_penalty1.

ls_penalty1-demcl = 6.

ls_penalty1-ndpen = lv_ndpen_fc.

APPEND ls_penalty1 TO it_penalty1.

CONTINUE. "get next material

ENDIF.

  • get general default

  • SELECT SINGLE ndpen_ord ndpen_fc FROM zndpenalty

  • INTO (lv_ndpen_ord, lv_ndpen_fc)

  • WHERE matnr = ''.

  • IF sy-subrc <> 0.

  • CONTINUE.

  • ENDIF.

  • Use general defaults for sundaries

IF ls_matkey-att01 = 'ZSUN'.

CLEAR: ls_penalty1.

ls_penalty1-method = 'M'.

ls_penalty1-ext_matnr = ls_matkey-ext_matnr.

ls_penalty1-demcl = 1.

ls_penalty1-ndpen = lv_ndpen_ord.

APPEND ls_penalty1 TO it_penalty1.

ls_penalty1-demcl = 6.

ls_penalty1-ndpen = lv_ndpen_fc.

APPEND ls_penalty1 TO it_penalty1..

CONTINUE. "get next material

ENDIF.

  • for TRDUs/dollies pro-rata based on component qty & costs

IF ls_matkey-meins = 'UN'.

  • find output qty on preferred SNP PPM

CONVERT DATE sy-datum INTO TIME STAMP lv_today TIME ZONE lv_tzone.

*Calling BAPI as converting PPM data structure to PDS

CALL FUNCTION 'BAPI_PDSSRVAPS_GETLIST'

EXPORTING

logical_system = 'AP_300'

IMPORTING

number_of_pds = lv_no_pds

TABLES

product_selection = lr_prod

location_selection = lr_loc

planning_version_selection = lt_plan

pds_usage = lt_usage

pds_head = lt_pds_head

pds_component = lt_pds_component

pds_activity = lt_pds_activity

pds_mode = lt_pds_mode

pds_capacity_requirement = lt_pds_capacity_requirement.

IF sy-subrc IS INITIAL.

  • Delete the PDS header table if Single-Level Costs (Variable) is NE '10'

DELETE lt_pds_head WHERE single_level_costs_var NE 10.

SORT lt_pds_head BY pds_name.

SORT it_matloc BY ext_matnr.

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

*First step : Finding the output component (Type O)

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

  • Access the variable material consumption of the output component product

  • lt_pds_component_final holds the output component product

LOOP AT lt_pds_component INTO ls_pds_component.

READ TABLE lt_pds_head INTO ls_pds_head

WITH KEY pds_name = ls_pds_component-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

IF ls_pds_component-component_indicator EQ 'O'. "Output Component

READ TABLE it_matloc INTO ls_matloc

WITH KEY ext_matnr = ls_pds_component-product

BINARY SEARCH.

IF sy-subrc IS INITIAL .

APPEND ls_pds_component TO lt_pds_component_final.

CLEAR ls_pds_component .

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

  • Map all other tables as per the header table so that entries in both are consisitent

*{ If we eliminate entries from PDS_HEAD in step above, then the corresponding entries

  • tables PDS_ACTIVITY, PDS_MODE, PDS_CAPACITY_REQUIREMENT, PDS_COMPONENT should be removed

  • based on PDS_HEAD-PDS_NAME as common key } This is done as below ......

LOOP AT lt_pds_activity INTO ls_pds_activity.

READ TABLE lt_pds_head INTO ls_pds_head

WITH KEY pds_name = ls_pds_activity-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

APPEND ls_pds_activity TO lt_pds_activity_final.

CLEAR ls_pds_activity.

ENDIF.

ENDLOOP.

LOOP AT lt_pds_capacity_requirement INTO ls_pds_capacity_requirement.

READ TABLE lt_pds_head INTO ls_pds_head

WITH KEY pds_name = ls_pds_capacity_requirement-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

APPEND ls_pds_capacity_requirement TO lt_pds_capacity_requirement_f.

CLEAR ls_pds_capacity_requirement.

ENDIF.

ENDLOOP.

LOOP AT lt_pds_mode INTO ls_pds_mode.

READ TABLE lt_pds_head INTO ls_pds_head

WITH KEY pds_name = ls_pds_mode-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

APPEND ls_pds_mode TO lt_pds_mode_final.

CLEAR ls_pds_mode.

ENDIF.

ENDLOOP.

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

*Second step : Finding the input component of Type I

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

*Filling up the penalty table with correct values

LOOP AT lt_pds_component INTO ls_pds_component.

*From the earlier BAPI results, PDS_COMPONENT table, select only records

*where PDS_COMPONENT-ACTIVITY = the activity number from ACTIVITY table

READ TABLE lt_pds_activity INTO ls_pds_activity

WITH KEY pds_name = ls_pds_component-pds_name

activity = ls_pds_component-activity

BINARY SEARCH.

IF sy-subrc IS INITIAL.

*Get the COMPONENT_INDICATOR = "I" (for Input components)

*Obtain the variable material consumption

IF ls_pds_component-component_indicator EQ 'I'.

MOVE ls_pds_component-cons_var TO lv_qty.

ENDIF.

*To find if Product is of type FERT , use the PRODUCT field to look up in /SAPAPO/MATKEY

*Get the MATID and proceed further to get ND Penalty cost from SNP04

*

clear lv_matnr .

*To get the MATNR in the required format using the CONVERSION routine

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

input = ls_pds_component-product

IMPORTING

OUTPUT = lv_matnr

.

SELECT SINGLE matid INTO lv_matid

FROM /sapapo/matkey

WHERE matnr EQ lv_matnr

AND att01 EQ 'FERT'.

IF sy-subrc IS INITIAL.

SELECT SINGLE ndpen INTO lv_ndpen_ordc

FROM /sapapo/snp04

WHERE matid EQ lv_matid

AND locid EQ space

AND simid EQ space

AND demcl EQ '1'. "Customer Demand

IF NOT sy-subrc IS INITIAL.

CLEAR lv_ndpen_ordc.

ENDIF.

SELECT SINGLE ndpen INTO lv_ndpen_fcc

FROM /sapapo/snp04

WHERE matid EQ lv_matid

AND locid EQ space

AND simid EQ space

AND demcl EQ '6'. "Demand Forecast

IF NOT sy-subrc IS INITIAL.

CLEAR lv_ndpen_fcc.

ENDIF.

READ TABLE lt_pds_component_final INTO ls_pds_component

WITH KEY pds_name = ls_pds_activity-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

MOVE ls_pds_component_final-cons_var TO lv_per.

ENDIF .

CLEAR: ls_penalty1.

ls_penalty1-method = 'M'.

ls_penalty1-ext_matnr = ls_pds_component-product.

ls_penalty1-demcl = 1.

*To avoid the division by zero error use Initial check

if not lv_per is initial.

ls_penalty1-ndpen = lv_ndpen_ordc * lv_qty / lv_per.

endif.

APPEND ls_penalty1 TO it_penalty1.

ls_penalty1-demcl = 6.

*To avoid the division by zero error use Initial check

if not lv_per is initial.

ls_penalty1-ndpen = lv_ndpen_fcc * lv_qty / lv_per.

endif.

APPEND ls_penalty1 TO it_penalty1.

ENDIF. "MATKEY select

ENDIF. "READ lt_pds_activity

ENDLOOP.

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

  • Get Production rate for preferred source of supply

  • Get details for only particular product that matches

LOOP AT lt_pds_head INTO ls_pds_head

WHERE product = ls_matkey-ext_matnr.

READ TABLE lt_pds_activity INTO ls_pds_activity

WITH KEY pds_name = ls_pds_head-pds_name

BINARY SEARCH.

IF sy-subrc IS INITIAL.

READ TABLE lt_pds_mode INTO ls_pds_mode

WITH KEY pds_name = ls_pds_activity-pds_name

activity = ls_pds_activity-activity

BINARY SEARCH.

IF sy-subrc IS INITIAL.

READ TABLE lt_pds_capacity_requirement INTO ls_pds_capacity_requirement

WITH KEY pds_name = ls_pds_head-pds_name

activity = ls_pds_mode-activity

BINARY SEARCH.

IF sy-subrc IS INITIAL.

MOVE ls_pds_capacity_requirement-bucket_var_cons TO lv_rate.

  • get base rate for this production line

SELECT SINGLE resuid

INTO lv_resid

FROM /sapapo/reskey

WHERE name EQ ls_pds_capacity_requirement-resource

AND logqs EQ 'ZBRITVIC'

AND logsys EQ 'R3_100'.

IF sy-subrc IS INITIAL.

SELECT SINGLE c~baserate

FROM /sapapo/res_head AS a

JOIN /sapapo/loc AS b ON alocid = blocid

JOIN zlinerate AS c ON blocno = clocno

AND aname = cline

INTO lv_baserate

WHERE a~resuid = lv_resid.

IF NOT sy-subrc IS INITIAL.

CLEAR lv_baserate.

ENDIF.

ENDIF.

ENDIF. " lt_PDS_CAPACITY_REQUIREMENT

ENDIF. " lt_pds_mode

READ TABLE lt_pds_component INTO ls_pds_component

WITH KEY pds_name = ls_pds_activity-pds_name

activity = ls_pds_activity-activity

BINARY SEARCH.

IF sy-subrc IS INITIAL.

MOVE ls_pds_component-cons_var TO lv_per.

ENDIF.

*To avoid the division by zero error use Initial check

if not lv_rate is initial.

lv_rate = 3600 * lv_per / lv_rate.

endif.

SELECT SINGLE bndpen_ord bndpen_fc

FROM /sapapo/matmap AS a

JOIN zndpenalty AS b ON amatnr = bmatnr

INTO (lv_ndpen_ord, lv_ndpen_fc)

WHERE a~ext_matnr = ls_matkey-ext_matnr.

IF NOT sy-subrc IS INITIAL.

CLEAR :lv_ndpen_ord , lv_ndpen_fc.

ENDIF.

  • insert entry for non-delivery costs for this material

CLEAR: it_penalty1.

ls_penalty1-method = 'M'.

ls_penalty1-ext_matnr = ls_matkey-ext_matnr.

ls_penalty1-demcl = 1.

*To avoid the division by zero error use Initial check

if not lv_rate is initial.

ls_penalty1-ndpen = lv_ndpen_ord * lv_baserate / lv_rate.

endif.

APPEND ls_penalty1 TO it_penalty1.

ls_penalty1-demcl = 6.

*To avoid the division by zero error use Initial check

if not lv_rate is initial.

ls_penalty1-ndpen = lv_ndpen_fc * lv_baserate / lv_rate..

endif.

APPEND ls_penalty1 TO it_penalty1.

ENDIF. " lt_pds_acitivity

ENDLOOP.

ENDIF. "BAPI

ENDIF. "Unit for MEINS = 'UN'.

ENDLOOP.

ENDMETHOD.