Как получить последнее значение MBEWH ~ LBKUM? - PullRequest
0 голосов
/ 08 апреля 2020

Эта программа фактически используется для расчета общего запаса с лимитом от даты проводки (MATDO C -BUDAT). Но у меня проблема с определением начального запаса. Начальный запас (MBEWH-LBKUM) берется за месяц, предшествующий месяцу, когда была проведена дата проводки. Но в созданной мною программе начальные данные запаса (MBEWH-LBKUM), которые появились, не были обновлены, как это должно быть. Между тем, если ссылаться на дату проводки (matdo c -budat / запрос, который я присоединил к таблице matdo c), первоначальные данные о запасах, которые должны появиться, просто не такие.

Но если я только выберу дату публикации за короткий промежуток времени, результаты будут правильными

Мой запрос:

FORM F_GETDT .

  REFRESH: IT_ZVBR.

    SELECT DISTINCT MARA~MATNR
                    MATDOC~BUDAT
                    MATDOC~BWART
                    MATDOC~SHKZG
                    MATDOC~WERKS
                    MATDOC~MENGE AS TOTAL
    FROM MARA
    INNER JOIN MATDOC ON MARA~MATNR = MATDOC~MATNR
    INTO CORRESPONDING FIELDS OF TABLE IT_ZVBR
    WHERE MATDOC~WERKS = P_WERKS AND
          MATDOC~BUDAT IN P_BUDAT AND
          MARA~MATKL IN ('E001', 'E002', 'E003', 'E005', 'E006', 'E007', 'E008', 'E009', 'E010', 'E011', 'E012', 'E014').
ENDFORM.

Это мой код заполнить внутреннюю таблицу IT_PRINT, которая будет отображаться позже:

FORM F_LSTDT.

  CLEAR: WA_ZVBR, WA_PRINT, V_TEMP, V_DATE, V_MONTH, V_MONTHMIN, V_YEAR.

  SORT IT_ZVBR BY MATNR.
  IT_TEMP = IT_ZVBR.
  DELETE ADJACENT DUPLICATES FROM IT_ZVBR COMPARING MATNR.

  LOOP AT IT_ZVBR INTO WA_ZVBR.

    WA_PRINT-PSTAR = P_BUDAT-LOW.
    WA_PRINT-PFINS = P_BUDAT-HIGH.
    WA_PRINT-MATNR = WA_ZVBR-MATNR.

    SELECT SINGLE MAKTX FROM MAKT
    INTO WA_PRINT-MAKTX
    WHERE MATNR = WA_PRINT-MATNR.

    LOOP AT IT_TEMP INTO WA_TEMP WHERE MATNR = WA_ZVBR-MATNR.

      CLEAR: V_TEMP.
      V_TEMP = WA_TEMP-BUDAT+6(2).
      V_DATE = V_TEMP.

      CLEAR: V_TEMP.
      V_TEMP = WA_TEMP-BUDAT+4(2).
      V_MONTH = V_TEMP.
      V_MONTHMIN = V_MONTH - 1.

      CLEAR: V_TEMP.
      V_TEMP = WA_TEMP-BUDAT+0(4).
      V_YEAR = V_TEMP.

      BLN_SBLM = 12.
      THN_SBLM = V_YEAR - 1.

      IF V_MONTH = 1.
        SELECT SINGLE LBKUM FROM MBEWH
          INTO WA_PRINT-LBKUM
          WHERE MATNR = WA_PRINT-MATNR AND
            LFMON = BLN_SBLM AND
            LFGJA = THN_SBLM AND
            BWKEY = WA_ZVBR-WERKS.
      ELSE.
        SELECT SINGLE LBKUM FROM MBEWH
          INTO WA_PRINT-LBKUM
          WHERE MATNR = WA_PRINT-MATNR AND
            LFMON = V_MONTHMIN AND
            LFGJA =  V_YEAR AND
            BWKEY = WA_ZVBR-WERKS.
      ENDIF.

     //Logic to swap to the latest value  
      IF WA_PRINT-LBKUM = WA_PRINT-TEMP.
          WA_PRINT-TEMP = WA_PRINT-LBKUM.
      ELSEIF WA_PRINT-LBKUM <> WA_PRINT-TEMP AND WA_PRINT-LBKUM > 0.
          CLEAR: WA_PRINT-TEMP.
          WA_PRINT-TEMP = WA_PRINT-LBKUM.
      ENDIF.

  WA_PRINT-LBKUM = WA_PRINT-TEMP.

    ENDLOOP.
    APPEND WA_PRINT TO IT_PRINT.
    SORT IT_PRINT BY MATNR.
    CLEAR: WA_ZVBR, WA_PRINT, WA_TEMP, V_TEMP, V_DATE, V_MONTH, V_MONTHMIN, V_YEAR.
  ENDLOOP.
ENDFORM.

Предполагается получить данные, которые показаны на рисунке ниже (tcode se16n):

The data that have to be the output

Поскольку в таблице matdo c имеется последняя транзакция в соответствии с датой проводки (BUDAT).

Data based on posting date in matdoc

А данные, которые я фактически получил, - это предыдущие данные.

The data is underlined with blue

Как решить эту проблему? Я застрял в этой проблеме так долго. Спасибо раньше.

1 Ответ

0 голосов
/ 09 апреля 2020

В вашем фрагменте horrifi c вы делаете сортировку, которая портит всю вашу идею:

SORT it_zvbr BY matnr.
it_temp = it_zvbr.

Это делает сортировку BUDAT по убыванию в каждой группе MATNR и разбивает вашу идею с помощью LBKUM, SELECT LBKUM после того, как ELSE получает перезаписанные с каждой итерацией l oop, поэтому он всегда сохраняет последнее значение в порядке сортировки itab, поэтому самое раннее приходит последним.

Чтобы это исправить, замените и поставить SORT после присваивания it_temp = it_zvbr.

В целом все это беспорядок и должно быть перезаписано с нуля. Просто предположите, что вам нужно здесь:

Если вам нужен общий запас из значений MATDO C, чтобы добавить его к начальному запасу из MBEWH, предшествующего месяцу BUDAT, то вам, вероятно, потребуется:

SELECT DISTINCT m~matnr,
                x~maktx,
                ew~lfgja AS initial_year,
                ew~lfmon AS initial_month,
                SUM( lp~menge ) AS total,
                MAX( ew~lbkum ) AS initial_stock
    FROM mara AS m
   INNER JOIN makt AS x
      ON m~matnr = x~matnr
   INNER JOIN matdoc AS mdoc
      ON lp~matnr = m~matnr
    LEFT OUTER JOIN mbewh AS ew
      ON ew~matnr = m~matnr
    INTO TABLE @DATA(it_stock)

   WHERE mdoc~WERKS = p_werks
     AND mdoc~budat IN p_budat 
     AND m~matkl IN ('E001', 'E002', 'E003', 'E005', 'E006', 'E007', 'E008', 'E009', 'E010', 'E011', 'E012', 'E014').
     AND ew~lfmon = ( SELECT MAX( lfmon ) 
                        FROM mbewh AS h 
                       WHERE h~matnr = m~matnr 
                         AND h~lfgja = mdoc~mjahr 
                         AND h~lfmon <> ( SELECT MAX( lfmon ) 
                                            FROM mbewh 
                                           WHERE matnr = h~matnr 
                                             AND lfgja = h~lfgja ) )
   GROUP BY mara~matnr, makt~maktx, ew~lfgja, ew~lfmon.

Я использую MJAHR для подзапроса, так как обычно он равен BUDAT первым 4 символам.

Это решение использует вложенные подзапросы на MBEWH, чтобы найти предыдущее или последнее значение в каждом периоде оценки, и это тоже выглядит уродливо, но в любом случае оно короче, чем ваш необработанный фрагмент.

...