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

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

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

如何解决这个问题?我在这个问题上纠结了很长时间。之前谢谢你了。
发布于 2020-04-10 03:35:13
在你可怕的代码片段中,你做了一个排序,这打乱了你的整个想法:
SORT it_zvbr BY matnr.
it_temp = it_zvbr.这使得BUDAT在每个MATNR组中被降序排序,并打破了你使用LBKUM的想法,ELSE之后的SELECT LBKUM在每次循环迭代时都会得到重写的,所以它总是按itab排序顺序保留最后一个值,所以最早的出现在最后。
要解决此问题,请在分配it_temp = it_zvbr后替换并放置SORT。
从整体上看,整篇文章都是一团糟,应该从头开始重写。只是推测一下您在这里需要什么:
如果您需要MATDOC值中的总库存以将其添加到前一个BUDAT月份的MBEWH的初始库存中,则您可能需要:
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的嵌套子查询来查找每个估值周期中从前到后的值,这看起来也很丑陋,但它无论如何都比您的原始数据短。
https://stackoverflow.com/questions/61093841
复制相似问题