He estado investigando CTE tratando de determinar si es posible actualizar recursivamente los registros de cantidad de inventario con una cantidad de orden hasta que se consuma la cantidad de la orden.CTE - cantidad de actualización recursiva hasta el total consumido
Estas son las tablas y registros:
CREATE TABLE [dbo].[myOrder](
[Account] [float] NOT NULL,
[Item] [float] NOT NULL,
[Quantity] [float] NOT NULL
) ON [PRIMARY]
insert into dbo.myOrder values (12345, 1, 50)
CREATE TABLE [dbo].[myInventory](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Account] [float] NOT NULL,
[InvDate] [numeric](18, 0) NOT NULL,
[Item] [float] NOT NULL,
[Quantity] [float] NOT NULL,
[QuantitySold] [float] NOT NULL
) ON [PRIMARY]
insert into dbo.myInventory values (12345, 111287, 1, 45, 40)
insert into dbo.myInventory values (12345, 111290, 1, 40, 0)
insert into dbo.myInventory values (12345, 111290, 1, 12, 0)
insert into dbo.myInventory values (12345, 111291, 1, 25, 0)
El registro de la tabla Myorder indica que una orden se va a crear para la cuenta 12345 para el punto # 1, cantidad 50:
Account Item Quantity
------- ---- --------
12345 1 50
La tabla de inventario muestra que tenemos a mano un gran número de productos para la cuenta 12345:
ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1 12345 111287 1 45 40
2 12345 111290 1 40 0
3 12345 111290 1 12 0
4 12345 111291 1 25 0
The goa l debe comenzar a introducir la cantidad de pedido de 50 en los registros de inventario hasta que se consuman los 50. Los registros de inventario están ordenados por el valor en la columna InvDate. El registro 1 tiene 5 cantidades restantes (45 - 40 = 5), lo que nos dejaría con 45 más para consumir para el pedido. Ficha 2 puede consumir 40. Registro 3 puede consumir el último 5. Cuando se complete la consulta los registros de inventario se vería así:
ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1 12345 111287 1 45 45
2 12345 111290 1 40 40
3 12345 111290 1 12 5
4 12345 111291 1 25 0
Nota: La tabla almacena el inventario QuantitySold, no QuantityRemaining, por lo que tiene que hacer el math (Quantity - QuantitySold) para determinar la cantidad que queda por registro de inventario.
No he llegado casi a ninguna parte con el CTE. He encontrado muchos ejemplos para hacer selecciones en las que tienes 2 partes para tu CTE: una parte de inicialización y la parte recursiva UNIONed. Podría escribir esto con un cursor, pero creo que es posible hacerlo con un CTE y me gustaría aprender cómo hacerlo.
Si alguien puede confirmar que esto es posible con un CTE o explicar cómo configurar el CTE, se lo agradecería. ¡Gracias!
+1 Para secuencia de comandos DDL –
Fuera de tema, pero ¿por qué está usando * * flotador para modelar la cantidad? ¿Realmente * desea * poder tener 1.47E-19 del artículo 2 en stock? –
Damien - buena pregunta. Mi empresa utiliza JDEdwards como su ERP, que usa flotantes para sus campos de cantidad. Construí estas tablas con eso en mente. Ah, bases de datos heredadas! – Brian