CX_SY_STRUCT_COMP_NAME => invalid_char_in_name при создании типа с RTTS - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь построить тип Dynami c с использованием классов 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-name равно COL_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.

1 Ответ

1 голос
/ 27 мая 2020

Это было вызвано преобразованием sy-index (целое число) в c_index (строка) с добавлением невидимого символа в конце wa_comp-name.

Приведение sy-index к переменной типа n вместо string решил проблему.

...