Abap 为什么类型不兼容?

Abap 为什么类型不兼容?,abap,Abap,我有一个三维表(带有嵌套表的表),我的目标是删除内部表中具有FIELDNAME等于'SCAN\u 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, cellta

我有一个三维表(带有嵌套表的表),我的目标是删除内部表中具有
FIELDNAME
等于
'SCAN\u 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' ) ) ) ).
类型:ty_单元的开始,
字段名类型lvc_fname,
蒂尤牢房的尽头,
ty_celltab类型带有空键的ty_Cells的标准表。
类型:从ty_线开始,
celltab类型ty_celltab,
天佑线的尽头,
zatool\u t\u doc\u输入类型为空键的ty\u行标准表。
数据(it文档输入)=值zatool文档输入((celltab=VALUE)((fieldname='SCAN\u ID')))。
数据(rt_doc_input)=减少zatool_t_doc_input(“使用下面的“表格理解”,您可以获得带有过滤单元格选项卡的表格:

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' ) ) ) ) ).
或者甚至是同等的,使用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)
数据(rt\u文档\u输入)=
REDUCE#(INIT lt_doc_input=值zatool_t_doc_input()
对于ls\U doc\U在it中的输入\U doc\U输入
下一个lt\U文件\U输入=
价值观#(
(值#)(基本ls_文件输入)
celltab=过滤器#(ls_文档_输入-celltab)
其中fieldname CONV lvc_fname('SCAN_ID'))
)“值:使用基的表行
)“值:表行”
)“价值:表
)“将原始表格缩减为一行(尽管已过滤celltab)

它仍然不会达到我猜你的目标,因为它会将it文档输入减少到一行。

天哪。即使你能做到这一点,你也应该三思是否保留它。这是超级不可读的…-)lt_文档输入=值(基本ls_文档输入单元格选项卡=过滤器(ls_文档输入单元格选项卡…)。你真的可以使用结构(ls_doc_input)作为表(lt_doc_input)的基础吗?我已经修改了这个问题,使它与stackoverflow规则(+MCVE)匹配。现在回答起来更容易。你指出了正确的问题(就像@florian那样),但您的解决方案是删除BASE,这样它会改变OP代码的性质,而您不会准确回答。此外,我的缺点是,我在问题中添加了一些缺少的代码部分,以便使其成为MCVE,同时您也添加了一些不在问题中的代码(+field1,+field2)。也许您想编辑您的答案以更好地适应问题?嗨,桑德拉,我建议的解决方案在第二个代码块中。第一个代码块说明了如何绕过错误(正如@Florian first指出的那样),但同时,即使您绕过错误,也不会得到预期的结果(表格将缩减为一行)附加的代码(field1和field2)更好地反映了zero_编码的需要:我假设他有很多字段,希望跳过对每个字段的赋值。您的代码有一个语法错误:“意外运算符”,这是因为您的
ty_celltab
是散列的。如果更改为
排序的
,它应该编译吗?(我猜OP的实际类型是LVC_T___STYL,已排序)。我的错,你是对的,我在编辑问题时使用了
hash
,所以新编辑使用
standard
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)