顾问发给我这个代码示例,就像他期望得到的东西一样。
SELECT m1~vbeln_im m1~vbelp_im m1~mblnr smbln
INTO CORRESPONDING FIELDS OF TABLE lt_mseg
FROM mseg AS m1
INNER JOIN mseg AS m2 ON m1~mblnr = m2~smbln
AND m1~mjahr = m2~sjahr
AND m1~zeile = m2~smblp
FOR ALL ENTRIES IN lt_vbfa
WHERE
AND m2~bwart = '102'
AND 0 = ( select SUM( ( CASE
when SHKZG = 'S' THEN 1
when SHKZG = 'H' THEN -1
else 0
END ) *MENGE ) MENGE
into lt_mseg-summ
from mseg
where
VBELN_IM = m1~vbeln_im
and VBELP_IM = m1~vbelp_im
).
问题 - 我没有看到它在当前语法中应该如何工作。我认为将内部选择和使用它作为条件分离到主要的...但是有没有一种正确的方法来编写这种嵌套结构? 附:我得到它 - 如果嵌套语句= 0,那么主查询执行,这里的问题 - 嵌套语句中的情况,它甚至可能在ABAP中?并且逻辑规定,此检查可以在主SQL查询之外使用。但我对ABAP很新手,所以我给其他可能的解释留下了空间。
答案 0 :(得分:2)
您获得的逻辑是Native / Open SQL的一部分,并且存在一些您需要注意的缺点。
对我来说,我会研究一种更好的方法来捕获在开放/本机sql之外表现更好的数据。
如果你想继续使用这种类型的逻辑,下面是一些应该有用的链接。有一个示例选择使用带有case语句的嵌套选择。 Test Program Example Logic
答案 1 :(得分:0)
这可能是您所需要的,至少从ABAP 750开始有效。
SELECT vbeln UP TO 100 ROWS
FROM vbfa
INTO TABLE @DATA(lt_vbfa).
DATA(rt_vbeln) = VALUE range_vbeln_va_tab( FOR GROUPS val OF <line> IN lt_vbfa GROUP BY ( low = <line>-vbeln ) WITHOUT MEMBERS ( sign = 'I' option = 'EQ' low = val-low ) ).
SELECT m1~vbeln_im, m1~vbelp_im, m1~mblnr, m2~smbln
INTO TABLE @DATA(lt_mseg)
FROM mseg AS m1
JOIN mseg AS m2
ON m1~mblnr = m2~smbln
AND m1~mjahr = m2~sjahr
AND m1~zeile = m2~smblp
WHERE m2~bwart = '102'
AND m1~vbeln_im IN ( SELECT vbelv FROM vbfa WHERE vbelv IN @rt_vbeln )
GROUP BY m1~vbeln_im, m1~vbelp_im, m1~mblnr, m2~smbln
HAVING SUM( CASE m1~shkzg WHEN 'H' THEN 1 WHEN 'S' THEN -1 ELSE 0 END * m1~menge ) = 0.
是的,在一个SELECT中不可能进行聚合和FOR ALL ENTRIES
,但是您可以使用范围和子查询来欺骗系统。另外,您不需要三个联接即可汇总反向文档,这里的SUM子查询是多余的。
如果您不仅需要按交货号来选择文件,还需要按位置来选择文件,那肯定会更加复杂。