Eliminar registros de tablas extendidas


([N4] tutormcsoftware) #1

En el trigger previo al borrado de un registro elimino sus plurales y quiero eliminar la extensión que tiene en un proyecto que hereda de este. Desde el trigger es imposible hacerlo puesto que no hay instrucciones para tener visibilidad sobre el proyecto que hereda. (no se puede hacer cargar lista, porque simplemente la tabla extendida no está visible)

¿Alguien sabe si desde Javascript se puede hacer? Si es así, agradecería indicaciones de como hacerlo.


([N3] pacosatu) #2

Hola tutormcsoftware.

Esta es una cuestión interesante porque tenemos una relación 1a1 entre 2 tablas de diferentes instancias de datos y la cosa se complica cuando la tabla principal es heredada por varios proyectos de datos en una Solución multiempresa.

Yo creo que en este caso no es buena idea borrar un registro de la tabla principal cuando no sabes de antemano cuántas tablas de extensión están usando esa tabla principal. Imagina un registro de la tabla Entidades que es extendido en n-instancias de datos diferentes.

Aun así, si tienes el tema controlado, puedes hacer lo siguiente:


Rem En el trigger anterior al Borrado
Crear manejador de objeto ( oExt, Proceso JS_BORRAR_EXTENSION@0PS_Ejercicios_dat )
Set variable local de objeto ( oExt, NID, #ID )
Disparar objeto ( oExt, 1º plano: Local (síncrono), )

El código JavaScript en JS_BORRAR_EXTENSION:


// El Alias del proyecto de datos que hereda lo puedes obtener con theApp.mainProjectInfo()
var cAlias = "0PS_Ejercicios_dat"
var cTablaExt = cAlias + "/TABLA_EXT"
var oRegistroExt = new VRegister(theRoot)
oRegistroExt.setTable(cTablaExt)

// Ya hay una transacción abierta, estamos en el trigger
oRegistroExt.readRegister("ID",[theRoot.varToInt("NID")],VRegister.SearchThis)
// Si ha devuelto un registro es que existe la Extensión
oRegistroExt.deleteRegister()

/*
// ESTO NO FUNCIONA. ¡¡¡Está reportado a Velneo hace MESES!!!
oRegistroExt = theRegisterIn.readLockingRegisterExtension(cTablaExt)
// oRegistroExt no es un objeto VRegister válido
alert("Extensión: " + oRegistroExt.toString()) 
if (oRegistroExt.exist()==true) {
	oRegistroExt.deleteRegister()
}
*/

Pruébalo
Saludos
Paco Satué


([N4] tutormcsoftware) #3

Muchísimas gracias. Mañana será lo primero que haga al llegar al trabajo.

Efectivamente estoy de acuerdo contigo en que no es una buena idea eliminar un registro “padre” sin saber cuantos hijos puede tener. Como sería el caso de entidades.
Pero no es el caso. El caso es que son lineas de detalle de venta que tienen una extension en otro proyecto porque hay información suplementaria que no requieren los proyectos que están por debajo. Así cuando elimino un pedido o una linea de pedido debería borrar los registros de todas lasa tablas en las que está involucrado.

Lo dicho lo pruebo y cuento cosas. Porque esta solución será de mucho interés para todos aquellos que intentamos llevar el tema de la personalización a sus últimas consecuencias


([N4] tutormcsoftware) #4

He estado haciendo pruebas hasta ahora infructuosas.
El script que he probado es el siguiente:

var oProyecto = theApp.mainProjectInfo();
var cAlias = oProyecto.alias();
var cTablaExt = cAlias + “/ORD_TRA”;
var oRegistroExt = new VRegister(theRoot);
oRegistroExt.setTable(cTablaExt);
var nId =theRoot.varToInt(“NID”);

// Ya hay una transacción abierta, estamos en el trigger
oRegistroExt.readRegister(“ID”,[nId],VRegister.SearchThis);

// Si ha devuelto un registro es que existe la Extensión
oRegistroExt.deleteRegister();

Es el que me has propuesto tan solo que para mi mayor comprensión (soy muy lego en js) he hecho uso de más variables.
He comprobado mediante alerts que el alias y la tabla sean correctos y lo son. Pero no elimina el registro.
No se si me estoy dejando algo o no. Tambien he mirado en la ¿documentacion? las funciones que tienes comentadas más abajo, diseñadas para trabajar con registros extendidos. Es una pena que no funcionen.


([N3] pacosatu) #5

Hola tutormcsoftware.

Que no salga bien a la primera a veces es bueno, es la mejor forma de aprender.
Alguien dijo una vez que en Velneo no hace falta un Debugger, debía estar borracho.

Comprueba lo siguiente:

  • El Alias que devuelve oProyecto.alias() es el del Proyecto de Aplicación.
    Debes poner el Alias del proyecto de Datos. Yo lo que hago es diferenciar los 2 Alias por un sufijo (_app o _dat).
    Por ejem:
    var cAliasAPP = theApp.mainProjectInfo().alias();
    var cAliasDAT = cAliasAPP.replace(“app”,“dat”);
    Para las pruebas pon el Alias de momento como un literal.

  • Mira los mensajes de vAdmin. Allí aparecen los posibles errores de JavaScript y si la Transacción ha fallado.

  • Por último, haz las pruebas con 2 tablas sencillas, una principal y otra extendida. Pon el código en el Trigger de la principal y mediante vDataClient y mirando los mensajes de vAdmin puedes hacer las pruebas cómodamente.

Saludos
Paco Satué


([N4] tutormcsoftware) #6

Eres un ángel salvador.
Ciertamente era porque utilizaba el alias del proyecto de aplicación. Yo también los diferencio como tu y voy a utilizar las sustituciones que me sugieres.

Muchísimas gracias por tu ayuda, porque me encontraba en un callejón sin salida y se me derrumbaba todo el entramado de personalización que había montado.

Ahora miraré la documentación por si veo la posibilidad de que no haya que informar del nombre de la tabla y se pueda saber que tablas extendidas tiene una tabla.

Mil gracias de nuevo