Ir al contenido principal

Destacados

Crear nuestra propia distribución Linux openSUSE con KIWI NG

Como bien lo dice su wiki,  KIWI  es una herramienta de línea de comandos que permite construir imágenes de sistemas operativos Linux aplicados para hardware físico, como así también para entornos virtuales. Permite crear una distribución Linux con el mínimo sistema operativo y software necesario para tareas específicas ( JeOS, J ust enough  Operating System ), o bien crear y personalizar una distribución Linux a nuestro propio antojo.

Calcular dígito verificador de códigos de barra EAN13 con Oracle PL/SQL

En el trabajo tuve la necesidad de calcular el dígito verificador de códigos de barra EAN13 con el lenguaje PL/SQL de Oracle, y como estaba bastante perezoso para codificarlo por mí mismo me puse a probar varios ejemplos de código que había encontrado en Internet.

Los resultados de las pruebas de dichos ejemplos fueron diversos, y como en ciertas ocasiones el dígito verificador calculado no resultaba ser el correcto, al final decidí crear mi propia versión.

El código que sigue a continuación es una función que retorna el dígito verificador calculado en base a la cadena de caracteres que recibe como parámetro. La función es bastante simple y tiene amplio margen de mejora, pero el código básico requerido para calcular el dígito verificador funciona y es eso lo que pretendo dejar documentado.
CREATE OR REPLACE FUNCTION CODIGO_BARRAS_GENERAR_DV(P_CODIGO IN VARCHAR2, P_TIPO VARCHAR2 DEFAULT 'EAN13') RETURN VARCHAR2 IS
    L_SUM          NUMBER;
    L_MULTIPLE     NUMBER;
    V_CODIGO_EAN13 VARCHAR2(13) DEFAULT NULL;
BEGIN
    IF (P_TIPO = 'EAN13') THEN
        V_CODIGO_EAN13 := SUBSTR(LPAD(P_CODIGO,12,'0'),1,12);
        FOR I IN 1..12 LOOP
            IF (MOD(I,2) = 0) THEN
                L_MULTIPLE := 3;
            ELSE
                L_MULTIPLE := 1;
            END IF;

            L_SUM := NVL(L_SUM, 0) + SUBSTR(V_CODIGO_EAN13, I, 1) * L_MULTIPLE;
        END LOOP;

        RETURN V_CODIGO_EAN13||REPLACE((10 - MOD(L_SUM, 10)),10,0);
    ELSE
        RETURN NULL;
    END IF;
END;
ENLACE: Código disponible en Gist de Github.

Fuentes

Comentarios