Tabelle

Nota

Microsoft Power Fx è il nuovo nome per il linguaggio delle formule per le app canvas. Questi articoli sono in fase di elaborazione poiché estraiamo il linguaggio dalle app canvas, lo integriamo con altri prodotti di Microsoft Power Platform e lo rendiamo disponibile come open source. Inizia con la panoramica di Microsoft Power Fx per un'introduzione al linguaggio.

In Microsoft Power Fx, puoi scrivere una formula che accede alle informazioni in Microsoft Excel, SharePoint, SQL Server e molte altre origini che archiviano dati in record e tabelle. Per usare questa tipologia di dati in modo ottimale, esamina i concetti alla base di queste strutture.

  • Un record contiene una o più categorie di informazioni su una persona, un luogo o un oggetto. Un record può ad esempio contenere il nome, l'indirizzo di posta elettronica e il numero di telefono di un singolo cliente. Altri strumenti fanno riferimento a un record con i termini "riga" o "elemento".
  • Una tabella contiene uno o più record contenenti le stesse categorie di informazioni. Una tabella può ad esempio contenere i nomi, gli indirizzi di posta elettronica e i numeri di telefono di 50 clienti.

È possibile creare numerose formule che accettano come argomento il nome di una tabella, proprio come una formula in Excel accetta come argomenti uno o più riferimenti di cella. Alcune formule in Power Fx restituiscono una tabella che riflette gli altri argomenti specificati. Ad esempio potresti creare una formula:

  • per aggiornare un record in una tabella specificando tale tabella come uno di più argomenti per la funzione Patch
  • per aggiungere, rimuovere e rinominare le colonne in una tabella specificando tale tabella come argomento per la funzione AddColumns, DropColumns o RenameColumns. Nessuna di queste funzioni modifica la tabella originale. La funzione restituisce invece un'altra tabella basata sugli altri argomenti specificati.

Elementi di una tabella

Elementi di tabella.

Record

Ogni record contiene almeno una categoria di informazioni relative a una persona, un luogo o un oggetto. L'esempio precedente illustra un record per ogni prodotto (Chocolate, Bread e Water) e una colonna per ogni categoria di informazioni (Price, Quantity on Hand e Quantity on Order).

In una formula puoi fare riferimento a un record da se stesso, fuori dal contesto di una tabella, usando le parentesi graffe. Ad esempio, il record { Name: "Strawberries", Price: 7.99 } non è associato a una tabella. Nota che i nomi dei campi, come Name e Price nell'esempio, non sono racchiusi tra virgolette doppie.

Campi

Un campo rappresenta un'informazione in un record. Puoi visualizzare questo tipo di campo come valore di una colonna per un record specifico.

Proprio come nel caso di un controllo, fai riferimento a un campo di un record usando l'operatore . sul record. Ad esempio, First(Products).Name restituisce il campo Name del primo record nella tabella Products.

Un campo può contenere un altro record o un'altra tabella, come illustrato nell'esempio per la funzione GroupBy. Puoi annidare tutti i livelli di record e tabelle desiderati.

Colonne

Una colonna si riferisce allo stesso campo di uno o più record in una tabella. Nell'esempio precedente a ogni prodotto è associato un campo prezzo e tale prezzo è presente nella stessa colonna per tutti i prodotti. La tabella precedente include quattro colonne, visualizzate orizzontalmente nella parte superiore:

  • Nome
  • Prezzo
  • Quantità disponibile
  • Quantità ordinata

Il nome della colonna rispecchia i campi presenti in tale colonna.

Tutti i valori all'interno di una colonna appartengono allo stesso tipo di dati. Nell'esempio precedente, la colonna "Quantity on Hand" contiene sempre un numero e non può contenere una stringa, ad esempio "12 unità", per un record. Il valore di un campo può anche essere vuoto.

Le colonne possono essere denominate "campi" in altri strumenti.

Tabella

Una tabella è costituita da uno o più record, ognuno con più campi con nomi coerenti tra i record.

Qualsiasi tabella archiviata in un'origine dati o in una raccolta ha un nome che usi per fare riferimento alla tabella e passarla a funzioni che usano le tabelle come argomenti. Le tabelle possono anche essere il risultato di una funzione o una formula.

Come nell'esempio seguente, puoi esprimere una tabella in una formula usando la funzione Table con un set di record, usando le parentesi graffe:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Puoi anche definire una tabella a colonna singola con parentesi quadre. Un modo equivalente per scrivere la formula precedente è il seguente:

[ "Strawberry", "Vanilla" ]

Formule delle tabelle

In Excel e Power Fx, le formule vengono usate per modificare i numeri e le stringhe di testo in modo simile:

  • In Excel digita un valore, ad esempio 42, nella cella A1 e quindi digita una formula, ad esempio A1+2, in un'altra cella per visualizzare il valore di 44.
  • In Power Apps, imposta la proprietà Default di Slider1 su 42 e imposta la proprietà Text di un'etichetta su Slider1.Value + 2 per visualizzare il valore di 44.

In entrambi i casi, il valore calcolato cambia automaticamente se modifichi i valori degli argomenti, ad esempio il numero nella cella A1 o il valore di Slider1.

Analogamente puoi usare le formule per accedere ai dati e modificarli in tabelle e record. Puoi usare i nomi delle tabelle come argomenti in alcune formule, ad esempio Min(Catalog, Price) per visualizzare il valore più basso nella colonna Price della tabella Catalog. Altre formule restituiscono come valori intere tabelle, ad esempio RenameColumns(Catalog, "Price", "Cost") restituisce tutti i record della tabella Catalog, ma modifica il nome della tabella Price in Cost.

Come con i numeri, le formule che includono tabelle e record vengono ricalcolate automaticamente in caso di modifica della tabella o del record sottostante. Se il costo di un prodotto nella tabella Catalog scende al di sotto del valore minimo precedente, il valore restituito dalla formula Min verrà automaticamente modificato in modo che corrisponda.

Funzioni delle tabelle e proprietà di controllo

Considera la funzione Lower. Se la variabile welcome contiene la stringa di testo "Hello, World", la formula Lower( welcome ) restituisce "hello, world". Questa funzione non modifica in alcun modo il valore nella variabile. Lower è una funzione pura in quanto elabora solo input e produce output. Non ha effetti collaterali. Tutte le funzioni in Excel e la maggior parte delle funzioni in Power Fx sono funzioni pure che consentono di ricalcolare automaticamente la cartella di lavoro o l'app.

Power Fx offre una serie di funzioni che operano sulle tabelle allo stesso modo. Queste funzioni accettano le tabelle come input e filtrano, ordinano, trasformano, riducono e riepilogano intere tabelle di dati. Infatti, Lower e molte altre funzioni che in genere accettano un singolo valore possono anche accettare una tabella a colonna singola come input.

Molte funzioni accettano come input una tabella a colonna singola. Se un'intera tabella ha solo una colonna, è possibile specificarla per nome. Se una tabella ha più colonne, puoi specificare una di quelle colonne utilizzando la sintassi Table.Column. Ad esempio, Products.Name restituisce la tabella a colonna singola dei soli valori Name dalla tabella Products.

Puoi rimodellare completamente una tabella come preferisci usando le funzioni AddColumns, RenameColumns, ShowColumns o DropColumns. Ancora una volta, queste funzioni cambiano solo l'output, non l'origine.

Formule di comportamento

Altre funzioni sono specificamente progettate per modificare i dati e avere effetti collaterali. Poiché queste funzioni non sono pure, devi crearle con attenzione e non possono partecipare al ricalcolo automatico dei valori nell'app. Puoi usare queste funzioni solo nelle formule di comportamento.

Ambito dei record

Alcune funzioni valutano una formula in tutti i record di una tabella singolarmente. Il risultato della formula viene usato in vari modi:

  • AddColumns: la formula restituisce il valore del campo aggiunto.
  • Average, Max, Min, Sum, StdevP, VarP: la formula restituisce il valore da aggregare.
  • Filter, Lookup: la formula determina se il record deve essere incluso nell'output.
  • Concat: la formula determina le stringhe da concatenare.
  • Distinct: la formula restituisce un valore usato per identificare i record duplicati.
  • ForAll: la formula può restituire qualsiasi valore, potenzialmente con effetti collaterali.
  • Sort: la formula indica il valore in base al quale ordinare i record.
  • With: la formula può restituire qualsiasi valore, potenzialmente con effetti collaterali.

All'interno di queste formule puoi fare riferimento ai campi del record in fase di elaborazione. Ognuna di queste funzioni crea un "ambito dei record" in cui viene valutata la formula, dove i campi del record sono disponibili come identificatori di primo livello. È inoltre possibile fare riferimento alle proprietà di controllo e ad altri valori nell'app.

Ad esempio, prendi una tabella di Prodotti posizionata in una variabile globale:

Tabelle richieste.

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 determinare se per uno qualsiasi di questi prodotti la domanda ecceda la disponibilità:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Il primo argomento per Filter è la tabella di record su cui operare, mentre il secondo argomento è una formula. Filter crea un ambito dei record per la valutazione di questa formula in cui sono disponibili i campi di ogni record, in questo caso Product, Quantity Requested e Quantity Available. Il risultato del confronto determina se ogni record debba essere incluso nel risultato della funzione:

Tabelle necessarie.

Eseguendo un'operazione di aggiunta a questo esempio possiamo calcolare la quantità da ordinare per ogni prodotto:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

Aggiungi una colonna calcolata al risultato. AddColumns ha il proprio ambito dei record che viene usato per calcolare la differenza tra la domanda e la disponibilità.

Aggiungi colonne.

Puoi infine ridurre la tabella dei risultati alle sole colonne desiderate:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Solo da ordinare.

Nota che nell'esempio precedente sono state usate le virgolette doppie (") in alcuni punti e le virgolette singole (') in altri. Le virgolette singole sono necessarie quando si fa riferimento al valore di un oggetto, ad esempio un campo o una tabella, in cui il nome dell'oggetto contiene uno spazio. Le virgolette doppie vengono usate quando non si fa espressamente riferimento al valore di un oggetto, specialmente in situazioni in cui l'oggetto non esiste ancora, come nel caso di AddColumns.

Risoluzione dell'ambiguità

I nomi di campo aggiunti con l'ambito di record eseguono l'override degli stessi nomi da qualsiasi altra posizione nell'app. In questo caso, puoi comunque accedere ai valori dall'esterno dell'ambito di record con l'operatore di disambiguazione @.

  • Per accedere ai valori da ambiti dei record nidificati, usa l'operatore @ con il nome della tabella su cui si opera usando il pattern seguente:
    Table[@FieldName]
  • Per accedere ai valori globali, ad esempio origini dati, raccolte e variabili di contesto, usa il pattern [@ObjectName] (senza una definizione di tabella).

Se la tabella in cui si opera è un'espressione, ad esempio Filter(Table, ... ), l'operatore di disambiguazione non può essere usato. Solo l'ambito dei record più interno può accedere ai campi di questa espressione di tabella, non usando l'operatore di risoluzione dell'ambiguità.

Supponi ad esempio di avere una raccolta X:

Valore X.

Puoi creare questa raccolta con ClearCollect( X, [1, 2] ).

E un'altra raccolta Y:

Valore Y.

Puoi creare questa raccolta con ClearCollect( Y, ["A", "B"] ).

Definisci anche una variabile di contesto denominata Value con questa formula: UpdateContext( {Value: "!"} )

Riuniamo tutti gli elementi, in questo contesto la formula seguente:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

produce la tabella:

Valore XY.

Nota che la funzione ForAll più esterna definisce un ambito dei record per X, consentendo l'accesso al campo Value di ogni record nel momento in cui viene elaborato. È possibile accedervi semplicemente usando il termine Value oppure X[@Value].

La funzione ForAll più interna definisce un altro ambito del record per Y. Dal momento che questa tabella ha anche un campo Value definito, utilizzando Value qui si fa riferimento al campo nel record di Y e non più a quello di X. Qui, per accedere al campo Value di X dobbiamo usare la versione più lunga con l'operatore di risoluzione ambiguità.

Dato che Y è l'ambito del record più interno, l'accesso ai campi di questa tabella non richiede la risoluzione dell'ambiguità, consentendo di usare questa formula con lo stesso risultato:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

Tutti gli ambiti dei record ForAll sostituiscono l'ambito globale. La variabile di contesto Value definita non è disponibile in base al nome senza l'operatore di risoluzione dell'ambiguità. Per accedere a questo valore, utilizza [@Value].

Ungroup rende flat il risultato perché le funzioni ForAll annidate producono una tabella di risultati annidata.

Tabelle a colonna singola

Per operare su una singola colonna di una tabella, utilizza la funzione ShowColumns come in questo esempio:

ShowColumns( Products, "Product" )

Questa formula produce questa tabella a colonna singola:

Colonna singola.

Per un'alternativa più breve, specifica Table.Column, che estrae la tabella a colonna singola di Column da Table. Ad esempio, questa formula produce esattamente lo stesso risultato di ShowColumns.

Products.Product

Record inline

I record vengono espressi usando parentesi graffe che contengono valori di campo denominati. Ad esempio puoi esprimere il primo record della tabella all'inizio di questo argomento usando la formula seguente:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Puoi anche incorporare formule all'interno di altre formule, come nell'esempio seguente:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Puoi annidare i record annidando le parentesi graffe, come nell'esempio seguente:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Racchiudi tra virgolette singole ogni nome di colonna che contiene un carattere speciale, ad esempio uno spazio o un virgola. Per usare una virgoletta singola all'interno di un nome di colonna è necessario raddoppiarla.

Nota che il valore nella colonna Price non include un simbolo di valuta, ad esempio un simbolo di dollaro. Tale formattazione verrà applicata quando viene visualizzato il valore.

Tabelle inline

Puoi creare una tabella usando la funzione Table e un set di record. Puoi esprimere la tabella all'inizio di questo argomento usando la formula seguente:

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 } 
)

Puoi anche annidare le tabelle:

Table( 
	{ Name: "Chocolate", 
	  'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
	                             { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
	}
)

Tabelle di valori inline

Puoi creare tabelle a colonna singola specificando i valori in parentesi quadre. La tabella risultante ha una singola colonna denominata Value.

Ad esempio, [ 1, 2, 3, 4 ] è equivalente a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) e restituisce questa tabella:

Tabella in linea.