Wednesday, November 12, 2014

Ejecutar un método de un Form desde otro Form

En algunas ocasiones es necesario ejecutar un metodo de un formulario desde otro. Vamos a suponer que tenemos un formulario principal que llama a un formulario de detalle, como sucede con los diarios de movimiento de inventario.

El formulario detalle, puede tener una opción que modifica directamente el registro del formulario principal, y al regresar a éste lo ideal es ver la información actualizada.

La siguiente imagen muestra un formulario con dos líneas de algún diario X.









 Al presionar el botón líneas, nos vamos al formulario siguiente




 Donde al presionar "Finalizar", esperamos que el Status del formulario principal se actualice automáticamente al momento de obtener el enfoque.

Para lograr eso podemos utilizar varios métodos, en este post se explica como hacerlo a través de la invocación a un método del formulario principal desde el formulario detalle.

1. Lo primero es asegurarnos que al iniciar el Formulario Detalle, éste tenga dentro de sus argumentos el caller definido, para ello, el formulario principal debe asegurarse de pasarse a si mismo como caller (línea 09)


01 void clicked()
02 {

03      FormRun f;
04      Args args;

05      ;
06
07     args = new Args();
08     args.name(formstr('DForm'));
09     args.caller(this.owner());
10     args.record(AraHIntercompany);
11     f  =  Classfactory::formRunClassOnClient(args);
12     f.init();
13     f.run();
14     f.wait();
15    super();
16 }



2. Después se debe crear el método que debemos ejecutar en el formulario principal. (En éste ejemplo solo se actualiza la información del registro actual del DataSource)

01 void doRefresh()
02 {
03     ;
04     myDataSource_ds.reread();
05}



3. Se llama el método desde el formulario detalle.


01 void clicked()
02 {
03       Object callerForm;

04       ;
05       this.updateMainRecord(); //Aquí la actualización del registro header cambiando el status
06
07       super();
08
09    callerForm = element.args().caller(); // Aquí obtenemos el caller, de preferencia validemos antes
10    if (callerForm && formhasMethod(callerForm,identifierstr(doRefresh))) //¿El método existe?

11   {
12            callerForm.doRefresh(); // llamada al método
13    }
14
15}


Como podemos ver, es necesario declarar un objeto de tipo Object, a ese objeto le asignamos el formulario que lo invocó, luego validamos que el objeto callerForm esté inicializado y que además tenga el método doRefresh() a través de formhasMethod(), si lo anterior se cumple podemos llamar el método doRefresh() con toda confianza.

Y cuando el formulario principal tenga el enfoque nuevamente, el metodo habrá dado resultado.

 

No comments:

Post a Comment