Информационный запрос SELECT SUM проблема - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь сложить все строки количеств (MENGE), в которых номер заказа (EBELN) И номер позиции в соответствующем заказе (EBELP) и типе движения (BWART) "101", а затем вычесть эквивалентную таблицу с типом движения "102"чтобы получить итоговое количество как результат.

В настоящее время я добавил 2 пользовательских поля, одно для 101 и одно для 102 движения, чтобы разбить его и увидеть результаты.С моим текущим кодом, отчет показывает правильные данные для столбца 101, но возвращает много мусора для 102: он содержит правильные данные, но возвращает цифры / данные там, где их не должно быть, и я не могу понять, почему илиоткуда он тянет цифры.

Код ниже:

* ТАБЛИЦА ДАННЫХ

DATA: itab1 like table of mseg,
       wa1 like mseg,
       wa2 like mseg. 
DATA: *mseg like table of mseg. 
DATA: itab3 like table of ekbe,
       wa3 like ekbe. 
Data: *ekbe like table of ekbe. 
data: QNT101_menge like mseg-menge,
       QNT102_menge like mseg-menge,
       QNT103_MENGE LIKE EKBE-MENGE.`

* ТАБЛИЦА ОБРАБОТКИ ЗАПИСИ

if sy-subrc eq 0.   
wa1-ebeln = mseg-ebeln.   
wa1-menge = mseg-menge. 
wa1-ebelp = mseg-ebelp.   
wa1-bwart = mseg-bwart.   
wa2-ebeln = mseg-ebeln.   
wa2-ebelp = mseg-ebelp.   
wa2-menge = mseg-menge.  
wa2-bwart = mseg-bwart.   
Select: sum( menge ) as menge into QNT101_menge   
   from mseg 
   where ebeln = wa1-ebeln    
     and ebelp = wa1-ebelp 
     and bwart = 101 
   group by ebeln ebelp.
endselect. 
clear *mseg.   
Select sum( menge ) as menge into QNT102_menge    
  from mseg
  where ebeln = wa1-ebeln
    and ebelp = wa1-ebelp
    and bwart = 102
  group by ebeln ebelp.   
endselect. 
append wa1 to itab1.    
clear wa1. 
endif.

Ив моих настраиваемых полях есть только некоторый базовый код, такой как

ACTUALQNT2 = QNT102_MENGE.

Есть больше переменных, чем я использую, потому что я планирую строить отчет дальше.

1 Ответ

1 голос
/ 20 марта 2019

Проблема в операторах выбора.

Вы получаете доступ к MSEG с единственными значениями EBELN и EBELP за раз, взяли значения из структуры wa1 и используетесовокупная сумма.

Вам не нужно group by, так как вы не используете несколько значений EBELN, EBELP.

Кроме того, оператор ENDSELECT создает своего рода "цикл"в таблице БД MSEG это не нужно.

Попробуйте использовать следующее:

Select sum( menge ) as menge into QNT101_menge
 from mseg
where ebeln = wa1-ebeln
  and ebelp = wa1-ebelp
  and bwart = '101'.

Select sum( menge ) as menge into QNT102_menge
  from mseg
 where ebeln = wa1-ebeln
   and ebelp = wa1-ebelp
   and bwart = '102'.

Также из соображений производительности вы должны пытаться не обращаться к БД, когда в этом нет необходимости (вы выбирали дважды с почтипо тем же критериям).

Вот лучшая версия

Получает таблицу величин, суммированных по типу движения (101 или 102)

select bwart, sum( menge ) as menge
  from mseg
  into table @data(lt_quantity)
 where ebeln = @wa1-ebeln
   and ebelp = @wa1-ebelp
   and bwart in ( '101' , '102' )
  group by bwart.

Затем считывает из внутренней таблицыценности, которые вы хотите.(здесь optional необходимо, чтобы избежать исключения, если отсутствует тип mov.type)

  qnt101_menge = value #( lt_quantity[ bwart = '101']-menge optional ).
  qnt102_menge = value #( lt_quantity[ bwart = '102']-menge optional ).

РЕДАКТИРОВАТЬ: встроенные объявления

начиная с ABAP 7.40Вы можете использовать встроенное объявление непосредственно в операторе SELECT.(см. документацию )

Таблица lt_quantity объявляется на лету, в момент выполнения оператора select.Вам не нужно объявлять таблицу раньше, но вместо этого система создает ее с надлежащей структурой динамически.

Чтобы использовать эти новые функции, вы должны использовать символ @ перед каждой используемой переменной (так же, когдаиспользование @wa1)

Если ваша системная версия еще не поддерживает этот синтаксис, вот классическая версия оператора.Обратите внимание, что классический синтаксис SELECT также отличается от нового (без запятых между полями, без @, INTO части, объявленной в нижней части оператора)

types: begin of qty_type,
  bwart type mseg-bwart,
  menge type mseg-menge,
  end of qty_type.

data: lt_quantity type table of qty_type.

select bwart sum( menge ) as menge
  from mseg
  into table lt_quantity
 where ebeln = wa1-ebeln
   and ebelp = wa1-ebelp
   and bwart in ( '101' , '102' )
 group by bwart.
...