Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
luis_bisval
Contributor III
Contributor III

Valores de un campo a una variable

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.

ProductoDisponible
AABBCC113

 

El pendiente tiene  lo siguiente.

Nro DocumentoProductoFechaCant Pendiente
295608AABBCC29-11-2019100
296676AABBCC06-12-201916
296701AABBCC09-12-201932

 

Lo que deseo lograr es lo siguiente:

Nro DocumentoProductoFechaCant PendienteResultadoObservaciones
295608AABBCC29-11-20191000Resta los primeros 100
296676AABBCC06-12-2019163Resta los 13 restante
296701AABBCC09-12-20193232 

 

Espero haberme explicado y me puedan orientar a como solucionarlo.

7 Replies
rubenmarin

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.

luis_bisval
Contributor III
Contributor III
Author

 

 

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 DocumentoProductoFechaCant PendienteDisponibleResta
295608AABBCC29-11-201910011313
296676AABBCC06-12-20191611397
296701AABBCC09-12-20193211381

 

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 
295608AABBCC29-11-2019100113130 
296676AABBCC06-12-20191611397973
296701AABBCC09-12-20193211381810

 

Pero al agregar un par de registros y cambiar el monto del disponible, ya no funciona, ejemplo:

Datos usados.

Nro DocumentoProductoFechaCant PendienteDisponibleResta
295608AABBCC29-11-201910015050
296676AABBCC06-12-201916150134
296701AABBCC09-12-201932150118
296702AABBCC10-12-201935150115
296703AABBCC11-12-20194150146

 

Resultado

Documento Producto Fecha Pendiente Disponible Resta Restante Resultado 
295608AABBCC43798100150500 
296676AABBCC43805161501341340
296701AABBCC43808321501181180
296702AABBCC43809351501151150
296703AABBCC4381041501461460

 

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.

rubenmarin

Hola Luis, al campo dela tabla pendiente lo has llamado Restante, por lo tanto debería usar Peek(Restante) en vez de Peek(Resta).

luis_bisval
Contributor III
Contributor III
Author

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.

rubenmarin

Tienes que usar el campo Restante, que es el que va descontando, igual que en mi ejemplo estaba usando el campo CantidadRestante

luis_bisval
Contributor III
Contributor III
Author

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.

 

 

rubenmarin

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.