[ adopilot @ 26.11.2007. 09:15 ] @
Poštovani ! Da se slučajno neko već nije susreo sa sql upitom koje kalkuliše check cifru za barkodove tipa EAN13 ili EAN8. |
[ adopilot @ 26.11.2007. 09:15 ] @
[ goranvuc @ 26.11.2007. 09:57 ] @
Tesko ces to moci sa upitom, mozes jedino sa stored procedurom ili UDF-om.
[ chachka @ 26.11.2007. 11:07 ] @
Evo nešto što radi pod PostgreSQL-om, a trebalo bi da radi i pod MS SQL-om.
Code: CREATE TABLE artikli ( ean_kod VARCHAR(13) NOT NULL, opis VARCHAR(5) NOT NULL ); CREATE VIEW brojevi_od_1_do_13 (broj) AS SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13; INSERT INTO artikli (ean_kod, opis) VALUES ('8600102938083', 'dobar'); INSERT INTO artikli (ean_kod, opis) VALUES ('1234567890123', 'los'); INSERT INTO artikli (ean_kod, opis) VALUES ('86003148', 'dobar'); SELECT a.ean_kod, a.opis, (SELECT SUM(cds.cd) % 10 = 0 FROM (SELECT CAST(substring(a.ean_kod from b.broj for 1) AS SMALLINT) AS cd FROM brojevi_od_1_do_13 AS b WHERE (length(a.ean_kod) - b.broj) % 2 = 0 AND length(a.ean_kod) >= b.broj UNION ALL SELECT 3 * CAST(substring(a.ean_kod from b.broj for 1) AS SMALLINT) AS cd FROM brojevi_od_1_do_13 AS b WHERE (length(a.ean_kod) - b.broj) % 2 = 1 AND length(a.ean_kod) >= b.broj ) AS cds ) AS ispravan FROM artikli AS a; Ako postoji funkcija koja generiše skup rednih brojeva (znam da u PostgreSQL-u postoji), onda VIEW nije potreban, a upit se može skratiti da izgleda pristojno. [ adopilot @ 26.11.2007. 11:43 ] @
@chachka
Hvala za skriptu ali nažalost nisam baš familijar sa PostgreSQL TSQL-om MS Sql mi neće izvršiti skriptu a nejsanm mi je onaj dio koda sa "% 10" i "% 2 = " koja je to funkcija ili operater u MS Sql-u Hvala Unaprijed [ chachka @ 26.11.2007. 12:11 ] @
Ovde se ne radi o TSQL-u ili njegovoj analogiji, već o SQL-u i to standardnom. Skripta ti ne prolazi zato što znakove ';' treba zameniti sa 'GO' u slučaju MSSQL-a. Znak '%' je ostatak pri celobrojnom deljenju.
17 % 10 = 7 12 % 2 = 0 [ BezPanike @ 26.11.2007. 18:11 ] @
T-SQL funkcija računa 13. cifru:
Code: CREATE FUNCTION CreateChecksum ( @ean_kod varchar(12) ) RETURNS char(1) AS BEGIN DECLARE @Result char(1) DECLARE @charPos int DECLARE @csumTotal int SET @charPos = len(@ean_kod) SET @csumTotal = 0 WHILE @charPos > 0 BEGIN IF NOT(@charPos % 2 = 0) SET @csumTotal = @csumTotal + CAST(SUBSTRING(@ean_kod, @charPos, 1) AS int) ELSE SET @csumTotal = @csumTotal + 3 * CAST(SUBSTRING(@ean_kod, @charPos, 1) AS int) SET @charPos = @charPos -1 CONTINUE END DECLARE @remainder int SET @remainder = 10 - @csumTotal % 10 SET @remainder = @remainder % 10 SET @Result = CAST(@remainder AS int) RETURN @Result END GO [ chachka @ 26.11.2007. 18:45 ] @
@BezPanike: Cini mi se da procedura ne daje ispravan rezultat za osmocifrene kodove. Nije dovoljno samo proveravati da li je pozicija cifre parna ili neparna, jer se tezina cifre racuna s desna na levo, pa onda tezina cifre zavisi i od duzine koda. U mom upitu je i duzina koda uzeta u obzir.
[ BezPanike @ 27.11.2007. 08:09 ] @
U pravu si, ne radi za EAN-8, ali ja i napisah da računa 13. cifru.
Uz manje modifikacije može da radi i za EAN-8. Recimo, posebna funkcija u kojoj se izbaci ono NOT u IF petlji ili malo logike da bi se dobila jedna funkcija i za EAN-8 i EAN-13. Ne volim rešenja sa pomoćnim tabelama koje sadrže besmislene sekvencijalne brojeve (ili sve datume za par vekova)! Nadam se da smo pomogli autoru teme :) [ chachka @ 27.11.2007. 08:35 ] @
Onaj VIEW brojevi_od_1_do_13 je samo jedan od nacina kako se moze dobiti tabela sa rednim brojevima. U PostgreSQL-u postoji funkcija generate_series(1, 13) koja radi to isto. Mozda slicna funkcija postoji i u MSSQL-u?
[ adopilot @ 27.11.2007. 09:12 ] @
Naravno da ste pomogli i to puno
Bog da nagradi ES i naravno Vas Voljne programere koji uvijek imate riješenje za pojedini problem Po nekim teorijama 20% je main programera koji izmišljaju toplu vodu i bave se core stvarima a nas 80% ostaje koji koristimo onda to u obliku ASP.net-ova ili kojekakvih AJAXA pa samim tim i ovakvih skripti koje samo prepišemo i odaradimo pojedine zadatke Velika Hvala Admir Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|