PDA

Ver la Versión Completa : Seguimos con los problemas... ahora, los aggregates.


SKaRCHa
05-05-2003, 23:55:42
Hola de nuevo...

Esta vez el problema lo tengo con los Aggregates... Es la primera vez que lo uso también.

A ver... tengo un TSimpleDataSet, que hace un "select * from ...". A ese TSimpleDataSet le tengo declarado un AggregateField, que me hace un Sum(COLUMNA).

Hasta ahí bien, puedo poner un TDBText y pillar el valor de ese Field perfectamente... Y ahora viene el problema.. :)

Además, al TSimpleDataSet le tengo puesto un filtro que activo y desactivo cuando quiero con un TCheckBox. Si activo el filtro, el DBText se actualiza bien, pero si lo vuelvo a desactivar, el DBText tiene el valor de los valores afectados por el filtro, por dos (el doble), más el valor de los valores a los que no afecta el filtro, ¿me he explicado?... Bueno, pongo un ejemplo:

Tengo estos tres valores:

- 1 (afectado por el filtro)
- 3 (no afectado por el filtro)
- 5 (afectado por el filtro)

Al principio, con el filtro desactivado, el DBText me muestra el valor 9. Si activo el filtro, me muestra el valor 6, y ahora si desactivo el filtro, me muestra 15 !!, o sea, ((5+1)*2)+3...

A partir de ahí, si vuelvo a activar el filtro me sale 6 (correcto), lo vuelvo a desactivar y me sale 5, y así hasta el infinito... y más allá.. :)

¿Alguien puede darme una explicación / solución a esto?.

Muchas gracias de antemano.. ;)

Bacterion
08-05-2003, 18:28:40
>Al principio, con el filtro desactivado, el DBText me muestra el >valor 9. Si activo el filtro, me muestra el valor 6, y ahora si >desactivo el filtro, me muestra 15 !!, o sea, ((5+1)*2)+3...

Bueno, no hay que ser tan retorcido... basta con sumar los 9 con los 6 para que te den 15 (vamos, como si no se limpiara, vamos, resultado del filtro + resultado despues sin filtrar)

Creo que es un "bug" conocido (o un hecho colateral del funcionamiento de los Agreggates) desde el D6.
De todas formas recomienda, alguna gente, solo tenerlos activos cuando son necesarios...
... en su defecto podrías desactivar el campo y volver a activarlo en justo tras aplicar el filtro (propiedad Active).

SKaRCHa
09-05-2003, 00:09:24
Posteado originalmente por Bacterion
>
Creo que es un "bug" conocido (o un hecho colateral del funcionamiento de los Agreggates) desde el D6.
De todas formas recomienda, alguna gente, solo tenerlos activos cuando son necesarios...
... en su defecto podrías desactivar el campo y volver a activarlo en justo tras aplicar el filtro (propiedad Active).

Pues lo he probado y no funciona... Pongo AggregatesActive a False antes de filtrar, y una vez que pongo Filtered a true, pongo AggregatesActive a true también.. y nada... :-?

En fin... que ni idea.. :)

Bacterion
09-05-2003, 14:09:30
>Pues lo he probado y no funciona... Pongo AggregatesActive a >False antes de filtrar, y una vez que pongo Filtered a true, >pongo AggregatesActive a true también.. y nada... :-?

Yo lo que hice fue algo del estilo (en Delphi 6, notese, contra ClientDataset, que no hay TSimpleDataset, en el que da el mismo problema.):

Filtered := False;
if MiAmoYSegnorMeOrdenaFiltrar then begin
Filter := FiltroImPresionante;
Filtered := True;
end;
MiCampoAgredado.Active := False;
MiCampoAgredado.Active := True;

Y sí que me funcíonó...

guillotmarc
09-05-2003, 15:23:23
Hola.

Prueba utilizando 3 componentes en lugar del TSimpleDataSet, es decir :

1 TSqlQuery
1 TDataSetProvider
1 TClientDataSet

En Delphi 6 el componente integrado (entonces se llamaba TSQLClientDataSet) daba muchos problemas y terminaron por quitarlo, cambiándolo por el TSimpleDataSet. Quizá éste también tenga algunos problemas, que se solucionan utilizando la tripleta.

NOTA : Piensa que el TSimpleDataSet no es mas que un componente que encapsula a estos tres.

Saludos.

Bacterion
09-05-2003, 16:31:56
El TSampleDataset es el que sustituye, en Delphi 7, al TXXXClientDataset (TBDEClientDataset, TIBClientDataset y demás).

Viene a ser, (creo), como un TQuery (vease, dataset bidireccional) realizando cacheo y con un poco de lo que lleva el clientdataset (por aquello del cacheo), pero más light que aquel al que se sustituye (y ciertamente, para ese caso es mejor el triplete de componenets que sugiere guillotmarc)

De todas formas, el triplete de marras, da ese problema en D6 Upd 2 rtl 2 o 3 (no recuerdo bien)

SKaRCHa
10-05-2003, 10:40:04
Hola!

No he probado aún con los 3 componentes independientes, pero sí he probado a hacer esto:

Le tengo declarado a la tabla un AggregateField que se llama SUMA, y cuando quiero filtrar le pongo lo siguiente:

TablaSUMA.Active:=False;
TablaSUMA.Active:=True;

Bueno, pues al ponerlo a False directamente me suelta que no se puedo hacer eso en un Dataset abierto. ¿Cómo lo hiciste tú Bacterion para que no te diese ese error?.

Bacterion
14-05-2003, 09:31:12
Muy sencillo, meter la pata
Sí, creía que había desactivado el campos pero lo que hice realmente es desactivar el clientdataset, con lo que, indirectamente, he dado con un workaround (que palabro, ¿y si digo, rodeo?).

Vamos, lo que dije era falso (mea culpa, por escribir desde el curro). Bueno, tendré que fustigarme un poco (acepto sugerencias).

Pero hay una forma de solucionarlo usando otro ClientDataset "clonado" (el rodeo, chapter 2).

1º Pones tu clientdataset o TSimpleSQL o lo que sea.
2º Te aseguras de que te llegan todos los datos (packetrecord a -1). (así que este meotodo para tablas no muy grandes)
3º Clonas sobre otro dataset (Los dos deben de tener definido el campo agregado!!).
(lo que he hecho yo es clonar a traves de asignación del DATA del primero al segundo).
4º Calculas sobre el segundo, desactivando y reactivando el clientdataset tras un desfiltrado.

te puedo mandar el ejemplo, si quieres (as si, royalty free, see EULA)

:( :( :( :( :( :( :( :( :( :o