Guardar línea de detalle desde pierde foco de columna


([N4] gontorre) #1

Me parece que voy a copar el foro esta mañana, jeje

Tengo un problema que intentaré explicar a ver si se entiende:

Tengo un formulario maestro-detalle de pedidos y sus líneas en el que tengo una rejilla editable para las líneas del pedido. En la columna “Cantidad” tengo una llamada a un manejador de eventos en el evento “pierde foco”. Este manejador calcula la cantidad pendiente de la línea de detalle en función del stock disponible que haya. Por ejemplo, si escribo 5 en la cantidad y tengo 4 en stock, el pendiente sería 1.

El caso es que todo funciona y hace bien los cálculo salvo por un detalle. La función que calcula la cantidad pendiente depende del stock disponible, que se calcula con una actualización desde la línea de detalle. El problema es que la actualización se lanza cuando se graba la línea, de forma que si sólo me muevo con la tabulación y voy modificando la cantidad, el cálculo falla porque la línea de detalle no se está grabando. Si modifico la cantidad, me muevo con la tabulación, me muevo hacia atrás y vuelvo a cambiar la cantidad, el cálculo lo hace con el valor antiguo del stock y falla.

He intentado guardar la línea de detalle desde el manejador de eventos con el código adjunto pero no hace nada.

Estoy empezando con Velneo. Prometo que cuando sea un experto devolveré con creces la ayuda en el foro :slight_smile:

Gracias a todos


([N3] pacosatu) #2

Hola gontorre.

Te aconsejaría que antes de empezar a liarte con eventos en Velneo te miraras bien los videotutoriales, sobre todo los de Pedidos de Jesús Arboleya. Verás que la mayoría de la lógica de la aplicación se puede implementar directamente en la base de datos mediante Actualizaciones y Punteros reales o virtuales.

La web de ayudavelneo.com es una buena fuente (bueno en realidad es la única viva) de inspiración y conocimiento sobre Velneo.

Saludos
Paco Satué


([N4] gontorre) #3

Buenos días Paco,

Los ejemplos me los he mirado ya todos e incluso he tenido una semana de formación con la gente de Velneo. Pero claro, cuando te metes de verdad en faena es cuando aparecen las dificultades y las dudas.

Las actualizaciones y los triggers los estoy utilizando muchísimo y me están resolviendo con 2 líneas lo que en mi aplicación antigua necesitaba cientos de líneas de código y controles en varias partes del programa.

En este caso de la cantidad pendiente no puedo utilizar actualizaciones porque el cálculo depende de los valores que había escritos antes en la línea de detalle y estos datos no los tengo disponibles en la actualización.

Me parece que voy a programar la introducción de líneas de detalle con un formulario y así todos estos controles se simplifican.

Voy a echar un vistazo a la web que me comentas que parece interesante.

Mucha gracias


([N4] gontorre) #4

Retomo este hilo de hace unos meses.

Creo que he solucionado el problema y lo explico por si a alguien le sirve y también para que me comentéis si la solución os parece válida.

El problema que tenía es que al grabar una línea de detalle tengo que hacer un cálculo en el que interviene el valor que tenía un campo de la línea de detalle antes de modificar. El problema es que en el trigger anterior a la modificación no veía la forma de conocer el valor anterior de #CANTIDAD ya que el valor ya llega modificado. Lo podía hacer en el interfaz, pero eso me obligaba a poner ese código en varias partes del programa y eso no me convencía.

Lo que he hecho al final es un Cargar lista por el ID de la línea en el trigger anterior que me muestra el valor que aún está en disco y de esta manera tengo todos los valores anteriores del registro y los nuevos.

¿Os parece razonable? ¿Hay otra manera más sencilla de conocer el valor anterior de un campo antes de modificar?

Gracias y un saludo

Gonzalo Torre


([N3] Humber) #5

La mayoría del tiempo puedes obviar muchos cargar lista utilizando punteros en la base de datos, digamos que a veces tienen usos simples pero que te facilitan muchas tareas.

Dependiendo de donde guardes el stock puedes utilizar uno u otro tipo de puntero, aunque en teoría si estás haciendo una actualización de stock a un maestro quiere decir que ya tienes acceso desde el maestro al campo stock antes de guardar la ficha.

Por ejemplo si el stock lo tienes en un campo del artículo, que se actualiza al dar de alta a la linea, al momento de asociarle un artículo a la linea, ya tienes acceso al campo stock para hacer el cálculo.

por el contrario, si el stock lo guardas en la linea y necesitas buscar el movimiento anterior de ese artículo para saber el stock actual, puedes usar un hermano contiguo al anterior, que por cierto me parece ridículo que si la ficha no está dada de alta, el hermano no se resuelve, que imagino en este caso no te serviría, pero he resuelto estos casos donde necesito el anterior para un calculo antes de que se de de alta el registro con un singular de plural por indice en mi maestro que me tome el ultimo con las condiciones que necesite y pues puedo acceder al maestro y luego caer a la ultima linea del artículo de esa manera sin guardar la ficha.

esos dos ejemplos te pueden resolver algunos casos, pero si das mas información de donde guardas el stock podrían ayudarte mas específicamente a tu necesidad.

Igual he utilizado los singulares de plurales por posición porque muchas veces necesitaba saber si un registro tenia plurales de alguna tabla y para no cargar lista en un formulario, creaba un singular y verificaba si ese campo tenía algún registro asociado.

con los punteros y enlaces a maestros te puedes ahorrar muchas cargas de lista si conoces bien el manejo de este tipo de campos, te recomiendo los estudies bien porque te solucionan muchas cosas.

puedo subir y bajar entre maestros y plurales con una facilidad tremenda si se plantear donde crearlos

por ejemplo, si estoy en una linea de factura y quiero (por alguna razón) saber cual fue la ultima factura de este cliente donde compró este mismo artículo, puedo hacerlo fácilmente con punteros. subo a la cabecera de la factura, de alli subo mas al cliente y en el cliente tengo un singular que se resuelve y me devuelve la ultima linea donde compre ese artículo (en ese punto estoy en una linea de factura, osea bajé un nivel), y luego vuelvo a subir para leer la factura y darle el dato que necesite de esa factura anterior donde compró el artículo especificado.

No soy un experto en el tema, pero espero alguno de esos ejemplos te sirvan mas adelante o incluso si está planteado tu caso, pues te ahorres siempre esos cargar lista…

Saludos


([N4] gontorre) #6

Gracias Humber, leyendo tu mensaje se me ocurren bastantes situaciones en las que puedo aprovechar el tema de los punteros.

De todas formas en este caso concreto la situación es la siguiente:

Estoy en una línea de un pedido y al grabar la línea necesito calcular un campo (CANTIDAD_PENDIENTE) de la misma tabla DETALLE que se calcula con una función que necesita:

  • El valor anterior de CANTIDAD
  • El nuevo valor de CANTIDAD
  • El valor anterior de CANTIDAD_PENDIENTE
  • Las existencias actuales (Esto lo tengo resuelto con un puntero indirecto real a EXISTENCIA)

El objetivo es hacer el cálculo en el proyecto de datos en un trigger de la tabla DETALLE anterior a la modificación. Pero no veía la manera de conocer los valores anteriores de CANTIDAD y CANTIDAD_PENDIENTE.

Al final la solución que he encontrado es hacer un Cargar Lista de la misma línea de detalle que estoy grabando resolviendo por el ID y como el nuevo registro no está aún grabado, puedo leer los valores anteriores que todavía están en disco.

Lo he estado probando y funciona, pero no sé si es demasiado enrrevesado y hay otra forma de hacerlo. Con una función tipo OldVal(CAMPO) o algo así.

Un saludo

Gonzalo Torre


([N1] wikan) #7

@gontorre eso es lo que se hacía en V6 para conocer el valor anterior.

De todas formas si el pedido lo pasas a albarán o factura y necesitas saber la cantidad pendiente.
Haz una actualización desde la línea de albarán o factura a la línea de pedido de la que proviene y acumulas la cantidad de la línea.
Con esto, vas actualizando la cantidad pendiente o servida que tienes de un pedido


([N3] pacosatu) #8

Hola gontorre.

Aparte de toda la funcionalidad que tiene Velneo con los punteros y actualizaciones, tú has planteado una cuestión interesante: ¿cómo acceder a los valores anteriores del registro en un trigger?

Tu solución de “Cargar lista (ID)” es correcta, pero te propongo otras soluciones que quizás siguen mas la filosofía de Velneo de implementar todo en la misma tabla.

  • 1ª opción - Crea un Puntero a maestro OLD_VALOR de la tabla LINEAS a sí misma y como Valor inicial del campo pones el valor #ID. Así a través del puntero #OLD_VALOR tienes acceso a los valores en disco.
  • 2ª opción - Crea un Puntero Indirecto Real o Virtual OLD_VALOR enlazando a la misma tabla LINEAS resolviendo el puntero por el índice ID. El resultado es el mismo, con #OLD_VALOR puedes acceder a los datos en disco.

A mí me gusta más la opción “Indirecto Virtual OLD_VALOR” porque puedes aplicarlo a cualquier tabla aunque ya tenga datos.
Si solo usas #OLD_VALOR en los Triggers, la resolución de los punteros se hace siempre en 3º plano y es muy rápida.

De esta forma encapsulas en la tabla la funcionalidad para obtener el OldVal() de cualquier campo.

Por supuesto, pruébalo antes de implementarlo porque una cosa es la teoría y otra …

Saludos
Paco Satué


([N4] gontorre) #9

Buenos días

Wikan, la funcionalidad que estoy implementeando no se refiere a la cantidad pendiente de servir al pasar de pedido a albarán. Se trata más bien de ir discriminando, a la hora de hacer un pedido, las referencias de las que tengo stock de las que no tengo stock. Es un sistema de stocks virtuales. El pedido puede tener todo el material diponible (con lo cual lo podré entregar todo) o que me falte algo en stock (con lo que el pedido quedará pendiente de recibir material de proveedor)

Paco, me ha parecido muy elegante tu idea del “puntero al pasado” para saber los valores enteriores del registro en el que me encuentro. Lo voy a probar y os cuento como va.

Gracias a todos y un saludo

Gonzalo Torre


([N4] gontorre) #10

Pues ya lo he probado y funciona de maravilla.

Esta solución también me sirve para otro caso que tengo que hacer, que es un log de las modificaciones que se han hecho en ciertos campos de las líneas de detalle por usuario en el que tengo que guardar el estado del registro antes y después de la modificación.

Gracias por las ideas.

Un saludo

Gonzalo Torre