Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Juntar registros en uno solo.

2,965 views
Skip to first unread message

L. Garcia

unread,
Mar 3, 2009, 11:52:47 AM3/3/09
to
Hola de nuevo grupo:

Necesitaría juntar la información de varios registros en uno solo, el
problema es que es un campo de texto:

Supongamos un tabla como esta:

CampoCliente, CampoProducto, Unidades
ClienteA, ProductoA, 10
ClienteB, ProductoA, 20
ClienteA, ProductoB, 30
ClienteC, ProductoC, 40
ClienteB, ProductoB, 50

Necesitaría una consulta tal que así:

SELECT CampoCliente, JOIN(CampoProducto) AS Productos, SUM(Unidades) AS
Total
FROM TABLA Group BY CampoCliente

Que me mostrara:

CampoCliente, Productos, Total
ClienteA, ProductoA/ProductoB, 40
ClienteB, ProductoA/ProductoC, 60
ClienteC, ProductoC, 50

¿ Es esto posible ? ¿ Cómo ? ¿ Se puede crear una función personalizada
(VBA) para hacer esto ?

Saludos y gracias por leer hasta aquí.
Luis


Patxi Sanz

unread,
Mar 3, 2009, 12:12:50 PM3/3/09
to
Hola L.García:

Usa una consulta de totales para sumar los productos, y coloca una función
personalizada que una los datos:

- http://es.geocities.com/patxisanz/ejemplos/unirregistros.html
-
http://sqlraipon.blogspot.com/2008/05/funcin-agregada-de-dominio-encadenar.html

--
Un saludo,


Patxi Sanz
patxisanz[ARROBA]yahoo[PUNTO]es
http://es.geocities.com/patxisanz/index.html
Tudela (NA)

jmmiralles

unread,
Mar 3, 2009, 12:42:02 PM3/3/09
to
Hola L.Garcia

A parte de lo de Patxi, podrías hacer también un consulta de tablas de
referencias cruzadas.

Saludos


"L. Garcia" escribió:

Ju@nK [MVP 2006/9]

unread,
Mar 3, 2009, 3:06:21 PM3/3/09
to
Una consulta de referencias cruzadas te devolvería
CampoCliente, ProductosA, ProductoB, ProductoC Total
ClienteA, 40, 0, 0, 40
ClienteB, 20, 50, 0, 70
ClienteC, 0, 0, 50, 50

Para hacer lo que quieres debes recorrer la tabla con un recordset e ir
cargando todo, puedes meterlo en una tabla temporal para despues utilizarla
en un informe u otros objetos. ej.:
Public sub LLenaTmp()
dim mirs as dao.recordset
dim tmprs as dao.recordset
dim c as string
dim v as long
dim p as string
set mirs = currentdb.openrecordset("Select * TuTabla Order by CampoCliente,
Producto")
set tmprs = currentdb.openrecordset("TablaTemporal")
mirs.movefirst
c=mirs.CampoCliente
do while not mirs.eof
if c=mirs.CampoCliente then 'el mismo cliente
v=v + mirs.Unidades
p=p & mirs.Productos & "/"
mirs.movenext 'vamos al siguiente registro
else 'Cargamos el registro temporal y actualizamos el valor Cliente
tmprs.addnew 'agregamos un registro nuevo a la temporal
tmprs.CampoCliente = c
tmprs.Productos = p
tmprs.Total = u
tmprs.update
c=mirs.CampoCliente
end if
loop
End Sub
--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/09
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**
"jmmiralles" <jmmir...@discussions.microsoft.com> escribió en el mensaje
news:FFB23F48-9E7C-4874...@microsoft.com...

L. Garcia

unread,
Mar 4, 2009, 3:47:55 AM3/4/09
to
Hola Patxi.

> Usa una consulta de totales para sumar los productos, y coloca una función
> personalizada que una los datos:
>
> - http://es.geocities.com/patxisanz/ejemplos/unirregistros.html
> -
> http://sqlraipon.blogspot.com/2008/05/funcin-agregada-de-dominio-encadenar.html

Otra vez me solucionas el problema :-)

Aunque tengo que reconocer que esperaba que Access admitiera la creación de
funciones personalizadas de dominio al estilo de:

Function MyAccionDominio(Valor As Object, Accion As enum) As Object
Static Result As String 'Object
Dim cRet As Object

If Accion = enum.Accion Then ' Se ejecuta en cada registro
Result = Result & Valor ' Concatenamos (o mulitplicamos, o lo que
queramos)
cRet = True
ElseIf Accion = enum.FinalGrupoRegistros Then ' Se ejecuta cuando se
'cierra' un dominio
cRet = Result
Result = "" ' Inicializamos valor entre
'dominios'
ElseIf Accion = enum.Inicializar Then ' Se ejecuta al inicializar el
proceso
Resul = "" ' Inicializamos funcion.
ElseIf Accion = enum.Finalizar Then ' Se ejecuta al finalizar el proceso
Resul = "" ' Reseteamos funcion.
Endif

Return cRet
End Function

Pero si no puede ser, no puede ser

Gracias de nuevo

Saludos


L. Garcia

unread,
Mar 4, 2009, 3:51:47 AM3/4/09
to
Gracias a ambos:

Pero el problema es que necesito hacerlo para varios campos de GroupBy y no
siempre los mismos, por lo que la cosa se complicaria.

Graicas por responder

Saludos

"Ju@nK [MVP 2006/9]" <con...@hotmail.com> escribió en el mensaje
news:uWrPHuDn...@TK2MSFTNGP06.phx.gbl...

Ju@nK [MVP 2006/9]

unread,
Mar 4, 2009, 9:31:01 AM3/4/09
to
¿Has leido todo? la función que te puse hace lo que quieres.

--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/09
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**

"L. Garcia" <liuxi...@redestb.es> escribió en el mensaje
news:%23zfIbeK...@TK2MSFTNGP03.phx.gbl...

L. Garcia

unread,
Mar 4, 2009, 9:58:01 AM3/4/09
to
"Ju@nK [MVP 2006/9]" <con...@hotmail.com> escribió en el mensaje
news:ucqHXXNn...@TK2MSFTNGP06.phx.gbl...

>
> ¿Has leido todo? la función que te puse hace lo que quieres.

El ejemplo que puse era simplificado, y solo agrupaba por un campo
(CampoCliente), pero mi caso real son para agrupar por 'n' campos, y no
siempre los mismos. En tu solucion solo se contempla para cuando se agrupa
por un solo campo. Se puede ampliar, para que compare 'n' campos variables,
etc. pero el final viene a ser parecido a la solucion de Patxi.

De todas formas gracias por responder.

Saludos


Patxi Sanz

unread,
Mar 4, 2009, 11:35:42 AM3/4/09
to
Que yo sepa, Access no admite ese estilo de programación, exceptuando las
funciones personalizadas para cargar listas en cuadros combinados y de
lista.

Ju@nK [MVP 2006/9]

unread,
Mar 5, 2009, 9:26:45 AM3/5/09
to
Si, claro lo que hace es concatenar

--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/09
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**

"L. Garcia" <liuxi...@redestb.es> escribió en el mensaje
news:%23syoZoN...@TK2MSFTNGP04.phx.gbl...

0 new messages