AX7 - 3/5 Lookup por código

En este post explicaremos cómo crear un lookup por código.

Un lookup por código no es más que una query que realiza un consulta select a una o más tablas, como os imaginaréis al ser un select se podrá realizar rangos a la query.
Los campos que mostrará este desplegable los indicaremos nosotros, estos campos pueden estar relacionados con la tabla principal o si la query tiene más de una tabla de estas tablas secundarias, igualmente el desplegable podrá mostrar campos que no están las tablas, esto lo podremos hacer utilizando métodos display.
El desplegable lo crearemos con la clase SysTablelookup, esta clase requiere que le indiquemos la query a utilizar y los campos que mostrara el desplegable.

Todo esto lo veremos en este post.

Empecemos. Como en los ejemplos anteriores, crearé un lookup que me muestre información de la FarmTable, lo más lógico es que si vamos a crear un método lookup para esta tabla éste, esté en la misma tabla.

Creación del método Lookup:

Nos dirigiremos al nodo métodos de la tabla y seleccionaremos new.



En la siguiente imagen está el código que he utilizado para el lookup,



Lo importante que se debe entender de los lookup por código, es que requieren de una query de dónde se sacarán los datos a mostrar. En la anterior imagen se puede ver que el lookup tendrá una query que mostrará todos los registros de la FarmTable.

Una vez tenemos la query sólo nos faltará indicarle los campos que mostrará;  eso lo hacemos mediante la función addLookupField de la clase sysTablelookup. En el ejemplo mostraremos los campos FarmId y description.

Como entenderéis, para añadir más campos, simplemente deberemos crear otra línea como las existentes.

Por Ejemplo:

SysTablelookup.addLookupField(fieldnum(FarmTable, inventLocationId), true);

Esto no lo he comentado, pero el lookup devolverá el primer campo que se añada; en la imagen se ve que es el FarmId, en caso que quisiéramos especificar que será otro campo el devuelto deberemos agregarle el valor True al método addLookupField. (sólo se puede devolver un campo)

Para probar este lookup en el formulario agregamos un control de tipo string y se ha anulado el método lookup como se ve en la imagen.




En la imagen anterior se ve el aspecto del formulario, el cuál, consta de un control llamado Granja y un grid con los registros de la tabla FarmTable.

Para sobrescribir el método lookup del control sólo debéreis desplegar el submenú en el nodo métodos; seleccionar Override; y seleccionar lookup.





Una vez anulado el método se nos mostrará algo similar a lo que se ve en la imagen.




En estos momentos este control no está asociado a ningún DataSource ni extiende de ningún extended Data Types, por esa razón no realizará ningún lookup.

Lo que haremos será llamar en este método a nuestro lookup.



La sintaxis aunque pueda parecer extraña tiene su lógica:

FarmTable::farmTablelookup(this);

Lo que estamos haciendo es llamar al método estático farmTablelookup que se encuentra en nuestra tabla FarmTable, y le pasaremos por parámetros el this, que para este caso el this es el control de tipo string que nos creamos, si revisáis el código del lookup veréis que recibe por parámetros un control que también deberemos pasárselo a la clase, para que ésta sepa en que lugar a de desplegar el lookup.

Al probar vemos que funciona perfectamente:




El lookup muestra los dos campos que le indicamos en nuestro método.



Agregar un rango a la query de nuestro lookup.

Si recordáis en el post anterior creamos un campo active para indicar si la granja está activa, bien, pues ahora modificaremos el método lookup de nuestra tabla para agregarle un rango a la query para que muestre sólo los activos.




Aquí tenemos el grid con los registros que tiene la tabla y se puede ver los que están activos.




Al desplegar se ve sólo los activos.






Agregar un rango con un valor pasado por parámetros:


Hemos visto que al fin y al cabo el desplegable proviene de una query, así que esa query puede ser filtrada por algún dato, cómo hemos hecho con el campo active.

Ahora le pasaremos por parámetros un almacén que posteriormente lo utilizaremos para filtrar la query.

En la imagen se puede ver el código utilizado.



Ahora en mi Grid anularé el método lookup




Eliminaremos o comentaremos el super del lookup y lo sustituiremos por una llamada al método lookup pasándolo por parámetros el almacén.


Nota: Al eliminar el método lookup eliminamos la funcionalidad lookup por defecto que tenga el sistema, ya sea porque el campo tiene una relación por tabla o vía EDT.


En la imagen se ve cómo funciona el desplegable ya que el registro actual tiene como almacén el valor '11' y sólo muestra estos.






Añadir un método display al lookup

Hemos visto que el desplegable nos muestra los campos que nosotros le indicamos por código, pero también existe la posibilidad de mostrar campos que no se encuentren en la tabla que tenemos agregada en nuestra query.
Si nos fijamos en las distintas posibilidades que nos brinda la clase sysTableLookup veremos que existe un método llamado addLookupMethod, como su nombre indica, este método nos permitirá agregar a nuestro desplegable métodos display.





Como veréis en la siguiente imagen he agregado un método a mi desplegable.



Nota: La función de este método display es mostrar el nombre del almacén del registro actual.

Nuevamente llamaremos al lookup.



Ahora veremos en el desplegable como aparece el nombre del almacén.





Añadir otra tabla a la query del lookup

El último ejemplo que voy a realizar para que se entienda las posibilidades de los lookup por códigos es un join con otra tabla en la consulta.


En la imagen anterior se ve que he agregado la tabla FarmTrans para que la consulta me muestre las FarmTable que tengan registros en la FarmTrans.

Nota: En caso que la relación hubiera sido hecha con un Join podríamos haber agregado campos de la FarmTrans para que se mostrasen en el desplegable.


Aquí vemos los registros de las tablas.



En el desplegable veremos que sólo se muestran los registros que tiene transacciones.







Comentarios