【问题标题】:History of Available Stock in SAP B1SAP B1 中可用库存的历史记录
【发布时间】:2025-12-05 17:35:02
【问题描述】:

我怎样才能找到过去某个特定日期的可用库存?

我知道如何获取过去任何日期的 OnHand:

    SELECT LocType, LocCode, ItemCode, SUM(InQty-OutQty) [OnHand]
    From OIVL
    Where DocDate <= '7/7/2017'
        AND ITEMCODE = 'xyz' 
    Group by LocType, LocCode, ItemCode

但这并不能说明所提交的内容。它显示手头有什么,但不是实际可用的(OnHand - Committed = Available)。那么,我怎样才能获得过去日期的“可用”数字?

谢谢!

【问题讨论】:

  • 请阅读this,了解一些改进问题的技巧。使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。
  • 它不会让我为帖子创建好的标签,因为我对用户来说太新了。 sap-business-one 或 business-one-9.2 标签会很好,因为这更像是一个独立于数据库或其他技术的 SAP B1 模式/分类问题
  • 什么是(OnHand - Committed = Available)在 dB 模式方面?
  • 在 SAP 表中,我想知道如何找到过去某个点的承诺数。我知道如何在当前日期获得承诺,查看销售订单和库存转移。我怎样才能看到六个月前的某一天“承诺”了什么?我认为这可能涉及挖掘销售订单和库存转移的历史记录。如果他们是一种更简单的方法,或者如果有人已经有查询要这样做,那就太好了
  • 我仍然没有找到关于如何获取 OnHand/OnOrder/isCommitted/Available 的库存变化历史的好的答案。现在,我最终在这些库存属性上设置了缓慢变化的维度。它不会让我们了解过去的历史,但我们可以开始生成历史以提高准确性

标签: tsql sql-server-2008-r2 report reporting sapb1


【解决方案1】:

如果这对其他人有帮助.... 下面是一个示例,说明如何在 SAP BusinessOne 中获取您的项目数量和成本历史记录。将要查看历史记录的日期和项目传递到函数中。如果您省略项目代码,它将返回所有项目。

CREATE FUNCTION [dbo].[ufnStockAndCostHistory]
(	
	@EndDate DATETIME, @ItemCode NVARCHAR(255) = 'All'
)
RETURNS TABLE 
AS
RETURN 
(
	WITH Cost AS (
		SELECT
			OINM.TransNum,
			OINM.ItemCode,
			OINM.Warehouse,
			OINM.Balance,
			OINM.CreateDate
		FROM OINM (NOLOCK)
			JOIN OITM (NOLOCK) ON OITM.ItemCode = OINM.ItemCode
			JOIN OITB (NOLOCK) ON OITM.ItmsGrpCod=OITB.ItmsGrpCod
		WHERE  OINM.CreateDate <= @EndDate

	),
	FinalCostByWarehouse AS (
		SELECT *
		FROM Cost 
		WHERE TransNum = (
			SELECT MAX(TransNum)
			FROM Cost sub
			WHERE Cost.ItemCode = sub.ItemCode
				AND Cost.Warehouse = sub.Warehouse)
	),
	Quantity AS (
		SELECT
			OINM.ItemCode,
			OINM.Warehouse,
			SUM(OINM.InQty) - SUM(OINM.OutQty) [Qty]
		FROM OINM (NOLOCK)
			JOIN OITM (NOLOCK) ON OITM.ItemCode = OINM.ItemCode
			JOIN OITB (NOLOCK) ON OITM.ItmsGrpCod=OITB.ItmsGrpCod
		WHERE OINM.CreateDate <= @EndDate
		group by OINM.ItemCode, OINM.Warehouse
	)
	SELECT 
		OITW.ItemCode,
		OITW.WhsCode,
		c.Balance [Cost],
		q.Qty [Quantity]
	FROM OITW
		LEFT JOIN FinalCostByWarehouse c ON OITW.ItemCode = c.ItemCode
			AND OITW.WhsCode = c.Warehouse
		LEFT JOIN Quantity q ON OITW.ItemCode = q.ItemCode
			AND OITW.WhsCode = q.Warehouse
	WHERE (OITW.ItemCode = @ItemCode
		OR @ItemCode = 'All')
		AND (ISNULL(c.Balance,0) > 0
			OR ISNULL(q.Qty,0) > 0)
)

用法如下:

SELECT *
FROM ufnStockAndCostHistory('9/15/2017','B107A-12HB')

【讨论】: