【问题标题】:SELECT query with one or multiple IF statements in ABAP在 ABAP 中使用一个或多个 IF 语句的 SELECT 查询
【发布时间】:2021-12-27 09:17:55
【问题描述】:

我正在开发一项网络服务。我有一个这样的 select 语句(它比这有更多的字段和 2 个连接,但为了保持简单):

SELECT acdoca~augbl,
       open_amount,    "I need to add value to this field based on the IF statement below
       acdoca~koart
FROM acdoca
      LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
                      AND acdoca~gjahr EQ bseg~gjahr
                      AND acdoca~buzei EQ bseg~buzei
                      AND acdoca~rbukrs EQ bseg~bukrs
INTO table @it_acdoca.

我需要添加这个 IF 语句:

IF bseg-KOART = 'D' or bseg-KOART = 'K' 
    IF acdoca-AUGBL is INITIAL THEN open_amount = DMBTR
        ELSE open_amount = 0
    ENDIF.
ELSE open_amount = 0
ENDIF.

我需要一个不会影响服务性能的答案。因为 ACDOCA 和 BSEG 是 SAP 中一些最大的数据库表。我尝试在 SELECT 之后使用 LOOP,然后在该 LOOP 中添加这个 IF,但这完全破坏了性能。

This Is What IT_ACDOCA table should look like after

希望快速回复。 最好的问候。

【问题讨论】:

  • 如果您担心 ACDOCA 性能,请使用CTECDS
  • 是的,不要直接使用 ACDOCA(或任何其他表)!它非常大,里面有很多语义,而且还在不断变化。您将 (a) 无法获得您想要的结果或 (b) 您的逻辑将在未来停止工作或 (c) 性能很糟糕。而是使用特定于您的用例的已发布 CDS 实体之一,例如 I_SalesOrderItem 或类似的。有了这个,您有 (1) 适当的授权检查,(2) 清除迁移路径以防发生变化,以及 (3) 您不必维护连接 :)

标签: sql if-statement select abap sap-erp


【解决方案1】:
DATA: BEGIN OF it_acdoca  OCCURS 0,
        augbl       TYPE acdoca-augbl,
        open_amount TYPE bseg-dmbtr,
        koart       TYPE acdoca-koart.
DATA: END OF it_acdoca.

SELECT acdoca~augbl,
       CASE WHEN ( bseg~koart EQ 'D' OR bseg~koart EQ 'K' ) AND acdoca~AUGBL is INITIAL THEN dmbtr
         ELSE 0
   END AS open_amount,
       acdoca~koart
FROM acdoca
      LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
                      AND acdoca~gjahr EQ bseg~gjahr
                      AND acdoca~buzei EQ bseg~buzei
                      AND acdoca~rbukrs EQ bseg~bukrs
INTO TABLE @it_acdoca.

如果您的版本不支持 CASE,您可以将您的语句添加到 JOIN 端,如下所示。

SELECT acdoca~augbl,
       dmbtr AS open_amount,
       acdoca~koart
FROM acdoca
      LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
                      AND acdoca~gjahr EQ bseg~gjahr
                      AND acdoca~buzei EQ bseg~buzei
                      AND acdoca~rbukrs EQ bseg~bukrs
                      AND ( bseg~koart EQ 'D' OR bseg~koart EQ 'K' )
                      AND acdoca~AUGBL is INITIAL
INTO TABLE @it_acdoca.

【讨论】:

  • 尊敬的 mkysoft,感谢您的回答,案例陈述部分解决了我的问题。第二部分对我不起作用,因为我在选择中有更多字段,这些字段将通过在 JOIN 中添加这些行来实现。不过,感谢您的帮助!
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2016-01-04
  • 2014-09-22
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多