http://topic.csdn.net/u/20090918/20/ba975da3-dc93-47a5-8456-d5d7f1146705.html?73024
环境:MSSQL2000 高难度全月加权平均
表IO_STORE ----出入库明细 ISIND=1为进仓单 ; ISIND=0为出仓单
采用全月一次加权平均法计算单价,本月结存单价、数量、金额作为下月的期初,如此类推;
根据不同的查询起始日期和结束日期有不同的结果
注意:如果是调拨单的调入单价则必须取调出单价
仓库 单号 日期 货品 数量 单价 金额 进/出仓
STORE BC BD GOODS QTY PRICE AM ISIN
原料仓 IN001 2009-07-30 A001 300 20 6000 1 --7月份
原料仓 IN002 2009-07-29 B001 400 2 800 1
原料仓 IN101 2009-08-01 A001 30 20 600 1 --8月份
原料仓 IN103 2009-08-20 A001 50 22 1100 1
原料仓 IN203 2009-08-25 A001 20 23 460 1
原料仓 IN123 2009-08-26 B001 300 2 600 1
原料仓 OU100 2009-08-26 A001 30 0 0 0 --8月份出仓
原料仓 OU202 2009-08-27 B001 20 0 0 0
原料仓 OU132 2009-08-29 B001 40 0 0 0
原料仓 IN123 2009-09-01 A001 500 21 10500 1 ---9月份进仓
原料仓 IN125 2009-09-20 B001 500 2.2 1100 1
半成仓 OU129 2009-09-25 B001 23 0 0 1 ---此为调拨单 单号相同 这里没有单价
原料仓 OU211 2009-09-08 A001 100 0 0 0 ---9月份出仓
原料仓 OU213 2009-09-27 B001 120 0 0 0
原料仓 OU129 2009-09-25 B001 23 0 0 0 ---此为调拨单 单号相同
求结果如下有2点:
1/第一种方案 (希望能做成函数)
(@FROMDATE DATETIME, @TODATE DATETIME) ---查询 ('2009-08-01','2009-08-31')
仓库 货品 期初数量 期初单价 期初金额 收入数量 收入单价 收入金额 发出数量 发出单价 发出金额 结存数量 结存单价 结存金额
STORE GOODS SQT SPRICE SAM IQT IPRICE IAM OQT OPRICE OAM EQT EPRICE EAM
原料仓 A001 300 20 6,000.00 100 21.6 2,160.00 70 20.4 1,428.00 330 20.4 6,732.00
原料仓 B001 400 2 800 300 2 600 20 2 40 680 2 1,360.00
(@FROMDATE DATETIME, @TODATE DATETIME) ---查询 ('2009-09-01','2009-08-30')
仓库 货品 期初数量 期初单价 期初金额 收入数量 收入单价 收入金额 发出数量 发出单价 发出金额 结存数量 结存单价 结存金额
STORE GOODS SQT SPRICE SAM IQT IPRICE IAM OQT OPRICE OAM EQT EPRICE EAM
原料仓 A001 330 20.4 6,732.00 500 21 10,500.00 100 20.761 2,076.14 730 20.761 15,155.86
原料仓 B001 680 2 1,360.00 500 2.2 1,100.00 143 2.085 298.12 1,037 2.085 2,161.88
半成仓 B001 0 0 0 23 2.085 47.95 0 0 0 23 2.085 47.95
2/求把计算出来的当天的发出单价回填到出仓单和进仓单(调拨单) ISIND=0为出仓单
还有补充说明一下, 在调拨单中 出仓单和进仓单 单号是一样的。
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-19 01:17:51
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
---------------------------------*/
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([STORE] NVARCHAR(10),[BC] NVARCHAR(10),[BD] DATETIME,[GOODS] NVARCHAR(10),[QTY] INT,[PRICE] DECIMAL(18,1),[AM] INT,[ISIN] INT)
INSERT [tb]
SELECT N'原料仓','IN001',N'2009-07-30','A001',300,20,6000,1 UNION ALL
SELECT N'原料仓','IN002',N'2009-07-29','B001',400,2,800,1 UNION ALL
SELECT N'原料仓','IN101',N'2009-08-01','A001',30,20,600,1 UNION ALL
SELECT N'原料仓','IN103',N'2009-08-20','A001',50,22,1100,1 UNION ALL
SELECT N'原料仓','IN203',N'2009-08-25','A001',20,23,460,1 UNION ALL
SELECT N'原料仓','IN123',N'2009-08-26','B001',300,2,600,1 UNION ALL
SELECT N'原料仓','OU100',N'2009-08-26','A001',30,0,0,0 UNION ALL
SELECT N'原料仓','OU202',N'2009-08-27','B001',20,0,0,0 UNION ALL
SELECT N'原料仓','OU132',N'2009-08-29','B001',40,0,0,0 UNION ALL
SELECT N'原料仓','IN123',N'2009-09-01','A001',500,21,10500,1 UNION ALL
SELECT N'原料仓','IN125',N'2009-09-20','B001',500,2.2,1100,1 UNION ALL
SELECT N'半成仓','OU129',N'2009-09-25','B001',23,0,0,1 UNION ALL
SELECT N'原料仓','OU211',N'2009-09-08','A001',100,0,0,0 UNION ALL
SELECT N'原料仓','OU213',N'2009-09-27','B001',120,0,0,0 UNION ALL
SELECT N'原料仓','OU129',N'2009-09-25','B001',23,0,0,0
GO
--SELECT * FROM [tb]
-->SQL查询如下:
--创建更新单价的存储过程:
IF NOT OBJECT_ID('[sp_up_price]') IS NULL
DROP PROC [sp_up_price]
GO
CREATE PROC sp_up_price
AS
SET NOCOUNT ON
DECLARE @m VARCHAR(7)
DECLARE c CURSOR FOR
SELECT CONVERT(VARCHAR(7),BD,23)
FROM tb
GROUP BY CONVERT(VARCHAR(7),BD,23)
ORDER BY 1
OPEN c
FETCH NEXT FROM c INTO @m
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE a SET
a.price=b.price,a.am=b.price*a.qty
FROM TB AS a
JOIN (
SELECT store,goods,CAST(SUM(amt)*1./SUM(qty) AS DECIMAL(18,2)) AS price
FROM (
--获取本月的数量金额
SELECT store,goods,
amt=SUM(CASE isin WHEN 1 THEN am ELSE 0 END),
qty=SUM(CASE isin WHEN 1 THEN qty ELSE 0 END)
FROM tb
WHERE BD BETWEEN CAST(@m+'-01' AS DATETIME) AND DATEADD(ms,-3,DATEADD(mm,1,@m+'-01'))
GROUP BY store,goods
UNION ALL
--获取本月期初的数量金额
SELECT store,goods,
amt=SUM(CASE isin WHEN 1 THEN am ELSE -am END),--金额
qty=SUM(CASE isin WHEN 1 THEN qty ELSE -qty END) --数量
FROM tb
WHERE BD < CAST(@m+'-01' AS DATETIME)
GROUP BY store,goods
) AS t
GROUP BY store,goods
) AS B
ON a.store=b.store AND a.goods=b.goods
WHERE a.BD BETWEEN CAST(@m+'-01' AS DATETIME) AND DATEADD(ms,-3,DATEADD(mm,1,@m+'-01'))
AND a.isin=0
--更新调拨单单价
UPDATE a SET
a.price=b.price,a.am=a.qty*b.price
FROM (
SELECT * FROM TB
WHERE isin=1 AND price=0
AND BD BETWEEN CAST(@m+'-01' AS DATETIME)
AND DATEADD(ms,-3,DATEADD(mm,1,@m+'-01'))
) AS a
JOIN (
SELECT * FROM TB
WHERE isin=0
AND BD BETWEEN CAST(@m+'-01' AS DATETIME)
AND DATEADD(ms,-3,DATEADD(mm,1,@m+'-01'))
) AS b
ON a.goods=b.goods AND a.bc=b.bc--加个这个条件
FETCH NEXT FROM c INTO @m
END
CLOSE c
DEALLOCATE c
SET NOCOUNT OFF
GO
--执行更新反填单价:
EXEC sp_up_price
--查询结果:
SELECT * FROM tb
/*
STORE BC BD GOODS QTY PRICE AM ISIN
---------- ---------- ----------------------- ---------- ----------- --------------------------------------- ----------- -----------
原料仓 IN001 2009-07-30 00:00:00.000 A001 300 20.0 6000 1
原料仓 IN002 2009-07-29 00:00:00.000 B001 400 2.0 800 1
原料仓 IN101 2009-08-01 00:00:00.000 A001 30 20.0 600 1
原料仓 IN103 2009-08-20 00:00:00.000 A001 50 22.0 1100 1
原料仓 IN203 2009-08-25 00:00:00.000 A001 20 23.0 460 1
原料仓 IN123 2009-08-26 00:00:00.000 B001 300 2.0 600 1
原料仓 OU100 2009-08-26 00:00:00.000 A001 30 20.4 612 0
原料仓 OU202 2009-08-27 00:00:00.000 B001 20 2.0 40 0
原料仓 OU132 2009-08-29 00:00:00.000 B001 40 2.0 80 0
原料仓 IN123 2009-09-01 00:00:00.000 A001 500 21.0 10500 1
原料仓 IN125 2009-09-20 00:00:00.000 B001 500 2.2 1100 1
半成仓 OU129 2009-09-25 00:00:00.000 B001 23 2.1 48 1
原料仓 OU211 2009-09-08 00:00:00.000 A001 100 20.7 2074 0
原料仓 OU213 2009-09-27 00:00:00.000 B001 120 2.1 250 0
原料仓 OU129 2009-09-25 00:00:00.000 B001 23 2.1 48 0
(15 行受影响)
*/
分享到:
相关推荐
加权平均法是一种常见的出库核算方法,其计算流程如下: 1. **计算本期的期初数据**:获取上一会计期间末的库存数量和总成本,作为计算的基础。 2. **计算本期的入库单**:统计本会计期间内所有入库商品的数量和总...
本篇文章将详细介绍速达软件成本核算篇的三个主要方法:移动加权平均法、个不指定法和全月一次加权平均法,并对每种方法的计算公式、应用场景和注意事项进行了详细的解释。 一、移动加权平均法 移动加权平均法是...
速达软件在成本核算方面提供了三种主要方法,分别是移动加权平均法、个别指定法和全月一次加权平均法。这些方法针对不同类型的商业操作和用户需求,各有适用场景。 1. 移动加权平均法:这是速达软件最早采用的成本...
该功能的应用场景包括加权平均法下,退货类单据系统目前是作为出库序列,无法参与加权平均计算的情况。 其他存货核算 - 获取分配权重 其他存货核算 - 获取分配权重功能旨在提供权重计算的能力,目前仅支持以“期初...
在库存成本计算中,存在两种主要的计算方法:移动加权平均成本法和月加权平均成本法。 移动加权平均成本法依据每一次交易活动来计算库存成本。其核心在于,每当有进货、领料、入库等交易发生时,都会根据交易的数量...
2. 难以根据管理需求应用先进的方法合理计算存货价值,例如,频繁的进出库活动使得成本计算量增大,企业可能选择加权平均法,但未充分考虑管理角度的成本计算方法。 3. 存货管理能力低下,无法及时了解存货的价值与...
例如,销售出库单价与加权平均单价不符,出库单已生成凭证,系统无法根据核算结果反填单价,从而导致余额未能正确分摊。 3. 出库核算后的人为操作不当。如修改出库单的核算单价,有时虽是业务需求,但这种操作可能...
K/3 存货核算系统提供了总仓核算、分仓核算和分仓库组核算三种方式。以总仓核算为例,出库单价计算是系统自动进行的,正常情况下不应出现异样余额。然而,当期初无结存数量,本期有暂估补差或金额调整单但无出入库...
费用分配根据分配方式(金额或数量)进行,而入库核算则依据加权平均法计算成本。 委外入库核算涉及委外加工入库单、采购发票和费用发票的钩稽。加工费的分配和入库成本计算同样关键。如果发票未到,系统可支持部分...
另外,当出库单据在核算前已被生成凭证,若凭证金额与加权平均法计算的金额不符,也会导致异常余额的产生。 解决这些问题的方法主要包括:1) 对于期初无结存,但有暂估补差或金额调整的情况,可以通过调整业务流程...
在存货管理中,平均单价计算法是一种常用的库存成本计算方法,通过计算库存商品的加权平均成本来确定出库时的成本,有助于更准确地反映库存价值。 第四部分是“生成凭证”。凭证是会计记录的基础,通过这个步骤,...
- 库存商品类存货按照全月一次加权平均法核算,期末存货的结存成本为期末的一次加权平均单价乘以存货结存数量。 #### 四、总结 通过上述内容可以看出,进销存财务算法不仅有助于企业进行存货的日常管理,还能够帮助...
详细阐述如何定义核算范围,选择适合的物料计价方法,如先进先出(FIFO)、后进先出(LIFO)、加权平均法等,以符合会计准则并合理计算存货成本。 2.4 库存管理系统启用及初始化 这一章节涵盖启用库存管理系统的...
这部分内容可能涉及到成本计算方法的选取,如先进先出法、加权平均法等,以及如何依据这些数据生成符合会计原则的会计凭证。 总的来说,这份学习教案详细阐述了会计信息化环境下库存管理和存货核算的实践操作,对于...
成本核算原理通常采用移动加权平均法,每次进货都会更新物料的单位成本,确保成本的实时性。厨房消耗与营业对比报表、菜品成本差异报表则是成本控制的关键,通过对比标准成本和实际成本,分析毛利额和毛利比,有助于...
* 存货成本计算可以按照计划成本计价,也可以按照实际成本计价,例如加权平均、移动加权平均、先进先出、后进先出和个别计价等方法。 知识点三:会计信息化库存管理存货核算系统的功能 ---------------------------...
此外,还需设置成本核算方法,如移动加权平均法、先进先出法等,以便准确计算库存成本。 2. **采购管理**:采购入库时,系统能自动记录采购单据,包括采购价格、数量等信息,并与供应商对账,生成相应的会计凭证,...
2. 仓存参数:仓存参数的配置至关重要,如启用年度和期间的设定、是否允许负库存、存货核算方式(总仓核算或分仓核算)、库存更新方式(审核后更新)等。启用年度和期间一旦设定,一般不再修改,负库存可能导致成本...
4. **计价方法变更**:支持多种存货计价方法(如先进先出、后进先出、加权平均等),以适应不同企业的管理需求。 5. **核算单据查询**:提供详尽的单据查询功能,便于审计和内部管理。 6. **入库汇总核算**:对入库...
存货核算在企业的财务管理中占有重要地位,因为它直接影响到企业的成本计算和利润表现。这份“存货核算培训教材.ppt”详细介绍了存货的相关概念、确认条件、分类以及核算方法,旨在帮助学习者掌握存货管理的核心知识...