Establecer el valor de un control desde JS


([N2] pnogueira) #1

Muy buenas.

Tengo un pequeño problema a la hora de introducir valores en controles desde JavaScript, en algunos casos me funciona correctamente y en otros no. Le he dado doscientas vueltas y no soy capaz de encontrar el motivo. ¿Alguien me puede apuntar en la dirección correcta para hacer esto? Bien sea ejemplos o tutoriales, ya que el Manual de Scripts oficial no me sirve de mucha ayuda en esto.

Aquí un ejemplo de código que funciona perfectamente:

theRoot.dataView().control( "POR_DTO3" ).value = theRoot.varToInt( "V_DTO3" );
theRoot.dataView().updateControls();

Y aquí otro ejemplo donde en el caso del control TEST_02 no funciona:

var form = theRoot.dataView();
var ctrl_test01 = form.control( "TEST_01" );
var ctrl_test02 = form.control( "TEST_02" );

ctrl_test01.setValue( 1234 );
ctrl_test02.setText( "PRUEBA" );

theRoot.dataView().updateControls();

Ni tampoco cambiando las dos últimas líneas por:

ctrl_test01.value = 1234;
ctrl_test02.text = "PRUEBA";

El control TEST_01 es de edición numérica, y apunta a un campo numérico, y el campo TEST02 es de edición alfabética, y apunta a un campo alfabético.

Es probable que se me esté escapando alguna chorrada, pero no soy capaz de verla.

Gracias por adelantado.


([N1] wikan) #2

Que necesidad tienes de hacer con javascript?

A parte de eso, si el control apunta a un campo, modifica el campo directamente, el refresco de Velneo hará el resto.

theRegister.setField(“CAMPO”, valor)

Pero mejor siempre que puedas trabaja con nativo.


([N2] pnogueira) #3

Hola wikan.

La necesidad viene de que es un valor que se calcula desde otras fuentes y se rellena en el control como propuesta al usuario que está dando de alta o modificando un registro, pero que puede modificar dicho valor antes de efectuar el alta o modificación de la ficha.

Lo haría con nativo si hubiese alguna opción para hacer esto pero, hasta donde yo se, no se puede.


([N2] pnogueira) #4

Aparte de que es una funcionalidad que me vendría muy bien en otras partes de la aplicación que estoy desarrollando o planificadas.

(Siento poner esto en un post aparte pero no me deja editar el anterior.)


([N1] wikan) #5

No se que otras fuentes tienes para rellenar la variable pero puedes anidar manejadores de eventos.
Puedes tener una principal que llame al javascript (tus fuentes) rellenar las variables y luego llamar a otro nativo que asigne el valor a los campos.

Por otro lado, si son valores propuestos al usuario, puedes ponerlo en el POS INI y así los tendrá cargados una vez abra el formulario.

De todas formas si lo quieres hacer así, según dice la documentación, updateControls trae la información del registro a los controles, es decir te va a traer el valor de los campos a los controles. Tu deberías usar updateRegister


([N2] pnogueira) #6

Bueno, después de varias pruebas he descubierto dos cosas:

  1. Utilizar la propiedad “value” o la función “setValue()” de un control solo sirve para aquellos que sean de edición numérica. Para los de edición alfabética no sirven, y si con éstos últimos usas la propiedad “text” o la función “setText()” se te mostrará el valor, pero nunca llegan a actualizar el valor de la variable o campo a la que apunta el control.

  2. A pesar de todo ello, si el campo al que apunta el control de edición numérica es de tipo enlace tampoco funcionará.

Espero que le sirva de ayuda a alguien.

Muchas gracias por tu ayuda wikan. :slight_smile:

un saludo,

Pablo Nogueira


([N3] pacosatu) #7

Hola pnogueira.

Este bug o “mal comportamiento” de la función del API setText() ya está documentado desde hace por lo menos 4 años y está en la misma situación que otros muchos bugs de Velneo, totalmente ignorados versión tras versión.

Este era mi comunicado a soporte hace 4 años, en mayo de 2014:

Los controles vinculados a Variables o a campos de Tablas deben permitir la edición en los 2 sentidos, es decir, cambiando la variable/campo o introduciendo texto desde el Interfaz.
Además, el Control Edición de Texto está para editar la Variable/Campo, de lo contrario sería de Solo Lectura.
Por otro lado y para confirmar el mal funcionamiento de setText(), deja el control con el campo Contenido en blanco y verás que también se borra el texto cuando el control pierde el foco.

Lo grave de todo esto es que debe ser uno mismo el que, a base de mucho prueba y error, llegue a la conclusión absurda de que lo que parece decir la documentación, en realidad es mentira.

Conclusión, olvídate de usar la función setText(), no funciona como debería.

Desde el API establece nuevos valores directamente a las Variables Locales (con setVar()) y a los Campos de la Tabla (con setField()).
Los controles del formulario se refrescarán con updateControls() si están vinculados a campos de Tabla y de forma automática al cambiar de foco si están vinculados a Variables Locales.

Saludos
Paco Satué


([N2] pnogueira) #8

Ok. Muchas gracias por la información Paco, me es muy útil.

Un saludo,
Pablo Nogueira