有没有办法以编程方式在运行时获取文本符号的值?
场景是我有一个调用功能模块的简单报告。我在类型为LV_MSG
的变量CHAR1
中收到导出的参数。这表示在程序中创建了某个状态消息,例如F
(失败),X
(匹配)或E
(错误)。我目前使用CASE
语句打开LV_MSG
并使用消息的简短描述填充另一个变量。这些描述保存为我在编译时使用text-MS#
检索的文本符号,其中#与LV_MSG
的可能返回值相同,例如text-MSX
的值为“Exact Match Found”
现在在我看来整个CASE
语句是不必要的,因为我可以为我的描述变量分配ID为'MS' + LV_MSG
的文本符号的值(伪代码,将使用{{1} })。现在我的问题是如何在运行时基于其ID的String表示找到文本符号。这甚至可能吗?
如果是,我的代码看起来会更清晰,在功能模块中添加新消息时我不必更新我的实际代码,因为我只需要添加一个新的文本符号。但这种方法会更快,还是会降低报告的性能?
答案 0 :(得分:2)
就个人而言,我可能会定义一个域并使用域的固定值来表示值。这样,你甚至可以绕过字符串连接。您可以使用功能模块DD_DOMVALUE_TEXT_GET
轻松访问域值的语言相关文本。
要访问程序的文本元素,请使用READ_TEXT_ELEMENTS
等功能模块。
请注意,这样的通用编程肯定会减慢您的程序速度。是否会让你的代码看起来更清晰是在旁观者的眼中 - 如果值很少改变,我不明白为什么简单的CASE
语句应该不如某些通用文本访问。
答案 1 :(得分:2)
希望我能正确理解你,但是这里有。这可能有点诡计,报告中的所有文本符号都被定义为程序中的变量(名称为text-abc,其中abc是文本ID)。所以你可以使用以下内容:
data: lt_all_text type standard table of textpool with default key,
lsr_text type ref to textpool.
"Load texts - you will only want to do this once
read textpool sy-repid into lt_all_text language sy-langu.
sort lt_all_Text by entry.
"Find a text, the field KEY is the text ID without TEXT-
read table lt_all_text with key entry = i_wanted_text
reference into lsr_text binary search.
如果您想要添加地址:
field-symbols: <l_text> type any.
data l_name type string.
data lr_address type ref to data.
concatenate 'TEXT-' lsr_text->key into l_name.
assign (l_name) to <l_text>.
if sy-subrc = 0.
get reference of <l_text> into lr_address.
endif.
正如vwegert指出的那样,这可能不是最好的解决方案,对于错误处理而是使用消息类或异常对象。这在其他情况下很有用,但现在你知道如何。