简体   繁体   中英

String template to set the default value of PARAMETER

Is it possible, in ABAP, to evaluate string templates dynamically?

Normally, you will have some string template in code that will be checked by the compiler. (The variables in the curly brackets are checked by the compiler at compile time).

However, is it possible to have a string evaluated at runtime?

So, instead of:

data(val) = |System ID: { sy-sysid }|.

I would like the string to be interpolated to come from elsewhere, for example:

parameter: p_file type string lower case default '/mnt/{ sy-sysid }/file.txt'.

In this case, I would like to have the value of p_file to be evaluated at runtime to substitute the variable ( sy-sysid ) with the runtime value.

You could, of course, program your own substitution by finding all occurrences of variables with curly brackets with a regex expression, then evaluate the variable values with ASSIGN and substitute them back into the string, but I am looking for a built-in way to do this.

Sorry, this is maybe a stupid example, but hopefully you understand what I mean. (If not, please let me know in the comments and I will try and clarify).

The problem in your snippet is not with string template but with PARAMETER behavior. It does not allow dynamics in DEFAULT clause.

To achieve what you want you should use INITIALIZATION and set path value in runtime:

parameter: p_file type string lower case.

INITIALIZATION.
p_file = | /mnt/{ sy-sysid }/file.txt |.

Unfortunately, the example you gave, does not make any sense to me. ABAP String templates are evaluated at run-time and type-checked at compile-time. In your example, it is always the run-time value of SY-SYSID that will be written to the variable.

I guess what you want to do is circumvent compile-time checks for expressions inside a string template. Please try to give us your actual use case, so maybe we find an even better solution to your problem.

However, here is what I think could help you:

Personally, I do not recommend to write code like the one below, because it is extremely error-prone likely to mislead other programmers and because there is very likely a better solution.

Given that you know the name of a variable at run-time, try this:

".. say LV_VARNAME is a charlike variable that contains a
"   variable name at runtime.

"NOTE that the variable LV_VARNAME must be visible in the scope of the
"following code.

FIELD-SYMBOLS: <my_var> TYPE any.

ASSIGN (lv_varname) TO <my_var>.

DATA(lv_str) = |The value is { <my_var> }|.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM