Error al modificar Ficha con un "Modificar campo" y Actualización en tabla

Hola pnogueira.

Bueno, tampoco es que esté muy clara la explicación. Ten en cuenta que yo no uso VERP y así en frio es imposible determinar el error.

Pero estás de suerte. Tenía pendiente revisar las novedades de la 25 y entre ellas estaba instalar VERP 25 y probar el interface de movilidad.

Yendo a tu problema, está clarísimo lo que pasa y acabas de toparte con algo gordo.
Veamos:

  • Tenemos el formulario VTA_ALB_G (Albarán de Venta) con la tabla VTA_ALB_G (Albaranes de Venta).
  • Ejecutamos el manejador VTA_ALB_FAC para facturar el Albarán generando un registro en la tabla VTA_FAC_G (Facturas de Venta).
  • Con el código original de la plantilla VERP todo funciona correctamente.
  • Creamos una Actualización en la tabla VTA_ALB_G sobre el campo enlazado VTA_FAC de la tabla VTA_FAC_G para acumular el valor del campo POR (Portes).
  • Con esto se produce un Error de Modificación de Ficha con el siguiente valor de Retorno:
    Transacción: 65, Estado: Abortada, Título: Modificación ficha VTA_ALB_G: 3, Inicio: 2019-06-03T17:22:50, Fin: 2019-06-03T17:22:54, Operaciones: 0, Retorno: Deshecha por encontrar ficha ocupada

¿Cuál es el problema? Sigamos la ejecución del código con el “estupendo y maravilloso” depurador de Velneo.

En el Manejador VTA_ALB_FAC tenemos:

  • un primer comando Interfaz: Guardar la ficha en alta o modificación
    Transacción: 63, Estado: Finalizada OK, Título: Modificación ficha VTA_ALB_G: 3, Inicio: 2019-06-03T17:21:44, Fin: 2019-06-03T17:21:44, Operaciones: 1, Retorno: Ok
  • un comando Alta de ficha (vta_fac) que crea una Transacción nueva que quedará abierta y bloqueando la Ficha nueva de la tabla VTA_FAC_G.
    Transacción 64, ... Título: Facturar albarán de venta
  • un segundo comando Interfaz: Guardar la ficha en alta o modificación que guardará en el campo VTA_FAC el valor del ID de la nueva Factura creada. Además ejecutará la Actualización sobre la Factura recien creada que todavía sigue bloqueada por la Transacción 64. Por lo tanto, después de 4 segundos se devuelve el error:
    Transacción: 65, Estado: Abortada, Título: Modificación ficha VTA_ALB_G: 3, Inicio: 2019-06-03T17:22:50, Fin: 2019-06-03T17:22:54, Operaciones: 0, Retorno: Deshecha por encontrar ficha ocupada
    Consecuencia, no se guarda el ID de la Factura en el campo VTA_FAC del Albarán.
  • Una vez termina el Manejador, la Transacción 64 se termina con OK y aquí no ha pasado nada. Pues NO, el Albarán queda como NO Facturado. Un desastre, quedando la Base de Datos con la Integridad rota.

¿Por qué se produce el problema?
El comando Interfaz: Guardar la ficha en alta o modificación genera Transacción independiente y no se integra en el proceso del Manejador VTA_ALB_FAC como sí lo hace el comando Alta de ficha. Por esta razón tenemos 3 Transacciones independientes, de las cuales 2 (nº 64 y 65) chocan entre sí.

¿Cuál es la Solución?
Crea un Proceso que dé de Alta la Factura y devuelva la Ficha. Con el comando Ejecutar proceso (que recibe la Ficha del Albarán en memoria) la Transacción del Alta de la factura será independiente y desaparece el problema.

Recuerda que VERP es una Plantilla y hay que mirar con lupa todo el código para adaptarlo a nuestros requerimientos.

Prueba la solución que te propongo y ya nos cuentas.
Si funciona bien, lo pasas a Soporte para que lo incorporen a la nueva Versión ya que es evidente que ese código fallará en cuanto otro añada Actualizaciones como tú has hecho.

Saludos
Paco Satué

1 me gusta