Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿cómo podría agrupar datos de un TFDMemTable? (https://www.clubdelphi.com/foros/showthread.php?t=95606)

ContraVeneno 13-03-2022 21:04:52

¿cómo podría agrupar datos de un TFDMemTable?
 
Hola

Estoy cargando datos desde un archivo CSV. Esto lo hago utilizando un TFDBatchMoveTextReader enlazado a su respectivo TFDBachMove y el contenido lo estoy colocando en un TFDBatchMoveDatasetWriter enlazado a un TFDMemTable. Y para mostrar el contenido, un Tdatasource y un TDBGrid. El contenido se lee y se muestra de manera correcta.

El detalle es que hay varios registros del mismo "socio" y de la misma "clave", por lo que tengo que sumar los montos para finalmente tener un solo registro por "socio" y "clave". Pero no tengo idea de cómo puedo agrupar el contenido que ya tengo en el TDFMemTable.

Código:

SOCIO    | CLAVE  | MONTO
------------------------------------
1            | D1        | 100
2            | D1        | 50
1            | D1        | 50
2            | D2        | 40

#Debería tener:

SOCIO    | CLAVE  | MONTO
------------------------------------
1            | D1        | 150
2            | D1        | 50
2            | D2        | 40

¿qué camino debería seguir para agrupar datos de un MemTable?
¿debería usar otro método para leer y agrupar el csv?

Saludos y de antemano gracias por sus ideas.

Neftali [Germán.Estévez] 14-03-2022 09:38:32

No he utilizado mucho los componentes de FD, pero lo primero que se me ocurre es que utilizaras una tabla temporal para cargar los registros.
Una vez que los tengas en una tabla ya puedes generar las consultas necesarias para agrupar/sumar/...

Ya se que no es lo más directo, pero no se si todo lo que necesitas vas a poner hacerlo sólo usando tablas en memoria.

manelb 14-03-2022 19:57:27

No sé si puede resolver tu problema, pero es posible abrir el fichero csv directamente con un FDConnection y un FDQuery.
Podrías prescindir del TFDBatchMoveTextReader, TFDBachMove, TFDBatchMoveDatasetWriter y TFDMemTable.

Desde hace un tiempo trato todos los ficheros de texto directamente con Firedac.

Las opciones del driver de texto son realmente espectaculares, y te permiten, a partir de cualquier fichero de texto (ya sea tabulado, espacios fijos, separado por carácter, etc, dar formato a cada una de las columnas, y tratar el fichero como cualquier tabla de datos, recuperando las filas con una simple consulta sql y aprovechando todas las características de cualquier consulta sql (joins, clausulas where , group by , etc…).


Estos días he estado trabajando con un fichero del INE correspondiente al callejero del estado Español y contiene 1.469.727 registros y una longitud de registro de 280 caracteres.
El fichero ocupa poco más de 400 MB, y se abre de forma instantánea.
Por supuesto que, siguiendo la filosofía de Firedac en su configuración por defecto, sólo recupera los primeros registros y a partir de aquí va paginando y recuperando bloques de datos a medida que avanzamos por el dataset.

La gran potencia del sistema reside en la posibilidad de que exista, junto con el fichero de datos, un fichero con el nombre schema.ini, que contiene la definición de la estructura del fichero de datos en cuestión.
https://docs.microsoft.com/es-es/sql...l-server-ver15

El schema.ini para el fichero de callejero que os estoy comentando seria el siguiente:
Código:

[TRAMOS_NAL_F210630.txt]
ColNameHeader=False
;Format=CSVDelimited
Format=FixedLength
MaxScanRows=0
CharacterSet=ANSI
Col1=CodProvincia Text Width 2
Col2=CodMunicipio Text Width 3
Col3=XXX Text Width 37
Col4=CodPostal Text Width 5
Col5=XXXX Text Width 63
Col6=Nombre Text Width 25

Fijaos que, aunque la longitud del registro sea de 280 caracteres, nos podemos limitar a extraer solamente la información que nos interese, y en la columna 3 i 5 agrupo datos que no necesito.

Si te interesa, me mandas unos ficheros csv de muestra y te preparo un ejemplo.

Saludos a todos

ContraVeneno 17-03-2022 17:31:39

Muchas gracias por sus aportaciones a ambos.

Voy a tomar la sugerencia de Neftali, la realidad es que pensé que sería más complicado, pero no lo fue tanto. Utilicé una tabla temporal y con algunos "ifs" y "locate" del dataset, pude agrupar la información de una tabla en otra tabla temporal.

Saludos y de nuevo gracias.

P.D. Hasta hoy me llegó la notificación a mi correo


La franja horaria es GMT +2. Ahora son las 08:37:05.

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