Novedades Power Platform

Para la Transformación Digital e Innovación Tecnológica

Novedades Power Platform

Para la Transformación Digital e Innovación Tecnológica

Power AppsPower Platform

Power Apps – Sesión 05 – Resumen

Diseño y Construcción Avanzada (Finalización de app tipo Kardex con SharePoint Lists)


🎯 Objetivo de la clase

Consolidar una aplicación Canvas orientada a negocio (Kardex) pasando de Dataverse a SharePoint Lists, mejorando diseño, navegación, gestión del estado con variables y lógica de registro de movimientos que actualiza el stock del producto. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]


🧩 Temas tratados

1) 🧱 SharePoint Lists como base de datos (Productos y Movimientos)

Modelado recomendado:

✅ Buen tip técnico del docente: evitar tildes / ñ en nombres internos de columnas para reducir problemas de referencia en fórmulas y conectores (buena práctica general de integración). [learn.microsoft.com], [learn.microsoft.com]


2) 🔌 Conexión de Power Apps a SharePoint (reemplazo de Dataverse)

  • Se conectaron las listas desde Data > Add data > SharePoint y se reasignó el origen en controles (galería y formularios). [learn.microsoft.com]
  • Se enfatizó el patrón: Galería para listar, EditForm/NewForm para crear/editar registros y SubmitForm si se desea guardar desde un formulario. [learn.microsoft.com], [learn.microsoft.com]

3) 🖼️ Galería de productos: imágenes desde adjuntos (SharePoint)

  • Se explicó que el campo Adjuntos puede devolver varios archivos, por lo que el control imagen necesita tomar solo uno (por ejemplo, el primero).
  • Para esto se aplica First() sobre la columna de adjuntos y luego el Value (contenido/URL del archivo según el control y contexto). [learn.microsoft.com], [learn.microsoft.com]

📌 Referencia: el control Attachments y su comportamiento/limitaciones en canvas apps. [learn.microsoft.com], [learn.microsoft.com]


4) 🧭 Estructura del Árbol (Tree View) + Contenedores (Containers)


5) ✅ “Filtro booleano” (Activo: Sí/No) — aplicado a productos

Como en la clase se definió una columna Activo (Sí/No), se recomendó aplicar un filtro en la galería para mostrar solo productos activos. [learn.microsoft.com], [learn.microsoft.com]

🔧 Ejemplo recomendado (Items de la galería):

// Solo productos activos
Filter('Lista_Productos', Activo = true)

Con buscador + filtro booleano (patrón típico):

Filter(
    'Lista_Productos',
    Activo = true &&
    (IsBlank(txtBuscar.Text) || txtBuscar.Text in Title)
)

Nota: Filter y in son funciones clave para búsqueda/filtrado; considerar delegación en listas grandes. [learn.microsoft.com]


6) 🧠 Variables booleanas para UX (mostrar/ocultar menú)

Se implementó un patrón de estado simple usando una variable global booleana con Set():

📌 Patrón recomendado:

// App.OnStart
Set(varMenuVisible, true);
// Icono menú (OnSelect)
Set(varMenuVisible, !varMenuVisible);
// Contenedor del menú (Visible)
varMenuVisible

7) 🧾 Registro de movimientos + actualización de stock (lógica Kardex)

Se construyó lógica para:

  1. Guardar el movimiento en la lista Movimientos
  2. Actualizar stock en la lista Productos según:
    • Entrada → Stock = Stock + Cantidad
    • Salida → Stock = Stock – Cantidad

✅ Funciones clave utilizadas

📌 Patrón recomendado (conceptual) para “Guardar movimiento”
(ejemplo simplificado, orientativo y alineado a lo visto):

// 1) Guardar movimiento
Patch(
    Lista_Movimientos,
    Defaults(Lista_Movimientos),
    {
        Producto: cboProducto.Selected,
        TipoMovimiento: cboTipo.Selected.Value,
        Cantidad: Value(txtCantidad.Text),
        FechaRegistro: dtpFecha.SelectedDate,
        Observacion: txtObs.Text
    }
);

// 2) Actualizar stock del producto seleccionado
If(
    cboTipo.Selected.Value = "Entrada",
    Patch(
        Lista_Productos,
        LookUp(Lista_Productos, ID = cboProducto.Selected.ID),
        { Stock: LookUp(Lista_Productos, ID = cboProducto.Selected.ID).Stock + Value(txtCantidad.Text) }
    ),
    Patch(
        Lista_Productos,
        LookUp(Lista_Productos, ID = cboProducto.Selected.ID),
        { Stock: LookUp(Lista_Productos, ID = cboProducto.Selected.ID).Stock - Value(txtCantidad.Text) }
    )
);

// 3) Mensaje al usuario
Notify("Movimiento guardado.", NotificationType.Success, 2000);

🔎 Recomendación técnica: para mejorar legibilidad y rendimiento, se puede usar With() y evitar repetir LookUp() (opcional, práctica avanzada). [learn.microsoft.com]


❓ Preguntas y respuestas destacadas (con refuerzo oficial)

❓ 1) “¿Por qué conviene usar variables para mostrar/ocultar el menú?”

Respuesta del docente (síntesis): porque permite controlar el estado visual (UI) de forma simple y reutilizable en varias pantallas.
🔎 Refuerzo Microsoft: Set() crea/actualiza variables globales y se usan en propiedades como Visible. [learn.microsoft.com], [learn.microsoft.com]


❓ 2) “¿Por qué la imagen (adjuntos) da error en la galería?”

Respuesta del docente (síntesis): porque adjuntos devuelve una colección (varios archivos); el control de imagen requiere un único valor/archivo.
🔎 Refuerzo Microsoft: control Attachments y limitaciones; uso de First() para tomar el primer registro de una tabla. [learn.microsoft.com], [learn.microsoft.com]


❓ 3) “¿Cómo relaciono Movimientos con Productos?”

Respuesta del docente (síntesis): usando una columna Lookup (búsqueda) en SharePoint y luego consumiendo esa relación desde Power Apps.
🔎 Refuerzo Microsoft: tutorial oficial sobre columnas Lookup y su uso en Power Apps. [learn.microsoft.com], [learn.microsoft.com]


❓ 4) “¿Cuál es la forma correcta de guardar y actualizar datos en listas?”

Respuesta del docente (síntesis): usar Patch() para insertar o actualizar registros y LookUp() para ubicar el registro a modificar.
🔎 Refuerzo Microsoft: Patch() para crear/actualizar y Filter/LookUp para encontrar registros. [learn.microsoft.com], [learn.microsoft.com]


✅ Conclusiones


⭐ Recomendaciones


📚 Referencias oficiales

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

advanced-floating-content-close-btnBoton