viernes, 29 de junio de 2012

ClientDataSets filtrado


Fuente Original: Embarcadero.com 




Resumen: Cuando se aplica a un conjunto de datos, un filtro limita los registros que sean accesibles. Este artículo explora los entresijos de ClientDataSets de filtrado.
Este artículo es parte de una extensa serie de explorar el ClientDataSet en detalle. En caso de que usted es nuevo en esta serie, un ClientDataSet es un componente que proporciona una tabla en memoria que se puede manipular fácilmente y de manera eficiente. Artículos anteriores de esta serie han proporcionado una visión general del uso de ClientDataSet, pero en los últimos dos tramos que he estado cubriendo las operaciones esenciales y básicos relacionados con ClientDataSet. En este artículo me estoy terminando la discusión de las cuestiones de la fundación con una mirada en conjunto de datos de filtrado.
Cuando se filtra un conjunto de datos, se restringe el acceso a un subconjunto de registros contenidos en la memoria en la tienda de ClientDataSet. Por ejemplo, imagine que usted tiene un ClientDataSet que incluye un registro por cada uno de los clientes de su empresa, todo el mundo. Sin filtro, todos los registros de los clientes son accesibles en el conjunto de datos. Es decir, es posible navegar, ver y editar cualquier cliente en el conjunto de datos. A través de filtro, puede hacer que el ClientDataSet parecen incluir sólo aquellos clientes que viven en los Estados Unidos, o en Londres, Inglaterra, o que viven en una calle llamada Enterprise Way. En este ejemplo, por supuesto, asume que hay un campo en el ClientDataSet que contiene los nombres de países o de los campos que contienen los nombres de ciudad y país, o un campo de la celebración de los nombres de calles. En otras palabras, un filtro limita los registros accesibles sobre la base de datos que se almacenan en el ClientDataSet, y es eficaz en la medida en la que los datos en el ClientDataSet se puede utilizar para limitar los registros son accesibles.
Un ClientDataSet soporta dos mecanismos fundamentalmente diferentes para la creación de filtros. El primero de ellos consiste en un rango , que es un mecanismo de índice basado en el filtrado. El segundo, llamado un filtro , es más flexible que varía, pero es más lento de aplicar y cancelar. Estos dos enfoques para el filtrado se tratan en este artículo.
Pero antes de abordar el filtrado directamente, hay un par de puntos importantes que deben hacerse. La primera es que el filtrado es una operación de cliente. En concreto, los filtros mencionados en este artículo se aplican a los datos cargados en la memoria en una tienda de ClientDataSet. Por ejemplo, usted puede cargar 10.000 registros en un ClientDataSet (cada registro de cliente, por ejemplo), y luego aplicar un filtro que limita el acceso sólo a aquellos clientes que se encuentren en la ciudad de Nueva York. Una vez aplicado, el filtro puede hacer que el ClientDataSet que parece contener sólo 300 registros (teniendo en cuenta que 300 de los de su cliente se encuentra en Nueva York). Aunque el ClientDataSet filtrada proporciona acceso sólo a estos 300 expedientes, a los 10.000 registros permanecen en la memoria. En otras palabras, un filtro no reduce la sobrecarga de su ClientDataSet, simplemente restringe el acceso a un subconjunto de los registros de la ClientDataSet de.
El segundo punto es que en lugar de utilizar un filtro, puede ser mejor limitar el número de registros se cargan en el ClientDataSet en el primer lugar. Tenga en cuenta los 10.000 registros de clientes, una vez más. En lugar de cargar todos los 10.000 registros en la memoria, y luego el filtrado en el campo de la ciudad, tal vez sería mejor para cargar sólo un subconjunto de los registros de clientes en el ClientDataSet. Mientras carga parcial no está disponible cuando un ClientDataSet se carga desde el sistema de archivos local utilizando MyBase, es una opción cuando se carga un ClientDataSet a través de un DataSetProvider. 
Por ejemplo, imagine que sus puntos DataSetProvider a un SQLDataSet cuya CommandText contiene la siguiente consulta SQL:
SELECT * FROM clientes WHERE ciudad = 'Nueva York'
Cuando el método Open del ClientDataSet se llama, esta consulta SQL se ejecuta, y sólo aquellos registros de 300 o menos de los de Nueva York a base de clientes se cargan en el ClientDataSet. Este enfoque reduce en gran medida la sobrecarga de memoria de la ClientDataSet, ya que un menor número de registros deben ser almacenados en la memoria.
En realidad, hay una serie de técnicas que le permiten cargar los registros seleccionados de un conjunto de datos a través de un DataSetProvider en un ClientDataSet, incluyendo el uso de consultas con parámetros, bases de datos anidados, SQL dinámico, entre otros. Un examen minucioso de estas técnicas se publicará en un próximo artículo de esta serie. Sin embargo, desde la perspectiva de este artículo, estas técnicas no son técnicamente de filtrado, ya que no limitan el acceso en el ClientDataSet a un subconjunto de sus registros cargados ..
Así que cuando usted utiliza el filtrado en lugar de cargar sólo los registros seleccionados en un ClientDataSet? Las respuestas se reduce a tres temas básicos: ancho de banda, la fuente de los datos y características del cliente.
Cuando se carga un ClientDataSet de DataSetProvider y ancho de banda es bajo, como ocurre a menudo en las aplicaciones distribuidas, normalmente es la mejor manera de cargar sólo los registros seleccionados. En esta situación, la carga de los registros que no se van a mostrar consume ancho de banda innecesariamente, afectando el rendimiento de su aplicación, así como la de otros que comparten el ancho de banda. Por otro lado, si el ancho de banda es abundante y el conjunto de datos es relativamente pequeño, a menudo es más fácil de cargar todos los datos y filtro en los registros que desea mostrar.
La segunda consideración es la ubicación de los datos. Si va a cargar los datos de un ClientDataSet guardado previamente (en formato binario propietario ya sea de Borland o en formato XML), no tienes más remedio. El filtrado es la única opción para mostrar sólo un subconjunto de registros. Sólo cuando se va a cargar los datos a través de un DataSetProvider tienes la opción de utilizar una carga del filtro o selectivo de los datos.
La última consideración se relaciona con las características del lado del cliente, el más común de lo que es la velocidad. Una vez que los datos se cargan en un ClientDataSet, la mayoría de los filtros se aplican muy rápidamente, incluso cuando una gran cantidad de datos debe ser filtrada. Como resultado, el filtrado le permite alterar rápidamente que subconjunto de registros se muestran. Un simple clic de un botón o selección de menú puede cambiar casi instantáneamente el ClientDataSet de mostrar a los clientes de la ciudad de Nueva York para mostrar a los clientes de Frankfurt, Alemania, sin una red de ida y vuelta.
Como se mencionó anteriormente, hay dos enfoques básicos para el filtrado: rangos y filtros. Vamos a empezar por mirar en las gamas.

    
Estableciendo un rango de

Rangos, mientras que menos flexibles que los filtros, ofrecen la opción más rápida para mostrar un subconjunto de registros de un ClientDataSet. En resumen, una gama es un mecanismo basado en índices para definir los valores de alta y baja de los registros que se muestran en el ClientDataSet. Por ejemplo, si el índice actual se basa en el apellido del cliente, una amplia se puede utilizar para mostrar todos los clientes cuyo apellido es 'Jones'. O bien, una serie se puede utilizar para mostrar sólo los clientes, cuyos apellidos comienzan con "J" de la letra. Del mismo modo, si un ClientDataSet está indexado en un campo entero llamado Límite de Crédito, una serie se puede utilizar para mostrar sólo aquellos clientes cuyo límite de crédito es mayor que (EE.UU.) $ 1,000, o entre $ 0 y $ 1000.
Hay dos maneras de establecer un rango. La primera, y más fácil, es utilizar el método SetRange. SetRange define un rango utilizando la invocación de un método único. El segundo mecanismo es a entrar en el estado dsSetKey, que requiere un mínimo de tres llamadas de método, y cuatro veces. 
En Delphi y Kylix, SetRange tiene la siguiente sintaxis:
procedimiento de SetRange ( const StartValues ​​y EndValues: matriz  de la  const );
Como se puede ver en esta sintaxis, se pasan dos matrices constantes cuando se llama a SetRange. La primera matriz contiene los valores bajos de los valores de rango para los campos del índice, con el primer elemento de la matriz es el extremo inferior del rango para el primer campo en el índice, siendo el segundo elemento del extremo inferior del rango para el segundo campo en el índice, y así sucesivamente. La segunda matriz contiene los valores de gama alta para los campos de índice, con el primer elemento en la segunda matriz siendo el extremo superior del intervalo en el primer campo del índice, siendo el segundo elemento el extremo superior en el segundo campo del índice , y así sucesivamente. Estos arreglos pueden contener menos elementos que el número de campos en el índice actual, pero no puede contener más.
Consideremos de nuevo el ejemplo de un ClientDataSet que contiene todos los registros de clientes. Teniendo en cuenta que hay un campo en este conjunto de datos denominado "Ciudad", y desea mostrar sólo los registros de los clientes que viven en la ciudad de Nueva York, puede utilizar las siguientes declaraciones:
ClientDataSet1.IndexFieldNames: = 'Ciudad' ;
ClientDataSet1.SetRange ([ 'Ciudad de Nueva York ], [ 'Nueva York' ]);
La primera sentencia crea un índice temporal en el campo de la ciudad, mientras que el segundo establece el rango. Por supuesto, si el ClientDataSet ya estaba usando un índice donde el primer campo del índice fue el campo de la ciudad, que se omite la sentencia por primera vez en el segmento de código anterior.
El ejemplo anterior establecer el rango en un solo campo, pero a menudo es posible establecer un intervalo de dos o más campos del índice actual. Por ejemplo, imagine que desea mostrar sólo aquellos clientes cuyo apellido es Walker y que viven en San Antonio, Texas. Las declaraciones siguientes se muestra cómo:
ClientDataSet1.IndexFieldNames: = "Apellido, Ciudad, Estado ,
ClientDataSet1.SetRange ([ 'Walker' , 'San Antonio' ​​, 'TX' ], [ 'Walker' , 'San Antonio' ​​, 'TX' ]);
En ambos ejemplos anteriores, el principio y que terminan rangos contenía los mismos valores. Pero esto no es siempre el caso. Por ejemplo, imagine que desea establecer un rango para incluir sólo aquellos clientes cuyo límite de crédito es mayor que (EE.UU.) $ 1.000. Esto puede lograrse utilizando estados similares a los siguientes:
ClientDataSet1.IndexFieldNames: = 'CreditLimit' ;
ClientDataSet1.SetRange ([1000], [MaxInt]);

    
Usando ApplyRange

En un artículo anterior de esta serie que se enteró de que hay dos métodos basados ​​en índices para la localización de un registro sobre la base de una coincidencia exacta. Uno de ellos, FindKey, es una declaración autónoma para la localización de un registro basado en los campos del índice actual. En comparación, GotoKey es más complicado, que requiere que usted llame primero SetKey entrar en el estado dsSetKey, durante el cual se definen los criterios de búsqueda, y luego completar la operación con una llamada a GotoKey. SetRange es similar a la FindKey, donde una sola declaración define la gama, así como la establece. ApplyRange, en comparación, es similar a la GotoKey. 
Para utilizar ApplyRange que empezar por llamar SetRangeStart (o EditRangeStart). Si lo hace, pone el ClientDataSet en el estado dsSetKey. Mientras que en este estado que asignar valores a una o más de los tfields implicados en el índice actual para definir los valores bajos de la gama. Como es el caso con SetRange, si define un único valor bajo, debe ser al primer campo del índice actual. Si se define un valor de rango bajo para dos campos, que debe ser necesariamente los dos primeros campos del índice.
Después de ajustar los valores de gama baja, se llama a SetRangeEnd (o EditRangeEnd). Ahora asignar valores a uno o más campos del índice actual para definir los valores altos de la gama. Una vez que tanto los valores iniciales y los valores finales se han establecido, se llama a ApplyRange para filtrar el ClientDataSet en el rango definido.
Por ejemplo, las declaraciones siguientes se utilizan para mostrar ApplyRange sólo los clientes que viven en la ciudad de Nueva York en la tabla de clientes.
ClientDataSet1.IndexFieldNames: = 'Ciudad' ;
ClientDataSet1.SetRangeStart;
ClientDataSet1.FieldByName ( "City" .) Valor: = 'Nueva York' ;
ClientDataSet1.SetRangeEnd;
ClientDataSet1.FieldByName ( "City" .) Valor: = 'Nueva York Ciudad ;
ClientDataSet1.ApplyRange;
Al igual que SetRange, ApplyRange se puede utilizar para establecer un intervalo de más de un campo del índice, como se muestra en el siguiente ejemplo.
ClientDataSet1.IndexFieldNames: = "Apellido, Ciudad, Estado ,
ClientDataSet1.SetRangeStart;
ClientDataSet1.FieldByName ( "LastName" ) Valor:. = 'Walker' ;
ClientDataSet1.FieldByName ( "City" .) Valor: = 'San Antonio' ​​;
ClientDataSet1.FieldByName ( «Estado» .) Valor: = 'TX' ;
ClientDataSet1.SetRangeEnd;
ClientDataSet1.FieldByName ( "LastName" ). Value: = 'Walker' ;
ClientDataSet1.FieldByName ( "City" .) Valor: = 'San Antonio ;
ClientDataSet1.FieldByName ( 'Estado' ) Valor:. = 'TX' ;
ClientDataSet1.ApplyRange;
Ambos de los ejemplos precedentes hecho uso de SetRangeStart y SetRangeEnd. En algunos casos, puede utilizar EditRangeStart y / o EditRangeEnd lugar. En resumen, si ya ha configurado los valores de alta y baja de un rango, y desea modificar algo, pero no todos, los valores, puede utilizar EditRangeStart y EditRangeEnd. Llamadas SetRangeStart borra todos los valores anteriores de la gama. En comparación, si se llama a EditRangeStart, los valores previamente definidos bajas permanecen en los campos de intervalo. Si desea cambiar algo, pero no todos, de los valores de rango bajo, llame EditRangeStart y modificar sólo los campos cuyos valores bajos que desea cambiar. Del mismo modo, si usted quiere cambiar algo, pero no todos, de los valores de alta gama, hacerlo llamando EditRangeEnd.
Por ejemplo, el siguiente segmento de código se mostrarán todos los registros en los que el límite de crédito del cliente se encuentra entre (EE.UU.) $ 1,000 y (EE.UU.) $ 5.000.
ClientDataSet1.IndexFieldNames: = 'CreditLimit' ;
ClientDataSet1.SetRange ([1000], [5000]);
Si luego desea establecer un rango de entre $ 1.000 y $ 10.000, usted puede hacerlo a través de las siguientes declaraciones:
ClientDataSet1.EditRangeEnd;
ClientDataSet1.FieldByName ( 'CreditLimit' .) Valor: = 10000;
ClientDataSet1.ApplyRange;

    
Cancelación de un rango

Si usted ha creado una gama con SetRange o ApplyRange, cancela que van al llamar al método de ClientDataSet CancelRange. El siguiente ejemplo muestra cómo una llamada a CancelRange se ve en el código:
ClientDataSet1.CancelRange;

    
Un comentario acerca de rangos

Al principio de este artículo que he mencionado que es "a veces" es posible establecer un rango de dos o más campos. La implicación de esta declaración es que a veces no lo es, lo cual es cierto. Al establecer un rango de dos o más campos, sólo el último campo de la gama puede especificar un rango de valores, todos los demás campos deben tener el mismo valor tanto para los extremos inferior y superior de la gama. Por ejemplo, el siguiente rango se mostrarán todos los registros en los que el límite de crédito es de entre $ 1.000 y $ 5.000 para clientes que viven en la ciudad de Nueva York.
ClientDataSet1.IndexFieldNames: = 'Ciudad; CreditLimit' ;
ClientDataSet1.SetRange ([ 'Ciudad de Nueva York , 1000], [ 'Ciudad de Nueva York , 5000]);
En comparación, la declaración siguiente le mostrará todos los registros de clientes cuyo límite de crédito es de entre $ 1.000 y $ 5.000, independientemente de la ciudad que vivimos
ClientDataSet1.IndexFieldNames: = 'CreditLimit; Ciudad ;
ClientDataSet1.SetRange ([1000, 'Nueva York' ], [5000, 'Nueva York' ]);
La diferencia entre estos dos rangos es que en el primer intervalo, el valor bajo y alto en el primer campo de la gama era un valor constante, de Nueva York. En la segunda, una gama aparece (1,000 a 5,000). En este caso, el segundo campo de la gama se ignora.
Hay otro aspecto de los rangos que es bastante extraño cuando se trabaja con ClientDataSets. Esto está relacionado con la propiedad KeyExclusive heredado por el ClientDataSet de TDataSet. Normalmente, esta propiedad puede ser utilizada para definir cómo se aplican los rangos. Cuando KeyExclusive si es False (su valor por defecto), la gama incluye tanto los valores bajos y altos de la gama. Por ejemplo, si se establece un rango en CreditLimit a 1000 y 5000, registra en el límite de crédito es de 1000 o 5000 aparecerá en la gama. Si KeyExclusive se establece en True, sólo los registros de los clientes, donde el límite de crédito es superior a 1000 pero inferior a 5000 que aparecen en el rango.Los clientes con límites de crédito de exactamente 1000 o 5000 no lo hará.
Tal vez sea yo, pero cuando trato de establecer mediante programación la propiedad KeyExclusive en un ClientDataSet se produce una excepción. Llegué a la conclusión de esto que KeyExclusive no se aplica a ClientDataSets. Si usted puede conseguir KeyExclusive trabajar con ClientDataSets en Delphi 6 o Delphi 7, me gustaría saber.

    
Uso de filtros

Debido a intervalos se basan en los índices, se aplican muy rápidamente. Por ejemplo, en una tabla de registro 100.000, con un índice en el campo Nombre, estableciendo un rango para mostrar sólo los registros de los clientes, donde el primer nombre es Scarlett se aplicó en menos de 10 milisegundos en un 850 MHz Pentium III con 512 MB de RAM (se el punto de vista que se obtiene contenía sólo 133 registros).
Filtros, en comparación, no usan índices. En cambio, operan mediante la evaluación de los registros de la ClientDataSet, que muestra sólo los registros que pasan el filtro. Puesto que los filtros no usan índices, que no son tan rápidas (filtrado el nombre de Scarlett tomó poco menos de 500 milisegundos en la misma base de datos). Sin embargo, son mucho más flexibles.
Un ClientDataSet tiene cuatro propiedades que se aplican a los filtros. Se trata de filtros, se filtró FilterOptions y OnFilterRecord (una propiedad de evento). En su caso más simple, un filtro requiere el uso de dos de estas propiedades: Filtro y se filtró. Filtrado es una propiedad booleana que se utiliza para activar y desactivar el filtro. Si desea filtrar los registros, conjunto filtrado en True, de lo contrario conjunto filtrado en False (el valor predeterminado).

Cuando filtrada se establece en True, el ClientDataSet utiliza el valor de la propiedad de filtro para identificar los registros que se mostrarán. Se asigna a esta propiedad una expresión booleana que contiene al menos una operación de comparación que incluya al menos un campo en el conjunto de datos. Puede utilizar cualquiera de los operadores de comparación, se incluyen =,>, <,> =, <= y <>. Mientras que el nombre del campo no incluye todos los espacios, que incluyen el nombre del campo directamente en la comparación, sin delimitadores. Por ejemplo, si su ClientDataSet incluye un campo denominado Ciudad, se puede establecer la propiedad Filter en la siguiente expresión para mostrar sólo los clientes que viven en la ciudad de Nueva York:
Ciudad = 'Nueva York'
Tenga en cuenta que las comillas simples son necesarias aquí, ya que Nueva York es una cadena. Si desea asignar un valor a la propiedad Filter en tiempo de ejecución, debe incluir las comillas simples en la cadena que se asigna a la propiedad. El siguiente es un ejemplo de cómo hacer esto:
ClientDataSet1.Filter: = 'Ciudad =' + QuotedStr ( 'Nueva York' );
El segmento de código anterior utiliza la función QuotedStr, que se encuentra en la unidad SysUtils. La alternativa es usar algo como lo siguiente. Personalmente, prefiero utilizar QuotedStr, ya que es mucho más fácil de depurar y mantener.
ClientDataSet1.Filter: = 'Ciudad =' 'Freeport' '' ;
En los ejemplos anteriores el nombre del campo del campo en el filtro no incluir espacios. Si uno o más campos que desea utilizar en un filtro de incluir espacios en sus nombres de campo, escriba los nombres de los campos entre corchetes. (Entre corchetes también se puede usar alrededor de los nombres de campo que no incluyan espacios.) Por ejemplo, si su ClientDataSet contiene un campo denominado "Last Name", se puede utilizar una declaración similar a la siguiente para crear un filtro.
ClientDataSet1.Filter: = '[Apellidos] =' + QuotedStr ( 'Williams' );
Estos ejemplos han demostrado sólo expresiones simples. Sin embargo, las expresiones complejas pueden ser utilizados. En concreto, se pueden combinar dos o más comparaciones utilizando el AND, OR y NOT operadores lógicos.Además, más de un campo puede estar implicado en la comparación. Por ejemplo, puede utilizar el siguiente filtro para limitar los registros a los que el campo es la ciudad de San Francisco, y el apellido es Martínez:
ClientDataSet1.Filter: = '[Ciudad] =' + QuotedStr ( 'San Francisco' ) + 'y [Apellido] =' + QuotedStr ( 'Martínez' );
Asignar un valor a la propiedad Filter no significa automáticamente que los registros se filtrarán. Sólo cuando la propiedad filtrada se establece en True la propiedad Filter se produce realmente un conjunto de datos filtrado. Por otra parte, si la propiedad Filter contiene una cadena vacía, el establecimiento de filtrado en True no tiene ningún efecto.
De forma predeterminada, los filtros son mayúsculas y minúsculas y realizar una coincidencia parcial a los criterios de filtro. Usted puede influir en este comportamiento mediante la propiedad FilterOptions. Esta propiedad es un conjunto de propiedades que puede contener cero o más de las siguientes dos banderas: foCaseInsensitive y foNoPartialMatch. Cuando foCaseInsensitive está incluido en el conjunto, el filtro no es sensible a mayúsculas. 
Cuando foNoPartialMatch está incluido en el conjunto, las coincidencias parciales son excluidos del conjunto de datos filtrado. Cuando foNoPartialCompare está ausente de la propiedad FilterOptions, las coincidencias parciales son identificados por un asterisco ('*') en el último carácter de su búsqueda. Todos los campos cuyos contenidos coinciden con los caracteres a la izquierda del asterisco están incluidos en el filtro. Por ejemplo, consideremos el siguiente filtro:
ClientDataSet1.Filter: = 'Ciudad =' + QuotedStr ( 'San *' );
Esto siempre y cuando foNoPartialCompare está ausente de la propiedad FilterOptions, este filtro se incluye ninguna ciudad cuyo nombre empieza por "San", como San Francisco o San Antonio.
Coincidencias parciales también puede utilizarse con compuestos expresiones booleanas. Por ejemplo, el siguiente filtro se mostrarán todos los clientes cuyos nombres comiencen con la letra M, y que viven en una ciudad cuyo nombre comienza con 'Nueva', tales como Newcastle o la ciudad de Nueva York.
ClientDataSet1.Filter: = 'Ciudad =' + QuotedStr ( 'New *' ) + 'y [Apellido] =' + QuotedStr ( 'M *' );

    
Utilizando el controlador de eventos OnFilterRecord

Hay una segunda forma, algo más flexible para definir un filtro. En lugar de utilizar la propiedad Filter, puede adjuntar el código al controlador de eventos OnFilterRecord. Cuando filtrada se establece en True, este controlador de eventos disparadores para cada registro en la base de datos. Cuando se invoca, este controlador de eventos se pasa un parámetro booleano por referencia, llamado Accept, que se utiliza para indicar si el registro actual se debe incluir en la vista filtrada. Desde dentro de este controlador de eventos, puede realizar casi cualquier prueba que pueda imaginar. Por ejemplo, usted puede verificar que el registro actual se asocia con un registro de otra tabla. Si, sobre la base de esta prueba, que desea excluir del registro actual de la vista, se establece el valor del parámetro de aceptación formal a Falso. Este parámetro es True de forma predeterminada.
La propiedad Filter consiste normalmente en una o más comparaciones que implican valores de los campos de la ClientDataSet. Manejadores de eventos OnFilterRecord, sin embargo, puede incluir cualquier comparación que desee. Y ahí está el peligro. En concreto, si la comparación que se realiza en el controlador de eventos OnFilterRecord es mucho tiempo, el filtro será lenta. En otras palabras, usted debe tratar de optimizar el código que se coloca en un controlador de eventos OnFilterRecord, sobre todo si tiene que filtrar una gran cantidad de registros.
El siguiente es un ejemplo simple de un controlador de eventos OnFilterRecord.
procedimiento de TForm1.ClientDataSet1FilterRecord (DataSet: TDataSet; var Aceptar: Boolean); comenzar a aceptar:. = ClientDataSet1.Fields [1] = AsString 'Scarlett' ; final ;

    
Navegación por medio de un filtro de

Si usted ha puesto de filtrado Cierto o no, usted todavía puede usar un filtro con el fin de explorar los registros seleccionados. Por ejemplo, aunque es posible que desee ver todos los registros en una base de datos, es posible que desee para moverse rápidamente entre los registros que cumplen con criterios específicos. Por ejemplo, es posible que desee para poder navegar rápidamente entre los registros en los que el cliente tiene un límite de crédito en exceso de (EE.UU.) $ 5.000.
Un ClientDataSet expone cuatro métodos para navegar usando un filtro. Estos métodos son FindFirst, FindLast, FindNext y FindPrior. Cuando se ejecuta uno de estos métodos, el ClientDataSet será localizar el registro solicitado sobre la base de la propiedad actual de filtro, o el controlador OnFilterRecord evento. Esta navegación, sin embargo, no exige que la propiedad de filtrado se establece en True. En otras palabras, mientras que todos los registros de la ClientDataSet puede ser visible, el filtro se puede utilizar para navegar rápidamente entre los registros que coinciden con el filtro.
Cuando se ejecuta el FindNext métodos o FindPrior, el ClientDataSet establece una propiedad denominada encontrados. En caso de pérdida es cierto que un próximo disco o un registro antes se encontraba, y ahora es el registro actual.Si se encuentra devuelve False, el intento fallido de navegar.

    
Utilizar rangos y filtros Juntos

Rangos de hacer uso de índices, y son muy rápidos. Los filtros son más lentos, pero son más flexibles. Afortunadamente, ambas gamas y los filtros se pueden utilizar juntos. Uso de los rangos con los filtros es especialmente útil cuando uno no se puede utilizar una amplia solo, y el filtro es un tema complejo que de lo contrario tomaría mucho tiempo para aplicar. En estas situaciones, lo mejor es establecer primero una amplia, lo que limita el número de registros que necesitan ser filtrada para el conjunto más pequeño posible que incluye todos los registros del filtro. El filtro puede ser aplicado en el intervalo resultante. Dado que un menor número de registros deben ser evaluados para el filtro, las operaciones combinadas será más rápido que usando un filtro solo. 

    
Un ejemplo

Las diversas relacionadas con el filtro técnicas discutidas en este artículo, con la excepción del controlador de eventos OnFilterRecord, se ha demostrado en el proyecto CDSFilter, que puede ser descargado a partir del código central porclic aquí . La forma principal de este proyecto se muestra en la figura siguiente.

Haga click para ver imagen en tamaño completo

Además de demostrar el uso de SetRange, ApplyRange, filtro, se filtra y FilterOptions, este proyecto también le ofrece información sobre el rendimiento del filtro. La siguiente figura muestra un conjunto de datos de gran tamaño que aún no ha tenido su conjunto alcance.

Haga click para ver imagen en tamaño completo

En la figura siguiente, una serie se ha aplicado, y sólo aparece un registro (de un total de 100.000 registros). En este caso, la gama se aplicó en menos de 10 milisegundos.

Haga click para ver imagen en tamaño completo

    
Sobre el autor

Cary Jensen es el presidente de Jensen Data Systems, Inc., una formación con sede en Texas y la empresa consultora que ganó en 2002 la revista Delphi Informant lectores del premio al Mejor formación. Él es el autor y presentador de Delphi Developer Days ( www.DelphiDeveloperDays.com ), un lleno de información de Delphi (TM) serie de seminarios que los viajes de América del Norte y Europa, y Delphi Developer Days talleres de alimentación, se centró Delphi (TM) de formación. Cary es también un ganador de premios, más vendido co-autor de dieciocho libros, entre ellos aplicaciones Kylix de construcción (2001, Osborne / McGraw-Hill), Oracle JDeveloper (1999, Oracle Press), JBuilder Esenciales (1998, Osborne/McGraw- Hill), y Delphi en profundidad (1996, Osborne / McGraw-Hill). Para obtener información sobre la formación in situ y de consultoría que puede ponerse en contacto con Cary encjensen@jensendatasystems.com , o visite su sitio Web en www.JensenDataSystems.com .
Haz clic aquí para una lista de próximos seminarios, talleres y conferencias en las que Cary Jensen está presentando.
Breaking News : Obtener una formación práctica, con Cary Jensen. Jensen Data Systems, Inc. se enorgullece en anunciar Delphi Developer Days talleres de alimentación , se centró Delphi (TM) de formación. Estos intensos, talleres de dos días le dará la oportunidad de explorar y poner en práctica una variedad de técnicas Delphi con Cary Jensen, uno de los principales expertos del mundo de Delphi. Los temas del taller incluyen ClientDataSet, IntraWeb, y mucho más.Debido a la naturaleza práctica de estos talleres, el tamaño de la clase es muy limitada. Reserve su asiento ahora. Haga clic aquí para obtener más información acerca de Delphi Talleres poder de desarrollo al días , o visitehttp://www.DelphiDeveloperDays.com .