[ 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.



[ 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