Etiqueta

18 agosto 2015

Polimorfismo en Omnis

Una ventaja de usar encapsulación en objetos con Omnis, es la posibilidad de que éstos puedan reaccionar de manera diferente ante un mismo mensaje. Veamos un ejemplo. Supongamos que disponemos de tres ventanas diferentes con información relativa a la actividad de nuestros clientes y una cuarta ventana con la lista con todos ellos, la idea es que tras pulsar sobre la línea de un cliente cualquiera, pueda reflejarse la información pertinente sobre las restantes tres ventanas. Este evento deberá enviar un mensaje a las otras ventanas con la información del cliente seleccionado, por su parte, cada una de ellas deberán reaccionar de manera diferente: La primera deberá mostrar la dirección del cliente (Address list) y otros detalles, la segunda (Invoices) deberá mostrar todas sus facturas, mientras que la tercera (Delivery notes) deberá mostrar una lista con todos los albaranes entregados.


Lo mejor que podemos hacer para enviar el mensaje a todas las instancias-ventana, (en nuestro caso a todos los objetos del cliente), es empezar primero por construir un método público para cada ventana, el cual será receptor de nuestro mensaje. Para evitar que se nos pueda olvidar alguna de las ventanas implicadas, podríamos optar por crear un clase común con un método público denominado “$setCustomer”, a fin de que sea la superclase de todas las ventanas implicadas. El método no contendrá código alguno, excepto el comentario sobre que éste puede ser anulado (desheredado). Después, (en cada subclase ventana) podremos observar éste mismo método mostrado en color azul y que por tanto podremos “desheredar”. El método deberá contener el parámetro “pCustID”, éste nos permitirá (en función de la ventana de que se trate) cargar los datos generales, datos de facturas y albaranes localizados en la base de datos, según en el identificador (pCustID) pasado a la ventana.


Ahora sólo nos falta saber, cómo enviar el mensaje desde la ventana con la lista de clientes, hacia las otras instancias-ventana. Para ello utilizaremos el método “$sendall” que (como sabemos) permite enviar un mensaje a todos los miembros de un grupo. En nuestro caso, lo escribiremos dentro del método “$event()” correspondiente a la lista de clientes (Customer list):

On evClick
    Do $iwindows.$sendall($ref.$setCustomer(ivCustomerList.ID))

Tras un clic sobre la lista de clientes, se enviará un mensaje a todas las instancias-ventana abiertas, para que sea ejecutado el método “$setCustomer()”, pasándose el ID del cliente seleccionado.

Tenga en cuenta que Omnis podrá mostrar un mensaje de error, en el caso de que alguna de las ventanas abiertas no contenga el método “$setCustomer”. Pero no hay que alarmarse, pues existen varias posibilidades para cambiar este comportamiento. Una modo sencillo, sería ir a las “Prefs” (Preferencias) de la biblioteca y cambiar su propiedad “$reportnotationerror” por “kFalse”.

Otra posibilidad, es enviar el mensaje sólo a los objetos que contengan el método “$setCustomer”. Para ello, deberemos añadir un parámetro adicional al “$sendall” el cual actuará a modo de filtro, enviando el mensaje sólo a las instancias que lo contengan:

On evClick
   Do $iwindows.$sendall($ref.$setCustomer(ivCustomerList.ID),
      $ref.$methods.//$setCustomer//)

Las dos barras invertidas dobles, permite indicar a Omnis, cual es el nombre del método que buscamos.

No hay comentarios: