Financial Management Blogs by SAP
Get financial management insights from blog posts by SAP experts. Find and share tips on how to increase efficiency, reduce risk, and optimize working capital.
cancel
Showing results for 
Search instead for 
Did you mean: 
james_lim
Product and Topic Expert
Product and Topic Expert
29,323
I am sorry for the late posting of this series but I had to take my vacation and needed to get some training about HANA :smile:
Let's start to learn how to caluate and write some data using the script logic.
Again, the script logic consists of 3 parts; Scoping, Calculationand Writing.

1. Basic concept of Writing and *REC statement


  As we saw in my first posting of this series, *REC statement is used for writing data.
  You need to keep in mind that *REC will create records based on the scoped records.

  For example, if your scoped record is same as below. 

 

    <Scoped record>
         EXTSALES, 2011.JAN, ACTUAL, USA, 10000

         and your *REC statement is below.
        *REC (FACTOR = 0.9, ACCOUNT="DISCOUNTED_EXTSALES", CATEGORY="BUDGET")

    Then your generated record will be 

    <Generated record>
        DISCOUNTED_EXTSALES, 2011.JAN, BUDGET, USA, 9000


  What if your scoped record is not a single one but multiple record?


    <Scoped record>
         EXTSALES, 2011.JAN, ACTUAL, USA,   10000
         EXTSALES, 2011.JAN, ACTUAL, KOREA, 3000
         EXTSALES, 2011.JAN, ACTUAL, CANADA, 5000

  Then your generated records will be 

    <Generated record>
         DISCOUNTED_EXTSALES, 2011.JAN, BUDGET, USA,    9000
         DISCOUNTED_EXTSALES, 2011.JAN, BUDGET, KOREA, 2700
         DISCOUNTED_EXTSALES, 2011.JAN, BUDGET, CANADA, 4500

  As you can see, we changed Account value, Category value and its signeddata vale (or measure value) using *REC statement.
  The other dimension that is not specified in the *REC statement will be same as scoped data so 2011.JAN and each country (entity) doesn't 
be changed.


2. Grammar of *REC statement.

   Here is the grammar of *REC statement. You can use FACTOR or EXPRESSION for various calculations for signeddata vale (or measure value).
   And specify dimension name and member to change its value.
 
   *REC[([FACTOR|EXPRESSION={Expression}[,{dim1}={member},{dim2}=?)] 

 
3. What is the difference between FACTOR and EXPRESSION?

   The FACTOR is a factor(multiply) by which the retrieved amount is to be multiplied.

   Here is an example.

    <Scoped record>
         EXTSALES, 2011.JAN, ACTUAL, 10000

         *REC(FACTOR=6/2)

    <Generated record>
         EXTSALES, 2011.JAN, ACTUAL, 30000

   What if you want to add or divide? then you should use EXPRESSION.
   The EXPRESSION is any formula that will result in the new value to post.
   The formula can include regular arithmetic operators, fixed values and the Script logic keyword %VALUE%
   this is representing the original retrieved value of the scoped record.

   Here is an example. 

    <Scoped record>
         EXTSALES, 2011.JAN, ACTUAL, 10000

         *REC(EXPRESSION=%VALUE% + 5000)

    <Generated record>
         EXTSALES, 2011.JAN, ACTUAL, 15000

Now we got the basic things of *REC statement but you may ask below questions.
  
   "There are some scoped data and I need to do different calculations based on each specific dimension member."
   "I need to copy a value to multiple destinations!" 
   "How can I get the value from the other application?"
   "I want to use some value from other records to calculate the result."
   "Can I use a property value to calculate the result?"


The script logic can handle above requirements.
I will explain first question in this post and will do others in the next post.

"There are some scoped data and I need to do some calculations based on each specific dimension member."

  
Yes. That's why *you MUST use *REC statement with *WHEN ~ *IS ~ *ELSE ~ *ENDWHEN statement.
Let's assume you want to create forecast values of salary and put it into the forecast category based on the country's actual salary values of January, 2011.
We need to increase 10% for US, 5% for Canada and 3% for other countries.
Let's assume ENTITY dimension has country information.
To do this, you need to scope first.
  
  *XDIM_MEMBERSET ACCT = SALARY
  *XDIM_MEMBERSET TIME = 2011.JAN
  *XDIM_MEMBERSET CATEGORY = ACTUAL
        
Now you need to write the *REC statements
   *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
   *REC(FACTOR = 1.05, CATEGORY=“FORECAST“) // 5%
   *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
Finally, you should specify a condition of each *REC statement.
For doing this, you MUST use *WHEN ~ *IS ~ *ELSE ~ ENDWHEN statement.

First, Write down *WHEN and *ENDWHEN outside of the *REC statement

     *WHEN 
           *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
           *REC(FACTOR = 1.05, CATEGORY=“FORECAST“)  // 5%
           *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
     *ENDWHEN

       NOTE : You don't need to use the indentation of code in the script logic
                 but I would like to recommend using it for better readability.

Second, write a dimension name that you want to compare next to *WHEN.
            In this example, it will be ENTITY dimension.

      *WHEN ENTITY
           *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
           *REC(FACTOR = 1.05, CATEGORY=“FORECAST“)  // 5%
           *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
     *ENDWHEN

Third, put *IS statement on top of each *REC statement and *ELSE statement on top of the last *REC statement.
           We need two *IS statements and   *ELSE statement because there are two conditions and others will be calculated as one condition.

      *WHEN ENTITY
            *IS
                  *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
            *IS
                  *REC(FACTOR = 1.05, CATEGORY=“FORECAST“)  // 5%
            *ELSE
                  *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
      ENDWHEN

Fourth, put each condition value next to *IS

 
      *WHEN ENTITY
            ***IS USA 
                  *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
            ***IS CANADA
                  *REC(FACTOR = 1.05, CATEGORY=“FORECAST“)  // 5%
            ***ELSE
                  *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
      *ENDWHEN

As a last step, put *COMMIT at end of the script so that logic engine can post data to Database.

so final version should be same as below code.
      *XDIM_MEMBERSET ACCT = SALARY
      *XDIM_MEMBERSET TIME = 2011.JAN
      *XDIM_MEMBERSET CATEGORY = ACTUAL
      *WHEN ENTITY
            ***IS USA 
                  *REC(FACTOR = 1.1, CATEGORY=“FORECAST“)  // 10%
            ***IS CANADA
                  *REC(FACTOR = 1.05, CATEGORY=“FORECAST“)  // 5%
            ***ELSE
                  *REC(FACTOR = 1.03, CATEGORY=“FORECAST“)  // 3%
      *ENDWHEN
      *COMMIT

       Note 1 : You can use multiple condition value like *IS VALUE_A, VALUE_B
       Note 2 : You can use >, <= with numeric value with *IS statement.  ex) *IS > 4
                   By default, it is equal (=) so it will be ok even though you don't specify it.
       Note 3 : can't use AND, OR and NOT with *IS
       Note 4 : " (double quotation) is not mandatory for comparing string value with *IS statement.
       Note 5 : *WHEN statement can be nested. For example,
               *WHEN xxx
                          *IS “A”
                                 *REC(…)
                                 *REC(…)
                          *IS “B”
                                 *REC(…)
                                 *WHEN yyy
                                         *IS “C”,”D”,”E”
                                                   *REC(…)
                                         *ELSE
                                                   *REC(…)
                                 *ENDWHEN
               *ENDWHEN

       Note 6 : You can use property value with *IS statement.  ex) *IS Intco.Entity
 

Now we finished learning 3 basic parts of the script logic.
As I explained you in the first post of this series, I hope you feel script logic is not too complex. :smile:
I will post a couple of advanced features like LOOKUP in the next post for answering other questions.
4 Comments