Carga de cuentas de un ejercicio
Tenemos un pequeño problema para la carga de las cuentas contables de un ejercicio concreto, sobre todo al cargar las auxiliares (ya que hay más y el rendimiento debe ser mejor). Os cuento primero cómo cargamos (identificamos) las cuentas de un ejercicio, y a continuación la problemática que veo y la que creo que es mejor solución.
En la nueva contabilidad, como en la misma base de datos mantenemos distintos ejercicios, puede haber cuentas de este ejercicio y otras que, o bien estén ya de baja, o pertenezcan a ejercicios futuros. Antes que nada, ¿qué entendemos por ejercicio actual? Hemos llegado al consenso de que no existirá un ejercicio actual global, pero sí lo habrá en cada contexto: mientras creamos un asiento, por su fecha obtendremos un ejercicio; al visualizar el plan contable, habrá que indicar (o al menos poder cambiar) qué ejercicio queremos ver.
Pues bien, toda cuenta (mayor o auxiliar) tendrá un ejercicio de alta y otro de baja (este último opcional). Al solicitar las cuentas de un ejercicio, deberán mostrarse las que estén de alta en ese ejercicio, lo cual no es un criterio cómodo, no por su complejidad sino porque requiere más datos.
En SQL requiere el enlace de ambos campos con la tabla de ejercicio, por lo que la SQL implicará ya 3 tablas (cuentas + 2 x ejercicios). Esto se debe a que los ejercicios de alta y baja no serán un año ni una fecha, sino el propio ejercicio (su Id en la base de datos), para permitir así contar con ejercicios que abarquen un periodo distinto al año natural (como una temporada deportiva, un año escolar...)
En principio, para cada cuenta se cargarán 2 ejercicios adicionales. Aunque en la Dal aprovechemos la caché de entidades, y estos ejercicios no deban volver a instanciarse, sus datos sí vendrán en la consulta, y el motor de base de datos se habrá preocupado de enviarlos tras comprobar el criterio para el que son necesarios.
Así pues, se me ocurre otra forma de afrontar este problema que creo que tendrá ciertas ventajas, aunque lo dejo a debate abierto. Pienso en no incluir el filtro de altas y baja en la colección, de forma que al componer la SQL no se incluya, por lo que tampoco se necesitarán las 2 tablas de ejercicios (salvo que se hagan visibles como columnas alguna de esas 2 propiedades, lo que no será por defecto). La comprobación de las cuentas de alta en un ejercicio se haría en memoria, con poco esfuerzo ya que EEjercicio es una entidad ideal para ser cacheada, por lo que no tendría que buscar nuevos datos más que en memoria. Sólo tendríamos que eliminar ciertas instancias de la colección (aquellas que comprobemos que no están de alta). Una primera aproximación consiste en crear una colección temporal que carguemos y que recorriéndola compongamos una colección definitiva con las entidades que pasen el criterio. Pero se puede proponer otro enfoque más directo: interceptar el evento AddingNew de las colecciones, y cancelar las adiciones que no consideremos apropiadas.
Instintivamente me atrae más esta aproximación que la del filtro complejo, aunque tiene la contrapartida de que se envían como resultado de la consulta SQL más cuentas de las necesarias, para que luego sean descartadas. Esto sólo es admisible en casos como este, donde la probabilidad de una baja es escasa.
Por otro lado, la alternativa propuesta puede parecer muy cercana a los filtros en memoria. Efectivamente, sería aplicar el filtro de alta a la colección una vez cargada en memoria (no se tome esto literalmente, sería como en el AddingNew, para poder ir filtrando durante una carga asíncrona). La verdad es que me parecería interesante, pero no abordamos esta posibilidad en el diseño original, a diferencia de XPO que ofrece dos propiedades (ambas textuales): Filter (en memoria) y Criteria (en SQL). La idea es que se decidiera siempre dinámicamente dónde aplicar cada filtro. Para poder efectuar el filtro de alta en memoria, debería indicarse explícitamente al crear o añadir el filtro a la colección antes de efectuar la carga, y esto sí es un cambio más profundo que pensaremos para el futuro.
Etiquetas: Colecciones, Nibi.Negocio
