varias unir una sola rango perder nombres maneras manera facil datos convertir concatenar como combinar columnas celdas apellidos ms-access ms-access-2007 access-vba coalesce

ms-access - una - unir celdas en excel



Combinar filas/concatenar filas (5)

Estoy buscando un Access 2007 equivalente a la función COALESCE de SQL Server.

En SQL Server, podrías hacer algo como:

Persona

John Steve Richard

SQL

DECLARE @PersonList nvarchar(1024) SELECT @PersonList = COALESCE(@PersonList + '','','''') + Person FROM PersonTable PRINT @PersonList

Que produce: John, Steve, Richard

Quiero hacer lo mismo, pero en Access 2007.

¿Alguien sabe cómo combinar filas como esta en Access 2007?


Aunque Nz hace algo similar a COALESCE, no puede usarlo en Access para realizar la operación que está realizando. No es COALESCE quien está construyendo la lista de valores de fila, es la concatenación en una variable.

Desafortunadamente, esto no es posible dentro de una consulta de Access que tiene que ser una sola declaración SQL y donde no hay ninguna posibilidad de declarar una variable.

Creo que necesitaría crear una función que abriera un conjunto de resultados, iterar sobre él y concatenar los valores de fila en una cadena.


Creo que Nz es lo que buscas, la sintaxis es Nz(variant, [if null value]) . Aquí está el enlace de documentación: Función Nz

---Person--- John Steve Richard DECLARE @PersonList nvarchar(1024) SELECT @PersonList = Nz(@PersonList + '','','''') + Person FROM PersonTable PRINT @PersonList


Entiendo aquí que tiene una tabla "persona" con 3 registros. No hay nada comparable a lo que describes en Access.

En el acceso "estándar" (conjunto de registros DAO), tendrá que abrir un juego de registros y usar el método getrows para tener sus datos

Dim rs as DAO.recordset, _ personList as String, _ personArray() as variant set rs = currentDb.open("Person") set personArray = rs.getRows(rs.recordcount) rs.close

una vez que tenga este conjunto (será bidimensional), puede manipularlo para extraer la "columna" que necesitará. Puede haber una forma inteligente de extraer una matriz unidimensional de esta, para que luego pueda usar la instrucción "Unir" para concatenar cada valor de matriz en una cadena.


Para combinar filas en Access, probablemente necesites un código que se parece a esto:

Public Function Coalesce(pstrTableName As String, pstrFieldName As String) Dim rst As DAO.Recordset Dim str As String Set rst = CurrentDb.OpenRecordset(pstrTableName) Do While rst.EOF = False If Len(str) = 0 Then str = rst(pstrFieldName) Else str = str & "," & rst(pstrFieldName) End If rst.MoveNext Loop Coalesce = str End Function

Deberá agregar el código de manejo de errores y limpiar su conjunto de registros, y esto cambiará ligeramente si utiliza ADO en lugar de DAO, pero la idea general es la misma.


Aquí hay una muestra de Función definida por el usuario (UDF) y posible uso.

Función:

Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant) Dim db As Database Dim rs As DAO.Recordset Dim strList As String Set db = CurrentDb If strSQL <> "" Then Set rs = db.OpenRecordset(strSQL) Do While Not rs.EOF strList = strList & strDelim & rs.Fields(0) rs.MoveNext Loop strList = Mid(strList, Len(strDelim)) Else strList = Join(NameList, strDelim) End If Coalsce = strList End Function

Uso:

SELECT documents.MembersOnly, Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who, Coalsce("",":","Mary","Joe","Pat?") AS Others FROM documents;

Una versión de ADO, inspirada en un comentario de onedaywhen

Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant) Dim rs As New ADODB.Recordset Dim strList As String On Error GoTo Proc_Err If strSQL <> "" Then rs.Open strSQL, CurrentProject.Connection strList = rs.GetString(, , strColDelim, strRowDelim) strList = Mid(strList, 1, Len(strList) - Len(strRowDelim)) Else strList = Join(NameList, strColDelim) End If ConcatADO = strList Exit Function Proc_Err: ConcatADO = "***" & UCase(Err.Description) End Function

De: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29