2013-08-05 1 views
4

Я получаю внутреннюю таблицу из вызова FUBA, имеющего ~ 100 строк. Около 40% строк не относятся ко мне, потому что мне нужны только записи с PAR1 «XYZ». В таблицах SQL (прозрачные таблицы), я могу использоватьПодсчет записей в внутренней таблице abap по запросу

select count(*) from tab where PAR1 = "XYZ" 

, чтобы получить число действительных записей.

Посмотрев на документацию, все, что я мог найти, это синтаксис READ Table для итерации по таблице. Мой текущий подход состоит в том, чтобы в принципе иметь цикл и увеличивать, если строка содержит значение, которое я хочу. Но это кажется очень неэффективным.

Есть ли лучший подход для моего требования?

ответ

5

Сделайте все, что вам нравится. При ~ 100 рядах практически ничего не будет иметь большого значения во время выполнения. Для меня стабильность в этом случае была бы более важной, чем скорость.

Это, как говорится, вы можете попробовать это:

LOOP AT lt_my_table TRANSPORTING NO FIELDS WHERE par1 = 'XYZ'. 
    ADD 1 TO l_my_counter. 
ENDLOOP. 
6

Если записи во внутренней таблице неактуальны, вы можете сделать что-то вроде этого.

DELETE lt_table WHERE par1 <> 'XYZ'. 

Тогда вы можете рассчитывать оставшиеся соответствующие записи с помощью lines(lt_table) или DESCRIBE TABLE lt_table LINES l_number_of_lines.

Вот пример.

TYPES: BEGIN OF tt_test, 
    par1 TYPE c LENGTH 3, 
    END OF tt_test. 

DATA: lt_table TYPE TABLE OF tt_test. 
DATA: l_number_of_lines TYPE i. 
FIELD-SYMBOLS: <fs_par1> LIKE LINE OF lt_table. 

APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>. 
<fs_par1>-par1 = 'XYZ'. 
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>. 
<fs_par1>-par1 = 'ABC'. 
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>. 
<fs_par1>-par1 = 'XYY'. 
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>. 
<fs_par1>-par1 = 'XYZ'. 
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>. 
<fs_par1>-par1 = 'XYZ'. 

l_number_of_lines = LINES(lt_table). 
WRITE/l_number_of_lines. 
DESCRIBE TABLE lt_table LINES l_number_of_lines. 
WRITE/l_number_of_lines. 
DELETE lt_table WHERE par1 <> 'XYZ'. 
l_number_of_lines = LINES(lt_table). 
WRITE/l_number_of_lines. 
3

Как от 740 вы можете использовать:

DATA(lv_lines) = REDUCE i(INIT x = 0 FOR wa IN gt_itab 
        WHERE(F1 = 'XYZ') NEXT x = x + 1). 

для подсчета количества строк в gt_itab собрания codntion f1 = 'А'.

+0

Единственный правильный ответ для современного программирования. Разумеется, это также можно использовать в строке ('IF REDUCE ...'), поэтому вам не нужно объявлять какие-либо переменные. Хотя будьте осторожны: технически это объявляет как 'x', так и' wa', хотя только один раз означает, что вы можете иметь несколько выражений 'REDUCE', используя те же имена переменных результата и рабочей области. – Lilienthal

 Смежные вопросы

  • Нет связанных вопросов^_^