Pasar variables entre formularios


([N3] Misho) #1

Buenas tardes.

He estado mirando el tema de pasar variables entre formularios pero no llego a conseguir que funcione.
A ver si alguien puede explicarme como usarlo correctamente.

Tengo un formulario principal en el que he creado un manejador de eventos con:

Crear manejador de objetos (Formulario 2)
Disparar manejador (Formulario 2)
Get variable local del objeto (la variable que quiero) (la guardo en la variable de formulario 1)

El formulario 2 tiene unas variables locales booleanas y un boton de aceptar.

El caso es que siempre obtengo un 0.

No se si es que al aceptar el otro formulario se pierde el valor del get…

Espero que haya quedado claro.
¿Podrían ayudarme?
Gracias.


([N1] info) #2

Espero poder ayudarte… Así lo hago yo…
Debes de crear la misma variable en ambos formularios.

y Usa “Set variable local de objeto”

Si necesitas mas ayuda no dudes en preguntar. Un saludo


([N3] Misho) #3

como usar set? no veo que encaje.

Desde el formulario 1 llamo al formulario 2.

El evento es en el formulario 1 por lo tanto entiendo que he de dispararlo y hacer un get.


([N3] Misho) #4

He hecho la contraria. que sea el formulario 2 el que le pasa al formulario 1 con un set pero tampoco me funciona.


([N3] veldevelop) #5

con el manejador de objetos puedes tanto recibir como enviar valores de las variables pero has de tener en cuenta que todo ello ocurre cuando disparas el objeto, por otro lado no se trata de un set normal has de usar el set del manejador de objetos. Según leo el post original el get lo haces después de disparar el objeto, has de hacerlo todo antes de disparar el objeto.

Son pequeños detalles que espero que te aclaren algo más.


([N3] pacosatu) #6

Hola Misho.

Está correcto lo que haces al principio. Seguramente el problema es que el Tipo de las Variables Locales no coincide en el Formulario1 y Formulario2.

El proceso siempre es el mismo:
CVALOR en FRM_FIJAR_VALORES es de tipo Alfa
LVALOR en FRM_FIJAR_VALORES es de tipo Booleano
CVALOR_STRING coincide con CVALOR y LVALOR_BOOLEANO con LVALOR


Crear manejador de objeto ( oValor, Formulario FRM_FIJAR_VALORES@0PS_Ejercicios_app )
Set variable local de objeto ( oValor, CVALOR, "Valor inicial" )
Disparar objeto ( oValor, No aplicable, )
   Libre
Get variable local de objeto ( oValor, CVALOR, CVALOR_STRING )
Get variable local de objeto ( oValor, LVALOR, LVALOR_BOOLEANO )
Mensaje ( "Valor devuelto: " + CVALOR_STRING + " " + LVALOR_BOOLEANO, Información, , )
Rem (Podemos volver a disparar el formulario las veces que queramos asignando nuevos valores
Set variable local de objeto ( oValor, CVALOR, "Nuevo Valor inicial" )
Disparar objeto ( oValor, No aplicable, )
Libre
Get variable local de objeto ( oValor, VALOR, CVALOR_STRING)
Get variable local de objeto ( oValor, LVALOR, LVALOR_BOOLEANO)
Mensaje ( "Valor devuelto por segunda vez: " + CVALOR_STRING + " " + LVALOR_BOOLEANO, Información, , )

Así que una vez creado el manejador de objeto (oValor) podemos dispararlo las veces que queramos, podemos Fijar (Set varia …) los valores de las variables Locales las veces que queramos y podemos Obtener (Get varia …) los valores de las variables Locales las veces que queramos.

Eso sí, siempre dentro del mismo manejador de evento.

Saludos
Paco Satué


([N3] Misho) #7

Muchísimas gracias a todos!

Como bien habéis dicho, me habéis dado los pequeños detalles que hacían que no funcionase.

Ya está funcionando y he aprendido.

Saludos.


([N2] matcas) #8

Hola, perdón por reavivar un post de hace años pero me ha quedado la sig. duda;
¿y si fuese al revés?

Si yo desde Form1 disparo el objeto Form2 y ahí guardo una variable local … puedo una vez cerrado el Form2 recuperar el dato desde Form1? o tengo que usar si o si una variable global para guardar el dato y despues recuperar esa var global desde Form1

Saludos.


([N3] Misho) #9

No entiendo muy bien el caso que propones.
Recuerdo que mi fallo era una tonteria de haber usado aun poco la instrucion “Get…” y la ponia dentro del disparar objeto, en realidad es fuera, despues de dispararlo.

Puedes enviar una variable a form2 con “Set variable local del objeto”. Una vez lo cierres, siempre y cuando sigas en el mismo evento, proceso, puedes recogerla con “Get variable local del objeto” y guardartela en la variable local que desees en form1.


([N2] matcas) #10

en realidad lo mio debe ser una tontera también porque recién estoy saliendo del nivel novato en velneo pero me explico mejor;

en una pantalla de ventas (VTA_FAC) yo quiero traer el id de una orden de trabajo (ORD_TRA) para despues procesar esa id y convertir las lineas de la orden de trabajo en lineas de venta.
el problema es que para facilitarle la vida al usuario quiero que pueda buscar por cliente las ordenes de trabajo pero desde la tabla de ENT_M (alias los clientes) no tengo acceso a la de ORD_TRA, si al reves tengo un puntero desde ORD_TRA a ENT M.
dicha esta situacion podras ver que no puedo usar un localizador por clientes que me muestre las ORD TRA de cada cliente en su rejilla… entonces tuve que fabricar un “localizador casero” que mediante un buscador por cliente trae los clientes y con una rejilla que si muestra las ord tra que tienen los clientes segun se va buscando pero al no tener relacion las tablas ent_m y ord_tra entonces tuve que hacer que desde la pantalla de ventas se lanzara el localizador casero asi
image

como veras lo resolví con una var global, pero me preguntaba si podria hacer lo mismo con variables locales y con los comandos get, cosa que no pude hacer, de ahi mi pregunta.


([N4] sergioinfortic) #11

Hola. Para hacerlo como propones sería

El formulario “casero” tendrá una variable LOCAL, por ejemplo llamada ID_ORDEN.

Simplemente tienes que hacer:

1 - El formulario “casero” tiene un botón aceptar y uno cancelar, y no sé si una variable CLT_ID con el ID del cliente en el que buscar.

Aceptar ejecuta

Set(ID_ORDEN, el valor seleccionado)
Interfaz: Aceptar

2 - El que lo llama tiene 2 variables: OK (boobleana) e ID_ORDEN_TRABAJO

3 - El disparar objeto es:

Crear manejador de objeto (loc casero)
Set variable local de objeto(loc casero , CLT_ID , #CLT)
Disparar objeto (Loc casero , No aplicable , OK)
if (OK)
Get variable local de objeto(loc casero , ID_ORDEN ,ID_ORDEN_TRABAJO)

De esta forma le estas seteando el valor de la variable (Cliente) al formulario antes de ejecutarlo y recogiendo el valor seleccionado siempre y cuando el usuario haya pulsado aceptar.


([N4] sergioinfortic) #12

De todas formas estudia la ayuda de las funciones implicadas para entenderlo mejor:


([N2] matcas) #13

Muchas gracias Sergio, tu explicación ha sido muy clara.