使用ID以编程方式获取文本符号

时间:2013-11-06 08:54:18

标签: sap abap

有没有办法以编程方式在运行时获取文本符号的值?

场景是我有一个调用功能模块的简单报告。我在类型为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表示找到文本符号。这甚至可能吗?

如果是,我的代码看起来会更清晰,在功能模块中添加新消息时我不必更新我的实际代码,因为我只需要添加一个新的文本符号。但这种方法会更快,还是会降低报告的性能?

2 个答案:

答案 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指出的那样,这可能不是最好的解决方案,对于错误处理而是使用消息类或异常对象。这在其他情况下很有用,但现在你知道如何。