domingo, 25 de mayo de 2008

FUNCIÓN AGREGADA DE DOMINIO ENCADENAR


Se trata de una función creada en vba, po lo tanto, debe estar en un módulo :
'////////////////////////////////////////////////////////////////////
'Ramon Poch, raipon. Terrassa a 13/11/2005
'Encadenar, permite obtener una cadena con los valores de un campo de
'una Tabla, consulta o instrucción sql, separados por un caracter
'a elegir. Su uso es muy similar a las funciones agregadas de dominio.
' -Separador es el caracter delimitador que escogemos para separar los
' distintos valores.
' -Tabla puede ser una la tabla, consulta, o intrucción sql.
' -Campo es una expresión que nos identifica una columna (de la Tabla,
' consulta o instrucción sql) de la que queremos concatenar sus valores.
' -Condición (opcional) nos permite filtrar los resultados. Similar a una condición
' Where pero sin dicha palabra. Al igual que las funciones agregadas de dominio,
' debemos tener las siguientes precauciones al pasar un valor o una referéncia a

' un campo :
' -Delimitar el valor o el campo según el tipo de dato (usar ' para
' texto y # para fechas.
' Ejemplo "Ciudad='Barcelona'" o "CampoFecha=#" & CampoFecha & "#"
' -Ademas, en lo que respecta a las fechas debemos formatearlas al
' estilo 'Americano'.
' Ejemplo "CampoFecha=#12/31/2005#" o
' "CampoFecha=#" & Format(CampoFecha, "mm/dd/yyyy") & "#"
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Public Function Encadenar(Separador As String, tabla As String, Campo As String, _
Optional Condición As String) As String
On Error Resume Next
Dim rst As New ADODB.Recordset

rst.Open _
"Select " & Campo & " From (" & tabla & ") WHERE " & Campo & " Is not null" & _
IIf(Len(Condición) > 0, " AND " & Condición, ""), _
CurrentProject.Connection, adOpenStatic, adLockReadOnly

If Err.Number > 0 Then
Encadenar = ""
rst.Close
Exit Function
End If

If rst.EOF Then
Encadenar = ""
Else
Encadenar = rst.GetString(adClipString, , Separador, Separador)
Encadenar = Left(Encadenar, Len(Encadenar) - Len(Separador))
End If

rst.Close
End Function

Una vez esté guardado el módulo, podemos llamar a dicha función obteniendo una cadena con los valores del campo escogido concatenados, delimitada por el caracter que hayamos definido. Ejemplo sobre la tabla Proveedores de Neptuno.mdb :

SELECT Proveedores.NombreCompañía,
Encadenar(", ", "Productos","NombreProducto", "IdProveedor=" &
[Proveedores].[IdProveedor]) AS Productos
FROM Proveedores;

Ramon Poch. Terrassa a 13/11/2005