Power Apps – Sesión 06 – Resumen

Reutilización y escalabilidad – Módulo de Facturación (cabecera/detalle) sobre Dataverse, dejando lista la base para integrar Power Automate (aprobaciones/notificaciones)
🎯 Objetivo de la clase
- Consolidar un patrón “más profesional” de app: UI reutilizable (componentes) + datos (Dataverse) + lógica con colecciones + navegación y filtros. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
- Construir la base del proceso de Facturación (cabecera/detalle) para que, en la siguiente clase, se integre un flujo de aprobación con Power Automate (notificación, aprobación/rechazo y estado). (La integración se dejó preparada como siguiente paso.) [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
1) 🔄 Componentes en Power Apps: por qué y para qué
¿Qué se trabajó?
- Se creó un Componente Menú para reemplazar menús duplicados por pantalla y así reutilizar UI en múltiples pantallas. [learn.microsoft.com], [learn.microsoft.com]
- Se reforzó la idea: si actualizas el componente, se actualiza en todas las pantallas donde se usa, reduciendo mantenimiento y errores. [learn.microsoft.com]
Conceptos clave (explicación breve)
- Componentes = bloques reutilizables para controles y patrones repetidos (menús, headers, etc.). [learn.microsoft.com]
- Propiedades personalizadas = permiten que el componente reciba o envíe información/lógica:
- Data properties (Input/Output) para pasar datos,
- Event properties para callbacks (la app define lógica que el componente invoca). [learn.microsoft.com], [learn.microsoft.com]
2) 🧭 Menú dinámico por “módulo” usando Colecciones + Componentes
Problema abordado
Se necesitaba que cada “módulo” (por ejemplo Ventas vs Productos) tenga menús distintos, pero con la misma “estructura visual”. [learn.microsoft.com], [learn.microsoft.com]
Solución implementada (patrón técnico)
- En la pantalla de “módulos”, al hacer clic en un módulo:
- Se navega a la primera pantalla del módulo (Navigate) [learn.microsoft.com], [learn.microsoft.com]
- Se construye una colección
colMenu(o “lista menú”) con registros{id, nombre, pantalla}. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
- El componente “Menú” recibe esa colección mediante una propiedad personalizada de tipo Tabla (Input) y la muestra con una Gallery. [learn.microsoft.com], [learn.microsoft.com]
- Cada opción de menú navega usando
Navigate(ThisItem.pantalla)(o equivalente) para abrir la pantalla asociada. [learn.microsoft.com], [learn.microsoft.com]
✅ Por qué este patrón es sólido:
- Colecciones permiten manejar un “menú en memoria” rápido y configurable, y se pueden enlazar a galerías fácilmente. [learn.microsoft.com], [learn.microsoft.com]
- Navigate es la forma estándar de cambiar pantallas y puede combinarse con variables/contexto si se requiere. [learn.microsoft.com], [learn.microsoft.com]
3) 🔎 Búsqueda / filtrado en galerías (UX rápida)
Se implementó un buscador para filtrar productos por nombre con un patrón típico:
- Si el textbox está vacío → mostrar todo (
IsBlank) [learn.microsoft.com] - Si tiene texto → filtrar por coincidencia al inicio (
StartsWith) [learn.microsoft.com], [learn.microsoft.com]
Idea clave: Filter() devuelve una tabla con los registros que cumplen una condición y es la base de la mayoría de búsquedas en galerías. [learn.microsoft.com]
4) 🗃️ Dataverse: modelo de datos y relaciones (Facturación)
4.1 Dataverse vs otras opciones (mensaje del docente)
- Se comparó Dataverse con alternativas: es más robusto para modelos relacionales, seguridad y escalabilidad; mientras que otros orígenes pueden ser más simples para escenarios básicos. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
Nota de refuerzo: Microsoft presenta criterios para elegir entre Lists / Dataverse for Teams / Dataverse, principalmente por capacidad, tipo de datos y gobernanza. [learn.microsoft.com], [learn.microsoft.com]
4.2 Estructura de Facturación (cabecera/detalle)
Se diseñó el patrón típico de negocio:
- Cliente (tabla maestra)
- Factura (cabecera) → lookup a Cliente
- Factura_Detalle (detalle) → lookup a Factura y lookup a Producto
- Producto (tabla maestra para facturación) con al menos Nombre y Precio [learn.microsoft.com], [learn.microsoft.com]
📌 Concepto clave: en Dataverse, una columna Lookup crea una relación (por ejemplo, many-to-one / one-to-many) entre tablas. [learn.microsoft.com], [learn.microsoft.com]
4.3 ¿Por qué Cliente NO va en Factura_Detalle?
Porque el cliente vive en la cabecera: si lo repites en cada detalle, duplicas información y pierdes normalización. Ese diseño se representa correctamente como:
Cliente (1) → Facturas (N) → Facturas_Detalle (N). [learn.microsoft.com], [learn.microsoft.com]
5) 🧾 Pantalla de Facturación (Canvas): controles y lógica
Controles principales usados
- Combo box para seleccionar Cliente y Producto (selección única desactivando
SelectMultiple). [learn.microsoft.com], [learn.microsoft.com] - Text input para ingresar nro documento y cantidad. (La cantidad se convierte a número con
Value()al calcular totales.) [learn.microsoft.com], [learn.microsoft.com] - Gallery para mostrar el detalle de productos agregados (líneas de factura) desde una colección. [learn.microsoft.com], [learn.microsoft.com]
Lógica de “Agregar ítem al detalle”
Se implementó un detalle “en memoria” con colección:
- Opción 1:
Collect()para ir agregando líneas. [learn.microsoft.com], [learn.microsoft.com] - El ID correlativo se generó con
CountRows(colDetalle)+1. [learn.microsoft.com] - El total por ítem se calculó como:
Value(txtCant.Text) * cboProducto.Selected.Precio. (La conversión a número evita errores por tipos.) [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
✅ Importante: se aclaró que este detalle en colección no persiste si no se guarda en Dataverse (se pierde al recargar). Esto es consistente con el uso de colecciones como almacenamiento temporal. [learn.microsoft.com], [learn.microsoft.com]
6) 🧩 Integración planeada: Power Apps + Power Automate (aprobación)
Se definió el objetivo funcional (para cerrar en la próxima sesión):
- Guardar cabecera/detalle de factura en Dataverse. [learn.microsoft.com], [learn.microsoft.com]
- Disparar un flujo de aprobación/validación (correo/Teams) y actualizar el estado (Pendiente/Aprobado/Rechazado). (Quedó planteado como la siguiente fase.) [learn.microsoft.com], [learn.microsoft.com]
❓ Preguntas y respuestas destacadas (con refuerzo oficial)
1) “¿Dataverse vs SQL Server si manejo ~25k–50k registros/año?”
✅ Respuesta del docente (síntesis): ambos pueden llegar al mismo objetivo; Dataverse es más “amigable” y rápido de implementar para escenarios comunes; SQL Server requiere más conocimiento y se elige si el escenario exige arquitectura/operación más avanzada.
🔎 Refuerzo oficial: Power Apps se conecta a SQL Server mediante el conector y puede delegar operaciones como Filter al back-end; además se recomiendan patrones profesionales (vistas/procedimientos) según el caso. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
2) “¿Por qué Cliente no se relaciona directamente con Factura_Detalle?”
✅ Respuesta del docente (síntesis): porque el cliente se define en la cabecera (Factura) y el detalle solo maneja líneas de productos; repetir cliente por línea duplicaría información.
🔎 Refuerzo oficial: Dataverse recomienda modelar relaciones 1:N con lookup; la relación natural es Cliente→Factura (1:N) y Factura→Detalle (1:N). [learn.microsoft.com], [learn.microsoft.com]
3) “¿Power Apps se puede enlazar con Oracle?”
✅ Respuesta del docente (síntesis): no de forma “nativa” dentro del ecosistema Microsoft como Dataverse, pero sí se puede integrar mediante conexión/servicio.
🔎 Refuerzo oficial: Power Apps soporta conexión a Oracle usando el Oracle Database connector, normalmente mediante on-premises data gateway y requisitos del cliente ODAC. [learn.microsoft.com], [learn.microsoft.com]
4) “¿Cómo hago un buscador que muestre todo si no hay texto?”
✅ Respuesta del docente (síntesis): validar si el cuadro está vacío (IsBlank) y si no lo está, filtrar por coincidencia (StartsWith).
🔎 Refuerzo oficial: IsBlank verifica blancos; StartsWith permite búsquedas por inicio de texto; ambos se usan comúnmente con Filter. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
✅ Conclusiones
- Se dio un salto fuerte en arquitectura de Canvas Apps: se evitó duplicación con componentes reutilizables y se habilitó un menú dinámico por módulo con colecciones + galería. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
- Se avanzó en el modelado relacional en Dataverse para facturación (cabecera/detalle) usando lookups y relaciones 1:N típicas de negocio. [learn.microsoft.com], [learn.microsoft.com]
- Se dejó lista la base para automatizar aprobaciones (estado Pendiente/Aprobado/Rechazado) como siguiente etapa al integrar Power Automate. [learn.microsoft.com], [learn.microsoft.com]
⭐ Recomendaciones
- 🧱 Estandariza componentes: convierte también el header en componente (logo + título + botones) para seguir reduciendo duplicación. [learn.microsoft.com], [learn.microsoft.com]
- 🧠 Tipa bien tus datos: cuando calcules totales, asegura conversiones (
Value) y evita mezclar texto con número. (Reduce bugs de cálculo.) [learn.microsoft.com], [learn.microsoft.com] - 🔎 Filtrado con delegación: si tu origen crece, revisa qué funciones delegan;
Filteres central para performance. [learn.microsoft.com], [learn.microsoft.com] - 🗃️ Persistencia: lo de colección es temporal; implementa “Guardar factura” (cabecera + detalle) en Dataverse para que no se pierda al reiniciar. [learn.microsoft.com], [learn.microsoft.com]
- 🔌 Integraciones externas (Oracle/SQL): usa conectores oficiales y gateway cuando corresponda; evita atajos por seguridad y soporte. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
📚 Referencias oficiales
- Canvas component overview
- Canvas component properties (data/function/action/event)
- Collect, Clear, ClearCollect (Power Fx)
- Create and update a collection in a canvas app
- CountRows / CountIf (Power Fx)
- Filter, Search, LookUp (Power Fx)
- StartsWith / EndsWith (Power Fx)
- IsBlank / IsEmpty (Power Fx)
- Back and Navigate functions (Power Fx)
- Combo box control in Power Apps
- Create relationships using lookup columns (Dataverse)
- About table relationships for Dataverse
- Connect to SQL Server from Power Apps overview
- Connect to an Oracle database from Power Apps

