Skip to main content
Announcements
NEW Customer Portal: Initial launch will improve how you submit Support Cases. FIND OUT MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
carlosac
Creator II
Creator II

ACUMULADO CON PEEK

Buenas,

tengo dos campos (fecha y venta) y quisiera hacer un acumulado añomes. ¿alguien me podria ayudar porque me gustaria entender el concepto de peek?

1 Solution

Accepted Solutions
rubenmarin

Hola Carlos, con este script puedes generar un acumulado en el script usando Peek:

DataOrig:

LOAD fecha,

  Year(fecha) as Año,

     venta

FROM

[.\acumulado por añomes.xls]

(biff, embedded labels, table is Hoja1$);

Data:

LOAD Año,  fecha,  venta,

  If(Peek(Año)=Año, RangeSum(Peek(ventaAcu), venta), venta) as ventaAcu

Resident DataOrig Order by fecha;

DROP Table DataOrig;

La línea en negrita es la que realiza el acumulado, para realizar el acumulado es importante que la carga se realice por el orden de las fechas, lo que hace es:

- Comprobar si la fila cargada anteriormente pertenecía al mismo año que la actual:

· Si es del mismo año: Suma el valor del campo venta al valor del campo ventaAcu que tenía el registro anterior (dicho de otra forma: a lo que teníamos acumulado le sumamos lo del registro actual), y lo guardamos en el campo ventaAcu.

· Si es de otro año significa que empezamos un nuevo año y ventaAcu empezará con en valor del campo venta.

Se usa RangeSum para que en el caso de que alguna expresión devuelva null() se convierta a cero, si usásemos "Peek(ventaAcu) + venta" podría llegar a fallar.

Saludos.

View solution in original post

8 Replies
JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Carlos:

La mejor forma de manipular fechas con QV es crear un calendario maestro, aquí tienes una propuesta Campos Calendario del compañero sorrakis01   

El concepto PEEK recupera un valor de un campo en orden secuencial de llegada, creo que no te será útil para este problema. Aquí tienes más información Peek ‒ QlikView

Saludos

Joaquín

carlosac
Creator II
Creator II
Author

Entiendo Joaquín que entoces para hacer un acumulado es mejor utilizar un rangesum o un aggr en una tabla pivotante???

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Carlos,

Crea un calendario con

Calendario:

LOAD

Fecha,

Año,

Mes,

Dia,

AñoMes,

siguiendo las instrucciones de Jordi.

NOTA: El campo fecha de la FactTable tiene que tener el mismo nombre que en el calendario

En el gráfico usas como dimensión AñoMes y como expresión SUM(Ventas)

No necesitas nada más.

Saludos

Joaquín

carlosac
Creator II
Creator II
Author

Hola Joaquin pero asi entiendo que no tendria un acumulado. Lo que quisiera es que feb 2016 recogiera las ventas de enero2016+feb2016, en marzo 2016=enero2016+feb2016+marzo2016

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Carlos:

Entonces la dimensión que sea MES

SUM ( { <Año={$(=year(today()))} > } Ventas ) y marcas la casilla Acumulación Completa en las propiedades de la expresión.

El set análisis del SUM evita que sumen las ventas de igual mes de años anteriores.

Saludos

Joaquín

m_martinez
Partner - Contributor III
Partner - Contributor III

Otra opción que puedes utilizar es acumular en script. Con tu ejemplo:

Datos:

Load * Inline [

fecha,venta

01/10/2015,34

16/10/2015,23

31/10/2015,28

15/11/2015,33

30/11/2015,38

15/12/2015,43

30/12/2015,48

14/01/2016,53

29/01/2016,58

13/02/2016,63

28/02/2016,68

14/03/2016,73

29/03/2016,78

13/04/2016,83

28/04/2016,88

13/05/2016,93

28/05/2016,98

12/06/2016,103

27/06/2016,108

12/07/2016,113

27/07/2016,118

11/08/2016,123

26/08/2016,128

10/09/2016,133

25/09/2016,138

10/10/2016,143

25/10/2016,148

09/11/2016,153

24/11/2016,158

09/12/2016,163

24/12/2016,168

08/01/2017,173

23/01/2017,178

07/02/2017,183

22/02/2017,188

];

Inicial:

Load

fecha,

venta,

Year(fecha) as Año,

Month(fecha) as Mes,

text(num(Month(fecha),'00')) as #Mes,

num(year(fecha)&text(num(Month(fecha),'00')))as AñoMes

Resident Datos

;

Acumulado:

Load  AñoMes, Año as Year, Mes as Month, sum(venta) as Acumulado

Resident Inicial

Group by  AñoMes, Año, Mes

Order by fecha;

DROP Tables Datos;

Con esto consigues disponer de una tabla acumulada por Año y Mes, además de la tabla original.

rubenmarin

Hola Carlos, con este script puedes generar un acumulado en el script usando Peek:

DataOrig:

LOAD fecha,

  Year(fecha) as Año,

     venta

FROM

[.\acumulado por añomes.xls]

(biff, embedded labels, table is Hoja1$);

Data:

LOAD Año,  fecha,  venta,

  If(Peek(Año)=Año, RangeSum(Peek(ventaAcu), venta), venta) as ventaAcu

Resident DataOrig Order by fecha;

DROP Table DataOrig;

La línea en negrita es la que realiza el acumulado, para realizar el acumulado es importante que la carga se realice por el orden de las fechas, lo que hace es:

- Comprobar si la fila cargada anteriormente pertenecía al mismo año que la actual:

· Si es del mismo año: Suma el valor del campo venta al valor del campo ventaAcu que tenía el registro anterior (dicho de otra forma: a lo que teníamos acumulado le sumamos lo del registro actual), y lo guardamos en el campo ventaAcu.

· Si es de otro año significa que empezamos un nuevo año y ventaAcu empezará con en valor del campo venta.

Se usa RangeSum para que en el caso de que alguna expresión devuelva null() se convierta a cero, si usásemos "Peek(ventaAcu) + venta" podría llegar a fallar.

Saludos.

carlosac
Creator II
Creator II
Author

Muchas gracias Ruben por tu aclaración y modelo ya  que era realmente lo que buscaba.

De todas formas, todo los ejemplos presentados son buenos para aprender cada día un poquito más.