SELECT FOR ALL ENTRIES срещу LOOP SELECT SINGLE в ABAP

Сравнявам SELECT FOR ALL ENTRIES срещу LOOP SELECT SINGLE и имам голяма разлика между резултатите.

Някой може ли да ми помогне с това? Каква е разликата?

SELECT ekko~ebeln
    ekpo~ebelp
    ekko~bstyp
    ekko~bsart
    ekko~lifnr
    ekko~ekgrp
    ekko~aedat
    ekko~knumv
    ekko~zterm
    ekko~zbd1t
    ekpo~matnr
    ekpo~txz01
    ekpo~menge
    ekpo~meins
    ekpo~netpr
    ekpo~peinh
    ekpo~knttp
    ekpo~afnam
    ekpo~wepos
INTO TABLE t_ekpo
FROM ekko
INNER JOIN ekpo ON
    ekpo~ebeln EQ ekko~ebeln
WHERE ekko~lifnr IN s_lifnr
    AND ekko~ekgrp IN s_ekgrp
    AND ekko~ebeln IN s_ebeln
    AND ekko~aedat IN s_aedat
    AND ekko~bsart IN s_bsart
    AND ekko~bstyp EQ 'F'
    AND ekko~loekz EQ space
    AND ekpo~matnr IN s_matnr
    AND ekpo~ebelp IN s_ebelp
    AND ekpo~loekz EQ space.

SELECT FOR ALL ENTRIES връща 9 528 записа

SELECT ebeln
    ebelp
    zekkn
    vgabe
    gjahr
    belnr
    buzei
    budat
    menge
    shkzg
FROM ekbe
INTO TABLE t_ekbe
FOR ALL ENTRIES IN t_ekpo
WHERE ebeln EQ t_ekpo-ebeln
    AND ebelp EQ t_ekpo-ebelp
    AND vgabe IN ('1','2').

LOOP SELECT SINGLE връща 7336 записа

LOOP AT t_ekpo INTO gs_ekpo.

    CLEAR gs_ekbe.

    SELECT SINGLE  ebeln
                 ebelp
                 zekkn
                 vgabe
                 gjahr
                 belnr
                 buzei
                 budat
                 menge
                 shkzg
    FROM ekbe
    INTO gs_ekbe
    WHERE ebeln EQ gs_ekpo-ebeln
        AND ebelp EQ gs_ekpo-ebelp
        AND vgabe IN ('1','2').

    APPEND gs_ekbe TO T_ekbe.

ENDLOOP.

person Ailin Albertoni    schedule 09.10.2013    source източник
comment
Имате предвид разлика във времето на изпълнение или в действителните резултати в таблицата T_ekbe?   -  person norbip    schedule 10.10.2013
comment
t_ekpo сортирана таблица ли е?   -  person Raven Dreamer    schedule 11.10.2013


Отговори (2)


Таблица EKBE има повече ключови полета от само EBELN и EBELP, така че може да има повече записи за уникална двойка EBELN/EBELP. С SELECT SINGLE няма да получите тези допълнителни записи, с FOR ALL ENTRIES получавате. В зависимост от вашите нужди само един от тях ще ви осигури правилния набор от данни.

person Gert Beukema    schedule 09.10.2013
comment
Той също трябва да внимава, защото ако t_ekpo случайно е празен, FOR ALL ENTRIES няма да избере никакви записи, както бихте очаквали, а всички записи (които отговарят на клаузата WHERE). - person omnibrain; 14.10.2013

Просто искам да добавя. SELECT SINGLE вътре в LOOP е много лоша идея. Ако имате нужда от ebeln+ebelp от ekpo, просто изберете тези две в допълнителна таблица lt_ekpo (не забравяйте DISTINCT в този избор) и го използвайте за FOR ALL ENTRIES.

person Alexander_P    schedule 30.10.2013