Refresco de actualizaciones


([N4] gontorre) #1

Buenas tardes a todos

Tengo una duda que necesita a los más expertos del lugar. A ver si consigo entender cuando se refrescan los campos afectados por actualizaciones. Intentaré explicar la situación lo mejor posible.

Tengo un proceso que carga un fichero TXT en el que vienen artículos y cantidades para cotizar a un proveedor. El proveedor envía en el fichero las cantidades que necesita y el sistema contesta con las cantidades ofertadas y el precio. La cantidad ofertada, lógicamente, depende del stock que haya. No se puede ofertar nada que no haya en stock.

Yo voy leyendo el fichero línea por línea y al mismo tiempo que calculo el stock hago una reserva del material que se oferta. El stock se actualiza desde la reserva mediante una actualización.

El problema viene porque dos líneas del fichero del proveedor pueden corresponder al mismo artículo. Entonces, cuando hago la reserva de la primera tengo que descontar el stock para que cuando cargue la segunda calcule la cantidad ofertada teniendo en cuenta lo que he ofertado de la primera.

El caso es que no me funcionaba. Cuando cargaba la segunda línea el stock estaba como el principio. Es como si la actualización aun no se hubiera refrescado. En cambio si compruebo los stocks al final del proceso ha descnotado todo correctamente.

Pero, y esto es lo que no entiendo, resulta que si hago un proceso que carga una línea y lo llamo desde el proceso principal en 3er plano, si va refrescando el stock en cada línea.

Ya se que suena un poco como “la parte contratante de la primer parte”, pero, ¿Alguien puede darme una explicación?

Un saludo

Gonzalo Torre


([N3] pacosatu) #2

Hola Gonzalo.

No soy un gran experto en Velneo pero creo entender lo que te ocurre.
Si la lectura del fichero y las operaciones de reserva de material las realizas desde el mismo proceso, ocurre que todo se engloba en una transacción. Cuando terminas el proceso de lectura del fichero, la transacción se confirma y todas las actualizaciones pasan a ser permanentes.
Es decir, cuando haces una primera reserva de material la actualización del stock se actualiza dentro de la transacción. En la segunda reserva de material estás leyendo un stock que está fuera de la transacción y por lo tanto no actualizado. (En este tema no puedo darte más explicaciones técnicas por la falta total de documentación al respecto).

Cuando haces la lectura del fichero en 1º plano y ejecutas cada línea en 3º plano, entonces estás creando una transacción independiente por cada llamada a ese proceso en 3º plano. Esto se cumplirá siempre que en 1º plano no ejecutes ningún comando de modificación que abra una transacción.

En resumen, el proceso sería:

  • Ejecutar Proceso1 de bucle de lectura del fichero de texto (en este proceso solo hay comandos de lectura)
    ----- Por cada lectura de línea Ejecutar Proceso2 de reserva de material
    ---------- En el Proceso2 se abre y cierra la transacción por lo que la Actualización se confirmará en el Stock

Esto lo puedes hacer todo en 1º plano, todo en 3º plano o alternando los 2 planos.
Siempre ten en cuenta que un proceso se integra en la Transacción que ya esté abierta o creará una transacción nueva cuando no exista.
Un proceso cierra siempre la transacción que él ha abierto.

De todas formas en tu proceso de lectura del fichero puedes parar la ejecución con un comando Mensaje y ver en vAdmin el estado de la Transacción y los valores del Stock.

Saludos
Paco Satué


([N4] gontorre) #3

He estado haciendo pruebas y cada vez me lío más.

  • Incialmente tenía todo en un proceso y me generaba una única transacción y no actualizaba el stock en los pasos intermedios.
  • Luego cambié a un proceso que lee el fichero y un proceso por cada línea. Como el proceso principal hacía unas modificaciones previas se me englobaba también todo en una única transacción, pero el stock sí se actualizaba en los pasos intermedios.
  • Ahora he dividido aún más el proceso y he generado uno que hace las modificaciones previas (que me crea una transacción), otro que recorre el fichero (que no genera transacción) y un proceso para cada línea. Así se me genera una transacción por cada línea y funciona bien, pero tarda muchísimo.

Con una única transacción tarda unos 30 segundos y con una transacción por línea tarda 6 minutos.


([N3] pacosatu) #4

Hola Gonzalo.

Yo intentaría diseñar una solución intermedia.
Procesar los artículos que solo aparezcan una vez en la misma transacción y los artículos que aparezcan más de una vez en diferentes transacciones para que actualizen correctamente el Stock.

Otra solución, un poco más elaborada y todo en la misma transacción:

  • Cargar el fichero en una tabla temporal
  • Multipartir por el código de Artículo
  • Cuando sysListSize > 1 leemos el Stock del Artículo y lo guardamos en una Variable Local
    ---- Hacemos la actualización del Stock en la variable Local para tener un valor confirmado

Saludos
Paco Satué


([N4] gontorre) #5

Hola Paco

Había pensado en montarlo más o menos de esa manera. Tengo que hacerlo en dos pasadas porque el código que me manda el proveedor en el fichero es el suyo, no el mío. Por eso tengo que hacer primero una pasada para asignar a cada referencia mi código de artículo y luego procesarlo y calcular los stocks que oferto.

He estado hablando con soporte y me han dicho que al ejecutarlo en 1er plano estoy leyendo el stock de la caché y hasta que no termina la transacción no se actualiza. En cambio, al lanzar el proceso de carga de cada línea en 3er plano estoy obligando a leer las existencias de disco y por eso toma el dato correcto.

Así que, aunque haya una única transacción los stocks se van actualizando durante el proceso. Eso lo compruebo porque ejecutando en 3er plano en cada pasada el stock está correcto.


([N3] pacosatu) #6

Hola Gonzalo.

Sí entendido, eso era lo lógico, que dentro de la transacción se pudieran leer todas las actualizaciones correctamente. La caché ha jugado una mala pasada en este caso.
Ya se han comentado en otros hilos los problemas con las actualizaciones, este puede ser uno de ellos que habrá que tener muy en cuenta en procesos críticos.

En cuanto a lo de englobar todo en una única Transacción, ten en cuenta que si ésta se alarga unos minutos, los stocks que están leyendo el resto de Usuarios no está realmente actualizado hasta que no termina tu transacción.
Por eso a veces es más conveniente desmenuzar el proceso en muchas transacciones, aunque tarde más, para que el resto de Usuarios de la Aplicación tenga garantizada una información actualizada.

En fin, esto ya no es Velneo sino diseño, optimización y cómo gestionar la concurrencia de la base de datos.

Saludos
Paco Satué


([N2] Mgalvezh) #7

Paco dijo “No soy un gran experto en Velneo…” jejeje


([N4] gontorre) #8

OS copio lo que me han contestado desde soporte por si a alguien le sirve:

"Se le plantea un problema en un proceso de importación de datos de un fichero de texto. Va leyendo línea a línea del fichero, lee un valor de un campo de una tabla y lo modifica.
En el fichero de texto puede venir otra línea que implique leer y modificar el mismo registro que el anterior, pero cuando lo hace le devuelve el valor que tenía inicialmente el campo, no el que se le ha asignado en una iteración anterior del bucle.El proceso lo está ejecutando en primer plano.

Al ejecutarse el proceso en el cliente (primer plano) a la hora de cargar lista y leer el registro modificado en la primera iteración, como lo tiene en caché, el registro lo lee desde la misma.
Si en lugar de usar el comando “leer ficha seleccionada” usa “modificar ficha seleccionada” forzará que se lea la ficha nuevamente de disco, con lo que obtendrá el valor real.
Si el proceso lo ejecuta en tercer plano, como no hay caché local, podrá hacer la lectura en modo de sólo lectura sin problemas"

Un saludo