Visualizar históricos de instancia de datos compartida


([N3] krear) #1

Tengo una solución para gestionar reservas de diferentes franquicias. Cada franquicia utiliza una infancia (datos y aplicación) de esta solución para gestionar sus propias reservas y comparten una instancia de datos/aplicación en común (Clientes) para todas las franquicias.

Todo funciona correctamente, pero a la hora de querer eliminar un Cliente que tiene alguna reserva me da error dado que el cliente tiene históricos (en reservas), el problema es que no tengo manera de saber en que instancia están esos históricos, por lo cual no queda otra que:

  • Ejecutar una de las instancias de reservas.
  • Buscar el cliente y ver si tiene reservas.

Esto debo realizarlo con todas las instancias!, es decir si tengo 20 franquicias tengo que ir una a una y ver si el cliente en cuestión tiene alguna reserva en esa franquicia, lo cual es de locos.

Hay alguna manera de visualizar desde clientes (instancia de datos compartida) todos sus históricos de las diferentes instancias? Internamente velneo lo hace, dado que detecta que tiene históricos, pero como podemos nosotros acceder a esa información y saber cuales y en que instancia están esos históricos?

Saludos!


([N3] pacosatu) #2

Hola krear.

A mí me surgió este problema hace tiempo y en soporte no supieron darme una respuesta clara. En realidad era con las tablas de extensión pero para el caso es lo mismo.

Lo que no entiendo es cuando dices que Velneo es capaz de detectar que un maestro tiene históricos en una instancia de datos diferente a la que estás usando. ¿Es cierto eso? Yo creo que eso es imposible que se sepa. Imagina que tienes un instancia de datos parada, no hay manera de acceder a ella para saber si hay históricos.

Me imagino que la respuesta es una de estas 2:

1 - Evita usar tablas relacionadas en diferentes instancias de datos cuando vaya a haber multiinstanciación.
2 - Si decides usar este esquema de tablas, olvídate de eliminar maestros, simplemente los marcas como eliminados con un campo que no vaya a ser indexado para las búsquedas.

De todas formas es una buena pregunta para soporte.

Saludos
Paco Satué


([N3] krear) #3

Hola Paco! Como siempre muchas gracias por tu ayuda! :slight_smile:

Mira he estado haciendo alguna pruebas antes de escribir, sobre todo con lo que me comentas

"Lo que no entiendo es cuando dices que Velneo es capaz de detectar que un maestro tiene históricos en una instancia de datos diferente"

En principio esto lo he detectado mediante los mensajes de vAdmin “errorFichaTieneHistorico” cuando trato de eliminar una ficha que tiene históricos en alguna de las instancias. Para asegurarme de que esto se así he probado lo siguiente:

-Accedo a la franquicia A (instancia A) creo un cliente nuevo XX (instancia compartida Clientes) y le genero una reserva de pruebas. En este momento XX solo tiene una reserva (histórico) de la franquicia A.
-Accedo a la franquicia B (instancia B), localizo en clientes a XX, en su ficha veo que en reservas no tiene nada porque la única reserva que tiene es de otra franquicia. Si desde esta ficha intento eliminar al cliente es cuando me da error porque tiene históricos en otra instancia, lo cual es correcto y gracias a dios que funciona así, de lo contrario eliminaría al cliente y las reservas de otras instancias con este cliente quedarían inválidas.

De allí que deduzco que de alguna manera interna Velneo sabe que esa ficha tiene históricos ya sea en la instancia actual o en alguna otra instancia.

Sería de gran utilidad saber como podemos implementar esto para así poder ver desde un lugar en común por ejemplo todas las reservas de las diferentes franquicias que tiene un cliente, es decir desde una tabla maestra de una instancia compartida poder acceder a todos sus históricos de las diferentes instancias.

De las 2 opciones que me sugieres creo que implementaré la 2da y daré opción a desactivarlos y también lo consultaré con soporte para ver si hay alguna manera de acceder a esta información.

Muchas gracias por tu ayuda Paco!

Saludos
:slight_smile:

Pablo


([N4] Paco Satué) #4

Hola Pablo.

Estoy interesado en saber lo que te contesta Soporte, porque sigo creyendo que es imposible ver los históricos de otras Instancias que están apagadas o incluso funcionando.

Los Enlaces plurales son “Enlaces Virtuales” que se añaden a la tabla Maestra en tiempo de ejecución y apuntan a las tablas históricas que encuentra en los proyectos de Datos instanciados en ese momento. Por lo tanto, desde un maestro solo se pueden ver los plurales de los proyectos instanciados desde la Solución activa.

Haz una prueba, ejecuta vDataClient y abre el proyecto de datos de la Instancia compartida Clientes. Abre la tabla de Clientes, colócate encima de un Cliente e intenta navegar a los plurales de Reservas (opción menú Navegante -> plurales). ¿Puedes acceder a las reservas? ¿Qué reservas te debería mostrar vDataClient, las de la franquicia A o de la B? Seguramente no te mostrará ninguna Franquicia porque no ha instanciado ninguna de las 2.

Esto es la teoría, puede que el motor de Velneo haga alguna maravilla y tengas razón.

Saludos
Paco Satué


([N4] innovadb) #5

Hola Pablo

Entiendo que lo que haces es crear instancias por delegación y asignarles por herencia a todas ellas una misma instancia de datos con tablas comunes, pero todo en el mismo vserver.

Si es así para ver que tablas tienen plurales puedes usar este javascript, pero no estoy seguro de que sea la solución a tu problema por que no tengo claro al 100% como lo tienes montado.

Un saludo


var msg = ""
if ( confirm( "¿Desea saber todos los datos históricos de " + theRegisterIn.fieldToString( "NAME" ) + "?", "Confirmación" ) )
{	
	ti = theRegisterIn.tableInfo();
	numPlurales = ti.pluralCount();
	numTotalReg = 0;
	
	for ( x=0; x<numPlurales; ++x )
	{
		pluralId = ti.pluralId( x );
		listaPlurales = theRegisterIn.loadPlurals( pluralId );
		numReg = listaPlurales.size()
		if ( numReg > 0 )
		{	
			var msg = msg + pluralId + "\n"
			
		}
	}
	
	alert( msg );
}

([N3] krear) #6

Buenas!

Paco he realizado la prueba que me comentas con vDataClient y efectivamente obtengo el resultado que tú planteas, es decir a un cliente le digo que muestre sus plurales y no me muestra nada desde allí.

Como bien comenta @innovaDB el montaje que tengo es así, todo en el mismo vserver funcionando en cloud, cada franquicia con una instancia independiente y una única instancia Clientes compartida entre todas. Por este motivo todas las instancias siempre están activas en el mismo servidor, independientemente de que alguna franquicia esté ejecutando una instancia o no.

Muchas gracias por tu ayuda también @innovaDB!! probaré el Js que me adjuntas a ver que tal!

También he enviado ticket a soporte y en cuanto sepa algo os comento!

Saludos y gracias por todo!
Pablo


([N3] krear) #7

Ya tengo la respuesta de soporte a esta duda:

El sistema, efectivamente, comprueba si el registro tiene históricos pero, lamentablemente, no hay forma de saber en qué instancia están.

Yo lo que te recomendaría es no borrar el registro, sino crear un campo booleano que activarás en el caso de querer darlo de “baja” y usar este campo booleano en la condición de indexación de los índices de la tabla para que no aparezcan en las búsquedas.

Si tienes dudas o quieres realizar cualquier otra consulta, estaremos encantados de atenderte.

Un cordial saludo,

Por lo cual esta claro, debo implementar lo que comenta Paco y soporte, desactivar registros en vez de dar posibilidad a eliminar.

Probaré también lo que me comenta @innovadb

Os mantengo informados!


([N4] innovadb) #8

Un detalle.

El javascript que te pasé es una modificación de otro que eliminaba todos los registros de todas las tablas historicas.

Con un pequeño cambio puedes hacer que te elimine todos los plurales si es lo que necesitas, y si estos a su vez no tienen otros plurales.

Un saludo


([N4] Paco Satué) #9

Hola Pablo.

Con el permiso de innovadb, el código Javascript que busca los históricos es lo mismo que hacemos con el código nativo siguiente, con la excepción de que no es dinámico:
Cargar plurales (<Enlace plural>)
Set(nNumRegistros, sysListSize)

De esta forma solo podemos conocer los plurales de la instancia de datos actual, del resto de instancias de datos, como ya ha quedado claro, no es posible saber nada, como es obvio.

De todas formas no es un problema grave, ya que Borrar Maestros es una Acción muy rara en Aplicaciones reales, sobre todo si afectan a varias Instancias. Siempre habrá una alternativa como la ya comentada, o preparar un proceso que haga un borrado controlado de todos los históricos según se vayan iniciando las Instancias afectadas.

Saludos
Paco Satué


([N4] innovadb) #10

Paco, faltaria más. Tu eres el que siempre esta ayudando a la gente, yo solo paso por aquí de vez en cuando.

Un saludo