Filter 如何从表中筛选未配对的行?

Filter 如何从表中筛选未配对的行?,filter,abap,internal-tables,Filter,Abap,Internal Tables,我在SAP中创建了下表: 如果员工已登录(KOMMEN),但未注销(GEHEN),如何仅打印这些行 在本例中,我只想打印最后一行。您使用的输出方法称为ABAP list output。ABAP中有许多不同的输出方法。列表输出只有一个。在您的案例中,此列表输出的缺点是,添加过滤器取决于开发人员。也就是说,ABAP列表输出中没有用于过滤特定值的默认功能。这种输出方法非常简单 就像在评论中所说的,你应该更改你的ABAP代码,并在循环中“手动”进行过滤。举个例子: LOOP AT lt_employe

我在SAP中创建了下表:

如果员工已登录(KOMMEN),但未注销(GEHEN),如何仅打印这些行


在本例中,我只想打印最后一行。

您使用的输出方法称为ABAP list output。ABAP中有许多不同的输出方法。列表输出只有一个。在您的案例中,此列表输出的缺点是,添加过滤器取决于开发人员。也就是说,ABAP列表输出中没有用于过滤特定值的默认功能。这种输出方法非常简单

就像在评论中所说的,你应该更改你的ABAP代码,并在循环中“手动”进行过滤。举个例子:

LOOP AT lt_employees INTO ls_employee
  WHERE komgeh = 'KOMMEN'.
  WRITE: / ls_employee-mandt, 
           ls_employee-id,
           ls_employee-pnr,
           ls_employee-komgeh,
           ls_employee-datum,
           ls_employee-uhrzeit.
ENDLOOP.
请注意,还可以过滤内部表格中的“KOMMEN”值。您可以在循环中想到IF语句。无论如何,在LOOP语句中应用WHERE子句是筛选内部表最有效的方法之一


此外,由于您没有发布代码,您需要将我在代码段中使用的名称转移到您的代码中。

您使用的输出方法称为ABAP list output。ABAP中有许多不同的输出方法。列表输出只有一个。在您的案例中,此列表输出的缺点是,添加过滤器取决于开发人员。也就是说,ABAP列表输出中没有用于过滤特定值的默认功能。这种输出方法非常简单

就像在评论中所说的,你应该更改你的ABAP代码,并在循环中“手动”进行过滤。举个例子:

LOOP AT lt_employees INTO ls_employee
  WHERE komgeh = 'KOMMEN'.
  WRITE: / ls_employee-mandt, 
           ls_employee-id,
           ls_employee-pnr,
           ls_employee-komgeh,
           ls_employee-datum,
           ls_employee-uhrzeit.
ENDLOOP.
请注意,还可以过滤内部表格中的“KOMMEN”值。您可以在循环中想到IF语句。无论如何,在LOOP语句中应用WHERE子句是筛选内部表最有效的方法之一


此外,由于您没有发布代码,您需要将我在代码片段中使用的名称转移到您的代码中。

假设表的结构与您提供的屏幕一样简单,您可以使用simple
GROUP
子句计算未配对登录(
KOMMEN
)事件:


此解决方案工作的先决条件是,如果用户结束了会话,则记录数为偶数,如果用户未结束会话,则记录数为奇数(仅登录)。

假设表的结构与您提供的屏幕一样简单,您可以使用simple
GROUP
子句计算未配对登录(
KOMMEN
)事件:

此解决方案工作的先决条件是,如果用户结束了会话,则记录数为偶数;如果用户未结束会话,则记录数为奇数(仅登录)。

按数据升序对lt\u数据进行排序
PNR上升
库格下降。
在lt_数据赋值字段-SYMBOL()处循环,其中k_g='KOMMEN'。
lv_tabix=sy tabix+1。
读取表lt_数据分配字段-SYMBOL()索引lv_tabix。
如果sy subrc不是首字母
或-基准-基准
或-pnr-pnr。
附加到lt_输出。
恩迪夫。
结束循环。
然后您就有了在lt\u输出中需要的所有行。

按数据升序对lt\u数据进行排序
PNR上升
库格下降。
在lt_数据赋值字段-SYMBOL()处循环,其中k_g='KOMMEN'。
lv_tabix=sy tabix+1。
读取表lt_数据分配字段-SYMBOL()索引lv_tabix。
如果sy subrc不是首字母
或-基准-基准
或-pnr-pnr。
附加到lt_输出。
恩迪夫。
结束循环。

然后,您就可以在lt_输出中获得您想要的所有行。

如果开发处于早期阶段,或者没有太多东西基于此表,我认为您应该重新设计解决方案,并在“会话”中进行思考。我想你的生活会轻松得多。这是我大学的家庭作业。因此不可能更改结构。有一个命令用于表上的条件循环(
LOOP…WHERE
)。但是,如果这是一个DB选项卡,您也可以将
WHERE
移动到您的
SELECT
,如果这是一个家庭作业,您迄今为止尝试了什么?@vwegert i更改了表结构(增加了两列1.登录,2.登录时间,3.注销,4.注销时间),然后使用WHERE子句(WHERE signout='')现在我只有登录但未注销的条目)但我的教授不允许对表结构进行任何更改:/如果开发处于早期阶段,或者没有太多内容基于此表,我认为您应该重新设计解决方案,并在“会话”中进行思考。我想你的生活会轻松得多。这是我大学的家庭作业。因此不可能更改结构。有一个命令用于表上的条件循环(
LOOP…WHERE
)。但是,如果这是一个DB选项卡,您也可以将
WHERE
移动到您的
SELECT
,如果这是一个家庭作业,您迄今为止尝试了什么?@vwegert i更改了表结构(增加了两列1.登录,2.登录时间,3.注销,4.注销时间),然后使用WHERE子句(WHERE signout='')现在我只有登录但未注销的条目)但我的教授不允许对表结构进行任何更改:/
   SORT lt_data BY datum ASCENDING
                   PNR   ASCENDING
                   K_G   DESCENDING.

    LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<line>) WHERE k_g = 'KOMMEN'.
      lv_tabix = sy-tabix + 1.

      READ TABLE lt_data ASSIGNING FIELD-SYMBOL(<temp>) index lv_tabix.

      IF sy-subrc IS NOT INITIAL
      OR <line>-datum <> <temp>-datum
      OR <line>-pnr   <> <temp>-pnr.
        APPEND <line> TO lt_output.
      ENDIF.
    ENDLOOP.