BADI Implementation
BADI Implementation
SAP Product Name: Applicable Product Versions: Document Version Last Updated: SAP Business Planning and Consolidation 7.0, version for SAP NetWeaver 7.0 SP1 & above 1.1 Jan, 2009
Copyright 2009 SAP AG. All rights reserved. No part of this publication may be reproduced or transmitted in any form or for any purpose without the express permission of SAP AG. The information contained herein may be changed without prior notice. Some software products marketed by SAP AG and its distributors contain proprietary software components of other software vendors. Microsoft, Windows, Outlook, and PowerPoint are registered trademarks of Microsoft Corporation. IBM, DB2, DB2 Universal Database, OS/2, Parallel Sysplex, MVS/ESA, AIX, S/390, AS/400, OS/390, OS/400, iSeries, pSeries, xSeries, zSeries, z/OS, AFP, Intelligent Miner, WebSphere, Netfinity, Tivoli, and Informix are trademarks or registered trademarks of IBM Corporation in the United States and/or other countries. Oracle is a registered trademark of Oracle Corporation. UNIX, X/Open, OSF/1, and Motif are registered trademarks of the Open Group. Citrix, ICA, Program Neighborhood, MetaFrame, WinFrame, VideoFrame, and MultiWin are trademarks or registered trademarks of Citrix Systems, Inc. HTML, XML, XHTML and W3C are trademarks or registered trademarks of W3C, World Wide Web Consortium, Massachusetts Institute of Technology. Java is a registered trademark of Sun Microsystems, Inc. JavaScript is a registered trademark of Sun Microsystems, Inc., used under license for technology invented and implemented by Netscape. MaxDB is a trademark of MySQL AB, Sweden. SAP, R/3, mySAP, mySAP.com, xApps, xApp, and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of SAP AG in Germany and in several other countries all over the world. All other product and service names mentioned are the trademarks of their respective companies. Data
contained in this document serves informational purposes only. National product specifications may vary. These materials are subject to change without notice. These materials are provided by SAP AG and its affiliated companies ("SAP Group") for informational purposes only, without representation or warranty of any kind, and SAP Group shall not be liable for errors or omissions with respect to the materials. The only warranties for SAP Group products and services are those that are set forth in the express warranty statements accompanying such products and services, if any. Nothing herein should be construed as constituting an additional warranty. These materials are provided as is without a warranty of any kind, either express or implied, including but not limited to, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. SAP shall not be liable for damages of any kind including without limitation direct, special, indirect, or consequential damages that may result from the use of these materials. SAP does not warrant the accuracy or completeness of the information, text, graphics, links or other items contained within these materials. SAP has no control over the information that you may access through the use of hot links contained in these materials and does not endorse your use of third party web pages nor provide any warranty whatsoever relating to third party web pages. SAP How-to Guides are intended to simplify the product implementation. While specific product features and procedures typically are explained in a practical business context, it is not implied that those features and procedures are the only approach in solving a specific business problem using SAP products. Should you wish to receive additional information, clarification or support, please refer to SAP Consulting. Any software coding and/or code lines / strings (Code) included in this documentation are only examples and are not intended to be used in a productive system environment. The Code is only intended better explain and visualize the syntax and phrasing rules of certain coding. SAP does not warrant the correctness and completeness of the Code given herein, and SAP shall not be liable for errors or damages caused by the usage of the Code, except if such damages were caused by SAP intentionally or grossly negligent.
1 Scenario
At customers, there often needs the ability to have custom exits to perform a certain piece of business logic or to optimize performance by working with some of the lower level operations of the system. This guide is an introduction to the exit framework with allows customers to utilize ABAP custom logic within their BPC Script Logic. In addition, it describes how these exits can be made generic and be parameter driven. Meaning that parameters can be passed from BPC Script Logic into these ABAP programs. In this scenario, we will pass parameters to ABAP custom logic using START_BADI statements within Script Logic. As an example, we will be implementing Declining Depreciation function (Similar to DECD keyword from FOX) using BADI implementation.
2 Introduction
There will be multiple scenarios where we want to pass parameters from script logic to ABAP BADI implementation. For example, an BPC User wants to calculate rates from the Finance cube and post the results to rate cube. During this calculation, the administrator may want to pass the target AppSet and Application (cube) when calling the BADI. As of Business Planning and Consolidation 7.0 Version for NetWeaver Support Package 1 (Released on Dec 12 2008), we are introducing new keywords called *START_BADI and *END_BADI.
where filter_value_of_your_BADI_implementation is the name of the filter you provided during the BADI implementation of UJ_CUSTOM_LOGIC BADI. There are two optional parameters you can use within a *START_BADI / *END_BADI instruction.
*START_BADI <filter_value_of_your_BADI_implementation> QUERY=ON/OFF //optional; default is OFF WRITE=ON/OFF //optional; default is OFF *END_BADI
Query performs a default query and Write automatically writes back the data. Set QUERY parameter to OFF if you want to perform your own read inside the BADI implementation; set WRITE to OFF to not write back query results automatically. You may code to write to another application from the BADI. This how to guide walks through a step-by-step example in the ApShell Planning cube. Please note you must have appropriate NetWeaver BI and BPC authorizations to perform the required steps.
2. Go to transaction SE19.
4. In the next screen, Provide name and description for Enhancement Implementation. You dont have to provide the Composite Enhancement Implementation, if you are not doing one. In this case, we are calling the enhancement implementation ZBPC_DECD, with short text BPC: Declining-Balance Depreciation.
5. Click the Green Check. NOTE: You will need a developer key to be able to create this implementation.
6. Provide your package name and click on Save button in the bottom.
7. In the next screen, provide name for BADI Implementation and Implementation Class. Choose BADI Definition as BADI_UJ_CUSTOM_LOGIC from the drop down. In this case, were specifying
BADI Implementation: ZBPC_DECD Implem entation Class: ZCL_BPC_DECD BADI Definition: BADI_UJ_CUSTOM_LOGIC
9. Provide package information for the implementation class and then, click on Save.
10. Inside the Enhancement Implementation screen, expand the BADI Implementation.
14. Fill in the Value 1. This is the name users will be using to the BADI from the script. Use a name which will make sense to business users. Then, click OK. In this example, we will specify DECD.
17. System will ask for confirmation to create the implementation. Click on yes.
18. System will then prompt for saving Enhancement Implementation so far. Click on Yes.
19. System will take to EXECUTE method implementation. Click on the pencil button to go into change mode. Copy and the sample code provided in the Appendix or code your own.
21. System will prompt for all the objects which you created. Choose the objects related to this whole implementation (Shown in the screen for this example) and click OK in the bottom. With successful Activation, we are ready with BADI implementation.
4.2 Create a new process chain template In this step, we will create a new process chain template to execute a script logic file. In this guide, we go through the process of creating it manually, but if you want, you can begin by copying a delivered process chain. If you copy a delivered process chain, then you must be careful of all changes you make to shared process variants, as those changes will affect all process chains that are using those process variants.
1. Go to transaction RSPC within the ABAP System.
2. Click New.
3. Provide a meaningful name and description. In NW world, customers usually start new process chain with ZBPC*. But, follow your company naming convention. In this example, well specify the process chain as ZBPC_EXECUTE_LGF and the long description as ZBPC: Execute lgf.
4. System will prompt start variant. Create new start variant by clicking on new button.
5. Enter the process variant and long description and click the green check. In this example, the process variant will be ZBPC_EXECUTE_LGF_START and the long description ZBPC: Execute lgf start.
6. In the next screen, click on Change Selections button under Scheduling Options.
9. Click OK.
10. Click save. In the whole process chain creation, remember to save your work for every step. Then, change the right hand side view to process type by clicking on the chain button.
11. Then, expand BPC Process Types. Drag BPC: Modify Dynamically and drop in the right hand side area.
12. System will prompt to choose a variant. Create a new variant by clicking on the new button.
13. Provide Tech name and description and click OK. In this example, specify process variant ZBPC_DYN_MODIFY and long description ZBPC: Modify.
15. Click OK
16. System would have added the new variant in the right hand side.
17. Now, choose the first variant by clicking on it and then, drag & drop to the second variant to link them.
19. Now, drag and drop the BPC: Run Logic process.
21. Provide Tech name and description for Run Logic step. In this example, specify the process variant as ZBPC_ RUN_LOGIC and the long description as ZBPC: Run Logic
22. In the next screen, enter below fields: TAB SUSER SELECTION SAPPSET SAPP REPLACEPARAM LOGICFILENAME EQU (TAB, REPLACEPARAM and EQU are the new fields to support dynamic replacements of prompts) 23. Click Ok. Then, connect this process variant with previous step (i.e. Dynamic Modify).
25. Expand General Services in the right hand side and choose OR process.
27. Then, connect this OR process with the Dynamic Modify step.
29. Connect the same OR step with Run Logic step. When the popup box comes up, choose always as the Action.
30. Choose this process from left hand side and drop.
32. Provide tech name and description. In this example, proves variant ZBPC_CLEAR_TEMP_TAB and long description ZBPC: Clear Temp Tables.
33. In the next screen, add CLOSE_MODE as a field and give 0 as value. Press save and go back.
35. Save and activate the process chain by clicking on the candle button.
36. Now, we will be re-assigning this process chain to the right component so that it will be visible in BPC data manager. Click on Display Components
4.3 Develop the required script In this step, we will develop the script calling the BADI which we created in the previous section.
1. Login to the BPC Administration.
2. Navigate to the AppSet/Application where you want to create the script Logic. Then, click on Create New Logic from right hand side Action Pane. In this example, were going to use a copy of the ApShell AppSet and use the Planning application.
4. Write your script logic here. In this example, copy and paste the script logic which is included in the appendix of this guide. Then, click on Save Logic
4.4 Develop the data manager package to execute the script In this step, we will create a data manager package to execute the script logic using the process chain we created in the previous step.
1. Log in to Excel Client.
5. Choose the desired team and click on Create package to add a new package.
6. Click on open folder button to select a process chain for this package
7. Choose the process chain which you created in the earlier section.
8. Enter Package name and Description (Avoid using special characters for naming the package.) and choose a group as well. Make sure to select the desired task type as well. Then, click Save.
9. On the next screen click save to store the package in the system.
10. You will get a message that package list successfully updated.
13. Click view package (button next to open folder on the same line as process chain).
15. Here, maintain the dynamic script (sample code is provided in the appendix). Then, click ok.
4.5 Load some sample data In this step, we will load some sample data to work with in order to show the value of this function.
1. Login to the BPC Office Client.
4. Choose your source file. In this case, this would be the P_ACCT.CSV file attached to this how-to guide.
5. Choose the destination file. In this case, were loading the P_ACCT.CSV file to the Examples folder under Company.
6. Click OK.
9. Specify the destination file. In this example, were going to load the PLANNING.CSV file to the EXAMPLES folder in the Company team.
13. For import file, specify the P_ACCT.CSV file which we uploaded earlier.
14. For the transformation file, choose the IMPORT.XLS transformation file.
16. Click View Status to see that the data loaded successfully.
19. Under Import File, choose the PLANNING.CSV file that we uploaded earlier.
20. For the transformation file, choose the IMPORT.XLS transformation file.
21. Specify No for running default logic and No for checking work status and click Finish.
23. You should see that the two records were loaded successfully.
24. Make sure you refresh dimension members in the Etools menu.
4.6 Run the package and verify data We will now execute the package and validate the data.
2. Click Refresh.
3. Click OK.
4. Depending upon your current view selection, data will get pulled.
5. Adjust dimension filters as necessary. Sample selection is shown here in the current view.
6. Check the data of the account before running the script logic on that account.
10. Choose the script file and enter the deprecation perecentage. In this example, the depreciation files is DECD.LGF and the depreciation percentage is 10.
11. Fill in the data selection as necessary and choose when you want to run the package. Then, click Next.
14. Now, click on the View Status check the log of the script.
15. Double click on your current run line to see the details of the log.
18. Sample function developed will post the depreciated value in next year for the same account. Within current view, adjust the time filter to choose the next year (2009.JAN).
5 Appendix
5.1 Sample Code of BADI EXECUTE method: This EXECUTE method expects number of Years and percentage of depreciation (as whole number). For all incoming accounts, depreciates the value by the given percentage for each year and posts the result value in the final year (only).
METHOD if_uj_custom_logic~execute. DATA: ls_param TYPE ujk_s_script_logic_hashentry, l_log TYPE string, l_ast_acct(16) TYPE c, l_year(3) TYPE n, l_percentage(3) TYPE p, lo_model TYPE REF TO if_uj_model, lo_dim TYPE REF TO if_uja_dim_data, ls_dim TYPE uja_s_dim, time_dim(16) TYPE c, lr_rec TYPE REF TO data, lr_result_rec TYPE REF TO data, l_intermediate_value TYPE uj_sdata, lt_final TYPE REF TO data. FIELD-SYMBOLS: <ls_rec> TYPE ANY, <ls_result_rec> TYPE ANY, <ls_time> TYPE ANY, <ls_signeddata> TYPE ANY, <lt_final> TYPE STANDARD TABLE. * Make sure all the parameters are passed. CLEAR ls_param. READ TABLE it_param WITH KEY hashkey = 'YEAR' INTO ls_param. IF sy-subrc NE 0. l_log = 'You have not specified the parameter ''YEAR'' which is required.'. cl_ujk_logger=>log( i_object = l_log ). RAISE EXCEPTION TYPE cx_uj_custom_logic. EXIT. ENDIF. l_year = ls_param-hashvalue. CLEAR ls_param. READ TABLE it_param WITH KEY hashkey = 'PERCENTAGE' INTO ls_param. IF sy-subrc NE 0. l_log = 'You have not specified the parameter ''PERCENTAGE'' which is required.'. cl_ujk_logger=>log( i_object = l_log ). RAISE EXCEPTION TYPE cx_uj_custom_logic. EXIT. ENDIF. l_percentage = ls_param-hashvalue. *Get name of the account dim cl_uj_model=>get_model( EXPORTING i_appset_id = i_appset_id RECEIVING ro_model = lo_model ). CALL METHOD lo_model->get_dim_data_by_type EXPORTING i_dim_type = uj00_cs_dim_type-time i_appl_id = i_appl_id RECEIVING ro_dim_data = lo_dim.
TRY. CALL METHOD lo_dim->get_info IMPORTING es_dim_info = ls_dim. ENDTRY. time_dim = ls_dim-dimension. TRANSLATE time_dim TO UPPER CASE. CREATE ASSIGN CREATE ASSIGN CREATE ASSIGN DATA lt_final LIKE ct_data. lt_final->* TO <lt_final>. DATA lr_result_rec LIKE LINE OF ct_data. lr_result_rec->* TO <ls_result_rec>. DATA lr_rec LIKE LINE OF ct_data. lr_rec->* TO <ls_rec>.
* Loop thro incoming data and create result set LOOP AT ct_data ASSIGNING <ls_rec>. <ls_result_rec> = <ls_rec>. ASSIGN COMPONENT time_dim OF STRUCTURE <ls_result_rec> TO <ls_time>. <ls_time>+0(4) = <ls_time>+0(4) + l_year. ASSIGN COMPONENT 'SIGNEDDATA' OF STRUCTURE <ls_result_rec> TO <ls_signeddata>. DO l_year TIMES. l_intermediate_value = l_intermediate_value + ( <ls_signeddata> l_intermediate_value ) * l_percentage / 100. ENDDO. <ls_signeddata> = <ls_signeddata> - l_intermediate_value. APPEND <ls_result_rec> TO <lt_final>. ENDLOOP. * Send the result data back. BPC always over-writes existing value. So, send * the latest values. ct_data = <lt_final>. ENDMETHOD.