Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Contar registros en un ClientDataSet con filtro (https://www.clubdelphi.com/foros/showthread.php?t=92196)

tiqui_loquito 24-08-2017 01:51:50

Contar registros en un ClientDataSet con filtro
 
Hola que tal

Tengo la siguiente duda:

Aplico u filtro a mi ClientDataSet y me muestra los registros filtrados, ahora quiero saber cuantos registros me realizo el filtro. He intentado y siempre obtengo el total de registros de mi ClientDataSet mas no los registros que he filtrado.


Espero me puedan brindar una luz, gracias

ecfisa 24-08-2017 04:31:58

Hola.

La propiedad RecordCount te devuelve la cantidad total de registros actuales.

Pero si lo que deseas es tener la cantidad total de registros, los filtrados y los ocultos podrías hacer:
Al filtrar:
Código Delphi [-]
...
begin
  ClientDataSet1.Filtered := False;
  ClientDataSet1.Tag      := ClientDataSet1.RecordCount;
  ...
  ( Aplicar el filtro )
  ...
  ClientDataSet1.Filtered := True;
end;

Ejemplo; mostrar resultado:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Format('Total:%d, Filtrados:%d, Ocultos:%d',
    [ClientDataSet1.Tag, ClientDataSet1.RecordCount,
     ClientDataSet1.Tag-ClientDataSet1.RecordCount]));
end;

Saludos :)

tiqui_loquito 24-08-2017 15:20:10

Hola ecfisa

Tengo una inquietud

A la propiedad Tag le asigno el Total de registros. Por lo tanto, Tag tendría el mismo valor de RecorCount, entonces a la hora de imprimir tendrían los mismos valores y no el total de registros filtrados.

tiqui_loquito 24-08-2017 16:19:46

Esto es lo que estoy realizando
 
1 Archivos Adjunto(s)
Cuando se escoge el filtro llama a la función FilterSelect la cual esta en el advGrid.

Estoy usando un advStrinGrid, una DataSetClient asociado a SetProvider

Código Delphi [-]
procedure TFrmGrilla4505.AdvStgGrid4505FilterSelect(Sender: TObject;
  Column, ItemIndex: Integer; FriendlyName: String;
  var FilterCondition: String);
begin

  if (FilterCondition = 'Clear') or (FilterCondition = '')  then //Si se selecciona clear si le quita el color a la columna
  begin
    FilterCondition := '';
    AdvStgGrid4505.Colors[Column,0] := clNone;
  end
  else//Si se escoge alguna opción le coloca el color verde a la columna
  begin
    FpTemporal.Filtered := False;
    FpTemporal.Tag      := FpTemporal.RecordCount;
    AdvStgGrid4505.Colors[Column,0] := clGreen;
    FpTemporal.Filtered := True;
  end;

end;

Aquí me realiza correctamente el filtrado (escojo F o M). Hay 7 registros, si se escoge F me trae 4 registros, si se escoge M trae 3.

Pero a la hora de realizar

Código Delphi [-]
procedure TFrmGrilla4505.Button1Click(Sender: TObject);
begin
   FpTemporal.Filtered := True;
  ShowMessage(Format('Total:%d, Filtrados:%d, Ocultos:%d',
    [FpTemporal.Tag, FpTemporal.RecordCount,
     FpTemporal.Tag-FpTemporal.RecordCount]));
end;

Me muestra total 7, Filtrados 7, ocultos 0

Adjunto imagenes


Espero haberme dado a entender

ecfisa 24-08-2017 19:35:49

Hola.
Cita:

Empezado por tiqui_loquito (Mensaje 520528)
Hola ecfisa

Tengo una inquietud

A la propiedad Tag le asigno el Total de registros. Por lo tanto, Tag tendría el mismo valor de RecorCount, entonces a la hora de imprimir tendrían los mismos valores y no el total de registros filtrados.

No, por que el valor de la propiedad RecordCount no debería ser el mismo luego de la aplicación de un filtro que seleccione parte del conjunto de registros.

Un ejemplo funcional sobre la tabla country que trae Delphi:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientDataSet1.Open;
  Caption := Format('Total de registros: %d',[ClientDataSet1.RecordCount]);
end;

procedure TForm1.CheckBoxFiltrarClick(Sender: TObject);
var
  cds: TClientDataSet;
begin
  cds := ClientDataSet1;
  cds.Filtered := False;
  cds.Tag      := ClientDataSet1.RecordCount;
  Memo1.Lines.Clear;
  if TCheckBox(Sender).Checked then
  begin
    cds.Filter   := Format('CONTINENT = %s',['''South America''']);
    cds.Filtered := True;
    Memo1.Lines.Add(Format('Total registros: %d',[cds.Tag]));
    Memo1.Lines.Add(Format('Total filtrados: %d',[cds.RecordCount]));
    Memo1.Lines.Add(Format('Total ocultos  : %d',[cds.Tag - cds.RecordCount]));
  end;
end;

Salida:


Saludos :)

tiqui_loquito 25-08-2017 00:42:36

Hola ecfecia

Primero que todo, agradezco tu colaboración.

El ejemplo quedo muy claro, pero mi problema es el siguiente

El filtro esta insertado en la columna del advStrinGrid, estilo excel. Cuando le doy click sobre el filtro, el lo carga con las opciones que se han definido en un .txt. Hasta ahí muy bien.

Una vez escojo la opcion, ya sea M o F, se llama al procedimiento siguiente

Código Delphi [-]
procedure TFrmGrilla4505.AdvStgGrid4505FilterSelect(Sender: TObject;
  Column, ItemIndex: Integer; FriendlyName: String;
  var FilterCondition: String);
begin

  if (FilterCondition = 'Clear') or (FilterCondition = '')  then //Si se selecciona clear si le quita el color a la columna
  begin
    FilterCondition := '';
    AdvStgGrid4505.Colors[Column,0] := clNone;
  end
  else//Si se escoge alguna opción le coloca el color verde a la columna
    AdvStgGrid4505.Colors[Column,0] := clGreen;

end;

Cuando sale de la linea
Código Delphi [-]
AdvStgGrid4505.Colors[Column,0] := clGreen;
empieza a operar en la unit AdvGrid; que es propia del delphi; la parte del filtrado, es ahí donde se realiza el filtrado, por lo cual no he podio obtener el número de registros filtrados.

No se si estoy usando mal el procedimiento FilterSelect propio del advstringrid.

Hice una prueba creando un botón y luego de filtar le doy click

Código Delphi [-]
  ShowMessage(Format('Total:%d, Filtrados:%d, Ocultos:%d',
    [FpTemporal.RecordCount, AdvStgGrid4505.RowCount-1,
     FpTemporal.RecordCount-(AdvStgGrid4505.RowCount-1)]));

y me arroja los datos como son, pero la idea no es usar un botón para mostrar el total de filas filtradas, sino que cuando le de click en el icono del filtro, al terminar el filtrado me muestre en una etiqueta el valor que necesito sin necesidad de dar otro click.

No se si he sido claro o me he hecho entender.

O se me acaba de ocurrir, que cuando se ejecuta la linea
Código Delphi [-]
AdvStgGrid4505.Colors[Column,0] := clGreen;
se marque un check de manera automatica, para que me muestre lo que deseo. El lío es en que momento luego de salir de procedure TFrmGrilla4505.AdvStgGrid4505FilterSelect hago la verificación del check.

ecfisa 25-08-2017 09:18:31

Hola.

Creo que el problema se produce por que no estas filtrando sobre el TClientDataSet sino mediante el componente TAdvStringGrid que no es nativo de Delphi. No he usado ese componente y lamento no poder ayudarte con él.

Lo que se me ocurre es que consultes en los ejemplos del enlace anterior, en el foro de TMS Software, o tal vez algún compañero los haya usado y te pueda orientar al respecto.

Saludos :)

tiqui_loquito 25-08-2017 14:21:05

Hola ecfisa

Muchas gracias por tu ayuda.

Sí, el filtro se hace en el componente advstringGrid.

Voy a buscar una solución para tomar ese filtro que se escoge en el advstringrid y usarlo para realizar el filtro en el TDataClient. Si encuentro una solución la posteo aquí, porque lo más seguro es que este post le sirva a otra persona.

Muchas gracias

tiqui_loquito 30-08-2017 14:59:32

Solucionado
 
Hola ecfisia

Te cuento que puedo realizar lo que necesita.

Puse una etiqueta por fuera de mi AdvStringGRid donde voy a poner el total de filas filtradas.

Luego de que sale del evento FilterSelect, sigue al evento ColumnFilter del AdvStringGrid al final de este puse la siguiente sentencia
Código Delphi [-]
LbRegFiltrados.Caption := IntToStr(AdvStgGrid4505.RowCount-1);
y me muestra los datos que necesito.

Gracias por tu colaboración.

Espero que este hilo pueda servir de guía para alguien.

Doy por cerrado este hilo

ecfisa 30-08-2017 18:03:22

Hola.

Me alegra que lo resolvieras ^\||/ y gracias por darnos la solución.

Saludos :)


La franja horaria es GMT +2. Ahora son las 03:55:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi