2

私はabap言語を初めて使用し、内部結合ステートメントを練習しようとしていますが、出力前にselectステートメントの行数を取得できるかどうかわかりません。

これが私が達成したいことです。

<--------------------------------------- >

< total number of rows > Record(s) found |

Column Header 1|Column Header 2 ..

< data 
 ....
 retrieved >


<--------------------------------------- >

以下は私のselectステートメントです:

 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.

また、内部テーブルを使用してこれを行う方法についてアドバイスやアイデアがあれば、サンプルを見せてください。本当に学びたいです。ありがとう、そして神のご加護を。

4

2 に答える 2

8

システム変数SY-DBCNTは、選択された行数を提供する必要がありますが、選択が終了した後のみです。

SELECT-ENDSELECTの代わりに、SELECT INTO TABLEを使用してすべての行を一度に内部テーブルに選択することもできます(一度に選択しすぎない場合)。

例えば:

data: lt_t000 type table of t000.

select * from t000 into table lt_t000.

これにより、そのテーブルからすべてが選択され、内部テーブルに移動します。したがって、現在INTO句にあるすべてのフィールドを使用して内部テーブルを宣言してから、内部テーブルにINTOTABLEを指定することができます。

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)プログラムは、下位互換性のためにヘッダー行を使用して内部テーブルを宣言するという概念を引き続きサポートしていますが、これは推奨されていません。それがうまくいくことを願っています!

于 2011-09-21T14:34:28.530 に答える
2

データ自体を取得せずに行数のみが必要な場合は、次の構文も機能します

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

このクエリの実行後、SY-DBCNTから行数の値を取得できるようになり、DBの負荷は通常よりもはるかに少なくなりますSELECT ... INTO itab。ただし、これは実際のデータが必要ない場合にのみ当てはまります。行数とデータ自体の両方が必要な場合は、これを個別のselectステートメントに分割することは賢明ではありません。

于 2016-01-16T17:37:42.830 に答える