Почему тип не совместим? - PullRequest
3 голосов
/ 15 мая 2019

У меня есть трехмерная таблица (таблица с вложенной таблицей), и моя цель состоит в том, чтобы удалить строки во внутренней таблице, которые имеют FIELDNAME, равный 'SCAN_ID':

TYPES : BEGIN OF ty_cell,
          fieldname TYPE lvc_fname,
        END OF ty_cell,
        ty_celltab TYPE STANDARD TABLE OF ty_cell WITH EMPTY KEY.
TYPES : BEGIN OF ty_line,
          celltab TYPE ty_celltab,
        END OF ty_line,
        zatool_t_doc_input TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.

DATA(it_doc_input) = VALUE zatool_t_doc_input( ( celltab = VALUE #( ( fieldname = 'SCAN_ID' ) ) ) ).

DATA(rt_doc_input) = REDUCE zatool_t_doc_input( " <=== line of syntax error
      INIT lt_doc_input = VALUE zatool_t_doc_input( )
      FOR ls_doc_input IN it_doc_input
      NEXT lt_doc_input = VALUE #( 
            BASE ls_doc_input 
            celltab = FILTER #( 
                  ls_doc_input-celltab 
                  WHERE fieldname <> CONV lvc_fname( 'SCAN_ID' ) ) ) ).

Компилятор выдает следующую синтаксическую ошибку:

Тип "LS_DOC_INPUT" не может быть преобразован в тип "LT_DOC_INPUT"

Где находится ошибка?

1 Ответ

4 голосов
/ 16 мая 2019

Используя "понимание таблицы", как показано ниже, вы можете получить таблицу с отфильтрованными ярлыками:

TYPES:
  BEGIN OF zatool_t_doc_input_s,
    field1  TYPE c,
    field2  TYPE c,
    celltab TYPE lvc_t_styl,
  END OF zatool_t_doc_input_s,
  zatool_t_doc_input TYPE STANDARD TABLE OF zatool_t_doc_input_s WITH EMPTY KEY.

DATA(it_doc_input) = VALUE zatool_t_doc_input(
                      ( field1 = 'A' field2 = 'B' celltab = VALUE #( ( fieldname = 'SCAN_ID' ) ) )
                      ( field1 = 'C' field2 = 'D' celltab = VALUE #( ( fieldname = 'USER_ID' ) ) )
                      ( field1 = 'C' field2 = 'D' celltab = VALUE #( ( fieldname = 'SCAN_ID' ) ) )
                      ( field1 = 'E' field2 = 'F' celltab = VALUE #( ( fieldname = 'SYST_ID' ) ) )
                     ).

DATA(rt_doc_input) =  VALUE zatool_t_doc_input(
                      FOR ls_doc_input IN it_doc_input (
                        VALUE #( BASE ls_doc_input
                                 celltab = FILTER #( ls_doc_input-celltab
                                           WHERE fieldname <> CONV lvc_fname( 'SCAN_ID' ) ) ) ) ).

Что касается синтаксической ошибки, как указывает @Florian, проблема в том, что при использовании BASE со структурой (в данном случае ls_doc_input) соответствующий VALUE #( возвращает структуру. Если VALUE возвращает таблицу, BASE также должна использовать таблицу.

Независимо от того, даже если вы обойдете синтаксическую ошибку BASE с чем-то вроде этого

DATA(rt_doc_input) =
  REDUCE #( INIT lt_doc_input = VALUE zatool_t_doc_input( )
            FOR ls_doc_input IN it_doc_input
            NEXT lt_doc_input = VALUE #( ( field1  = ls_doc_input-field1
                                           field2  = ls_doc_input-field2
                                           celltab = FILTER #( ls_doc_input-celltab
                                                     WHERE fieldname <> CONV lvc_fname( 'SCAN_ID' ) ) 
                                       ) ) 
           ). "reduces the original table to a single line (albeit with celltab filtered)

или даже эквивалент, используя BASE, чтобы избежать отдельного назначения поля

DATA(rt_doc_input) =
  REDUCE #( INIT lt_doc_input = VALUE zatool_t_doc_input( )
            FOR ls_doc_input IN it_doc_input
            NEXT lt_doc_input =
              VALUE #(
                ( VALUE #( BASE ls_doc_input
                           celltab = FILTER #( ls_doc_input-celltab
                                     WHERE fieldname <> CONV lvc_fname( 'SCAN_ID' ) )
                          ) "VALUE: table line using BASE
                ) " VALUE: table row
              ) "VALUE: table
           ). "reduces the original table to a single line (albeit with celltab filtered)

он по-прежнему не будет делать то, к чему, как я предполагаю, вы стремитесь, поскольку он уменьшит it_doc_input до одной строки.

...