Для определения запаса на контроле качества на дату мы у себя пока что решили таким способом:
Code:
TYPES: BEGIN OF ty_regulations,
         shkzg TYPE shkzg,
         bwart TYPE bwart,
       END OF ty_regulations.
TYPES: BEGIN OF ty_data,
         matnr TYPE matnr,
         maktx TYPE maktx,
         werks TYPE werks_d,
         name1 TYPE name1,
         lgort TYPE lgort_d,
         lgobe TYPE lgobe,
         charg TYPE charg_d,
         menge TYPE my_mbsta,
       END OF ty_data.
       
DATA gt_out TYPE TABLE OF ty_data.
DATA gt_regulations TYPE TABLE OF ty_regulations.
APPEND |S563| TO GT_REGULATIONS.
APPEND |S554| TO gt_regulations.
APPEND |S523| TO gt_regulations.
APPEND |S503| TO gt_regulations.
APPEND |S349| TO gt_regulations.
APPEND |S323| TO gt_regulations.
APPEND |S324| TO gt_regulations.
APPEND |S322| TO gt_regulations.
APPEND |H321| TO gt_regulations.
APPEND |H323| TO gt_regulations.
APPEND |H324| TO gt_regulations.
APPEND |H564| TO gt_regulations.
APPEND |H350| TO gt_regulations.
APPEND |H504| TO gt_regulations.
APPEND |H524| TO gt_regulations.
APPEND |H553| TO gt_regulations.
SELECT mseg~matnr,
       mseg~werks,
       mseg~lgort,
       mseg~charg,
       mseg~bwart,
       mkpf~budat,
       mseg~shkzg,
       mseg~menge,
       mseg~meins
  INTO TABLE @DATA(gt_mseg)
  FROM mseg
  JOIN mkpf ON mseg~mblnr EQ mkpf~mblnr
           AND mseg~mjahr EQ mkpf~mjahr
  WHERE mseg~matnr IN @so_matnr
    AND mseg~werks IN @so_werks
    AND mseg~lgort IN @so_lgort
    AND mseg~charg IN @so_charg
    AND mkpf~budat LE @so_budat-low.
SORT gt_mseg BY matnr
                werks
                lgort
                charg
                budat ASCENDING.
LOOP AT gt_mseg INTO DATA(ls_mseg) GROUP BY ( matnr = ls_mseg-matnr
                                              werks = ls_mseg-werks
                                              lgort = ls_mseg-lgort
                                              charg = ls_mseg-charg )
                                   REFERENCE INTO DATA(charg_group).
  LOOP AT GROUP charg_group ASSIGNING FIELD-SYMBOL(<ls_charg>).
    READ TABLE gt_regulations TRANSPORTING NO FIELDS
      WITH KEY shkzg = <ls_charg>-shkzg
               bwart = <ls_charg>-bwart.
    CHECK sy-subrc EQ 0.
    DATA ls_out TYPE ty_data.
    CLEAR ls_out.
    MOVE-CORRESPONDING <ls_charg> TO ls_out.
    CLEAR ls_out-menge.
    CASE <ls_charg>-shkzg.
      WHEN 'S'. ls_out-menge = abs( <ls_charg>-menge ).
      WHEN 'H'. ls_out-menge = - abs( <ls_charg>-menge ).
      WHEN OTHERS.
    ENDCASE.
    COLLECT ls_out INTO gt_out.
  ENDLOOP.
ENDLOOP.
Задумка в том, что в MSEG хранятся все проводки с суммами и флагом - поступление/списание. Мы знаем виды движения какими можно изменить запас на контроле качества. Формируем соответствующую таблицу GT_REGULATIONS с настройками: S - приход, H - расход. Сравнивая эту информацию с данными из MSEG получаем информацию о том как изменялся запас. С помощью таблицы MKPF разграничиваем дату проводок. В итоге - зная объемы прихода/ухода схлопываем эти суммы и получаем остаток, который и отражает запас на КК на нашу дату.