Dynamic CX系统结构组件名称=>;使用RTT创建类型时,\u名称中的\u字符\u非法

Dynamic CX系统结构组件名称=>;使用RTT创建类型时,\u名称中的\u字符\u非法,dynamic,abap,rtts,Dynamic,Abap,Rtts,我正在尝试使用RTTS类构建一个动态类型。我构建了一个组件表,其中包含列名'COL\u 1','COL\u 2'等等。。。在第73行的标准方法CL\u ABAP\u STRUCTDESCR=>CREATE()中,类型创建失败: if comp-name+off(1) cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' or comp-name+off(*) cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'. *

我正在尝试使用RTTS类构建一个动态类型。我构建了一个组件表,其中包含列名
'COL\u 1'
'COL\u 2'
等等。。。在第73行的标准方法
CL\u ABAP\u STRUCTDESCR=>CREATE()
中,类型创建失败:

       if comp-name+off(1) cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' or
          comp-name+off(*) cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'.
*        illegal character in component name
         raise exception type CX_SY_STRUCT_COMP_NAME
           exporting textid = CX_SY_STRUCT_COMP_NAME=>illegal_char_in_name
                     component_name = comp-name
                     component_number = comp_no.
comp name
的验尸价值为
colu 1
。如您所见,字符是有效的。我不明白这里的IF条件怎么可能是真的

在以完全相同的方式调用此方法之前,我在自己的模块中测试了列名的有效性,IF条件在那里返回FALSE

复制此错误的最少代码:

  DATA: ty_output       TYPE REF TO CL_ABAP_STRUCTDESCR,
        it_output       TYPE REF TO DATA,    
        wa_comp         TYPE cl_abap_structdescr=>component,
        it_comp         TYPE cl_abap_structdescr=>component_table,
        c_index         TYPE string.

  DO 7 TIMES.
    c_index = sy-index.
    CONCATENATE 'COL_' c_index INTO wa_comp-name.
    IF wa_comp-name(*) cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890'.
      WRITE 'NO'. " <= This branch is entered.
    ENDIF.
    IF 'COL_1' cn 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890'.
      WRITE 'NO'. " <= This branch is NOT entered.
    ENDIF.
    wa_comp-type = CL_ABAP_ELEMDESCR=>GET_STRING( ).
    APPEND wa_comp TO it_comp.
  ENDDO.

  ty_output = cl_abap_structdescr=>create( it_comp ).
  CREATE DATA it_output TYPE HANDLE ty_output.
DATA:ty_输出类型REF到CL_ABAP_STRUCTDESCR,
it_输出类型参考数据,
组件类型cl\U abap\U structdescr=>组件,
it_comp TYPE cl_abap_structdescr=>组件表,
c_索引类型字符串。
做7次。
c_指数=sy指数。
将“COL_uu”c_索引连接到wa_comp-name中。
如果公司名称(*)为'ABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890'。

写“不”。“这是由于将
sy index
(整数)转换为
c_index
(字符串)在
wa_comp-name
的末尾添加了一个不可见字符造成的


sy index
转换为
n
类型的变量而不是
string
解决了问题。

仅从代码看,我猜问题在于索引是string类型的组合,连接和if'comp name+off(*)中的第二个条件“.连接帮助:如果目标字段结果具有固定长度,且该长度大于所需长度,则字段右侧将填充空格或十六进制0。如果尝试以整数形式连接索引,则会收到一条关于类型不兼容的错误消息,因此显式转换为字符串(你是对的,这就是导致错误的原因。)最好使用带有隐式转换的字符串模板,而不是串联:wa_comp-name=|COL|sy index}|。“不可见字符”实际上只是一个尾随空格,只是你没有注意它,它对应于符号,空格代表正数(请参见隐式转换目标I,它不会显示在调试器中该变量的值字段中。您必须检查长度和十六进制值才能注意到它。很遗憾,我的系统不支持模板。