Lentitud en formularios

Hola, llevo un tiempo que en una aplicación cuando estamos facturando, en el fichero de lineas si te pones a escribir un texto, las letras van apareciendo con cuentagotas o de golpe, es decir, le ha entrado una lentitud pasmosa, esto puede ser por los campos formula??

En caso de ser así, esto se resolvería llevándomelos a tablas de extensión, o seguiría teniendo el mismo problema, como puedo acelerar la entrada de datos en el formulario???

Eso me pasaba a mi al principio con variables globales en disco.

Hola:

Es probable que sea por los campos fórmula… Como apunta synetic las variables globales también ralentizan.

No olvides revisar también singulares de plural que puedas tener en el formulario y carga de plurales en otras pestañas (con el evento on show puedes resolver la carga de los plurales en otros formularios)

Un saludo

@GSI

Ampliando un poco la información de los compañeros, podemos evitar o controlar el cálculo de las fórmulas haciendo uso de las instrucciones siguientes:

- Modificar campo solamente

- Calcula campos dependientes

Un saludo,

No utilizo variable globales, si hay bastantes formulas, y se muestra una imagen que normalmente esta vacía, hay alguna forma de solucionar la ralentización del formulario por los campos formula.

Si los llevo a una tabla de extensión se soluciona el problema ???

En cuanto a lo de “modificar campo solamente” este control que yo sepa no esta disponible en el formulario, ni puedo controlar que se recalcule sólo cuando acepte.

A los controles no les asignes campos, sino variables locales del formulario. Al aceptar, ejecuta un manejador de evento que asigne esas variables a los campos y guardar ficha.

Saludos.

@GSI

“Modificar campo solamente” y “Calcula campos dependientes” son instrucciones de proceso que sí están disponibles en los formularios y que puedes emplear mediante el manejador de eventos. Distinto es que solucione tu problema.

Te paso la url de Jesús Arboleya donde precisamente realiza un ejemplo de uso de estas instrucciones.

http://jarboleya.com/2013/03/15/pildora-5-optimiza-las-altas-y-modificaciones-de-registros-que-tengan-muchos-campos-formula-o-con-contenido-inicial/

Un saludo,

Llevo varios días investigando la optimización y leyendo todo lo que encuentro en el foro, ahora se me plantea otra pregunta:

En la tabla tengo diversas actualizaciones de datos, si a todas les pongo como condición que no se ejecute la actualización si el valor es cero, realmente no se realiza el proceso de actualización y se gana tiempo???

Alguna experiencia que compartir.

Buenas,
tienes funciones en condiciones de visibilidad o de activo? porque eso relantiza de la manera que comentas.

Tambien como ya han comentado, cuidado con los singulares de plurales pués penalizan una barbaridad.

saludos,

Santi.

Hola, GSI.

Me da la impresión de que tocar las actualizaciones no te va a ayudar. Las actualizaciones se lanzan al guardar / crear el registro, pero no cuando lo estás editando, así que no explican la lentitud que estás experimentando.

Como te han dicho varios por ahí, algunas fuentes de lentitud son:

  • Uso de variables globales directamente en el formulario (o en las condiciones de visibilidad/activo)
  • Utilizar muchas condiciones de visibilidad/activo
  • Tener muchos campos fórmula o campos con contenido inicial, especialmente si dependen de maestros o, mucho peor, de enlaces singular de plural. Una manera de paliar esto es indicar, en los controles en los que introduces datos, el estilo “Retardo señal valueChanged”. Eso hace que no se recalcule todo “a cada tecla que pulses”, sino 500 ms después de pulsar la última tecla, optimizando la actualización de fórmulas o condiciones iniciales.
  • Utilizar eventos “tecla pulsada, tecla soltada”

No es fácil poder dar más sugerencias sin poder ver el formulario en cuestión.

Quiero puntualizar que esta lentitud en la entrada de datos de formularios ha coincidido con la versión 7.14, puede ser casualidad, pero ya me paso con la 7.12 hasta que salió la 7.12.1 que me volví loco buscando errores porque se cortaba el vserver. ¿ a alguien le esta pasando ?, por supuesto en cloud.

En cuanto al tema que nos ocupa, no uso variables globales para nada, prácticamente no hay condiciones de visibilidad en los campos, si hay eventos, pero pocos, lo que si utilizo en los eventos (¿puede ser el problema?) en condiciones “IF” en las que las variables las cojo el fichero maestro, estoy trabajando con un submaestro.

Esto me ocurre en la entrada de líneas de albaranes, facturas, etc., algo que hasta ahora funcionaba muy bien…

Buenos días.

Actualmente tengo la Version32, y me esta pasando lo mismo, es lento al cargar el Formulario de Venta, donde tengo 2 Casilleros, que guardan en una variable global el ID de categoría para luego mostrar en el segundo Casillero Productos todos aquellos que correspondan a la categoría antes seleccionada… Porque variable global?, no pude conseguir que tome como variable local el ID de Venta y desde este agregar los productos…

Como obtengo la variable local de otro casillero pero que esta en el mismo formulario?

También tengo varios botones que se visualizan siempre y cuando se den ciertas condiciones…
Ejemplo; si existe productos a enviar, aparece Enviar comanda. Si no hay productos pendientes de entregas se visualiza Generar Cobro o Imprimir Pre-Cuenta, entre otros 4 botones mas condicionadas en su visualización…

Y teniendo en cuenta que me pasa lo mismo, significa que Velneo no soluciono estos puntos?

Atte.

Como estas GSI

Consulta… Actualmente utilizo 2 variables globales, uno para la carga del producto y otro el id de categoría, del cual se alimenta otro casillero productos que filtra a partir de id_categoria.

Para no usar variable globales, como obtengo una variable local de un casillero a otro que están en el mismo formulario???

Atentamente…

A mi me sucedía algo similar en un formulario (adjunto captura con datos de prueba).
Cuando quería escribir el precio a mano tardaba una eternidad.
Sabía que era culpa mía, por mi programación. ¿Porqué lo sabía? Es que no podía ser normal.


En la captura se ven a la derecha campos de precio por cantidad (dentro de otro formulario en una vista de datos). Cada uno de ellos con los decimales controlados por dos variables globales en memoria. Más de 20 referencias a 2 variables globales. En realidad todos los precios que se ven.

Reemplacé todas las globales por locales pero eso no se notó en absoluto.
Cuando quitaba la vista de datos con los escalados de precio ahí se notó como el doble de rapidez pero a pesar de todo seguía lento y no era cuestión de quitar los precios por escalado, claro.
Después de probar y probar pensé: “Siempre te olvidas de usar la base de datos para programar.”
Entonces repasé las conexiones de evento del formulario de escalados. Ahí tenía 12 conexiones que llamaban a 6 eventos. Y algunas conexiones y eventos más, ejem.:blush:
Miré qué hacía ahí y era una sola línea que calculaba cada uno de los campos precio en base a los demás campos. Asignaba a precio esto en concreto, bajo un IF si la cantidad era >0.
choose(#PO1,choose(#TC1=“D”,net(#PRE, #PO1),choose(#TC1=“I”,(#PRE*(1+(#PO1/100))),(#PRE/(1-(#PO1/100))))),#PR1)
Así 6 veces. Y los campos se ocultaban y mostraban automáticamente al meter cantidades desordenadas o al poner a cero la cantidad 3, ocultando todo lo que hay después. Para que todo fuese más agradable y comprensible al usuario (o eso imagino).
En realidad, montones de condiciones de visualización:

Como puede verse, los últimos campos tienen un montón de condiciones en función de los demás campos. Si esto está de pena, cuando vaya al baño echaré la culpa mea-ndo.
Decidí llevarme el cálculo del choose al campo correspondiente en su tabla. Después de mover todo y quitar eventos y conexiones fui a borrar una variable que sobrar y vDevelop dijo:
“Que te lo has creído chaval. Ahora me largo, tiro esa chapuza y lo vuelves a intentar todo.”
Se cerró sin más y tuve que repetir. :face_with_symbols_over_mouth::rage::angry: A ver si me tranquilizo. Ya. Esto es de otro hilo.
Decía que, tan solo llevarme ese choose de un evento asociado a una conexión que se disparaba al cambiar el valor de una cantidad a la tabla correspondiente y quitar los eventos y conexiones ya obtuve una aceleración muy agradable de sentir.
Oh, me faltó señalar que además de todos los campos que se ven con precio, hay otros tantos por debajo con PVP impuestos incluidos que también se ocultaban, actualizaban, etc si bien solo a efectos de verlos y sin campos asociados a la tabla que, considerando el éxito, podría añadir campos fórmula etc.

Bueno, pues decía (por descuido con la cuenta de mi compañero Victor) haber encontrado solución a mi problema de ralentización. Pero no observé que la base de datos informaba de (posible) error redundante por meter en la fórmula de contenido inicial de los campos el campo a modificar. Aunque parecía funcionar bien en el uno a uno (tocar un registro en formulario) sobre la rejilla avanzada era insufrible de lenta.

Seguí esta tarde un poco más a locura total. Quitando la vista de datos, desactivando y activando eventos, quitando todas las conexiones de evento … ¡ y seguía ralentizando !
Suponía que el fallo estaba en la base de datos y ya encontré dónde.

Para todos aquellos que usamos vERP os diré que la función POR_IVA de la plantilla vERP causa MI problema. Aunque está en la B.D. de vERP no la utilizan, a no ser en el ecosistema.
El caso es que si la retiro de los dos campos fórmula que la llamaban va normal, rápido. Quizá en 3P no se note pero en el interfaz del usuario y rejillas penaliza una barbaridad.

Y da igual si tengo montones de conexiones y de eventos y variables globales en memoria. Eso no era la causa en mi caso.

Contenido del campo fórmula #POR_IVA:
fun:POR_IVA@cntt_dat.dat(#ART.REG_IVA_VTA, #EMP, currentDate())

Contenido del campo fórmula #PRE_PVP:
round(#PRE_NET*(1+(fun:POR_IVA@cntt_dat.dat(#ART.REG_IVA_VTA, #EMP, currentDate())/100)),#EMP.DEC_IMP)

Código dentro de la fórmula POR_IVA de la B.D.:
// Rem ( Devuelve el % de IVA según parámetros )
Cargar lista ( EMP_M@cntt_dat, ID, EMP, , , )
Recorrer lista solo lectura
Set ( POR_IVA, choose( FCH < #EMP.FCH_CHG_IVA,
choose(REG_IVA=“G”, #POR_IVA_GEN_ANT,
choose(REG_IVA=“R”, #POR_IVA_RED_ANT,
choose(REG_IVA=“S”, #POR_IVA_SUP_ANT,
choose(REG_IVA=“E”, #POR_IVA_ESP_ANT,
0)))),
choose(REG_IVA=“G”, #POR_IVA_GEN,
choose(REG_IVA=“R”, #POR_IVA_RED,
choose(REG_IVA=“S”, #POR_IVA_SUP,
choose(REG_IVA=“E”, #POR_IVA_ESP,
0)))),
) )
Set dato de retorno ( POR_IVA )

Ehm. Solo falta ver si encuentro cómo hacer que funcione mejor.

Edit: Conseguí hacer funcionar rápido el formulario eliminando el campo fórmula #POR_IVA y reemplazándolo por una variable cargada durante el post inicializado. La rejilla mejoró un poquito por haber eliminado el campo #POR_IVA. Pero poquito para ser rejilla avanzada.