Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2022
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-12-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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-"
Responder Con Cita
  #3  
Antiguo 14-12-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
  #4  
Antiguo 14-12-2022
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Talking

Cita:
Empezado por duilioisola Ver Mensaje
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Impresion de datos multiples rruffino Impresión 0 16-03-2013 21:26:02
Multiples datos seleccionados StringGrid lacovera OOP 4 15-06-2011 19:15:39
Acceso a datos de multiples BD islu Providers 3 13-05-2005 23:46:44
Formatear y concatenar salida de datos RyAr SQL 4 18-02-2005 14:01:36
Concatenar Datos Tipo Character Oxa78 SQL 2 14-10-2004 17:50:28


La franja horaria es GMT +2. Ahora son las 09:01:24.


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
Copyright 1996-2007 Club Delphi