Cálculo digito verificador RUT (DNI) Chile / Calculation of verification digit RUT (DNI) Chile

soy nuevo en AppSheet, quisiera dejar mi primer aporte a la comunidad, como resolver el cálculo y la verificación del RUT Chileno.

el Algoritmo es el siguiente:

 

 

 

 

 

 

¿Cómo se calcula el digito verificador? - Algoritmo del Módulo 11

Para el siguiente ejemplo, tomaremos al azar el Rut:
27.962.409-2

Pasos para calcular el Digito Verificador:
1) Se toman todos los números del RUT (sin el digito verificador).
27.962.409

2) Se da vuelta esa cifra, es decir, reordenamos los números comenzando de derecha a izquierda.
9 0 4 2 6 9 7 2

3) Ahora multiplicaremos cada uno de estos números por la siguiente serie: 2, 3, 4, 5, 6, 7 y si se acaba la serie, volvemos a empezar 2, 3, 4...

9 × 2 = 18
0 × 3 = 0
4 × 4 = 16
2 × 5 = 10
6 × 6 = 36
9 × 7 = 63
7 × 2 = 14
2 × 3 = 6

4) Una vez hecho esto, sumamos todos los resultados:
18 + 0 + 16 + 10 + 36 + 73 + 14 + 6 = 163

5) El resultado obtenido lo dividimos por 11, para luego obter el Resto de esa división.
163 / 11 = 14,81818181818182
Tomamos el resultado sin decimales y sin aproximación. En este caso quedaría 14 y lo multimplicamos por 11
14 x 11 = 154

6) Posteriormente, al resultado del paso 4 le restamos los 154 obtenidos anteriormente.
163 - 154 = 9 (valor absoluto, sin signo)

7) Y para finalizar, a 11 le restamos el resultado anterior:
11 - 9 = 2

Y así hemos calculado que 2 es el digito verificador de nuestro Rut, tal cual lo indicamos al comienzo de este ejercicio.

Ahora bien, si como resultado final del digito verficador nos da el número 11, el dígito verificador será 0 y si es 10 el dígito será la letra K.

11 => 0
10 => K

 

 

 

 

 

 

18208454-9 / 11431725-K / 15580783-0

en el caso que los RUT sean menores a 10.000.000, en Appsheet es mejor rellenar con ceros a la izquierda hasta 8 caracteres ejemplo 00000001-9, de esta forma el código esta muy optimizado a errores y queda muy corto de extensión.

 

 

 

 

 

 

SWITCH(
11-(MOD(
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 8,1))*2 + 
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 7,1))*3 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 6,1))*4 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 5,1))*5 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 4,1))*6 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 3,1))*7 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 2,1))*2 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 1,1))*3,11)),
11,0,
10,"K",
11-(MOD(
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 8,1))*2 + 
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 7,1))*3 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 6,1))*4 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 5,1))*5 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 4,1))*6 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 3,1))*7 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 2,1))*2 +
NUMBER(MID(CONCATENATE(RIGHT(("0000000" & [fCONCATENATE(RIGHT(("0000000" & [RUT]), 8))]), 8)), 1,1))*3,11)))

 

 

 

 

 

el digito correcto es 5el digito correcto es 5

Quiero agradecer a los usuarios de este post: https://www.googlecloudcommunity.com/gc/Tips-Tricks/Refining-UNIQUEID-expression/m-p/338017#M2895

que me mostraron el camino a seguir ...

 

7 13 6,902
13 REPLIES 13

Buena idea, sin duda que el dígito verificador chileno es un poco complejo de manejar en solo una línea de código para calcularlo así que buen trabajo

Hola Pablo! sin duda es un excelente trabajo, me ayudó un mucho a resolver la validación del RUT, sin embargo cuando se trata de la letra K aunque el RUT sea correcto me da error, ¿alguna recomendación? te lo agradecería mucho. 

Valida mejor el ingreso sea con Mayuscula o usa Upper (texto)

ya que valida "K" en mayuscula

Saludos

Pablo

hola Pablo, genial tu aporte. Recién estoy en esta plataforma. mi idea es crear una app que a través de el rut le entrega a un apoderado las notas de su hijo. Por eso llegue hasta aca. recién viendo totorales y las preguntas frecuentes de esto que no conocía. He estado viendo que se trabaja con tablas. que me sugieres para lo que debo realizar??

Vi hace un tiempo este post y quise ver si podía optimizar la expresión un poco. Aquí va.

Tomando un campo [RUT] (sea que se digite o no con guión) y calculando el DV correcto sin importar si tiene puntos o no:

SWITCH(
	11-
  MOD(
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 8, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 7, 1))*3+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 6, 1))*4+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 5, 1))*5+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 4, 1))*6+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 3, 1))*7+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 2, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 1, 1))*3,
    11.0
  ),
  1, "1",
  2, "2",
  3, "3",
  4, "4",
  5, "5",
  6, "6",
  7, "7",
  8, "8",
  9, "9",
  10, "K",
  11, "0",
  "Sin información"
)

En caso de que el campo tenga el RUT completo (con DV) y utilice un Valid_If para ver si se digitó el RUT correctamente:

SWITCH(
	11-
  MOD(
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 8, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 7, 1))*3+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 6, 1))*4+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 5, 1))*5+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 4, 1))*6+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 3, 1))*7+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 2, 1))*2+
    NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 1, 1))*3,
    11.0
  ),
  1, "1"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  2, "2"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  3, "3"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  4, "4"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  5, "5"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  6, "6"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  7, "7"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  8, "8"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  9, "9"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  10, "K"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  11, "0"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
  FALSE
)

excelente trabajo

Tremenda ayuda, muchas gracias, se pasaron !!!

¡Gracias por la orientación! consulta ¿se podría pasar a una función de Apps Script? Saludos!

Todo depende de tu habilidad en AppScript. Pero, para qué la necesitas fuera de AppSheet?

Hola, tengo implementada la función en app scripts pero no he podido integrarla en appsheet. Soy nuevo en esta plataforma, y ​​no sé cómo ejecutar la función al momento de ingresar el dato al campo. ¿Será posible hacer que se ejecute en el momento de ingresar el valor?

Te sugiero usarla dentro de AppSheet para que puedas hacer la validación antes de que se guarde el formulario. La verdad es que no veo beneficio de usar una función en AppScript para esto, la idea de AppScript es hacer cosas imposibles de hacer en AppSheet

El problema que tengo es: cómo hago que la tarea de validación la ejecute al momento de haber ingresado el valor, en vez de esperar que se grabé el formulario para ver si el dato es correcto.

AppSheet no espera a que el usuario desee guardar el formulario. Al momento de pasar al siguiente campo ya te muestra si el valor es válido o no

Top Labels in this Space