CX_SY_STRUCT_COMP_NAME=>当用RTTS创建一个类型时,非法的char_in_name。

问题描述 投票:1回答:1

我试图使用RTTS类建立一个动态类型。我已经建立了一个包含列名的组件表。'COL_1', 'COL_2' 以此类推... 类型创建在标准方法中失败 CL_ABAP_STRUCTDESCR=>CREATE( ) 在第73行。

       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-nameCOL_1. 如你所见,这些字符都是有效的。我不明白IF条件怎么会在这里为真。

在调用这个方法之前,我已经在我自己的模块中测试了列名的有效性,方法完全相同,IF条件返回FALSE。

用最小的代码重现这个bug 。

  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.
dynamic sap abap rtts
1个回答
1
投票

这是由于 sy-indexc_index 末尾加一个隐形字符。wa_comp-name.

铸造 sy-index 类型的变量。n 而不是 string 解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.