Consulta Access concatenar campos con un separador empleando SIINM, ESNULO u otros

Tengo una tabla en ACCESS con varios campos, CARRETERA01, CARRETERA02, CARRETERA03, CARRETERA04 y CARRETERA05. He creado una consulta con un campo calculado CARRETERASTOTAL, donde quiero que salgan todas las carreteras de los otros campos, concatenadas y separadas por “;”. Si lo concateno normal “a pelo” cuando solo hay datos en el campo CARRETERA01 y ninguno en el resto de campos, me salen obviamente
Cuatro signos “;” (así sucesivamente dependiente de los campos rellenados), para evitar esto creé esta fórmula condicional:

CARRETERASTOTAL:SIINM(ESNULO([CARRETERA02]);CARRETERA01];SIINM(ESNULO([CARRETERA03]);[CARRETERA01] & "; " & [CARRET

CARRETERASTOTAL:SIINM(ESNULO([CARRETERA02]);CARRETERA01];SIINM(ESNULO([CARRETERA03]);[CARRETERA01] & "; " & [CARRETERA02];SIINM(ESNULO([CARRETERA04]);CARRETERA01] & "; " & [CARRETERA02] & “; “ & [CARRETERA03];0)))

Me da el siguiente error:

“La expresión que ha especificado contiene una función con un número incorrecto deargumentos”

En alguna que otra prueba con

Todas las carreteras que tengo que poner, también me salió el mensaje:

“El texto es demasiado largo para modificarlo”

…Y es que imginaos cuando termine esta fórmula como será de grande, pues lo mismo tengo que hacer para concatenar 11 carreteras, 15 trabajadores y 7 vehículos.

Salgo con la cabeza caliente y los pies fríos y no hay forma de que encuentre una solución.

A ver si alguien me puede echar una mano.

Igual estoy obcecado con la función SIINM y ESNULO, tal vez haya otra forma de hacerlo pero la desconozco.

1 respuesta

Respuesta
1

Esta es la mejor solución que te puedo dar:

1º/ Crea un módulo nuevo en tu BD

2º/ Pega esta función en el módulo:

Public Function fncConcatena(ParamArray losDatos()) As String
Dim i As Integer
Dim numElem As Integer
numElem = UBound(losDatos)
fncConcatena = ""
For i = 0 To numElem
 fncConcatena = fncConcatena & Nz(losDatos(i)) & ";"
Next i
'Depuramos el resultado
Do While InStr(1, fncConcatena, ";;") <> 0
 fncConcatena = Replace(fncConcatena, ";;", ";")
Loop
If Left(fncConcatena, 1) = ";" Then
 fncConcatena = Right(fncConcatena, Len(fncConcatena) - 1)
End If
If Right(fncConcatena, 1) = ";" Then
 fncConcatena = Left(fncConcatena, Len(fncConcatena) - 1)
End If
End Function

3º/ En tu consulta, elimina el campo CARRETERASTOTAL que tienes, y pon este otro:

CARRETERASTOTAL: fncConcatena([CARRETERA01];[CARRETERA02];[CARRETERA03];[CARRETERA04];[CARRETERA05])

Esta función te sirve para cualquier campo (carreteras, trabajadores...) y es independiente del número de campos que quieras concatenar, lo único que tienes que hacer es pasárselos como parámetros, separados por punto y coma si la usas en una consulta.

Hola de nuevo,

Muchas gracias Sveinbjorn por haberte tomado la molestia de ayudarme. El resultado ha sido totalmente satisfactorio, no lloro porque los hombres no lloran que diría mi abuela, gracias de nuevo.

Solo quería pedirte un último favor..., y no es otro que mandaras el módulo que tengo que poner para que en vez de estar separadas las carreteras por "un punto y coma", estuvieran separadas por UN PUNTO Y COMA SEGUIDO DE UN ESPACIO EN BLANCO. Lo puse en mi pregunta pero igual debería haberlo aclarado mejor.

He intentado modificar el módulo y la consulta pero doy palos de ciego pues no se como hacerlo.

Un saludo,

Pero se me escapó ese "pequeño" detalle. El código de la función sería este otro:

Public Function fncConcatena(ParamArray losDatos()) As String
Dim i As Integer
Dim numElem As Integer
numElem = UBound(losDatos)
fncConcatena = ""
For i = 0 To numElem
 fncConcatena = fncConcatena & Nz(losDatos(i)) & "; "
Next i
'Depuramos el resultado
Do While InStr(1, fncConcatena, "; ;") <> 0
 fncConcatena = Replace(fncConcatena, "; ;", ";")
Loop
If Left(fncConcatena, 1) = ";" Then
 fncConcatena = Right(fncConcatena, Len(fncConcatena) - 2)
End If
If Right(fncConcatena, 2) = "; " Then
 fncConcatena = Left(fncConcatena, Len(fncConcatena) - 2)
End If
End Function

Fíjate que le añado un espacio después del punto y coma cuando concateno:

fncConcatena = fncConcatena & Nz(losDatos(i)) & "; "

y luego a la hora de depurar:

1/ reemplazo la secuencia punto y coma-espacio-punto y coma por punto y coma, todas las veces que sea necesario:

Do While InStr(1, fncConcatena, "; ;") <> 0
fncConcatena = Replace(fncConcatena, "; ;", ";")
Loop

2/ si empieza por punto y coma, desprecio los dos primeros caracteres:

fncConcatena = Right(fncConcatena, Len(fncConcatena) - 2)

3/ si acaba en "; ", es decir, en punto y coma y espacio, desprecio los dos últimos:

If Right(fncConcatena, 2) = "; " Then
fncConcatena = Left(fncConcatena, Len(fncConcatena) - 2)

Hola de nuevo Sveinbjorn,

Realmente ha sido un placer que hayas compartido conmigo tu saber y experiencia en Access, muchas gracias por tus soluciones y explicaciones.

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas