如何从表中过滤不成对的行?

时间:2017-06-04 16:02:00

标签: filter sap abap

我在SAP中创建了以下表格:

My Table

如何仅打印员工已登录(KOMMEN)但尚未退出(GEHEN)的这些行?

在这个例子中,我想只打印最后一行。

3 个答案:

答案 0 :(得分:0)

您使用的输出方法称为ABAP列表输出。 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”值。您可以在LOOP中考虑IF语句。无论如何在LOOP语句中应用WHERE子句是过滤内部表的最高效方法之一。

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

答案 1 :(得分:0)

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

SELECT PNR
  FROM table
  INTO TABLE @DATA(itab)
 GROUP BY PNR
 HAVING COUNT(*) = 1.

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

答案 2 :(得分:0)

   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.

然后你在lt_output中拥有你想要的所有行。