Могу ли я использовать ДЛЯ ВСЕХ ЗАПИСЕЙ с GROUP BY? - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время код выглядит примерно так:

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?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Вы должны быть в состоянии сделать что-то вроде

  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_id является ключом в таблице order_items.Предполагая, что lt_count имеет два поля: cnt типа int8 и order_id того же типа, что и другие ваши order_id поля

PS: тогда вы можете перебрать lt_count и переместитьрассчитывает до lt_orders.Или наоборот.Чтобы ускорить цикл, сортируйте одну из таблиц и используйте READ ... BINARY SEARCH

0 голосов
/ 05 октября 2018

Я сделал с таблицей 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.
0 голосов
/ 04 октября 2018

Проверьте документацию .Вы не можете использовать 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.

Или объединить заголовок / элемент с различным количествомна идентификатор элемента (какой столбец будет в вашей таблице).

...