[ chachka @ 26.06.2006. 20:58 ] @
Verovatno vam se desavalo u praksi da morate/zelite proveriti ispravnost PIB-a nekog pravnog lica. Evo PostgreSQL funkcija koja proverava ispravnost unetog PIB-a. Code: CREATE OR REPLACE FUNCTION proveri_pib (pib varchar) RETURNS smallint AS $body$ -- -- Funkcija 'proveri_pib' proverava ispravnost prosledjenog PIB-a -- - pib: poreski identifikacioni broj u formatu NNNNNNNNK -- N = cifra -- K = kontrolna cifra -- - Rezultat: -- 1 = ako je pib ispravan, -- 0 = ako pib nije ispravan. -- DECLARE i SMALLINT; cifra SMALLINT; saldo SMALLINT; BEGIN IF (pib IS NULL) OR (length(pib) <> 9) THEN -- odbacivanje ocigledno losih pib-ova RETURN 0; ELSE -- pib je ispravne duzine te se pristupa racunanju kontrolne cifre saldo = 0; FOR i IN 1 .. 8 LOOP saldo = saldo + CAST(substring(pib from i for 1) AS SMALLINT); IF saldo > 10 THEN saldo = saldo - 10; END IF; saldo = 2 * saldo; IF saldo > 10 THEN saldo = saldo - 11; END IF; END LOOP; cifra = 11 - saldo; IF cifra > 10 THEN cifra = 0; END IF; -- proveri kontrolnu cifru IF cifra = CAST(substring(pib from 9 for 1) AS SMALLINT) THEN RETURN 1; ELSE RETURN 0; END IF; END IF; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; Primer koriscenja ove funkcije. Napravicemo tabelu 'partneri' koja ce izmedju ostalih atributa imati i atribut 'pib_partnera'. Nad ovom tabelom cemo postaviti CHECK CONSTRAINT koji nece dozvoliti unos neispravnog PIB-a. Code: CREATE TABLE partneri( sifra_partnera CHAR(5) NOT NULL, pib_partnera CHAR(9) NOT NULL, naziv_partnera VARCHAR(50) NOT NULL, CONSTRAINT sifra_partnera PRIMARY KEY (sifra_partnera), CONSTRAINT ispravan_pib CHECK (proveri_pib(pib_partnera) = 1) ); Ispravnost svega cemo proveriti pomocu podataka koji sadrze ispravne PIB-ove. Code: INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera) VALUES ('00001', '100837287', 'Vinoprodukt-Coka doo'); INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera) VALUES ('00002', '104256433', 'Zlatibo2r Voda doo'); COMMIT; Ovi INSERT-i su prosli bez problema. Takodje cemo pokusati da unesemo i jedan neispravan PIB Code: INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera) VALUES ('00003', '100000111', 'Delyug ad'); COMMIT; Ovaj INSERT je prijavio gresku 'new row for relation "partneri" violates check constraint "ispravan_pib"' jer je PIB Delyug-a 100000112, a ne 100000111. |