Digito verificador cedula uruguaya

¿Nuevo en Apache OpenOffice? ¿No sabe cómo comenzar o dónde hacer su pregunta? ¡Este es el lugar!
Reglas del Foro
Los moderadores podrían mover los temas creados aquí a un foro más apropiado.
Si usted publicó aquí y no encuentra el tema, puede buscar sus mensajes haciendo clic en la opción «Buscar sus mensajes» que se encuentra justo debajo de la cabecera de la página, junto al panel de control de usuario y al acceso a sus mensajes privados.
Responder
iatech
Mensajes: 4
Registrado: Mié Nov 28, 2012 7:57 pm

Digito verificador cedula uruguaya

Mensaje 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
windows xp LibreOffice 3.5.7.2
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Digito verificador cedula uruguaya

Mensaje por mauricio »

Un intento de resolverlo hubiese sido muy bueno...

Mira si así esta bien...

Saludos
Adjuntos
DigitoVerificador.ods
(12.4 KiB) Descargado 4818 veces
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
iatech
Mensajes: 4
Registrado: Mié Nov 28, 2012 7:57 pm

Re: Digito verificador cedula uruguaya

Mensaje 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.
Adjuntos
Poderes_macro.ods
(16.68 KiB) Descargado 1052 veces
Última edición por mauricio el Jue Nov 29, 2012 4:39 pm, editado 1 vez en total.
Razón: Quitar cita que solo repite el primer mensaje y no es necesario
windows xp LibreOffice 3.5.7.2
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Digito verificador cedula uruguaya

Mensaje 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 607 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.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Digito verificador cedula uruguaya

Mensaje 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
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Digito verificador cedula uruguaya

Mensaje 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.
Adjuntos
PoderesMacro.ods
Con Macro
(19.22 KiB) Descargado 463 veces
PoderesFormula.ods
Con Formula
(18.15 KiB) Descargado 585 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
iatech
Mensajes: 4
Registrado: Mié Nov 28, 2012 7:57 pm

Re: Digito verificador cedula uruguaya

Mensaje 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
windows xp LibreOffice 3.5.7.2
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Digito verificador cedula uruguaya

Mensaje por fornelasa »

Hola...
Con 6 y 7 dígitos, a ver si así:

Saludos, Federico.
Adjuntos
PoderesFormula.ods
Dígito Ver. con 6 y 7 caracteres
(18.81 KiB) Descargado 786 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Digito verificador cedula uruguaya

Mensaje 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
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Digito verificador cedula uruguaya

Mensaje por fornelasa »

Hola xiseme, pues si, si funciona y me parece un buen tip, esperemos a ver que dice iatech.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
iatech
Mensajes: 4
Registrado: Mié Nov 28, 2012 7:57 pm

Re: Digito verificador cedula uruguaya

Mensaje 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
windows xp LibreOffice 3.5.7.2
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Digito verificador cedula uruguaya

Mensaje 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.
Adjuntos
PoderesFormula.ods
Formula usando TEXTO(G5;"0000000")
(18.24 KiB) Descargado 367 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Digito verificador cedula uruguaya

Mensaje 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
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Digito verificador cedula uruguaya

Mensaje 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.
Adjuntos
PoderesMacro2.ods
Con validez longitud = 7
(19.75 KiB) Descargado 386 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Digito verificador cedula uruguaya

Mensaje 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
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Digito verificador cedula uruguaya

Mensaje 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.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Digito verificador cedula uruguaya

Mensaje 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?...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder