5

6 つのキー フィールドを持つデータベース テーブルに対して SELECT クエリを実行したいと考えています。キー フィールドが keyA、keyB、...、keyF であるとします。

ABAP 機能モジュールへの入力パラメータとして、キー項目の構造が正確に示されている内部テーブルを受け取ります。したがって、その内部テーブルの各エントリは、データベース テーブルの 1 つのタプルに対応します。

したがって、内部テーブルのエントリに対応するデータベース テーブルからすべてのタプルを選択するだけです。さらに、まったく同じクエリで、そのデータベース テーブルの金額列を集計したいと考えています。

疑似 SQL では、クエリは次のようになります。SELECT SUM(amount) FROM table WHERE (keyA、keyB、keyC、keyD、keyE、keyF) IN {内部テーブル}。

ただし、この表現は ABAP OpenSQL では不可能です。

複合キーではなく、1 つの列 (keyA など) のみを指定できます。さらに、「選択テーブル」(SIGN、OPTIOn、LOW、HIGH を持つテーブル) は、キーワード IN の後にのみ使用できます。FOR ALL ENTRIES を使用することは可能ですが、この場合、同じクエリで集計が許可されていないため、SUM を使用できません。

助言がありますか?

4

3 に答える 3

3

内部テーブルの各エントリのレコードを選択するには、通常、for all entriesABAP Open SQL のイディオムが役に立ちます。あなたの場合、合計を集計する追加の要件があります。残念ながら、使用する SELECT ステートメントの結果セットでは、for all entries集計関数を使用できません。私の目には、この場合の最善の方法は、ABAP レイヤーの結果セットから合計を計算することです。次の例は私のシステムで動作します (注意: 7.40 に付属する新しい ABAP 言語機能を使用すると、コード全体を大幅に短縮できます)。

report  zz_ztmp_test.

start-of-selection.
  perform test.

* Database table ZTMP_TEST :
* ID     -  key field  - type CHAR10
* VALUE  -  no key field - type INT4
* Content: 'A' 10, 'B' 20, 'C' 30, 'D' 40, 'E' 50

types: ty_entries type standard table of ztmp_test.

* ---
form test.

  data: lv_sum    type i,
        lt_result type ty_entries,
        lt_keys   type ty_entries.

  perform fill_keys changing lt_keys.

  if lt_keys is not initial.
    select * into table lt_result
           from ztmp_test
           for all entries in lt_keys
           where id = lt_keys-id.
  endif.

  perform get_sum using lt_result
                  changing lv_sum.

  write: / lv_sum.

endform.

form fill_keys changing ct_keys type ty_entries.
  append :
    'A' to ct_keys,
    'C' to ct_keys,
    'E' to ct_keys.
endform.

form get_sum using it_entries type ty_entries
              changing value(ev_sum) type i.
  field-symbols: <ls_test> type ztmp_test.

  clear ev_sum.
  loop at it_entries assigning <ls_test>.
    add <ls_test>-value to ev_sum.
  endloop.

endform.
于 2015-04-15T10:07:33.223 に答える