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
