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)
-   -   Agrupar campos en ClientDataSet y recorrer el resultado (https://www.clubdelphi.com/foros/showthread.php?t=44959)

David 19-06-2007 12:07:41

Agrupar campos en ClientDataSet y recorrer el resultado
 
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
Código Delphi [-]
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

Cita:

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..


La franja horaria es GMT +2. Ahora son las 12:38:45.

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