Agregar libros nuevos
Para poder agregar libros nuevos podemos usar la página Editing Page para rellenar los datos del libro y del autor. Esta página usa la fuente de página $EditBook, que selecciona y muestra la información de un libro: El ID del autor y el ID del libro se obtienen de la selección de la estructura $PERSISTENT. Ahora, si queremos usar esta subpágina como formulario para rellenar datos sobre un libro nuevo y mostrar una página con campos de entrada vacíos, no debemos seleccionar ningún registro de la BD, sino crear campos de entrada de datos vacíos. Para ello podemos configurar los IDs en la estructura $PERSISTENT como una cadena en la estructura $PERSISTENT como una cadena vacía, en ambos casos, antes de abrir la subpágina.
Sin embargo, debemos asegurarnos de que estamos usando IDs únicos para las claves primarias de los registros de autor y libro nuevos. Una forma de hacerlo es incrementar estos valores en uno con respecto al ID más alto de las tablas respectivas.
Los campos de texto y de imagen de la fuente de página $EditBook se pueden editar igual que cuando se modifican los valores. Al guardar $EditBook, los datos nuevos se guardan en un registro de autor y un registro de libro nuevos en las tablas Authors y Books, respectivamente. Los dos registros nuevos ahora tienen cada uno un ID único y también una clave foránea correcta en la tabla Books que les vincula con el autor correcto.
El mecanismo que explicamos más arriba se implementa con las acciones (i) del botón Agregar libros nuevos de la página Main Page y (ii) las acciones de AlCargarPágina de la página Editing Page. A continuación explicamos estos dos conjuntos de acciones:
Acciones de Agregar libros nuevos (Main Page)
Las acciones para ir a la subpágina Editing Page se definen en el botón Agregar libros nuevos (imagen siguiente).
Las acciones son las mismas que para las acciones para editar un libro, ya que se llama al grupo de acciones Edit Author. Sin embargo, tenga en cuenta que antes de llamar al grupo de acciones los datos de la estructura $PERSISTENT se reinicializan al cambiar Genre a All.
En la llamada al grupo de acciones Edit Author (imagen anterior) los parámetros $AuthorID y $BookID contienen una cadena vacía. En el grupo de acciones Edit Author los nodos EditAuthorID y EditBookID de la estructura $PERSISTENT se actualizan con estos valores (imagen siguiente). Esto es importante porque la fuente de página $EditBook de la subpágina Editing Page selecciona qué libro se muestra en función de los valores correspondientes de la estructura $PERSISTENT. Al ser estos valores cadenas vacías, no se selecciona ningún registro en la BD. En consecuencia, los nodos de la fuente de página $EditBook estarían vacíos, como lo estarán también los campos de entrada de la página.
Sin embargo, hay tres campos de BD que no pueden estar vacíos. Se trata de las claves primarias de los registros Authors y Books nuevos, así como la clave foránea del registro Books que lo relaciona con el registro Authors nuevo. Los valores de estas claves se indican como acciones en el evento AlCargarPágina de la subpágina, como se explica más abajo.
Acciones de AlCargarPágina (Editing Page)
Las acciones del evento AlCargarPágina hacen lo siguiente:
•Se aseguran que la fuente de página $EditBook tiene la estructura esperada de su elemento principal Authors, que incluye el elemento secundario Books. Esto se consigue con la función de extensión de XPath mt-get-page-source-structure (imagen siguiente).
•Averiguan el valor entero mayor de entre los ID de los autores. Actualizan tres nodos con este valor incrementado en 1: (i) $PERSISTENT/Root/EditAuthorID; (ii) el nodo que corresponde a la clave primaria de la tabla Authors (Row/@Author_ID); (iii) el nodo que corresponde a la clave foránea de la tabla Books(Row/Books/Row/@Author_ID).
•Averiguan el valor entero mayor de entre los ID de los libros. Actualizan dos nodos con este valor incrementado en 1: (i) $PERSISTENT/Root/EditBookID; (ii) el nodo que corresponde a la clave primaria de la tabla Books (Row/Books/Row/@Book_ID).
Nota: | los nodos Author_ID y Book_ID son las claves primarias de las tablas Authors y Books, respectivamente. Esto significa que cada ID debe ser única, por lo que el número que se a cada ID nuevo se incrementa en 1. Sin embargo, en muchas ocasiones este método no es el ideal, por lo que en la sección siguiente explicamos otro, el de las claves primarias con incremento automático. |
Tenga en cuenta que:
•La primera expresión IF comprueba si los nodos de ID de la estructura $PERSISTENT están vacíos. En este ejemplo los hemos configurado para estén en efecto vacíos cuando el usuario quiera añadir un registro nuevo (véase Acciones de Agregar un libro nuevo más arriba).
•La segunda expresión IF comprueba si se ha importado algún registro desde la BD. Como no habrá ninguno, se anexa la estructura de fuente de la página.
•La primera de las dos acciones Ejecutar (BD) (resaltada en azul) consulta la BD en busca del valor entero más alto de entre los ID de los autores y guarda el valor como un atributo llamado @pk en la variable dinámica $MT_DBExecute_Result. (Esta variable es una estructura XML; se puede serializar con la función XPath serialize si quiere ver su estructura)
•El primer conjunto de acciones Actualizar nodo(s) se usa para actualizar los nodos del ID del autor en la estructura $PERSISTENT y en la fuente de página $EditBook.
•La segunda de las acciones de Ejecutar en (BD) es parecida a la primera. Esta acción consulta la BD en busca del valor entero más alto de entre los ID de los libros y guarda el valor como un atributo llamado @pk en la variable dinámica $MT_DBExecute_Result.
•El segundo conjunto de las acciones Actualizar nodos se usa para actualizar los nodos de los ID de los libros de la estructura $PERSISTENT y de la fuente de página $EditBook.
Ahora los campos importantes del registro están rellenados con los ID únicos relevantes y aparece en la entrada de datos de la subpágina Editing Page. Los datos que se introducen se guardan en la fuente de página $EditBook. Al guardar la fuente de página, los datos nuevos se agregan a como registro Authors y registro Books a la BD, ambos relacionados uno con el otro por una clave foránea Books. Las acciones Guardar y Cancelar son las mismas que las que se usan al editar un registro.
Claves primarias con incremento automático
En el ejemplo de más arriba hemos calculado el valor de una clave primaria nueva de un registro; para ello: Buscamos el número entero mayor de entre los IDs de la tabla correspondiente, añadimos 1 a ese valor y asignamos el valor resultante como ID del registro nuevo.
No obstante, no queremos usar este método si, mientras un usuario añade un registro nuevo que todavía no ha guardado, otro usuario también empieza a añadir otro registro nuevo. En este caso los dos registros tendrían el mismo ID, por lo que no se cumpliría el requisito de que los ID sean únicos, y en consecuencia uno de los registros no se podría guardar en la BD.
Otra alternativa sería aplicar el incremento automático a los campos de clave primaria de la BD cada vez que se añade un registro nuevo. De esta forma no es necesario introducir un valor para la clave primaria ni asegurarse de que es único, ya que el número que la BD asigna automáticamente al registro nuevo ya es único.
Para que un campo de BD asigne un número con incremento automático tiene dos opciones:
•En la BD, defina el campo para que tenga incremento automático. Cuando guarde un registro nuevo de la solución en la BD, el campo de clave primaria recibe automáticamente un valor único.
•En el panel Fuentes de página del diseño, haga clic con el botón derecho en el campo de fuente de página al que quiere aplicar el incremento automático y seleccione Campo de BD | Incremento automático. Cuando guarde el registro en la BD se aplicará el incremento automático a ese campo.