Abap 在single Select中选择5个最新的非活动状态通知?

Abap 在single Select中选择5个最新的非活动状态通知?,abap,opensql,Abap,Opensql,我需要选择链接到设备的5个最新通知,但我还需要检查状态DLFL I0076-删除标志是否未激活或不存在 我认为这应该很简单,但我有点困惑,因为状态DLFL有3个可能的选项 存在于JEST表中,初始标记为非活动。 存在于JEST表中,不活动标志=X.->有效记录 在JEST表中不存在。->有效记录 我只通过选择所有历史记录通知,然后删除状态为DLFL active的通知(如下面的代码中所示)来获得最后5条,但这意味着我从过去20年中选择了数百行,仅使用5条 你如何避免这种情况 SELECT qmn

我需要选择链接到设备的5个最新通知,但我还需要检查状态DLFL I0076-删除标志是否未激活或不存在

我认为这应该很简单,但我有点困惑,因为状态DLFL有3个可能的选项

存在于JEST表中,初始标记为非活动。 存在于JEST表中,不活动标志=X.->有效记录 在JEST表中不存在。->有效记录 我只通过选择所有历史记录通知,然后删除状态为DLFL active的通知(如下面的代码中所示)来获得最后5条,但这意味着我从过去20年中选择了数百行,仅使用5条

你如何避免这种情况

SELECT qmnum, erdat, stat FROM viqmel
  LEFT OUTER JOIN jest ON jest~objnr = viqmel~objnr
                      AND jest~inact = @abap_false
                      AND jest~stat  = 'I0076'
  WHERE viqmel~equnr = @equi "Input parameter
    AND viqmel~kzloesch = @abap_false
  ORDER BY erdat DESCENDING
  INTO TABLE @DATA(equi_notifs).

DATA equi_notifs_valid LIKE equi_notifs.
LOOP AT equi_notifs ASSIGNING FIELD-SYMBOL(<equi_notif>) WHERE stat IS INITIAL.
  equi_notifs_valid = VALUE #( BASE equi_notifs_valid ( <equi_notif> ) ).
  IF lines( equi_notifs_valid ) >= 5.
    EXIT.
  ENDIF.
ENDLOOP.

您的第二个循环没有意义,因为您只加入了那些具有非活动I0076状态的JEST行,从而产生了一个逻辑错误,因此在您的数据集中根本不会捕获没有状态I0076的设备,并且您的循环条件永远不会满足

解决方案是将状态条件移动到何处,并在那里进行过滤

为什么不使用建筑

SELECT qmnum, erdat, stat FROM viqmel
  LEFT OUTER JOIN jest ON jest~objnr = viqmel~objnr
 WHERE viqmel~kzloesch = @abap_false
   AND ( jest~inact = @abap_true
   AND   jest~stat  = 'I0076' ) OR
  NOT EXISTS ( SELECT * FROM jest WHERE jest~objnr = viqmel~objnr AND jest~stat = 'I0076' )
  ORDER BY erdat DESCENDING
  INTO TABLE @DATA(equi_notifs)
  UP TO 5 ROWS.
此外,还消除了丑陋的循环


顺便说一句,你提到你只需要未删除的设备线,是吗?为什么在inact中使用abap\U false,可能它应该是abap\U true?

嗨,我认为我的第二个循环是有意义的,我测试了它。我的选择是一个左外连接,因此I0076处于活动状态的行将在STAT字段中有一个值,而状态未找到或处于非活动状态的行将没有值。我测试了它,它似乎工作,得到一行,即使有多个状态。我已经尝试了一个类似于SELECT中的解决方案,但它不起作用,因为JEST表可以有其他状态,所以它会在每个状态下返回1行,而不是I0076,即使对于启用了I0076的通知也是如此。在我看来,我的代码可以工作,但效率不高。这取决于数据集,我无法真正测试您的案例,因为我的qmel表不允许对同一个对象使用多个notif,这很奇怪。将示例数据集发布到verifyQMEL/VIQMEL,每个objnr只有一条记录,但JEST表有多条记录,当您执行左外部联接+不存在时,SELECT会为每个不同于I0076的JEST状态返回一条记录。这就是为什么我必须首先选择所有记录,然后过滤状态是否为活动状态,以便只获取5条最近的有效记录。QMEL/VIQMEL每个objnr只有1条记录,然后使用日期的方法没有意义,您不是为objnr选择5条最后状态,而是为不同的objnr选择5条通知,这是没有意义的。我无法想象这样的担心有什么用,我想我没有正确地解释我自己。但是我的示例SELECT正在获取所有与设备ID@equi链接的通知。然后,循环仅采用DLFL状态为not active的最近5次。我想避免首先选择所有链接通知,直接获取5个最新的有效通知,但我还没有成功。我不想选择任何状态,我只需要它们进行筛选,我期望的最终结果是一个包含5个通知ID的有效列表。