top of page
Foto del escritorJaime Franco Jimenez

List.Accumulate

Acumula un valor resumen, es un iterador, quiere decir que recorre cada valor guardando el resultado en el siguiente elemento, siendo la propiedad de List.Accumulate.


Sintaxis

List.Accumulate(list as list, seed as any, accumulator as function) as any

 

El primer argumento es lista, que es la lista con la que vamos a trabajar, para convertir una columna en lista, solo debemos de poner el nombre de la consulta, y, entre paréntesis, la columna, el siguiente argumento es seed, que es el valor inicial, es decir, donde empezar, puede ser un número, un texto, una lista, o, una tabla entre otros.


Debemos de declarar dos variables, lo que haya en el argumento lista, cada valor será guardado en la segunda variable declarada.


El siguiente argumento es acumulator, que puede ser una funcion, el acumulador debe de empezar con algún valor, pues, ese valor es el valor del argumento seed.


Veamos un ejemplo, en un libro nuevo, creamos una consulta en blanco.

Hacemos clic con botón alternativo del ratón sobre la consulta, y, seleccionamos editor avanzado.

Borramos las comillas dobles, y, pulsamos enter.


Ponemos la funcion List.Accumulate, abrimos un paréntesis, como el primer argumento debe de ser una lista, abrimos llaves, ponemos el número 1, ponemos dos puntos, ponemos el número 5, y, cerramos llaves.


let

    Origen =

    List.Accumulate({1..5}

 

Coma, pulsamos enter, como argumento seed, ponemos 0.


let

    Origen =

    List.Accumulate({1..5},

  0

 

Coma, pulsamos enter, como argumento acumulator, debemos de declarar una funcion a la cual le pasaremos dos parámetros obligatorios, por lo que vamos a declarar dos variables, abrimos paréntesis, ponemos la primera variable, coma, ponemos la segunda variable, cerramos paréntesis, ponemos “=>” para agregar una funcion, ponemos la primera variable, signo de más, entre paréntesis, multiplicamos la segunda variable por sí misma, y, cerramos paréntesis.


La primera variable almacenara cada una de nuestras acciones, la segunda variable va a almacenar cada valor.

let

    Origen =

    List.Accumulate({1..5},

  0,

  (x,y)=>x+(y*y)

    )

in

    Origen

 

Clic en listo.


Nos devuelve 55.

La variable “y” vale cada valor de la lista, la variable “x” entra valiendo 0.

La primera iteración es “x” que vale 0, el argumento seed, más la variable “y” multiplicada por si misma, es decir, 0+(1*1), cuyo resultado es 1, siendo este el valor de la segunda variable.


En la segunda iteración, la variable “x” vale el resultado de la operación anterior, es decir, 1 multiplicado por 2 por 2, segundo valor de la variable “y”, que es 4, la operación es 1 + 5, nos devuelve 5.


En la tercera iteración, la variable “x”, vale 5 multiplicado por el tercer valor de la variable “y”, es decir, 5+3*3, que es igual a 14.


Así con el resto de los valores, si sumamos todos los resultados, vemos que nos devuelve 55.

Veamos otro ejemplo.


Creamos una consulta en blanco.


Vamos al editor avanzado.


Borramos las dobles comillas dobles.


Creamos una lista con los siguientes nombres.


let

    Origen = {"Claudia","Jaime","Yolanda"}

 

Coma, pulsamos enter, creamos una variable llamada Acumulado, usamos la funcion List.Accumulate, como argumento lista, ponemos la variable Origen, como argumento seed, ponemos dobles comillas dobles, es decir, nada, como argumento acumulador, declaramos dos variables, ponemos “=>” para agregar una funcion, concatenamos ambas variables, cerramos paréntesis.


let

    Origen = {"Claudia","Jaime","Yolanda"},

    Acumulado = List.Accumulate(Origen, "", (x,y)=>x&y)

 

Dentro de in, ponemos la variable Acumulado.


let

    Origen = {"Claudia","Jaime","Yolanda"},

    Acumulado = List.Accumulate(Origen, "", (x,y)=>x&y)

in

    Acumulado

 

Hacemos clic en listo, y, tenemos los tres nombres unidos.

Veamos cómo funciona.


En la primera iteración, la variable “x” vale nada, y la variable “y” vale el primer valor, que es Claudia, entonces, une blanco con Claudia.


En la siguiente iteración, el acumulador que es la variable “x”, vale blanco y Claudia, la variable “y” vale el segundo valor, por lo que une blanco, Claudia y Jaime.


En la ultima iteración, el acumulador vale blanco, Claudia y Jaime, y, la variable “y”, vale el ultimo valor, por lo que une blanco, Claudia, Jaime, y, Claudia.


Podemos dejar un espacio entre nombres, para ello, después del primer símbolo de concatenación, ponemos blanco, y, concatenamos con la variable “y”.


= List.Accumulate(Origen, "", (x,y)=> x&" "&y)

 

Debemos de tener en cuenta, que el primer carácter de la concatenación es blanco, que es el valor inicial, para quitarlo, vamos a la pestaña transformar, desplegamos formato, y, seleccionamos recortar, que quita los espacios iniciales y finales.

Esta opción pertenece a la funcion Text.Trim, lo podemos ver en la barra de fórmulas.


Vamos por otro ejemplo, tenemos el modelo que suelo usar habitualmente pero solo con las columnas centro, producto, y, total.

Nos lo llevamos a Power Query.


Vamos a agrupar por centro y producto siempre que el total este entre 7000 y 10000.

 

Seleccionamos las columnas de centro, y, producto, hacemos clic con botón alternativo de ratón, y, seleccionamos agrupar por.


Se abre la ventana agrupar por, en la ventana nuevo nombre de columna, dejamos recuento, en la ventana operación, seleccionamos todas las filas.

Aceptamos.


Tenemos una nueva columna donde en cada fila tenemos table.

Hacemos clic en la primera table, en la parte inferior vemos el total para el centro C.C. Nervión, y, el producto aspiradora.

En la segunda tabla, tenemos el total para el centro Metromar y el producto frigorífico.

Agregamos una columna personalizada, si en la ventana formula de columna personalizada, ponemos:


[Recuento][Total]

 

Le estamos diciendo que de la columna recuento, tome la columna de total, por lo que tenemos una columna con List, en cada List, tenemos los totales para cada centro, y, producto.


Añadimos una nueva columna personalizada, en la ventana formula de columna personalizada, ponemos:


List.Accumulate(

 

Como argumento lista, entre corchetes ponemos Personalizado, no tenemos que especificar columnas, porque solo tiene una columna.


List.Accumulate([Personalizado]

 

Como argumento seed, que es el valor inicial, ponemos 0.


List.Accumulate([Personalizado],0

 

Como argumento acumulador, abrimos paréntesis, declaramos dos variables, cerramos paréntesis, ponemos “=>!” para realizar un cálculo, que la suma de ambas variables, cerramos paréntesis.


List.Accumulate([Personalizado],0,(x,y)=>x+y)

 

Aceptamos, y, tenemos el acumulado para cada fila.

Pero, queremos el acumulado si la cantidad es mayor a 7000, y, menor a 10000.


Volvemos a la expresión de la columna personalizada.


Después de “=>”, ponemos if, preguntamos si la variable “y”, que es cada valor, es mayor a 7000, ponemos and, ponemos la variable “y” y comparamos con menor a 10000, ponemos then y sumamos ambas variables, ponemos else y ponemos la variable “x”.


List.Accumulate([Recuento][Total],0,(x,y)=>if y>7000 and y<10000 then x+y else x)

 

Aceptamos.


Tenemos el acumulado solo si las cantidades son mayores a 7000 y menores a 10000.



Miguel Angel Franco Garcia

5 visualizaciones0 comentarios

Comments


bottom of page