Crear lista como si fuera LEFT OUTER JOIN o subconsulta


([N1] Spicer) #1

Amigos,

Tengo el siguiente problema:
Dos tablas con etiquetas y subetiquetas (Maestro-Submaestro) denominadas ETIQ_N1 y ETIQ_N2 que graban una estructura común de etiquetas y subetiquetas para clasificar a clientes de un CRM que estoy haciendo

Algunos clientes tienen datos en esas etiquetas, las que grabo en la tabla histórica CB_ETIQ_PERSONAS_DATOS, que contiene enlaces maestros a la tabla ETIQ_N1, ETIQ_N2, PERSONAS y un campo alfanumérico DATO para almacenar el valor del dato específico para el cliente cuya ficha está en pantalla.

Ahra bien, no todos los clientes tienen todos los datos completos: algunos tienen un solo dato, otros tienen todos los datos. Para obtener los datos de un cliente específico, hago una búsqueda en la tabla CB_ETIQ_PERSONAS_DATOS usando #ETIQ_N1, #ETIQ_N2 y #PERSONA como índices, con lo que tengo la lista de datos, si los hay.

Hasta aquí todo bien.

¿Cuál es el problema? Para una etiqueta de nivel 1 determinada, quiero mostrar, en una sola lista, todas las etiquetas de nivel 2 que están asociadas; las que tengan datos, mostrarlas.

Por ejemplo:
Etiqueta Nivel 1 = { Datos familiares }
Etiquetas Nivel 2 = { Nombre_Conyuge, Cantidad_Hijos, Lugar_Vacacional }

Algunos clientes tendrán la ficha completa, es decir, los tres datos ({ Nombre_Conyuge, Cantidad_Hijos, Lugar_Vacacional })
Otros tendrán algunos, y otros, ninguno.

Pero lo que necesito es que aún si el dato no está presente, se despliegue la ficha completa EN UNA SOLA LISTA y el operador del CRM vea de un vistazo cuáles son los campos posibles de llenar, cuáles están con datos, pueda leer esos datos, y los que están en blanco, preguntarselos a la persona.

Una vez hice esto con un puntero virtual desde la tabla submaestra a la tabla histórica y funcionaba, pero estaban todas las tablas en el mismo proyecto y ahora es distinto porque las tablas ETIQ están en un proyecto base y la de PERSONAS y CB_ETIQ_PERSONAS_DATOS en uno heredado.

Ahora… pongo lo de LEFT OUTER JOIN porque en el fondo, quiero TODOS los registros de ETIQ_N2, tengan datos o no, que se puede hacer con esa instrucción, o con una subconsulta.

Millones de gracias!


([N3] pacosatu) #2

Hola Spicer.

Como solución sencilla y a la vez más eficaz, sería añadir siempre en la tabla histórica todas las etiquetas y subetiquetas, tengan dato o no lo tengan. De esta forma las consultas son simplemente un Cargar lista usando 2 índices, uno para obtener solo las etiquetas con dato y otro para obtener todas las etiquetas. Que haya registros vacíos en la tabla histórica no es mayor problema, a no ser que tengas millones de clientes, y te simplifica enormemente las consultas.

Hacer un Left join en Velneo implicaría usar una tabla temporal donde añadirías primero las etiquetas con dato y después le añades las etiquetas con los datos vacíos. Esto complicaría las modificaciones y altas de valores de etiquetas.

Saludos
Paco Satué


([N1] Spicer) #3

Estimado Paco,

Gracias por la sugerencia. En realidad, ya lo había pensado, pero lo descarté porque la tabla PERSONAS va a tener como 1 millon de registros, y para cada persona puede haber 25 ó 30 etiquetas; si multiplicas, es un montón de datos vacíos. Y ese sistema debe funcionar rápido.

Además estoy usando la versión vServer Express, que tiene un límite de 256 Mb de datos.

Lo de las altas y modificaciones no me complica; prefiero darme el mango una vez con eso para tener algo que funcione rápido en producción

Si tienes alguna otra idea, bienvenida sea

Muuuuuuuuuuuuuuuuuchas gracias!


([N1] Spicer) #4

Bueno, finalmente lo solucioné:

  • Cambié la tabla EITQ_N2 para que fuera maestra (no submaestra como era antes)
  • Hice una tabla ETIQ_N2_EXT en el proyecto heredado que es maestra de extensión de ETIQ_N2
  • Creé en la tabla CB_PERSONAS_ETIQ_DATO un índice de clave única (denominado COORDENADA) que contiene ETIQ_N2, e ID_PERSONA
  • Creé en la tabla ETIQ_N2_EXT un puntero virtual a la tabla CB_PERSONAS_ETIQ_DATO, usando el índice COORDENADA recién creado
  • La resolución del índice del puntero virtual considera el uso de una variable global $ID_PERSONA que contiene el ID de la ficha de la persona en pantalla (no es lo óptimo pero qué remedio)
  • Finalmente, en la pantalla puse una grid de la tabla ETIQ_N2, y a través del enlace maestro y puntero virtual, despliego el nombre de la etiqueta y el valor, si existe; en caso que no, muestra puntos suspensivos (…) pero no es malo porque así se ve clarito que no hay datos.

Todo esto es un poco rebuscado, pero logro el objetivo propuesto y de paso, le saco el jugo a los famosos punteros

Ufff, que costó…!

Gracias Packo


([N3] pacosatu) #5

Hola Spicer.

Me alegro que hayas dado con la solución, aunque haz pruebas de carga en el cloud, sobre todo con ese puntero Virtual que debe resolverse en tiempo de ejecución y si además tienes que mostrarlo en una Rejilla …

Que una tabla tenga mil o un millón de registros, en un sistema de bases de datos relacionales, te aseguro que no ralentiza para nada la aplicación. Un mal diseño de la base de datos y un código poco optimizado es lo que da al traste con ella.

Mi humilde consejo: lo más rebuscado no siempre es lo más adecuado.

Saludos
Paco Satué


([N1] Spicer) #6

Estimado Paco,

Mucho agradezco tus comentarios, y aprovecho la instancia para hacerlo por los aportes que en general das al foro. Tengo claro que estoy al debe en ese sentido, pues varias veces has mencionado sentir que son pocos los que escriben; en este momento estoy totalmente sobrevendido con este proyecto, espero ponerme al día más adelante.

Ahora bien, en relación al tema de la discusión, lo rebuscado no fue lo que busqué… simplemente fue lo mejor que se me ocurrió para lograr el objetivo sin tener que recurrir al ardid de poner todos los registros siempre en la tabla de combinaciones, tuvieran o no datos.

Está por verse si esta solución es funcional en producción; en caso que no lo sea, tendré que cambiarlo por el otro sistema. Será una lata, pero no será para morirse tampoco

Saludos y gracias nuevamente.

PS: ¿Me puedes dar algún mail donde contactarte? gracias…


([N3] pacosatu) #7

Hola Spicer.

Si tu solución funciona, desde luego no lo dudes, adelante. Lo que tendrás que comprobar es el puntero virtual en conexiones lentas.

En cuanto a lo de participar en este foro, me temo que a los miles de suscriptores de Velneo no les interesa, o quizás es que están en otro foro y no nos hemos enterado.

Estoy intrigado en conocer el perfil mayoritario del suscriptor de Velneo ¿es un simple usuario e implantador de vERP? Entones entendería el desinterés por cuestiones técnicas en el foro, la deriva de Velneo a cuestiones comerciales y el abandono de la nave del responsable de desarrollo de la plataforma.

Saludos
Paco Satué


([N4] mconde) #8

Hola Paco.
Desde Velneo estaremos encantados de explicarte el perfil tan diverso de nuestros clientes, que van desde el autónomo, pasando por empresas de desarrollo de 1 a 10 programadores, hasta grandes cuentas o departamentos de informática de multinacionales de diversos sectores.
Llámanos y estaremos encantados de hablar contigo como hacemos con muchos de los clientes que cada día contactan con nosotros. Nos encanta escucharos y nos enriquece mucho vuestras consultas.
Estamos para escucharos.

Gracias por vuestras aportaciones.

Un saludo.


([N1] Spicer) #9

Estimados,

Indudablemente la noticia del alejamiento de Juan Muñoz-Cobos generó incertidumbre, sobre todo porque no está muy claro cuál era su papel en el desarrollo de Velneo, y cómo será ahora. El post en el blog deja entrever que hay un equipo detrás, lo que es muy bueno porque obviamente “nada es para siempre”, como dice la canción. Sin embargo, existe la idea (errada o no, no sé) que poco menos que JMC era el alma y corazón del software Velneo propiamente tal, y que sin él, poco menos que no hay mucho más que esperar del núcleo mismo de Velneo (vServer, vDevelop, vClient).

Antes de embarcarme en este proyecto consideré dos alternativas: WinDev o Velneo y ya saben cuál elegí; hasta ahora la inversión en tiempo ha sido enorme.

Mario Conde, sugiero que clarifiquen el punto, pues tengo la impresión que somos varios los que estamos nerviosillos


([N1] aguinet1) #10

Me uno al pedido general de una pronta información al respecto que nos clarifique las cosas, espero que sea pronto y que no cunda el pánico.