如何解决将 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 个表: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 - 字段 上有一个索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。