CAROVY_KOD_EAN.SQL



/******************************************************************************************/
/*                                                                                        */
/*  Vytvářecí skript: CAROVY_KOD_EAN.SQL                                                  */
/*  Datum:            24.01.2001                                                          */
/*  databáze:         ORACLE ver.7.1'                                                     */
/*  Copyright:       (c) 2001 by MEDO Zdeněk jr.                                          */
/*                                                                                        */
/******************************************************************************************/
/*                                                                                        */
/*  volání:           TXT1 VARCHAR2 := EAN_CODER_OUT(TXT2 VARCHAR2);                      */
/*                                                                                        */
/*  popis:            Procedura provádí převod 12-ti místného číselného kódu              */
/*                    na čárkový EAN13 za použití fontu EAN-13.TTF                        */
/*                                                                                        */
/*                    TXT1 = výstupní 14B kód pro font EAN-13.TTF   (např."b3D5FG|XYPQRx) */
/*                    TXT2 = 12B číslo pro převod do čárkového kódu (např. 123456789012)  */
/*                                                                                        */
/*  chybář:           vrací NULL při chybě v zadání kódu                                  */
/*                                                                                        */
/******************************************************************************************/
/*                                                                                        */
/*  volání:           TXT1 NUMBER := EAN_CRC(TXT2 VARCHAR2);                              */
/*                                                                                        */
/*  popis:            Procedura provádí výpočet kontrolního součtu CRC pro EAN8 a EAN13.  */
/*                    Automaticky detekuje typ čárkového kódu podle velikosti             */
/*                    vstupního řetězce.                                                  */
/*                                                                                        */
/*                    TXT1 = výstupní 1B CRC kód               (např. 8)                  */
/*                    TXT2 = 7B nebo 12B číslo pro výpočet CRC (např. 123456789012)       */
/*                                                                                        */
/*  chybář:           vrací NULL při chybě v zadání kódu                                  */
/*                                                                                        */
/******************************************************************************************/

PACKAGE BODY EAN IS


-- =====================================================================================
--                             C O D E R _ O U T
-- =====================================================================================

FUNCTION CODER_OUT (ean_code IN VARCHAR2)   RETURN VARCHAR2 IS

  x_ean_out     VARCHAR2(30)    := NULL;               -- Výstup "NULL" při chybě
  x_for         NUMBER          := 0;                  -- Pro smyčku FOR ... 



-- EAN Init. TABLE ---------------------------------------------------------------------

  TYPE  Row_EAN_code IS RECORD (f_f     VARCHAR2(1), -- First flag
                                s_f     VARCHAR2(1),   -- Second flag
                                l_h_A   VARCHAR2(1),   -- Left Hand A 
                                l_h_B   VARCHAR2(1),   -- Left Hand B
                                r_h     VARCHAR2(1),   -- Right Hand
                                C       VARCHAR2(1),   -- Check
                                ttf_out VARCHAR2(1));  -- Převedené kódy EANu pro TTF

  TYPE  Tab_EAN_code IS TABLE OF Row_EAN_code INDEX BY BINARY_INTEGER;
  EAN_Tabulka Tab_EAN_code;



--  Z A Č Á T E K   H L A V N Í   S M Y Č K Y -------------------------------------------

BEGIN

 IF TO_NUMBER(SUBSTR(ean_code,1,1))= 0 THEN RETURN NULL; END IF;      -- "0" nesmí být jako první číslo EANu



-- Naplň TAB. řídícím kódem TTF --------------------------------------------------------

  FOR x_for IN  0..9 LOOP
    BEGIN
      EAN_Tabulka(x_for).f_f    := chr(33 + x_for);    -- First flag
      EAN_Tabulka(x_for).s_f    := chr(96 + x_for);    -- Second flag
      EAN_Tabulka(x_for).l_h_A  := chr(48 + x_for);    -- Left Hand A 
      EAN_Tabulka(x_for).l_h_B  := chr(64 + x_for);    -- Left Hand B
      EAN_Tabulka(x_for).r_h    := chr(80 + x_for);    -- Right Hand
      EAN_Tabulka(x_for).C      := chr(112+ x_for);    -- Check
    END;
  END LOOP;



-- CRC EAN 13 --------------------------------------------------------------------------

  IF TO_NUMBER(LENGTH(ean_code)) = 12 THEN             -- Jde o EAN 12 ?
     BEGIN
       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 0 THEN      -- První číslo 0 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_A;    -- 1/A
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_A;    -- 2/A
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_A;    -- 3/A
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_A;    -- 4/A
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_A;    -- 5/A
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 1 THEN      -- První číslo 1 ?
         BEGIN
          EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_A;    -- 1/A
          EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
          EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_A;    -- 3/A
          EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_B;    -- 4/B
          EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_B;    -- 5/B
          GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 2 THEN      -- První číslo 2 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_A;    -- 1/A
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_B;    -- 3/B
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_A;    -- 4/A
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_B;    -- 5/B
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 3 THEN      -- První číslo 3 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_A;    -- 1/A
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_B;    -- 3/B
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_B;    -- 4/B
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_A;    -- 5/A
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 4 THEN      -- První číslo 4 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_A;    -- 2/A
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_A;    -- 3/A
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_B;    -- 4/B
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_B;    -- 5/B
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 5 THEN      -- První číslo 5 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_A;    -- 3/A
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_A;    -- 4/A
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_B;    -- 5/B
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 6 THEN      -- První číslo 6 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_B;    -- 3/b
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_A;    -- 4/A
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_A;    -- 5/A
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 7 THEN      -- První číslo 7 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_A;    -- 2/A
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_B;    -- 3/B
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_A;    -- 4/A
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_B;    -- 5/B
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 8 THEN      -- První číslo 8 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_A;    -- 2/A
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_B;    -- 3/B
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_B;    -- 4/B
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_A;    -- 5/A
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

       IF TO_NUMBER(SUBSTR(ean_code,1,1))= 9 THEN      -- První číslo 9 ?
         BEGIN
           EAN_Tabulka(3).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,3,1))).l_h_B;    -- 1/B
           EAN_Tabulka(4).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,4,1))).l_h_B;    -- 2/B
           EAN_Tabulka(5).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,5,1))).l_h_A;    -- 3/A
           EAN_Tabulka(6).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,6,1))).l_h_B;    -- 4/B
           EAN_Tabulka(7).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,7,1))).l_h_A;    -- 5/A
           GOTO End_EAN_13;                                                                  -- Skoč na konec a proveď konverze
         END;
       END IF;

     RETURN NULL;                                      -- Výstup "NULL" při chybě
     END;

  END IF;                                              -- End IF EAN 13

  RETURN NULL;                                         -- Výstup "NULL" při chybě



--  K O N E C   H L A V N Í   S M Y Č K Y ----------------------------------------------



-- SMYČKA EAN13 PRO VÝSTUP TXT/TTF DAT ------------------------------------------------

 << End_EAN_13 >> 

  EAN_Tabulka(1).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,1,1))).f_f;      -- Doplň 1. cifru
  EAN_Tabulka(2).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,2,1))).s_f;      -- Second flag
  EAN_Tabulka(8).ttf_out  := chr(124);                                              -- Center guard
  EAN_Tabulka(9).ttf_out  := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,8,1))).r_h;      -- Right Hand
  EAN_Tabulka(10).ttf_out := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,9,1))).r_h;      -- Right Hand
  EAN_Tabulka(11).ttf_out := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,10,1))).r_h;     -- Right Hand
  EAN_Tabulka(12).ttf_out := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,11,1))).r_h;     -- Right Hand
  EAN_Tabulka(13).ttf_out := EAN_Tabulka(TO_NUMBER(SUBSTR(ean_code,12,1))).r_h;     -- Right Hand
  EAN_Tabulka(14).ttf_out := EAN_Tabulka(TO_NUMBER(CRC(ean_code))).c;               -- Check

  FOR x_for IN  1..14 LOOP
    BEGIN
      x_ean_out := x_ean_out||EAN_Tabulka(x_for).ttf_out;                           -- Naplň tab.s výst. kódem
    END;
  END LOOP;

  RETURN x_ean_out;                                    -- Konec s výstupem CRC
END;                                                   -- End FUNCTION CODER_OUT






-- =====================================================================================
--                                       C R C
-- =====================================================================================

FUNCTION CRC (ean_code IN VARCHAR2)   RETURN NUMBER IS

  x_ean_crc     NUMBER          := NULL;               -- Výstup "NULL" při chybě
  x_ean         NUMBER          := 0;                  -- pomocný reg.pro výpočty

BEGIN



-- CRC EAN 8 ---------------------------------------------------------------------------

  IF TO_NUMBER(LENGTH(ean_code))= 7 THEN               -- Jde o EAN 8 ?
     BEGIN
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,1,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,2,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,3,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,4,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,5,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,6,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,7,1))*3;

        x_ean_crc := (10-(MOD(x_ean, 10)));            -- CRC výpočet
        IF x_ean_crc = 10 THEN x_ean_crc := 0;END IF;  -- Test na CRC = 10
        RETURN x_ean_crc;                              -- Konec s výstupem CRC

     END;
  END IF;                                              -- End IF EAN 8



-- CRC EAN 13 --------------------------------------------------------------------------

  IF TO_NUMBER(LENGTH(ean_code)) = 12 THEN             -- Jde o EAN 13 ?
     BEGIN
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,1,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,2,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,3,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,4,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,5,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,6,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,7,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,8,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,9,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,10,1))*3;
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,11,1));
        x_ean := x_ean + TO_NUMBER(SUBSTR(ean_code,12,1))*3;

        x_ean_crc := (10-(MOD(x_ean, 10)));            -- CRC výpočet
        IF x_ean_crc = 10 THEN x_ean_crc := 0;END IF;  -- Test na CRC = 10
        RETURN x_ean_crc;                              -- Konec s výstupem CRC

-- ----------------------------- Další možnost výpočtu ---------------------------------
--  x_ean_s := (TO_NUMBER(LENGTH(x_ean_crc)));         -- Zjisti vel.výpočtu
--  x_ean_l := 10-(SUBSTR(x_ean_crc, x_ean_s, 1));     -- Vem poslední cifru
-- -------------------------------------------------------------------------------------

     END;
  END IF;                                              -- End IF EAN 13
  RETURN NULL;                                         -- Výstup "NULL" při chybě

END;                                                   -- End FUNCTION CRC


END;                                                   -- End PACKAGE BODY EAN

	



© Copyright 2001 by Zdeněk MEDO jr.