-1

selectステートメントのすべてのエントリに対してselectを実行しようとしていました-abap。エントリの選択が何をするのか明確な考えが得られません。誰か知っていますか ?

以下の声明をご覧ください。

1.

select bukrs belnr xblnr budat 
    from bkpf 
    into table it_bkpf 
    where belnr in s_belnr

2.

 select bukrs belnr buzei gsber zuonr wrbtr kunnr 
    from bseg 
    into table it_bseg  
    for all entries in it_bkpf 
    where belnr = it_bkpf-belnr.

二つの文の違いを教えてください。

シヴァ

4

3 に答える 3

4

いくつかの明らかな違い:

  1. 異なるテーブル
  2. 対象分野の違い
  3. 2番目の選択には構文の問題がありました:form代わりに使用しましたfrom(編集で修正しました)

その他の違い:

選択 1.)節で使用inします。whereしたがって、select-options(またはrange-オブジェクト)を使用します。

for all entries in it_bkpfつまり、内部テーブルit_bkpfには、選択したい要素のリストが含まれています。つまり、bseg 内のすべてのエントリを選択します。ここで、フィールドされた belnr は、内部テーブル bseg の要素です。

于 2012-02-26T17:57:12.110 に答える
3

ST05取引で明確な回答が得られます。

  • st05 トランザクションを実行し、トレース SQL を選択して、トレースをアクティブ化できます。
  • その後、コードを実行します。
  • st05 を再度入力して、トレースを無効にするを選択し、トレース結果を表示します。

そこには、データベース サーバーに転送された正確な SQL コードが表示されます。BSEG はクラスター化されたテーブルであるため、直感的なヘッダー項目結合を使用して、必要な金融動向情報を取得することはできませんでした。BSEGを含む複数のテーブルが単一のデータベーステーブルに格納されているため、データベースサーバーは技術的にBSEG行を分離してBSEG固有のフィールドを見つけて適切に結合することができません。

したがって、アプリケーションサーバーで結合のような構築を行うことができます。最初に、ヘッダー テーブル (BKPF) からすべてのヘッダー関連の列を取得しています。次にSELECT ... FOR ALL ENTRIES IN ...が実行されると、アプリケーション サーバーはヘッダー行の一部 (通常は 5 行) を取得し、その部分に対応するアイテムのパックを取得するための SQL クエリを作成します。次に、そのすべての部分が単一の内部テーブルにマージされます。したがって、通常の結合を実行できれば、そのまま目的のドキュメントのアイテムだけが存在します。

于 2012-02-27T02:05:32.930 に答える
2

これが私が理解している方法です。2 つのステートメントは、おそらく次々に実行されます。

  1. 最初のステートメントは、bkpf テーブルからいくつかのエントリを選択します。これらのエントリは、内部テーブル it_bkpf (belnr 1、2、3 など) に格納されます。

  2. これらの各エントリは、選択 #2 の一部として使用されます。「すべてのエントリに対して」は、テーブル bseg の belnr を、最初のステートメントの内部テーブル it_bkpf の belnr と一致させます。次に、一致するエントリが内部テーブル it_bseg に入れられます。

あなたが与えた例では、SQL#2のwhere句がwhere belnr in s_belnr(すべてのエントリの全体ではなく)だった場合、これはほとんど同じです。これは、他の目的で it_bkpf の内容が必要な場合にのみ意味があります。もう 1 つの典型的な状況は、データベースから直接読み取るのではなく、何らかのプログラム ロジックを使用して、for all entries 句で使用される内部テーブルの内容を決定する場合です。

「すべてのエントリに対して」の 1 つのキャッチ: の内部テーブルがfor all entries空でないことを確認してください。その後、from 句のテーブル全体が選択されます。

于 2012-03-06T22:00:33.480 に答える