Página 1 de 1

Digito verificador cedula uruguaya

Publicado: Mié Nov 28, 2012 8:42 pm
por iatech
Hola a todos esta es mi primer consulta en este foro, estoy necesitando verificar mediante un digito verificador la cedula uruguaya en una celda contigua a donde se ingrese el numero de cedula.
A continuacion paso la forma en como se calcula dicho digito verificador.

Como calcular el digito verificador de la CI Uruguaya
¿Es el número de cédula 1234567-2 es válido?

La Cédula de Identidad de la República Oriental del Uruguay es un documento emitido por la Dirección Nacional de Identificación Civil quien depende del Ministerio del Interior.
Dicho documento tiene como propósito llevar registro de cada individuo sea oriundo o nacionalizado en la república.

El numero de una cédula de identidad tiene exactamente 7 dígitos al cual se le adiciona un dígito verificador.

Es así que un número valido debe respetar el siguiente formato:

a.bcd.efg-h

El dígito posterior al guión (h) es también llamado dígito verificador.

Para obtener h debemos:

Multiplicar a,b,c,d,e,f,g por las siguientes constantes: (a; b; c; d; e; f; g) .* (2; 9; 8; 7; 6; 3; 4)
El resultado de la suma s = 2*a + 9*b + 8*c + 7*d + 6*e + 3*f + 4*g es dividido por 10 quedándonos con resto (M = s modulo 10)
Finalmente h = (10 – M) % 10

Ejemplo practico:
Si la CI es 1.234.567:

s = 2*1 + 9*2 + 8*3 + 7*4 + 6*5 + 3*6 + 4*7 = 148
M = 148 % 10 = 8
h = (10 – 8) % 10 = 2
Obteniendo que 1.234.567-2 es un número de CI valido.

Desde ya agradezco su respuesta y su ayuda en dicho problema para poder encontrar un script o formula para resolverlo

Re: Digito verificador cedula uruguaya

Publicado: Jue Nov 29, 2012 4:32 am
por mauricio
Un intento de resolverlo hubiese sido muy bueno...

Mira si así esta bien...

Saludos

Re: Digito verificador cedula uruguaya

Publicado: Jue Nov 29, 2012 3:13 pm
por iatech
Hola muchas gracias Mauricio lo que tu me enviaste me sirve pero da error cuando tengo un numero de cedula tiene 6 digitos , se que anteriormente me explique mal disculpame soy novato de verdad de igual manera estaria necesitando implementarlo en la siguiente planilla que te envio a continuacion por si tu o el foro me pueden ayudar
Muchas Gracis por todo.

Re: Digito verificador cedula uruguaya

Publicado: Jue Nov 29, 2012 6:57 pm
por xiseme
Aprovechándonos de la función de Mauricio, se me ocurre poner opciones para que la función pueda devolvernos el dígito de control, la cédula completa, o si es correcto el número de cédula (para usarla para validar, por ejemplo)

Como 0000123 es distinto de 1230000 :mrgreen: con Format(123,"0000000") creo que funcionará

Este es un posible código** (¡ mejórese, por dios, mejórese ! :mrgreen: )

Código: Seleccionar todo

Option Explicit


Function DigitoVerificador(CodigoId As String, Optional Opcion As Variant) As Variant
'Solo toleramos valores 123, 123-1, 0001234, 0012345-1, 1234567 ó 1234567-1
'Opciones
'	0= devuelve el dígito
'	1= devuelve el indentificador completo con dígito correcto
'	otros= Verdadero/Falso si es ok o no
If IsMissing(Opcion) Then Opcion=0

'Filtrar errores: ( si guión → debiera ser formato 1234567-1)
'más de un dígito post-guión
'no es número antes guión
'número de más de 7 dígitos

Dim PosG As Integer
Dim CI As String
	PosG=InStr(CodigoId,"-")
Select Case PosG
	Case 0:		CI = CodigoId 	'no hay guión 
	Case Else	'Hay guión → a su derecha solo debe haber un número de un dígito
			 	If (Len(CodigoId) - PosG) <2 And IsNumeric(Mid(CodigoId,PosG+1)) Then
			 		CI=Left(CodigoId,PosG-1)	'toma el valor a izq de "-"
			 	Else
			 		Goto NoVale
			 	End If
End Select

If IsNumeric(CI) And Val(CI)<10000000 Then	'es número de 7 o menos cifras
	'Parece que IsNumeric devuelve True con cadenas que acaban en "e" o "d"   1234e 12d ?????
	'Provisionalmete lo salvamos con 
		If  Right(UCase(CI),1)="E" Or Right(UCase(CI),1)="D" Then GoTo NoVale
	Dim mV() As Integer
	Dim lSuma As Long
	Dim co1 As Byte
	    CI = Format(CI,"0000000") 
		mV = Array(2, 9, 8, 7, 6, 3, 4)
		For co1 = LBound(mV) To UBound(mV)
			lSuma = lSuma + Val(Mid(CI,co1+1,1)) * mV(co1)
		Next
		DigitoVerificador = (10-(lSuma Mod 10)) Mod 10
		Select Case Opcion
			Case 0:	DigitoVerificador = DigitoVerificador	'XD
			Case 1: DigitoVerificador = CI & "-" & DigitoVerificador
			Case Else: 											
						If DigitoVerificador = Val(Right(CodigoId,1)) Then 
								DigitoVerificador = 1
						Else
								DigitoVerificador = 0
						End If						
		End Select
	Exit Function
End If

NoVale:
	DigitoVerificador="No es valor de cédula"

End Function
aplicado en el ejemplo
Poderes_macro_Mod.ods
(16.66 KiB) Descargado 613 veces
** No entiendo porqué (a mi? en todos mis sistemas?) IsNumeric con cadenas acabadas en «e» o «d» (solo con e y d) como "123d" "1234567e" me dice que son números.

Re: Digito verificador cedula uruguaya

Publicado: Jue Nov 29, 2012 7:09 pm
por mauricio
xiseme escribió:** No entiendo porqué (a mi? en todos mis sistemas?) IsNumeric con cadenas acabadas en «e» o «d» (solo con e y d) como "123d" "1234567e" me dice que son números.
Mira esta entrada: http://forum.openoffice.org/es/forum/vi ... ric#p27625

Re: Digito verificador cedula uruguaya

Publicado: Jue Nov 29, 2012 9:01 pm
por fornelasa
Hola...
¿y cuando son 6 digitos como es el calculo?
Con el ejemplo de los 7 digitos debes poner la macro en un modulo ooBasic de tu archivo, mira por favor el ejemplo abajito.
Viendo lo que hizo Mauricio se puede hacer una formula matricial, mira el ejemplo abajito.

Saludos, Federico.

Re: Digito verificador cedula uruguaya

Publicado: Vie Nov 30, 2012 4:06 pm
por iatech
Hola federico muchas gracias por la formula por mis conocimientos es lo que mas se ajusta a mis necesidades,agradezco a todos por responderme y enseñarme todo sus conocimientos.
El calculo de cuando son 6 digitos se debe de agregar un ( 0) cero al inico del numero y se ve que es por eso en que la formula cuando son 6 digitos no me da el digito verificador correcto.
Sigo aprendiendo y tratando de comprender la formula.
Les agradezco por su tiemo y ver si se puede terminar el calculo del digito verificador

Gracias a todos
Saludos
Ignacio

Re: Digito verificador cedula uruguaya

Publicado: Vie Nov 30, 2012 5:27 pm
por fornelasa
Hola...
Con 6 y 7 dígitos, a ver si así:

Saludos, Federico.

Re: Digito verificador cedula uruguaya

Publicado: Vie Nov 30, 2012 9:14 pm
por xiseme
¿No son posibles números de cédula inferiores al 100.000?
En ese supuesto caso, ¿no se podría usar TEXTO(G,"0000000")?
{=RESIDUO(10-RESIDUO(SUMA(VALOR(MID(TEXTO(G5;"0000000");FILA(INDIRECTO("1:"&LARGO(TEXTO(G5;"0000000"))));1))*{2|9|8|7|6|3|4});10);10)}

@mauricio: gracias por recordármelo. Al ver el hilo me he acordado de haberlo leído ya, peeero mi memoria se ve que ya no es tan buena

Re: Digito verificador cedula uruguaya

Publicado: Sab Dic 01, 2012 4:00 am
por fornelasa
Hola xiseme, pues si, si funciona y me parece un buen tip, esperemos a ver que dice iatech.

Saludos, Federico.

Re: Digito verificador cedula uruguaya

Publicado: Lun Dic 03, 2012 3:17 pm
por iatech
Hola buenos dias a todos, gracias por haberme respondido y solucionado un tema que me tenia preocupado, la respuesta y archivo que me envio Federico en su archivo adjunto Poderesformula.ods me ha funcionado lo he probado con digitos de 6 y 7 cifras que son las que tengo que usar y me funciono.
Luego he podido ver que xiseme realizo un par de preguntas en las que adjunto una solucion y Federico afirmo que eran correctas.
Con respecto a la formula o el cambio que xiseme propone y Federico afirma que es correcto no soy capaz de comprenderla ya que copio ese archivo en la celda y me da error de formula.
Esta es la solucion de xiseme a la cual Federico afirma que es la solucion definitiva esperando por mi respuesta .

¿No son posibles números de cédula inferiores al 100.000?
En ese supuesto caso, ¿no se podría usar TEXTO(G,"0000000")?
{=RESIDUO(10-RESIDUO(SUMA(VALOR(MID(TEXTO(G5;"0000000");FILA(INDIRECTO("1:"&LARGO(TEXTO(G5;"0000000"))));1))*{2|9|8|7|6|3|4});10);10)}

Disculpen mi ignorancia espero poder en el futuro tambien poder colaborar en el foro tanto como ustedes lo han echo por mi.
Pero en difinitiva cual formula ustedes creen que debo de usar ya que esta formula que Federico propuso si me funciono.

=RESIDUO(10-RESIDUO(SUMA(VALOR(MID(SI(LARGO(G5)=6;CONCATENAR("0";G5);G5);FILA(INDIRECTO("1:"&LARGO(SI(LARGO(G5)=6;CONCATENAR("0";G5);G5))));1))*{2;9;8;7;6;3;4});10);10)

Desde mi lado de un simple usuario les agradezco mucho todo su trabajo.

Saludos
Ignacio

Re: Digito verificador cedula uruguaya

Publicado: Lun Dic 03, 2012 6:00 pm
por fornelasa
Hola...
¡¡¡ ah !!! lo que pasa es que la sugerencia de xiseme de usar TEXTO(G5,"0000000") es un lujo super valido :super: :lol: se usaría en vez de esta parte de la formula
SI(LARGO(G5)=6;CONCATENAR("0";G5);G5). Miremos por favor el archivo ejemplo.

Cuando xiseme dice "¿No son posibles números de cédula inferiores al 100.000?" te pregunta si es posible usar en cedulas de identificacion 5 o menos digitos
100000 menos 1 = 99999 (5 digitos, al menos eso entendí), lo cual se resolveria simplemente usando TEXTO(G5,"0000000") sin ninguna condicionante extra.

Es decir, con TEXTO(G5,"0000000") podemos usar ó 7 ó 6 ó 5 o ....... digitos, siempre y cuando la regla sea agregar el cero a la izquierda.

Si una formula nos resuelve un problema entonces debemos usarla (aunque siempre es mejor usar la formula mas corta)


Saludos, Federico.

Re: Digito verificador cedula uruguaya

Publicado: Lun Dic 03, 2012 6:48 pm
por mauricio
En mi opinión, la función "siempre" debe de recibir el argumento correcto, si el argumento siempre es de 7 caracteres, entonces, "antes" de pasar el argumento, este ya debe esta con siete posiciones, ahora, ¿el argumento es un número o es texto?, por los ceros a la izquierda, creo que es texto, entonces, siempre debe de tener la forma "0000000", con lo que la función solo hace el trabajo de obtener el digito verificar, y... ya sea usando las excelente formulas escritas por los compañeros o la función personalizada en Basic que hice la inicio, debe de funcionar...

Saludos

Re: Digito verificador cedula uruguaya

Publicado: Lun Dic 03, 2012 7:37 pm
por fornelasa
Hola...
En mi opinión, una forma de hacer lo que comenta Mauricio es obligar al usuario a escribir siempre 7 digitos en la celda (agregando una validacion de datos a cada celda en donde longitud de texto = 7)
como en el ejemplo siguiente:

Saludos, Federico.

Re: Digito verificador cedula uruguaya

Publicado: Lun Dic 03, 2012 9:58 pm
por mauricio
Simplificando.. se formatea el argumento para que siempre tenga 7 digitos, se usa una formula matricial, recuerden, presionar CTRL+SHIFT+ENTER para editarla.

Código: Seleccionar todo

{=RESIDUO(10-RESIDUO(SUMA(VALOR(MID(A1,{1;2;3;4;5;6;7},1))*{2;9;8;7;6;3;4}),10),10)}
o se usa una formula personalizada en Basic donde obtenemos el mismo resultado:

Código: Seleccionar todo

Option Explicit

Function DigitoVerificador(CI As String) As Integer
Dim mV() As Integer
Dim lSuma As Long
Dim co1 As Byte

	mV = Array(2, 9, 8, 7, 6, 3, 4)
	For co1 = LBound(mV) To UBound(mV)
		lSuma = lSuma + Val(Mid(CI,co1+1,1)) * mV(co1)
	Next
	DigitoVerificador = (10-(lSuma Mod 10)) Mod 10

End Function
Por ejemplo

Código: Seleccionar todo

2613216	4	4
2613217	0	0
2613218	6	6
Saludos

Re: Digito verificador cedula uruguaya

Publicado: Mar Dic 04, 2012 11:43 am
por xiseme
Entiendo que el propósito de la consulta es obtener el dígito de control que le corresponde a un número, para obtener el número de cédula completo: creo que esa parte ya está; vía fórmula, vía código. ;)

No obstante, no se debe de olvidar que el objeto de los dígitos de control es asegurar datos correctos; por lo que también éste debiera ser introducido**.
A ver si me explico menos mal que de costumbre.
Siendo 8 el dígito de control ...
No debieran permitirse números 1234567, 12345, ni siquiera 0012345. Solo 12345678, 123458 ... de tal forma que si hay un error al digitar este pueda ser detectado
Si marcamos como obligatorio longitud=7, o cualquier validación que no incluya el D.Control, ...
supongamos que debemos introducir el 1234567
- el 1234567 será admitido, pero si ponemos erróneamente 1134567 también será validado.
- Si obligamos a introducir el dígito de control ... el 12345672 será admitido pero el 11345672 no (nótese que el último 2 es el «verificador» que corresponde al 1234567)

En mis «peleas» con estos casos :crazy:
  • 1.- Cuando uno crea/gestiona introducción y proceso de datos :
    • 1.1.-Obligar a que el dato introducido tenga el formato deseado: longitud, texto, número, etc. (dígito de control incluído)
      1.2.-No permitir «separadores» en el identificador 12345678 sí, no 1234567-8, ni 1234567 8, *
    Esta validación es aún mucho más necesaria si eventualmente, pueden ser introducidos por terceras personas.

    2.- Cuando recibimos datos de otros estos pueden venir:
    • 2.1.-sin el dígito de control
      • 2.1.1.- los 7 dígitos (texto): 1234567; 0012345; ...
        2.1.2.- sólo los dígitos «significativos» (números o texto): 1234567; 12345; ...
      2.2.- incluído el dígito de control (8) con sus variantes.
      • 2.2.1.-seguidos:12345678; 00123458; ...
        2.2.2.-separados: 1234567-8; 1234567 8; 1234567/8; 0012345-8; 12345-8; ...
Es útil tener una(s) función(es) personalizada(s) que homogeneíce(n) estos datos y/o que nos diga si son correctos o no.

* Recordar que 12345678 puede visualizarse como 1234567-8 en Menú → Formato → Celdas → Definido por usuario Formato código= #-#

**De hecho el dígito de control forma parte del identificador, de la cédula, del DNI, ... el id de cédula es 12345672 no el 1234567; el DNI es 12345678Z no el 12345678.

Re: Digito verificador cedula uruguaya

Publicado: Mar Dic 04, 2012 8:05 pm
por mauricio
De acuerdo, pero... una cosa sería obtener el digito y otra cosa validar el digito, ¿que queremos que haga la función exactamente?...