Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Información general
Microsoft Power Query proporciona una experiencia eficaz de "obtener datos" que abarca muchas características. Una funcionalidad básica de Power Query es filtrar y combinar, es decir, los datos "mash-up" de una o varias de una colección enriquecida de orígenes de datos admitidos. Cualquier mashup de datos de este tipo se expresa mediante el lenguaje de fórmulas de Power Query (conocido informalmente como "M"). Power Query inserta documentos M en una amplia gama de productos de Microsoft, incluidos Excel, Power BI, Analysis Services y Dataverse, para habilitar el mashup repetible de datos.
En este documento se proporciona la especificación de M. Después de una breve introducción que tiene como objetivo construir una primera intuición y familiaridad con el lenguaje, el documento trata precisamente el idioma en varios pasos progresivos:
La estructura léxica define el conjunto de textos que son léxicos de validez léxica.
Los valores, expresiones, entornos y variables, identificadores y el modelo de evaluación forman los conceptos básicos del lenguaje.
La especificación detallada de valores, tanto primitivos como estructurados, define el dominio de destino del lenguaje.
Los valores tienen tipos, en sí mismos un tipo especial de valor, que caracterizan los tipos fundamentales de valores y llevan metadatos adicionales específicos de las formas de valores estructurados.
El conjunto de operadores de M define qué tipos de expresiones se pueden formar.
Las funciones, otro tipo de valores especiales, proporcionan la base para una biblioteca estándar enriquecida para M y permiten la adición de nuevas abstracciones.
Se pueden producir errores al aplicar operadores o funciones durante la evaluación de expresiones. Aunque los errores no son valores, hay maneras de controlar los errores que asignan los errores a los valores.
Permitir que las expresiones permitan la introducción de definiciones auxiliares usadas para crear expresiones complejas en pasos más pequeños.
Si las expresiones admiten la evaluación condicional.
Las secciones proporcionan un mecanismo de modularidad simple. (Power Query aún no aprovecha las secciones).
Por último, una gramática consolidada recopila los fragmentos de gramática de todas las demás secciones de este documento en una única definición completa.
En el caso de los teoristas del lenguaje informático: el lenguaje de fórmulas especificado en este documento es un lenguaje funcional parcialmente diferido, de orden superior, puro y de orden superior.
Expresiones y valores
La construcción central de M es la expresión . Se puede evaluar una expresión (calculada), lo que produce un único valor.
Aunque muchos valores se pueden escribir literalmente como una expresión, un valor no es una expresión. Por ejemplo, la expresión 1 se evalúa como el valor 1; las expresiones 1+1 se evalúan como el valor 2. Esta distinción es sutil, pero importante. Las expresiones son recetas para la evaluación; los valores son los resultados de la evaluación.
En los ejemplos siguientes se muestran los distintos tipos de valores disponibles en M. Como convención, un valor se escribe con el formato literal en el que aparecerían en una expresión que se evalúa como solo ese valor. (Tenga en cuenta que // indica el inicio de un comentario que continúa hasta el final de la línea).
Un valor primitivo es un valor de una sola parte, como un número, lógico, texto o null. Se puede usar un valor NULL para indicar la ausencia de datos.
123 // A number true // A logical "abc" // A text null // null valueUn valor de lista es una secuencia ordenada de valores. M admite listas infinitas, pero si se escribe como literal, las listas tienen una longitud fija. Los caracteres
{de llave y}denotan el principio y el final de una lista.{123, true, "A"} // list containing a number, a logical, and // a text {1, 2, 3} // list of three numbersUn registro es un conjunto de campos. Un campo es un par nombre-valor donde el nombre es un valor de texto que es único dentro del registro del campo. La sintaxis literal de los valores de registro permite escribir los nombres sin comillas, un formulario también denominado identificadores. A continuación se muestra un registro que contiene tres campos denominados "", "
AB" y "C", que tienen valores1,2y3.[ A = 1, B = 2, C = 3 ]Una tabla es un conjunto de valores organizados en columnas (que se identifican por nombre) y filas. No hay ninguna sintaxis literal para crear una tabla, pero hay varias funciones estándar que se pueden usar para crear tablas a partir de listas o registros.
Por ejemplo:
#table( {"A", "B"}, { {1, 2}, {3, 4} } )Esto crea una tabla de la forma siguiente:
Una función es un valor que, cuando se invoca con argumentos, genera un nuevo valor. Para escribir una función, se enumeran los parámetros de la función entre paréntesis, seguidos del símbolo
=>de paso a , seguido de la expresión que define la función. Esa expresión normalmente hace referencia a los parámetros (por nombre).(x, y) => (x + y) / 2`
Evaluation
El modelo de evaluación del lenguaje M se modela después de que el modelo de evaluación se encuentre normalmente en hojas de cálculo, donde el orden de cálculo se puede determinar en función de las dependencias entre las fórmulas de las celdas.
Si ha escrito fórmulas en una hoja de cálculo como Excel, es posible que reconozca las fórmulas del resultado izquierdo en los valores de la derecha cuando se calcula:
En M, las partes de una expresión pueden hacer referencia a otras partes de la expresión por nombre y el proceso de evaluación determina automáticamente el orden en el que se calculan las expresiones a las que se hace referencia.
Puede usar un registro para generar una expresión equivalente al ejemplo de hoja de cálculo anterior. Al inicializar el valor de un campo, puede hacer referencia a otros campos del registro mediante el nombre del campo, como se muestra en el ejemplo siguiente:
[
A1 = A2 * 2,
A2 = A3 + 1,
A3 = 1
]
La expresión anterior es equivalente al ejemplo siguiente (en que ambas se evalúan como valores iguales):
[
A1 = 4,
A2 = 2,
A3 = 1
]
Los registros se pueden contener dentro o anidar dentro de otros registros. Puede usar el operador de búsqueda ([]) para acceder a los campos de un registro por nombre. Por ejemplo, el registro siguiente tiene un campo denominado Sales que contiene un registro y un campo denominado Total que tiene acceso a los FirstHalf campos y SecondHalf del Sales registro:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = Sales[FirstHalf] + Sales[SecondHalf]
]
La expresión anterior es equivalente al ejemplo siguiente cuando se evalúa:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = 2100
]
Los registros también se pueden contener en listas. Puede usar el operador de índice posicional ({}) para tener acceso a un elemento de una lista por su índice numérico. Los valores de una lista se conocen mediante un índice de base cero desde el principio de la lista. Por ejemplo, los índices 0 y 1 se usan para hacer referencia a los elementos primero y segundo de la lista siguiente:
[
Sales =
{
[
Year = 2007,
FirstHalf = 1000,
SecondHalf = 1100,
Total = FirstHalf + SecondHalf // 2100
],
[
Year = 2008,
FirstHalf = 1200,
SecondHalf = 1300,
Total = FirstHalf + SecondHalf // 2500
]
},
TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600
]
Las expresiones de miembro de lista y registro (así como las expresiones let) se evalúan mediante la evaluación diferida, lo que significa que solo se evalúan según sea necesario. Todas las demás expresiones se evalúan mediante la evaluación diligente, lo que significa que se evalúan inmediatamente cuando se encuentran durante el proceso de evaluación. Una buena manera de pensar en esto es recordar que la evaluación de una expresión de lista o registro devuelve un valor de lista o registro que recuerda cómo deben calcularse sus elementos de lista o campos de registro, cuando se solicitan (por operadores de búsqueda o índice).
Functions
En M, una función es una asignación de un conjunto de valores de entrada a un único valor de salida. Para escribir una función, primero asigna un nombre al conjunto necesario de valores de entrada (los parámetros a la función) y, a continuación, proporciona una expresión que calcula el resultado de la función utilizando esos valores de entrada (el cuerpo de la función) después del símbolo de paso a (=>). Por ejemplo:
(x) => x + 1 // function that adds one to a value
(x, y) => x + y // function that adds two values
Una función es un valor como un número o un valor de texto. En el ejemplo siguiente se muestra una función que es el valor de un campo Agregar, que luego se invoca o se ejecuta, desde varios otros campos. Cuando se invoca una función, se especifica un conjunto de valores que se sustituyen lógicamente por el conjunto necesario de valores de entrada dentro de la expresión del cuerpo de la función.
[
Add = (x, y) => x + y,
OnePlusOne = Add(1, 1), // 2
OnePlusTwo = Add(1, 2) // 3
]
Biblioteca
M incluye un conjunto común de definiciones disponibles para su uso desde una expresión denominada biblioteca estándar o simplemente biblioteca para abreviar. Estas definiciones constan de un conjunto de valores con nombre. Los nombres de valores proporcionados por una biblioteca están disponibles para su uso dentro de una expresión sin haber sido definidos explícitamente por la expresión. Por ejemplo:
Number.E // Euler's number e (2.7182...)
Text.PositionOf("Hello", "ll") // 2
Operadores
M incluye un conjunto de operadores que se pueden usar en expresiones.
Los operadores se aplican a los operandos para formar expresiones simbólicas. Por ejemplo, en la expresión 1 + 2 los números y 2 son operandos 1 y el operador es el operador de suma (+).
El significado de un operador puede variar en función del tipo de valores que son sus operandos. Por ejemplo, el operador más se puede usar con otros tipos de valores además de números:
1 + 2 // numeric addition: 3
#time(12,23,0) + #duration(0,0,2,0)
// time arithmetic: #time(12,25,0)
Otro ejemplo de un operador con un significado en función del operando es el operador de combinación (&):
"A" & "BC" // text concatenation: "ABC"
{1} & {2, 3} // list concatenation: {1, 2, 3}
[ a = 1 ] & [ b = 2 ] // record merge: [ a = 1, b = 2 ]
Tenga en cuenta que algunos operadores no admiten todas las combinaciones de valores. Por ejemplo:
1 + "2" // error: adding number and text isn't supported
Expresiones que, cuando se evalúan, encuentran condiciones de operador no definidas se evalúan como errores.
Metadatos
Los metadatos son información sobre un valor asociado a un valor. Los metadatos se representan como un valor de registro, denominado registro de metadatos. Los campos de un registro de metadatos se pueden usar para almacenar los metadatos de un valor.
Cada valor tiene un registro de metadatos. Si no se ha especificado el valor del registro de metadatos, el registro de metadatos está vacío (no tiene campos).
Los registros de metadatos proporcionan una manera de asociar información adicional con cualquier tipo de valor de forma discreta. La asociación de un registro de metadatos con un valor no cambia el valor ni su comportamiento.
Un valor y de registro de metadatos está asociado a un valor x existente mediante la sintaxis x meta y. Por ejemplo, el código siguiente asocia un registro de metadatos con Rating los campos y Tags con el valor "Mozart"de texto :
"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]
En el caso de los valores que ya contienen un registro de metadatos no vacío, el resultado de aplicar meta es el de calcular la combinación de registros del registro existente y el nuevo registro de metadatos. Por ejemplo, las dos expresiones siguientes son equivalentes entre sí y a la expresión anterior:
("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ]
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])
Se puede tener acceso a un registro de metadatos para un valor determinado mediante la Value.Metadata función . En el ejemplo siguiente, la expresión del ComposerRating campo obtiene acceso al registro de metadatos del valor en el Composer campo y, a continuación, accede al Rating campo del registro de metadatos.
[
Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ],
ComposerRating = Value.Metadata(Composer)[Rating] // 5
]
Expresión Let
Muchos de los ejemplos mostrados hasta ahora han incluido todos los valores literales de la expresión en el resultado de la expresión. La let expresión permite calcular, asignar nombres y, a continuación, usar un conjunto de valores en una expresión posterior que precede a in. Por ejemplo, en nuestro ejemplo de datos de ventas, podría hacer lo siguiente:
let
Sales2007 =
[
Year = 2007,
FirstHalf = 1000,
SecondHalf = 1100,
Total = FirstHalf + SecondHalf // 2100
],
Sales2008 =
[
Year = 2008,
FirstHalf = 1200,
SecondHalf = 1300,
Total = FirstHalf + SecondHalf // 2500
],
TotalSales = Sales2007[Total] + Sales2008[Total]
in
TotalSales // 4600
El resultado de la expresión anterior es un valor numérico (4600) que se calcula a partir de los valores enlazados a los nombres Sales2007 y Sales2008.
Expresión If
La if expresión selecciona entre dos expresiones basadas en una condición lógica. Por ejemplo:
if 2 > 1 then
2 + 2
else
1 + 1
La primera expresión (2 + 2) se selecciona si la expresión lógica (2 > 1) es true y la segunda expresión (1 + 1) está seleccionada si es false. La expresión seleccionada (en este caso 2 + 2) se evalúa y se convierte en el resultado de la if expresión (4).
Errors
Un error es una indicación de que el proceso de evaluación de una expresión no pudo generar un valor.
Los operadores y las funciones producen errores que encuentran condiciones de error o mediante la expresión de error. Los errores se controlan mediante la try expresión . Cuando se produce un error, se especifica un valor que se puede usar para indicar por qué se produjo el error.
let Sales =
[
Revenue = 2000,
Units = 1000,
UnitPrice = if Units = 0 then error "No Units"
else Revenue / Units
],
UnitPrice = try Number.ToText(Sales[UnitPrice]),
Result = "Unit Price: " &
(if UnitPrice[HasError] then UnitPrice[Error][Message]
else UnitPrice[Value])
in
Result
En el ejemplo anterior se obtiene acceso al Sales[UnitPrice] campo y se da formato al valor que genera el resultado:
"Unit Price: 2"
Si el Units campo hubiera sido cero, el UnitPrice campo habría generado un error, que habría sido controlado por .try A continuación, el valor resultante habría sido:
"Unit Price: No Units"
Una try expresión convierte los valores y errores adecuados en un valor de registro que indica si la try expresión controló un error, o no, y el valor adecuado o el registro de error que extrajo al controlar el error. Por ejemplo, considere la siguiente expresión que genera un error y, a continuación, la controla inmediatamente:
try error "negative unit count"
Esta expresión se evalúa como el siguiente valor de registro anidado, explicando las [HasError]búsquedas de campos , [Error]y [Message] en el ejemplo de precio unitario anterior.
[
HasError = true,
Error =
[
Reason = "Expression.Error",
Message = "negative unit count",
Detail = null
]
]
Un caso común es reemplazar los errores por valores predeterminados. La try expresión se puede usar con una cláusula opcional otherwise para lograr solo eso en un formato compacto:
try error "negative unit count" otherwise 42
// 42