en

Tecnologia

Validar el Digito de verificación de un NIT C# y PL/SQL

Hola todos

Quiero compartir con ustedes estas líneas de código, que suelen ser útiles en aplicaciones que manipulan NITs y requieren validar el digito de verificación de ese número.

El algoritmo es bien simple, pero cabe tener a la mano esto cuando se necesite y no gastarle mucho tiempo.

Buscando en internet, se ecunetra por ahi la implementación en FoxPro, en VB 6.0, pero nada actualizado para .NET, y adicionalmente coloco el código para PL/SQL que es lo mismo pero para ORACLE.

public string ValidarDigitoVerificacion(string unNit)
  {
   string miTemp;
   int miContador;
   int miResiduo;
   int miChequeo;
   int[] miArregloPA = new int[15];
   miArregloPA[0] = 3;
   miArregloPA[1] = 7;
   miArregloPA[2] = 13;
   miArregloPA[3] = 17;
   miArregloPA[4] = 19;
   miArregloPA[5] = 23;
   miArregloPA[6] = 29;
   miArregloPA[7] = 37;
   miArregloPA[8] = 41;
   miArregloPA[9] = 43;
   miArregloPA[10] = 47;
   miArregloPA[11] = 53;
   miArregloPA[12] = 59;
   miArregloPA[13] = 67;
   miArregloPA[14] = 71;
   miChequeo = 0;
   miResiduo = 0;
   for(miContador = 0; miContador<unNit.Length;miContador++)
   {
    miTemp = unNit[(unNit.Length-1) - miContador].ToString();
    miChequeo = miChequeo + (Convert.ToInt32(miTemp) * miArregloPA[miContador]);
   }
   miResiduo = miChequeo % 11;
   if(miResiduo > 1)
    return Convert.ToString(11 - miResiduo);
   return miResiduo.ToString();
  }

El método recibe el NIT, cálcula el digito de evrificación y lo retorna. El algoritmo se llama el Modulo 11, porque si notan lo que se hace finalmente con lo cálculado es obtener el modulo 11 de ese valor. El arreglo miArregloPA, lo que contiene son una serie de números primos requeridos por el algoritmo.Si se fijan, el arreglo miTemp, almacena el NIT de atras para adelante, y se genera una sumatoria del producto de cada valor del arreglo miTemp con cada número de miArregloPA.

Bueno y ahora en PL:

CREATE OR REPLACE FUNCTION ValidarDigitoChequeoNIT(chrNIT VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  DECLARE
    intContador  NUMBER;
    intACUM  NUMBER;
    intRESTO  NUMBER;
    intLongIden NUMBER; --Longitud de la cadena identificación}

    -- Arreglo
    TYPE arregloPA IS TABLE OF NUMBER(2)
    INDEX BY BINARY_INTEGER;

    -- Variable de tipo arreglo
    arrPA  arregloPA;
    arrDA  arregloPA;
  BEGIN
    -- Válida el dígito de chequeo
    SELECT Length(chrNIT) + 1
    INTO   intLongIden
    FROM   DUAL;

    -- Llenar el arreglo PA, estos son números primos, según loe stablece el algoritmo
    arrPA(1) := 3;
    arrPA(2) := 7;
    arrPA(3) := 13;
    arrPA(4) := 17;
    arrPA(5) := 19;
    arrPA(6) := 23;
    arrPA(7) := 29;
    arrPA(8) := 37;
    arrPA(9) := 41;
    arrPA(10) := 43;
    arrPA(11) := 47;
    arrPA(12) := 53;
    arrPA(13) := 59;
    arrPA(14) := 67;
    arrPA(15) := 71;
    intContador := 1;
    -- Llena el arreglo DA con la cadena de entrada que es el NIT
    FOR intContador IN 1..intLongIden - 1 LOOP
      arrDA(intContador) := TO_NUMBER(substr(chrNIT,intLongIden- intContador, 1));
    END LOOP;
    -- Llena con ceroas el resto de posiciones del arreglo
    FOR intContador IN intLongIden..15 LOOP
      arrDA(intContador) := 0;
    END LOOP;
    intACUM := 0;
    FOR intContador IN 1..15 LOOP
      intACUM := intACUM +  (arrDA(intContador) * arrPA(intContador));
    END LOOP;
    -- Obtiene el modulo 11 del acumulado
    intRESTO := MOD(intACUM,11);
    IF (intRESTO > 1) THEN
   return TO_CHAR(11 - intRESTO);
    ELSE
      return TO_CHAR(intRESTO);
    END IF;
  END;
END F_ValidarDigitoChequeoNIT;

Como pueden ver, es una función de PL, que hace exactamente lo mismo que el método en C#.

Felices lineas de código

Att. Andres Ortiz

Publicado ago 27 2007, 07:44 por admin
Archivado en: ,,,,

Comentarios

 

Lexklark ha opinado:

Oye buen código es lo que buscaba, no sabia como hacerlo pero ahora gracias a ti... ya me entere como... :-)

Gracias...

Saludos

enero 29, 2008 11:30
Copyright © 2003 - 2007 Célula Unicauca.NET.
Ofrecido por Community Server (Non-Commercial Edition)