Taules
Nota
Microsoft Power Fx és el nom nou del llenguatge de formules de les aplicacions de llenç. Aquests articles són un treball en curs a mesura que extraiem el llenguatge de les aplicacions de llenç, l'integrem amb altres productes del Microsoft Power Platform i fem que estigui disponible com a codi obert. Comenceu amb la Informació general del Microsoft Power Fxper veure una introducció al llenguatge.
Al Microsoft Power Fx, podeu escriure una fórmula que accedeixi a la informació del Microsoft Excel, SharePoint, SQL Server i diverses altres fonts que emmagatzemen dades en registres i taules. Per treballar de manera més eficaç amb aquest tipus de dades, reviseu els conceptes en què es basen aquestes estructures.
- Un registre conté una o diverses categories d'informació d'una persona, d'un lloc o d'una cosa. Per exemple, un registre podria contenir el nom, l'adreça electrònica i el número de telèfon d'un únic client. Altres eines fan referència a un registre com a "fila" o "element".
- Una taula conté un o diversos registres que contenen les mateixes categories d'informació. Per exemple, una taula podria contenir els noms, adreces electròniques i números de telèfon de 50 clients.
Podeu crear una varietat de fórmules que agafin el nom d'una taula com a argument, de la mateixa manera que una fórmula a l'Excel pren una o diverses referències de cel·les com a arguments. Algunes fórmules del Power Fx retornen una taula que reflecteix els altres arguments que especifiqueu. Per exemple, pot ser que creeu una fórmula:
- Per actualitzar un registre d'una taula especificant la taula com un de diversos arguments per a la funció de Patch
- Per afegir, suprimir i canviar el nom de les columnes d'una taula especificant la taula com a argument per a la funció AddColumns, DropColumns o RenameColumns. Cap d'aquestes funcions modifica la taula original. En lloc d'això, la funció retorna una altra taula basada en els altres arguments que especifiqueu.
Cada registre conté com a mínim una categoria d'informació d'una persona, d'un lloc o d'una cosa. A l'exemple anterior es mostra un registre per a cada producte (Xocolata, Pa i Aigua) i una columna per a cada categoria d'informació (Preu, Quantitat a mà i Quantitat en comanda).
En una fórmula, podeu referir-vos a un registre per ell mateix, fora del context d'una taula, mitjançant claus. Per exemple, aquest registre { Nom: "Maduixes", Preu: 7,99 } no està associat a una taula. Tingueu en compte que els noms de camp, com ara Nom i Preu en aquest exemple, no estan entre cometes dobles.
Un camp és una informació individual d'un registre. Podeu visualitzar aquest tipus de camp com a valor d'una columna per a un registre concret.
De la mateixa forma que amb un control, es fa referència a un camp d'un registre mitjançant l'operador. del registre. Per exemple, First(Productes).Name retorna el camp Nom per al primer registre a la taula Productes.
Un camp pot incloure un altre registre o taula, com mostra l'exemple per a la funció GroupBy. Podeu imbricar tants nivells de registres i taules com vulgueu.
Una columna fa referència al mateix camp per a un o diversos registres d'una taula. A l'exemple anterior, cada producte té un camp de preu i aquest preu és a la mateixa columna per a tots els productes. La taula anterior té quatre columnes, que es mostren horitzontalment a la part superior:
- Nom
- Preu
- Quantitat disponible
- Quantitat per encàrrec
El nom de la columna reflecteix els camps d'aquesta columna.
Tots els valors dins d'una columna són del mateix tipus de dades. A l'exemple anterior, la columna "Quantitat disponible" sempre conté un nombre i no pot contenir cap cadena, com ara "12 unitats", per a un registre. El valor de qualsevol camp també pot estar en blanc.
És possible que us hàgiu referit a columnes com a "camps" en altres eines.
Hi ha una taula que inclou un o diversos registres, cadascun dels quals té diversos camps que tenen noms coherents en tots els registres.
Qualsevol taula que s'emmagatzemi en una font de dades o una col·lecció té un nom, que utilitzeu per referir-vos a la taula i passar-la a funcions que tenen taules com a arguments. Les taules també poden ser el resultat d'una funció o d'una fórmula.
Igual que a l'exemple següent, podeu expressar una taula en una fórmula mitjançant la funció Table amb un conjunt de registres que expresseu entre claus:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
També podeu definir una taula de columna única amb claudàtors. Una manera equivalent d'escriure l'anterior:
[ "Strawberry", "Vanilla" ]
A l'Excel i el Power Fx utilitzeu fórmules per manipular els números i les cadenes de text d'una manera similar:
- A l'Excel, escriviu un valor, com ara 42, a la cel·la A1 i, a continuació, escriviu una fórmula, com ara A1+2, en una altra cel·la per mostrar el valor 44.
- Al Power Apps, definiu la propietat Per defecte de Slider1 a 42 i definiu la propietat Text d'una etiqueta a Slider1.Value + 2 per mostrar el valor 44.
En ambdós casos, el valor calculat canvia automàticament si canvieu els valors dels arguments (per exemple, el nombre a la cel·la A1 o el valor de Slider1).
De la mateixa manera, podeu utilitzar fórmules per accedir i manipular dades de taules i registres. Podeu utilitzar els noms de les taules com a arguments en algunes fórmules, com ara Min(Catàleg, Preu) per mostrar el valor més baix a la columna Preu de la taula Catàleg. Altres fórmules proporcionen taules senceres com a valors de retorn, com ara RenameColumns(Catàleg, "Preu", "Cost"), que retorna tots els registres de la taula Catàleg però canvia el nom de la columna Preu a Cost.
De la mateixa manera que amb els nombres, les fórmules que impliquen taules i registres es tornen a calcular automàticament quan canvia la taula o el registre subjacent. Si el cost d'un producte a la taula Catàleg es redueix per sota del mínim anterior, el valor retornat de la fórmula Min canviarà automàticament per fer-ho coincidir.
Penseu en la funció Lower. Si la variable benvinguda conté la cadena de text "Hola, món", la fórmula Lower( benvinguda ) torna "Hola, món". Aquesta funció no canvia el valor d'aquesta variable de cap manera. Lower és una funció pura en el sentit que només processa l'entrada i produeix la sortida. Això és tot; no té efectes secundaris. Totes les funcions de l'Excel i la majoria de les funcions del Power Fx són funcions pures, que permeten al llibre de treball o a l'aplicació tornar-se a calcular automàticament.
El Power Fx ofereix un conjunt de funcions que operen amb taules de la mateixa manera. Aquestes funcions prenen taules com a entrada i filtren, ordenen, transformen, redueixen i resumeixen taules senceres de dades. De fet, Lower i moltes altres funcions que normalment prenen un valor únic també poden tenir una taula d'una sola columna com a entrada.
Moltes funcions prenen una taula d'una sola columna com a entrada. Si una taula sencera només té una columna, la podeu especificar pel seu nom. Si una taula té diverses columnes, podeu especificar una d'aquestes columnes mitjançant la sintaxi Table.Column. Per exemple, Products.Name retorna la taula d'una sola columna de només valors Nom de la taula Productes.
Podeu refer completament la disposició d'una taula com vulgueu mitjançant la funció AddColumns, RenameColumns, ShowColumns o DropColumns. Una vegada més, aquestes funcions canvien només la seva sortida, no l'origen.
Altres funcions s'han dissenyat específicament per modificar dades i tenir efectes secundaris. Com que aquestes funcions no són pures, heu de crear-les acuradament i no poden participar en els valors que es tornen a calcular automàticament a l'aplicació. Només podeu utilitzar aquestes funcions dins de fórmules de comportament.
Algunes funcions funcionen avaluant una fórmula en tots els registres d'una taula individualment. El resultat de la fórmula s'utilitza de diverses maneres:
- AddColumns : la fórmula proporciona el valor del camp afegit.
- Mitjana, màx. , min, suma, StdevP, VarP : la fórmula proporciona el valor per agregar.
- Filtre, cerca : la fórmula determina si el registre s'ha d'incloure a la sortida.
- Concat : la fórmula determina les cadenes que s'han de concatenar.
- Diferent : la fórmula retorna un valor, utilitzat per identificar registres duplicats.
- ForAll - Formula pot retornar qualsevol valor, potencialment amb efectes secundaris.
- Ordena : la fórmula proporciona el valor per ordenar els registres.
- Amb : la fórmula pot retornar qualsevol valor, potencialment amb efectes secundaris.
Dins d'aquestes fórmules, podeu fer referència als camps del registre que s'està processant. Cadascuna d'aquestes funcions crea un "àmbit de registre" en el qual s'avalua la fórmula, on els camps del registre estan disponibles com a identificadors de nivell superior. També podeu fer referència a les propietats del control i altres valors de tota l'aplicació.
Per exemple, preneu una taula de Productes col·locada en una variable global:
Set( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
Per determinar si algun d'aquests productes ha estat més sol·licitat del que hi ha disponible:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
El primer argument per a Filter és la taula de registres per operar i el segon argument és una fórmula. El filtre crea un àmbit de registre per avaluar aquesta fórmula en què els camps de cada registre estan disponibles, en aquest cas Producte, Quantitat sol·licitada i Quantitat disponible. El resultat de la comparació determina si cada registre s'ha d'incloure en el resultat de la funció:
Afegint a aquest exemple, podem calcular la quantitat de cada producte que voleu ordenar:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
Aquí estem afegint una columna calculada al resultat. AddColumns té el seu propi àmbit de registre que utilitza per calcular la diferència entre el que s'ha sol·licitat i el que està disponible.
Finalment, es pot reduir la taula de resultats només a les columnes que volem:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Heu de tenir en compte que a l'anterior, hem utilitzat cometes dobles (") en alguns llocs i cometes simples (') en altres llocs. Les cometes simples són necessàries quan es fa referència al valor d'un objecte, com ara un camp o una taula, en el qual el nom de l'objecte conté un espai. Les cometes dobles s'utilitzen quan no fem referència al valor d'un objecte sinó que en parlem, especialment en situacions en què l'objecte encara no existeix, com en el cas d'AddColumns.
Els noms de camp afegits amb l'àmbit de registre substitueixen els mateixos noms d'altres ubicacions de l'aplicació. Quan això succeeix, encara podeu accedir a valors fora de l'àmbit de registre amb l'operador de @desambiguació:
- Per accedir als valors dels àmbits de registre incrustats, utilitzeu l'operador @ amb el nom de la taula que s'utilitza mitjançant aquest patró:
Taula[@FieldName] - Per accedir a valors globals, com ara fonts de dades, col·leccions i variables de context, utilitzeu el patró [@NomObjecte] (sense cap designació de taula).
Si la taula que s'està utilitzant és una expressió, com ara Filter(Taula, ... ), l'operador de desambiguació no es pot utilitzar. Només l'àmbit de registre més intern pot accedir als camps d'aquesta expressió de taula sense utilitzar l'operador de desambiguació.
Per exemple, imagineu tenir una col·lecció X:
Podeu crear aquesta col·lecció amb ClearCollect( X, [1, 2] ).
I una altra col·lecció Y:
Podeu crear aquesta col·lecció amb ClearCollect( Y, ["A", "B"] ).
A més, definiu una variable de context anomenada Valor amb aquesta fórmula: UpdateContext( {Valor: "!"} )
Unim-ho tot. En aquest context, la fórmula següent:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
produeix aquesta taula:
Què està passant aquí? La funció més externa ForAll defineix un àmbit de registre per a X, que permet l'accés al camp Valor de cada registre segons es processi. Es pot accedir simplement mitjançant la paraula Valor o mitjançant X[@Valor].
La funció més interna ForAll defineix un altre àmbit de registre per a Y. Atès que aquesta taula també té un camp Valor definit, l'ús de Valor aquí fa referència al camp en el registre Y i ja no és el de X . Aquí, per accedir al camp Valor de X, hem d'utilitzar la versió llarga amb l'operador de desambiguació.
Atès que Y és l'àmbit de registre més intern, l'accés als camps d'aquesta taula no requereix desambiguació, la qual cosa ens permet utilitzar aquesta fórmula amb el mateix resultat:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
Tots els àmbits de registre ForAll substitueixen l'àmbit global. La variable de context Valor que definim no està disponible per nom sense l'operador de desambiguació. Per accedir a aquest valor, utilitzeu [@Valor].
Desagrupa aplana el resultat perquè les funcions ForAll imbricades donen com a resultat una taula de resultats imbricada.
Per operar en una única columna des d'una taula, utilitzeu la funció ShowColumns com en aquest exemple:
ShowColumns( Products, "Product" )
Aquesta fórmula produeix aquesta taula d'una sola columna:
Per a una alternativa més curta, especifiqueu Table.Column, que extreu la taula d'una sola columna només de Columna de Taula. Per exemple, aquesta fórmula produeix exactament el mateix resultat que utilitzar ShowColumns.
Products.Product
Els registres s'expressen mitjançant claus que contenen valors de camp anomenats. Per exemple, podeu expressar el primer registre a la taula que hi ha a l'inici d'aquest tema mitjançant aquesta fórmula:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
També podeu incrustar fórmules dins d'altres fórmules, en aquest exemple es mostra:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
Els registres es poden imbricar amb claus, com mostra aquest exemple:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
Poseu cada nom de columna que contingui un caràcter especial, com ara un espai o dos punts, entre cometes simples. Per utilitzar una única oferta dins d'un nom de columna, feu-les dobles.
Heu de tenir en compte que el valor de la columna Preu no inclou un símbol monetari, com ara un signe de dòlar. Aquest format s'aplicarà quan es mostri el valor.
Podeu crear una taula mitjançant la funció Table i un conjunt de registres. Podeu expressar la taula que hi ha a l'inici d'aquest tema mitjançant aquesta fórmula:
Table(
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 }
)
També podeu imbricar taules:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
Podeu crear taules d'una sola columna mitjançant l'especificació de valors entre claudàtors. La taula resultant té una única columna, anomenada Valor.
Per exemple, [ 1, 2, 3, 4 ]
és equivalent a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
i torna aquesta taula: