Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Dalix_xd en 11 Octubre 2020, 20:30 pm



Título: Ayuda Urgente con un Generador de Curp en Visual Basic 6
Publicado por: Dalix_xd en 11 Octubre 2020, 20:30 pm
Estoy haciendo un programa que cuando tu le das el nombre, la fecha de nacimiento, el genero, etc; te genera el curp, pero mi problema es que en el curp te piden caracteres especificos, como el de la primera vocal de tu primer apellido y las consonantes de tus apellidos y nombre. Si alguien pudiera ayudar se apreciaría mucho ya que es algo un tanto urgente. Todo esto esta siendo creado por Visual Basic 6.0


Título: Re: Ayuda Urgente con un Generador de Curp en Visual Basic 6
Publicado por: Serapis en 13 Octubre 2020, 20:38 pm
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ón

Donde 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





Código
  1.  
  2. 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)
  3.   dim curp as string
  4.  
  5.   curp = spaces(18)
  6.  
  7.   mid$(curp,1,2)= GetDataApellido1(apellidos)   ' CO...
  8.   mid$(curp,3,1) = GetDataApellido2(apellidos)   ' COP...
  9.   mid$(curp,4,1) = GetDataNombre(Nombre)      ' COPC
  10.   mid$(curp,5,6) = GetFechaToString(FechaNac) ' COPC201231...
  11.   mid$(curp, 11,1) = GetValueGenero(varon)   ' COPC201231H...
  12.  
  13.   ' ya ya tienes 11 de los 18 dígitos... el resto tampoco son más complicados....
  14.  
  15.   CrearCurp = ucase$(curp) ' todo en mayúsculas...
  16. end function
  17.  
  18. ' se reclama primera letra y y primera vocal del primer apellido:
  19. private function GetDataApellido1(byref Apellidos as string) as string
  20.    dim k as integer, j as integer, vocal as string, letra1 as string
  21.  
  22.    letra1 = left$(apellidos)
  23.    vocal = GetFirstVocal(Apellidos, 2)
  24.  
  25.    GetDataApellido1 = (letra1 & vocal)
  26. 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

Código
  1. private function GetFirstVocal(byref Word as string, byval Inicio as integer) as string
  2.    dim k as integer, j as integre, i as integer
  3.  
  4.    j=len(Word)
  5.    Word = ucase$(Word)
  6.    For k =Inicio to j
  7.        i= instr("AEIOU", mid$(Word, k))
  8.        If i >0 then
  9.            GetFirstVocal=mid$("AEIOU", i, 1)
  10.            Exit for
  11.        End if
  12.    Next
  13. End function
  14.  
  15. ' se reclama solo la primera letra del segundo apellido
  16. private function GetDataApellido2(byref Apellidos as string) as string
  17.    dim k as integer
  18.  
  19.    k= instr(apellidos," ",1)
  20.    GetDataApellido2 = mid$(apellidos,k,1)
  21. end function
  22.  
  23. ' se reclama solo la primera letra del nombre y si es compuesto la primera del ultimo sobrenombre, si dicho sobrenombre fueran: Maria o José.
  24. private function GetDataNombre(byref Nombre as string) as string
  25.    dim k as integer
  26.  
  27.    k= instrrev(nombre, " ")
  28.    if (k=0) then
  29.        GetDataNombre = left$(Nombre, 1)
  30.    else    ' si el nombre es compuesto, se devuelve la primera letra del último sobrenombre 'José de la Cierva', devuelve la 'C' de 'cierva'
  31.        sobrenombre = ucase$(right$(nombre, k, len(nombre)-k))
  32.        if ((sobrenombre = "MARÍA") or (sobrenombre= "JOSÉ")) then            
  33.            GetDataNombre = mid$(nombre, k,1)
  34.        else
  35.            GetDataNombre = left$(Nombre, 1)
  36.        end if
  37.    end if
  38. end function
  39.  
  40. ' entendemos que viene en el formato tipo de datos 'date' si viene en otro formato, desde luego debe ajustarse al caso...
  41. private function GetFechaToString(byref Fecha as date) as string
  42.    dim f as string
  43.  
  44.    f= Format(fecha, "yy/MM/dd")
  45.  
  46.    GetFechaToString = replace(f, "/", "")
  47. end function
  48.  
  49. ' Los valores elegidos para representar el campo son ambiguos, pués ambos pueden siginificar ambas cosas, son intercambiables, como se ve:
  50. '    H = "Hombre" o "Hembra"
  51. '    M = "Macho/Masculino" o "Mujer"
  52. private function GetValueGenero(byval Varon as boolean) as string
  53.    if (varon= true) then
  54.        GetValueGenero = "H"  'ver comentario, igual es el otro...
  55.    else
  56.        GetValueGenero = "M"  'ver comentario, igual es el otro...
  57.    end if
  58.  

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...