Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 24-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.124
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 24-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 24-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
Esto es lo que estoy realizando

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
Imágenes Adjuntas
Tipo de Archivo: pdf Doc1.pdf (192,9 KB, 3 visitas)
Responder Con Cita
  #5  
Antiguo 24-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.124
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por tiqui_loquito Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 25-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 25-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.124
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 25-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 30-08-2017
tiqui_loquito tiqui_loquito is offline
Miembro
 
Registrado: Oct 2013
Posts: 15
Poder: 0
tiqui_loquito Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 30-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.124
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Me alegra que lo resolvieras y gracias por darnos la solución.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Contar registros de un filtro jandres SQL 4 08-09-2016 17:25:32
buscar registros de un ClientDataSet a otro clientDataSet novato_erick Conexión con bases de datos 2 02-02-2013 20:48:09
Filtro por ClientDataSet novato_erick OOP 2 26-07-2012 23:35:38
por que duplicidad de registros con clientdataset sin ingresar registros ...mysql Arturo MySQL 3 05-09-2006 18:39:37
Agregado, Filtro, ClientDataSet, Problema en Count() andre Conexión con bases de datos 1 23-07-2004 14:47:07


La franja horaria es GMT +2. Ahora son las 22:19:28.


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