Saltar al contenido

Introducción a App Builder - Apéndice B: La capa de negocio en App Builder (Avanzado)

Este es el segundo apéndice de la serie de tutoriales Introducción a App Builder. Estos apéndices complementan las lecciones de la serie y proporcionan información más detallada sobre los conceptos introducidos.

En esta lección, exploraremos más a fondo la capa de negocio de App Builder, el área donde creamos objetos de negocio o reglas.

Uniones

Las uniones, introducidas en Lección 7, se utilizan cuando trabajamos con reglas que extraen datos de más de una tabla en la capa de datos. App Builder es capaz de construir las uniones automáticamente en función de tus selecciones de tablas de origen para tus reglas.

Las uniones son un concepto similar, pero combinan datos verticalmente, es decir, apilan los resultados de dos consultas, produciendo una lista de resultados de más de una tabla, siempre que tengan una columna con el mismo nombre.

Para demostrar cómo funciona una unión, vamos a crear manualmente una unión que muestre todos los países que existen en la fuente de datos Northwinds. Hay dos tablas, Supplier y Customer, que contienen una columna llamada Country, así que combinaremos las entradas de ambas.

  1. En App Workbench > Rules, haz clic en + Rule.

  2. Cuando aparezca la pantalla de creación de reglas:

    1. En el campo Name, ingresa Supplier (Countries for Supplier and Customer).

    2. En el campo Purpose, selecciona Business Object.

    3. Asegúrate de que Supplier esté seleccionado en el campo Target.

    4. Haz clic en Create.

  3. App Builder creará la regla. Por defecto, añade la tabla objetivo y selecciona su clave primaria. Sin embargo, en esta regla solo nos interesan los países presentes en las tablas, así que desmarca la clave primaria, SupplierID, y selecciona la columna Country.

  4. Necesitamos agregar la otra tabla que contiene información sobre los países, así que haz clic en + Tables.

  5. Busca la tabla Customer y haz clic en Add. App Builder añadirá la tabla Customer y podrás verla en la pestaña Tables junto a Supplier.

  6. Ve a la pestaña Joins.

  7. App Builder ha creado un join, pero ajústalo para que sea del tipo que deseas. Asegúrate de que Supplier esté seleccionado en el campo Left y que el campo Type diga Union.

  8. Algunos países aparecen más de una vez. Para evitar resultados repetidos, ve al panel Rule y haz clic en More > Edge Case. En el cuadro de diálogo Edge Case Settings, marca la casilla Select Distinct.

  9. Haz clic en la pestaña SQL si deseas ver la sintaxis de tu unión:

    SQL union syntax

  10. Para ver tus resultados, haz clic en el botón Results en el panel Rule.

Reglas CRUD

Introdujimos las reglas CRUD en Lección 7, pero ahora echemos un vistazo más de cerca a ellas.

El acrónimo CRUD significa "Crear, Leer, Actualizar, Eliminar". Esto significa que las reglas CRUD son lo que los desarrolladores de App Builder utilizan para insertar, recuperar, alterar o borrar registros de las tablas presentes en la fuente de datos.

Capa objetivo: negocio vs. datos

Cuando creas una regla CRUD, debes seleccionar una capa objetivo: ya sea la capa de negocio o la capa de datos. Esta elección es crítica y tiene implicaciones significativas.

Dirigirse a la capa de negocio es el enfoque recomendado para la mayoría de las operaciones. Cuando tu regla CRUD se dirige a la capa de negocio (por ejemplo, el objeto de negocio Order (Source)), actúa como un usuario interactuando con la aplicación. Dispara todos los eventos intrínsecos (Guardar, Actualizar, etc.) asociados con ese objeto de negocio. Esto significa que todas tus reglas de validación configuradas, acciones personalizadas y seguimiento de auditoría ligera se ejecutarán automáticamente. Este enfoque asegura la integridad y consistencia de los datos con la lógica de tu aplicación. También te permite utilizar controladores de éxito y fracaso para el evento.

Dirigirse a la capa de datos omite toda la lógica de negocio. Cuando te diriges a la capa de datos (por ejemplo, la tabla Order), tu regla interactúa directamente con la base de datos. No disparará ningún evento intrínseco, validaciones o seguimiento de auditoría configurados en el objeto de negocio. Este es un enfoque de "puerta trasera", útil para operaciones masivas de alto rendimiento donde deseas intencionalmente omitir la lógica de negocio.

Puedes ver esta diferencia visualmente en el flujo de trabajo visual; una regla que apunte a la capa de negocio mostrará subprocessos para su lógica de eventos, mientras que una que apunte a la capa de datos no lo hará.

Nota

App Builder también admite reglas XP CRUD, que son reglas especializadas para escribir datos entre dos fuentes de datos diferentes. Estas reglas siempre se ejecutan a través de la capa de negocio para garantizar que se aplique toda la lógica. Consulta CRUD (regla) para más información.

Actualización CRUD

Primero, veamos cómo crear una regla de actualización CRUD. Esto significa modificar registros existentes en una tabla. Para demostrarlo, vamos a crear una regla que aumente todas las cantidades de los productos pedidos.

  1. En App Workbench > Rules, haz clic en + Rule.

  2. En el campo Name, ingresa OrderDetail (Quantity + 1).

  3. En el campo Purpose, selecciona CRUD.

  4. En el campo Action, selecciona Update.

  5. En Target Layer, selecciona Data Layer. (Para esta simple actualización masiva, evitaremos la lógica de negocio).

  6. En el campo Target, selecciona OrderDetail.

  7. Haz clic en Create. App Builder tardará unos segundos en crear la regla.

  8. En la pestaña Tables, aparecerá la tabla OrderDetail, con su clave primaria, OrderDetailID, seleccionada. Selecciona también la columna Quantity marcando su casilla.

  9. Agregaremos una nueva columna con un alias para ayudarnos a visualizar que la regla está funcionando. Ve a la pestaña Columns y haz clic en + Column. Cuando se abra el diálogo Column - Add Column, ingresa la siguiente información:

    1. En el campo Column or Expression, ingresa OD.Quantity + 1.

    2. En el campo Alias, ingresa un nombre legible. Usaremos QuantityPlus.

    3. En el campo Target, selecciona Quantity. Esto le indica a App Builder que escriba el resultado de esta expresión en la columna Quantity.

    4. Haz clic en Save.

  10. En la pestaña Columns, ahora verás tanto Quantity como QuantityPlus. La columna original OD.Quantity también estará dirigida a Quantity por defecto. Debemos desmarcarla para evitar ambigüedades:

    1. Encuentra la fila OD.Quantity en la lista de Columnas.

    2. Haz clic en su menú desplegable Target. Aparece un botón X junto a él. Haz clic en él para desasignar la columna.

      Esto asegura que solo se use nuestra expresión QuantityPlus para actualizar la columna Quantity. Si ambas estuvieran asignadas, la que tenga el índice más alto "ganaría", lo que llevaría a un comportamiento impredecible.

  11. La regla está lista. En el panel Rule, haz clic en el panel Results para ver cómo funciona. Observa que la columna adicional que has agregado incrementa todas las cantidades en uno:

    OrderDetail results

Tiempo de práctica: Crea una regla de actualización CRUD

Piensa en cómo crearías una regla de actualización CRUD similar a la que hemos creado arriba, pero con el efecto opuesto, es decir, una regla que modifique todas las entradas en la columna Quantity de la tabla OrderDetail restando uno.

CRUD eliminar

Las reglas de eliminación CRUD se utilizan para borrar registros de las tablas. Sin embargo, dado que es fácil usar elementos de la interfaz de usuario para eliminar registros individuales, las reglas de eliminación CRUD generalmente solo se utilizan para eliminar muchos registros a la vez. Para demostrarlo, vamos a crear una regla de eliminación CRUD que elimine todos los detalles del pedido asociados con un pedido individual, con el fin de eliminar la necesidad de eliminar todos los detalles del pedido por separado cuando se cancela un pedido.

  1. En App Workbench > Rules, haz clic en + Rule.

  2. En el campo Name, ingresa OrderDetail (Eliminar OrderDetail para Pedido).

  3. En el campo Purpose, selecciona CRUD.

  4. En el campo Action, selecciona Delete.

  5. En Target Layer, selecciona Data Layer.

  6. En el campo Target, selecciona OrderDetail.

  7. Haz clic en Create.

  8. En la pestaña Tables, App Builder ha agregado la tabla OrderDetail y ha seleccionado su clave primaria, OrderDetailID. Mantén esta selección, ya que apuntar a la clave primaria es la forma más eficiente y segura de realizar una operación de eliminación. Selecciona también la columna OrderID; utilizaremos esta columna en la siguiente sección para vincular la regla a un pedido específico.

Adjuntar reglas CRUD a eventos

Las reglas CRUD solo se pueden utilizar en la capa de aplicación cuando están adjuntas a eventos, que son procesos integrados en tablas u objetos de negocio que se ejecutan en respuesta a ciertas acciones, como guardar un registro. Todas las tablas y objetos de negocio tienen intrínsecamente cuatro eventos: guardar, actualizar, eliminar e insertar, que se ejecutan a medida que alteras registros en App Builder.

Activemos las reglas CRUD que creamos, ya sea añadiéndolas a un evento intrínseco o creando nuestros propios eventos personalizados. A diferencia de los eventos intrínsecos, los eventos personalizados deben estar adjuntos a un control en la capa de aplicación para ser ejecutados. Las reglas CRUD que estamos creando requerirán eventos personalizados para ejecutarse cuando lo deseemos.

Primero, creemos un evento personalizado para asociarlo con nuestra regla de eliminación CRUD, de modo que cuando se elimine un pedido, los detalles del pedido relacionado también se eliminen.

  1. En App Workbench > Rules, localiza y selecciona la tabla Order (Source).

  2. En el panel Rule, haz clic en Events. Se abre el diálogo All Events (Order (Source)).

  3. Debido a que estamos creando un evento personalizado, haz clic en + Rule Event. Se abre la página Event, donde puedes agregar los detalles del nuevo evento:

    1. En Event Information, en el campo Name, ingresa Delete Order Details.

    2. En Messages, en el campo Confirmation, ingresa un mensaje que se mostrará a los usuarios antes de la ejecución del evento. El mensaje debe ser informativo, indicando claramente qué sucederá si el usuario continúa. Aquí hay un ejemplo:

      Mensaje de confirmación

    3. Deja los otros campos con sus selecciones predeterminadas y haz clic en Save. App Builder creará el evento.

      Nota

      Consulta Event detail options para una descripción completa de todos los campos.

  4. El evento ha sido creado, y App Builder te muestra su pantalla de configuración:

    Pantalla de configuración de detalles de pedido a eliminar

    Nota que aún no tiene ninguna regla adjunta. Las reglas CRUD, como las que estamos utilizando, se adjuntan a eventos en el panel de Acciones. Haz clic en el botón Registrar allí. Se abrirá el diálogo de Acción:

    1. En el campo Tipo, selecciona Regla.

    2. En el campo Regla, selecciona OrderDetail (Eliminar OrderDetail para Pedido), la regla de eliminación CRUD que hemos creado previamente.

    3. Puedes dejar los otros campos con sus selecciones predeterminadas. Haz clic en Guardar. El diálogo para la acción mostrará más detalles:

      Acción de eliminar OrderDetails

    4. En el panel de Vinculaciones, haz clic en + Vinculación. Selecciona OrderID como la Columna de Origen y OrderID como la Columna de Regla.

      Nota

      Este paso de vinculación es crítico, ya que filtra los resultados de tu regla por el registro del panel contra el cual has ejecutado el evento. Si se deja "sin vincular", la regla de eliminación afectaría a todos los registros en la tabla OrderDetail. Al vincular la Columna de Origen (OrderID del registro del panel Pedido (Origen)) a la Columna de Regla (OrderID en nuestra regla de eliminación), añadimos un filtro implícito (por ejemplo, WHERE OrderID = 10248).

      Esto asegura que solo se eliminen los registros de OrderDetail que coincidan con ese OrderID específico. Si se omitiera esta vinculación, activar el evento eliminaría todos los registros de la tabla OrderDetail.

    5. Haz clic en Guardar.

  5. El evento personalizado ahora está listo para ser implementado.

Lectura adicional

Además de lo que se muestra en este ejemplo, la configuración de eventos en App Builder también puede incluir lo siguiente:

  • Dónde se configuran los eventos: Los eventos se pueden configurar en la capa de negocio (objetos de negocio) o en la capa de datos (tablas). Registrar eventos en la capa de negocio permite una lógica distinta por interfaz, mientras que los eventos de la capa de datos son globales. Lee más en Dónde se configuran los eventos.

  • Herencia de eventos: Los objetos de negocio pueden heredar la lógica de eventos de la tabla subyacente u otras fuentes. Lee más en Herencia de eventos.

Tiempo de práctica: Crear CRUDs y eventos personalizados

  • Crea un evento titulado Cantidad + 1 en el objeto de negocio OrderDetail (Fuente) y agrega el CRUD OrderDetail (Cantidad + 1) como una acción.

  • Crea otro evento en la misma ubicación que el ejercicio anterior, pero utiliza la regla CRUD Cantidad - 1.

Una vez que hayas creado estos eventos personalizados y los hayas asociado con reglas CRUD, estarás listo para implementarlos en la aplicación.

Disparar eventos

Hemos adjuntado las reglas CRUD que creamos a eventos personalizados. Por lo tanto, para agregarlos a nuestra aplicación, necesitamos usar un control que dispare, o active, el evento. En contraste, cuando una regla está asociada con uno de los eventos intrínsecos (guardar, insertar, actualizar o eliminar), no necesitamos hacerlo.

Hay varios tipos de control disponibles, pero utilizaremos controles de botón para activar nuestros eventos personalizados. Para comenzar, agreguemos la regla Order Detail (Eliminar OrderDetail de Order) a un botón en el panel Order de la página Order.

  1. En la página de inicio de App Workbench, haz clic en el botón para ejecutar tu aplicación en su estado actual. App Builder la abrirá en una nueva pestaña.

  2. En la vista previa de la aplicación, navega a la página Orders.

  3. Haz clic en el ícono de hamburguesa para abrir el panel de acciones, luego selecciona Live Designer.

  4. Haz clic en el panel Orders. Eso hará que el diseñador en vivo muestre opciones de edición para él.

  5. En la pestaña Orders - Panel, haz clic en + Control. Se abre el diálogo Agregar un Control:

    1. Omite el campo Columna porque no estamos agregando datos al panel. En el campo Tipo de Control, selecciona Botón.

    2. En el campo Nombre, ingresa Eliminar Detalles de Pedido.

    3. En el campo Control Subtipo, selecciona Primario.

    4. Haz clic en Siguiente. El cuadro de diálogo Agregar un Control avanzará al siguiente paso, Navegación.

    5. En el campo Ejecutar un Evento, selecciona Eliminar Detalles del Pedido, el evento personalizado que hemos creado.

    6. En el campo Acción Después del Evento, selecciona Permanecer.

    7. Haz clic en Siguiente.

    8. Confirma que los detalles son correctos y haz clic en Finalizar.

  6. App Builder añadirá el botón a las filas en el panel de Pedidos. Sal del diseñador en vivo y asegúrate de que puedes ver un botón que dice Eliminar Detalles del Pedido para cada fila en el panel.

    Panel de pedidos con botón Eliminar Detalles

  7. Prueba el botón haciendo clic en él. Si has configurado todo correctamente, solo se eliminarán los detalles del pedido que seleccionaste.

Tiempo de práctica: CRUDs y eventos

Aún en la página de Pedidos, añade dos botones al panel de Detalles del Pedido. Uno de ellos debe activar el evento personalizado Cantidad + 1, y el otro debe activar el evento Cantidad - 1 que hemos creado anteriormente.

Reglas de subconsulta

Las reglas de subconsulta son intermediarios entre una tabla y sus reglas. Las reglas de subconsulta se utilizan para calcular o ajustar los datos, y pasar esa nueva información al objeto en el que se coloca.

Demostraremos haciendo una regla de subconsulta. Se utilizará para encontrar el Número de Pedido máximo de la tabla Pedido, y luego se le sumará uno. Más adelante crearemos una regla CRUD con el propósito de copiar un pedido, y dependerá de esta subconsulta para funcionar.

  1. En App Workbench > Reglas, haz clic en + Regla.

  2. En el campo Nombre, ingresa Pedido (Número de Pedido + 1).

  3. En el campo Propósito, selecciona Subconsulta.

  4. En el campo Objetivo, selecciona Pedido.

  5. Haz clic en Crear. App Builder creará la nueva regla.

  6. App Builder seleccionará automáticamente la clave primaria de la tabla Pedido, pero no la necesitaremos para esta regla. Deselecciónala en la pestaña Tablas.

    ¿Por qué deseleccionar OrderID?

    Al utilizar una función de agregado como la que haremos aquí, agregar cualquier otra columna a la consulta (como OrderID) hará que la base de datos aplique una cláusula GROUP BY para esa columna.

    Si incluyéramos OrderID, la expresión encontraría el máximo OrderNumber por OrderID. Esto solo devolvería el OrderNumber para cada pedido, lo cual no es lo que queremos.

    Para encontrar el único máximo OrderNumber en toda la tabla, no debemos incluir ninguna otra columna en nuestra consulta. Por eso utilizamos una subconsulta: para realizar este cálculo agregado primero y poder usarlo en otra regla.

  7. En la pestaña Columnas, haz clic en + Columna. Se abrirá el cuadro de diálogo Columna - Agregar Columna.

  8. En el campo Columna o Expresión, ingresa la expresión Max(O.OrderNumber) + 1. La sintaxis Max() invoca la función Max, que encuentra el valor más grande en la columna O.OrderNumber. Luego, se le suma uno.

  9. En el campo Alias y Objetivo, ingresa un alias apropiado para esta columna, como MaxOrderNumber.

  10. En el campo Tipo de Dato Lógico, selecciona Número, ya que OrderNumber no es un valor UUID, sino un número natural.

  11. Haz clic en Guardar.

  12. Verifica que la regla esté funcionando correctamente haciendo clic en el botón Resultados. Debería haber solo una fila con un número de pedido, que debería ser un número mayor que el mayor número de pedido actualmente presente en la tabla Order.

Ahora, vamos a crear una regla CRUD capaz de copiar un pedido. Esta regla CRUD dependerá de la regla de subconsulta que acabamos de crear para funcionar.

  1. En App Workbench > Reglas, haz clic en + Regla.

  2. En el campo Nombre, ingresa Pedido (Copiar Pedido).

  3. En el campo Propósito, selecciona CRUD.

  4. En el campo Acción, selecciona Insertar.

  5. En el campo Capa de Objetivo, selecciona Capa de Datos.

  6. En el campo Objetivo, selecciona Pedido.

  7. Haz clic en Crear. App Builder creará la regla.

Una vez que la regla esté creada, necesitas configurar sus detalles.

  1. En la pestaña Tablas, App Builder ha agregado automáticamente la tabla Orden, pero necesitaremos más. Haz clic en + Tablas.

  2. Selecciona la regla de subconsulta que hemos creado para este propósito, Orden (NúmeroDeOrden + 1). Haz clic en Agregar.

  3. Ahora seleccionemos las columnas que necesitaremos:

    1. Desde la tabla Orden, selecciona todas las columnas excepto las columnas creadas para auditoría ligera. Estamos incluyendo IDCliente, IDEmpleado y IDTransportista para hacer que la orden copiada sea más completa.

    2. Desde la regla de subconsulta Orden (NúmeroDeOrden + 1), selecciona su única columna, NúmeroMáximoDeOrden.

  4. En la pestaña Columnas, debemos configurar los objetivos de la regla. El objetivo de una regla define qué columna en la tabla base recibirá el valor de la expresión de origen.

    1. Encuentra la fila OON.NúmeroMáximoDeOrden y, en el menú desplegable Objetivo, selecciona NúmeroDeOrden. Esto asigna nuestro nuevo número incrementado a la columna correcta.

    2. Encuentra la fila IDOrden. Asegúrate de que su menú desplegable Objetivo esté en Ninguno. Esto incluye IDOrden en la regla, permitiéndonos usarlo para vinculación, pero evita que la regla intente copiar el IDOrden original, lo que violaría la restricción de clave primaria.

    3. Verifica que todas las demás columnas (como IDCliente, FechaDeOrden, etc.) estén apuntando a sus columnas correspondientes.

    Lectura adicional

    Aprende más sobre este concepto en Objetivo en reglas de objeto de negocio.

  5. Haz clic en Resultados en el panel Regla para validar que la regla esté funcionando correctamente.

Ahora hemos creado la regla que copia órdenes existentes. Vamos a adjuntarla a un evento personalizado.

  1. En App Workbench > Reglas, localiza y selecciona la tabla Orden (Fuente).

  2. En el panel Regla, haz clic en Eventos. Se abre el diálogo Todos los Eventos (Orden (Fuente)).

  3. Haz clic en + Evento de Regla. Se abre la página Evento, donde puedes agregar los detalles del nuevo evento:

    1. En Información del Evento, en el campo Nombre, ingresa Copiar Orden.

    2. En Mensajes, en el campo Confirmación, ingresa el mensaje de confirmación que se mostrará a los usuarios antes de la ejecución del evento.

    3. Deja los otros campos con sus selecciones predeterminadas y haz clic en Guardar.

    Lectura adicional

    Lee sobre los otros campos en Opciones de detalle del evento.

  4. El evento ha sido creado. En el panel de Acciones, haz clic en Registrar para agregar nuestra nueva regla. Se abre el diálogo de Acción:

    1. En el campo Tipo, selecciona Regla.

    2. En el campo Regla, selecciona Orden (Copiar Orden).

    3. En el panel de Vinculaciones, haz clic en + Vinculación y selecciona OrderID como la Columna de Origen y OrderID como la Columna de Regla. Usar OrderID (una clave primaria) para la vinculación es más confiable que usar OrderNumber, que puede no ser único.

  5. Ahora que la nueva regla está configurada y adjunta a un evento, agrega un botón al panel de Órdenes en la página de Órdenes que la active. Repite los pasos que seguimos en la sección Activar eventos, pero esta vez agrega la nueva regla Orden (Copiar Orden).

  6. Finalmente, verifica que tu nuevo botón funcione como se espera visitando la vista previa de la página de Órdenes y haciéndole clic.

Validaciones

Las reglas de validación se utilizan para asegurar que los datos ingresados en App Builder sean válidos antes de que se guarden. En Lección 7, cubrimos una validación simple de "campo requerido". Ahora, exploraremos un escenario de validación más complejo, que incluye lógica personalizada y mensajes de error dinámicos.

Al igual que otras reglas, las reglas de validación deben estar adjuntas a un evento para ser utilizadas. La elección del evento depende del caso de uso:

  • Evento intrínseco: Usa esto cuando quieras que la validación se ejecute automáticamente durante operaciones estándar (por ejemplo, prevenir un guardado si los datos son inválidos).

  • Evento personalizado: Usa esto cuando quieras activar la validación a demanda desde un control específico (por ejemplo, un clic en un botón).

Vamos a crear una regla de validación para asegurar que un descuento en un pedido nunca sea mayor al 10%. Queremos que esto se ejecute cada vez que se guarde un registro de OrderDetail, por lo que lo adjuntaremos al evento de guardado intrínseco.

  1. En App Workbench > Rules, haz clic en + Rule.

  2. En el campo Name, ingresa OrderDetail (Validate Discount).

  3. En el campo Purpose, selecciona Validation.

  4. En el campo Target, selecciona OrderDetail.

  5. Haz clic en Create.

  6. En la pestaña Tables, selecciona la columna Discount (puedes deseleccionar OrderDetailID).

  7. En la pestaña Where, haz clic en + Where Clause. Se abre un diálogo donde puedes crear cláusulas WHERE:

    Where clause dialog

    1. En el campo Left Expression, ingresa OD.Discount.

    2. En el campo Operator, selecciona >.

    3. En el campo Right Expression, ingresa 0.1.

  8. Haz clic en Save.

La regla ahora está creada. Está diseñada para encontrar datos "malos" (registros donde el descuento es superior al 10%).

Adjunte la regla de validación

Ahora, vamos a adjuntar nuestra regla de validación al evento de guardado intrínseco para OrderDetail.

  1. En App Workbench > Rules, busca el objeto de negocio OrderDetail (Source) y ábrelo.

  2. En el panel Rule, haz clic en Events. Se abre el diálogo All Events (OrderDetail (Source)).

  3. Busca el evento de guardado y haz clic en Rule Event Detail.

  4. En el panel Validations, haz clic en Register. Se abre el diálogo Validation:

    Validation dialog

  5. En el campo Type, selecciona Rule.

  6. En el campo Rule, selecciona OrderDetail (Validate Discount), la regla de validación que acabamos de crear.

  7. En el campo Binding, selecciona Implicit.

    Nota

    Implicit binding valida contra los datos que actualmente están "en memoria" en la pantalla del usuario. Este es el valor que el usuario ha escrito, antes de que se haya guardado en la base de datos. Usamos el enlace implícito aquí porque queremos evitar que el usuario guarde un nuevo registro mientras el valor de Discount es inválido (es decir, mayor al 10%). Por otro lado, Explicit binding valida contra los datos que ya están guardados en la base de datos.

    Para ilustrar, imagina que se guardó un registro con un descuento inválido del 50%. Un usuario abre ese registro, corrige el campo Descuento a un valor válido como el 7%, y lo envía. Si el evento de validación utiliza enlace explícito, verificará la base de datos, verá el valor original del 50% y fallará la validación. Sin embargo, si el evento de validación utiliza enlace implícito, verificará el valor en memoria (7%), verá que no es mayor al 10% y pasará la validación, permitiendo el guardado.

    Lee más en Enlace implícito y explícito.

  8. En el campo Fallo, selecciona Fallar en datos devueltos.

    Nota

    Las validaciones del App Builder se pueden configurar de dos maneras. La predeterminada, que estamos utilizando, es Fallar en datos devueltos. Esto significa que la regla de validación está escrita para encontrar los datos incorrectos (por ejemplo, Descuento es mayor al 10%). Si la regla encuentra algún registro que coincida con este criterio "malo", falla y muestra el mensaje de error. La alternativa es Fallar en ningún dato devuelto, que se utiliza cuando se escribe una regla para encontrar datos buenos.

  9. En el campo Mensaje, ingresa un mensaje descriptivo, pero simple, algo como: El descuento no puede ser mayor al 10%. Este campo no puede quedar vacío.

  10. Haz clic en Guardar para salir del diálogo.

La validación está adjunta. Para probarla, ve a la vista previa de la página Órdenes, selecciona un pedido e intenta editar un ítem de Detalle de Pedido para que tenga un descuento mayor al 10%. Cuando hagas clic en guardar, deberías ver el mensaje de error que escribiste.

Tiempo de práctica: Sustitución dinámica en mensajes de validación

En lugar de limitar el descuento que los usuarios pueden aplicar directamente a través de una regla como la que acabamos de hacer, también podemos hacer que el límite de descuento sea un valor que los usuarios puedan modificar. La forma en que podemos hacer esto es agregándolo como un parámetro a nivel de aplicación y almacenándolo en la tabla Parámetro.

  1. En App Workbench > Páginas, navega a la página Parámetro, que fue creada en Lección 4.

  2. En la pestaña Panel, encuentra el campo Fuente del Panel y haz clic en el ícono de tabla. Esto te llevará a la pantalla de edición de la tabla Parámetro.

  3. En la pestaña Columnas, agrega una nueva columna haciendo clic en + Columna.

  4. Asigna el nombre DiscountMaximum.

  5. En el campo Lógico, selecciona Número.

  6. En el campo Físico, selecciona Decimal.

  7. Haz clic en Guardar.

  8. Ahora, agreguemos la nueva columna al objeto de negocio que se basa en la pestaña Parámetro. Puedes encontrarlo en App Workbench > Reglas o regresando a la pantalla anterior y luego haciendo clic en el ícono de lógica de negocio junto al campo Fuente del Panel.

  9. Una vez que estés en la pantalla de edición de la regla Parámetro (Fuente), ve a la pestaña Tablas y encuentra la nueva columna DiscountMaximum en la lista de columnas de la tabla Parámetro. Haz clic en la marca de verificación para seleccionarla.

  10. Ahora regresa a la página Parámetro, ya sea encontrándola en App Workbench > Páginas o regresando a la pantalla anterior. Agrega la nueva columna DiscountMaximum a la lista de controles en el panel Parámetro.

  11. Ahora, en la vista previa de la página Parámetro, utiliza el botón Editar para elegir cualquier descuento máximo que desees. Por ejemplo, ingresa .3 para permitir descuentos de hasta el 30%.

Lectura adicional

Para más técnicas sobre cómo asegurar la integridad de los datos, consulta Consejos de validación.

Edita la regla de validación para usar el nuevo valor del parámetro

A pesar de que queremos permitir que nuestros usuarios determinen el descuento máximo, la regla de validación que creamos antes utiliza un descuento máximo fijo y codificado, por lo que aún no tolerará descuentos mayores al 10%. Vamos a editarla para usar cualquier valor que ingresamos en la página Parámetro. Sigue estos pasos:

  1. Ve a App Workbench > Reglas y abre la regla OrderDetail (Validación de Descuento).

  2. En la pestaña Tablas, haz clic en + Tablas.

  3. Haz clic en Agregar para la tabla Parámetro.

  4. Ahora que la tabla de Parámetros también se está mostrando en la pestaña de Tablas, selecciona la columna DiscountMaximum.

  5. Ve a la pestaña de Where. Necesitamos editar la cláusula WHERE que creamos porque ya no queremos usar un valor codificado aquí. Haz clic en el ícono de lápiz para editarlo.

  6. En el campo de Expresión Derecha, ingresa P.DiscountMaximum. App Builder tomará un momento para guardar.

  7. Ahora, vuelve a la vista previa de la página de Órdenes. Si intentas agregar un nuevo producto en el panel de Detalles del Pedido, verás que ahora se te permite dar descuentos de hasta el 30%.

Si intentas dar un descuento superior al 30% ahora, no se te permitirá. Sin embargo, el mensaje de error aún dice el límite anterior, 10%, porque también lo codificamos cuando creamos la regla de validación por primera vez. Para evitar tener que editar el mensaje cada vez que cambie el límite, vamos a usar sustitución dinámica para que el mensaje se actualice automáticamente junto con el límite.

  1. En App Workbench > Reglas, navega hasta la regla OrderDetail (Source).

  2. Esta regla actualmente solo extrae datos de la tabla OrderDetail, así que en la pestaña de Tablas, haz clic en + Tabla y selecciona la tabla Parámetro. Cuando aparezca, selecciona la columna DiscountMaximum.

  3. Ahora la regla tiene acceso al último descuento máximo y podrá "ver" cuándo cambia. Es una buena práctica darle un Alias que usaremos para referirnos a él en el mensaje, así que ingresa MaxDiscount en ese campo. Para asegurarte de que el número se muestre correctamente en la interfaz de usuario, ve a la pestaña de Columnas y conviértelo en Porcentaje.

  4. A continuación, navega de regreso al mensaje de error que escribimos anteriormente dirigiéndote al panel de Regla y haciendo clic en Eventos. Cuando se abra el diálogo, encuentra la fila de Guardar y haz clic en Detalle del Evento de Regla. La validación que implementamos se muestra en el panel de Validaciones. Haz clic para editarlo.

  5. Finalmente, en el campo de Mensaje, reemplaza el 10% codificado con {{ MaxDiscount }}. Rodear el alias con llaves dobles hará que App Builder aplique la sustitución dinámica para mostrar el descuento máximo actual en lugar de un valor fijo e inmutable.

Aprendizaje adicional

Esto concluye esta inmersión profunda en los detalles de la capa de negocio de App Builder. Consulta el Apéndice A para un vistazo más cercano a la capa de datos, o el Apéndice C para la capa de interfaz de usuario.