È possibile creare un'app che accede alle informazioni in Microsoft Excel, SharePoint, SQL Server e diverse altre origini che archiviano dati in tabelle e record. Per usare questa tipologia di dati in modo ottimale, esaminare 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.

Nell'app si useranno le formule per creare, aggiornare e modificare record e tabelle. I dati verranno probabilmente letti e scritti in un'origine dati esterna, ovvero una tabella estesa. È anche possibile creare una o più tabelle interne denominate raccolte.

È possibile creare un'ampia gamma di formule che usano il nome di una tabella come argomento, proprio come una formula in Excel usa uno o più riferimenti di cella come argomenti. Alcune formule in PowerApps restituiscono una tabella che riflette gli altri argomenti specificati. È ad esempio possibile 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 tali funzioni modifica la tabella originale. La funzione restituisce invece un'altra tabella basata sugli altri argomenti specificati.

Elementi di una tabella

Record

Ogni record contiene almeno una categoria di informazioni per 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 è possibile fare riferimento a un record a sé, fuori dal contesto di una tabella, usando le parentesi graffe. Ad esempio, il record { Name: "Strawberries", Price: 7.99 } non è associato a una tabella.

Campi

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

Come con un controllo, si fa riferimento a un campo di un record usando . come operatore nel 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. È possibile 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, ogni prodotto ha un campo di prezzo e il prezzo si trova nella stessa colonna per tutti i prodotti. La tabella precedente ha quattro colonne, disposte orizzontalmente nella parte superiore:

  • Name
  • Price
  • Quantity on Hand
  • Quantity on Order

Il nome della colonna riflette i campi in tale colonna.

Tutti i valori all'interno di una colonna sono dello 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.

Nota: per origini dati SharePoint o Excel che contengono nomi di colonna con spazi, PowerApps sostituirà gli spazi con "_x0020_". Ad esempio, "Nome colonna" in SharePoint o Excel verrà visualizzato come "Column_x0020_Name" in PowerApps quando viene visualizzato nel layout di dati o usato in una formula.

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 viene usato 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, è possibile esprimere una tabella in una formula usando la funzione Table con un set di record, usando le parentesi graffe:

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

È anche possibile 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 PowerApps, le formule vengono usate per modificare i numeri e le stringhe di testo in modo simile:

  • In Excel digitare un valore, ad esempio 42, nella cella A1 e quindi digitare una formula, ad esempio A1+2, in un'altra cella per visualizzare il valore di 44.
  • In PowerApps impostare la proprietà Default di Slider1 su 42 e 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 si modificano i valori degli argomenti, ad esempio il numero nella cella A1 o il valore di Slider1.

Analogamente è possibile usare le formule per accedere ai dati e modificarli in tabelle e record. È possibile 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.

Verranno ora illustrati alcuni semplici esempi.

  1. Aggiungere un controllo Raccolta testi e impostare la proprietà Items sul nome di una tabella.

    Per impostazione predefinita, la raccolta visualizza il testo segnaposto di una tabella denominata TextualGallerySample. La proprietà Items della raccolta viene impostata automaticamente su tale tabella.

    Nota: alcuni controlli sono stati riorganizzati e ingranditi a scopo illustrativo.

  2. Invece di impostare la proprietà Items sul nome di una tabella, impostarla su una formula che include il nome della tabella come argomento, come nell'esempio seguente:
    Sort(TextualGallerySample, Heading, Descending)

    Questa formula include la funzione Sort che usa il nome di una tabella come primo argomento e il nome di una colonna della tabella come secondo argomento. La funzione supporta anche un terzo argomento facoltativo, che indica che si vogliono ordinare i dati in ordine decrescente.

  3. Impostare la proprietà Items su una formula che usa la formula del passaggio precedente come argomento e restituisce una tabella, come nell'esempio seguente:
    FirstN(Sort(TextualGallerySample, Heading, Descending), 2)

    In questa formula si usa la funzione FirstN per visualizzare un determinato numero di record in una tabella. Si usa la funzione Sort come primo argomento per FirstN e un numero (in questo caso 2) come secondo argomento per specificare il numero di record da visualizzare.

    L'intera formula restituisce una tabella contenente i primi due record della tabella TextualGallerySample, ordinati in base alla colonna Heading in ordine decrescente.

Funzioni delle tabelle e proprietà di controllo

Molte funzioni in PowerApps usano il nome di una tabella come argomento, creano una seconda tabella che contiene gli stessi dati, modificano la nuova tabella in base agli altri argomenti e quindi restituiscono il risultato. Queste funzioni non modificano la tabella originale, anche se è un'origine dati.

  • Sort, Filter: ordina e filtra i record.
  • FirstN, LastN: restituisce i primi o gli ultimi N record della tabella.
  • Abs, Sqrt, Round, RoundUp, RoundDown: operazioni aritmetiche su ogni record di una tabella a colonna singola, che restituiscono una tabella di risultati a colonna singola.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper: manipolazioni di stringa su ogni record di una tabella a colonna singola, che restituiscono una tabella di stringhe a colonna singola.
  • Len: per una colonna di stringhe, restituisce una tabella a colonna singola che contiene la lunghezza di ogni stringa.
  • Concatenate: concatena più colonne di stringhe e restituisce una tabella di stringhe a colonna singola.
  • AddColumns, DropColumns, RenameColumns, ShowColumns: manipolazioni delle colonne della tabella che restituiscono una nuova tabella con colonne diverse.
  • Distinct: rimuove i record duplicati.
  • Shuffle: sposta i record in un ordine casuale.
  • HashTags: cerca gli hashtag in una stringa.
  • Errors: offre informazioni sugli errori quando si usa un'origine dati.

È possibile eseguire una funzione in una tabella che contiene più colonne, anche se la funzione richiede una singola colonna come argomento. Per estrarre una singola colonna da una tabella a più colonne, usare la funzione ShowColumns come argomento per la funzione che si vuole usare, come nell'esempio seguente:
Lower( ShowColumns( Products, "Name" ) )

Questa formula crea una tabella a colonna singola che contiene tutti i dati della colonna Name della tabella Products, ma converte tutte le lettere maiuscole in lettere minuscole. Se si specifica una tabella come argomento per la funzione AddColumns, RenameColumns o DropColumns, è possibile modificare completamente la tabella nel modo desiderato.

Se si specifica un'origine dati come argomento per una di queste funzioni, i record dell'origine dati verranno modificati e, in generale, il nuovo valore dell'origine dati verrà restituito come tabella.

  • Collect, Clear, ClearCollect: operazioni di creazione, cancellazione e aggiunta per una raccolta.
  • Update, UpdateIf: aggiorna i record che corrispondono a uno o più criteri specificati.
  • Remove, RemoveIf: elimina i record che corrispondono a uno o più criteri specificati.

I controlli seguenti hanno proprietà che sono tabelle:

  • Items: si applica alle raccolte e agli elenchi a discesa. Tabella da visualizzare nella raccolta.
  • SelectedItems: si applica agli elenchi a discesa. Tabella di elementi selezionati dall'utente.

Formule dei record

È anche possibile compilare una formula che calcola i dati per un singolo record, usa un singolo record come argomento e fornisce un singolo record come valore restituito. Tornando all'esempio di raccolta precedente, si userà la proprietà Gallery1.Selected per visualizzare le informazioni di un record qualsiasi selezionato dall'utente in tale raccolta.

  1. Aggiungere un pulsante e impostarne la proprietà OnSelect su questa formula:
    Collect( SelectedRecord, Gallery1.Selected )
  2. Se il pulsante non è selezionato, fare clic per selezionarlo e quindi fare di nuovo clic su di esso per eseguire la formula.
  3. Nel menu File selezionare Raccolte.

Questa formula restituisce un record che include non solo i dati del record selezionato nella raccolta, ma anche ogni controllo in tale raccolta. Il record contiene ad esempio sia una colonna Body, che corrisponde alla colonna Body della tabella originale, che una colonna Body1 che rappresenta l'etichetta che mostra i dati di tale colonna. Selezionare l'icona della tabella nella colonna Body1 per esaminare i dati.

Dopo avere selezionato il record è possibile estrarne i singoli campi con l'operatore . .

  1. Premere Esc per tornare all'area di lavoro predefinita e quindi aggiungere un'etichetta sotto la raccolta.

  2. Impostare la proprietà Text dell'etichetta su questa formula:
    Gallery.Selected.Heading

È stata usata la proprietà Selected, un record, e quindi ne è stata estratta la proprietà Heading.

È anche possibile usare un record come contenitore per utilizzo generico per valori denominati correlati.

  • Se si compila una formula con le funzioni UpdateContext e Navigate, usare un record per raccogliere le variabili di contesto che si vogliono aggiornare.
  • Usare la proprietà Updates in un controllo Modifica modulo per raccogliere le modifiche apportate dall'utente in un modulo.
  • Usare la funzione Patch per aggiornare un'origine dati e anche per unire i record.

In questi casi, il record non ha mai fatto parte di una tabella.

Funzioni dei record e proprietà di controllo

Funzioni che restituiscono record:

  • FirstN, LastN: restituisce i primi o gli ultimi record della tabella.
  • Lookup: restituisce il primo record di una tabella che corrisponde a uno o più criteri.
  • Patch: aggiorna un'origine dati o unisce i record.
  • Defaults: restituisce i valori predefiniti per un'origine dati.

Proprietà che restituiscono record:

  • Selected: si applica alle raccolte e agli elenchi a discesa. Restituisce il record attualmente selezionato.
  • Updates: si applica alle raccolte. Incorpora tutte le modifiche apportate da un utente in un modulo di immissione dati.
  • Update: si applica ai controlli di input, ad esempio a controlli di input di testo e dispositivi di scorrimento. Imposta singole proprietà per la raccolta.

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:

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

All'interno di queste formule è possibile 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. È anche possibile fare riferimento alle proprietà del controllo e ad altri valori in tutta l'app.

Ad esempio per una tabella Products:

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:

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

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

Qui si aggiunge 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à.

È infine possibile 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" )

Si noti 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 dei record sostituiscono gli stessi nomi presenti in un'altra posizione dell'app. In questo caso è comunque possibile accedere ai valori dall'esterno dell'ambito dei record con l'operatore @ di risoluzione dell'ambiguità:

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

Se la tabella in cui si opera è un'espressione, ad esempio Filter( table, ... ), l'operatore di risoluzione dell'ambiguità 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à.

Si supponga ad esempio di avere una raccolta X:

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

E un'altra raccolta Y:

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

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

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

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

produce la tabella:

Si noti 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 dei record per Y. Poiché per questa tabella è stato definito anche un campo Value, l'uso di Value si riferisce in questo caso al campo nel record di Y e non più a quello di X. Per accedere al campo Value di X, in questo caso è necessario usare la versione più estesa con l'operatore di risoluzione dell'ambiguità.

Dato che Y è l'ambito dei 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 è necessario usare [@Value].

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

Sintassi inline

Record

I record vengono espressi usando parentesi graffe che contengono valori di campo denominati. È ad esempio possibile 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 }

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

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

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

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

Racchiudere 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.

Si noti 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

È possibile creare una tabella usando la funzione Table e un set di record. È possibile 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 } )

È anche possibile annidare le tabelle:

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

Tabelle di valori

È possibile 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 ] equivale a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) e restituisce questa tabella: