Access - Unir elementos si es del mismo cliente

Tengo un formulario en el cual le hago una consulta y me muestra todos los elementos de todos los clientes. El problema es que en el formulario me sale de la siguiente manera:

Cliente:PEPE ELEMENTO:X1

Cliente:PEPE ELEMENTO:X2

Cliente: Jose ELEMENTO: Y
Me gustaria que si el cliente es el mismo apareciera de la siguiente manera en el formulario
Cliente:PEPE ELEMENTO:X1, X2
Cliente:Jose ELEMENTO:Y

Muchas Gracias>>>Black

3

3 respuestas

Respuesta
2

No dices si los datos ya están o los vas a poner después. Vamos a suponer que ya están y vamos a suponer( que es mucho suponer) que consigo explicarme. Si tienes una tabla como la imagen

Crea una tabla Casos, igual a la anterior pero el id numérico, Supongamos que tienes un formulario

En el evento al hacer clic del botón le pongo(prepárate)

DoCmd.RunCommand acCmdSaveRecord

Dim a As Integer
For a = 1 To Form.Recordset.RecordCount
Contador = Nz(DCount("cliente", "atributo", "cliente=forms!atributo!cliente and id<=" & Me.Id & ""))
DoCmd.GoToRecord , , acNext
Next

DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
Dim i As Integer
For i = 1 To Form.Recordset.RecordCount
Select Case Contador
Case Is = 1
DoCmd.RunSQL "insert into casos(cliente,casos,contador)values(cliente,casos,contador)"
Case Is = 2
Dim b As String
b = DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=1") & "," & Casos
DoCmd. RunSQL "insert into casos(cliente, casos, contador)values(cliente,'" & b & "', contador)"
DoCmd.RunSQL "delete * from casos where cliente=forms!atributo!cliente and contador<2"
Case Is = 3
Dim c As String
c = DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=1") & "," & DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=2") & "," & Casos
DoCmd. RunSQL "insert into casos(cliente, casos, contador)values(cliente,'" & c & "', contador)"
DoCmd.RunSQL "delete * from casos where cliente=forms!atributo!cliente and contador<3"
Case Is = 4
Dim d As String
d = DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=1") & "," & DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=2") & "," & DLookup("casos", "atributo", "cliente=forms!atributo!cliente and contador=3") & "," & Casos
DoCmd. RunSQL "insert into casos(cliente, casos, contador)values(cliente,'" & d & "', contador)"
DoCmd.RunSQL "delete * from casos where cliente=forms!atributo!cliente and contador<4"

End Select

DoCmd.GoToRecord , , acNext
Next
DoCmd.GoToRecord , , acFirst
Form.RecordSource = "select * from casos"

Con lo que el formulario te quedará

El cuadro de texto Contador, se puede poner como oculto o quitarlo. Lo he dejado a la vista para que se vea el proceso.

1º Va contando registro a registro cuantas veces se repite un cliente con un caso y se lo pone en el campo contador. Como en la imagen

Verás que Pepe ha llegado a 3, María y Ramón a 2

2º Luego va registro a registro insertando en la tabla Casos los valores y en caso de que ingrese, por ejemplo Pepe Verde, amarillo elimina el registro de pepe verde. Luego cuando inserte Pepe Verde, Amarillo, No hace nada elimina Pepe Verde, Amarillo y te queda la tabla Casos como

Y por último le digo que el origen del formulario sea la tabla Casos.

Respuesta
2
Respuesta
1

¿Cuántos elementos máximo debes unir?

Te he preparado este ejemplo haber si lo puedes adaptar:

Se requieren 3 tablas 1 consulta y 2 formularios:

TABLAS

CONSULTA

FORMULARIOS

EVENTO AL ABRIR EL FORMULARIO

Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings (False)
DoCmd.RunSQL "DELETE * FROM tbl_temporal;"
Me.frmSub_Resultado.Form.Requery
End Sub

CÓDIGO DEL BOTÓN AGRUPAR

Private Sub cmdAgrupar_Click()

' Ejemplo preparado por EDUARDO PEREZ FERNANDEZ
' Para TodoExpertos

Dim db As Database
Dim rs As Recordset
Dim rs1 As Recordset
Dim strCadena As String
Dim lnCliente As Long
Dim strFinal As String
Set db = CurrentDb
Set rs = db.OpenRecordset("tblClientes")
Set rs1 = db.OpenRecordset("tblVentas")
DoCmd.SetWarnings (False)

Do Until rs.EOF
lnCliente = rs!idcliente
strCadena = ""
Do Until rs1.EOF
If rs!idcliente = rs1!idcliente Then
strCadena = "" & strCadena & "," & rs1!articulo
End If
rs1.MoveNext
Loop
strCadena = "'" & Mid(strCadena, 2) & "'"
strFinal = "(" & lnCliente & "," & strCadena & ");"
DoCmd.RunSQL "INSERT INTO tbl_temporal(idcliente,articulo) VALUES " & strFinal
Rs1. MoveFirst
Rs. MoveNext
Loop
Rs. Close
Rs1. Close
Db. Close
Set db = Nothing
Set rs = Nothing
Me.frmSub_Resultado.Visible = True
Me.frmSub_Resultado.Form.Requery

End Sub

RESULTADO FINAL 

Este ejemplo no tiene limite de registros de clientes y artículos. Si no puedes hacerlo envíame un correo [email protected] y con gusto te envío el ejemplo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas