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)