我可以将"分组依据"用于所有条目吗?



目前代码如下所示:

LOOP AT lt_orders ASSIGNING <fs_order>.
SELECT COUNT(*) AS cnt
FROM order_items
INTO <fs_order>-cnt
WHERE order_id = <fs_order>-order_id.
ENDLOOP.

这是报告中最慢的部分。我想加快速度。

如何使用 对于所有条目 分组依据?

查看文档。你不能使用GROUP BY.也许在这种情况下,您可以尝试在循环外使用 FAE 选择您的项目,然后使用并行光标对它们进行计数:

REPORT.
TYPES: BEGIN OF ty_result,
vbeln TYPE vbeln,
cnt   TYPE i.
TYPES: END OF ty_result.
DATA: lt_headers TYPE SORTED TABLE OF ty_result WITH UNIQUE KEY vbeln,
lv_tabix   TYPE sy-tabix VALUE 1.
"get the headers
SELECT vbeln FROM vbak UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE lt_headers.
"get corresponding items
SELECT vbeln, posnr FROM vbap FOR ALL ENTRIES IN @lt_headers
WHERE vbeln EQ @lt_headers-vbeln 
ORDER BY vbeln, posnr 
INTO TABLE @DATA(lt_items).

LOOP AT lt_headers ASSIGNING FIELD-SYMBOL(<h>).
LOOP AT lt_items FROM lv_tabix ASSIGNING FIELD-SYMBOL(<i>).
IF <i>-vbeln NE <h>-vbeln.
lv_tabix = sy-tabix.
EXIT.
ELSE.
<h>-cnt = <h>-cnt + 1.
ENDIF.
ENDLOOP.
ENDLOOP.
BREAK-POINT.

或者联接标题/项目,在项目 ID 上具有不同的计数(表中的列(。

你应该能够做类似的事情

SELECT COUNT(order_item_id) AS cnt, order_id 
FROM order_items
INTO CORRESPONDING FIELDS OF TABLE lt_count
GROUP BY order_id.

假设order_item_idorder_items表中的键。假设lt_count有两个字段:int8类型的cnt和与其他order_id字段类型相同的order_id

PS:然后你可以循环lt_count并将计数移动到lt_orders.或者反过来。要加快循环速度,请对其中一个表进行排序并使用READ ... BINARY SEARCH

我使用表 KNB1(公司代码中的客户主数据(做了,我们有客户,这些客户是在几个公司代码中创建的。

请注意,由于对于所有条目,您必须选择完整密钥。

TYPES: BEGIN OF ty_knb1,
kunnr TYPE knb1-kunnr,
count TYPE i,
END OF ty_knb1.
TYPES: BEGIN OF ty_knb1_fae,
kunnr TYPE knb1-kunnr,
END OF ty_knb1_fae.
DATA: lt_knb1_fae TYPE STANDARD TABLE OF ty_knb1_fae.
DATA: lt_knb1 TYPE HASHED TABLE OF ty_knb1
WITH UNIQUE KEY kunnr.
DATA: ls_knb1 TYPE ty_knb1.
DATA: ls_knb1_db TYPE knb1.
START-OF-SELECTION.
lt_knb1_fae = VALUE #( ( kunnr = ... ) ). "add at least one customer which is created in several company codes
ls_knb1-count = 1.
SELECT kunnr bukrs
INTO CORRESPONDING FIELDS OF ls_knb1_db
FROM knb1
FOR ALL ENTRIES IN lt_knb1_fae
WHERE kunnr EQ lt_knb1_fae-kunnr.
ls_knb1-kunnr = ls_knb1_db-kunnr.
COLLECT ls_knb1 INTO lt_knb1.
ENDSELECT.
  1. lt_orders创建一个范围表,如lt_orders_range
  2. select order_id, count( * ) where order_id in lt_orders_range.

如果您认为创建范围表太多了,那么通过对所有订单仅运行一个选择而不是为每个订单 ID 运行单选,您将节省大量性能。

不是直接的,只能通过 CDS 视图

虽然所有答案都提供了比问题中更快的解决方案,但没有提到最快的方法。

如果您至少拥有Netweaver 7.4,EHP 5(您应该,它是在2014年发布的(,则可以使用CDS视图,即使您不在HANA上。

它仍然不能直接完成,因为OpenSQL不允许使用GROUP BY的所有条目,并且CDS视图无法处理所有条目。但是,您可以创建其中之一。

光盘:

@AbapCatalog.sqlViewName: 'zorder_i_fae'
DEFINE VIEW zorder_items_fae AS SELECT FROM order_items {
order_id,
count( * ) AS cnt, 
}
GROUP BY order_id

OpenSQL:

SELECT * 
FROM zorder_items_fae
INTO TABLE @DATA(lt_order_cnt)
FOR ALL ENTRIES IN @lt_orders
WHERE order_id = @lt_orders-order_id.

速度

如果lt_orders包含表ORDER_ITEMS中所有可能的order_id值的30%以上,则iPirat的答案会更快。(显然,虽然使用更多内存(

但是,如果您只需要数百万个order_id值中的几个,则此解决方案比任何其他答案快约10倍,比原始答案快100倍。

相关内容

  • 没有找到相关文章

最新更新