método Precio Medio Ponderado antes de cada salida(Sistema Inventario Perpetuo)

07/08/2009 - 03:22 por Darhtian | Informe spam
Esta es una consulta que paso a ser un reto del cual sali vencido.Por
eso recurro a este foro, por si hay alguna persona que me entienda y
haya pasado por lo mismo, pido que me ayude.Realmente es
angustiantegracias.


1 cada vez que entra en el almacén un lote de mercancía,
el costo unitario del saldo resultante, debe ser recalculado.

2 La existencia física es presentada en un solo total, en vez de
estar
segregado en lotes según el orden de entrada.

3 El costeo de las unidades que van saliendo,
se hace en base al costo promedio calculado en saldo inmediato
anterior.

*mi problema es seguir el acumulado al momento de producirce una
venta,!Solo en una sentencia SQL.
*lo que deseo obtener es el promedio ponderado,el costo total y el
saldo costo total,
desde el inicio de inventario,la primera compra hasta una fecha X,que
ingrese el usuario.
Ej. desde May 01 hasta May 25(X) o la fecha que desee el usuario solo
en un registro si es posible


Ejemplo.
Fecha|transaccion|Cant. |Costo | Saldo |Promedio |
Costo |Saldo |
| |Unidad |UnIdad Unidad |Ponderado |
Total |Costo to t |
May01| Comienzo | 700 |$10 | 700 | $10 | $
7.000 | $ 7.000 |
May03| Purchase | 100 |$12 | 800 | $10.25 (*1) |
$ 1.200 | $ 8.200 |
May08| Sale | (500) | ?? | 300 | ? $10.25 |
$ - 5.125 | $ 3.075 |
May15| Purchase | 600 |$14 | 900 | $12.75 (*2) |
$ 8.400 | $ 11.475 |
May19| Purchase | 200 |$15 | 1,100 | $13.16 (*3) |
$ 3.000 | $ 14.475 |
May25| Sale | (400) | ?? | 700 | ? $13.16 | $
- 5.264 | $ 9.211 |
May27| Sale | (100) | ?? | 600 | ? $13.16 |
$ - 1.316 | $ 7.895 |
May31| fin inv. | | ?? | |
| | |

(*1) May 03 costo Promedio de 800 unidades
= (700x$10 + 100x$12) / (700 + 100)
= ( $7,000 + $1,200 ) / 800
= $8,200 / 800
= $10.25 Promedio Ponderado

Cost of goods sold on May 8 = 500x$10.25 = $5,125

(*2) May 15 costo Promedio de 900 units
= (300x$10.25 + 600x$14) / (300 + 600)
= ( $3,075 + $8,400 ) / 900
= $11,475 / 900
= $12.75 Promedio Ponderado

(*3) May 19 costo Promedio de 1,100 units
= (900x$12.75 + 200x$15) / (900 + 200)
= ( $11,475 + $3,000) / 1,100
= $14,475 / 1,100
= $13.16 Promedio Ponderado

Cost of goods sold on May 25 = 400x$13.16 = $5,264
Cost of goods sold on May 27 = 100x$13.16 = $1,316
- Total cost of goods sold
= 500x$10.25 + 400x$13.16 + 100x$13.16
= $5,125 + $5,264 + $1,316
= $11,705

Cost of ending inventory
= Beginning inventory + Costo de Compras -Total
Cost of goods sold

= $7,000 + (100x$12 + 600x$14 + 200x$15) - $11,705
= $7,000 + $12,600 - $11,705
= $7,895
'este es mi tabla con los mismos valores del ejemplo de mas arriba
create table Existencia (Ex_Corr int auto_increment,
Ex_Fecha datetime,
Ex_codigo nvarchar(16),
Ex_CantEnt money,
Ex_CantSal money,
Ex_PrecComp money)
go

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('01-05-2009 0:00:00','500',700,0,10)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('03-05-2009 0:00:00','500',100,0,12)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('08-05-2009 0:00:00','500',0,500,0)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('15-05-2009 0:00:00','500',600,0,14)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('19-05-2009 0:00:00','500',200,0,15)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('25-05-2009 0:00:00','500',0,400,0)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('27-05-2009 0:00:00','500',0,100,0)

update Existencia set Ex_Fecha = CONVERT(char(10), Ex_Fecha, 103)

-
Sum(Cantidad Unidad * Costo Unidad )as SaldoCostoTotal / Sum(Cantidad
Unidad) as SaldoUnidad
se divide el saldo Costo Total con saldo unidad para obtener Promedio
Ponderado


'este es mi avance
'Vista
SELECT TOP (100) PERCENT CONVERT(char(10), Ex_Fecha, 103) AS
[Order Date], Ex_PrecComp,
CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt ELSE - Ex_CantSal END AS
Ex_CanEnt,
(SELECT SUM(CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt
ELSE - Ex_CantSal END) AS SaldoCantidadUnitaria
FROM dbo.Existencia AS M2
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr)) AS
SaldoCantidadUnitaria,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS
PPv_Entradas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <O.Ex_corr))
ELSE -
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS
PPv_Salidas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
END) AS PromedioPonderado,
Ex_CantEnt * Ex_PrecComp AS Cant_X_prComp,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
ELSE
(SELECT SUM(Ex_Cantsal) * (SUM(Ex_CantEnt * Ex_PrecComp) / SUM
(Ex_CantEnt)) AS CostoUnitarioEntrada
FROM dbo.Existencia AS M565
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
-(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <O.Ex_corr))
END) AS CostoUnidad
FROM dbo.Existencia AS O
WHERE (Ex_Codigo = N'500')
ORDER BY Ex_corr
'fin
*(CASE WHEN Ex_CantEnt > 0 THEN)si Ex_CantEnt tiene un valor es Compra
sino es venta
 

Leer las respuestas

#1 Carlos Sacristan
07/08/2009 - 08:16 | Informe spam
Sin el diseño de las tablas involucradas y unos datos de ejemplo es
complicado que te podamos echar una mano

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Darhtian" wrote in message
news:
Esta es una consulta que paso a ser un reto del cual sali vencido.Por
eso recurro a este foro, por si hay alguna persona que me entienda y
haya pasado por lo mismo, pido que me ayude.Realmente es
angustiantegracias.


1 cada vez que entra en el almacén un lote de mercancía,
el costo unitario del saldo resultante, debe ser recalculado.

2 La existencia física es presentada en un solo total, en vez de
estar
segregado en lotes según el orden de entrada.

3 El costeo de las unidades que van saliendo,
se hace en base al costo promedio calculado en saldo inmediato
anterior.

*mi problema es seguir el acumulado al momento de producirce una
venta,!Solo en una sentencia SQL.
*lo que deseo obtener es el promedio ponderado,el costo total y el
saldo costo total,
desde el inicio de inventario,la primera compra hasta una fecha X,que
ingrese el usuario.
Ej. desde May 01 hasta May 25(X) o la fecha que desee el usuario solo
en un registro si es posible


Ejemplo.
Fecha|transaccion|Cant. |Costo | Saldo |Promedio |
Costo |Saldo |
| |Unidad |UnIdad Unidad |Ponderado |
Total |Costo to t |
May01| Comienzo | 700 |$10 | 700 | $10 | $
7.000 | $ 7.000 |
May03| Purchase | 100 |$12 | 800 | $10.25 (*1) |
$ 1.200 | $ 8.200 |
May08| Sale | (500) | ?? | 300 | ? $10.25 |
$ - 5.125 | $ 3.075 |
May15| Purchase | 600 |$14 | 900 | $12.75 (*2) |
$ 8.400 | $ 11.475 |
May19| Purchase | 200 |$15 | 1,100 | $13.16 (*3) |
$ 3.000 | $ 14.475 |
May25| Sale | (400) | ?? | 700 | ? $13.16 | $
- 5.264 | $ 9.211 |
May27| Sale | (100) | ?? | 600 | ? $13.16 |
$ - 1.316 | $ 7.895 |
May31| fin inv. | | ?? | |
| | |

(*1) May 03 costo Promedio de 800 unidades
= (700x$10 + 100x$12) / (700 + 100)
= ( $7,000 + $1,200 ) / 800
= $8,200 / 800
= $10.25 Promedio Ponderado

Cost of goods sold on May 8 = 500x$10.25 = $5,125

(*2) May 15 costo Promedio de 900 units
= (300x$10.25 + 600x$14) / (300 + 600)
= ( $3,075 + $8,400 ) / 900
= $11,475 / 900
= $12.75 Promedio Ponderado

(*3) May 19 costo Promedio de 1,100 units
= (900x$12.75 + 200x$15) / (900 + 200)
= ( $11,475 + $3,000) / 1,100
= $14,475 / 1,100
= $13.16 Promedio Ponderado

Cost of goods sold on May 25 = 400x$13.16 = $5,264
Cost of goods sold on May 27 = 100x$13.16 = $1,316
- Total cost of goods sold
= 500x$10.25 + 400x$13.16 + 100x$13.16
= $5,125 + $5,264 + $1,316
= $11,705

Cost of ending inventory
= Beginning inventory + Costo de Compras -Total
Cost of goods sold

= $7,000 + (100x$12 + 600x$14 + 200x$15) - $11,705
= $7,000 + $12,600 - $11,705
= $7,895
'este es mi tabla con los mismos valores del ejemplo de mas arriba
create table Existencia (Ex_Corr int auto_increment,
Ex_Fecha datetime,
Ex_codigo nvarchar(16),
Ex_CantEnt money,
Ex_CantSal money,
Ex_PrecComp money)
go

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('01-05-2009 0:00:00','500',700,0,10)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('03-05-2009 0:00:00','500',100,0,12)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('08-05-2009 0:00:00','500',0,500,0)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('15-05-2009 0:00:00','500',600,0,14)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('19-05-2009 0:00:00','500',200,0,15)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('25-05-2009 0:00:00','500',0,400,0)

insert into Existencia
(Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_CantSal)
values
('27-05-2009 0:00:00','500',0,100,0)

update Existencia set Ex_Fecha = CONVERT(char(10), Ex_Fecha, 103)

-
Sum(Cantidad Unidad * Costo Unidad )as SaldoCostoTotal / Sum(Cantidad
Unidad) as SaldoUnidad
se divide el saldo Costo Total con saldo unidad para obtener Promedio
Ponderado


'este es mi avance
'Vista
SELECT TOP (100) PERCENT CONVERT(char(10), Ex_Fecha, 103) AS
[Order Date], Ex_PrecComp,
CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt ELSE - Ex_CantSal END AS
Ex_CanEnt,
(SELECT SUM(CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt
ELSE - Ex_CantSal END) AS SaldoCantidadUnitaria
FROM dbo.Existencia AS M2
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr)) AS
SaldoCantidadUnitaria,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS
PPv_Entradas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <O.Ex_corr))
ELSE -
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS
PPv_Salidas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
END) AS PromedioPonderado,
Ex_CantEnt * Ex_PrecComp AS Cant_X_prComp,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
ELSE
(SELECT SUM(Ex_Cantsal) * (SUM(Ex_CantEnt * Ex_PrecComp) / SUM
(Ex_CantEnt)) AS CostoUnitarioEntrada
FROM dbo.Existencia AS M565
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
-(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <O.Ex_corr))
END) AS CostoUnidad
FROM dbo.Existencia AS O
WHERE (Ex_Codigo = N'500')
ORDER BY Ex_corr
'fin
*(CASE WHEN Ex_CantEnt > 0 THEN)si Ex_CantEnt tiene un valor es Compra
sino es venta

Preguntas similares