按 FOR ALL ENTRIES itab 键的总和

Emd*_*dee 5 abap aggregate-functions opensql

我想对具有 6 个关键字段的数据库表执行 SELECT 查询,假设它们是 keyA、keyB、...、keyF。

作为我的 ABAP 功能模块的输入参数,我确实收到了一个具有关键字段结构的内部表,因此该内部表中的每个条目对应于数据库表中的一个元组。

因此,我只需要从数据库表中选择与我的内部表中的条目相对应的所有元组。此外,我想在完全相同的查询中聚合该数据库表中的金额列。

在伪 SQL 中,查询将如下所示:SELECT SUM(amount) FROM table WHERE (keyA, keyB, keyC, keyD, keyE, keyF) IN {internal table}。

但是,这种表示在 ABAP OpenSQL 中是不可能的。

只允许声明一列(例如 keyA),而不是组合键。此外,我只能在关键字 IN 后使用“选择表”(带有 SIGN、OPTIOn、LOW、HIGH 的那些)。使用 FOR ALL ENTRIES 似乎可行,但是在这种情况下我不能使用 SUM,因为在同一查询中不允许聚合。

有什么建议?

rpl*_*iko 3

对于为内表的每个条目选择记录,通常for all entries可以使用 ABAP 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.
Run Code Online (Sandbox Code Playgroud)

  • “FOR ALL ENTRIES”有自己的聚合机制 - 它创建一个以所有结果字段为组件的内部表,并压缩相同的行,因此它为结果集创建了一个内在的“DISTINCT”。这是“对于所有条目”的注意事项之一。此内置“DISTINCT”逻辑不能与其他聚合函数组合。简而言之:它没有实现:-) (4认同)