PDA

Ver la Versión Completa : Concatenar multiples datos de una celda.


pgranados
13-12-2022, 23:47:47
Buen día, ya lo resolví, pero esta solución la estuve buscando en el foro y no la encontré, se las comparto si alguien la necesita o si algún día me olvido de ella.

Si tenemos una tabla con los campos

A B C D E
1
1
1


Y queremos imprimir: 111

Hacemos lo siguiente:


var
valores : string;

for I := 0 to FDQuery.RecordCount-1 do
begin
valores:= valores+FDQuery.FieldByName('A').Value;
FDQuery.Next;
end;



Al final de recorrer el For, valores será: 111
Saludos. :D

duilioisola
14-12-2022, 08:44:35
También puedes hacerlo directamente con un SQL

LIST (EXPRESION A CONCATENAR)
LIST (EXPRESION A CONCATENAR, SEPARADOR)
LIST devuelve un campo BLOB TIPO TEXTO


Suponiendo TABA es
ID CAMPO_A CAMPO_B
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E


/* Contenido concatenado sin separador */
select list(CAMPO_A, '')
from TABLA
where
ID < 3

Resultado: BLOB="111"



/* Expresión concatenada separada por coma+espacio */
select list(CAMPO_A ||'-'||CAMPO_B, ', ')
from TABLA
where
ID < 3

Resultado: BLOB="1-A, 1-B, 1-C"



/* Expresión concatenada separada por coma+espacio tomando solo los primeros 7 caracteres y convertida a varchar(7) */
select cast(
substring(
list(campo_a || '-' || campo_b, ', ')
from 1 for 7
)
as varchar(7)
)
from tabla
where
id < 3

Resultado: VARCHAR(7)="1-A, 1-"

duilioisola
14-12-2022, 10:09:46
Hay ciertos casos en los que este código podría no funcionar.
Por ejemplo, si el DataSet es unidireccional. La propiedad RecordCount no está "disponible".
La propiedad Unidirectional hace que solo puedas ir hacia adelante y no guarda registros anteriores en memoria, lo que lo hace más rápido y eficiente.

Además de esto, he agregado algunas comprobaciones para asegurar que todo funcione correctamente.

Inicializo variables.
Posiciono en primer registro.



var
valores : string;
begin
[...]
// Inicializo variable
valores := '';

// Me aseguro de estar en el primer registro del DataSet
FDQuery.First;

// Recorro DataSet hasta que no haya mas registros
while not FDQuery.EOF do
begin
valores := valores + FDQuery.FieldByName('A').Value;
FDQuery.Next;
end;
[...]
end;

pgranados
14-12-2022, 17:37:31
Hay ciertos casos en los que este código podría no funcionar.
Por ejemplo, si el DataSet es unidireccional. La propiedad RecordCount no está "disponible".
La propiedad Unidirectional hace que solo puedas ir hacia adelante y no guarda registros anteriores en memoria, lo que lo hace más rápido y eficiente.

Además de esto, he agregado algunas comprobaciones para asegurar que todo funcione correctamente.

Inicializo variables.
Posiciono en primer registro.



var
valores : string;
begin
[...]
// Inicializo variable
valores := '';

// Me aseguro de estar en el primer registro del DataSet
FDQuery.First;

// Recorro DataSet hasta que no haya mas registros
while not FDQuery.EOF do
begin
valores := valores + FDQuery.FieldByName('A').Value;
FDQuery.Next;
end;
[...]
end;



Gracias por las respuestas, como siempre, un maestro. Saludos.