1 2 3 24 Previous Next

SAP Business Warehouse

360 Posts

Dear All,

 

Many times there are sdn threads on issues while adding records to SOURCE_PACKAGE or ERSULT_PACKAGE.

 

This issue causes because while adding new records to SOURCE or RESULT Package, we need to add "Record Number" field in addition to other fields which we want  to add to result package.


There are two ways to resolve this issue:

 

Way-1) add record number manually to SOURCE or RESULT package.

Way-2) Call standard method provided by SAP .

 

Way-1) Update record number manually which inserting new records:

            In this way, we need to manually populate record number & then increment it manually while adding records to source/result package.

             Example: Suppose based on some condition in internal table IT_TAB1, we need to add records to result package.

 

            Step-1) First declare integer type of variable.

                         ex. DATA: lv_record_count TYPE I.

 

            Step-2) Populate records of result_package, this is start counter for our declared variable.

                         DESCRIBE TABLE RESULT_PACKAGE LINES lv_record_count.

 

                        This line will populate total number of records in RESULT_PACKAGE, for ex. in result_package we have 100 records then after                                               executing above ABAP statement , we will have 100 integer value inside variable lv_record_count.

      

             Step-3) Just increment this counter for each record while inserting new record in SOURCE/RESULT package.

                       

                        LOOP AT IT_TAB1 ASSIGNING <FS_1>  WHERE <condition>.

                           <---------- ABAP Syntax --------------------->

                         lv_record_count = lv_record_count + 1.

                         <FS_1>-record = lv_recod_count.

                         APPEND <FS_1> TO RESULT_PACKAGE.

                        ENDLOOP.

 

Way-2) Update record number using SAP method while inserting new records.

             <considering same scenario as of above>

            This way is more feasible and preferable, as provided by SAP.

               SAP provided method which populates record number automatically.

            

               

                        LOOP AT IT_TAB1 ASSIGNING <FS_1>  WHERE <condition>.

                         

                           <---------- ABAP Syntax --------------------->

                         CALL METHOD me->new_record__end_routine. 

                               EXPORTING

                                      source_segid = 1

                                      source_record = 0

                               IMPORTING

                                       record_new = <result_fields>-record.

 

                                 ""  This method automatically populates record number, we just need to import new record number populated by this method. 

                        ENDLOOP.

 

 

References:

http://scn.sap.com

SNOTE: 1223532 DEsign Rule: Addition of records to end routine

 

**************************** Thanks for your Time   ************************************** 

Monitoring data loads can be considered as a recurring daily activity for any BW Support Organization. In some cases it is also required to have a deep-dive into the DTP Monitor Log, e.g. for observing any “data related issues”. Often this task is assigned to a Functional Application Manager or Business User who might not have access to the BW back-end. It would be convenient to automate the process by sending DTP Monitor Log entries by e-mail to one or several receipients.

In this blog I would like to introduce a comprehensive ABAP Add-on which I developed for facilitating this process. Please refer to my document Implementing an Add-on for Sending DTP Monitor Log to E-mail for detailed implementation instructions.

DTP Monitor Log Entries

The screenshot below shows an example of a DTP Monitor Log.

 

Figure_1_DTP_Monitor_Log.jpg

Figure 1: DTP Monitor Log

 

As you can see the Expert Routine sent some warning messages to the DTP Monitor Log. The message log can be displayed by double-clicking on the log icon.

 

Figure_2_DTP_Monitor_Log_Messages.jpg

Figure 2: DTP Monitor Log messages

 

For each message you can show more information by clicking on the question mark icon. Next to an optional long text, you can find here the Message Class (i.e. the first part of Message No. - in this example ZILL) and Message Number (i.e. the last three digits of the Message No. - in this example 004).

 

Figure_3_Example_Detailed_Message.jpg

Figure 3: Example of a detailed message

E-mail Add-on

The E-mail Add-on is an ABAP program which is intended to be included in a Process Chain. The program must run after the DTP for which you want the Monitor Log to be sent via e-mail. The next screenshot shows the selection screen of the program.

 

Figure_4_Selection_Screen.jpg

Figure 4: Selection screen

 

The program retrieves the latest DTP request according to the selections made on the selection screen. Subsequently, the monitor messages are filtered based on the Message Class (please see figure 3 for an example) and Message Type (e.g. Error, Warning, etc.) which can be optionally specified on the selection screen. If you don’t specify any Message Class and/or Message Type, all messages will be collected. It is mandatory to enter at least one E-mail Address and an E-mail Subject.

 

Furthermore, a word about the Abort flag. It is meant to influence how the program must behave in case of an e-mail send failure. I suggest to activate the Abort flag if sending the e-mail is crucial for the Business Users. The program terminates in such a case, the Process Chain becomes red and requires manual intervention.

 

Note: be aware that as a prerequisite the SAPconnect configuration must be OK. This configuration is not described here. Please refer to t/code SICF and SCOT.

 

As the last step the program displays a log of what has been executed.

 

Figure_5_Program_Log.jpg

Figure 5: Log at the end of the program

 

The program log will be stored as a spool request. This log can be viewed retrospectively by the BW Support Organization if required.

 

Last but not least, you can check out the outbound e-mail messages using SAPconnect Administration (t/code SCOT).

 

Figure_6_SAPconnect_Administration.jpg

Figure 6: SAPconnect administration

Conclusion

In this blog I introduced the E-mail Add-on. It is an ABAP program meant to automate the process of sending DTP Monitor Log entries by e-mail to one or several receipients. Please refer to my document Implementing an Add-on for Sending DTP Monitor Log to E-mail for more information re. implementing this E-mail Add-on.

If you are a BW developer and you just read the title, you are probably thinking ‘…but shouldn’t that be done in the query’. You are right the ‘to date’ variants for aggregating date should be done at the query level whenever possible, which is almost all the time. But there do arise, situations when you want it done in the back-end transformations.

 

                I came up with one such scenario recently where we had to do the MTD, QTD and YTD calculations in our transformation layer. We had to calculate the ‘to-date’ aggregates for our key figures and store the data in the back-end. I couldn’t find a lot of information on how people usually do this when they have to do this in the back-end.

 

                The first thought that came to mind is to ‘loop the loop’, wherein we loop through the end-routine data and calculate the aggregation in an inner loop for every record. Say,  I have one year’s worth of data for a given account number, I would take each record and run it in a loop and decrement the date each time until the first day of the year aggregating my key figures each time. For example, if I had a record for 20151231, I would run the loop 365 times adding up my key figures until 20150101 calculating MTD, QTD and YTD inside the loop. But we all know a loop inside a loop is a strict No-no.

 

 

                I was experimenting on different ways to do this without involving a too much looping around. One such method is to use the AT-NEW ‘control level statement’, (https://help.sap.com/saphelp_470/helpdata/en/fc/eb381a358411d1829f0000e829fbfe/content.htm). The control-level statements itself have been in existence for a long time, but I am sure not many of us BW developers would have considered it inside of transformations.

 

My source metadata looked something like this,

SourceDataset.png

I was calculating the ‘to-date’ values at the lowest level of granularity, involving all the key fields.

 

In the end routine do a look back on source and SELECT-FOR ALL ENTRIES in result package at FISCYEAR level. This will give you a full year’s data even if a record exists for single date in a year in the result package.

 

SELECT  CO_AREA COMP_CODE PROFIT_CTR COSTCENTER CURTYPE FISCVARNT
CHRT_ACCTS ACCOUNT FISCYEAR CALQUARTER FISCPER DATE0
AMOUNT
CURRENCY
FROM /BIC/AZTDSO00100
INTO CORRESPONDING FIELDS OF TABLE lt_ZTDSO001
FOR ALL ENTRIES IN RESULT_PACKAGE
WHERE CO_AREA     = RESULT_PACKAGE-CO_AREA
AND   COMP_CODE   = RESULT_PACKAGE-COMP_CODE
AND   PROFIT_CTR  = RESULT_PACKAGE-PROFIT_CTR
AND   COSTCENTER  = RESULT_PACKAGE-COSTCENTER
AND   CURTYPE     = RESULT_PACKAGE-CURTYPE
AND   FISCVARNT   = RESULT_PACKAGE-FISCVARNT
AND   CHRT_ACCTS  = RESULT_PACKAGE-CHRT_ACCTS
AND   ACCOUNT     = RESULT_PACKAGE-ACCOUNT
AND   FISCYEAR    = RESULT_PACKAGE-FISCYEAR.

SORT lt_ZTDSO001 ASCENDING BY
CO_AREA COMP_CODE PROFIT_CTR COSTCENTER CURTYPE FISCVARNT
CHRT_ACCTS ACCOUNT FISCYEAR CALQUARTER FISCPER DATE0
.


The order of fields in the internal table is the key here as any change of value to the left of the field for which we check ‘AT-NEW’ would trigger a change. I am doing it at the ‘ACCOUNT’ level, so any change to the right of the ACCOUNT field would register as a NEW record. . The ascending order of sort will help run the loop only once.

In the LOOP below, the AMOUNT value is aggregated over every iteration and for every true ‘AT-NEW’ the corresponding ‘to-date’ key figure value is reset,

 

LOOP AT lt_ZTDSO001 ASSIGNING <fs_ZTDSO001>.
AT NEW FISCPER.
lv_kf_MTD
= 0.
ENDAT.
AT NEW CALQUARTER.
lv_kf_QTD
= 0.
ENDAT.
AT NEW FISCYEAR.
lv_kf_MTD
= lv_kf_QTD = lv_kf_YTD = 0.
ENDAT.
AT NEW ACCOUNT.
lv_kf_MTD
= lv_kf_QTD = lv_kf_YTD = 0.
ENDAT.

lv_kf_MTD
= lv_kf_MTD + <fs_ZTDSO001>-AMOUNT.
<fs_ZTDSO001>
-/BIC/ZTKFMTD = lv_kf_MTD.
lv_kf_QTD
= lv_kf_QTD + <fs_ZTDSO001>-AMOUNT.
<fs_ZTDSO001>
-/BIC/ZTKFQTD = lv_kf_QTD.
lv_kf_YTD
= lv_kf_YTD + <fs_ZTDSO001>-AMOUNT.
<fs_ZTDSO001>
-/BIC/ZTKFYTD = lv_kf_YTD.
ENDLOOP
.

 

Once the MTD, QTD and YTD values are calculated in the temporary internal table a second loop over the result package is necessary to copy over the calculated values.

LOOP AT RESULT_PACKAGE ASSIGNING <fs_PACKAGE>.
READ TABLE lt_ZTDSO001 INTO wa_ZTDSO001 WITH KEY
“table key
BINARY SEARCH.
IF SY-SUBRC = 0.
“populate calculated fields
ENDIF.
ENDLOOP
.

 

NOTE: We can even do this in a single loop if we know for sure we have an entire year’s data in one package.

 

The second best option to using AT-NEW would be to use a parallel cursor as mentioned in this document, http://scn.sap.com/docs/DOC-69322 . I did run a few tests between these two methods to check the number of times the loop executes and you can see how even a minimal loop using the cursor method compares to using  control-level statements.

 

For AT-NEW Code

ATNEWloopcount.png

Loop count is for one package of 50000 records

 

ATNEWload.png

 

 

Parallel Cursor Code

LOOP AT RESULT_PACKAGE ASSIGNING <fs_PACKAGE>.
READ TABLE lt_ZTDSO001 ASSIGNING <fs_ZTDSO001>
WITH KEY “table key
IF SY-SUBRC = 0.
lv_SYTABIX 
= SY-TABIX.
LOOP AT lt_ZTDSO001 FROM lv_SYTABIX ASSIGNING <fs_ZTDSO001>
WHERE “table key
IF <fs_ZTDSO001>-FISCYEAR = <fs_PACKAGE>-FISCYEAR.
lv_kf_YTD
= lv_kf_YTD + <fs_ZTDSO001>-AMOUNT.
ENDIF.
IF <fs_ZTDSO001>-CALQUARTER = <fs_PACKAGE>-CALQUARTER.
lv_kf_QTD
= lv_kf_QTD + <fs_ZTDSO001>-AMOUNT.
ENDIF.
IF <fs_ZTDSO001>-FISCPER = <fs_PACKAGE>-FISCPER.
lv_kf_MTD
= lv_kf_MTD + <fs_ZTDSO001>-AMOUNT.
ENDIF.
ENDLOOP.
“populate calculated fields
lv_kf_MTD
= lv_kf_QTD = lv_kf_YTD = 0.
ENDIF.
ENDLOOP
.

 

CursorLoop.png

Loop count is for one package of 50000 records

 

CursorLoad.png

 

 

The use of AT-NEW might not work for all scenarios but you can take it into consideration when you have to do some sort of aggregation inside your transformations.

 

And if you have a better way of doing this, please do write about it and share the link in the comments below for the benefit of the community.

Dear All,

 

Recently i have a faced one issue where i required to change TR status from released to unreleased.

I have assumption that once we released TR(task) then we can not revert TR to modiable, but that was wrong.

SAP have provided program using which we can do this.

 

Initially TR was in Released status.

Capture.PNG

 

Step 1: Go to SE38-> enter program name : RDDIT076 -> execute

 

 

Step 2: Enter TR/Task which status you want to convert from released to modifiable -> execute program

 

Step 3: you will find TR with R (Released) status.

 

double click on R status(encircled in above screen), you will find below screen where need to edit R status to D status(D= Modified).

 

 

click on Save. -> exit from program

 

Step 4: go to Se01-> enter TR name, you will find TR in unreleased(modifiable) status.

 

 

 

Regards,

Hitesh

Sometines we need to create a huge ABAP expert routine to shave a mammoth into an elephant by bussines requirements.

And we using the FORM statement to split and structurize a ABAP code, but I've found a little hack that making possible to define and implement custom methods inside of transformation class.

 

Process consist of only two steps:

 


1. Methods definition in 1st global part.

expert_routine_1.PNG



2. Methods implementation after ENDMETHOD statement used to artificially close expert routine's body

expert_routine_2.PNG


 

That's it.

 

And I don't want discuss possible future migration issues on "BW 15.x", just enjoy.

Every SAP project has phases like Blue print, Development, Testing, Migration, Maintenance etc. in each phase we need to spend considerable amount of time in documenting the activates we have planned and doing. On daily basis I spend good amount of time in developing the SAP Technical design documents. To capture the technical details quickly, easily & correctly, I use the following tables.

 

  1. Info Source Object (i-Src) : Fields in I-Src and their details       -RSKSFIELDNEW
  2. Data store Object (DSO) : Fields in DSO and their details        -RSDODSOIOBJ
  3. Info Cube Object (i-cube) : Fields in i-Cube and their details    -RSDCUBEIOBJ
  4. Multi Provider Object (M-Pro) : Fields in MPR and their details -RSDICMULTIIOBJ
  5. STMS (Transportation): How to identify the Object in the Project Package / $TMP Package

 

 

 

 

  1. Info Source Object (i-Src) : Fields in I-Src and their details  Table - RSKSFIELDNEW

2.JPG

 

 

2_2.JPG

 

 

 

2. Data store Object (DSO) : Fields in DSO and their details Table - RSDODSOIOBJ

dso 1.JPG

dso 1_1.JPG

 

 

3. InfoCube Object (i-cube) : Fields in i-Cube and their details Table - RSDCUBEIOBJ

 

Ic_1.JPG

 

Ic_2.JPG

 

 

 

4. Multi Provider Object (M-Pro) : Fields in MPRO and their details  Table- RSDICMULTIIOBJ

3.JPG

 

 

3_3.JPG

 

 

 

 

5. STMS (Transportation): Object in the Project Package / $TMP Package  Table - TADIR

 

A_1.JPG

 

 

 

 

How to find current objects in $TMP (For example)

  Selection used DEVCLASS = $TMP

a_2.JPG

 

 

 

How to find current objects in $TMP (For example)

Selection used DEVCLASS = $TMP : OBJECT = RSPC (Process Chain)

a_3.JPG

Imagine you've created an (acquisition) DSO for which you'd like to browse its content. Imagine this DSO contains General Ledger Data and is called MC_O005

 

 

Of course "Display data" or SE16 can come in handy, but slicing and dicing on this data isn't easy. Wouldn't it be nice if there was a (hidden gem) feature which enables you to browse the content of this infoprovider via transaction RSRT (the query monitor transaction), WITHOUT an actual query being created on top of this infoprovider?

 

 

Execute transaction RSRT and add the following query name: <infoprovider name>/!!A<infoprovider name>In our example, the above would lead to query name MC_O005/!!AMC_O005 (as to be seen in the screengrab above) Pressing enter generates the following success message on the bottom left of the screen

 

 

When the above success message is shown, a temporary query has been generated which can be executed....by pressing the execute button. The result of this temporary query is similar to the execution of a regular query

 

Isn't this neat ;-)

 

(This blog has also been cross posted on http://www.thesventor.com)

Today I'm writing this blog post for reiterate the importance of chosse the right component when open an incident, and also on how to make a best search before open it.

SAP is working a lot on provide notes, KBA's and different documentation about our known errors, bugs and frequent customer questions, this is for improve our customer satisfaction and time.

 

For identify the relevant documentation to your inquiry, it is very important to know how to make the best search. For that the bellow note can help you:

2081285 - How to get best results from an SAP search?

 

Also, as you might know the component chosen to open your incident determines the expert team that will process your inquiry, and also the result of your document search. A wrong component chosen can cause unnecessary delays until your incident reaches the correct team and the relevant notes and documentation will not be identified.

 

As an information source on how SAP components may be defined, I'd like to recommend you the following SAP Wiki in which you'll find relevant information on how to define the component of your message and, therefore, obtain a faster response from our Experts.

 

 

 

      http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/22886

 

 

This information is valid to all SAP Support component areas and I suggest you to review it to make sure that you are opening your incidents under the correct expertise area avoiding delays in the resolution of your future issues.

 

 

Janaina

In the past I created a blog post describing the Infoobjects Level authorizations:

 

SAP BW Authorization - InfoObjects level authorization


Now I will focus on creating and assigning authorization to BW:

 

Creating authorization


To create analysis authorization perform the following steps:

1. Use TCode RSECADMIN, go to the Authorizations tab.

2. Press Maint. button and enter a name (e.g., Z_USR_A1) and press Create.

3. Fill required Short Text field.

4. Insert special characteristics: 0TCAACTVT, 0TCAIPROV, and 0TCAVALID by pressing Insert Special Characteristics button.


1.png


5. Insert authorization-relevant characteristics and navigational attributes (Insert Row -> press F4 -> choose item). I described how to set in my previous blog SAP BW Authorization - InfoObjects level authorization.


6. Press Details button to restrict values and hierarchy authorization of inserted items.


7. Save the authorization.

 

You must include special characteristics: 0TCAACTVT (activity), 0TCAIPROV (InfoProvider), and 0TCAVALID (validity) in at least one authorization for a user. They are used for:

  • 0TCAACTVT - to restrict the authorization to activities, default value: Display;
  • 0TCAIPROV - to restrict the authorization to InfoProviders, default value: all (*);
  • 0TCAVALID - to restrict the validity of the authorization, default value: always valid (*).



If you want to authorize access to key figures, add 0TCAKYFNM characteristic to the authorization. It is important to know that if this characteristic is authorization-relevant, it will be always checked during query execution.

 

 

0BI_ALL authorization

The 0BI_ALL authorization includes all authorization-relevant characteristics. It is automatically updated when you restrict an infoobject. Use this authorization if you have users that are allowed to execute all queries.



Assigning authorization to a user

You may assign authorization directly to a user or to a role. To assign authorization directly use TCode RSECADMIN, go to the User tab and press Assign. Now enter the user name, pressChange and select the authorization. To assign authorization to the role use TCode PFCG, enter the role name and press Change. Using Authorization tab change authorization data by adding S_RS_AUTH entry. The entry includes analysis authorization in roles. Enter here authorization that you previously created.



Summary

I encourage you to collect all requirements related to BW security, structure of the organization and authorization needs before starting authorization preparation. I have learned that it can save a lot of time. Organization's hierarchy can facilitate your work by providing structures and levels of authorization. Indirect authorization assignment can also save your time because it is more flexible and easier to maintain.

Author: Subhash Matta

 

Company: NTT DATA Global Delivery
Services Limited


Author Bio :

Subhash Matta is a Senior Consultant at NTT DATA from the
SAP Analytics Practice

 

This SCN can be useful in some special cases where a cube compression activity fails due to Index size becomes larger than table (more than table size). Compression is nothing but deleting the Request ID’s and moving the data from F Fact Table to E Fact table. This will enable for an improved Query performance. If the compression activity fails it will hinder the Query performance. 


Take a scenario, where the cube compression fails.

First thing you can do would be a few/single request is taken into the compression request and try compressing.

If this attempt fails due to an error, “Failed compression:”
SQL-ERROR: 942 ORA-00xxx: table or view does not exist
.  This could be result of the Database adjustments or the table index size issue.

This can be resolved as below.

 

Step1:

 

 

Go to Transaction code, SE14 ABAP Dictionary: Database Utility. Give the table name
of the E Fact Table of an Infocube where in the error is showing.

 

pic1.png

 

Press Enter you will get the below screen.

 

Step2.

 

Click on “Activates and Adjust database” please make sure
that the option is on “SAVE DATA”, else you can lose the data in the cube.
Please be careful, as this will generally be done in Production, we cannot
afford to lose data.

 

pic2.png

 

pic3.png

 

 

 

Step3.

 

After the completion of “Activate and adjust” step, Goto -> Extras -> Force Conversion.

 

pic4.png

 

pic5.png

After this activtity
completes successfully the above shown message pops up. Please try repeating the compression again.

If this again fails, please check if the table is active, if not please activate the table and try to compress.

This should be successful.

 

NOTE: The solution suggested is applicable to BW version 7.23 and more. If you don’t have the
mentioned version please raise a request with SAP. Please perform this activity in background for monitoring the job.

Please note that this activity will take more time if the data is more in the table.

Introduction:


This document explains the conversion approach/steps to convert the Local Composite Provider/ Multi Provider to HCPR composite provider.

Prerequisites:

 

Backend BW version has to be BW 7.4 SPS9 and above to get the conversion. 

If the version is lesser than SPS11 then pre-requisite is to apply the OSS note – 2115198 - HCPR: Corrections for conversion.

SAP suggest to use Composite provider of type HCPR as HCPR can be developed using the Studio and not the COPR. All future developments/enhancements are happening on the type HCPR.

Steps Involved:

Step 1: Check the system version and consider the below action if the system is lesser than SPS11.

If the system is lesser than SPS11 then apply the OSS note – 2115198 in the system which will bring the required corrections in the system.

Download the OSS Note in SNOTE:

1.PNG

Implement the note:

While implementing this this is prompt to implement note- 2115198 corrections and updating of the new program RS_UDO_NOTE_2115198 in the system which has to execute post implementing the note – 2115198.

2.PNG

Once the note is implemented, then execute the report using SE38 in the system:

3.PNG

Execute with the sequence as per the instructions below:

4.PNG

Test run gives the below message:

5.PNG

Proceed to Step 2:

6.PNG

This will prompt for modifications to be stored in the transport. 

Execute the activity as a batch job.

7.PNG

The below message appears for the job.

1_1.PNG

Come back to SE38 to re-run the program again with the UPDATE mode.

11.PNG

     These results with the below log:

12.PNG

If all green then the note corrections are applied. If there are any errors, then perform the execution one more time.

Goto next step:

13.PNG

This list the overall log in Green color.

 

Once this is done then confirms the corrections are done in SNOTE.

15.PNG

Confirm the manual actions and then mark the action as done. With this Note is completely implemented.

Step 2: Execute the conversion program in BW system to convert the existing COPR/MPRO to HCPR.

SAP has delivered a program - RSO_CONVERT_IPRO_TO_HCPR to convert the already existing Multi provider (MPRO) / Local Composite provider (COPR) to type HCPR.

Execute the program in SE38 which will bring the below view:

17.PNG

The options represents the below:

18.PNG

Note: There are multiple additional options are available in BW7.5 which allows taking a backup of the Queries or restoring the queries.


Update the fields with the source and target provider data and run the execution in simulation mode.

20.PNG

Note: As in Local Composite provider, the Navigational attributes are marked as @3 as prefix which is replaced with prefix 4 to differential the type from COPR to HCPR.

Physical Conversion: Select the mode as "Convert Infoprovider"

21.PNG

Log displays with the results and the kind of changes.

Goto RSA1 and check for the new Composite Provider:

22.PNG

Double click on the composite:

23.PNG

Check the contents to validate the data further and reconcile the results matching with the COPR type.


Conversion using the same name space:
34.PNG

New entry with the same name space is created and available in RSA1.

1_2.PNG

Option 3:


To convert the below composite provider and its associated BEX query.

1_3.PNG

Execute the program with the below options:

27.PNG

Above selection will create the HCPR with the same name but creates as a copy and overwrite is not possible.

Post execution, this will prompt to select the list of BEX to be copied:

28.PNG

Proceed further will allow us to change the new Query name:

29.PNG

Rename can be done for example like below or to the customer name space.

30.PNG

Once this is done, the program lists the log for all the changes that are being performed.

In the database there is a new BEX query which has made an entry:

31.PNG

Observation: The old Composite is in the name space of @3 as prefix. And the new composite of type HCPR is referred with the same name space the way it looks in RSA1.

You can see the Old and new Composite.

32.PNG

Difference in the Bex Level between the old to the new:

32_1.PNG
This has additional Dimensions to list the InfoProviders separately where as in the COPR this is present in the Char. Catalog itself. Navigational attribute name space is changed as below:

32_2.PNG

Validate if the Output results are the same.

Limitations:

Below limitations are applicable:

33.PNG

Note: Prepare the data output before and after conversion and make sure that the results are same. Depending on the results, check whether the new HCPR need to be considered to make the old one as obsolete.

In WEBI, the old BEX has to be replaced with the new BEX if the converted HCPR is considered going forward and if the BO is being used on top of BEX.


Good Luck.

References: help.sap.com

Dear All,

 

 

In the last months I indentified several incidents reporting Syntax errors in BW objects (Message no. RG102).

The ones that appear with more frequency are related with DSO and Transformation activation:

 

1. Syntax error in GP_ERR_RSODSO_ACTIVATE, row xxx (-> long text)

Message no. RG102

 

2. Syntax error 'GP_ERR_RSTRAN_MASTER_TMPL'

Message no. RG102

 

3. Syntax error 'GP_ERR_RSAPTH3, row 30 (-> long text)

Message no. RG102

 

 

For these errors the following notes were created:

 

Syntax error 1:

 

2100403 - Syntax error in GP_ERR_RSODSO_ACTIVATE during activation of DSO

 

 

Syntax error 2:

 

2152631 - 730SP14: Syntax error during activation of Transformations

2124482 - SAP BW 7.40(SP11) Activation failed for Transformation

1946031 - Syntax error GP_ERR_RSTRAN_MASTER_TMPL during activation of transformation

1933651 - Syntax error in GP_ERR_RSTRAN_MASTER_TMPL for rule type "Time Distribution"

1919235 - "Syntax error in routine" of a migrated transformation/during migration

1889969 - 730SP11:Syntax error in GP_ERR_RSTRAN_MASTER_TMPL for RECORDMODE

1816350 - 731SP8:Syntax errors in routines or Assertion failed during activation of transformation

1762252 - Syntax error in GP_ERR_RSTRAN_MASTER_TMPL

 

 

Syntax error 3:

2113639 - Activation of Hierarchy DataSource - GP_ERR_RSAPTH3

 

 

Regards,

Janaina

Hi,

 

Please help me to Extract data from SAP TCODE ( front end ) automatically in Excel vba code.

 

Sap “Script Recording and Playback ” is disabled from server.


Regards,

Satish

There is an OFB solution how to model drill down using Analysis Items in WAD. What it takes is to pass selection from parent analysis item to child one. But this solution has two major problems:

  • Bad Performance (since there is no parent Analysis Item initial selection, it takes long time to load detailed data of child analysis item);
  • Not intuitive interface (since there is no parent Analysis Item initialial selection, it is not clear that parent analysis item should limit data of child one).

In my blog I will explain how to model drill down with initial selection to make analysis application both responsive and intuitve (some JavaScript knowledge will be required).

    Once my analysis application is refreshed it looks like this

 

Analysis Application.jpg

This is what is required to make initial selection work:

Lets see each step in details.

 

Initially hide child Analysis Item

ANALYSIS_ITEM_2_Properties.jpg

 

Find first Product from parent Analysis Item

Add Data Provider Info Item for DP_1 (used by 1st Analysis Item)

DATA_PROVIDER_INFO_ITEM_1.jpg

Define JavaScript function to read first Product.

 

function Get_Product() {

var s;
var xml;
xml = document.getElementById('DATA_PROVIDER_INFO_ITEM_1').innerHTML;
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;

xmlDoc.loadXML(xml);


var Product = xmlDoc.getElementsByTagName("AXIS")[0].getElementsByTagName("MEMBER")[0].getAttribute("text")

return Product;

}

 

 

Select first row in parent Analysis Item

Define JavaScript function to select first row in 1st Analysis Item

 

function Select_Row() {
var tableModel;
var element =  document.getElementById('ANALYSIS_ITEM_1_ia_pt_a');
  if (typeof(element) != 'undefined' && element != null)  {
// BW 7.3
  tableModel = ur_Table_create('ANALYSIS_ITEM_1_ia_pt_a'); 
  }
  else {
// BW 7.0
    tableModel = ur_Table_create('ANALYSIS_ITEM_1_interactive_pivot_a'); 
  }

var oRow = tableModel.rows[ 2 ];
sapbi_acUniGrid_selectRowCellsInternal( tableModel, oRow, true, null);

}

 

Limit child Analysis Item data to fist Product in parent Analysis Item and unhide child Analysis Item

Define JavaScript function that executes command sequence of two commands:

 

function Filter_N_Unhide( Product ){

//Note: information can be extracted using the parameter 'currentState'

// and 'defaultCommandSequence'. In either case create your own object

// of type 'sapbi_CommandSequence' that will be sent to the server.

// To extract specific values of parameters refer to the following

// snippet:

//  var key = currentState.getParameter( PARAM_KEY ).getValue();

//  alert( "Selected key: " + key );

//

// ('PARAM_KEY' refers to any parameter's name)

//Create a new object of type sapbi_CommandSequence

var commandSequence = new sapbi_CommandSequence();

/*

  * Create a new object of type sapbi_Command with the command named "SET_SELECTION_STATE_SIMPLE"

    */

var commandSET_SELECTION_STATE_SIMPLE_1 = new sapbi_Command( "SET_SELECTION_STATE_SIMPLE" );

/* Create parameter TARGET_DATA_PROVIDER_REF_LIST */

var paramTARGET_DATA_PROVIDER_REF_LIST = new sapbi_Parameter( "TARGET_DATA_PROVIDER_REF_LIST", "" );

var paramListTARGET_DATA_PROVIDER_REF_LIST = new sapbi_ParameterList();

// Create parameter TARGET_DATA_PROVIDER_REF

var paramTARGET_DATA_PROVIDER_REF1 = new sapbi_Parameter( "TARGET_DATA_PROVIDER_REF", "DP_2" );

paramListTARGET_DATA_PROVIDER_REF_LIST.setParameter( paramTARGET_DATA_PROVIDER_REF1, 1 );

  // End parameter TARGET_DATA_PROVIDER_REF!

paramTARGET_DATA_PROVIDER_REF_LIST.setChildList( paramListTARGET_DATA_PROVIDER_REF_LIST );

commandSET_SELECTION_STATE_SIMPLE_1.addParameter( paramTARGET_DATA_PROVIDER_REF_LIST );

 

/* End parameter TARGET_DATA_PROVIDER_REF_LIST */

 

/* Create parameter RANGE_SELECTION_OPERATOR */

var paramRANGE_SELECTION_OPERATOR = new sapbi_Parameter( "RANGE_SELECTION_OPERATOR", "EQUAL_SELECTION" );

var paramListRANGE_SELECTION_OPERATOR = new sapbi_ParameterList();

// Create parameter EQUAL_SELECTION

var paramEQUAL_SELECTION = new sapbi_Parameter( "EQUAL_SELECTION", "MEMBER_NAME" );

var paramListEQUAL_SELECTION = new sapbi_ParameterList();

// Create parameter MEMBER_NAME

var paramMEMBER_NAME = new sapbi_Parameter( "MEMBER_NAME", Product );

paramListEQUAL_SELECTION.addParameter( paramMEMBER_NAME );

  // End parameter MEMBER_NAME!

paramEQUAL_SELECTION.setChildList( paramListEQUAL_SELECTION );

paramListRANGE_SELECTION_OPERATOR.addParameter( paramEQUAL_SELECTION );

  // End parameter EQUAL_SELECTION!

paramRANGE_SELECTION_OPERATOR.setChildList( paramListRANGE_SELECTION_OPERATOR );

commandSET_SELECTION_STATE_SIMPLE_1.addParameter( paramRANGE_SELECTION_OPERATOR );

 

/* End parameter RANGE_SELECTION_OPERATOR */

 

/* Create parameter CHARACTERISTIC */

var paramCHARACTERISTIC = new sapbi_Parameter( "CHARACTERISTIC", "D_NW_PRID" );

commandSET_SELECTION_STATE_SIMPLE_1.addParameter( paramCHARACTERISTIC );

 

/* End parameter CHARACTERISTIC */

 

// Add the command to the command sequence

commandSequence.addCommand( commandSET_SELECTION_STATE_SIMPLE_1 );

/*

  * End command commandSET_SELECTION_STATE_SIMPLE_1

    */

/*

  * Create a new object of type sapbi_Command with the command named "SET_ITEM_PARAMETERS"

    */

var commandSET_ITEM_PARAMETERS_2 = new sapbi_Command( "SET_ITEM_PARAMETERS" );

/* Create parameter ITEM_TYPE */

    var paramITEM_TYPE = new sapbi_Parameter( "ITEM_TYPE", "ANALYSIS_ITEM" );commandSET_ITEM_PARAMETERS_2.addParameter( paramITEM_TYPE );

 

    /* End parameter ITEM_TYPE  */

/* Create parameter INIT_PARAMETERS */

var paramINIT_PARAMETERS = new sapbi_Parameter( "INIT_PARAMETERS" );

    var paramListINIT_PARAMETERS = new sapbi_ParameterList();commandSET_ITEM_PARAMETERS_2.addParameter( paramINIT_PARAMETERS );

 

// Create parameter VISIBILITY

var paramVISIBILITY = new sapbi_Parameter( "VISIBILITY", "VISIBLE" );

paramListINIT_PARAMETERS.addParameter( paramVISIBILITY );

  // End parameter VISIBILITY!

paramINIT_PARAMETERS.setChildList( paramListINIT_PARAMETERS );

/* End parameter INIT_PARAMETERS  */

 

/* Create parameter TARGET_ITEM_REF */

var paramTARGET_ITEM_REF = new sapbi_Parameter( "TARGET_ITEM_REF", "ANALYSIS_ITEM_2" );

commandSET_ITEM_PARAMETERS_2.addParameter( paramTARGET_ITEM_REF );

 

/* End parameter TARGET_ITEM_REF */

 

// Add the command to the command sequence

commandSequence.addCommand( commandSET_ITEM_PARAMETERS_2 );

/*

  * End command commandSET_ITEM_PARAMETERS_2

    */

//Send the command sequence to the server

    return sapbi_page.sendCommand( commandSequence );

}

 

 

Code call of all onload JavaScripts

Define JavaScript function to call all above and attach it to BODY onload event


function initial_selection( )  {

Select_Row();
Filter_N_Unhide(Get_Product());

};

 

        </head>

        <body onload="initial_selection();" >

            <bi:QUERY_VIEW_DATA_PROVIDER name="DP_1" >

 

 

See attached EPM_DEMO Web Application templete for complete implementation details (rename to EPM_DEMO.bisp before upload to WAD)

Sometimes you face such issues in SAP BW which may drive you crazy and this deadlock issue is one of them. I have recently resolved this infamous dump so decided to share my experience with you all. Before any further delay, let me tell you the system & database details about my system.

 

Component/SystemValues
SAP_BW740
Database SystemMSSQL
Kernel Release741
Sup.Pkg lvl.230

 

Let me first explain what is deadlock.

A database deadlock occurs when two processes lock each other's resources and are therefore unable to proceed.  This problem can only be solved by terminating one of the two transactions.  The database more or less at random terminates one of the transactions.

Example:

Process 1 locks resource A.

Process 2 locks resource B.

Process 1 requests resource A exclusively (-> lock) and waits for process 2 to end its transaction.

Process 2 requests resource B exclusively (-> lock) and waits for process 1 to end its transaction.

For example, resources are table records, which are locked by a modification or a Select-for-Update operation.

Following dump is expected when you will upload master data attribute.

Dump1.jpg

Sometimes you might encounter this dump too.

Dump2.jpg

 

Solution:

In order to avoid this issue please make sure that your DTP does not have semantic grouping ON and it's processing mode should be "Serially in the Background Process". To be on the safe side, I would recommend to create new DTP with these settings.

 

 

Please let me know if you find this blog helpful or not.

 

P.S. This was related to time-dependent master data.

Actions

Filter Blog

By author:
By date:
By tag: