Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Concatenar multiples datos de una celda. (https://www.clubdelphi.com/foros/showthread.php?t=96002)

pgranados 13-12-2022 23:47:47

Concatenar multiples datos de una celda.
 
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:

Código Delphi [-]
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

Código:

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

Código SQL [-]
/* Contenido concatenado sin separador */
select list(CAMPO_A, '')
from TABLA
where
ID < 3

Resultado: BLOB="111"

Código SQL [-]
/* 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"

Código SQL [-]
/* 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.

Código Delphi [-]
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

Cita:

Empezado por duilioisola (Mensaje 549575)
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.

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 08:24:14.

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