Ejercicio: Escribir los detalles del informe de gastos

Completado

Agregar detalles sobre los gastos, o las transacciones individuales que se incluyen en el informe de gastos, resulta más complicado porque se están escribiendo muchas líneas diferentes a la vez.

En lugar de conectarse directamente al origen de datos, como con Gal_ExpenseReports_AllExpenses, la información se almacena en una colección. Las colecciones son un tipo especial de variable que almacena tablas de datos en lugar de un solo registro o valor. Almacenarían esta tabla para su uso posterior en la aplicación.

Para implementar esta funcionalidad, siga estos pasos:

  1. En la Vista de árbol, vaya a la pantalla Scr_EditExpense y seleccione la propiedad OnVisible.

  2. Agregue el código siguiente al que ya existe:

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

    ClearCollect() es una función para borrar registros anteriores e iniciar una colección nueva. Esta función es muy útil para evitar agregar nuevos detalles de gastos de otros informes de gastos.

    ColExpenseDetails es el nombre de la colección. Al igual que con las variables, puede elegir este nombre libremente. Sin embargo, se recomienda seguir un patrón y asignar un nombre que pueda recordar fácilmente.

    La última sección muestra lo que se está recopilando, una versión filtrada de los Detalles del informe de gastos. La lógica de filtrado utiliza el campo de búsqueda Informe de gastos de la tabla de detalles y examina en mayor profundidad el identificador único global (GUID), que también se denomina Informe de gastos.

    El campo de búsqueda Informe de gastos se compara con el informe de gastos en la variable VarExpense, que se puede usar para descubrir el GUID o el campo Informe de gastos. El hecho de que el GUID tenga el mismo nombre que la tabla en Dataverse puede llevar a confusión. En caso de duda, remítase a las columnas en Dataverse.

    El código de OnVisible completado debe ser similar al que aparece en la siguiente imagen.

    Captura de pantalla del código de OnVisible en Power Apps, que analiza el valor de la variable VarExpense

    Puede usar la colección nueva que ha creado para llenar la galería Gal_ExpenseDetails_EditExpense.

  3. Cambie la propiedad Items de Gal_ExpenseDetails_EditExpense a ColExpenseDetails.

    Captura de pantalla de Power Apps con la galería seleccionada y la propiedad Items configurada

    Aunque no haya detalles aún, puede agregarlos con Icn_Add_EditExpense.

  4. Establezca la propiedad OnSelect para el icono Agregar en Collect(ColExpenseDetails, {}).

    Como se mencionó anteriormente, Collect() se agrega a una colección existente, por lo que esta configuración agregará una nueva línea. Las llaves {} indican un elemento en blanco.

    Captura de pantalla de Power Apps con el icono Agregar seleccionado y la propiedad OnSelect definida

  5. Mantenga pulsada la tecla Alt o abra la aplicación en el modo Reproducir para agregar un par de líneas en blanco a la colección.

    Ahora, debe apuntar a los campos correctos en la galería, tal como hizo en la galería en la pantalla Todos los gastos.

  6. Empiece con Txt_Expense_EditExpense y cambie la propiedad Default a ThisItem.Expense.

  7. Cambie la propiedad Items de Ddn_Category_EditExpense a ["Meals","Lodging","Transportation","Other"].

    Como se indicó en la unidad anterior, los corchetes [] definen una tabla. Este enfoque le permite codificar opciones, otro método para administrar opciones en una aplicación de lienzo con Dataverse como base de datos. Este campo se definió como texto y no como un campo de opción, por lo que se debe escribir el valor seleccionado en la lista desplegable.

  8. Cambie la propiedad Default de Ddn_Category_EditExpense a ThisItem.Category.

  9. Cambie la propiedad DefaultDate de Dte_TransactionDate_EditExpense a ThisItem.'Transaction Date'.

  10. Cambie la propiedad Default de Txt_Amount_EditExpense a ThisItem.Amount.

  11. Cambie la propiedad OnSelect de Icn_Trash_EditExpense a Remove(ColExpenseDetails, ThisItem).

    La función Remove() permite eliminar elementos de colecciones u orígenes de datos. Asegúrese de especificar el registro correcto si está utilizando Remove() con un origen de datos.

    Tras completar la lógica de la galería, pruebe la funcionalidad durante unos minutos; para ello, agregue, elimine o edite líneas en la galería.

    Cuando termine de probar las últimas actualizaciones y funciones, deberá completar un par de tareas más antes de implementar esta aplicación para los usuarios.

    Después, podrá examinar y configurar el campo Total.

  12. En Lbl_Total_EditExpense agregue lo necesario a la propiedad Text para que se lea del siguiente modo: "Total: " & Text(Sum(Gal_ExpenseDetails_EditExpense.AllItems, Value(Txt_Amount_EditExpense.Text)), "$#,###.00")

    Captura de pantalla de Power Apps con la etiqueta Total seleccionada y la propiedad Text definida

    Observe cómo se usa Text() para establecer el formato del campo según desee presentarlo. La nueva función que va a utilizar es Sum().

    La función Sum() captura varios números (o una tabla de datos) y un campo específico en esa tabla y, luego, suma cada una de las líneas del campo. Sum() solo aceptará números, por lo que es necesario añadir el campo de texto dentro la función Value(), que convertirá un formato de texto a un formato de valor numérico.

    Si la colección no está vacía, deberá aparecer un valor Total en la etiqueta Lbl_Total_EditExpense. Cuando agrega, edita o elimina elementos de la colección, el valor Total se vuelve a calcular en tiempo real.

    La siguiente tarea es escribir en el origen de datos. Puede comenzar con el botón Guardar como borrador.

  13. En el botón Btn_SaveAsDraft_EditExpense, agregue el código siguiente a la propiedad OnSelect (después del código ya escrito):

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

Las siguientes capturas de pantalla muestran el código de barras completo de la fórmula. Dedique unos minutos a revisar y confirmar que el código coincida.

Captura de pantalla de Power Apps que muestra la porción Set Patch de la fórmula

Captura de pantalla de Power Apps que muestra las porciones Remove If y For All de la fórmula

La nueva función RemoveIf() es similar a la función Remove(), salvo que elimina todos los registros que siguen a una condición en lugar de un solo registro.

Asegúrese de especificar una condición o podría eliminar involuntariamente todos los registros de una tabla. En este caso, está eliminando y volviendo a crear todos los detalles de gastos, a fin de no necesitar agregar una lógica respecto a las líneas que se van a modificar frente a las líneas que son nuevas. Es posible que observe que esta condición es similar al filtro que utilizó para crear la colección de detalles de gastos.

La función ForAll() pasa por una tabla de datos, en este caso Gal_ExpenseDetails_EditExpense.AllItems, y ejecuta el código en cada línea de la tabla. El código que se está ejecutando para esta tabla es la instrucción Patch().

El siguiente ejemplo muestra la instrucción Patch() aislada del resto del código:

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 función Patch() escribe directamente en un origen de datos. Por tanto, la primera entidad que debe definir es el origen de datos que desea editar y que en este caso es "Detalles del informe de gastos".

La siguiente línea define el registro específico en el origen de datos que está editando. Si está creando una línea nueva, que es de lo que se trata este ejercicio, utilizará la función Defaults() y el nombre del origen de datos.

Todo lo que esté dentro de las llaves {} indica los campos que está editando y lo que está escribiendo en esos campos. En el siguiente ejemplo, se observa que el campo que se está editando es Expense y está escribiendo Txt_Expense_EditExpense.Text, es decir, el texto de la entrada de texto denominado Txt_Expense_EditExpense.

Expense: Txt_Expense_EditExpense.Text

La situación es la misma para las tres líneas siguientes, con cambios menores según el control al que se hace referencia. En la línea Amount, el texto está dentro de una función Value(), la cual convierte el texto en un número para Dataverse.

El último campo en el que se escribe es "Informe de gastos". Este campo es una búsqueda para mantener la relación entre las tablas Expense Report y Expense Report Details. Al igual que con la tabla Usuarios, debe encontrar el registro correcto en la tabla principal (Expense Reports). Para completar esta tarea, use la función LookUp().

Captura de pantalla de Power Apps donde aparece la fórmula completa del botón Guardar como borrador

Ahora que hemos creado la capacidad de guardar como borrador, trabajaremos en el botón Enviar en la siguiente unidad.