2012-06-26 12 views
5

He aquí un artículo interesante que he encontrado útiles en mi proyecto:primero en entrar, primero en salir (FIFO) inventario costando

Set-based Speed Phreakery: The FIFO Stock Inventory SQL Problem:

de la mesa que utilizamos para realizar un seguimiento de los movimientos de las orugas de stock dentro y fuera de nuestro stock stock imaginario. Nuestro almacén está inicialmente vacío, y el stock se mueve al almacén como resultado de una compra de stock (tranCode = 'IN'), o debido a un retorno posterior (tranCode = 'RET'), y el stock se mueve fuera del almacén cuando se vende (tranCode = 'OUT'). Cada tipo de inventario está identificado por un ArticleID. Cada movimiento de stock dentro o fuera del almacén, debido a una compra, venta o devolución de un artículo dado, da como resultado que se agregue una fila a la tabla de inventario, identificada de manera única por el valor en la columna de identidad de StockID, y describa cuántos los artículos se agregaron o eliminaron, el precio de las compras, la fecha de la transacción, etc.

Aunque estoy usando esto en mi proyecto en curso, me quedo atascado sobre cómo hacer que el precio a cargo en cada transacción sea 'FUERA'. Necesito tener este valor para determinar cuánto cobraré a mis clientes.

  1. Primero se debe agregar 5 manzanas (cada uno $ 10.00) a la acción, para un total de compra de $ 50.00

  2. Añadir 3 manzanas (cada uno $ 20.00) al total balance de 8 manzanas, por un precio total de $ 110.00

  3. luego sacar 6 artículos (5 cada uno $ 10.00 y 1 cada $ 20,00) $ 70 totales

  4. Después de la transacción que se irá 2 manzanas @ $ 20 cada uno con un total $ 40


Here's my current table 
Item transaction code qty  price 
apple IN     5  10.00  
apple IN     3  20.00 
apple OUT     6   

Manual computation for the OUT transaction price (FIFO) 
QTY  price total price 
5  10.00 50.00 
1  20.00 20.00 
TOTAL:6   70.00 

Output of the script: 
Item CurrentItems CurrentValue 
apple 2   40.00 

What I need: 
Item transaction code qty  price CurrentItems CurrentValue 
apple IN     5  10.00 5    50.00 
apple IN     3  20.00 8    110.00 
apple OUT     6    2     40.00 

This too will be OK 
Item transaction code qty  price CurrentItems  
apple IN     5  10.00 0    
apple IN     3  20.00 0     
apple OUT     6   70 

El guión escrito que ganó la competencia era muy útil, espero que alguien me puede ayudar sobre cómo obtener el precio por OUT transacción

+0

necesita dar a cada transacción (In, Out, ret) un número único para que pueda saber la cantidad y el precio de las manzanas. En función de eso, puede calcular cuánto ha calculado el total (cantidad * precio) –

+0

Hay una clave principal en la tabla de valores. es solo que no quería mostrarlo por simplicidad, también estoy usando ItemID en lugar de la palabra apple. No puede simplemente calcular el precio por (cantidad * precio) solo, recuerde que necesito implementar la regla FIFO. – samantha07

Respuesta

0

¿Qué hay de construir una tabla que tiene una fila por artículo de producto, por lo que se inserta una fila para cada manzana junto con su precio y disponibilidad (sin vender/vender).
Luego puede seleccionar los primeros n elementos, con el precio asociado con cada uno de los productos que desea. Básicamente, solo está creando una cola de elementos y eliminando los que están "sin vender" desde el frente (con la fecha de inserción más antigua) de la cola.

+0

gracias. eso es exactamente lo que está haciendo mi mesa. tal vez no entiendo tu punto, ¿puedes darme un ejemplo? – samantha07

0

Según el artículo, el resultado que obtuvo la secuencia de comandos fue el valor del inventario. Debería modificar esto para que, en lugar de calcular para todo el inventario, solo use los primeros N elementos.

Sugeriría una declaración CASE para establecer el número de elementos de cada 'ENTRADA' mientras compara el total acumulado ya que conoce los artículos del inventario y el número que quiere sacar.

1

Sugiero diseñar su tabla de la siguiente manera: Agregue un nuevo campo a su tabla, es decir.qty_out

La tabla antes de vender:

Item transaction code qty  qty_out price 
apple IN     5 0  10.00  
apple IN     3 0  20.00 
apple OUT     6 null 

Y la mesa después de la venta de los 6 artículos:

Item transaction code qty  qty_out price 
apple IN     5 5  10.00  
apple IN     3 1  20.00 
apple OUT     6 null 

Puede comparar "Cant" con "qty_out" (para las transacciones en) para encontrar el precio.

0

No puede rastrear cada transacción OUT, pero puede calcularla tomando la última (excepto para lo que va a calcular) la fila IN y OUT y la columna de valor actual y el valor actual menos que desea calcular.

en este ejemplo

StockID ArticleID TranDate TranCode Items Price CurrentItems CurrentValue 
4567  10000  10:45:07 IN   738 245.94    738 181,503.72 
21628 10000  12:05:25 OUT   600      138  33,939.72 
22571 10000  14:39:27 IN   62 199.95    200  46,336.62 
30263 10000  16:14:13 OUT   165      35  6,998.25 
42090 10000  18:18:58 RET   5      40  7,998.00 
53143 10000  20:18:54 IN   500 135.91    540  75,953.00 

para la transacción 30263 precio será de 46,336.62 - 6,998.25 = 39,338.37

0

ver el código a continuación en TSQL. La idea básica es

  1. para cada fila vender, dicen que la cantidad es Cant, corriendo calcular las ventas totales ANTES de la fila actual, lo llaman Previous_Sold.

  2. por cada fila de venta en el paso 1, encuentre todas las filas de compra ANTERIORES y calcule el stock total acumulado hasta esa compra, llámelo Prior_Running_Stock.

  3. para las filas de compra en el paso 2, calcular

Open_Stock = Previous_Running_Stock - Previous_Sold

Close_stock = Previous_Running_Stock - Previous_Sold - Cant.

  1. filtro y sólo mantener a comprar las líneas que sean

open_stock> 0, es decir, hay stock suficiente para llenar la orden de venta

y close_stock < 0, significado stock de la fila de compras, todas usadas, o primeras (primera fila) donde close_stock> = 0, lo que significa que la compra de esa fila se usa parcialmente.

  1. agregado (suma del producto) precio y la cantidad para obtener el costo LIFO en el paso 4.

creo que puede ser fácilmente modificado para LIFO y el coste medio también.

--initial table of trades 
item  item_trade_order  direction unit_price qty 
Apple  1     buy  10   100 
Apple  2     buy  9    150 
Blueberry 1     buy  5    300 
Apple  3     sell  12   50 
Apple  4     buy  11   200 
Apple  5     sell  10   350 
Blueberry 2     sell  10   50 


--code, using CTE 


; with step1 as 
(
    select * 
     , coalesce(sum(case direction when 'sell' then 1 else 0 end * qty) over(partition by item order by item_order rows between unbounded preceding and 1 preceding), 0) Previous_Sold 
    from trade 
) 
, step2_3 as 
(
    select * 
     , Previous_running_stock - Previous_Sold Open_Stock 
     , Previous_running_stock - Previous_Sold - qty Close_Stock 
     , ROW_NUMBER() over(partition by item, item_order order by (case when Previous_running_stock - Previous_Sold - qty < 0 then null else 0 - item_order end) desc) rnk 
    from step1 t1 
    cross apply 
    (
     select item_order batch_order, price batch_prc, qty batch_qty 
      , sum(qty) over(order by item_order rows unbounded preceding) Previous_running_stock 
     from trade 
     where direction = 'buy' 
     and item = t1.item 
     and item_order < t1.item_order 
    ) batch 
    where t1.direction = 'sell' 
) 
, step4 as 
(
    select * 
    from step2_3 
    where Open_Stock > 0 
    and (Close_Stock < 0 or rnk = 1) 
) 
select item, item_order, direction, AVG(price) prc, AVG(qty) qty 
    , sum(case when Close_Stock > 0 then batch_qty - close_stock else case when open_stock < batch_qty then open_stock else batch_qty end end * Batch_Prc)/nullif(avg(qty), 0) FifoUnitCost 
from step4 
group by item, item_order, direction 
order by item, item_order