Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenas tardes.
Estimados, espero estén muy bien, tiempo sin consultar por aquí, en esta oportunidad escribo para preguntar sobre un caso que debo resolver, pero hasta ahora no se me enciende el foco, les explico a continuación.
Tengo mi tabla (pendientes) que son los productos que no se han logrado despachar por diversos motivos, adicional tengo otra tabla (disponible) que contiene la cantidad de productos que hay en stock listo para la venta.
Debo cruzar el disponible con el pendiente, si el producto AABBCC está en 0 en el disponible, se le coloca la misma cantidad de pendiente, si ese mismo producto en el disponible es => a la suma del pendiente se coloca en 0 a todos los pendientes de ese producto, hasta aquí es simple, sin embargo, se me complica cuando debo asignar el disponible por el documento más antiguo del pendiente, ejemplo.
Tengo en el disponible la siguiente información.
Producto | Disponible |
AABBCC | 113 |
El pendiente tiene lo siguiente.
Nro Documento | Producto | Fecha | Cant Pendiente |
295608 | AABBCC | 29-11-2019 | 100 |
296676 | AABBCC | 06-12-2019 | 16 |
296701 | AABBCC | 09-12-2019 | 32 |
Lo que deseo lograr es lo siguiente:
Nro Documento | Producto | Fecha | Cant Pendiente | Resultado | Observaciones |
295608 | AABBCC | 29-11-2019 | 100 | 0 | Resta los primeros 100 |
296676 | AABBCC | 06-12-2019 | 16 | 3 | Resta los 13 restante |
296701 | AABBCC | 09-12-2019 | 32 | 32 |
Espero haberme explicado y me puedan orientar a como solucionarlo.
Hola Luis, no tengo tiempo para meterme en detalles pero lo que haría sería llevar la cantidad disponible de cada producto a todas las facturas (mapping o join) y después hacer una carga resident ordenada por el orden de prioridad que prefieras para mantener la cuenta que la cantidad que va quedando y usar Peek() para ir restando la fila anterior, algo como:
RangeMax(If(Peek(Producto)=Producto, Peek(CantidadRestante)-CantidadPendiente,CantidadDisponible-CantidadPendiente, 0) as CantidadRestante,
RangeMax(If(Peek(Producto)=Producto, CantidadPendiente-Peek(CantidadRestante), CantidadPendiente-CantidadDisponible, 0) as Resultado
Resident... Order by Producto, FechaFactura;
DROP Field CantidadDisponible;
Está sin probar pero más o menos esa es la idea. Peek() sirve para recuperar el dato de la fila cargada anteriormente.
Hola Ruben, muchas gracias por dedicar tu tiempo en responder, estuve revisando lo que colocaste, sin embargo, no me funciona, no dan los valores que deseo obtener.
Ejemplo, si hago el mapping y agrego el disponible (cantidad completa que tengo de ese producto) a cada registro que esté con pendiente, y resto el pendiente del en cada registro queda algo como esto:
Nro Documento | Producto | Fecha | Cant Pendiente | Disponible | Resta |
295608 | AABBCC | 29-11-2019 | 100 | 113 | 13 |
296676 | AABBCC | 06-12-2019 | 16 | 113 | 97 |
296701 | AABBCC | 09-12-2019 | 32 | 113 | 81 |
Al utilizar el RangeMax() y con el peek con los datos de arriba, da el resultado que deseo.
Documento | Producto | Fecha | Pendiente | Disponible | Resta | Restante | Resultado |
295608 | AABBCC | 29-11-2019 | 100 | 113 | 13 | 0 | |
296676 | AABBCC | 06-12-2019 | 16 | 113 | 97 | 97 | 3 |
296701 | AABBCC | 09-12-2019 | 32 | 113 | 81 | 81 | 0 |
Pero al agregar un par de registros y cambiar el monto del disponible, ya no funciona, ejemplo:
Datos usados.
Nro Documento | Producto | Fecha | Cant Pendiente | Disponible | Resta |
295608 | AABBCC | 29-11-2019 | 100 | 150 | 50 |
296676 | AABBCC | 06-12-2019 | 16 | 150 | 134 |
296701 | AABBCC | 09-12-2019 | 32 | 150 | 118 |
296702 | AABBCC | 10-12-2019 | 35 | 150 | 115 |
296703 | AABBCC | 11-12-2019 | 4 | 150 | 146 |
Resultado
Documento | Producto | Fecha | Pendiente | Disponible | Resta | Restante | Resultado |
295608 | AABBCC | 43798 | 100 | 150 | 50 | 0 | |
296676 | AABBCC | 43805 | 16 | 150 | 134 | 134 | 0 |
296701 | AABBCC | 43808 | 32 | 150 | 118 | 118 | 0 |
296702 | AABBCC | 43809 | 35 | 150 | 115 | 115 | 0 |
296703 | AABBCC | 43810 | 4 | 150 | 146 | 146 | 0 |
Este es el Script que estoy usando para comprobar tu formula.
Pendiente1:
Load * Inline [
Documento,Producto,Fecha,Pendiente,Disponible,Resta
295608,AABBCC,43798,100,150,50
296676,AABBCC,43805,16,150,134
296701,AABBCC,43808,32,150,118
296702,AABBCC,43809,35,150,115
296703,AABBCC,43810,4,150,146
];
Pendiente:
LOAD
If(Peek(Producto)= Producto,RangeMax(Peek(Resta)- Pendiente, Disponible-Pendiente,0),0) as Restante,
If(Peek(Producto)= Producto,RangeMax(Pendiente-Peek(Resta), Pendiente-Disponible,0),) as Resultado,
*
Resident Pendiente1
Order by Fecha, Documento;
Drop Table Pendiente1;
Quedo atento a tus comentarios.
Hola Luis, al campo dela tabla pendiente lo has llamado Restante, por lo tanto debería usar Peek(Restante) en vez de Peek(Resta).
Ruben, el campo Resta, es el resultado del campo Disponible - el campo Pendiente.
Los campos Restante y Resultado se crean por el uso de la formula que me enviaste.
Tienes que usar el campo Restante, que es el que va descontando, igual que en mi ejemplo estaba usando el campo CantidadRestante
Ruben, debo estar haciendo algo malo, ya que no logro obtener el resultado correcto.
Cree un modelo y cargué 50 registros que contienen Fecha ,Documento ,Código ,Pendiente ,Disponible y Cant_Restante que es la resta del disponible - el pendiente.
Ahí agregué las líneas de script que me pasaste.
Si tienes oportunidad de mirarlo sería excelente.
Quedo atento a tus comentarios.
Lo mismo que en el otro caso: tienes que usar el campo Restante (no Cant_Restante), que es el que estás usando en el script para llevar el acumulado:
If(Peek(Codigo)=Codigo,RangeMax(Peek(Cant_Restante)-Pendiente,Disponible-Pendiente),0) as Restante,
Además en este ejemplo no está el producto y la carga se debe ordenar por producto para llevar el acumulado de lo que restas de cada uno, así como tener el disponible para cada producto.
Te subo el ejemplo que pasaste ayer, que sí tenía el producto y el mismo disponible para el producto, pero usando el campo Restante.