Capturar señal desde rejilla insertada en formulario


([N1] Spicer) #1

Amigos,

Tengo un formulario con dos rejillas insertadas mediante sendas vistas de datos.
Quiero que al realizar una acción, se dispare un proceso que inserte un dato en la segunda.

Lo lógico sería hacer esto mediante un botón dentro del formulario, para que un manejador de evento lea el dato de la primera rejilla, haga sus cosas, e inserte el resultado en la segunda. Sin embargo, por motivos estéticos, me complica poner un botón en el formulario, y me gustaría que esto sucediera al seleccionar una acción del menú de la primera rejilla.

En lo que estoy topando es que si pongo un conector de evento en el formulario, de tipo “Señal disparada”, asociado a la vista de datos, no recoge el evento, y por tanto, nada sucede.

¿Hay alguna forma que una rejilla en un formulario le “avise” a su formulario padre que hubo un evento?

Muchas gracias


([N1] Daniel) #2

Buenas, no soy muy experimentado en velneo, pero creo recordar haber hecho algo parecido anteriormente.

Prueba a crear una conexión de evento sobre la primera vista de datos (señal: item simple-click). Como la señal la lanzas del mismo formulario que tiene las dos vistas de datos, creo que no tendras problemas al pasarle el dato a la segunda vista de datos.

En el manejador de eventos debes de usar la instrucción "Interfaz: procesar (y que el control sea la primera vista de datos).
En la misma instrucción te pregunta qué fichas quieres procesar, si las seleccionadas o todas. Así podrás obtener el valor de la rejilla incrustada.

Saludos.


([N3] pacosatu) #3

Hola Spicer.

Planteas una cuestión interesante, que en otros entornos de programación sería algo trivial, pero en Velneo no está bien resuelto.

  • Las señales emitidas desde una Acción de la Rejilla solo pueden ser capturadas por la propia Rejilla.
  • Desde una Rejilla (Vista de Datos) no se puede ejecutar un Manejador de evento del formulario contenedor y mucho menos un Manejador de otra Vista de Datos.

Para tu caso concreto, te cuento lo que yo hago, que como siempre es la típica chapucilla a la que recurrimos con javascript:

  • Ejecuta la Acción del botón de la Rejilla que Dispara la señal
  • Captura el evento Dispara señal desde la Rejilla asociando un Manejador de evento
  • Desde el Manejador de evento de la Rejilla ejecuta un Manejador Javascript que: obtenga la referencia al formulario contenedor parentDataView() y ejecuta la función startTimer() --> parentDataView().startTimer(100).
  • En el evento Timer del formulario contenedor ya se puede colocar el código nativo Velneo que queramos:

theRoot.dataView().stopTimer() <-- Este código javascript es necesario para detener el Timer
Interfaz: Procesar (Lista1, todas) <-- Ya podemos procesar la Rejilla desde el formulario mediante una señal de dicha Rejilla

Pruébalo
Saludos
Paco Satué


([N1] Spicer) #4

Estimado Paco,

Efectivamente, creo que es una real tontera, que un form contenedor no pueda ‘reconocer’ las señales emitidas desde sus subobjetos. Sin embargo… ¡Qué buena chapucilla! de verdad, mil gracias, jamás se me hubiera ocurrido. Lo probaré apenas tenga minuto.

Una pregunta… si entendí bien, en el manejador de evento vJavaScript de la rejilla, debo poner sólo dos líneas, que serían
parentDataView().startTimer(100)
theRoot.dataView().stopTimer()

…¿estoy bien?

Mil gracias, de nuevo. Debieran investirte como Presidente Honorario, o algo por el estilo. Yo al menos apoyo la candidatura.


([N3] pacosatu) #5

Hola Spicer.

Gracias por la propuesta de investidura, solo pretendo animar un poco el foro.

En cuanto al código, en la Rejilla solo pones en marcha el Timer del formulario con parentDataView().startTimer(100). En el formulario es donde lógicamente detienes el Timer en la primera línea del manejador con theRoot.dataView().stopTimer(), por supuesto llamando a otro Manejador javascript.

¿Si tienes varios controles, cómo identificas la Rejilla que ha emitido la Señal al estilo de EVENT_SENDER_ID?
Puedes fijar una variable local del formulario con el Nombre de la Rejilla con parentDataView().root().setVar(“EVENT_CONTROL_ID”, “Lista1”)

Saludos
Paco Satué


([N4] Infortic) #6

Tienes otra posibilidad parecida spicer, mas “sucia” pero que funcionaría.

Tienes un manejador en el form llamado PROCESO que es el que quieres llamar desde la rejilla.

Te creas un botón invisible con ejecutar manejador PROCESO y lo llamas BTN_PROCESO.

Desde el manejador js de la rejilla haces:

theRoot.dataView().parentDataView().control(“BTN_PROCESO”).click();

Ten en cuenta una cosa, si la rejilla está en un alternador de vista, parentDataView() hará referencia al alternador y no al form superior, en este caso deberás usar parentDataView().parentDataView() para acceder al formulario superior.

La forma que comenta Paco se basa en el mism concepto pero es más limpia, ya que no hay que poner un botón que no viene a cuento


([N1] Spicer) #7

Estimados Paco e Inforitc,

Muchas gracias por vuestra inestimable ayuda, estoy seguro que con estos tips me las arrreglo bien

Saludos,