Hola Chicos… Esto más que una ayuda en SAP sería una ayuda en SQL.
A ver, por alguna extraña razón desconocida para mí, en esta empresa hicieron en algún momento una pantalla para “entrada de inventario” de un almacén de Partes y Componentes, y una pantalla aparte para las “salidas de inventario” de dicho almacén…
No me pregunten porqué no le hicieron un almacén normal en SAP y manejaron sus entradas y salidas normales. No tengo ni la más remota idea y esto está desde el 2005.
Ahora bien. Me están pidiendo un query para conocer la antiguedad de los materiales que se encuentran en ese inventario. Si, ya se que lo mejor será crearles un almacén, hacer las entradas de todos estos materiales ahí, y olvidarme de esto, pero para hacerlo mi jefe quiere saber la antiguedad de los productos.
Bien, tengo este query que me ingresa en una tabla temporal la existencia (una simple resta entre las entradas y las salidas)
SELECT
case when T0.U_ENDescripcion like 'ABRAZADERA%%' then 'ABRAZADERA'
when T0.U_ENDescripcion like 'ASIENTO%%' then 'ASIENTO'
when T0.U_ENDescripcion like 'ESPIGA%%' then 'ESPIGA'
when T0.U_ENDescripcion like 'TAPON%%' then 'TAPON'
when T0.U_ENDescripcion like 'TERMINAL%%' then 'TERMINAL'
when T0.U_ENDescripcion like 'TUBO%%' then 'TUBO'
when T0.U_ENDescripcion like 'TORQ%%' then 'TORQUE'
when T0.U_ENDescripcion like 'SUBE%%' then 'SUBENSAMBLE'
when T0.U_ENDescripcion like 'BRAZ%%' then 'BRAZO'
when T0.U_ENDescripcion like 'BAR%%' then 'BARRA'
else ' ' end [Tipo],
T0.U_ENArticulo[Artículo],T0.U_ENDescripcion,
case when SUM(T0.U_ENCantidad) is null then '0' else SUM(T0.U_ENCantidad) end [Entradas],
case when (t1.Salidas) is null then '0' else (T1.Salidas) end [Salidas],
(case when SUM(T0.U_ENCantidad) is null then '0' else SUM(T0.U_ENCantidad) end -
case when (t1.Salidas) is null then '0' else (T1.Salidas) end ) [Inventario Final]
into #existencia
from [@ENT01] T0 LEFT OUTER JOIN
(select U_SAArticulo, case when SUM(U_SACantidad) is null then '0' else SUM(U_SACantidad) end 'Salidas' from [@SAL01] group by U_SAArticulo) T1 ON T0.U_ENArticulo = T1.U_SAArticulo
group by T0.U_ENArticulo, T0.U_ENDescripcion, t1.Salidas
order by T0.U_ENArticulo
Select * from #existencia where [Inventario Final] > 0 and isnull(artículo,'XXX') <> 'XXX'
drop table #existencia
Como ven son puras tablas de usuario por eso pongo el código.
Se que lo que debo hacer es tomar de la existencia he ir restando desde la última entrada hacia atrás hasta que el monto de existencia sea 0 y esa será la última entrada del material (o lo más cercano, porque al no trabajar FIFO no puedo asegurarlo).
Es decir…
Existencia = 30
Última entrada 999, cantidad 10, total 20
Total =< 0 fin sino repetir
entrada - 1 998, cantidad 5, total 15
Total =< 0 fin sino repetir
Entrada - 1 997, cantidad 10, total 5
Total =< 0 fin sino repetir
entrada - 1 996 , cantidad 10, total -5
Total =< 0 fin sino repetir
última entrada 996, fecha XX/XX/XXXX
Esto tendría que hacerlo para cada artículo.
La cosa es que se como hacerlo en Visual Basic, y se como hacer la lógica con un While pero no me viene a la mente como lo haría ahorita en SQL…
¿Alguien me ayuda a recordar como se podría hacerlo en SQL?