FILTRAR VALORES EN UN SUBMAESTRO APROVECHANDO LA SUBINDEXACIÓN


([N4] mdelgado) #1

Buenos días,

Supongo que muchos de vosotros ya conoceréis lo que voy a decir pero, como a mi me ha venido tan bien la idea, os la paso por si alguno no lo conoce.

Pongamos un caso: "Tengo un formulario de presupuestos de cliente en el que muestro en un campo edit el cliente, pero sólo me interesa que aparezcan los clientes que son de Málaga. Para hacer esto podríamos pensar en varias fórmulas:

1) UTILIZANDO COMBOVIEW: Esta opción nos permite cargar una lista con los clientes y que esta lista esté filtrada por los valores que nos interese. El problema de usar ComboView es que no tienen una propiedad Contenido, por lo que no podemos asignarla directamente a un campo en el que se guarde el valor seleccionado...nos lo tenemos que currar nosotros.

2) CAMPO CLIENTE DESHABILITADO Y BOTÓN: La idea es que el usuario no pueda introducir el cliente directamente, evitando así que introduzca clientes distintos a los de nuestro filtro. El campo cliente aparece deshabilitado y colocamos a su lado un botón. Al pulsar el botón vamos a un panel/Localizador en el que damos al usuario la opción de seeelcionar un cliente de los fitlrados.

La opción que yo planteo es basarse en un SubIndexador. Como todos sabeis, los índices que podemos utilizar en un subindexador deben de contener como primer componente el NAME de la tabla. Lo que haremos es lo siguiente:

1) Creo un índice en la tabla cliente con un único componente NAME (Le llamaremos Clientes_filtro)
2) En la condición para Indexar del índice introducimos el valor "left(codigopostal,2)=29" (código postal de Málaga)
3) El el formulario de presupuestos, añadimos un campo Edición Alfabética con contenido CLIENTES.NAME
4) Añadimos un subindexador sobre el campo. En la propiedad índice del subindexador iontroduciremos "Cliente_filtro"

Pues eso es todo, ahora sólo aparecerán los clientes de málaga y, lo mejor, es que si la condición del índice la hacemos sobre una variable en memoria, podemos cambiar en tiempo de ejhecución para que, por ejemplo, los clientes mostrados ene l presupuesto sean una veces de Málaga, otra de Gijón, etc.

Espero que os pueda ayudar la idea...a mi me ha solucionado muuuuuucho

Saludos
Miguel D.


([N1] comercial) #2

Gracias por la info, lo probaremos...

Saludos.
Miguel.




([N1] Nacho) #3

Estas seguro que eso funciona funciona?.

No sería más lógico, crear un indice Provincia_nombre, que con tenga dos campo, la provincia y el nombre, y en el formulario, a la hoa de crear la subindexación, escoger este índice y resolver el primer campo del mismo (provincia) en ese momento.

un saludo
Nacho


([N4] velavisual) #4

Hola,
.
Mientras cumpla con el objetivo, cualquier alternativa nos debería valer. Claro, siempre debemos buscar lo más sencillo y aprovechar las características que Velneo nos brinda.
.
En este caso, yo por defecto siempre creo en lo que llaman algunos -tablas de entidades- dos índices para estos casos:
.
1.- Indice compuesto por el código de la provincia ( PXX.- donde XX es el dódigo de la provincia )
ejemplo:
P41 .- Equivaldría a la provincia 41 - La P es para componer 3 caracteres para poder buscarla por trozos)
P41 = Sevilla
2.- Indice compuesto por el código postal ( XXXXX.- donde xxxxx es el código postal)
41500.- Equivale al código postal de Alcalá de Guadaíra
3.- Por supuesto otros índices de búsqueda alfabética y trozos.
.
.
Esta forma es la que uso generalmente para este tipo de busquedas
.
saludos
Antonio Vela
http://www.velavisual.com


([N4] mdelgado) #5

@Nacho
Sí que funciona.

Yo lo uso para gestionar el multiempresa, multidelegación. Me explico: En mi aplicación, tengo en la tabla de clientes un campo que me indica la visibilidad de cada cliente. Esta puede ser: Organización, Empresa, Delegación. La delegación que crea el cliente decide su visibilidad. A partir de ahí, una delegación puede ver los clientes que ha creado + los cliente de la empresa a la que pertenece la delegación (que estén marcados como visiblidad Emrpesa) + los clientes de la organización (que se hayan marcado como visibilidad organización).

Utilizando el método que indico en todos los formularios de selección de cliente uso el subindezador y, en el panel (Localizador) de clientes, disparo una busqueda con primer componete el índice Clientes_Filtro.

Luego tengo en el siistema 2 variables globales: nEmpresa y nDelegación que cargo al iniciar la sesión de un usuario. Como he dicho antes, en el indice Clientes_Filtro le aplico como condición (Visibilidad = Organizacion) ó (Visibilidad= Empresa y Cliente.Empresa = nEmpresa) ó (Visibilidad=Delegación y Clientes.Delegacion=nDelegación).

Lo he probado en la nube sobre 3000 registros de clientes y va como la seda.

POR CIERTO (LO DEJO COMO IDEA). Si quiero hacer filtros con mas complejos y ejecutarlos en tiempo de ejecución, bastaría con poner en la condición del índice una variabñe global y asignar en tiempo de ejcución un valor booleano, así nos valdría para pedirle al usuario, por poner el caso, que nos indique una expresión normalizada de búsqueda (Generador de búsquedas/Consultas)


([N1] samuelblanquez.net) #6

para mi que estoy empezando, me parece una gran idea...

Muchas gracias, aportes como este nos ayudan a todos :)


(JoseMGarrido) #7

La idea es muy buena pero una duda que me surge...

¿Como solucionas el problema de poder usar un Localizador y con el buscar clientes por trozos o por palabras? Se me plantea ese problema ya que cuando lanzas un Localizador, lo haces sobre una tabla completa, yo al menos no se como filtrarla o utilizar la subindexación para que la Localizacion no se haga sobre todos los resultados.


([N1] Nacho) #8

@mdelgado: No entiendo como te puede funcionar, o yo lo estoy entendiendo mal. Los índices se crean en el momento de crear/modificar el registro, y es en ese momento cuando se analizan las condiciones de indexación, por lo que si tienes un índice cuya condición de indexacion es: left(codigopostal,2)= $COD_PROVINCIA indexará el registro según el valor de esa variable en ese momento.
Cuando en ejecución busques un cliente el valor que le des en ese momento a la variable $COD_PROVINCIA, no afecta al índice ( a no ser que modifiques el registro del cliente.

@JoseMGarrido: Para subindexar trozos, no tienes otra que hacer tu el localizador, como está en la vBase.




([N1] comercial) #9

Hola, ¿ pero se puede modificar una condición para indexar 'al vuelo' (con una variable en memoria) ?, supongo que si esto fuera así, se tendría que regenerar el índice cada vez que cambia la variable booleana, ¿ o es una capacidad incluida en la BBDD ?, lo veo un poco complicado, lo mas lógico es que solo se tenga en cuenta en el momento de grabar el registro como dice Nacho, de todas maneras todo es probar, ahora mismo me pongo...

Saludos.
Miguel.


([N1] comercial) #10

Bueno una simple búsqueda en el foro me a devuelto esto
¿ sigue siendo válido ?.




([N1] comercial) #11

Para terminar mi participación, he probado y por supuesto no se puede cambiar al vuelo una condición para indexar, Mdelgado revisa tu exposición, posiblemente hay algo no entendido, todo es correcto menos la parte

, lo mejor, es que si la condición del índice la hacemos sobre una variable en memoria, podemos cambiar en tiempo de ejhecución para que, por ejemplo, los clientes mostrados ene l presupuesto sean una veces de Málaga, otra de Gijón, etc.

Saludos.
Miguel.


([N4] mdelgado) #12

@Comercial.arhes2000

Hola,
seguramente no me supe explicar. Si metes en la condición del índice por ejemplo "#ID>nID", siendo nID una varuiable global, puedes cambiar el tiempo de ejecución el valor de la variable nID, obteniendo resultados distintos para el mismo índice.

Saludos
Miguel D.


([N1] Pepeto) #13

@MDelgado.dinacom

La indexacion no funciona asi.
La indexacion se realiza cada vez que se produce un Alta o una Modificacion de un registro en una tabla, y por tanto el registro sera indexado en funcion del valor de la variable global en ese momento.

Pero si, posteriormente, la variable global cambia de valor, el resultado del indice no cambia.

Por tanto, no deberias utilizar variables globales en las condiciones de los indices, ya que los resultados obtenidos posteriormente no serán los deseados.

Ademas, ten en cuenta que el indice es un archivo en disco, y es el mismo para todos los usuarios, y la variable global puede tener valores diferentes para cada uno de los usuarios de la aplicacion, y no por ello cambian los resultados de la indexacion.

un saludo
Jose Luis
http://www.ascsl.com
http://ascsl.net


([N4] mdelgado) #14

Hola,

Mi idea era sólo mostrar algo que a me parecía interesante para compartir con la comunidad. Tampoco pretendo crear un hilo de funciona/No funciona. A mi me funciona peerfectamente, y lo tengo implementado en varias tablas con idénticos resultado.

Os mando un Pantallazo de lo que tengo.

Espero os sirva

Saludos
Miguel D.

[attachment=19326,1556]