首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取最新的MBEWH~LBKUM值?

如何获取最新的MBEWH~LBKUM值?
EN

Stack Overflow用户
提问于 2020-04-08 13:25:03
回答 1查看 471关注 0票数 0

这个程序实际上是用来计算从过帐日期(MATDOC-BUDAT)起有限制的总库存。但我在确定初始库存时遇到了问题。初始库存(MBEWH-LBKUM)取自过帐日期前一个月的数据。但是在我编写的程序中,出现的初始股票数据(MBEWH-LBKUM)没有进行应有的更新。同时,如果引用发布日期( matdoc -budat /我连接到matdoc表的查询),应该出现的初始库存数据就不是这样了。

但是,如果我只选择短时间内的发布日期,则显示的结果是正确的

我的问题是:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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):

因为在matdoc表中,存在根据过帐日期(BUDAT)的最新事务。

我实际得到的数据是之前的数据。

如何解决这个问题?我在这个问题上纠结了很长时间。之前谢谢你了。

EN

回答 1

Stack Overflow用户

发布于 2020-04-10 03:35:13

在你可怕的代码片段中,你做了一个排序,这打乱了你的整个想法:

代码语言:javascript
复制
SORT it_zvbr BY matnr.
it_temp = it_zvbr.

这使得BUDAT在每个MATNR组中被降序排序,并打破了你使用LBKUM的想法,ELSE之后的SELECT LBKUM在每次循环迭代时都会得到重写的,所以它总是按itab排序顺序保留最后一个值,所以最早的出现在最后。

要解决此问题,请在分配it_temp = it_zvbr后替换并放置SORT。

从整体上看,整篇文章都是一团糟,应该从头开始重写。只是推测一下您在这里需要什么:

如果您需要MATDOC值中的总库存以将其添加到前一个BUDAT月份的MBEWH的初始库存中,则您可能需要:

代码语言:javascript
复制
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的嵌套子查询来查找每个估值周期中从前到后的值,这看起来也很丑陋,但它无论如何都比您的原始数据短。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61093841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档