PDA

Ver la Versión Completa : Agrupar campos en ClientDataSet y recorrer el resultado


David
19-06-2007, 12:07:41
Hola

Tengo una tabla con varios campos , dos de ellos son cliente y Obra , quiero hacer el equivalente a un group by cliente y obra en un ClientDataSet.

Pongo un ejemplo

Cliente---Obra-----Cantidad--IVA--IVA(2ª posibilidad)

1----------A-----------10-----16----16
1----------A-----------20-----16-----7
1----------B-----------10-----16-----16
2----------B-----------20------7------7

Bien la agrupación me daria 2 grupos , El primero formado por los 2 primeros registros obviamente , el segundo el 3 regitro y el tercero con el último registro.

Pongo 2 veces IVA para en lugar de repetir 2 veces la tabla , para simular 2 tablas y dos posibilidades

Bien quiero hacer un código que me saque lo siguiente

Resultado que quiero con el primer IVA que he puesto :

Cliente---Obra---Cantidad---IVA
1----------A-------30-------16
1----------B-------10-------16
2----------B-------20--------7

El Resultado con el 2º IVA que he puesto seria

cliente--Obra--Cantidad---IVA
1--------B--------30-----16
2--------B--------20------7

y luego un mensaje que diga algo así :

Los registros (1 y 2) no han podido ser contabilizados por que tienen distinto IVA

Delfino
19-06-2007, 15:50:14
Consulta en la ayuda las propiedades Aggregates, Groupinglevel, IndexName del CDS..

David
19-06-2007, 22:35:09
Al final lo he solucionado así .

en IndexName hago un indice por Cliente y Obra.

Luego como tengo filtrado los campos ha insertar .

hago algo así :

Supongamos que el ClientDataSet para el ejemplo Client

type
miregistro = record
campo1 : string;
campo2 :integer;
....
end;
while not Client.eof do
begin
Cliente := ClientCliente.AsInteger;
Obra := ClientObra.AsInteger;
// Aquí va la salida , como no se de una propiedad que agrupe registros
// los ordeno los del mismo grupo y mientras tenga el mismo contenido pues
// los anoto
while ClientCliente.AsInteger = Cliente and ClientObra.AsInteger = Obra do
begin
if miregistro.campo1 = '' then
begin
//Relleno el registro , sólo con el primero del grupo
end;
Client.Next;
end;
// Aquí relleno la tabla resultado
end;


Más o menos , este es la manera del código , que funciona , pero la lastima es cuando haces un indexname = 'miIndice' y te lo ordena como si fuera más o menos un group by , no sepa de una propiedad , un valor integer para cada grupo de valores .

Un saludo

Delfino
20-06-2007, 11:13:11
pero la lastima es cuando haces un indexname = 'miIndice' y te lo ordena como si fuera más o menos un group by , no sepa de una propiedad , un valor integer para cada grupo de valores .
Crea un campo Aggregate en el CDS y en su propiedad Expression pon el Count(campo), asignale el indexname y pon su GroupingLevel a 1 y activalo y asi tendras ese integer q deseas obtener en este campo..