Как получить количество строк таблицы базы данных - PullRequest
1 голос
/ 21 сентября 2011

Я просто новичок в языке 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 ]

8 голосов
/ 21 сентября 2011

Системная переменная 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) программы все еще поддерживают идею объявления внутренних таблиц со строками заголовков для обратной совместимости, но это не приветствуется!Надеюсь, что это работает!

2 голосов
/ 16 января 2016

Если вам нужно только количество строк без извлечения данных, следующий синтаксис также работает

SELECT COUNT(*)
  FROM spfli
 INNER JOIN sflight
 ...

После выполнения этого запроса вы сможете получить значение счетчика строк из SY-DBCNT, и загрузка БД будет намного меньше, чем при обычном SELECT ... INTO itab. Это верно, однако, только если вам не нужны фактические данные. Если вам нужно как количество строк, так и сами данные, не имеет смысла разбивать их на отдельные операторы select.

...