Empieza por hacerte entender...
¿Qué es un 'Curp' ?. Puedo imaginar que se trate de algún tipo de codificación específica, pero seguramente tan específica que fuera de cierto ámbito, nadie más sepa de qué se trata.
Haciendo una búsqueda llego a wikipedia:
https://es.wikipedia.org/wiki/Clave_Única_de_Registro_de_PoblaciónDonde se aclara que tal 'Curp' es en efecto una codificación específica de Méjico.
Pués no parece tan complicado generar dicho código. Simplemente crea funciones para obtener cada campo solicitado que se vayan concatenando...
Sea al caso los datos:Nombre: José de la Cierva
Apellidos: Columbus Pacificus
Fecha de Nacimiento: 2020/12-31
Género: Varón
País de Nacimiento: Méjico, Yucatán
public function CrrearCurp(byref Nombre as string, byref Apellidos as string, byref FechaNac as date, byval Varon as boolean, byref NacidoEn as string, optional EsExtranjero as boolean)
dim curp as string
curp = spaces(18)
mid$(curp,1,2)= GetDataApellido1(apellidos) ' CO...
mid$(curp,3,1) = GetDataApellido2(apellidos) ' COP...
mid$(curp,4,1) = GetDataNombre(Nombre) ' COPC
mid$(curp,5,6) = GetFechaToString(FechaNac) ' COPC201231...
mid$(curp, 11,1) = GetValueGenero(varon) ' COPC201231H...
' ya ya tienes 11 de los 18 dígitos... el resto tampoco son más complicados....
CrearCurp = ucase$(curp) ' todo en mayúsculas...
end function
' se reclama primera letra y y primera vocal del primer apellido:
private function GetDataApellido1(byref Apellidos as string) as string
dim k as integer, j as integer, vocal as string, letra1 as string
letra1 = left$(apellidos)
vocal = GetFirstVocal(Apellidos, 2)
GetDataApellido1 = (letra1 & vocal)
end function
' se considera que no habrá errores, luego no se tratan...
private function GetFirstVocal(byref Word as string, byval Inicio as integer) as string
dim k as integer
k = instr(ucase$(word), "A", " ", Inicio)
If (k= 0) then
k = instr(ucase$(word), "E", " ", Inicio)
If (k= 0) then
k = instr(ucase$(word), "I", " ", Inicio)
If (k= 0) then
k = instr(ucase$(word), "O", " ", Inicio)
If (k= 0) then
k = instr(ucase$(word), "U", " ", Inicio)
end if
end if
end if
end if
GetFirstVocal = mid$(word, inicio, 1)
end function private function GetFirstVocal(byref Word as string, byval Inicio as integer) as string
dim k as integer, j as integre, i as integer
j=len(Word)
Word = ucase$(Word)
For k =Inicio to j
i= instr("AEIOU", mid$(Word, k))
If i >0 then
GetFirstVocal=mid$("AEIOU", i, 1)
Exit for
End if
Next
End function
' se reclama solo la primera letra del segundo apellido
private function GetDataApellido2(byref Apellidos as string) as string
dim k as integer
k= instr(apellidos," ",1)
GetDataApellido2 = mid$(apellidos,k,1)
end function
' se reclama solo la primera letra del nombre y si es compuesto la primera del ultimo sobrenombre, si dicho sobrenombre fueran: Maria o José.
private function GetDataNombre(byref Nombre as string) as string
dim k as integer
k= instrrev(nombre, " ")
if (k=0) then
GetDataNombre = left$(Nombre, 1)
else ' si el nombre es compuesto, se devuelve la primera letra del último sobrenombre 'José de la Cierva', devuelve la 'C' de 'cierva'
sobrenombre = ucase$(right$(nombre, k, len(nombre)-k))
if ((sobrenombre = "MARÍA") or (sobrenombre= "JOSÉ")) then
GetDataNombre = mid$(nombre, k,1)
else
GetDataNombre = left$(Nombre, 1)
end if
end if
end function
' entendemos que viene en el formato tipo de datos 'date' si viene en otro formato, desde luego debe ajustarse al caso...
private function GetFechaToString(byref Fecha as date) as string
dim f as string
f= Format(fecha, "yy/MM/dd")
GetFechaToString = replace(f, "/", "")
end function
' Los valores elegidos para representar el campo son ambiguos, pués ambos pueden siginificar ambas cosas, son intercambiables, como se ve:
' H = "Hombre" o "Hembra"
' M = "Macho/Masculino" o "Mujer"
private function GetValueGenero(byval Varon as boolean) as string
if (varon= true) then
GetValueGenero = "H" 'ver comentario, igual es el otro...
else
GetValueGenero = "M" 'ver comentario, igual es el otro...
end if
Te he resuelto los primeros 11 caracteres del código, a tu esfuerzo queda el resto....
Date cuenta que hay más condicionantes, que dado que tu eres el interesado tendrás que empaparte de ellos, y corregir donde proceda... yo solo he leído el artículo de wikipedia por encima... y seguramente en la página del gobierno puedas encontrar una descripción más detallada de cada detalle de los campos.
P. D.: me edito... Antes de mirar en Wikipedia, leí en otra parte una desafortunada descripción que me indujo a malinterpretar el segundo valor del código.. . Y al verlo hoy recordé que luego olvidé corregir... La función tachada...