Validar Rut en un textbox

Necesito validar en un textbox los Rut(cedula de identidad chilena) que se van ingresando con la siguiente estructura xxxxxxxxX (X = al digito verificador) tengo el siguiente código pero no se como aplicarlo
PARAMETERS rut, digver
STORE 0 TO suma
STORE 2 TO j
Largo = LEN(rut)
FOR i = Largo TO 1 STEP -1
Dig = VAL(SUBSTR(rut,i,1))
suma = suma + (Dig * j)
IF j = 7
j = 1
ENDIF
j = j + 1
ENDFOR
RESTO = MOD(suma,11)
DO CASE
CASE RESTO = 0
dv = 0
CASE RESTO = 1
dv = "K"
IF digver = "k" OR digver = "K"
* WAIT 'RUT INCORRECTO!!!' WINDOWS
RETURN .F.
ENDIF
RETURN .T.
OTHERWISE
dv = 11 - RESTO
ENDCASE
IF digver == ALLTRIM(STR(dv))
RETURN .T.
ELSE
* WAIT 'RUT INCORRECTO!!!' WINDOWS
RETURN .F.
Endif
Por favor necesito la guía para poder adaptar este código a mi necesidad.

1 respuesta

Respuesta
1
Pues creas un método en el formulario donde deseas aplicar el código, para esto haces lo siguiente:
Abres el formulario en mención.
En el menú formulario seleccionas nuevo método (aparece el cuadro de diálogo nuevo método).
En el cuadro nombre escribes el nombre del nuevo método podría ser por ejemplo VerificarRut.
Haces clic en aceptar.
En la ventana propiedades del formulario busca el evento VerificarRut y haces doble clic en el mismo, se abre la ventana de edición.
Pega el código descrito arriba.
Cierra la ventana y guarda los cambios.
Listo
Ahora la validación podría ir en el evento clic del botón guardar:
If Thisform.VerificarRut(Thisform.Text1.Value, "L") = .F.
   Return
Endif
Seguiría el código para guardar...
Hise lo que me mencionaste pero no pasa nada, es decir si pongo un rut xxxxxxxX no me valida si esta bueno o no. nose si tengo que modificar el codigo.
De antemano muchas gracias .
Explicáme exáctamente qué clase de código se envía a la función y en su efecto un ejemplo de un parámetro de un Rut chileno porque no sé exactamente que debe hacer el código para tener la certeza de que esté bien o mal.
La extructura del rut que ocupo es ej: 173298730 (0 es el digirto verificador),El codigo que encontre es el que publique Nose como adaptar el codigo a esa extructura. 
De antemano muchas gracias. Saludos
Necesito que me saques de otra dudas, he analizado el código y encontré inconsistenas como la siguiente, como podrás darte cuento tu código tiene un parámetro llamado digver (ver el código publicado línea "If digver = "k" Or digver = "K") el cual se le debe asignar una valor, esto hace suponer que el usuario conoce el qué significa el valor "k" o "K" o en su defecto, esta función es llamada por otra función de nivel superior entonces en ese orden de ideas:
¿a qué hace referencia "k" 0 "K"? O ¿Qué otra función se llama a este código?
Estamos hablando.
Bueno ese codigo lo saque de google y como no se mucho no lo supe ni aplicar ni analizar. No entiendo ese codigo. ¿Tu conoces alguno que me sirva para validar los rut???
De antemano muchas gracias. Saludos
Tengo un código de validación de Rut para Chile, pero el formato de Rut de cédula chilena es diferente al que me haz especificado así: "xxxxxxxx-x" el Rut que me especificas tiene exactamente el mismo formato o debe cumplir las características que especificaste inicialmente.
Estamos hablando.
En realidad lo ideal es que tenga la extructura que yo te entregue ya que no me sirve el -, pero si lo puedo sacar despues yo creo que no hay ningun problerma en modificar la extructura.
De antemano muchas gracias. Saludos
<p class="MsoNormal">Reemplaza en el evento del formulario que creaste el código
publicado por el siguiente:
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX"><span>  </span>Lparameters </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">lcValue</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Local </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">lcAuxValue, lcChrValue, dv, i, lcSum,
lcRest, j, lcNumValue</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Store </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">0 </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">To </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">lcSum</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Store </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">2 </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">To </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">j</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span>lcAuxValue = </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Left</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(lcValue,</span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Len</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(lcValue)-1)</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span>lcChrValue = </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Len</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(lcAuxValue)</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span>dv = "0"</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">For </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">i = lcChrValue </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">To </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">1 </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Step </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">-1 </span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>    </span>lcNumValue = </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Val</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(</span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Substr</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(lcAuxValue, i,
1))</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>    </span>lcSum = lcSum + (lcNumValue *
j)</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>    </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">If </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">j > 6</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>      </span>j = 1</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>    </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Endif</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX"><span>    </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">j = j + 1</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Endfor</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">lcRest = </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Mod</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(lcSum, 11)</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span>dv = </span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Alltrim</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(</span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Str</span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">(11 - lcRest))</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Do Case</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX"><span>    </span>Case </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">dv = "10"</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>      </span>dv = "K"</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>    </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Case </span><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX">dv = "11"</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>      </span>dv = "0"</span>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="ES-MX"><span>  </span></span><span style="font-size: 10pt; font-family: "Courier New"; color: blue;" lang="ES-MX">Endcase </span>
<p class="MsoNormal"><span style="font-size: 10pt; line-height: 115%; font-family: "Courier New"; color: blue;" lang="ES-MX"><span>  </span>Return Upper</span><span style="font-size: 10pt; line-height: 115%; font-family: "Courier New"; color: black;" lang="ES-MX">(</span><span style="font-size: 10pt; line-height: 115%; font-family: "Courier New"; color: blue;" lang="ES-MX">Right</span><span style="font-size: 10pt; line-height: 115%; font-family: "Courier New"; color: black;" lang="ES-MX">(lcValue, 1)) == dv</span>
<p class="MsoNormal">En el evento Click del botón guardar podrías escribir lo
siguiente:
<p class="MsoNormal">If<span> 
</span>Thisform.VerificarRut(Alltrim(Thisform.Text1.Value)
<p class="MsoNormal"><span>   </span>Messagebox("El RUT
no es válido, revisar el RUT ingresado.", 64, "Error")
<p class="MsoNormal"><span>  </span>Return
<p class="MsoNormal">Endif
<p class="MsoNormal">Seguiría el código de guardar.
<p class="MsoNormal">Esto debería solucionar el problema.
<p class="MsoNormal">Gracias por la atención prestada.
Muchas gracias por el codigo, pero me podrias aclarar una cosa. En lineas como esta
<p class="" style="margin-bottom: Tengo que borrar <p class="" style="???
Apreciaria mucho que me aclararas eso, de antemano muchas gracias y perdona tantas molestias.
Saludos.
Jajaja, ninguna de esas líneas te escribí, efectivamente tienes que borrarlas, pero te mando nuevamente lo que te escribí, pues lo anterior es un error del sistema de todoexpertos:
Reemplaza en el evento del formulario que creaste el código publicado por el siguiente:
Lparameters lcValue
Local lcAuxValue, lcChrValue, dv, i, lcSum, lcRest, j, lcNumValue
Store 0 To lcSum
Store 2 To j
lcAuxValue = Left(lcValue,Len(lcValue)-1)
lcChrValue = Len(lcAuxValue)
dv = "0"
For i = lcChrValue To 1 Step -1
lcNumValue = Val(Substr(lcAuxValue, i, 1))
lcSum = lcSum + (lcNumValue * j)
If j > 6
j = 1
Endif
j = j + 1
Endfor
lcRest = Mod(lcSum, 11)
dv = Alltrim(Str(11 - lcRest))
Do Case
Case dv = "10"
dv = "K"
Case dv = "11"
dv = "0"
Endcase
Return Upper(Right(lcValue, 1)) == dv
En el evento Click del botón guardar podrías escribir lo siguiente:
If  Thisform.VerificarRut(Alltrim(Thisform.Text1.Value)
Messagebox("El RUT no es válido, revisar el RUT ingresado.", 64, "Error")
Return
Endif
Seguiría el código de guardar.
Esto debería solucionar el problema.
El codigo funciona, pero tiene unos problemillas, tengo el rut por ej : 17329873-0 que es un rut que esta bien, pero lo rechaza, si lo acepeta cambiandole el digito verificador pero cambiandole el gitito verificador el rut no esta bien. Nose si se entiende, por favor te solicito tu ayuda.
Muchas gracias. Saludos
Explícame en prueba de escritorio, es decir con tus propias palabras cómo hace en Chile para comprobar si el RUT está bien, porque si el código que te envié funciona, entonces el problema es de procedimiento.
Estamos hablando...
Bueno, paso a explicar la formula para conseguir el Digito Verificador de un RUT, usaremos el RUT 45875986 como ejemplo:
1.- Se toma el RUT sin el Digito Verificador e invertimos los numeros, el RUT quedaría:
68957854
2.- Luego de esto multiplicamos la primera cifra por 2, el segundo por 3 y asi sucesivamente, pero cuando llegamos al multiplicador 7, en la proxima cifra se vuelve a 2 y se reinicia, hacemos con todas las cifras del RUT, así:
6×2 = 12
8×3 = 24
9×4 = 36
5×5 = 25
7×6 = 42
8×7 = 56
5×2 = 10
4×3 = 12
3.- Sumamos todos los resultados:
12 + 24 + 36 + 25 + 42 + 56 + 10 + 12 = 217
4.- El resultado de la suma lo dividimos por 11 y extraemos el resto (lo que sobra de la división):
217 : 11 = 19
8 <-- Este es el resto
5.- Ese resto se lo restamos, valga la redundancia, a 11 y con esto obtenemos nuestro Digito Verificador:
11 - 8 = 3
Siendo el RUT completo:
45875986-3
6.- Lo anterior tiene 2 excepciones, si el resultado de la resta (en este caso 11 - 3) da como resultado "11?, entonces el digito verificador es "0? y si el resultado de la resta da "10? entonces el digito verificador es "K".
Perdona que moleste tanto. De antemano muchas gracias. Saludos
muchas gracias
Voy a replantear el algoritmo y te lo envío.
Estamos hablando...
Ahí te mando el código corregido, ya está probado con los dos RUTs chilenos que especificaste y es el siguiente:
Lparameters lcValue
Local lcAuxValue, lcChrValue, dv, i, lcSum, lcRest, j, lcNumValue
Store 0 To lcSum
Store 2 To j
lcAuxValue = Left(lcValue, At("-", lcValue) - 1)
lcChrValue = Len(lcAuxValue)
dv = "0"
For i = lcChrValue To 1 Step - 1
lcNumValue = Val(Substr(lcAuxValue, i, 1))
lcSum = lcSum + (lcNumValue * j)
If j > 6
j = 1
Endif
j = j + 1
Endfor
lcRest = Mod(lcSum, 11)
dv = Alltrim(Str(11 - lcRest))
Do Case
Case dv = "10"
dv = "K"
Case dv = "11"
dv = "0"
Endcase
Return Upper(Right(lcValue, 1)) == dv
Ahora, pegas el código en el evento que te dije que crearas y se debe llamarlo de la siguiente manera:
Thisform. VerificarRUT("17329873-0") o bien Thisform. VerificarRut(Alltrim(Thisform. Text1. Value).
Si no deseas colocarle guión al Rut debes cambiar la línea lcAuxValue = Left(lcValue, At("-", lcValue) - 1) por lcAuxValue = Left(lcValue, 8) y llamar al código de la siguiente manera:
Thisform. VerificarRUT("173298730") o bien Thisform. VerificarRut(Alltrim(Thisform. Text1. Value) Siendo el formato del texto "999999999".
Estamos hablando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas