BPC10 BADIs

download BPC10 BADIs

of 38

Transcript of BPC10 BADIs

  • 8/12/2019 BPC10 BADIs

    1/38

    SAPHow-to Guide

    Database & Technology

    SAP Business Planning and Consolidation

    How ToMigrate BPC 7.x BADIs to BPC 10

    Applicable Releases:

    SAP Business Planning and Consolidation 10.0, version for SAP

    NetWeaver, SP06 and higher.

    SAP Business Planning and Consolidation 7.5, version for SAP NetWeaver,

    SP04 and higher.

    Version 1.0

    April 2013

  • 8/12/2019 BPC10 BADIs

    2/38

    Copyright 2013 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, Excel, Outlook, and PowerPoint are registered

    trademarks of Microsoft Corporation.

    IBM, DB2, DB2 Universal Database, System i, System i5, System p,

    System p5, System x, System z, System z10, System z9, z10, z9, iSeries,

    pSeries, xSeries, zSeries, eServer, z/VM, z/OS, i5/OS, S/390, OS/390,

    OS/400, AS/400, S/390 Parallel Enterprise Server, PowerVM, Power

    Architecture, POWER6+, POWER6, POWER5+, POWER5, POWER,

    OpenPower, PowerPC, BatchPipes, BladeCenter, System Storage, GPFS,

    HACMP, RETAIN, DB2 Connect, RACF, Redbooks, OS/2, Parallel Sysplex,

    MVS/ESA, AIX, Intelligent Miner, WebSphere, Netfinity, Tivoli and

    Informix are trademarks or registered trademarks of IBM Corporation.

    Linux is the registered trademark of Linus Torvalds in the U.S. and other

    countries.

    Adobe, the Adobe logo, Acrobat, PostScript, and Reader are either

    trademarks or registered trademarks of Adobe Systems Incorporated 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.

    SAP, R/3, SAP NetWeaver, Duet, PartnerEdge, ByDesign, SAP

    BusinessObjects Explorer, StreamWork, 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 other

    countries.

    Business Objects and the Business Objects logo, BusinessObjects,

    Crystal Reports, Crystal Decisions, Web Intelligence, Xcelsius, and other

    Business Objects products and services mentioned herein as well as their

    respective logos are trademarks or registered trademarks of Business

    Objects Software Ltd. Business Objects is an SAP company.

    Sybase and Adaptive Server, iAnywhere, Sybase 365, SQL Anywhere,

    and other Sybase products and services mentioned herein as well as their

    respective logos are trademarks or registered trademarks of Sybase, Inc.

    Sybase is an SAP company.

    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.

    The information in this document is proprietary to SAP. No part of this

    document may be reproduced, copied, or transmitted in any form or forany purpose without the express prior written permission of SAP AG.

    This document is a preliminary version and not subject to your license

    agreement or any other agreement with SAP. This document contains

    only intended strategies, developments, and functionalities of the SAP

    product and is not intended to be binding upon SAP to any particular

    course of business, product strategy, and/or development. Please note

    that this document is subject to change and may be changed by SAP at

    any time without notice.

    SAP assumes no responsibility for errors or omissions in this document.

    SAP does not warrant the accuracy or completeness of the information,

    text, graphics, links, or other items contained within this material. Thisdocument is provided 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 have no liability for damages of any kind including without

    limitation direct, special, indirect, or consequential damages that may

    result from the use of these materials. This limitation shall not apply in

    cases of intent or gross negligence.

    The statutory liability for personal injury and defective products is not

    affected. 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 implement-

    tation. 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 NetWeaver. 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 dama ges were caused by SAP intentionally or

    grossly negligent.

    Disclaimer

    Some components of this product are based on Java. Any code change

    in these components may cause unpredictable and severe malfunctions

    and is therefore expressively prohibited, as is any decompilation of these

    components.

    Any Java Source Code delivered with this product i s only to be used by

    SAPs Support Services and may not be modified or altered in any way.

  • 8/12/2019 BPC10 BADIs

    3/38

    Document History

    Document Version Description

    1.00 First official release of this guide

  • 8/12/2019 BPC10 BADIs

    4/38

    Typographic Conventions

    Type Style Description

    Example Text Words or characters quoted

    from the screen. Theseinclude field names, screen

    titles, pushbuttons labels,

    menu names, menu paths,

    and menu options.

    Cross-references to other

    documentation

    Example text Emphasized words or

    phrases in body text, graphic

    titles, and table titles

    Example text File and directory names andtheir paths, messages,

    names of variables and

    parameters, source text, and

    names of installation,

    upgrade and database tools.

    Example text User entry texts. These are

    words or characters that you

    enter in the system exactly

    as they appear in the

    documentation.

    Variable user entry. Angle

    brackets indicate that you

    replace these words and

    characters with appropriate

    entries to make entries in the

    system.

    EXAMPLE TEXT Keys on the keyboard, for

    example, F2or ENTER.

    Icons

    Icon Description

    Caution

    Note or Important

    Example

    Recommendation or Tip

  • 8/12/2019 BPC10 BADIs

    5/38

    Table of Contents

    1. Business Scenario .................................................................................................................12. Background Information .......................................................................................................1

    2.1 More Information on the BAdI Framework ..................................................................... 13. Prerequisites ......................................................................................................................... 24. Step-by-Step Procedure ...................................................................................................... 3

    4.1 Available BAdIs in BPC 10.0 ............................................................................................ 34.2 API changes between BPC 7.x and BPC 10.0 ................................................................ 4

    4.2.1 A note on the BPC RESTful framework ............................................................ 44.2.2 Master Data Reading and Writing ..................................................................... 44.2.3 Transaction Data Reading and Writing ............................................................. 7

    4.3 Best Practice Recommendations for writing BAdIs ..................................................... 94.3.1 Use CL_UJK_LOGGER to write the log. ............................................................ 94.3.2 Fast Looping vs Slow Looping ........................................................................... 94.3.3 Fast Table Access vs Slow Table Access ....................................................... 104.3.4 Avoid MOVE-CORRESPONDING ...................................................................... 114.3.5 Use UJKT to analyze performance and identify bottlenecks ........................ 114.3.6 Use standard NetWeaver tracing techniques .................................................124.3.7 Other useful tips .................................................................................................13

    5. Appendix ............................................................................................................................. 14A. Interface Mapping Table ................................................................................................ 14B. Example: Basic Reading and Writing ............................................................................ 19C. Example: Get Application MetaData ............................................................................ 23D. Example: Process Dimensions and Save Members ................................................... 25E. Example: Read Transaction Data via RSDRI ............................................................... 28F. Example: Write Transaction Data via RSDRI ............................................................... 30

  • 8/12/2019 BPC10 BADIs

    6/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 1

    1. Business ScenarioIn this guide, we will demonstrate how to migrate your BPC 7.x BAdIs to BPC 10 or BPC on HANA.Additionally, we will give a few examples of some best practices and recommendations when

    writing your BAdIs.

    2. Background InformationBPC has introduced a series of BAdis that allow for enhancing the functionality of BPC. However

    due to the open flexibility of coding in ABAP, there is no limitation or strict guidance for consultants

    or developers to follow. Consequently, customers may find that the overall performance of Script

    Logic and BPC in general can be impacted if improper coding techniques or mistakes are made.

    Based on multiple project experiences, an average of 20% performance improvement can beexpected just by simply refining poorly performing ABAP code. In addition to providing information

    on how to migrate your BAdIs to the latest BPC version, this guide also attempts to address some

    of the most common mistakes and techniques used in BAdI coding, and provides several examples

    of how you can make the most out of your custom code. Please note that system tuning is not in

    the scope of this document.

    2.1 More Information on the BAdI FrameworkSAP Business Add-Ins (BAdIs) are arguably one of the most important technologies used to adapt

    SAP software to specific requirements. As of Release 7.0 of the SAP NetWeaver Application Server

    ABAP, BAdIs are part of the Enhancement Framework, where they represent explicit enhancement

    options. BAdIs are the basis for Object Plug-Insthat can enhance the functions in ABAP programs

    without having to make core software modifications. As such, BAdI calls can be integrated into

    customer applications (like BusinessObjects Planning and Consolidation, version for SAP

    NetWeaver for example) to allow enhanced customization of standard application functionality.

    This guide describes guidelines for migrating a BPC 7.x BAdI to BPC 10.0. The Step-By-Step

    section will outline the key focus points for a successful migration, as well as introduce a few Best

    Practice and Recommendations for writing BAdI code itself. The Appendix section contains a

    mapping table of BPC 7.x APIs to BPC 10.0 as well as some example code. This code is only meant

    as an example and it may not match the exact needs of your own particular Business Scenario it

    is only intended to guide you in the creation/modification of your own BAdI Implementation.

    For more detailed documentation of the BAdI Framework, please refer to the SAP Help Site for

    BAdIs (see Section 3 Additional Documentation).

  • 8/12/2019 BPC10 BADIs

    7/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 2

    3. PrerequisitesRequired/recommended expertise or prior knowledge

    SAP BusinessObjects Planning and Consolidation 10, version for SAP NetWeaver BPC NetWeaver Script Logic BPC NetWeaver BAdI Framework

    ABAP programming skills Access to SAP NetWeaver transaction codes: SE20, SE19, SE37, SE80, SE24

    Relevant SAP Notes:

    Note 1634922BPC 10.0 NW Collective Note for Performance Improvement Note 1657612Enable shared memory Note 1657623SAP Buffer Tuning for BPC 10NW Note 1689814Stabilize InfoCube's technical name in the modeling process Note 1461749E2E Root Cause Analysis for SBOP PC (BPC) Note 1734706BPC 10.0 NW on HANA (HANABPC) Collective Note Note 1676242Installing HANABPC 800 on SAP NW 730

    Additional Documentation:

    Other EPM How-To Guides http://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+

    %28EPM%29+How-to+Guides

    SAP Help Library Business Add Ins (BAdI) http://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1

    550b0/frameset.htm

    SAP Help Library BPC NetWeaver Script Logic http://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d

    586735ac/frameset.htm

    BPC 10 and BPC 10 on HANA Performance Guide https://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspa

    ce/SpacesStore/9d07efb6-da71-4206-b402-

    e4828708adf1/BPC%20Performance%20on%20customer%20data.pdf

    Parallelizing BPC 10.0 Script Logic using RUNLOGIC_PH https://scn.sap.com/docs/DOC-35152

    RESTful web API wiki page https://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_APIs

    https://service.sap.com/sap/support/notes/1634922https://service.sap.com/sap/support/notes/1634922https://service.sap.com/sap/support/notes/1657612https://service.sap.com/sap/support/notes/1657612https://service.sap.com/sap/support/notes/1657623https://service.sap.com/sap/support/notes/1657623https://service.sap.com/sap/support/notes/1689814https://service.sap.com/sap/support/notes/1689814https://service.sap.com/sap/support/notes/1461749https://service.sap.com/sap/support/notes/1461749https://service.sap.com/sap/support/notes/1734706https://service.sap.com/sap/support/notes/1734706https://service.sap.com/sap/support/notes/1676242https://service.sap.com/sap/support/notes/1676242http://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://scn.sap.com/docs/DOC-35152https://scn.sap.com/docs/DOC-35152https://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_APIshttps://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_APIshttps://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_APIshttps://scn.sap.com/docs/DOC-35152https://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttps://documents.wdf.sap.corp/share/proxy/alfresco/api/node/content/workspace/SpacesStore/9d07efb6-da71-4206-b402-e4828708adf1/BPC%20Performance%20on%20customer%20data.pdfhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_bpc10_nw/helpdata/en/a6/69182aed2c4df78e3f7b9d586735ac/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/8f/f2e540f8648431e10000000a1550b0/frameset.htmhttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttp://wiki.sdn.sap.com/wiki/display/BPX/Enterprise+Performance+Management+%28EPM%29+How-to+Guideshttps://service.sap.com/sap/support/notes/1676242https://service.sap.com/sap/support/notes/1734706https://service.sap.com/sap/support/notes/1461749https://service.sap.com/sap/support/notes/1689814https://service.sap.com/sap/support/notes/1657623https://service.sap.com/sap/support/notes/1657612https://service.sap.com/sap/support/notes/1634922
  • 8/12/2019 BPC10 BADIs

    8/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 3

    4. Step-by-Step Procedure4.1 Available BAdIs in BPC 10.0The following table is a list of the available BAdIs in BPC 10.0

    BPC Module BAdI Name Description

    BPF BADI_UJ_BPF_REVIEW_LOGIC BAdI for Review Logic of BPF Step

    Region.

    BPF BADI_UJ_BPF_REVIEW_VALIDATION BPC: BAdI for Checking if User is

    Allowed to Review BPF Step Region.

    BPF BADI_UJ_BPF_SUBMIT_LOGIC BPC: BAdI for submitting Logic of

    BPF Step Region to SUBMITTED

    status.

    Data Manager BADI_UJD_RETRACT BAdI for Data Manager Retract

    Data Manager BADI_UJD_ROUTINE BAdI for Data Manager Routine

    Journal BADI_UJJ_CALCULATED_AMOUNT BAdI for adding calculated amounts

    on journal save

    Modeling BADI_UJ_PARAM_CHANGE BPC: BAdI for Appset/Application

    Parameter Change

    Query BADI_UJ_SQE_POST_PROCESS BPC: BAdI for post-processing of

    query logic

    Script Logic BADI_UJ_CUSTOM_LOGIC BPC: BAdI for Script Logic

    Security UJE_DIM_PROCESSED_BADI BAdI for DAP update when

    dimension is processed

    Validation BADI_UJ_VALIDATION_RULE_LOGIC Validation logic before write back

    Work Status BADI_UJW_STATE_CHANGE BAdI for changing work status

    Work Status UJW_LOCKOUT_SCHEDULE_BADI BAdI for data locking

    Write Back BADI_UJR_WRITE_BACK BAdI for pre-processing of write

    back

  • 8/12/2019 BPC10 BADIs

    9/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 4

    4.2 API changes between BPC 7.x and BPC 10.0In BPC 10.0, the Script Logic BAdI *definition* is compatible with BPC 7.x, which means the BAdIdefinition itself doesnt need to be recreated. However, the source code located inside the actual

    BAdI might need to be adjusted due to changes in the BPC Application Programming Interface

    between 7.x and 10.0. For instance, if you wrote code in your BPC 7.x BAdI which used a

    deprecated BPC API, then this BAdI would not work correctly in BPC 10.0 and would need to be

    adjusted accordingly.

    4.2.1 A note on the BPC RESTful frameworkThe BPC 10.0 Front End (both the EPM Add-In and the Web Admin Client) communicate with the

    BPC 10.0 Back End (NetWeaver BW Server) by directly leveraging the NetWeaver Web Application

    Server (Internet Communication Framework) and RESTful services. It is important to note thatthe .NET layer was removed in BPC 10.0 by using these RESTful services. Due to this major

    architectural change, all UJ*_API* remote function modules (used in the old BPC 7.x .NET

    communication layer) were deprecated in BPC 10.0. In order to keep backwards compatibility, you

    might still see some of them in the system, but please be aware that these remote function

    modules arent being used anymore. You can find all the new RESTful services and interfaces used

    in BPC 10.0 within the UJX* ABAP Packages. Though it is not recommended to modify or use

    RESTful classes directly, they can be a very good entry point for debugging. For more information

    on how to debug using a REST entry point, see the following blog:

    http://scn.sap.com/people/daniel.settanni/blog/2011/07/13/debugging-bpc-10-for-netweaver

    Note that Data Manager is an exceptional case. By default, data manager packages run inasynchronous (or background) mode. Since we cannot debug a background process directly, we

    must change some variables in the debugger at runtime in order to force the data manager process

    to run in the foreground. (The blog describes how to do this in the section Debugging Data

    Manager Packages). For more background information about the REST framework and standard

    practices, please see the Prerequisites section for a useful wiki link.

    4.2.2 Master Data Reading and WritingUJA is the ABAP Package that contains all the modeling and metadata related interfaces. In BPC10.0 however, the UJA ABAP Package has been mostly redefined. Almost all of the previous BPC

    7.x UJA* interfaces have been deprecated.

    Note

    See Appendix A for a mapping table of BPC 7.x and BPC 10.0 interfaces.

    In BPC 10.0, the modeling functionality is driven by a class called CL_UJA_BPC_ADMIN_FACTORY.

    This class is the main entry point for all modeling related operations. Because it is a dynamic entry

    point meant to handle multiple modeling operations, it normally takes several method calls to finish

    one single operation.

    Here for simplicity, we suggest using an alternate interface from class CL_UJK_MODEL.

    CL_UJK_MODEL is a class delivered since BPC 7.X and the interface is relatively unchanged when

    comparing ADMIN APIs. The benefit of using the CL_UJK_MODEL class is that it provides you most

    of the basic operations with a single method call.

    http://scn.sap.com/people/daniel.settanni/blog/2011/07/13/debugging-bpc-10-for-netweaverhttp://scn.sap.com/people/daniel.settanni/blog/2011/07/13/debugging-bpc-10-for-netweaverhttp://scn.sap.com/people/daniel.settanni/blog/2011/07/13/debugging-bpc-10-for-netweaver
  • 8/12/2019 BPC10 BADIs

    10/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 5

    For example, if you need to read master data from a certain dimension, by using the factory class,

    you have to write the following code:

    call method cl_uja_bpc_admin_factory=>get_masterdata_query

    exporting

    i_appset_id = lo_context->d_appset_id

    i_application_id = lo_context->d_appl_id

    i_dimension_id = l_dim

    receiving

    ro_result = lo_md_query.

    call method lo_md_query->select_all_attr

    exporting

    if_inc_slt = abap_true

    if_inc_txt = abap_true.

    lo_md_query->set_sel_hier( lt_hier_list ).

    lo_md_query->set_sel( lt_sel ).

    lo_md_query->df_secure_reading = abap_true.

    call method cl_uja_bpc_admin_factory=>get_masterdata_reader

    exporting

    i_appset_id = lo_context->d_appset_id

    i_application_id = lo_context->d_appl_id

    i_dimension_id = l_dim

    receiving

    ro_return = lo_md_reader.

    call methodlo_md_reader->read

    exporting

    io_read_opt = lo_md_query

    importing

    er_data = lr_data.

    However, if you are using CL_UJK_MODEL, the code is as simple as the following:

    CALL METHOD cl_ujk_model=>get_member_list

    EXPORTING

    i_appset_id = l_appset

    i_appl_id = l_appl

    i_dim_name = l_dim

    if_sort = abap_false

    if_ret_hashtab = abap_false

    * if_only_base =

    it_sel = lt_sel

    * if_allow_empty = ABAP_FALSE

    IMPORTINGet_member = lt_member.

  • 8/12/2019 BPC10 BADIs

    11/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 6

    The following table shows some useful methods contained in the CL_UJK_MODEL class:

    Method Name Description

    CHECK_ATTR_EXIST Check if the dimension property exists or not

    CHECK_DIM_EXIST Check if the dimension exists in the model or not

    CHECK_DIM_SECURED Check if the dimension is a secured dimension

    CHECK_MEMBER_EXIST Check if the members exist in the given dimension

    CREATE_STRUCTURE Create a dynamic internal table with the given dimensions as

    columns

    GET_APPL_LIST Return the model list from a given environment.

    GET_APPL_PARAM Return the global/environmental/model parameter values from a

    given application name

    GET_CHILDREN Get the children members from a given parent member of a given

    dimension. You can expect 3 different return types by specifying

    ALL(children member from all levels), DEP(children members

    from one level lower than the parent), BAS(base members only)

    GET_DIM_BY_TYPE Return the dimension name of a given dimension type:

    ( A, C, E, T, I, G, S )

    GET_DIM_LIST Return the dimension list of a given model

    GET_MD_PRO Return property values by giving a dimension and property name

    GET_MEMBER_LIST Return dimension member list by given conditions

    GET_MEMBER_PRO_VALUE Return the value of a given dimension members property

    GET_SECURED_DIM Return secured dimensions from a model

    GET_STORAGE_TYPE Return the storage type of a model

    GET_STRUCTURE Return a dynamic table structure with all the dimensionsname as

    columns.

  • 8/12/2019 BPC10 BADIs

    12/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 7

    4.2.3 Transaction Data Reading and WritingIn BPC 7.x, the Query or Read logic is defined in the ABAP Package UJQ, while the Write logic is

    defined in the ABAP Package UJR. In BPC 10.0, although you can still find the UJQ and UJR

    Packages, the interfaces have been deprecated. Instead, they have all been redesigned into the

    UJO Package.

    Tip

    In Appendix B, you will find an example of ABAP code using the new UJO query andwrite interface.

    Another good alternative approach for reading and writing data is to use

    CL_UJK_QUERY=>QUERY() and CL_UJK_WRITE=>WRITE().

    CL_UJK_QUERY=>QUERY() will let the BPC Shared Query Engine automatically judge which type of

    query( HANA/MDX/RSDRI ) to use. The basic rule for which type to use is as follows:

    For BPC on HANA, if there is neither a member formula nor a parent node, the query will beexecuted via RSDRI; if there is no member formula but there is a parent node, the query willbe executed via HANA TREX; as of the publication of this guide, if there is a memberformula, the query will be executed via BW MDX.

    Note

    HANA MDX will be introduced into BPC (BPC on HANA platform only) as a new type ofquery in the near future. With HANA MDX support, some member formulas can bepushed to the HANA MDX engine itself (greatly improving member formulaperformance). This is a promising feature, and it might even become best practice in

    the future, but until it is available we dontrecommend heavy use of the BW MDXengine for performance reasons.

    For BPC 10.0 classic, if there is a member formula or a parent node, the query will beexecuted via BW MDX; otherwise it will be executed via RSDRI.

    CL_UJK_WRITE=>WRITE() will always use a delta setting and let the write back engine of BPC

    calculate the delta values. This means that whatever value you send will be the full value (you dont

    write deltas values using this method, only the final or full value).

    In BPC 7.x, a common way of invoking the query engine is as follows:

    CREATE OBJECT lo_sqe

    EXPORTING

    i_appset_id = i_appset_id

    i_appl_id = i_appl_id.

    CALL METHOD lo_sqe->if_ujq_sqe~run_axis_query

    EXPORTING

    it_axis = lt_axis

    IT_FORMULA = IT_FORMULA

    if_check_member_failed = abap_false

    IMPORTINGet_data = et_data.

  • 8/12/2019 BPC10 BADIs

    13/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 8

    While in BPC 10.0, the code to invoke the query engine looks as follows:

    CALL METHOD cl_ujo_query_factory=>get_query_adapter

    EXPORTING

    i_appset_id = i_appset_idi_appl_id = i_appl_id

    i_keydate = cl_ujk_model=>g_keydate

    RECEIVING

    adapter = lo_sqe.

    CALL METHOD lo_sqe->run_axis_query_symm

    EXPORTING

    it_axis = lt_axis

    * IT_SLICER =

    it_formula = lt_ujo_formulas

    * I_TABLETYPE =* I_KEYDATE =

    * I_DYN_HIER = ABAP_FALSE

    * I_DHCELL =

    * I_PASSBY_SECURITY = ABAP_FALSE

    IMPORTING

    et_data = et_data.

    Tip

    Though the method is called axis query, the internal engine is smart enough tochoose which type of query to use. For example, if the selection is all base members,

    the RSDRI query type will be used automatically.

  • 8/12/2019 BPC10 BADIs

    14/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 9

    4.3 Best Practice Recommendations for writing BAdIsThe following is a summary of some best practices and recommendations when writing effective

    BAdI code. After each Recommendationicon we will show some sample code to highlightthe suggestion. Please note that we are only providing a summary which has been gathered by

    various BPC implementation project experiences and this section is in no way intended to cover all

    Best Practices for writing BAdIs.

    4.3.1 For Script Logic BAdIs, use CL_UJK_LOGGER for logsAll logs that are attached by CL_UJK_LOGGER=>LOG will be printed out to the formula log. Putting

    the following line of code in your BAdI will submit a log l_log to the formula log:

    cl_ujk_logger=>log( i_object = l_log ).

    4.3.2 Fast Looping vs Slow LoopingIn the Script Logic BAdI signature of the EXECUTE method, there is an importing parameter called

    CT_DATA. This parameter is defined as a standard table and it is delivered with all dimensions

    (including the MEASURES) as columns in ascending alphabetical order. The last column in this

    table is SIGNEDDATA. Most of the time, the Script Logic BAdI will be executing operations on this

    table. Efficient and quick access to this table is very important. Here we show several examples of

    Fast Looping vs Slow Looping. Before the loop sample code, we define some variables as follows:

    data: lr_rec TYPE REF TO data.

    FIELD-SYMBOLS: TYPE any,

    TYPE any.

    Recommendation

    Try to use ASSIGN COMPONENT before the LOOP instead of ASSIGN COMPONENTinside the LOOP. Also, try to use LOOP INTO instead of LOOP ASSIGNING

    * case 1. use ASSIGN outside of the loop

    CREATE DATA lr_rec LIKE LINE OF ct_data.

    ASSIGN lr_rec->* to .

    ASSIGN COMPONENT 'ACCOUNT' of STRUCTURE to .

    LOOP AT ct_data INTO .

    if eq 'ACCPAY'.* your logic

    ELSE.

    * your logic

    ENDIF.

    ENDLOOP.

    Recommendation

    When using ASSIGN COMPONENT, try to use ASSIGN COMPONENT instead of ASSIGN COMPONENT

    * case 2. use ASSIGN LOOP AT ct_data ASSIGNING .

    * Because the order of columns for CT_DATA is always static and ascending* we know in advance which column is which dimension.

  • 8/12/2019 BPC10 BADIs

    15/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 10

    * In below case, ACCOUNT is the first dimensionASSIGN COMPONENT 1 of STRUCTURE to .if eq 'ACCPAY'.

    * your logic

    ELSE.* your logic

    ENDIF.ENDLOOP.

    Important Recommendation

    Try to use a dynamic where clause when looping at the table. If defined correctly thiscan drastically reduce the number of loop attempts. This new feature is delivered inNW 730

    * case 3. dynamic conditions

    DATA l_cond TYPE string VALUE 'ACCOUNT = ''ACCPAY'''.

    LOOP AT ct_data ASSIGNING WHERE (l_cond).

    * your logicENDLOOP.

    4.3.3 Fast Table Access vs Slow Table AccessRecommendation

    Try to use READ FROM WITH TABLE KEY instead of READ FROM TABLE WITH KEY.Using the table key will result in much faster reads. Using a different key than the tablekey is slower.

    * case 4. Read a static hashed tableDATA: lt_cv TYPE ujk_t_cv,

    ls_cv TYPE ujk_s_cv.

    READ TABLE lt_cv WITH TABLE KEYdim_upper_case = 'ACCOUNT' INTO ls_cv.

    Recommendation

    Try to READ from a Hashed table or Sorted table instead of a Standard table. Ingeneral reading hash tables using table keys is the fastest way; reading a sorted tableis not as fast as reading a hash table, but it is still faster than reading a standard table.We should always try to leverage this approach. Notice that looping on a hashed tableis no slower than looping on a standard table. But be advised that a hashed table

    consumes more memory. So try to be efficient in your use of hashed tables. Below isan example of copying CT_DATA to a hashed table and reading from it.

    * case 5. copy CT_DATA to a hashed table and read

    DATA:

    l_time_cond TYPE string,

    lr_key TYPE REF TO data,

    lr_hashtable TYPE REF TO data.

    FIELD-SYMBOLS:

    TYPE HASHED TABLE,

    TYPE any,

    TYPE any, TYPE any.

  • 8/12/2019 BPC10 BADIs

    16/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 11

    CALL METHOD cl_ujk_model=>get_structure

    EXPORTING

    * i_appset_id =

    * i_appl_id =i_type = 'H'

    * it_dim =

    if_with_measure = abap_true

    * if_tech_name =

    * if_with_signeddata = ABAP_TRUE

    RECEIVING

    rr_data = lr_hashtable.

    ASSIGN lr_hashtable->* TO .

    = ct_data. "copy CT_DATA to hash table

    * Create the record data reference and the template for TIME field

    CREATE DATA lr_rec LIKE LINE OF ct_data.

    ASSIGN lr_rec->* TO .

    ASSIGN COMPONENT 'TIME' OF STRUCTURE TO .

    * Create the key data reference for hashed table and the template for SIGNE

    DDATA field

    CREATE DATA lr_key LIKE LINE OF .

    ASSIGN lr_key->* TO .

    ASSIGN COMPONENT 'SIGNEDDATA' OF STRUCTURE TO .

    * Looping on 2013.JAN, and read from 2012.DEC

    l_time_cond = 'TIME = ''2013.JAN'''.LOOP AT ct_data INTO WHERE (l_time_cond).

    = '2012.DEC'.

    READ TABLE FROM INTO . "SIGNEDDATA is autom

    atically assigned

    WRITE / '2012.DEC data: '.

    4.3.4 Avoid MOVE-CORRESPONDINGMOVE-CORRESPONDING will compare each field between two structures which is relatively slow.

    So its better to use =directly if two structures already have the same columns in the same order.

    4.3.5 Use UJKT to analyze performance and identify bottlenecksTransaction UJKT is a very useful tool to debug the execution of Script Logic. Once you know theexact script that triggers the BAdI and the scoping, you can directly run it in UJKT.

  • 8/12/2019 BPC10 BADIs

    17/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 12

    4.3.6 Use standard NetWeaver tracing techniquesThere are many ways to trace activities within NetWeaver. If you find that you cannot identify the

    bottleneck using transaction UJKT and simple debugging, it is possible to set up a trace on the

    server. For more information about Standard NetWeaver Performance Traces you can refer to the

    following help site:

    http://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/conte

    nt.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htm

    You can also leverage transaction SE30 which is a very powerful tool to find bottlenecks from a NW

    system. Besides the ability to directly run programs and transactions, it also allows you trace any

    transaction on the server.

    In the following screenshot we highlight the option of setting up a trace Scheduleon the UJKTTransaction:

    With this option, you can effectively trace any BPC Users incoming session.

    http://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/content.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/content.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/content.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/content.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htmhttp://help.sap.com/saphelp_nw73/helpdata/en/47/cc212b3fa5296fe10000000a42189b/content.htm?frameset=/en/ba/104e0763ce4615a384c98f05c33385/frameset.htm
  • 8/12/2019 BPC10 BADIs

    18/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 13

    4.3.7 Other useful tipsThere are two default parameters in the Script Logic BAdI call. By default they are set to ON. If the

    QUERY/WRITE is not necessary, you can switch them off to improve performance.

    QUERY ON/OFF WRITE ON/OFF

    Sample:

    *START_BADI TEST

    QUERY=ON //the BAdi will trigger automatic query.

    WRITE=OFF //the BAdi will NOT write automatically.

    *END_BAIDLOOP AT ct_data INTO WHERE (l_time_cond).

    There is a Model level parameter called SCRIPT_LOGIC_DETAIL_LOG which is used to control

    whether detailed transaction data entries should be shown in the BPC Data Manager log. By default

    this parameter is set to ON. If you want to switch it off, you can maintain it in transaction SPRO bysetting it to OFF. This can be very helpful for example, if the BAdI is generating millions of

    transaction data records.

  • 8/12/2019 BPC10 BADIs

    19/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 14

    5. AppendixA.Interface Mapping Table

    Interface in BPC 7X Method in BPC 7X Interface in BPC10 Method in BPC10

    IF_UJ_MODEL

    CREATE_MD_DATA_R

    EF

    IF_UJA_MEMBER_MANAGE

    R CREATE_DATA_REF

    IF_UJ_MODEL GET_DIM_TECHNAME

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJ_MODEL GET_LOG_LEVEL

    IF_UJ_MODEL GET_AUDIT_SETTING IF_UJU_AUDIT GET_AUDACTSET

    IF_UJ_MODEL

    GET_DIM_DATA_BY_T

    YPE

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJ_MODEL GET_APPSET_DATA IF_UJA_APPSET_MANAGER GET

    IF_UJ_MODEL GET_DIM_DATA

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJ_MODEL GET_APPL_DATA

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJ_MODEL GET_DIM_BY_TYPE IF_UJA_APPSET_MANAGER GET_DIMENSIONS

    IF_UJA_APPLICATION_

    DATA

    GET_APPLICATION_IN

    FO

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJA_APPSET_DATA GET_APPSET_INFO IF_UJA_APPSET_MANAGER GET

    IF_UJA_DIM_DATA GET_INFO

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_DIM_DATA GET_MD_READER CL_UJA_ADMIN_FACTORY

    GET_MASTERDATA_RE

    ADER

    IF_UJ_MODEL

    CREATE_TX_DATA_RE

    F

    IF_UJA_APPLICATION_MAN

    AGER CREATE_DATA_REF

    IF_UJA_APPLICATION_

    DATA GET_DIM_LIST

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJA_APPLICATION_

    DATA GET_PARAM_VALUE

    IF_UJA_APPLICATION_MAN

    AGER

    IF_UJA_APPSET_DATA GET_DIM_LIST IF_UJA_APPSET_MANAGER GET_DIMENSIONS

    IF_UJA_DIM_DATA WRITE_MBR_DATA

    IF_UJA_MEMBER_MANAGE

    R SAVE

    IF_UJA_DIM_DATA IS_LONG_ATTR

    IF_UJA_DIM_DATA READ_MD2XML Obsolete

    IF_UJA_DIM_DATA UPDATE_HIER IF_UJA_HIER_MANAGER

  • 8/12/2019 BPC10 BADIs

    20/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 15

    IF_UJA_DIM_DATA GET_DIM_VERSION

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_DIM_DATA VALIDATE_MEMBER

    IF_UJA_MEMBER_MANAGE

    R VALIDATE

    IF_UJA_DIM_DATA WRITE_MBR_TXT

    IF_UJA_MEMBER_MANAGE

    R SAVE then PROCESS

    IF_UJA_DIM_DATA

    READ_BASE_MBR_DA

    TA Obsolete

    IF_UJA_DIM_DATA VALIDATE_MBR_TXT

    IF_UJA_MEMBER_MANAGE

    R VALIDATE

    IF_UJA_DIM_DATA GET_MD_HANDLER

    IF_UJA_DIM_DATA GET_ODBO_DETAIL

    IF_UJA_DIM_DATA CREATE_HIER IF_UJA_HIER_MANAGER CREATE

    IF_UJA_DIM_DATA REMOVE_HIER IF_UJA_HIER_MANAGER DELETE

    IF_UJA_DIM_DATA WRITE_HIER_DATA IF_UJA_HIER_MANAGER WRITE_DATA

    IF_UJ_MODEL GET_DIMS_BY_TYPE IF_UJA_APPSET_MANAGER GET_DIMENSIONS

    IF_UJA_DIM_DATA CREATE_DATA_REF

    IF_UJA_MEMBER_MANAGE

    R CREATE_DATA_REF

    IF_UJA_DIM_DATA READ_MBR_DATA IF_UJA_MD_READER READ

    IF_UJA_DIM_DATA GET_HIER_OF_MBR IF_UJA_HIER_MANAGER GET_HIER_OF_MBR

    IF_UJA_DIM_DATA PROCESS_MEMBER

    IF_UJA_MEMBER_MANAGE

    R PROCESS

    IF_UJA_APPLICATION_

    DATA CREATE_DATA_REF

    IF_UJA_APPLICATION_MAN

    AGER CREATE_DATA_REF

    IF_UJA_APPSET_DATA GET_APPL_LIST IF_UJA_APPSET_MANAGER GET_APPLICATIONS

    IF_UJA_DIM_DATA GET_TECHNAME

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_DIM_DATA HAS_HIER

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_APPLICATION_

    DATA SET_PARAMS

    IF_UJA_DIM_DATA GET_MEMBER_LIST IF_UJA_MD_READER READ

    IF_UJA_DIM_DATA GET_CHILDREN_MBR IF_UJA_MD_READER READ

    IF_UJA_APPL_COMP CAN_MODIFY No Change, it is kept

    IF_UJA_APPL_COMP CAN_DELETE No Change, it is kept

    IF_UJA_APPL_COMP CREATE No Change, it is kept

    IF_UJA_APPL_COMP COPY No Change, it is kept

    IF_UJA_APPL_COMP MODIFY No Change, it is kept

  • 8/12/2019 BPC10 BADIs

    21/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 16

    IF_UJA_APPL_COMP DELETE No Change, it is kept

    IF_UJA_APPL_COMP GET_TYPE No Change, it is kept

    IF_UJA_DIM_DATA GET_HIER_REFCL_UJA_BPC_ADMIN_FACTORY

    GET_HIERARCHY_READER

    IF_UJA_DIM_DATA GET_ATTR_LIST

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_DIM_DATA QUERY_HIER_MBR IF_UJA_MD_READER QUERY_HIER_MBR

    IF_UJA_APPSET_DATA GET_PARAMS IF_UJA_APPSET_MANAGER GET_PARAMETERS

    IF_UJA_APPSET_DATA GET_REQUIRED_ATTR

    IF_UJA_APPSET_DATA GET_APPSET_DATA

    IF_UJA_APPSET_DATA SET_PARAMS

    IF_UJA_APPSET_DATA GET_TEMPLATE_VER IF_UJA_APPSET_MANAGER GET

    IF_UJA_DIM_DATA GET_DEFAULT_MBR IF_UJA_MD_READER GET_DEF_MBR

    IF_UJA_APPSET_DATA SET_PARAM_VALUE

    IF_UJA_APPSET_DATA INC_PENTRY_VER

    IF_UJA_BIZ_RULE GET_COPY_OPE No Change, it is kept

    IF_UJA_BIZ_RULE GET_FXTRANS No Change, it is kept

    IF_UJA_BIZ_RULE GET_VALIDATION No Change, it is kept

    IF_UJA_BIZ_RULE GET_ICBOOK No Change, it is kept

    IF_UJA_BIZ_RULE GET_CONSOLIDATION No Change, it is kept

    IF_UJA_BIZ_RULE GET_US_ELIM No Change, it is kept

    IF_UJA_BIZ_RULE GET_CALC_ACCOUNT No Change, it is kept

    IF_UJA_BIZ_RULE GET_APPSET_RULES No Change, it is kept

    IF_UJA_BIZ_RULE GET_APP_RULES No Change, it is kept

    IF_UJA_BIZ_RULE COPY_RULE No Change, it is kept

    IF_UJA_BIZ_RULE DELETE_RULE No Change, it is kept

    IF_UJA_BIZ_RULE GET_RULE_DATA No Change, it is kept

    IF_UJA_BIZ_RULE SET_RULE_DATA No Change, it is kept

    IF_UJA_BIZ_RULE

    GET_XML_RULE_DAT

    A No Change, it is kept

    IF_UJA_BIZ_RULE

    SET_XML_RULE_DAT

    A No Change, it is kept

    IF_UJA_BIZ_RULE

    CHECK_CORRELATIO

    N No Change, it is kept

    IF_UJA_BIZ_RULEDELETE_RULE_BY_NAME No Change, it is kept

  • 8/12/2019 BPC10 BADIs

    22/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 17

    IF_UJA_BIZ_RULE VALIDATE_RULE No Change, it is kept

    IF_UJA_BIZ_RULE

    VALIDATE_RULE_IN_T

    AB No Change, it is kept

    IF_UJA_BIZ_RULE

    VALIDATE_RULE_IN_X

    ML No Change, it is kept

    IF_UJA_BIZ_RULE

    GET_RULENAME_BY_

    TYPE No Change, it is kept

    IF_UJA_DATA_CHECK VERIFY No Change, it is kept

    IF_UJA_DIM_OBSERVE

    R CAN_MODIFY No Change, it is kept

    IF_UJA_DIM_OBSERVE

    R MODIFY No Change, it is kept

    IF_UJA_DIM_OBSERVE

    R CHECK_MD_CHANGE No Change, it is kept

    IF_UJA_DIM_OBSERVE

    R ON_MD_CHANGE No Change, it is kept

    IF_UJA_HIER FREE No Change, it is kept

    IF_UJA_HIER TRAVERSE_CHILDREN No Change, it is kept

    IF_UJA_HIER GET_CHILDREN No Change, it is kept

    IF_UJA_HIER LOAD No Change, it is kept

    IF_UJA_HIER GET_PARENTS No Change, it is kept

    IF_UJA_HIER GET_ALL_MEMBER No Change, it is kept

    IF_UJA_HIER CHECK_MEMBER No Change, it is kept

    IF_UJA_HIER CHANGE_KEY_DATE No Change, it is kept

    IF_UJA_HIER FREE_CUST_DATA No Change, it is kept

    IF_UJA_HIER QUERY_MEMBER No Change, it is kept

    IF_UJA_HIER

    CHECK_BASE_MEMBE

    R No Change, it is kept

    IF_UJA_HIER GET_MAX_LEVEL No Change, it is kept

    IF_UJA_HIER UPDATE No Change, it is kept

    IF_UJA_HIER

    AGGREGATE_CHILDC

    NT No Change, it is kept

    IF_UJA_HIER GET_FIRST_MEMBER No Change, it is kept

    IF_UJA_HIER GET_SIBLING No Change, it is kept

    IF_UJA_ODBO GET_DETAIL_DATA

    IF_UJA_DIM_DATA GET_HIER_LIST

    IF_UJA_DIMENSION_MANA

    GER GET

  • 8/12/2019 BPC10 BADIs

    23/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 18

    IF_UJA_DIM_DATA GET_ATTR_TNAME

    IF_UJA_DIMENSION_MANA

    GER GET

    IF_UJA_DIM_DATA GET_MBR_FORMULA IF_UJA_MD_READER GET_FORMULA

    IF_UJA_DIM_DATA IS_ROOT_NODE IF_UJA_MD_READER IS_ROOT_NODE

    IF_UJA_APPLICATION_

    DATA GET_APPL_DIM

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJA_APPLICATION_

    DATA

    GET_DIM_SECURE_IN

    FO

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJ_MODEL GET_APPL_PREFIX

    IF_UJA_APPLICATION_MAN

    AGER GET

    IF_UJ_MODEL GET_APPSET_PREFIX IF_UJA_APPSET_MANAGER GET

    IF_UJA_APPSET_DATA GET_PARAM_VALUE IF_UJA_APPSET_MANAGER GET_PARAMETERS

    IF_UJA_APPLICATION_

    DATA GET_PARAM_LIST

    IF_UJA_APPLICATION_MAN

    AGER

    IF_UJA_APPLICATION_

    DATA GET_ODBO_DETAIL

    IF_UJA_APPLICATION_

    DATA GET_ODBO_INFO

    IF_UJ_MODEL GET_DIM_LIST IF_UJA_APPSET_MANAGER GET_DIMENSIONS

    IF_UJ_MODEL GET_BIZ_RULES

    IF_UJA_APPLICATION_

    DATA GET_FORMULA

  • 8/12/2019 BPC10 BADIs

    24/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 19

    B.Example: Basic Reading and Writingreport zbpc_read_write_example_v10.

    data: l_appset_id type uj_appset_id value 'APSHELL_SAM',

    l_appl_id type uj_appl_id value 'Planning',

    lt_dim_list type uja_t_dim_list,

    lt_axis type ujo_t_query_dim,

    ls_axis type ujo_t_members,

    ls_member type ujo_s_member,

    lt_slicer type ujo_t_members,

    lo_appl_mgr type ref to if_uja_application_manager,

    lo_sqe type ref to if_ujo_query,

    lr_data type ref to data.

    field-symbols: type standard table.

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

    * Test case

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

    "axis

    ls_member-dimension = 'ACCOUNT'.

    ls_member-member = 'PL110'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'TIME'.

    ls_member-member = '2006.02'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.ls_member-dimension = 'CATEGORY'.

    ls_member-member = 'Actual'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'ENTITY'.

    ls_member-member = 'US'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

  • 8/12/2019 BPC10 BADIs

    25/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 20

    ls_member-dimension = 'RPTCURRENCY'.

    ls_member-member = 'USD'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'INTERCO'.

    ls_member-member = 'I_US'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'AUDITTRAIL'.

    ls_member-member = 'Input'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'PRODUCT'.

    ls_member-member = 'ProductA'.

    insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    clear ls_axis.

    ls_member-dimension = 'MEASURES'.

    ls_member-member = 'PERIODIC'.insert ls_member into table ls_axis.

    insert ls_axis into table lt_axis.

    append 'ACCOUNT' to lt_dim_list.

    append 'TIME' to lt_dim_list.

    append 'CATEGORY' to lt_dim_list.

    append 'ENTITY' to lt_dim_list.

    append 'RPTCURRENCY' to lt_dim_list.

    append 'INTERCO' to lt_dim_list.

    append 'AUDITTRAIL' to lt_dim_list.

    append 'PRODUCT' to lt_dim_list.

    append 'MEASURES' to lt_dim_list.

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

    * Create data ref

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

    call method cl_uja_bpc_admin_factory=>get_application_manager

    exporting

    i_appset_id = l_appset_id

    i_application_id = l_appl_id

  • 8/12/2019 BPC10 BADIs

    26/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 21

    receiving

    ro_return = lo_appl_mgr.

    call method lo_appl_mgr->create_data_ref

    exporting

    i_data_type = 'T'

    it_dim_name = lt_dim_list

    if_tech_name = abap_false

    if_signeddata = abap_true

    importing

    er_data = lr_data.

    assign lr_data->* to .

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

    * Query

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

    call method cl_ujo_query_factory=>get_query_adapter

    exporting

    i_appset_id = l_appset_id

    i_appl_id = l_appl_id

    receivingadapter = lo_sqe.

    call method lo_sqe->run_axis_query_symm

    exporting

    it_axis = lt_axis

    it_slicer = lt_slicer

    importing

    et_data = .

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

    * write data back

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

    DATA: lo_ujo_wb TYPE REF TO if_ujo_write_back,

    ls_wb_param TYPE if_ujo_write_back=>gs_wb_param,

    ls_wb_status TYPE ujo_s_wb_status,

    ls_work_status TYPE ujr_s_work_status,

    ls_audit TYPE ujr_s_update_audit,

    lt_message TYPE uj0_t_message,

    l_measure TYPE uj_dim_member.

  • 8/12/2019 BPC10 BADIs

    27/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 22

    FIELD-SYMBOLS:

    TYPE ANY TABLE.

    create data lr_data like .

    assign lr_data->* to .

    ls_work_status-module_id = uj00_c_mod_name_dm.

    ls_work_status-blockstatus = 0.

    ls_audit-actcode = uju0_cs_act_code-logic_exe.

    CALL METHOD cl_ujo_wb_factory=>create_write_back

    RECEIVING

    ro_write_back = lo_ujo_wb.

    ls_wb_param = cl_ujo_wb_factory=>default_wb_param( ).

    ls_wb_param-work_status = ls_work_status.

    ls_wb_param-default_logic = abap_false.

    ls_wb_param-update_audit = abap_true.

    ls_wb_param-duplicate = abap_true.

    ls_wb_param-mdata_check = abap_false.

    ls_wb_param-sign_trans = abap_true.

    ls_wb_param-measures_formula = l_measure.ls_wb_param-audit_info = ls_audit.

    ls_wb_param-work_status = ls_work_status.

    CALL METHOD lo_ujo_wb->write_back

    EXPORTING

    i_appset_id = l_appset_id

    i_appl_id = l_appl_id

    is_wb_param = ls_wb_param

    it_records =

    IMPORTING

    es_wb_status = ls_wb_status

    et_error_records =

    et_message = lt_message.

    write 'Success'.

  • 8/12/2019 BPC10 BADIs

    28/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 23

    C.Example: Get Application MetaDataREPORT ZBPC_GET_APPL_METADATA_V10.

    DATA: lv_environment_id TYPE uj_appset_id VALUE 'FPS',

    lv_application_id TYPE uj_appl_id VALUE 'GROSSMARGIN',

    lt_dim_list TYPE uja_t_dim_list,

    lo_appl_mgr TYPE REF TO if_uja_application_manager,

    lo_query TYPE REF TO if_ujo_query,

    lr_data TYPE REF TO data,

    lt_message TYPE uj0_t_message,

    ls_application TYPE uja_s_application,

    ls_dimensions TYPE uja_s_dimension.

    FIELD-SYMBOLS: TYPE STANDARD TABLE.

    lo_appl_mgr = cl_uja_bpc_admin_factory=>get_application_manager(

    i_appset_id = lv_environment_id

    i_application_id = lv_application_id ).

    CLEAR ls_application.

    lo_appl_mgr->get(

    EXPORTING

    if_with_measures = abap_false " BPC: Generic indicator

    if_summary = abap_false " BPC: Generic indicator

    IMPORTING

    es_application = ls_application ). " Applications table type

    REFRESH lt_dim_list.

    LOOP AT ls_application-dimensions INTO ls_dimensions.

    APPEND ls_dimensions-dimension TO lt_dim_list.ENDLOOP.

    * Create internal table structure based on this

    * applications dimension list

    lo_appl_mgr->create_data_ref(

    EXPORTING

    i_data_type = 'T' " H=Hash, T=Standard Table, S=Structure, O=Sorted Table.

    it_dim_name = lt_dim_list

    if_tech_name = abap_false

    if_signeddata = abap_true

  • 8/12/2019 BPC10 BADIs

    29/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 24

    IMPORTING

    er_data = lr_data ).

    ASSIGN lr_data->* TO .

    * Write out details.

    WRITE:/ 'Environment:', ls_application-appset_id,

    / 'Model(Application):', ls_application-application_id,

    / 'Description:', ls_application-description(30),

    / 'Application Type:', ls_application-application_type,

    / 'InfoCube Name:', ls_application-infocube.

    skip 1.

    WRITE:/ 'Dimension List:'.

    LOOP AT ls_application-dimensions INTO ls_dimensions.

    WRITE:/ 'Dimension:', ls_dimensions-dimension,

    'Description:', ls_dimensions-description(30),

    'Dimension Type:', ls_dimensions-dim_type.

    ENDLOOP.

  • 8/12/2019 BPC10 BADIs

    30/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 25

    D.Example: Process Dimensions and Save MembersREPORT zbpc_process_dim_mbr_v10.

    DATA: ls_message TYPE uj0_s_message,

    lt_messages TYPE uj0_t_message,

    l_success TYPE uj_flg,

    l_appset_id TYPE uj_appset_id VALUE 'ENV_TEST',

    l_dimension_id TYPE uj_dim_name VALUE 'PRODUCT',

    lo_member_mgr TYPE REF TO if_uja_member_manager,

    lo_dimension TYPE REF TO if_uja_dimension_manager,

    lo_master_data_store TYPE REF TO if_ujam_master_data_store,

    lo_context TYPE REF TO if_uj_context,

    ls_dimension TYPE uja_s_dimension,

    lt_errors TYPE uja_t_members_error,

    lr_members TYPE REF TO data,

    lr_data TYPE REF TO data.

    FIELD-SYMBOLS:

    TYPE STANDARD TABLE,

    TYPE any,

    TYPE any.

    TRY.

    lo_context = cl_uj_context=>get_cur_context( ).

    cl_uj_context=>set_cur_context(

    i_appset_id = l_appset_id

    i_module_name = lo_context->d_calling_module

    is_user = lo_context->ds_user

    ).

    lo_dimension = cl_uja_bpc_admin_factory=>get_dimension_manager(

    i_appset_id = l_appset_id

    i_dimension_id = l_dimension_id

    ).

    lo_dimension->get(

    EXPORTING

    if_with_hier_maxlevel = abap_false

    IMPORTING

  • 8/12/2019 BPC10 BADIs

    31/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 26

    es_dimension = ls_dimension

    ).

    CREATE OBJECT lo_master_data_store TYPE cl_ujam_master_data_store.

    * creating masterdata table

    lr_members = lo_master_data_store->get_table_buffer( ls_dimension ).

    ASSIGN lr_members->* TO .

    * Add members to , these are the member that will be saved.

    CREATE DATA lr_data LIKE LINE OF .

    ASSIGN lr_data->* TO .

    * Fill each field, such as ID, and EVDESCRIPTION, update other fields here as well as

    * any properties that need to be updated.

    ASSIGN COMPONENT 'ID' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'ProductD'.

    ENDIF.

    ASSIGN COMPONENT 'MBR_NAME' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'ProductD'.ENDIF.

    ASSIGN COMPONENT 'EVDESCRIPTION' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'Product D Update'.

    ENDIF.

    ASSIGN COMPONENT 'PARENTH1' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'TotalProduct'.

    ENDIF.

    ASSIGN COMPONENT 'OBJVERS' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'A'. "Version flag, should be "A" for Active

    ENDIF.

    ASSIGN COMPONENT 'ROWFLAG' OF STRUCTURE TO .

    IF sy-subrc = 0.

    = 'I'. " This is an action flag, I=Insert, M=Modify

    ENDIF.

    APPEND TO . " Add to the table.

    * Create member manager

  • 8/12/2019 BPC10 BADIs

    32/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 27

    lo_member_mgr = cl_uja_bpc_admin_factory=>get_member_manager(

    i_appset_id = l_appset_id

    i_dimension_id = l_dimension_id ).

    ****

    * Save the members UNCOMMENT ONLY when you want to write the data!!!!!

    ****

    * lo_member_mgr->save(

    * EXPORTING

    * ir_members = lr_members " List of members to save

    * IMPORTING

    * et_errors = lt_errors

    * ).

    ****

    * NOW PROCESS THE DIMENSION

    ****

    DATA: ls_dimensions TYPE uja_s_dim_name,

    lt_dimensions TYPE uja_t_dim_name.

    CLEAR ls_dimensions. REFRESH lt_dimensions.ls_dimensions-dimension = l_dimension_id. " Add dimensions to the list

    APPEND ls_dimensions TO lt_dimensions.

    lo_member_mgr->process(

    EXPORTING

    it_dim_list = lt_dimensions

    if_set_offline = abap_false

    if_validate = abap_true

    IMPORTING

    ef_success = l_success

    et_message_lines = lt_messages ).

    CATCH cx_uj_no_auth .

    ENDTRY.

  • 8/12/2019 BPC10 BADIs

    33/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 28

    E.Example: Read Transaction Data via RSDRIREPORT ZBPC_READ_TDATA_V10.

    DATA: lv_environment_id TYPE uj_appset_id VALUE 'TESTENV',

    lv_application_id TYPE uj_appl_id VALUE 'TESTMODEL',

    lt_dim_list TYPE uja_t_dim_list,

    lo_appl_mgr TYPE REF TO if_uja_application_manager,

    lo_query TYPE REF TO if_ujo_query,

    lr_data TYPE REF TO data,

    lt_message TYPE uj0_t_message,

    ls_application type UJA_S_APPLICATION,

    ls_dimensions type UJA_s_DIMENSION.

    FIELD-SYMBOLS: TYPE STANDARD TABLE.

    lo_appl_mgr = cl_uja_bpc_admin_factory=>get_application_manager(

    i_appset_id = lv_environment_id

    i_application_id = lv_application_id ).

    clear ls_application.

    lo_appl_mgr->GET(

    exporting

    IF_WITH_MEASURES = ABAP_FALSE " BPC: Generic indicator

    IF_SUMMARY = ABAP_FALSE " BPC: Generic indicator

    importing

    ES_APPLICATION = ls_application ). " Applications table type

    refresh lt_dim_list.

    loop at ls_application-dimensions into ls_dimensions.

    append ls_dimensions-dimension to lt_dim_list.endloop.

    lo_appl_mgr->create_data_ref(

    EXPORTING

    i_data_type = 'T'

    it_dim_name = lt_dim_list

    if_tech_name = abap_false

    if_signeddata = abap_true

    IMPORTING

    er_data = lr_data ).

  • 8/12/2019 BPC10 BADIs

    34/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 29

    ASSIGN lr_data->* TO .

    TRY.

    lo_query = cl_ujo_query_factory=>get_query_adapter(

    i_appset_id = lv_environment_id

    i_appl_id = lv_application_id).

    lo_query->run_rsdri_query(

    EXPORTING

    it_dim_name = lt_dim_list " BPC: Dimension List

    * it_range = " BPC: Selection condition

    if_check_security = ABAP_FALSE " BPC: Generic indicator

    * i_packagesize = " BPC: Size of Returned Data Package

    * i_call_badi = ABAP_TRUE

    * if_db_aggregate = ABAP_TRUE " BPC: Generic indicator

    IMPORTING

    et_data =

    * e_end_of_data = " BPC: Last Data Package Yes/No

    * e_split_occurred = " Result may not be completely aggregated

    et_message = lt_message " BPC: Messages

    * e_stats_guid = " BPC: Statistics Session* e_cell_filted =

    * CHANGING

    * c_first_call = " BPC: First Call Yes/No

    ).

    CATCH cx_ujo_read. " Exception of common read

    ENDTRY.

    * Show transaction data via ALV

    DATA: lo_table TYPE REF TO cl_salv_table.

    DATA: lo_functions TYPE REF TO cl_salv_functions.

    TRY.

    cl_salv_table=>factory( IMPORTING r_salv_table = lo_table

    CHANGING t_table = ).

    lo_functions = lo_table->get_functions( ).

    lo_functions->set_all( abap_true ).

    lo_table->display( ).

    CATCH cx_salv_msg.

    ENDTRY.

  • 8/12/2019 BPC10 BADIs

    35/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 30

    F.Example: Write Transaction Data via RSDRIREPORT ZBPC_WRITE_TDATA_V10.

    DATA: lv_environment_id TYPE uj_appset_id VALUE 'TESTENV',

    lv_application_id TYPE uj_appl_id VALUE 'TESTMODEL',

    lt_dim_list type uja_t_dim_list,

    lo_appl_mgr type ref to if_uja_application_manager,

    lo_query type ref to if_ujo_query,

    lr_data type ref to data,

    ls_application type UJA_S_APPLICATION,

    ls_dimensions type UJA_s_DIMENSION,

    lt_message TYPE uj0_t_message.

    field-symbols: type standard table,

    type any,

    type any,

    type any,

    type any.

    lo_appl_mgr = cl_uja_bpc_admin_factory=>get_application_manager(

    i_appset_id = lv_environment_id

    i_application_id = lv_application_id ).

    clear ls_application.

    lo_appl_mgr->GET(

    exporting

    IF_WITH_MEASURES = ABAP_FALSE " BPC: Generic indicator

    IF_SUMMARY = ABAP_FALSE " BPC: Generic indicator

    importing

    ES_APPLICATION = ls_application ). " Applications table type

    refresh lt_dim_list.

    loop at ls_application-dimensions into ls_dimensions.

    append ls_dimensions-dimension to lt_dim_list.

    endloop.

    lo_appl_mgr->create_data_ref(

    EXPORTING

    i_data_type = 'T'

    it_dim_name = lt_dim_list

  • 8/12/2019 BPC10 BADIs

    36/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 31

    if_tech_name = abap_false

    if_signeddata = abap_true

    IMPORTING

    er_data = lr_data ).

    ASSIGN lr_data->* TO .

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

    * PUT DATA FOR WRITE BACK INTO HERE!!!!!

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

    create data lr_data like line of .

    assign lr_data->* to .

    * fill each field, by assign a field symbol

    ASSIGN COMPONENT 'CATEGORY' OF STRUCTURE to .

    if sy-subrc = 0.

    = 'ACTUAL'.

    endif.

    ASSIGN COMPONENT 'ENTITY' OF STRUCTURE to .

    if sy-subrc = 0.

    = 'US'.

    endif.ASSIGN COMPONENT 'TIME' OF STRUCTURE to .

    if sy-subrc = 0.

    = '2011.OCT'.

    endif.

    * Now add to the internal table for write back.

    append to .

    * BEGIN Write Back operation

    DATA: lo_ujo_wb TYPE REF TO if_ujo_write_back,

    ls_wb_param TYPE if_ujo_write_back=>gs_wb_param,

    ls_wb_status TYPE ujo_s_wb_status,

    ls_work_status TYPE ujr_s_work_status,

    ls_audit TYPE ujr_s_update_audit,

    lv_measure TYPE uj_dim_member.

    FIELD-SYMBOLS: TYPE ANY TABLE.

    create data lr_data like .

    assign lr_data->* to .

  • 8/12/2019 BPC10 BADIs

    37/38

    How To Migrate BPC 7.x BADIs to BPC 10

    May 2013 32

    ls_work_status-module_id = uj00_c_mod_name_dm.

    ls_work_status-blockstatus = 0.

    ls_audit-actcode = uju0_cs_act_code-logic_exe.

    lo_ujo_wb = cl_ujo_wb_factory=>create_write_back( ).

    ls_wb_param = cl_ujo_wb_factory=>default_wb_param( ).

    ls_wb_param-work_status = ls_work_status.

    ls_wb_param-default_logic = abap_false.

    ls_wb_param-update_audit = abap_true.

    ls_wb_param-duplicate = abap_true.

    ls_wb_param-mdata_check = abap_false.

    ls_wb_param-sign_trans = abap_true.

    ls_wb_param-measures_formula = lv_measure.

    ls_wb_param-audit_info = ls_audit.

    ls_wb_param-work_status = ls_work_status.

    lo_ujo_wb->write_back(

    EXPORTING

    i_appset_id = lv_environment_id

    i_appl_id = lv_application_id

    is_wb_param = ls_wb_paramit_records =

    IMPORTING

    es_wb_status = ls_wb_status

    et_error_records =

    et_message = lt_message ).

  • 8/12/2019 BPC10 BADIs

    38/38

    www.sap.com/contactsap

    www.sdn.sap.com/irj/sdn/howtoguides