Mejoras y bugs en MyAcolite

qt-logoDespués de un poco de trasteo por mi parte, he conseguido convertir con éxito las librerías de BReport en librerías dinámicas. Además, he modificado BReport para incluir un elideText (si tienes una cadena de caracteres por encima de un límite, elimina el resto y pone tres puntitos). Es bastante útil a la hora de trabajar con textos de tamaño no definido.

He creado también una nueva librería dinámica para guardar las factorías y reportes del programa, y en un futuro quiero convertir también las librerías estáticas que hay ahora mismo en librerías dinámicas, al menos las que pueden generar más cambios. No es por una cuestión estética ni porque haya aprendido a hacerlo (aunque sí, ¡por fin lo he conseguido!), sino porque puede mejorar bastante los tiempos de compilación del programa. Sigue leyendo

Anuncios

Últimos días en Granada

Dentro de dos días estaremos ya en… no sé si llamarlo pueblo, sierra o chalet. Dejémoslo simplemente en la residencia de verano, que suena más fino aunque en realidad es un chalet. Estos días voy a estar dando viajes con maletas y limpiando muebles, para luego meterme a fondo con la piscina. ¡Y echando cuentas, eso significará que hace casi un año que empece con el blog! Cuanto tiempo…

Volviendo a temas más interesantes, ICS ha publicado una serie de aplicaciones de ejemplo que hacen uso de Qt y las APIs de Google, algo que me resulta muy interesante de cara al futuro (poder subir y descargar copias de seguridad en CSV de las bases de datos, es una primera posibilidad). Además, echándole un ojo al código de una de ellas he descubierto una librería muy interesante, también de Qt, para poder parsear y devolver objetos JSON. ¡Aleluya! Tengo ganas de echarle un buen vistazo y empezar a trastear con ella, pero lo primero es lo primero: terminar en condiciones la aplicación para las jornadas.

Eso sí, he visto un uso que no se me había ocurrido de QVariant, y una clase aún más interesante para enviar los datos necesarios a, por ejemplo, mi librería de generación de reportes BReport: QVariantMap. Básicamente, un diccionario que puede incluir un montón de datos interesantes. ¡Una muy buena forma de plantear una ficha de actividades o un formulario de asistente!

Menos mal :D

Al final, el diseño ha sido más flexible de lo que me temí en un principio. Hace tiempo que no revisaba los diferentes scripts para la base de datos, y afortunadamente fui previsor e incluí una buena cantidad de procedimientos almacenados para casi todo lo que se me ocurrió… ¡al menos, concerniente a los asistentes y grupos!

Con un par de triggers nuevos concernientes a la tabla de grupos, la cosa funciona bastante bien; es más, he podido añadir la operación de DELETE al modelo de asistentes de forma consistente gracias a los procedimientos que ya había descrito. ¡Y parece bastante consistente! Al menos, a primera vista: todavía no he podido hacer las pruebas de estrés con dos o más ordenadores atacando la misma base de datos. De cualquier modo, no creo que durante las jornadas se vayan a eliminar asistentes… eso ocurrirá durante la fase previa, cuando se van a ir introduciendo en el sistema los datos.

Ahora, sólo queda por añadir las opciones de cambio de grupo (aislar a un asistente de grupo, crear nuevos grupos, esas cosas…) y vigilar que sean consistentes con las habitaciones.

De vuelta al tablero de dibujo…

Sé que no debería de hacer las cosas así, que tendría que tener un diseño de la base de datos desde el primer momento, antes incluso de ponerme a picar código… pero siempre hay distracciones y detalles que se te escapan.

He vuelto a la base de datos y estoy de nuevo trabajando con los triggers para poder controlar tanto las reservas de habitaciones como la inserción de nuevos grupos. Como las habitaciones se asignan a los grupos y no a las personas, eso significa que cuando se crea un nuevo grupo hay que introducir un nuevo registro en la tabla que relaciona a los grupos con las habitaciones (por defecto, van a una habitación fantasma llamada ‘Sin asignar’, la cual en realidad no existe). Los procedimientos y triggers de la base de datos han de ser modificados en consonancia con este diseño, para que no queden cuelgues raros.

¡Y lo más divertido es que no estoy seguro de si desde un trigger de MySQL es posible llamar a un procedimiento almacenado! Recuerdo haber leído en alguna parte que los procedimientos anidados (procedimientos que llaman a otros procedimientos) no se permitían dentro de MySQL, pero… ¿a qué versión de MySQL se referían?

Un pequeño lío. Menos mal que el diseño es consistente y sólo hay que hacer cambios en unos pocos triggers y procedimientos…

Conversiones de AcoLITE a MyAcolito

Hoy he adaptado la clase ModeloEventos del AcoLITE a MyAcolito. Ha sido sorprendentemente facil.

Solo ha sido necesario comentar la clase interna que utilizaba para representar las entradas de eventos dentro del directorio de AcoLITE y añadir dos modelos de tablas para el acceso al listado de nombres y de fechas. El resto de modificaciones ha sido trivial.

Pero aun no canto victoria, ya que queda aun por adaptar el dialogo de eventos y el asistente para mostrar los nuevos eventos…

Bases de datos, Singleton y modelos de filtrado

En vista de que vienen de nuevo las jornadas, y que toca mas gente, he empezado con la conversion de AcoLITE a MyAcolito (soporte de archivo vs soporte MySQL).

He estado viendo el patron Singleton, y creo que lo voy a utilizar combinandolo con los modelos de filtrado y las bases de datos para aislar las conexiones de la interfaz principal. En principio, pense en utilizarlo unicamente con los modelos, pero luego vi mas logico emplear modelos privados dentro de las clases que modelan las conexiones a las distintas bases de datos (las cuales serian Singletons y Facade) y devolver modelos de filtrado sobre esos modelos privados. La ventaja que le veo a este enfoque es que las conexiones, al quedar ocultas, se controlan mejor (una única conexión con la base de datos, no doscientos millones una para cada tarea), y que puedo introducir cambios sustanciales dentro de los modelos principales sin que ello afecte realmente al resto del código (no tengo que preocuparme demasiado de los demás widgets porque trabajan sobre modelos de filtrado, de tipo QSortFilterProxyModel).

Sigue leyendo

Nuevo proyecto: GameRO

Además del proyecto GEFE, y del Acolito, me han pedido también un programa de gestión para una biblioteca de juegos de mesa: registro de juegos, descripciones, fotos y, por supuesto, cesiones y préstamos. Utilizaré el mismo enfoque de los acolitos (de hecho, la clase principal del programa debería de ser uno de ellos), porque en muchos eventos existen bibliotecas de juegos a disposición de los asistentes, aunque el funcionamiento en estos casos es ligeramente diferente…