Saltar al contenido

Microsoft Access condensa varias líneas en una tabla

Solución:

Por lo general, debe escribir una función que le permitirá crear una lista concatenada. Esto es lo que he usado:

Public Function GetList(SQL As String _
                            , Optional ColumnDelimeter As String = ", " _
                            , Optional RowDelimeter As String = vbCrLf) As String
'PURPOSE: to return a combined string from the passed query
'ARGS:
'   1. SQL is a valid Select statement
'   2. ColumnDelimiter is the character(s) that separate each column
'   3. RowDelimiter is the character(s) that separate each row
'RETURN VAL: Concatenated list
'DESIGN NOTES:
'EXAMPLE CALL: =GetList("Select Col1,Col2 From Table1 Where Table1.Key = " & OuterTable.Key)

Const PROCNAME = "GetList"
Const adClipString = 2
Dim oConn As ADODB.Connection
Dim oRS As ADODB.Recordset
Dim sResult As String

On Error GoTo ProcErr

Set oConn = CurrentProject.Connection
Set oRS = oConn.Execute(SQL)

sResult = oRS.GetString(adClipString, -1, ColumnDelimeter, RowDelimeter)

If Right(sResult, Len(RowDelimeter)) = RowDelimeter Then
    sResult = Mid$(sResult, 1, Len(sResult) - Len(RowDelimeter))
End If

GetList = sResult
oRS.Close
oConn.Close

CleanUp:
    Set oRS = Nothing
    Set oConn = Nothing

Exit Function
ProcErr:
    ' insert error handler
    Resume CleanUp

End Function

La versión de Remou tiene la característica adicional de que puede pasar una matriz de valores en lugar de una declaración SQL.


La consulta de muestra podría tener este aspecto:

SELECT SourceTable.Name
    , GetList("Select Day From SourceTable As T1 Where T1.Name = """ & [SourceTable].[Name] & """","",", ") AS Expr1
FROM SourceTable
GROUP BY SourceTable.Name;

Aquí hay una solución simple que no requiere VBA. Utiliza una consulta de actualización para concatenar valores en un campo.

Lo mostraré con el ejemplo que estoy usando.

Tengo una tabla “emails_by_team” que tiene dos campos “team_id” y “email_formatted”. Lo que quiero es recopilar todos los correos electrónicos de un equipo determinado en una sola cadena.

1) Creo una tabla “team_more_info” que tiene dos campos: “team_id” y “team_emails”

2) rellene “team_more_info” con todos los “team_id” de “emails_by_team”

3) cree una consulta de actualización que establezca “emails_by_team” en NULL
Nombre de la consulta: team_email_collection_clear

UPDATE team_more_info 
SET team_more_info.team_emails = Null;

4) Este es el truco aquí: cree una actualización de una consulta
Nombre de la consulta: team_email_collection_update

UPDATE team_more_info INNER JOIN emails_by_team 
  ON team_more_info.team_id = emails_by_team.team_id 
SET team_more_info.team_emails = 
    IIf(IsNull([team_emails]),[email_formatted],[team_emails] & "; " & [email_formatted]);

5) para mantener la información actualizada, cree una macro que ejecute las dos consultas siempre que sea necesario

Primero: team_email_collection_clear

Segundo: team_email_collection_update

QED

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *