Actualizaciones a través de Enlaces Indirectos Reales


([N2] Esfero) #1

Buenos días, tras pasar una semana haciendo pruebas y después de que soporte me confirmara que ese es el comportamiento normal en Velneo, cuando utilizamos Actualizaciones dependientes de un campo “Enlace Indirecto Real”, he subido un idea nueva a la web.

https://soporte.velneo.es/entries/100043967-Actulizaciones-Mejorar-el-soporte-de-los-Enlaces-Indirectos-Reales

Os explico el caso:

Necesito realizar una serie de Acumulados en un proyecto que estoy desarrollando y he comprobado (corroborado por Soporte), que si creamos en una tabla (Ej.: LINEAS) un Enlace Indirecto Real (Ej.: ACU_GRUPO_ARTICULO), él cual resolvemos utilizando un campo de una tabla asociada y no su índice (Ej.: GRUPO=#CABECERAS.GRUPO), este no se recalculará correctamente cuando cambie el campo GRUPO en la tabla #CABECERAS.

Lo peor del caso es que vDevelop, te permite hacer el enlace sin ningún tipo de aviso y la actualización funcionará tanto en las Altas Nuevas como en las Bajas, pero fallará en las Modificaciones, por lo que lógicamente los acumulados de la tabla (Ej.: ACU_GRUPO_ARTICULO) no serán correctos.

Soporte me comenta que debo resolver el enlace Indirecto Real con campos de la misma tabla, pero francamente, me parece bastante precario tener que duplicar la información (Ej.: GRUPO) en la tabla que va ha contener el detalle (Ej.: LINEAS) y tener que crear un trigger en la tabla cabecera o Maestra (Ej.:CABECERAS) que actualice este campo cuando cambie su valor.

NOTA: Este comportamiento también ocurre cuando establecemos un CONTENIDO INICIAL en un campo, si el contenido inicial es (Ej.:#AÑO= year(#FECHA)), si modificamos el campo FECHA el campo AÑO se actualizará, en cambio, si el contenido inicial es (Ej.:#AÑO= year(#CABECERAS.FECHA)), aunque cambie de valor el campo FECHA en la tabla CABECERAS, el valor del campo AÑO no se actualizará.

Si como es mi caso, entendéis que deberían revisar este funcionamiento, pues botar la idea,

Un Saludo.


([N2] AyudaVelneo) #2

Hola Esteban:

La explicación de porqué no te funciona en las modificaciones es sencilla: Al no cambiar el ID del campo enlazado, no se recalcula la actualización.

Como bien dices, pasa lo mismo en los contenidos iniciales. Si modificas el PVP de un artículo (por ejemplo) en la línea de venta no se reflejará… hasta que no modifiques el enlace a maestro. Si tienes el típico control con flechas arriba abajo, prueba a cambiar de artículo y volver al mismo.

Un saludo


([N3] pacosatu) #3

Hola Esfero.

Creo que la Idea no puede prosperar porque implicaría cambiar la esencia del funcionamiento de las fórmulas en las tablas de Velneo: “Una fórmula se recalcula en Actualizaciones y valores Iniciales” cuando uno de sus componentes, siempre que sea un campo de la misma tabla, haya sido modificado en la transacción".

Tienes que tener claro algunos conceptos:

  • Los campos de un puntero (maestro, puntero real, virtual, …) son siempre de solo lectura y no entran en la transacción. Únicamente se verá implicado en la transacción el campo ID (o el puntero real, virtual) que es el enlace entre la tabla principal y la enlazada.
  • Dices:
... (Ej.: GRUPO=#CABECERAS.GRUPO), este no se recalculará correctamente cuando cambie el campo GRUPO en la tabla #CABECERAS.
Efectívamente, cuando el campo #CABECERAS.GRUPO cambia, la tabla LINEAS ni se entera. Es imposible que se entere y además debe ser así. Imagina que #CABECERAS.GRUPO se usa en cientos de fórmulas. Es sencillamente imposible de forma automática a no ser que tú lo programes manualmente. - Aunque falta una explicación más a fondo por parte de Velneo, me imagino que las fórmulas se actualizan usando la función #CAMPO:isModified(), por lo tanto, solo es capaz de interrogar por los campos de la propia tabla y entre ellos está el campo ID o el puntero Real, pero no los campos de dichos punteros.

Para los valores Iniciales entenderás que este sea el comportamiento lógico. Si yo eligo un Artículo ID, se guardará el valor inicial ID.PRECIO. No quiero que ese precio se sobreescriba cuando ID.PRECIO se actualize por cambio de temporada por ejemplo. Solo quiero que se actualize el valor inicial cuando elegimos otro artículo en una modificación de la LINEA, es decir, cuando cambiamos el ID del puntero a ARTICULO.

  • Tú has resuelto el Puntero Real con #CABECERAS.GRUPO, pero imagina que quieres resolverlo con #CABECERAS.GRUPO.ZONA.PERIODO.FRANJA, entonces ¿tendríamos que controlar los cambios en GRUPO, ZONA, PERIODO y FRANJA? ¡¡Imposible!!.

Conclusión: Este es un caso concreto en el que tendrás que duplicar los campos enlazados en la tabla principal para que las fórmulas puedan ejecutar un #CAMPO:isModified() y actualizarse en el caso de que devuelva TRUE. Y como bien dices, usar los Triggers para pasar los valores de GRUPO de Cabeceras a Líneas y así desencadenar la Transacción en la tabla LINEAS que actualize las fórmulas de valores iniciales y/o actualizaciones.

Es cierto que al principio este tema desconcierta un poco, pero una vez lo controlas es potentísimo y una de las grandes bazas de la Base de datos de Velneo.

Saludos
Paco Satué