3

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

场景是我有一个调用函数模块的简单报表。我收到LV_MSG类型为变量的导出参数CHAR1。这表示在程序中创建了某个状态消息,例如F(失败)、X(匹配)或E(错误)。我目前使用一条CASE语句来打开LV_MSG并用消息的简短描述填充另一个变量。这些描述被维护为我在编译时检索的文本符号,text-MS#其中 # 与 的可能返回相同LV_MSG,例如text-MSX具有值“找到精确匹配”。

现在在我看来,整个CASE语句是不必要的,因为我可以将带有 ID 的文本符号的值分配给我的描述变量'MS' + LV_MSG(伪代码,将使用CONCATENATE)。现在我的问题是如何在运行时根据其 ID 的字符串表示形式找到文本符号。这甚至可能吗?

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

4

2 回答 2

2

就个人而言,我可能会定义一个域并使用域的固定值来表示这些值。这样,您甚至可以绕过字符串连接。您可以使用功能模块DD_DOMVALUE_TEXT_GET轻松访问域值的语言相关文本。

要访问程序的文本元素,请使用类似READ_TEXT_ELEMENTS.

请注意,像这样的通用编程肯定会减慢您的程序。它是否会让你的代码看起来更干净是旁观者的看法——如果值很少改变,我不明白为什么一个简单的CASE语句应该不如一些通用的文本访问。

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

于 2013-11-06T13:26:58.313 回答