Separar campos
Tengo una tabla que contiene los nombres y los apellidos de los clientes en la misma columna. Me gustaría saber la manera de poder separar esta columna en 3:nombre, primer_apellido y segundo_apellido.
1 Respuesta
Respuesta de query
1
1
La tarea de separar el nombre de los apellidos ensí es sencilla, utilizando las funciones de texto (Left, Mid y Instr), pero necesitamos que haya un carácter que nos permita distinguir donde termina el nombre y comienzan los apellidos (Perez Sáez, Ana o Rodrigo Cortijo, Jose Antonio), de lo contrario a la hora de separar el nombre de los apellidos utilizando como separador los espacios en blanco, fallaremos siempre que el nombre o alguno de sus apellidos sean compuestos (Jose Antonio Perez Casas).
Indicame como tienes escritos los nombres para separar los apellidos y donde quieres mostrar los resultados (en una consulta, formulario o en una nueva tabla).
Indicame como tienes escritos los nombres para separar los apellidos y donde quieres mostrar los resultados (en una consulta, formulario o en una nueva tabla).
Hola de nuevo,
La columna esta organizada así: Apellido1, Apellido 2 espacioenblanco Nombre.
La idea es mostrar los resultados en una nueva tabla, he mirado por encima los 103 registros y no parece que haya apellidos compuestos, así que seria buscar por la izquierda hasta encontrar el espacio en blanco y pasar el primer apellido, seguir hasta la coma y coger el segundo apellido, y todo lo que venga detrás de la coma sería el nombre. El problema es que no se como hacerlo. Te agradecería si me dijeras alguna web con tutoriales de VB aplicados a access, o si me lo pudieras detallar un poquito.
Muchísimas gracias
La columna esta organizada así: Apellido1, Apellido 2 espacioenblanco Nombre.
La idea es mostrar los resultados en una nueva tabla, he mirado por encima los 103 registros y no parece que haya apellidos compuestos, así que seria buscar por la izquierda hasta encontrar el espacio en blanco y pasar el primer apellido, seguir hasta la coma y coger el segundo apellido, y todo lo que venga detrás de la coma sería el nombre. El problema es que no se como hacerlo. Te agradecería si me dijeras alguna web con tutoriales de VB aplicados a access, o si me lo pudieras detallar un poquito.
Muchísimas gracias
A continuación te propongo unas líneas de código VB que las puedes colocar en el evento click de un botón de comando dentro de un formulario para realizar el traspaso de datos entre campos.
Crea un formulario en vista diseño, añádele un botón de comando y en el evento click añade las lineas de código.
NOTA: Tendrás que cambiar los nombres de las tablas y los campos que te muestro a los que tengas en tu base de datos.
Private Sub Comando0_Click()
Dim rs1 As Recordset ' Declaramos recordset para la 1ª tabla (la que contiene los nombres completos
Dim rs2 As Recordset ' Declaramos recordset para la 2ª tabla
Dim NombreCompuesto As String ' Nombre completo almacenado en el campo de la 1ª tabla
Dim sw As Integer ' Indicador de la parte del nombre que estamos obteniendo
Dim apellido1 As String ' Donde guardaremos el 1er apellido
Dim apellido2 As String ' Donde guardaremos el 2º apellido
Dim nombre As String ' Donde guardaremos el nombre
Dim cambio As Boolean ' Indicador de una nueva parte del nombre
Dim x As Integer ' Contador para bucle for
' Iniciamos los recordset Clientes es el nombre de la tabla con los nombres completos y Clientes2 es el nombre de la tabla con los datos desglosados
Set rs1 = CurrentDb.OpenRecordset("Clientes1", dbOpenDynaset)
Set rs2 = CurrentDb.OpenRecordset("TAbla1", dbOpenDynaset)
' Leemos toda la tabla1
Do Until rs1.EOF
' Obtenemos el valor del campo que contiene el nombre completo "sustituye CampoCompuesto por el nombre que tenga ese campo ebn tu tabla
NombreCompuesto = rs1!Director
' Inicializamos las variables donde almacenaremos las partes del nombre
apellido1 = ""
apellido2 = ""
nombre = ""
' Iniciamos el indicador a 1 para 1er apellido
sw = 1
' Indicamos que no se han producido cambios "es decir aun no hemos terminado de leer el 1er apellido y no hemos comenzado con el segundo"
cambio = False
' Generamos un bucle que recorra todos los caracteres del Nombre
For x = 1 To Len(NombreCompuesto)
' Si el carácter leído es un separador "," o un espacio en blanco cambia el indicador de la
' Parte del nombre que se debe de procesar
Select Case Mid(NombreCompuesto, x, 1)
' Hemos terminado con el primer apellido
Case ",":
x = x + 1 ' nos adelantamos una posición para saltarnos el espacio en blanco que viene a continuación del separador
sw = 2 ' Indicamos que el siguiente campo a procesar es el 2º apellido
cambio = True ' Avisamos del cambio en los campos
' Hemos terminado con el segundo apellido
Case " ":
sw = 3 ' Indicamos que el siguiente campo a procesar es el nombre
cambio = True ' Avisamos del cambio en los campos
End Select
' Si no se tiene notificación de cambios "es decir no se pasa del 1er ape al segundo o del segundo al nombre
If Not cambio Then
Select Case sw
Case 1: apellido1 = apellido1 & Mid(NombreCompuesto, x, 1)
Case 2: apellido2 = apellido2 & Mid(NombreCompuesto, x, 1)
Case 3: nombre = nombre & Mid(NombreCompuesto, x, 1)
End Select
Else
cambio = False
End If
Next
Rs2. AddNew ' Añade un nuevo registro a la segunda tabla
rs2! Ap1 = apellido1 & " " ' Guardamos el primer apellido "cambia ap1 por el nombre de tu campo que guarda el 1er apellido"
Rs2! Ap2 = apellido2 & " " ' Guardamos el segundo apellido "cambia ap2 por el nombre de tu campo que guarda el 2º apellido"
rs2!nombre = nombre & " " ' Guardamos el nombre "cambia nombre por el nombre de tu campo que guarda el nombre"
Rs2.Update ' Actualiza los datos de la nueva tabla
rs1. MoveNext ' Leemos siguiente registro
Loop
rs1.Close ' Cerramos las tablas
rs2.Close
Set rs1 = Nothing ' Liberamos los objetos
Set rs2 = Nothing
MsgBox "Proceso finalizado"
End Sub
Antes de hacer las pruebas hazte una copia de la base de datos y si todo funciona la eliminas después.
Espero que no te lie, es rápido y casi sencillo, sino dímelo y buscaremos otra solución.
Hasta luego, query.
Crea un formulario en vista diseño, añádele un botón de comando y en el evento click añade las lineas de código.
NOTA: Tendrás que cambiar los nombres de las tablas y los campos que te muestro a los que tengas en tu base de datos.
Private Sub Comando0_Click()
Dim rs1 As Recordset ' Declaramos recordset para la 1ª tabla (la que contiene los nombres completos
Dim rs2 As Recordset ' Declaramos recordset para la 2ª tabla
Dim NombreCompuesto As String ' Nombre completo almacenado en el campo de la 1ª tabla
Dim sw As Integer ' Indicador de la parte del nombre que estamos obteniendo
Dim apellido1 As String ' Donde guardaremos el 1er apellido
Dim apellido2 As String ' Donde guardaremos el 2º apellido
Dim nombre As String ' Donde guardaremos el nombre
Dim cambio As Boolean ' Indicador de una nueva parte del nombre
Dim x As Integer ' Contador para bucle for
' Iniciamos los recordset Clientes es el nombre de la tabla con los nombres completos y Clientes2 es el nombre de la tabla con los datos desglosados
Set rs1 = CurrentDb.OpenRecordset("Clientes1", dbOpenDynaset)
Set rs2 = CurrentDb.OpenRecordset("TAbla1", dbOpenDynaset)
' Leemos toda la tabla1
Do Until rs1.EOF
' Obtenemos el valor del campo que contiene el nombre completo "sustituye CampoCompuesto por el nombre que tenga ese campo ebn tu tabla
NombreCompuesto = rs1!Director
' Inicializamos las variables donde almacenaremos las partes del nombre
apellido1 = ""
apellido2 = ""
nombre = ""
' Iniciamos el indicador a 1 para 1er apellido
sw = 1
' Indicamos que no se han producido cambios "es decir aun no hemos terminado de leer el 1er apellido y no hemos comenzado con el segundo"
cambio = False
' Generamos un bucle que recorra todos los caracteres del Nombre
For x = 1 To Len(NombreCompuesto)
' Si el carácter leído es un separador "," o un espacio en blanco cambia el indicador de la
' Parte del nombre que se debe de procesar
Select Case Mid(NombreCompuesto, x, 1)
' Hemos terminado con el primer apellido
Case ",":
x = x + 1 ' nos adelantamos una posición para saltarnos el espacio en blanco que viene a continuación del separador
sw = 2 ' Indicamos que el siguiente campo a procesar es el 2º apellido
cambio = True ' Avisamos del cambio en los campos
' Hemos terminado con el segundo apellido
Case " ":
sw = 3 ' Indicamos que el siguiente campo a procesar es el nombre
cambio = True ' Avisamos del cambio en los campos
End Select
' Si no se tiene notificación de cambios "es decir no se pasa del 1er ape al segundo o del segundo al nombre
If Not cambio Then
Select Case sw
Case 1: apellido1 = apellido1 & Mid(NombreCompuesto, x, 1)
Case 2: apellido2 = apellido2 & Mid(NombreCompuesto, x, 1)
Case 3: nombre = nombre & Mid(NombreCompuesto, x, 1)
End Select
Else
cambio = False
End If
Next
Rs2. AddNew ' Añade un nuevo registro a la segunda tabla
rs2! Ap1 = apellido1 & " " ' Guardamos el primer apellido "cambia ap1 por el nombre de tu campo que guarda el 1er apellido"
Rs2! Ap2 = apellido2 & " " ' Guardamos el segundo apellido "cambia ap2 por el nombre de tu campo que guarda el 2º apellido"
rs2!nombre = nombre & " " ' Guardamos el nombre "cambia nombre por el nombre de tu campo que guarda el nombre"
Rs2.Update ' Actualiza los datos de la nueva tabla
rs1. MoveNext ' Leemos siguiente registro
Loop
rs1.Close ' Cerramos las tablas
rs2.Close
Set rs1 = Nothing ' Liberamos los objetos
Set rs2 = Nothing
MsgBox "Proceso finalizado"
End Sub
Antes de hacer las pruebas hazte una copia de la base de datos y si todo funciona la eliminas después.
Espero que no te lie, es rápido y casi sencillo, sino dímelo y buscaremos otra solución.
Hasta luego, query.
- Compartir respuesta
- Anónimo
ahora mismo