Evitar ejecución de contenidos iniciales


([N4] gontorre) #1

Buenas tardes,

Se me plantea el siguiente problema:

Tengo varios campos en una tabla de DOCUMENTOS que están definidos con un contenido inicial que viene de una tabla de CLIENTES o PROVEEDORES (que son tablas de extensión de una tabla TERCEROS). El caso es que quiero que los contenidos iniciales tomen el valor de la tabla de clientes o proveedores, pero sólo al crear un nuevo documento. El problema es que el contenido inicial depende del tipo de documento. En función de ese tipo me toma el valor de la extensión de proveedor o de la de cliente. Es algo así:

choose(#TIPODOC.TIPOTERCERO=“C”,#TERCERO.EXTENSION_CLIENTE.DESCUENTO_PP,#TERCERO.EXTENSION_PROVEEDOR.DESCUENTO_PP)

Si sobre un pedido ya realizado cambio el descuento quiero que al convertir el pedido en albarán se mantenga el descuento aplicado en el pedido, pero como estoy cambiando el valor de #TIPODOC, se dispara el contenido inicial y me vuelve a poner el valor que tiene definido el cliente en su ficha.

He intentado hacer los siguiente:

choose(#ID=0,choose(#TIPODOC.TIPOTERCERO=“C”,#TERCERO.EXTENSION_CLIENTE.DESCUENTO_PP,#TERCERO.EXTENSION_PROVEEDOR.DESCUENTO_PP),#DESCUENTO_PP)

pero me sale un error de que el contenido inicial es recursivo.

¿Se os ocurre alguna forma de solucionar esto? Siempre puedo quitar los valores iniciales de los campos y gestionar los datos manualmente, pero no me atrae la idea.

Gracias y un saludo


([N4] gontorre) #2

Lo he solucionado de la siguiente forma:

  1. He creado en la tabla DOCUMENTO un enlace #VALORES_ANTERIORES indirecto virtual a la misma tabla resolviendo por el ID. De esta forma tengo guardados los valores anteriores de los campos del registro.

  2. He puesto el valor del contenido inicial como:

choose(#TIPODOC.TIPOTERCERO!#VALORES_ANTERIORES.TIPODOC.TIPOTERCERO,choose(#TIPODOC.TIPOTERCERO=“C”,#TERCERO.EXTENSION_CLIENTE.DESCUENTO_PP,#TERCERO.EXTENSION_PROVEEDOR.DESCUENTO_PP),#VALORES_ANTERIORES.DESCUENTO_PP)

No se si es demasiado enrevesado, pero el caso es que funciona.

Un saludo


([N3] pacosatu) #3

Hola Gonzalo.

Dices:

Si sobre un pedido ya realizado cambio el descuento quiero que al convertir el pedido en albarán se mantenga el descuento aplicado en el pedido, pero como estoy cambiando el valor de #TIPODOC, se dispara el contenido inicial y me vuelve a poner el valor que tiene definido el cliente en su ficha.

Entiendo que cuando se crea el nuevo Albarán fijas el valor de #TIPODOC y el valor inicial de #DESCUENTO toma el descuento del Cliente o Proveedor (hasta aquí todo correcto). Una vez creado el Albarán cambias el valor de #DESCUENTO al que tiene el Pedido.

El Alta del Albarán desde el Pedido y la asignación del #DESCUENTO se hará en un Proceso para que quede englobado en una única Transacción.

Si lo he entendido bien, creo que con esto es suficiente

Saludos
Paco Satué


([N4] gontorre) #4

El proceso no es exactamente así Paco.

En realidad el pedido y el albarán son el mismo documento. Primero el documento tiene #TIPODOC=“PEDIDO” y luego se cambia a “ALBARAN”. Primero creo un documento tipo PEDIDO y luego tengo un proceso de conversión de documento que hace un Modificar campo(#TIPODOC, “ALBARAN”).

El contenido inicial del descuento se lanza cuando creo el pedido (correcto) y me pone en el pedido el valor del descuento que tenga el cliente. Si en esa operación en concreto el descuento debe ser otro lo cambio en el pedido. Ese valor quiero que se mantenga cuando convierto el documento a albarán. Por eso no quiero que se lance el contenido inicial cuando modifico el campo #TIPODOC en la conversión.


([N3] pacosatu) #5

Hola Gonzalo.

Por esa razón no estaba seguro de lo que planteabas, de todas formas creo que es un diseño un poco extraño. Un documento, una vez creado, no debería cambiar su naturaleza. Además pierdes el histórico del Pedido y te obliga a servirlo completo.

En cualquier caso, puedes usar el comando Modificar campo solamente (TIPODOC, “ALBARAN”) para que no se dispare el recálculo del campo dependiente #DESCUENTO.

Saludos
Paco Satué


([N4] gontorre) #6

Ya sé que el diseño es un poco raro. En nuestro caso no se guardan históricos de pedidos ni de albaranes. Prácticamente todos los pedidos se entregan y se facturan en el día, de forma que el pedido es un documento bastante “efímero”. Además nuestro sistema no tiene los típicos deocumentos (presupuesto, pedido, albarán y factura) sino que es multidocumento y en nuestro caso tenemos más de 20 tipos diferentes de documento. Si tengo que hacer una tabla de cabeceras y líneas para cada tipo…

Lo de hacer “Modificar campo solamente” lo había pensado pero eso hace que no se dispare ningún contenido inicial y hay algunos que si quiero que se modifiquen.

El sistema es bastante complicado, pero de momento me sirve la solución de condicionar el contenido inicial a que haya cambiado el campo.

Gracias de todos modos


([N3] pacosatu) #7

Hola Gonzalo.

Entonces tienes otra alternativa, parecida a tu solución, pero quizás más elegante.

  • Quieres mantener el valor anterior (OLDVAL) del descuento cuando el Documento pasa a ser ALBARAN y que no tome el valor Inicial.
  • Entonces pon lo siguiente en el Trigger anterior a la Modificación:

If (#OLD_VALOR.DESCUENTO > 0) & (#OLD_VALOR.DESCUENTO ! #DESCUENTO ) & (#TIPODOC = “ALBARAN”)
— Modificar campo (DESCUENTO, #OLD_VALOR.DESCUENTO)

Siendo #OLD_VALOR el puntero virtual al registro con los valores anteriores.

Saludos
Paco Satué