4

顾问给我发了这个代码示例,这是他希望得到的东西

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 查询之外使用。

欢迎任何建议。

4

2 回答 2

2

给您的逻辑是 Native/Open SQL 的一部分,并且有一些您需要注意的缺点。

  1. 您显示的语句必须放在 EXEC SQL 和 ENDEXEC 之间。
  2. 逻辑取决于平台。
  3. 在 EXEC 和 ENDEXEC 之间没有执行语法检查
  4. 这个的执行绕过了数据库缓冲过程,所以它的速度较慢

对我来说,我会研究一种更好的方法来捕获在开放/原生 sql 之外表现更好的数据。

如果您想继续使用这种类型的逻辑,以下是一些应该会有所帮助的链接。有一个使用带有 case 语句的嵌套选择的示例选择。 测试程序 示例逻辑

于 2016-03-26T09:09:40.630 回答
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.

是的,聚合并且FOR ALL ENTRIES在一个 SELECT 中是不可能的,但是您可以使用范围和子查询来欺骗系统。此外,您不需要三个连接来汇总反向文档,您的 SUM 子查询在这里是多余的。

如果您不仅需要按交货编号而且还需要按位置选择文件,这肯定会更加复杂。

于 2020-03-23T16:32:54.907 回答