Esercizio - Scrittura dei dettagli della nota spese

Completato

L'aggiunta di dettagli sulle spese o delle singole transazioni che formano la nota spese è più complessa perché si scrivono molte righe diverse contemporaneamente.

Anziché connettersi direttamente all'origine dati, come accade con Gal_ExpenseReports_AllExpenses, si procede con l'archiviazione delle informazioni in una raccolta. Una raccolta è un tipo speciale di variabile che archivia una tabella di dati anziché un record o un valore singolo. La tabella viene usata in seguito nell'app.

Per implementare questa funzionalità, effettuare i seguenti passaggi:

  1. In Visualizzazione albero, andare alla schermata Scr_EditExpense e selezionare la proprietà OnVisible.

  2. Aggiungere il codice seguente a quello esistente:

    ; ClearCollect(
        ColExpenseDetails,
        Filter(
            'Expense Report Details',
            'Expense Report'.'Expense Report' = VarExpense.'Expense Report'
        )
    )
    

    ClearCollect() è una funzione che cancella i record precedenti e inizia una nuova raccolta. La funzione è importante perché consente di non aggiungere nuovi dettagli di spesa da altre note spese.

    ColExpenseDetails è il nome della raccolta. Come per le variabili, questo nome può essere un nome qualsiasi scelto dall'utente. È opportuno tuttavia scegliere un criterio e assegnare un nome che si ricorda facilmente.

    L'ultima parte mostra gli elementi raccolti, una versione filtrata di Dettagli nota spese. La logica del filtro usa il campo di ricerca Expense Report nella tabella dei dettagli ed esplora ulteriormente l'identificatore univoco globale (GUID), denominato anche Expense Report.

    Il campo di ricerca Expense Report viene confrontato con la nota spese contenuta nella variabile VarExpense, usata per individuare il GUID o il campo Expense Report. Il fatto che il GUID abbia lo stesso nome della tabella in Dataverse può creare confusione. In caso di dubbio, esaminare le colonne in Dataverse.

    Il codice OnVisible completato deve essere simile all'immagine seguente.

    Screenshot del codice OnVisible in Power Apps, che esamina il valore della variabile VarExpense.

    È possibile usare la nuova raccolta creata per popolare la raccolta Gal_ExpenseDetails_EditExpense.

  3. Cambiare la proprietà Items di Gal_ExpenseDetails_EditExpense in ColExpenseDetails.

    Screenshot di Power Apps con la raccolta selezionata e la proprietà Items impostata.

    Anche i dettagli non sono ancora presenti, è possibili aggiungerli con Icn_Add_EditExpense.

  4. Impostare la proprietà OnSelect per l'icona Aggiungi su Collect(ColExpenseDetails, {}).

    Come indicato in precedenza, la funzione Collect() aggiunge un elemento a una raccolta esistente e pertanto questa impostazione consente di aggiungere una nuova riga. Le parentesi graffe {} denotano un elemento vuoto.

    Screenshot di Power Apps con l'icona Aggiungi selezionata e la proprietà OnSelect impostata.

  5. Tenere premuto ALT o aprire l'app in modalità Riproduci per aggiungere un paio di righe vuote alla raccolta.

    A questo punto, è necessario puntare i campi corretti nella raccolta, come eseguito nella raccolta nella schermata Tutte le spese.

  6. Iniziare con Txt_Expense_EditExpense e modificare la proprietà Default in ThisItem.Expense.

  7. Aggiornare la proprietà Items di Ddn_Category_EditExpense in ["Meals","Lodging","Transportation","Other"].

    Come indicato nell'unità precedente, le parentesi [] definiscono una tabella. Questo approccio consente di codificare le scelte, ovvero un altro modo di gestire le opzioni in un'app canvas con Dataverse come database. Tale campo è stato definito come campo di testo e non di scelta, quindi si scrive il valore selezionato dall'elenco a discesa.

  8. Aggiornare la proprietà Default di Ddn_Category_EditExpense in ThisItem.Category.

  9. Aggiornare la proprietà DefaultDate di Dte_TransactionDate_EditExpense in ThisItem.'Transaction Date'.

  10. Aggiornare la proprietà Default di Txt_Amount_EditExpense in ThisItem.Amount.

  11. Modificare la proprietà OnSelect di Icn_Trash_EditExpense in Remove(ColExpenseDetails, ThisItem).

    La funzione Remove() può rimuovere elementi da raccolte o da origini dati. Verificare di specificare il record corretto se si usa Remove() con un'origine dati.

    Dopo aver completato la scrittura del codice per la raccolta, dedicare qualche minuto a testare la funzionalità aggiungendo, eliminando e modificando le righe nella raccolta creata.

    Dopo aver completato il test degli aggiornamenti e delle funzionalità più recenti, è necessario completare un altro paio di attività prima di distribuire l'app agli utenti.

    Si procederà con l'esplorazione e l'impostazione del campo Total.

  12. In Lbl_Total_EditExpense eseguire un'aggiunta alla proprietà Text in modo che si legga: "Total: " & Text(Sum(Gal_ExpenseDetails_EditExpense.AllItems, Value(Txt_Amount_EditExpense.Text)), "$#,###.00")

    Screenshot di Power Apps con l'etichetta Totale selezionata e la proprietà Text impostata.

    Notare che si usa ancora Text() per formattare il campo nel modo in cui si desidera visualizzarlo. La nuova funzione da usare è Sum().

    La funzione Sum() acquisisce diversi numeri (o una tabella di dati) e un campo specifico di tale tabella e quindi somma tutte le righe del campo. La funzione Sum() accetta solo un numero e di conseguenza è necessario racchiudere il campo di testo nella funzione Value(), che convertirà un formato testo in un valore numerico.

    Fino a quando la raccolta non è vuota, un nuovo valore Totale è visualizzato nell'etichetta Lbl_Total_EditExpense. Quando si aggiungono, modificano o rimuovono elementi dalla raccolta, il valore Totale viene ricalcolato in tempo reale.

    La prossima attività consiste nello scrivere nell'origine dati. Iniziare con il pulsante Salva come bozza.

  13. Sul pulsante Btn_SaveAsDraft_EditExpense aggiungere il codice seguente alla proprietà OnSelect (dopo il codice esistente):

    ; RemoveIf(
        'Expense Report Details',
        'Expense Report'.'Expense Report' = VarExpense.'Expense Report'
    );
    ForAll(
        Gal_ExpenseDetails_EditExpense.AllItems,
        Patch(
            'Expense Report Details',
            Defaults('Expense Report Details'),
            {
                Expense: Txt_Expense_EditExpense.Text,
                Category: Ddn_Category_EditExpense.Selected.Value,
                'Transaction Date': Dte_TransactionDate_EditExpense.SelectedDate,
                Amount: Value(Txt_Amount_EditExpense.Text),
                'Expense Report': LookUp(
                    'Expense Reports',
                    'Expense Report' = VarExpense.'Expense Report'
                )
            }
        )
    )
    

Gli screenshot seguenti mostrano l'intero codice della barra della formula. Esaminare il codice e verificare che corrisponda a quello creato.

Screenshot di Power Apps che mostra la parte Set Patch della formula.

Screenshot di Power Apps che mostra le parti Remove If e For All della formula.

La nuova funzione RemoveIf() è simile alla funzione Remove(), ad eccezione del fatto che elimina tutti i record che seguono una condizione, anziché un singolo record.

Assicurarsi di specificare una condizione per evitare di eliminare involontariamente tutti i record da una tabella. In questo scenario si eliminano e si creano nuovamente tutti i dettagli di spesa, pertanto non è necessario aggiungere logica sulle righe che rappresentano modifiche rispetto alle righe nuove. Notare che questa condizione è simile al filtro usato per creare la raccolta dei dettagli delle spese.

La funzione ForAll() scorre una tabella di dati, in questo caso Gal_ExpenseDetails_EditExpense.AllItems, ed esegue codice in ogni riga della tabella. Il codice eseguito per questa tabella è l'istruzione Patch().

L'esempio seguente mostra l'istruzione Patch() isolata dal resto del codice:

Patch(
        'Expense Report Details',
        Defaults('Expense Report Details'),
        {
            Expense: Txt_Expense_EditExpense.Text,
            Category: Ddn_Category_EditExpense.Selected.Value,
            'Transaction Date': Dte_TransactionDate_EditExpense.SelectedDate,
            Amount: Value(Txt_Amount_EditExpense.Text),
            'Expense Report': LookUp(
                'Expense Reports',
                'Expense Report' = VarExpense.'Expense Report'
            )
        }
    )

La funzione Patch() scrive direttamente in un'origine dati. Di conseguenza, la prima entità da definire è l'origine dati da modificare, in questo caso Dettagli nota spese.

La riga successiva definisce il record specifico nell'origine dati da modificare. Se si crea una nuova riga, operazione che si esegue in questo esercizio, si usano la funzione Defaults() e il nome dell'origine dati.

Tutti gli elementi tra parentesi graffe {} specificano i campi da modificare e il contenuto da scrivervi. L'esempio seguente mostra che il campo da modificare è Spese e che il contenuto da scrivere è Txt_Expense_EditExpense.Text, ovvero il testo di input denominato Txt_Expense_EditExpense.

Expense: Txt_Expense_EditExpense.Text

Lo scenario è lo stesso nelle tre righe successive, con modifiche minori in base al controllo a cui si fa riferimento. Nella riga Importo il testo è racchiuso in una funzione Value() che converte il testo in un numero per Dataverse.

L'ultimo campo da compilare è "Expense Report". Si tratta di un campo di ricerca per mantenere la relazione tra le tabelle Expense Report e Expense Report Details. Come per la tabella Users, è necessario trovare il record corretto nella tabella padre (Expense Reports). Per completare l'attività, usare la funzione LookUp().

Screenshot di Power Apps che mostra la formula completa del pulsante Salva come bozza.

Dopo aver creato la funzione del salvataggio come bozza, si passerà alla creazione del pulsante Invia nell'unità successiva.