FILTROS



Nodo para realizar filtros a una colección. Estas búsquedas serán mostradas en el GRID y podrán ser consultadas, borradas o modificadas según los permisos del usuario.

El nodo asfilter siempre pone un “and” para los filtros, lo cual hay que tener en cuenta, por si pudiese interferir con el filtro de la colección. Para evitar esto, se utilizarán paréntesis.


Como punto a tener en cuenta, actualmente los filtros complejos se realizan mediante colecciones especiales.
Los pasos a seguir para realizar una colección especial que disponga de los datos necesarios sería de la siguiente manera:

  • Creación de una colección sin SQL, con el atributo special=“true”. Ese atributo indica a la maquinaria que no debe buscar ni dar error por no tener el campo SQL cumplimentado.
  • Realizar una llamada a dicha colección desde el appwizard con el atributo mode=“1”, para indicarle que se muestre en modo edición nada más llamarla.
  • Dentro de la colección, se pondran varios prop, que serán con el MAP_ delante, de tal forma que la maquinaria sabe que dichos campos no existen en base de datos.
  • En la colección, se creará un content, que será la colección que tiene los datos que realmente vamos a visualizar. Esta colección sería la que debería tener el nodo asfilter si la hubiesemos realizado de la forma más sencilla.
  • Se pondrá algún botón para realizar la búsqueda en el content que se ha creado para mostrar los datos.


ATRIBUTOS
fontsize=“Valor” : Define el tamaño de la letra (en puntos) que se mostrará en el filtro.
sort=“true-false” : Cuando se ejecute el filtro, ordenará el resultado por el campo filtrado (sort=“true”), o mantendrá la ordenación que había previamente (sort=“false”).
left=“Valor” : Indica la separación o margen izquierdo que tendrán los primeros controles de cada línea.
lines: Indica la cantidad de líneas de controles que debe ocupar el filtro en pantalla.



Nodo donde se definen los campos por los que se puede filtrar una colección.

name=“NombreAccion” : Indica el nombre del filtro, no puede haber repetidos en el mismo ASFILTER.
fldname=“Campo” : Indica el nombre del campo de la colección que se usará para filtrar.
oper=“operacion” : Indica la condición en formato sql, que va a realizar el filtro.
width=“Valor” : Indica el ancho del campo en pantalla.
tooltip=“Valor” : Este atributo contiene un texto que será asignado al tooltip del control que se muestre en pantalla cuando se esté editando este campo.
newline=“true-false” : Indica si el siguiente campo del filtro estará o no en una nueva línea.
value=“Valor” : Indica un valor por defecto que aparecerá en ese campo del filtro.
dropcoll=“Coll” : Se usa para llamar a una colección de donde saca los datos, y los muestra como un combo.
lmargin=“Valor” : Indica los espacios de margen izquierdo que se le van a dar al campo del filtro.
labelwidth=“Valor” : Indica el tamaño de la etiqueta del campo del filtro.
type=“N-T -TL | …” : Indica el tipo de dato en la Base de Datos.
applyto=“##MACRO1##”: Este atributo cuando se especifica contiene el nombre de una o varias macros de usuario separadas por comas.



  <asfilter fontsize="8" left="12" sort="false">
   <field name="TEXTO" fldname="TEXTO" oper="##FLD## LIKE '%##VAL##%'" width="15" tooltip="Ejemplo Texto" newline="false">TEXTO</field>
   <field name="NUMERO" fldname="NUMERO" oper="##FLD## = ##VAL##" width="4" tooltip="Numero Igual a">Número igual a</field>
   <field name="FECHA1" fldname="FECHA" oper="##FLD## &gt;= ##FFVAL##" width="8" newline="false" tooltip="Fecha Inicio">FECHA DESDE:</field>
   <field name="FECHA2" fldname="FECHA" oper="##FLD## &lt;= ##FTVAL##" width="8" newlineX="false" tooltip="Fecha Final">FECHA HASTA:</field>
   <field name="NUM1" fldname="NUMERO" oper="##FLD## &gt;= '##VAL##'" width="8" newline="false" tooltip="Número desde">Num.Desde:</field>
   <field name="NUM2" fldname="NUMERO" oper="##FLD## &lt;= '##VAL##'" width="8" newline="false" tooltip="Numero hasta">Num.Hasta:</field>
   <field name="NOMBRE" fldname="MAP_NOMBRE" oper="##FLD## like '##VAL##%'" width="15" dropcoll="ColeccionAMostrar">Lista</field>
   <field name="MAP_BIT" fldname="MAP_BIT" type="N" oper="##BIT##(##FLD##,##VAL##)" width="2">OPCION1(1) o OPCION2(0):</field>
  </asfilter>


Dejar el código anterior como está, y ahora vamos comentando la jugada una por una, o dos por dos en el caso de fecha desde y fecha hasta o número desde y número hasta.
Es necesario mencionar también que para las fechas siempre usamos datetime y que las macros FTVAL y FFVAL lo que hacen es añadir la hora al campo de búsqueda.

Revisar si están bien las comillas simples cuando comparamos con ⇐ o >=.

Para la línea del dropcoll especificar que se hace cuando hay pocos valores en la colección llamada, si hay muchos se pone un campo de búsqueda de texto normal y corriente.

Ponemos también un ejemplo de filtrado de campos NC “todoterreno” de los que valen en PDA y en todas partes.

Comentamos también que si queremos filtrar por un campo de otra colección filtraremos por el MAP_LOQUESEA, el IDLOQUESEA para el usuario como si no existiese.

Estos son los campos por los que se puede filtrar: texto, numérico, real, NC, campo MAP_ enlazado de otra colección y datetime.
No se puede filtrar por ejemplo, por un campo foto de PDA, para ello se pueden buscar otras soluciones que no son tan inmediatas. Para el ejemplo anterior se pondría un campo que el usuario no ve ( visible=0 ), que tomaría valor 1 cuando se ejecutase el nodo onchange del campo foto.

Notas:

1.- En algunos field está el atributo newlineX=“false” o Xnewline=“false”. Para omitir un atributo, en muchas ocasiones se le pone una 'X' al principio o al final del atributo y así la maquinaria no lo detecta como un atributo válido y NO lo tiene en cuenta.

2.- En el atributo oper hay caracteres como '&lt;' ó '&gt;' ó '%'.

  1. '&lt;' y '&gt;' se traduce en xml por '<' y '>' respectivamente.
  2. '%' es igual que la sintaxis SQL del like:
    • Si se pone al comienzo '%##VAL##' se traduce por: que termine por…
    • Si se pone al final '##VAL##%' se traduce por: que comience por….
    • Si se pone al comienzo y al final '%##VAL##%' se traduce por: que contenga…


En el asfilter pueden ser utilizadas diferentes macros, como:

##FLD##: Se utiliza en el atributo oper, y toma el valor del campo que hay en el atributo name, que es el campo por lo que vamos a hacer la consulta.
##VAL##: Se utiliza en el atributo oper, toma el valor que pone el usuario en el campo de búsqueda.
##FTVAL##: Se utiliza en el oper, y es para la búsqueda de fechas, es para los ⇐ al valor introducido.
##FFVAL##: Se utiliza en el oper, y es para la búsqueda de fechas, para los >= al valor introducido.
##TODAY##: Toma como valor, la fecha actual del sistema.
##LASTMONTHDAY##: Toma como valor el última día del mes.
##FIRSTMONTHDAY##: Toma como valor el primer día del mes.
##BIT##: Coge el bit necesario. Solamente puede ser utilizada en el framework de PC.




filtro1.jpg

Rellenamos el filtro y pulsamos en la LUPA.

filtro2.jpg

Rellenamos el filtro y pulsamos en Buscar o “Enter”.

filtro3.jpg

Rellenamos el filtro y pulsamos en la LUPA.

    <prop name="BTNBUSCAR" type="B" title="Buscar" group="1" visible="1" method="ExecuteNode(buscar)" />
    <buscar>
        <action name="runscript">
            <script language="VBScript">
                This("MAP_CODIGO") = Replace(This("MAP_CODIGO"), "'", "")
                This("MAP_NOMBRE") = Replace(This("MAP_NOMBRE"), "'", "")
                This.Contents("NombreDelContent").filter="CODIGO LIKE '%" + This("MAP_CODIGO") + "%' AND NOMBRE LIKE '%" + This("MAP_NOMBRE") + "%'"
	    </script>
        </action>
    </buscar>

Nótese que hemos quitado las comillas para evitar que el usuario pueda romper la SQL poniéndolas y dejar la puerta abierta a ataques de SQL injection.

Guardar el filtro anterior si fuera necesario, pues estamos sustituyendo al anterior.