Desarrollo del filtrado

Hola Carlos! Me complace mucho poder seguir consultándote puesto que ha sido muy enriquecedor! Gracias! Paso ahora a consultarte sobre el desarrollo del filtrado! Saludos! :D :D :D
1

1 respuesta

Respuesta
1
Perdón por la demora.
Bueno, esto nos va a llevar un poco más de tiempo debido a que antes de hacer algo debemos afianzar algunos conceptos:
A) El filtrado de registros de las tablas debe ser utilizado con moderación y en los casos adecuados, ya que si se filtran grandes cantidades de registros se ralentiza bastante el sistema.
B) No siempre es necesario hacer filtros mediante programación. Según las necesidades del sistema, y dependiendo de la forma en que definas tu formulario puede ser que no necesites utilizar filtros, o si necesitas hacerlo puedes utilizar la propiedad filter del las propiedades de la tabla desde el entorno de datos, o puedes utilizar un cursor creado a partir de la selección de registros determinados de una tabla, filtrados mediante el uso de la cláusula where. Veamos algunos casos a modo de ejemplo.
Ejemplo 1
********
Supongamos que tú tienes dos tablas: Clientes (id, nombre, etc.) y Pedidos (id, pedido, cant, etc.), y que ambas tablas se encuentran relacionadas con una relación permanente de uno a varios por el índice ID (definida desde el diseñador de Base de datos), en donde en la tabla clientes sólo puedes tener un registro para cada cliente, mientras que en la tabla pedidos puedes tener n registros para cada cliente.
Ahora tú creas un formulario y agregas al entorno de dados del mismo ambas tablas. Al hacerlo notarás que las tablas aparecen vinculadas por una relación (una línea que une ambas tablas) en el entorno de datos del formulario.
Luego agregas a tú formulario 2 controles grid, el primero vinculado a la tabla clientes y el segundo a la tabla pedidos.
Es este caso no necesitas realizar filtrado ya que la relación definida hará el trabajo de filtrado por defecto y sólo te mostrará los registros de la segunda tabla que correspondan al registro seleccionado de la primera, es decir todos los pedidos del cliente seleccionado.
Ejemplo 2
********
Supongamos que tú tines un formulario Maestro ABM de pedidos que al ejecutarse te muestra todos los pedidos. Peró tú necesitas ver los pedidos según sus estados: Por Ej. 0= Todos, 1=Pendientes, 2=Rechazados, 3= En Curso, 4=Cumplidos. Para este caso debes realizar varios pasos:
1) Desde el entorno de datos de tu formulario Maestro ABM das doble clic en el espacio vacío (no sobre la tabla pedidos) y buscas la propiedad beforeopentables del entorno de datos del formulario. Allí defines una variable pública llamada pnEstado y la inicializas con el valor que quieras que se muestre por defecto.
Dodefault()
Public pnEstado
pnEstado=0   && Todos los pedidos
Luego buscas el evento afterclosetables del entorno de datos y liberas la variable pública:
Release pnEstado
Dodefault()
2) Después vas al entorno de datos de tu formulario, seleccionas la tabla Pedidos y buscas la propiedad filter, la seleccionas y le das click al botón Fx del cuadro de propiedades de la tabla. Allí seleccionas el campo numérico que indica el estado del pedido y estableces la condición de filtro: pedidos. estado=pnEstado
De esta forma estás estableciendo un filtro sobre una variable pública. Cada vez que cambies el valor de la variable pública se modificarán los registros que se muestran en el grid.
3) Finalmente creas un formulario pequeño y le agregas un control optiongroup con tantas opciones como valores posibles tenga la variable y un botón aceptar. En el evento click del optiongroup deberás poner este código:
thisform.mousepointer=11
pnEstado=iif(thisform.optiongroup.value=1, 0, thisform.optiongroup.value-1)
thisform.mousepointer=0
De esta manera en este form sólo cambias el varor de la variable pnEstado.
4) Finalmente el el evento click del botón filtrar de tu commandgroup agregaras el siguiente código:
thisform.mousepointer=11
p_form_name="filtraestado.scx"
dodefault()
thisform.mousepointer=0
Ejemplo 3
********
En otras oportunidades resulta necesario realizar un filtrado complejo, en el cual intervienen varios parámetros. En estos casos hay que evaluar, dependiendo de la cantidad de registros que puedan estar involucrados, si conviene trabajar sobre la tabla o sobre un cursor.
Sea cual fuere la opción, deberás agregar un método al formulario llamado por ej. filtrado y allí estableces los comandos set filer to según los parámetros que necesites.
En este caso, el cídigo para tu botón filtrar de tu commandgroup será el siguiente:
thisform.mousepointer=11
Thisform. Filtrado
Thisform. Refresh
thisform.mousepointer=0
Estimado Ivanok: Con esto terminamos nuestro camino que comenzó con el diseño del Maestro ABM. Espero que te haya servido y que desarrolles tus propias herramientas según las necesidades teniendo en cuenta lo que comversamos respecto de las clases y su conveniencia.
Quedo a tu disposición por cualquier duda o aclaración que necesites.
Hola Carlos! Respecto a la respuesta de esta ultima consulta, agradezco mucho que me hayas explicado con los ejemplos, lo relacionado al filtrado, puesto que yo creo que este tema es un poco delicado! Estoy muy agradecido por el tiempo que dedicastes a ensennarme como crear mi propia clase de commandbuttons! Has sido un gran Mentor para mi en el inicio de mi aprendizaje de FoxPro! Ahora, afianzare mis conocimientos profundizando el estudio en lo que me has ensennado! Muchas gracias! Saludos y Bendiciones! ÉXITOS! :D :D :D :D :D :D :D

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas