Подсчет дубликатов во внутренней таблице в ABAP - PullRequest
0 голосов
/ 25 апреля 2018

Я просто хочу спросить, как считать дубликаты во внутренней таблице.Я хотел сделать это, чтобы подсчитать каждого клиента и поместить его в столбец Количество клиентов.

Sales Employee          Customer    Customer Count
a                          1             2
a                          2             2
b                          3             3
b                          2             3
b                          4             3
c                          1             1

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
FIELD-SYMBOLS : <lfs_sales> TYPE ty_sales.

Предполагается, что li_sales является внутренней таблицей со столбцами Sales_employee, Customer и customer_count. Первоначально записи в таблице представлены следующим образом.

Sales_employee Customer customer_count
a                 1             0
a                 2             0
b                 3             0
b                 2             0
b                 4             0
c                 1             0

Нам нужно рассчитать дубликат количества sales_employee и обновить поле customer_count. Мы можем использовать оператор сбора, как это предложено Дириком, или использовать операторы контроля прерывания, как показано ниже.

Обязательным условием для использования ключевого слова SUM является инициализация customer_count как 1 в каждой строке, чтобы он мог суммировать количество клиентов на основе аналогичного sales_employee.

LOOP AT li_sales ASSIGNING <lfs_sales>.
     <lfs_sales>-customer_count = 1.
ENDLOOP.

Теперь записи выглядят так, как показано ниже.

Sales_employee Customer customer_count
a                 1             1
a                 2             1
b                 3             1
b                 2             1
b                 4             1
c                 1             1

Следующий код обновляет значение поля customer_count.

LOOP AT li_sales INTO rec_sales.
AT END OF employee.
  SUM.
  MOVE-CORRESPONDING rec_sales TO rec_count.
  APPEND rec_count TO li_count.
  CLEAR rec_count.
ENDAT.
ENDLOOP.

SORT li_count BY employee.
LOOP AT li_sales ASSIGNING <lfs_sales>.
  CLEAR rec_count.
  READ TABLE li_count INTO rec_count
  WITH KEY employee = <lfs_sales>-employee
  BINARY SEARCH.
  IF sy-subrc IS INITIAL.
    <lfs_sales>-count = rec_count-count.
  ENDIF.
ENDLOOP.

Теперь внутренней таблице присваивается значение customer_count, как показано ниже.

Sales_employee Customer customer_count
a                 1             2
a                 2             2
b                 3             3
b                 2             3
b                 4             3
c                 1             1
0 голосов
/ 25 апреля 2018

, как упоминает suncatcher в своем комментарии, использование SQL-агрегатов более эффективно, чем циклический просмотр внутренних таблиц.Но если в вашем случае это невозможно, одним из способов будет использование оператора collect.collect добавляет записи во внутреннюю таблицу и добавляет числовые поля, когда строка с такими же ключевыми полями уже существует.Создайте внутреннюю таблицу с полем для вашего сотрудника по продажам, другое поле для подсчета и выполните цикл по вашей таблице продаж, используя метод collect для обновления таблицы подсчета для каждой продажи.

types: begin of t_count,
       employee type text10,
       count type i,
       end of t_count.

data: it_count type standard table of t_count,
      wa_count type t_count.

loop at it_sales into wa_sales.
    move: wa_sales-employee to wa_count-employee,
          1 to wa_count-count.

    collect wa_count into it_count.
endloop.

В примере предполагается, что у вас естьстол it_sales, рабочая зона wa_sales, оба с полем employee.Таблица it_count содержит список ваших сотрудников (в порядке их появления в таблице продаж) и количество раз, которое они появились в таблице продаж.

...