top of page
Foto del escritorJaime Franco Jimenez

Lenguaje M en Power Query. Parte 2

Voy a abrir el ejemplo del video Totalizar por fecha cruzada con centro.


Seleccionamos la consulta de fechas.


Vamos el editor avanzado.


let

Origen = Ventas,

#"Otras columnas quitadas" = Table.SelectColumns(Origen,{"Fecha"}),


Cuando el nombre de un paso tiene un espacio, debe de llevar la almohadilla (#).


Cuando M ve algo entre comillas dobles, lo considera texto, por lo que el nombre de un paso no va entre comillas dobles, a no ser que haya espacios.


Cuando M ve algo entre comillas dobles, lo considera texto, por lo que el nombre de un paso no va entre comillas dobles, a no ser que haya espacios.






Después del identificador, viene un signo igual.


#"Otras columnas quitadas" =


A continuación, el código M.


En este ejemplo, el paso se llama otras columnas quitadas, y, la función es Table.SelectColumns, esta función, selecciona la o las columnas que le indiquemos.


En este caso, selecciona de la tabla Origen, la columna fecha.


let

Origen = Ventas,

#"Otras columnas quitadas" = Table.SelectColumns(Origen,{"Fecha"}),


Cada línea debe de terminar con coma (,) la coma entrega el valor de la expresión, y, espera una segunda expresión, el último paso, no lleva coma, indica que ya no hay más expresiones, y, viene IN, donde siempre aparece el último paso, que es el valor para entregar.


#"Se expandió Ventas (2)" = Table.ExpandTableColumn(#"Consultas combinadas", "Ventas (2)", {"Total"}, {"Total"}),

#"Valor reemplazado" = Table.ReplaceValue(#"Se expandió Ventas (2)",null,0,Replacer.ReplaceValue,{"Total"})

in

#"Valor reemplazado"


El primer paso es la obtención de la tabla.


let

Origen = Ventas,


Quiere decir que vamos a modificar la tabla ventas, por ejemplo, en el siguiente paso, se calcula el valor mínimo de la columna fecha de la tabla origen.


Fechaminima = List.Min(#"Inicio del mes calculado"[Fecha]),


Voy a ir a pasos aplicados, y, voy a eliminar el último paso.








Vuelvo al editor avanzado, y, vemos como ya no aparece el último paso, ahora, aparece se expandió ventas (2).


#"Se expandió Ventas (2)" = Table.ExpandTableColumn(#"Consultas combinadas", "Ventas (2)", {"Total"}, {"Total"})

in

#"Se expandió Ventas (2)"


Voy a seleccionar la columna de fecha, voy a la pestaña de transformar, despliego fecha, despliego mes, y, selecciono nombre del mes.














Volvemos al editor avanzado, y, vemos que el último paso es nombre del mes extraído, es decir, lo que acabamos de realizar.


#"Nombre del mes extraído" = Table.TransformColumns(#"Se expandió Ventas (2)", {{"Fechas", each Date.MonthName(_), type text}})

in

#"Nombre del mes extraído"


El paso que aparece en IN no tiene por qué ser el último paso, voy a borrar el último paso dentro de IN, y, voy a poner origen, y, el paso que aparece lo pongo como comentario, para ello, delante del paso pongo “//”.


#"Nombre del mes extraído" = Table.TransformColumns(#"Se expandió Ventas (2)", {{"Fechas", each Date.MonthName(_), type text}})

in

//#"Nombre del mes extraído"

Origen


Vemos como se carga la tabla ventas, si vamos a pasos aplicados, vemos como hay un solo paso, que es la columna fechas.






Cada paso en pasos aplicados es una expresión, siendo el último paso el que es entregado por IN.


Volemos al editor avanzado, borramos dentro de IN, Origen, y, quitamos le comentario del último paso.


Si hago clic en agregar paso en la barra de fórmulas.





Pongo tipo cambiado, y, selecciono el paso.





Añado un nuevo paso que es una copia del paso tipo cambiado.


En el siguiente ejemplo, creamos dos tablas, Ventas2020, y, Ventas2021, con un campo llamada Ventas, junto con su valor, todo lo hacemos dentro de LET, y, en IN, sumamos las Ventas de ambas tablas.










Clic en listo, y, vemos la suma de ambos campos.





Cuando vamos a usar una función, y, no nos acordamos de su sintaxis, o, cuál es su uso, añadimos un nuevo paso.





Ponemos el signo igual, y, el nombre de la función, por ejemplo:





Aceptamos, y, vemos que nos aparece la ayuda de dicha función.







Incluso podemos poner un valor, y, nos devolverá el valor absoluto.












Hacemos clic en invocar.


Si en la barra de fórmulas, escribimos:





Nos devuelve muchas cosas.












Pero, esto es un registro, por lo que voy a convertirlo en tabla, para ello, hacemos clic en tabla, dentro de la pestaña convertir.








En la primera columna, vemos las consultas que tenemos.







Si hacemos clic en cualquier valor de la columna value, veremos sus datos.


Después, vemos muchas funciones, que, si hacemos clic en alguna de ellas, veremos en la parte inferior, la ayuda.




Función

Es un valor que se invoca con argumentos, y, genera un nuevo valor.


Para crear una función, se enumeran los parámetros entre paréntesis, seguido de “=>”, seguido de la expresión que define la función.


Vayamos al editor avanzado.


Voy a crear una función con dos parámetros, multiplico ambas variables, y, el resultado lo divido entre 2.


let

Mifuncion = (valor1, valor2) => (valor1 * valor2) / 2


En la instrucción IN pongo el nombre de la función.


let

Mifuncion = (valor1, valor2) => (valor1 + valor2) / 2

in

Mifuncion


Hacemos clic en listo, se abre la ventana de parámetros, donde nos solicita un valor para cada parámetro.











Ponemos un valor para cada variable, y, hacemos clic en invocar.











Como resultado obtengo una nueva consulta con el valor de 6,5.







Sentencia IF

Selecciona entre dos posibilidades, en función, de una pregunta, por ejemplo, si modifico la instrucción IN, y, pregunto si el campo ventas de la tabla Ventas2020, es mayor, que el campo ventas de la tabla Ventas2021, en ese caso, que ponga el campo ventas de la tabla Ventas2020, en caso contrario, que ponga el campo ventas de la tabla Ventas2021.














Hacemos clic en listo, y, vemos que nos devuelve el campo ventas de la tabla Ventas2020, porque es la condición que se cumple.


En el siguiente ejemplo, pregunto si 1 es mayor que 2, en ese caso, que ponga OK, en caso contrario, que ponga NO OK.


let

Origen =


if 1>2 then"ok" else "no ok"

in

Origen



Errores

Los errores en M, debemos de controlarlo, por ejemplo, en el siguiente ejemplo, se crea una tabla llamada Ventas2020, con los campos unidades, precio, y, total, que es la multiplicación de unidades por precio.














Si hacemos clic en listo, vemos que nos devuelve la multiplicación de unidades por precio.


Pero, queremos controlar que si el número de unidades es cero, que nos ponga no unidades, en caso contrario, que nos devuelva la multiplicación, para ello, en el campo de total, voy a usar la sentencia IF, donde voy a preguntar que, si unidades es igual a cero, que ponga no unidades, en caso contrario, que devuelva la multiplicación de unidades por precio.











Ponemos las unidades a cero, y, hacemos clic en listo, y, vemos como aparece no unidades.



Comentarios

Podemos poner dos tipos de comentarios, comentarios que afectan a una línea, para ello, delante de la línea, debemos de poner los caracteres //, vemos que, en el siguiente ejemplo, dentro de IN, el paso nombre del mes extraído, esta como comentario.


#"Nombre del mes extraído" = Table.TransformColumns(#"Se expandió Ventas (2)", {{"Fechas", each Date.MonthName(_), type text}})

in

//#"Nombre del mes extraído"

Origen


El siguiente comentario que podemos usar, es usando los caracteres /*, al principio de la línea, y, */ al final de la línea, este tipo de comentario nos permite poner más de una línea como comentario.


En el siguiente ejemplo, he puesto dos líneas en comentarios.


in

/*#"Nombre del mes extraído"

Origen*/


Ya sabemos que los comentarios no se ejecutan, además, no podemos poner comentarios anidados.


Tokens

Un token es un identificador, palabra clave, literal, operador o signo de puntuación. Los espacios en blanco y los comentarios se usan para separar los tokens, pero no se consideran tokens.


token: identificador palabra clave Literal operator-or-punctuator


Como palabra clave, tenemos let, in, true, y, false, pero escritos en minúsculas, esto quiere decir, que no podemos llamar a un paso con ninguno de estos nombres.


Las palabras claves son palabras reservadas, la cual no podemos usar como un identificador.


Operadores y signos de puntuación

Hay varios tipos de operadores y signos de puntuación.


Los operadores se usan en expresiones para describir las operaciones con uno o varios operandos implicados.


Por ejemplo, la expresión a + b usa el operador + para agregar los dos operandos a y b. Los signos de puntuación se usan para agrupar y separar.


El significado de un operador puede variar en función del tipo de valores de operando.


Operador +

El siguiente código suma 2 más 5, y, nos devuelve 7.


let

Origen =


5+2


in

Origen



La siguiente expresión, nos devuelve las 10 y 33 minutos del día 15 de mayo del 2021.

let

Origen =


DateTime.Time(#datetime(2021,5,15,10,33,00))


in

Origen


Voy a sumar cinco minutos, para ello, uso la función duration, esta función tiene cuatro argumentos que son días, horas, minutos, y, segundos.


let

Origen =


DateTime.Time(#datetime(2021,5,15,10,33,00)) + #duration(0,0,5,0)


in

Origen


Nos devuelve:






Operador de concatenación (&)

Este operador nos vale para unir cadenas.


El siguiente código, crea una lista de tres valores, concatena una lista formada por el número 1, con una lista formada por los números 2 y 3.


let

Origen =


{1}&{2,3}

in

Origen








Tenemos operadores comunes que se aplican a valores NULL, lógicos, números, fecha, hora, fecha y hora, texto, entre otros.


Operador Descripción

> Mayor que

>= Mayor o igual que

< Menor que

<= Menor o igual que

= Igual

<> No igual a


El siguiente código comprueba que 4 sea mayor a 2, en ese caso, devuelve OK, en caso contrario, devuelve NO OK.


let

Origen =


if 4>2 then "ok" else "no ok"


in

Origen


Operadores lógicos

En M tenemos los operadores lógicos O, Y, y, NOT.


Tengo una pequeña tabla con números.












La he llevado a Power Query.


En pasos aplicados, tenemos dos pasos origen, y, tipo cambiado.






Hago clic en el siguiente icono para añadir un nuevo paso.









Aparecerá el último paso, pues, voy a usar la función Table.Addcolumn, para añadir una nueva columna, esta función tiene un primer argumento que es tabla, que es el nombre del paso.


= Table.AddColumn(#"Tipo cambiado"


El siguiente argumento es el nombre que le vamos a dar a la columna.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60"


El siguiente argumento es la función que vamos a usar, pues, ponemos la palabra each, es decir, para cada.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60", each


Ahora usamos la función IF para preguntar que si la columna números es mayor a 40 y menor a 60.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60", each if [Numeros]>40 and [Numeros]<60


En ese caso, calculamos el 15% de la columna de números.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60", each if [Numeros]>40 and [Numeros]<60 then ([Numeros]*15)/100


En caso contrario, que ponga NULL, cuando aparece NULL, y, lo llevamos a Excel, aparece como blanco, cerramos paréntesis, y, aceptamos.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60", each if [Numeros]>40 and [Numeros]<60 then ([Numeros]*15)/100 else null)


Vemos que las cantidades que son mayores a 40 y menores a 60, se le aplicado un 15% de descuento.











Si vamos al editor avanzado, veremos nuestra línea, que es la última, y, la que devuelve la instrucción IN.








Voy a modificar la línea anterior, para ello, selecciono el paso, y, vamos a la barra de fórmulas, en este caso, voy a usar el operador OR, donde voy a preguntar que la columna números es menor a 40, o, la columna números es mayor a 90, que le aplique el 15%.


= Table.AddColumn(#"Tipo cambiado", "Descuento 40-60", each if [Numeros]<40 or [Numeros]>90 then ([Numeros]*15)/100 else null)


Vemos como se ha aplicado un 15% a aquellas cantidades que son menores a 40, y, mayores a 90.










Operador de búsqueda de registros

Cuando vamos a buscar un campo dentro de un registro, usamos los corchetes [].


Operador de indicador de lista

Cuando queremos seleccionar un elemento dentro de una lista, usamos las llaves {}.


Conversión de tipos

El lenguaje de fórmulas M de Power Query tiene fórmulas para convertir entre tipos.


Veamos funciones que convierten valores numéricos en formato de texto, a formato de número.


La primera que vamos a ver es la función Number.FromText.


La sintaxis es:

Number.FromText(text as nullable text, optional culture as nullable text)


Donde el argumento text, es el valor para convertir, y, como argumento opcional tenemos culture, que indica el país en el que estamos, por ejemplo, para España es “es-ES”.


Vamos al editor avanzado, el siguiente código, convierte el número 4 en formato de texto en número.


let

Origen =


Number.FromText("4")

in

Origen


Si queremos realizar el cálculo contrario, es decir, pasar un numero en formato de numero a formato de texto, usamos la función Number.ToText.


El siguiente código convierte el número 4 en formato de numero a texto.


let

Origen =


Number.ToText(4)

in

Origen


Podemos añadir un formato, que es un código de una sola letra, por ejemplo, el siguiente código “n” o “N”, pone el punto de miles, y, la coma de decimales.


let

Origen =


Number.ToText(1000, "n")


in

Origen


Si como formato ponemos “p” o “P”, nos dará el valor en porcentaje.

let

Origen =


Number.ToText(1, "p")


in


Origen


Para convertir un valor numérico a número, usamos la función Text.From.

let

Origen =


Text.From(12)


in

Origen


Con esto, ya tenemos una introducción al lenguaje M.



95 visualizaciones0 comentarios

Entradas Recientes

Ver todo

Comments


bottom of page