Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Concatenar varios registros

Hola gente del foro, tal como dice el titulo necesito concatenar varios registros en uno.

Utilizo Firebird 2.0.

Tengo 2 tablas, compras (noc:integer, area: string, proveedor:string) y detcompras(noc:integer, ncorr:integer, descripcion: string)

Ocurre que por cada registro de la tabla compras existe al menos 1 en la tabla detcompras.

Necesito hacer una consulta tal que me arroje todos los registros de la tabla compras (noc, area y proveedor), y adicionalmente en un solo campo todos las descripciones de la tabla detcompras.

Por ejemplo.

tabla compra:
registro 1: noc, area, proveedor --> 4, PROYECTO, JUAN
registro 2: noc, area, proveedor --> 5, EXISTENCIA, PEDRO

tabla detcompras:
registro 1: noc, ncorr, descripcion --> 4, 1, mas
registro 1: noc, ncorr, descripcion --> 5, 1, prueba
registro 2: noc, ncorr, descripcion --> 5, 2, clavo
registro 3: noc, ncorr, descripcion --> 5, 3, cosas

Lo que necesito es que mi consulta me arroje lo siguiente:

registro 1: noc, area, proveedor, detalle --> 4, PROYECTO, JUAN, mas
registro 2: noc, area, proveedor, detalle --> 5, EXISTENCIA, PEDRO, prueba clavo cosas

Espero se entienda.

Saludos
Responder Con Cita
  #2  
Antiguo 01-07-2010
urixiv urixiv is offline
Miembro
 
Registrado: sep 2006
Posts: 23
Poder: 0
urixiv Va por buen camino
Hola,
primero de todo decirte que no se si en Firebird se puede hacer o no, pero te comento como lo haría yo con SQL Server.
Crearía una tabla temporal en ejecución, en la que con un cursor, iria recorriendo tu tabla Detcompras e iria concatenando los strings de cada producto.
Es decir en esta tabla guardaria tu campo noc y el string concatenado.
Para concatenarlo iria haciendo updates en esta tabla temporal.
Luego solo te quedaria hacer la select normal, haciendo join contra esta tabla temporal para tener los datos como los quieres.

Como te comento, esto en SQL Server se puede hacer, me imagino que con Firebird tambien. Seguro que hay alguna implementación más eficiente, pero ahora no se me ocurre!

Espero haberte ayudado o al menos haberte dado una pista de para donde tirar
Responder Con Cita
  #3  
Antiguo 01-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No se si con una consulta sólo vas a poder hacerlo. Me da la impresión de que va a necesitar un Stored para hacer el recorrido y guardar las descripciones en el campo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 01-07-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Podria ser asi:
Código SQL [-]
CREATE PROCEDURE spComprasDetalle
RETURNS(NOC INTEGER,
AREA VARCHAR(30),
PROVEEDOR VARCHAR(30),
DETALLE VARCHAR(200)) 
--Los largos de las variables debes definirlas de acuerdo a tus campos.

AS
DECLARE VARIABLE strDetalle VARCHAR(30);
BEGIN
      FOR SELECT NOC, AREA, PROVEEDOR
             FROM COMPRA
             INTO :NOC, :AREA,:PROVEEDOR
      DO
      BEGIN
              --Busca los detalles de DetCompras
              DETALLE='';
              FOR SELECT DESCRIPCION
                    FROM DETCOMPRAS
                    WHERE DETCOMPRAS.NOC=:NOC
                    INTO :strDetalle
              DO
              BEGIN
                      --Concatena los detalles
                      DETALLE=DETALLE||' '||strDetalle;
              END     

              SUSPEND;
      END
END;

NOTA: Este codigo no esta probado.
Responder Con Cita
  #5  
Antiguo 01-07-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Creo que esto lo tengo que resolver con un proceso almacenado, donde le defino una variable de entrada com integer igual al numero de orden de compra. Algo así.

Código SQL [-]
create or alter procedure PRUEBA2 (
    NUMERO integer)
returns (
    NOC integer,
    FINAL varchar(200))
as
declare variable TOTAL varchar(200);
declare variable DESCRIP varchar(200);
begin
for select descrip_ins from DETCOMPRAS where NOC = :numero
into ESCRIP do
begin
total = ESCRIP ||' '|| :descrip;
end
for select noc,  :total from COMPRAS where NOC = :numero
into :noc,  :final do
begin
suspend;
end
end

Por ejmplo en la tabla detcompras tengo 23 registros de la ordenn numero 5, al correr este procedimiento, me repite la descripción del ultimo registro por 3 veces, el primero y el segundo nada.

Porque podrá ser esto?
Cual podría ser la forma correcta de hacer este procedimiento?

Espero me puedan ayudar.

Gracias

Última edición por Neftali [Germán.Estévez] fecha: 01-07-2010 a las 18:27:25. Razón: Correccion de etiquetas
Responder Con Cita
  #6  
Antiguo 01-07-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Al parecer no viste el codigo que te escribi mas arriba.

Saludos
Responder Con Cita
  #7  
Antiguo 01-07-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
No me di cuenta del nuevo post.

Gracias, funciono perfecto. Una sola cosa, es un detalle, pero si se pudiese solucionar ideal.

Lo que me arroja el resultado del procedimiento en el parametro de salida "detalle", se tiene un un separador " ", entre las distintas cadenas de los registros, el problema es que este separador también me lo incluye antes del primer registro.

Gracias, por todo.

Saludos
Responder Con Cita
  #8  
Antiguo 01-07-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Podrias incorporar una verificacion del largo de la variable DETALLE...

Código SQL [-]
 --Concatena los detalles
IF (CHAR_LENGTH(DETALLE)=0) THEN
   DETALLE=strDetalle;
ELSE
   DETALLE=DETALLE||' '||strDetalle;

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
Restar, Sumar varios registros a la vez Lenny Varios 2 28-05-2010 20:38:30
Borrar varios registros en un Dbrepeater David82 PHP 0 09-09-2008 13:40:37
Impresión de varios registros con QREPORT bosamel Impresión 3 19-01-2005 14:49:51
Varios registros en 2 Bands Detail y Summary Franklim Impresión 1 29-04-2004 21:21:12


La franja horaria es GMT +2. Ahora son las 08:53:51.


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