问题描述
我想将此 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 个表:EUIINSTLN
和 IT_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 - 字段 上有一个索引。