Where
Even if you don’t familiar with JavaScript templating engines which of the following statements is more straight forward and clear?
JavaScript language in templating engine & LiveCycle Designer
In the left part of the image is easy to find IF statement. On the right part we have to “drilldown” to the source code and then try to refresh our memory JS syntax (or even FormCalc). Maybe in SAP world instead of these scripting languages ABAPScript would be more suitable?
How
Perhaps in reports already prepared data will be the best choice for templates (or views in MVC terminology).
Imagine we already have the structure like that
and just want to add a.m. or p.m. texts for the TIME field. We can easily create new “TIME_AMPM TYPE STRING” field to a model.
But a view already has necessary the TIME field. So could we change responsibility from a model to a view?
In the other words is it possible to move ABAP code to a Pdf or Excel template itself?
DATA(result) = COND #( WHEN value-time GE '120000'
THEN 'post meridiem'
ELSE 'ante meridiem' ).
Do you think a view like that will be more readable than FormCalc script. Don’t you?
No FormCalc nor JavaScript
No VBA. Just familiar COND #( )
In dynamic script the special “value” filed refers to the whole structure.
Let’s take a look to the R-T table. Usually there was a special field in ts_rand_data structure for numeration. Something like that “index TYPE sytabix,”
" Random table data
BEGIN OF ts_rand_data,
group TYPE string,
caption TYPE string,
date TYPE d,
sum1 TYPE bf_rbetr, " P with sign
sum2 TYPE bf_rbetr, " P with sign
END OF ts_rand_data,
tt_rand_data TYPE STANDARD TABLE OF ts_rand_data WITH DEFAULT KEY,
" Document structure
BEGIN OF ts_root,
title TYPE string,
t TYPE tt_rand_data, " internal flat table ( In template {R-T} )
date TYPE d, " 8
time TYPE t, " 6
datetime TYPE cpet_reftimestamp, " 14 = date(8) + time(6)
END OF ts_root.
Now we can omit the entire condition with WHEN part and use sy-tabix system filed.
You can freely use any ABAP expression that returns a result.
Technical implementation
As you already guessed under the hood for every structure with cond expression the XTT library calls GENERATE SUBROUTINE to create SUBROUTINEs and then PERFORM them.
◉ a maximum of 36 temporary subroutine pools can be created. That’s why within the R structure you can use up to 36 nested tables & structures with cond expression.
◉ If template script doesn’t have leading WHEN statement it will be executed as is. VALUE #( ) REDUCE #( ) etc are not prohibited
◉ For sake of backwards compatibility COND statement converted to IF-ELSE(ELSEIF)-ENDIF. “&&” converted to CONCATENATE (string templates |{…}| remain as is)
Catching errors
What happens if the expression throws an exception?
For example, should line_exists() be checked before table [key]?
Exceptions in COND are caught. And an empty value of a certain type will be returned.
In DEV & QAS, a warning window will pop up
In PROD, the report will behave “quietly”
No comments:
Post a Comment