Как получить количество строк таблицы базы данных
Я просто новичок в языке abap, и я пытаюсь попрактиковаться во внутреннем операторе соединения, но я не знаю, как я смогу получить количество строк в моем операторе выбора перед выводом.
Вот чего я хочу добиться.
<--------------------------------------- >
<общее количество строк> найденных записей |
Column Header 1|Column Header 2 ..
<данные.... получены>
<--------------------------------------- >
Ниже мое отборное заявление:
SELECT spfli~carrid scarr~carrname sflight~planetype sflight~fldate sflight~price spfli~cityfrom spfli~cityto
INTO (g_carrid ,g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto) FROM spfli
INNER JOIN sflight
ON spfli~carrid = sflight~carrid AND spfli~connid = sflight~connid
INNER JOIN scarr
ON scarr~carrid = spfli~carrid
WHERE spfli~carrid = s_carrid-low.
WRITE: / g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto.
ENDSELECT.
И если у вас есть какие-либо советы и идеи о том, как сделать это с помощью внутренней таблицы, пожалуйста, покажите мне образец. Я просто очень хочу учиться. Спасибо и Боже, благослови.
2 ответа
Системная переменная SY-DBCNT должна указывать количество выбранных строк, но только после завершения выбора.
Альтернативой SELECT-ENDSELECT является выделение всех строк одновременно с помощью SELECT INTO TABLE во внутренней таблице (при условии, что вы не выделяете слишком много сразу!).
Например:
data: lt_t000 type table of t000.
select * from t000 into table lt_t000.
Это выберет все из этой таблицы за один раз во внутреннюю таблицу. Итак, что вы можете сделать, это объявить внутреннюю таблицу со всеми полями в настоящее время в вашем предложении INTO, а затем указать INTO TABLE для вашей внутренней таблицы.
После выполнения SELECT SY-DBCNT будет содержать количество выбранных строк.
Вот полный пример, построенный вокруг оператора SELECT в вашем вопросе, который я не проверил на здравомыслие, поэтому я надеюсь, что это сработает!
tables: spfli.
select-options: s_carrid for spfli-carrid.
* Definition of the line/structure
data: begin of ls_dat,
carrid type s_carr_id,
carrname type s_carrname,
planetype type s_planetye,
fldate type s_date,
price type s_price,
cityfrom type s_from_cit,
cityto type s_to_city,
end of ls_dat.
* Definition of the table:
data: lt_dat like table of ls_dat.
* Select data
select spfli~carrid scarr~carrname sflight~planetype sflight~fldate sflight~price spfli~cityfrom spfli~cityto
into table lt_dat
from spfli
inner join sflight
on spfli~carrid = sflight~carrid and spfli~connid = sflight~connid
inner join scarr
on scarr~carrid = spfli~carrid
where spfli~carrid = s_carrid-low.
* Output data
write: 'Total records selected', sy-dbcnt.
loop at lt_dat into ls_dat.
write: / ls_dat-carrid, ls_dat-carrname, ls_dat-planetype, ls_dat-fldate, ls_dat-price, ls_dat-cityfrom, ls_dat-cityto.
endloop.
Примечание. Программы отчетов (тип 1) по-прежнему поддерживают идею объявления внутренних таблиц со строками заголовков для обратной совместимости, но это не приветствуется! Надеюсь, что это работает!
Если вам нужно только количество строк без извлечения данных, следующий синтаксис также работает
SELECT COUNT(*)
FROM spfli
INNER JOIN sflight
...
После выполнения этого запроса вы сможете получить значение счетчика строк из SY-DBCNT, и загрузка БД будет намного меньше, чем в обычном режиме. SELECT ... INTO itab
, Это верно, однако, только если вам не нужны фактические данные. Если вам нужно как количество строк, так и сами данные, не имеет смысла разбивать их на отдельные операторы select.