Trabajando en consultas de Access para concatenar campos.

Llevo una semana tratando de lograr concatenar un campo en una consulta de Access y no lo logro. Como se imaginan esta consulta cuando la ejecuto me muestra para un mismo servicio un montón de registros donde la mayoría de los campos son iguales en cuanto a contenido de información, escepto un campo donde los datos son diferentes. Quiero que al ejecutar la consulta solo se muestre un registro por servicio y que el campo donde la información es diferente aparezcan en ese mismo campo separadas por una coma. Ej

Almacén central Contrato 125 fecha 5/1/24  servicio OP

Almacén central Contrato 125 fecha 5/1/24  servicio HG

Almacén central Contrato 125 fecha 5/1/24  servicio TY

¿Cómo necesito verlo?

Almacén central Contrato 125 fecha 5/1/24  servicio OP, HG, TY

2 Respuestas

Respuesta

Puede crear una función, por ejemplo

Function ConcatenarValores(CampoClave As String, CampoConcat As String) As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim sql As String
    Dim resultado As String
    Set db = CurrentDb
    ' SQL para seleccionar los valores que se concatenarán
    sql = "SELECT " & CampoConcat & " FROM SuTabla WHERE CampoClave = '" & CampoClave & "'"
    Set rs = db.OpenRecordset(sql)
    ' Recorrer los registros y concatenar los valores
    Do While Not rs.EOF
        If resultado <> "" Then
            resultado = resultado & ", " & rs(CampoConcat)
        Else
            resultado = rs(CampoConcat)
        End If
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    ' Retornar el resultado concatenado
    ConcatenarValores = resultado
End Function

Siga estos pasos:

1. Crear una nueva consulta de selección en Access.
2. Vaya al modo SQL de la consulta.
3. Use el siguiente SQL como referencia:

SELECT 
    Almacen, 
    Contrato, 
    Fecha, 
    STRING_AGG(servicio, ', ') AS servicios_concatenados
FROM 
    tu_tabla
GROUP BY 
    Almacen, 
    Contrato, 
    fecha;

Nota:
Almacen, Contrato, y Fecha son los campos en común.
El campo servicio es el que desea concatenar.

CampoClave en la función VBA debería ser un identificador único que distinga cada grupo, puedes modificarlo según sea necesario.

SuTabla es el nombre de su tabla o consulta original.

Alexis, si utiliza PostgreSQL lo puede hacer en una sola consulta, le dejo como ilustración y para que considere migrar a este servidor de datos. (Aunque en el foro alguien lo critica)

SELECT 
    Almacen, 
    Contrato, 
    Fecha, 
    STRING_AGG(servicio, ', ') AS servicios_concatenados
FROM 
    tu_tabla
GROUP BY 
    almacen, 
    contrato, 
    fecha;

Explicación:

STRING_AGG(servicio, ', '): Esta función toma los valores del campo servicio dentro de cada grupo y los concatena, separados por comas (o cualquier delimitador que elija).

GROUP BY almacen, contrato, fecha: Agrupa los registros por los campos almacen, contrato, y fecha, que son los campos que tienen valores iguales en cada grupo.

Disculpe que repetí la instrucción de PostgreSQL la de Access es:

3. Use el siguiente SQL como referencia:

SELECT Almacen, Contrato, Fecha,
ConcatenarValores([CampoClave], [servicio]) AS ServiciosConcatenados
FROM SuTabla
GROUP BY Almacen, Contrato, Fecha;
Respuesta

Hay que eliminar de la consulta el elemento que no es común y agruparla para que presente un único registro por cada ubicación (el almacén central) + el contrato (125) + la fecha (5/1/24.

Se crea una función que concatene los datos (que dependerá de como estén estructurados los datos) y que se añadirá a la consulta para mostrar los servicios (ya agrupados)

He creado una tabla con cuatro campos (que sustituye a la consulta) y generado una consulta sobre ella en la que he agrupado por los tres campos y generado uno nuevo (en lugar de agrupar en el lo he definido como 'expresión) y que llama a la función pasándole los parámetros que definen al registro.

NOTA: La función puede ser mucho mas simple en base a la estructura de los datos reales.

Public Function Concatena(Almc$, Cont&, Fech As Date) As String
Dim MSQL$
Dim TblTemp As Recordset
MSQL = "Select Servicios From tabla_servicios Where Almacenes = '" & Almc & "' And Contratos =" & Cont & " And CDbl(fechas) = " & CDbl(Fech)
Set TblTemp = CurrentDb.OpenRecordset(MSQL, , dbReadOnly)
With TblTemp
If .RecordCount <> 0 Then .MoveLast: .MoveFirst Else Exit Function
Concatena = "Servicios: "
Do Until TblTemp.EOF
    If Len(Concatena) > 12 Then Concatena = Concatena & ", "
    Concatena = Concatena & !Servicios
    .MoveNext
    Loop
.Close
End With
End Function

La SQL de la consulta con la llamada a la funcion:

SELECT Tabla_Servicios.Almacenes, Tabla_Servicios.Contratos, Tabla_Servicios.Fechas, concatena([almacenes],[contratos],[fechas]) AS Trabajos
FROM Tabla_Servicios
GROUP BY Tabla_Servicios.Almacenes, Tabla_Servicios.Contratos, Tabla_Servicios.Fechas;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas