Yo uso estas funciones que se invocan de la siguiente forma
defino 3 variables para Nombre Paterno Materno
paterno=Space(15)
materno=Space(15)
nombres=Space(25)
sep_pat_mat_nomb(MI_LI.Nombre) Invoco la funcion con todo el Nombre y los apellidos
EN TU CASO PODRIAS PASAR LA DATA DE LA BD UN CURSOR
Y LUEGO PARA EL NOMBRE PASARLE LA FUNCION
LA TABLA QUE TIENE EL NOMBRE VIENE CON EL SIGUIENTE ORDEN PREESTABLECIDO APELLIDO PATERNO, APELLIDO MATERNO NOMBRE(S)
LAS VARIANTES SON QUE PUEDE HABER APELLIDO PATERNO PUNTO NOMBRE (CASOS PUNTUALES) EN TAL CASO HABRIA QUE CONTROLAR EL CARACTER .
Function sep_pat_mat_nomb(nombre)
Local ln, j, r, extr
Set Exact On
extr=''
m.nombres=''
m.nombr1=''
ln=Len(nombre)
j = 1 && CON ESTO CUENTO LOS ESPACIOS ENTRE NOMBRES Y APELLIDOS
For r = 1 To ln
Do Case
Case j = 1
If Substr(nombre,r,1) != " "
extr=extr+Substr(nombre,r,1)
Else
If !del_o_de(extr)
paterno=extr+" "
extr=''
j=2
Else
extr=extr+" "
Endif
Endif
Case j = 2
If Substr(nombre,r,1) != " "
extr=extr+Substr(nombre,r,1)
Else
If !del_o_de(extr)
materno=extr+" "
extr=''
j=3
Else
extr=extr+" "
Endif
Endif
Case j = 3
If Substr(nombre,r,1) != " "
extr=extr+Substr(nombre,r,1)
Else
If !del_o_de(extr)
m.nombres=extr+" "
extr=''
j=4
Else
extr=extr+" "
Endif
Endif
Case j = 4
m.nombr1=m.nombr1+Substr(nombre,r,1)
Endcase
Next
If m.nombres != ''
m.nombres=Ltrim(m.nombres)
Else
If m.nombr1 != ''
m.nombres=m.nombr1
Endif
Endif
Return
&& en esta funcion hay que agregar todas las excepciones a la regla del conjunto de datos como lo que se muestra ahi en que cubro los nombre so apellidos como
&& DE MARCO
&& DE LA FUENTE
&& DEL SOL
&& SAN ESTEBAN
&& ETC
Function del_o_de(palab)
ret=.F.
Do Case
Case Upper(Alltrim(palab)) == "DE"
ret=.T.
Case Upper(Alltrim(palab)) == "LA"
ret=.T.
Case Upper(Alltrim(palab)) == "DEL"
ret=.T.
Case Upper(Alltrim(palab)) == "SAN"
ret=.T.
Case Upper(Alltrim(palab)) == "MC"
ret=.T.
Case Upper(Alltrim(palab)) == "MAC"
ret=.T.
Case Upper(Alltrim(palab)) == "LOS"
ret=.T.
Case Upper(Alltrim(palab)) == "LAS"
ret=.T.
Case Upper(Alltrim(palab)) == "DI"
ret=.T.
Case Upper(Alltrim(palab)) == "O'"
ret=.T.
Case Upper(Alltrim(palab)) == "AL"
ret=.T.
Case Upper(Alltrim(palab)) == "LO"
ret=.T.
Case Upper(palab) == "DE LA"
ret=.T.
Endcase
Return(ret)