将 SELECT-ENDSELECT 转换为具有更多表的所有条目

问题描述

我想将此 SELECT-ENDSELECT 转换为 FOR ALL ENTRIES 以获得更好的性能

LOOP AT it_zgd_check_smc into wa_zgd_check_smc.

    SELECT *
      FROM ever
      INTO wa_ever
      WHERE anlage  EQ wa_euiinstln-anlage
      AND   einzdat <= wa_zgd_check_smc_st-data_inizio
      AND   auszdat >= wa_zgd_check_smc_st-data_inizio.
    ENDSELECT.

"---logic---"

ENDLOOP.

有 2 个表:EUIINSTLNIT_ZGD_CHECK_SMC。如何将其转换为 for all entries

谢谢大家。 问候。

解决方法

要去掉 SELECT - ENDSELECT,您可以简单地使用 INTO TABLE 并在之后循环它。这通常更快,您(几乎)每次都可以这样做。

    data: lt_ever like table of wa_ever.
    LOOP AT it_zgd_check_smc into wa_zgd_check_smc.
      SELECT *
        FROM ever
        INTO TABLE lt_ever
        WHERE anlage  EQ wa_euiinstln-anlage
        AND   einzdat <= wa_zgd_check_smc_st-data_inizio
        AND   auszdat >= wa_zgd_check_smc_st-data_inizio.
     LOOP AT lt_ever INTO wa_ever.
       "Put here what was in the SELECT - ENDSELECT previously.
     ENDLOOP.
   ENDLOOP.

然后您可以使用 FOR ALL ENTRIES 来摆脱外部循环之一。如果你使用它,你可以简单地用表格替换工作区。但是您应该确保您使用的表不是空的。否则 WHERE 语句将像一个空范围一样(换句话说,它将被忽略),因此它会为您提供数据库中的所有条目。所以它会给你这样的东西:

    data: lt_ever like table of wa_ever.
    
    IF it_zgd_check_smc_st IS NOT INITIAL.
      SELECT *
        FROM ever
        INTO TABLE lt_ever
        FOR ALL ENTRIES IN it_zgd_check_smc_st
        WHERE anlage  EQ wa_euiinstln-anlage
        AND   einzdat <= it_zgd_check_smc_st-data_inizio
        AND   auszdat >= it_zgd_check_smc_st-data_inizio.
     loop at lt_ever into wa_ever.
       "Put here what was in the SELECT - ENDSELECT previously.
     endloop.
   ENDIF.

您不能为所有条目使用第二个表,但您可以为ANLAGE - 字段 建立一个范围。请确保您不再使用空范围。

DATA: lt_ever LIKE TABLE OF wa_ever.
DATA: lr_anlage TYPE RANGE OF anlage.
DATA: lrs_anlage LIKE LINE OF lr_anlage.

lrs_anlage-sign = 'I'.
lrs_anlage-option = 'EQ'.
LOOP AT euiinstln INTO wa_euiinstln.
  lrs_anlage-low = wa_euiinstln-anlage.
  APPEND lrs_anlage TO lr_anlage.
ENDLOOP.


IF it_zgd_check_smc_st IS NOT INITIAL AND
   lr_anlage IS NOT INITIAL.
  SELECT *
    FROM ever
    INTO TABLE lt_ever
    FOR ALL ENTRIES IN it_zgd_check_smc_st
    WHERE anlage  IN lr_anlage
    AND   einzdat <= it_zgd_check_smc_st-data_inizio
    AND   auszdat >= it_zgd_check_smc_st-data_inizio.
  LOOP AT lt_ever INTO wa_ever.
    "Put here what was in the SELECT - ENDSELECT previously.
  ENDLOOP.
ENDIF.

我不知道代码应该做什么,所以我不知道其中有多少对你有用。不建立范围和循环euiinstln - 表 应该同样快,因为EVER - 数据库无论如何,应该在anlage - 字段 上有一个索引。