Access - Juntar registros en un solo campo.

 
Vista:
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Dany (40 intervenciones) el 02/05/2016 23:59:52
Hola saludos cordiales a todos.

Tengo una tabla asi:

Codigo Sector
DNA 2501
NDT 2401
DNA 2502
TNT 2381
DNA 2336
NDT 2405

Quiero lograr juntar en otra tabla temporal o alguna consulta todos los Codigos con su Sector concantenados.

Algo así:
DNA 2501, 2502, 2336
NDT 2401, 2405
TNT 2381

Actualmente hago este proceso con un RecordSet y 3 consultas para concatenar los campos. en uno solo, agregando 7 u 8 columnas en la tabla final, pero si el registro no tiene Codigo no tiene tantos sectores al correr la consulta me pide los parametros para esas columnas.

Encontre este otro trozo de codigo pero no lo he podido hacer funcionar, me marca error "No value given for one or more required parameters"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Public Function Conc(Fieldx, Identity, Value, Source) As Variant
  Dim cnn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim SQL As String
  Dim vFld As Variant
 
  Set cnn = CurrentProject.Connection
  Set rs = New ADODB.Recordset
  vFld = Null
 
  SQL = "SELECT [" & Fieldx & "] as Fld" & _
        " FROM [" & Source & "]" & _
        " WHERE [" & Identity & "]=" & Value
 
  ' open recordset.
 
 
 
  rs.Open SQL, cnn, adOpenForwardOnly, adLockReadOnly
 
  ' concatenate the field.
  Do While Not rs.EOF
    If Not IsNull(rs!Fld) Then
      vFld = vFld & ", " & rs!Fld
    End If
    rs.MoveNext
  Loop
  ' remove leading comma and space.
  vFld = Mid(vFld, 2)
 
  Set cnn = Nothing
  Set rs = Nothing
 
  ' return concatenated string.
  Conc = vFld
End Function

Existira alguna forma mas corta y rapida de hacer lo que pretendo?

Saludos

DS
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Enrique Heliodoro (1664 intervenciones) el 03/05/2016 02:07:37
No entiendo la aplicación que intentas con ese código que (parece) que no has analizado.

En teoría a esa función se le pasan una serie de parámetros y devuelve los elementos que coincidan con la condición (uno de los parámetros) en una única línea y separados por coma
(posiblemente en el sitio en que lo localizaste exista una descripción de su uso o aplicación mas extensa)

En principio yo lo haría con DAO (es el optimo en Access) y lo planificaría así:

Genero una consulta que devuelva a ese conjunto de datos, ordenados (en este caso) por código

Esa consulta seria el origen de datos del recordset (así entrarían todos y no uno solo como en el código mostrado).

Después se recorrería el recordset has su final 'recordando' el código
.- si en la línea siguiente se repite lo concateno
.- si es diferente inicio una nueva línea y memorizo el nuevo código (para compararlo con el siguiente).....


He hablado de 'líneas' porque desconociendo el destino real es lo mas socorrido, pero nada impide que (bien con DAO o con una consulta de inserción) se generen registros en una tabla (algo que se debería definir como primer paso: el destino)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Dany (40 intervenciones) el 03/05/2016 21:57:45
Hola Enrique.

Como podria recordar el codigo anterior para ir lo concatenando si es que se repirte o con elsiguiente registro?

Estoy con este RecordSet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ReDim MiSQLDel As String
Dim rst As DAO.Recordset, i As Variant, Actual As String
Dim db As DAO.Database
Dim Cambio_i_grupo As Long
 
With DoCmd
.SetWarnings False
    Set rst = CurrentDb.OpenRecordset("SELECT CrossT.CODIGO, CrossT.SECTOR, CrossT.TODOS FROM CrossT ORDER BY CrossT.CODIGO, CrossT.SECTOR;")
   End With
 
If rst.RecordCount = 0 Then Exit Function
 
With rst
 
.MoveLast
.MoveFirst
 
Do Until .EOF
    'i = i + 1
 
    If ![CODIGO] <> Actual Then i = 1: Actual = ![CODIGO]
    .Edit
    ![TODOS] = ![SECTOR] & ", " & ![SECTOR]
    .Update
    .MoveNext
    Loop
 
End With
 
rst.Close
Set rst = Nothing

Lo que estoy concatenando es el mismo Sector no he podido aun rcordar el codigo anterior y concatenarlo.

Saludos

DS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Enrique Heliodoro (1664 intervenciones) el 04/05/2016 01:33:59
Antes de iniciar el bucle (tras el 'meneo de refresco que se le hace al recordset) en teoría estaríamos en el PRIMER registro de ese conjunto, es el momento optimo para tomar la referencia inicial (el código referente):

.....
.MoveLast
.MoveFirst
Actual = !codigo
Do Until .EOF
.....

Si razonas un poco lo que haces, veras que en la practica no haces nada, sin embargo si cambias la variable 'i' (que no pinta nada y menos en formato VARIANT para almacenar un digito) y en su lugar creas una de texto para ir CONCATENANDO los diversos valores encontrados, verías el final del túnel.

Un supuesto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Function xxx()
Dim rst As DAO.Recordset, ConTodos As String, Actual As String
Set rst = CurrentDb.OpenRecordset("SELECT CODIGO, SECTOR, TODOS FROM CrossT ORDER BY CODIGO, SECTOR")
If rst.RecordCount = 0 Then Exit Function
With rst
.MoveLast
.MoveFirst
Actual = !codigo
Do Until .EOF
    If ![codigo] <> Actual Then
       'aqui tendriamos en 'ConTodos' todos los sectores asociados a ese codigo ¿que hacemos con esa cadena de texto?
       'Propongo actualizar la tabla destino, tenemos un codigo (en 'actual') y sus sectores asociados (en 'contodos')
       'reiniciamos variables para obtener un nuevo subconjunto
       Actual = ![codigo]: ConTodos = ""
       End if
    If ConTodos <> "" Then ConTodos = ConTodos & ", "
    ConTodos = ConTodos & !sector
    .MoveNext
    Loop
.Close
End With
Set rst = Nothing
End Function

Con tu método no concatenas nada (repites el código actual dos veces y punto) y en el mejor de los casos de haber mas de un sector para el mismo código, al primero le meterías a si mismo (uno), al siguiente dos (concatenarías con el anterior), y al siguiente tres, ... así hasta finalizar ese subconjunto (y no creo que sea eso lo que se desea)

Si se dispusiera de una tabla ya 'simplificada' (un único código y un campo vacío para los sectores), una simple consulta de actualización llenaría ese campo vacío y si fuera de inserción, añadiría el código y el subconjunto de sectores concatenado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Dany (40 intervenciones) el 19/05/2016 23:26:10
Gracias Enrique.

El codigo funciona bien, solo un problema el primer registro no me lo actualiza. Es decir se desfasa un registro hacia abajo el Sector del registro 1 me lo actualiza en el registro 2 el 3 en el 4 y asi sucecivamente. El primer sector me lo deja en blanco y el ultimo me lo actualiza con el penultimo registro algo asi como lo muestra la imagen o el archive adjunto:



Archivo

Saludos

DS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/05/2016 01:04:13
Lo que se actualice dependerá de la parte que esta comentada y que (yo al menos) desconozco como has resuelto.

No se que sentido tiene el guardar ese dato en todos los registros, lo correcto seria crear ese resumen en tiempo real cuando se precisase (para empezar seria as fiel).

De todas formas si se desea que ese resultado se guarde en todos los registros habría que efectuar algunos cambios, el primero consistiría en abrir esa tabla en modo de lectura (permitiría que de forma independiente se pudiese actualizar) y la actualización consistiría en una SQL de actualización de todos los registros implicados (esto es: aquellos cuyo código coincidiese con el valor de 'Actual' y antes de cambiarle el valor).

Asumo que el problema que tienes es porque no has efectuado un 'paso a paso' y cuando recorres el bucle (al llegar al cambio de código)utilizas el valor que hay en '!codigo' sin apercibirte que ese 'es el primero de los siguientes'

El conjunto que acabas de concatenar esta (aun) en la variable 'ConTodos' y se corresponden con el valor de código que esta en 'Actual'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Esteban

Juntar registros en un solo campo.

Publicado por Esteban (1 intervención) el 03/05/2016 16:17:30
Hola,

Para que quieres concatenar los registros de esa forma?

Porque en una tabla es inconveniente hacer eso, sopongamos que tienes muchos codigos, un campo de una tabla tiene un limite maximo de carácteres.

Si me explicas un poco mejor que intentas construir te podría ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Juntar registros en un solo campo.

Publicado por Dany (40 intervenciones) el 03/05/2016 16:55:59
Hola gracias por contestar.

Bueno el codigo se puede repetir varias veces por ello hago una consulta de datos agrupados para que me agrupe solo los codigos y los secotres diferentes y sobre esta consulta lo maximo que he visto que se repite el codigo son hasta 15 veces y el sector siempre son 4 o 6 digitos, que serian 90 digitos sin contar el separador "/" o "," y el campo en la tabla tiene capacidad hasta de 255 caracteres por lo que creo no habria problemas.

EDITO:

Los registros los necesito concatenar para que el usuario vea en un solo registro todos los sectores a los que aplica el codigo.

Esta es una imagen de la tabla original:


Tabla
Y esta es la consulta agrupada:

Consulta

Gracias por la ayuda....!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar