如何在ABAP中获取内部表的行数?

40

我怎样获取内部表的行数?我猜可以通过循环来实现。但肯定有更简单的方法。

我不知道是否有差别,但代码应该在4.6c版本上运行。

9个回答

98

这个任务还有一个内置函数:

variable = lines( itab_name ).

就像IronGoofy所描述的“纯”ABAP语法一样,函数“lines()”将表itab_name的行数写入变量中。


8
由于您可以将其用作内联操作,因此此选项远优于“describe”。例如:如果行(itab)> 0,则 itab [1] -text ='Potato'。endif。coeff = lines(lt_relevant)/ lines(lt_all) - Zero

57

你可以使用以下函数:

 DESCRIBE TABLE <itab-Name> LINES <variable>
在调用之后,变量包含内部表的行数。

14

除了推荐的

DESCRIBE TABLE <itab-Name> LINES <variable>

还有系统变量SY-TFILL

根据文档:

在执行 DESCRIBE TABLE、LOOP AT 和 READ TABLE 语句之后,表示被访问的内部表的行数。

示例脚本:

REPORT ytest.

DATA pf_exclude TYPE TABLE OF sy-ucomm WITH HEADER LINE.

START-OF-SELECTION.
  APPEND '1' TO pf_exclude.
  APPEND '2' TO pf_exclude.
  APPEND '3' TO pf_exclude.
  APPEND '4' TO pf_exclude.

  WRITE: / 'sy-tfill = ', sy-tfill.

  DESCRIBE TABLE pf_exclude.
  WRITE: / 'sy-tfill = ', sy-tfill, 'after describe table'.

  sy-tfill = 0. "Reset
  READ TABLE pf_exclude INDEX 1 TRANSPORTING NO FIELDS.
  WRITE: / 'sy-tfill = ', sy-tfill, 'after read table'.


  sy-tfill = 0. "Reset
  LOOP AT pf_exclude.
    WRITE: / 'sy-tfill = ', sy-tfill, 'in loop with', pf_exclude.
    sy-tfill = 0. "Reset
  ENDLOOP.

结果:

sy-tfill =           0
sy-tfill =           4  after describe tabl
sy-tfill =           4  after read table
sy-tfill =           4  in loop with 1
sy-tfill =           0  in loop with 2
sy-tfill =           0  in loop with 3
sy-tfill =           0  in loop with 4
请注意第二个输入的值为0: SY-TFILL仅在第一个循环后更新,而不是每一步更新。
我建议只在READ(1)后直接使用SY-TFILL。如果READ和使用SY-TFILL之间有其他命令,则始终存在更改系统变量的风险。
(1)或描述表格。

3

0

功能模块EM_GET_NUMBER_OF_ENTRIES还将提供行数。它需要1个参数-表名。


这个函数模块允许您读取数据库表中的行数。问题是关于内部表的行数。 - Gregor Wolf

-1

你也可以使用OPEN Sql语句来使用COUNT分组子句查找行数,此外还有系统字段SY-LINCT可用于计算表格的行数。


8
内部表(根据问题)并不是数据库表。COUNT 用于计算数据库表中的行数(因此与问题无关)。 - tomdemuyt

-2

如果我正确理解你的问题,你想在一个条件循环中知道内部表的行号。

如果你使用内部表,你可以使用系统变量sy-tabix。如果你需要更多信息,请参考ABAP文档(特别是有关内部表处理的章节)。

示例:

LOOP AT itab INTO workarea
        WHERE tablefield = value.

     WRITE: 'This is row number ', sy-tabix.

ENDLOOP.

3
注意谨慎使用sy-tabix,它会在每次LOOP、READ TABLE等调用时更新,并且有时可能会出现意外的值。 - franblay

-2
data: vcnt(4).

clear vcnt.

LOOP at itab WHERE value = '1'.
  add 1 to vcnt.
ENDLOOP.

答案将是3. (vcnt = 3)。


5
这会占用CPU资源,比使用“DESCRIBE”或“lines()”更糟糕。 - tomdemuyt

-3

我认为没有适用于这种结果的SAP参数。但是下面的代码可以实现。

LOOP AT intTab.

  AT END OF value.

    result = sy-tabix.

    write result.  

  ENDAT.

ENDLOOP.

3
这个操作需要大量的 CPU 资源,比使用 DESCRIBElines( ) 更糟糕。 - tomdemuyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接