Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Provjera JMBG-a ...

[es] :: .NET :: Provjera JMBG-a ...

[ Pregleda: 19412 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.adsl-1.sezampro.yu.



+3 Profil

icon Provjera JMBG-a ...20.09.2009. u 22:00 - pre 177 meseci
Radim na jednoj aplikaciji u kojoj se zahtijeva da primarni kljuc pretrage bude JMBG i htio sam da napisem kod za validaciju unosa JMBG-a. Na osnovu mog pretrazivanja po Internet-u, pronasao sam algoritam (isti na vise linkova, a primijenio sam formulu sa linka datog upravo na ovom forumu), iskodirao ga (C#) i krenuo sa testom. Unosio sam JMBG-ove clanova familije, kolega, itd i sve je bilo ispravno. Ono sto mi nije jasno jeste da ako unesem brojeve tipa: 8888888888888, ili 9999999999999, sto bi trebali biti neispravni JMBG-ovi, dobijam poruku da su ispravni. Jasno mi je da moram uvesti kontrolu datuma rodjenja, ali sam ocekivao da ce algoritam sam prepoznati ovakve slucajeve. Na dnu sam dao i kod koji primjenujem (kao sto rekoh, primijenio sam formulu datu na jednom linku na ovom forumu).

Takodje, na vise foruma, pa i na ovom, daju se primjeri da postoje lica sa neispravno dodijeljenim JMBG-ovima???
Takodje sam saznao, ne znam da li je to tacno, da su recimo, izbjeglicama u Srbiji, prilikom dodjele drzavljanstva greskom dodjeljivana dva ili vise JMBG-ova (kazem, ne znam da li je to 100% tacno).

Postavlja se pitanje ako je sve ovo tacno, da li je algoritam koji sam primijenio validan? Ima li neko sa slicnim iskustvima?
Znaci, primarno me interesuje zasto primjeri brojeva: 8888888888888 i/ili 9999999999999 prolaze validacioni algoritam (sa porukom: "Unijeti maticni broj je ISPRAVAN !(razlika=kontrolna cifra))"??? Da li sam napravio neku gresku u kodu?

Evo i koda (C#):

if (textBox1.TextLength == 13)
{
string pom = textBox1.Text;
char[] niz = pom.ToCharArray(0, 13);

// mrzilo me da pisem for petlju ...
int zbir = 7 * (Convert.ToInt32(niz[0] - 0x30) + Convert.ToInt32(niz[6] - 0x30));
zbir += 6 * (Convert.ToInt32(niz[1] - 0x30) + Convert.ToInt32(niz[7] - 0x30));
zbir += 5 * (Convert.ToInt32(niz[2] - 0x30) + Convert.ToInt32(niz[8] - 0x30));
zbir += 4 * (Convert.ToInt32(niz[3] - 0x30) + Convert.ToInt32(niz[9] - 0x30));
zbir += 3 * (Convert.ToInt32(niz[4] - 0x30) + Convert.ToInt32(niz[10] - 0x30));
zbir += 2 * (Convert.ToInt32(niz[5] - 0x30) + Convert.ToInt32(niz[11] - 0x30));

int ostatak = zbir % 11;
int razlika = 11 - ostatak;

if (ostatak == 1)// ako je ostatak 1, JMBG je POGRESAN
{
MessageBox.Show("Unijeti maticni broj NIJE ispravan ! (Ostatak=1)");
textBox1.Clear();
textBox1.Focus();
}
else if (ostatak == 0)
{
if (Convert.ToInt32(niz[12] - 0x30).Equals(0))
{
MessageBox.Show("Unijeti maticni broj je ISPRAVAN !(ostatak=0,kontrolna cifra=0)");
textBox1.Clear();
textBox1.Focus();
}
else
{
MessageBox.Show("Unijeti maticni broj NIJE ispravan !(ostatak=0,kontrolna cifra!=0)");
textBox1.Clear();
textBox1.Focus();
}
}
else if ( razlika == (niz[12] - 0x30))
{
MessageBox.Show("Unijeti maticni broj je ISPRAVAN !(razlika=kontrolna cifra)");
textBox1.Clear();
textBox1.Focus();
}
else
{
MessageBox.Show("Unijeti maticni broj NIJE ispravan !(razlika!=kontrolna cifra)");
textBox1.Clear();
textBox1.Focus();
}
}

Programming is fun, but writing good software is hard ...
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 08:12 - pre 177 meseci
Događa se u praksi da uistinu JMBG broj nije ispravana prema algoritmu za provjeru. Zašto daju krive JMBG-ove ne znam. Ovo za same osmice i devetke ne znam, ali to lako izbjegneš tako da napraviš provjeru ako su uneseni svi isti brojevi da ne prolazi, a čim dodaš još jedan broj, ne vjerujem da će ti dati točan rezultat. Evo ti kod za provjeru u delphi-u, malo je kraći i lako ćeš ga preraditi ako želiš...

Code:
function KontrolaJMBG(s: string): Boolean;
var
   a: array[2..14] of integer;
   iKont, iZbroj, i: integer;
begin

   for i := 2 to 14 do
     a[i] := a[i] := StrToInt( s[i - 1] ); 

   for i := 1 to 6 do
   begin
     iKont := (8 - i) * (a[i + 1] + a[i + 7]);
     iZbroj := iZbroj + iKont;
   end;

   iZbroj := 11 - (iZbroj mod 11);

   Result := (iZbroj = a[14]);
end; 


Zaključak: nije pametno da JMBG bude PK
F
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9514
*.teletrader.com.



+10254 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 08:27 - pre 177 meseci
Ti ovde kontroliešeš kontrolnu cifru i to je OK. Ali ne bi bilo loše i da kontrolišeš:
- prve četiri cifre su ddMM. Dakle, uvedi datumsku kontrolu: MM mora biti >= 01 i <= 12. I naravno datum u msecu
- zatim slede cifre za godinu. Ne mogu biti <900 niti veće od tekuće godine

OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.ppp.panet.co.yu.



+3 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 10:13 - pre 177 meseci
Pro se izvinjavam sto sam sinoc, u zurbi, postavio ovaj upit na krivi podforum (Access) ...

Hvala vam na odgovoru, kao sto sam napisao, jasno mi je da moram uvesti kontrolu datuma rodjenja (sto se odnosi na prvih 7 cifara), ali mi nije jasno da primjeri JMBG-va koji sadrze 13 istih cifara (od 1111111111111 pa redom do 9999999999999) prolaze algoritam validacije JMBG-a???

Recimo,
Primjer unosa: 9 9 9 9 9 9 9 9 9 9 9 9 9
Algoritam: 7*18 + 6*18 + 5*18 + 4*18 + 3*18 + 2*18 = 486, 486 % 11 = 2, 11 - 2 = 9, a 9 je i kontrolna cifra i po ovom algoritmu broj 9999999999999 prolazi kao validan ???

Aplikacija koju razvijam treba da se instalira izvan Beograda, pa bih htio da izbjegnem situacije da zbog necijeg krivog JMBG-a putujem iz Beograda do tamo ... nista, mora se uvesti i kontrola prvih 5 cifara (datuma rodjenja) ... nisam se ranije bavio validacijom JMBG-a, pa me je ovo malo iznenadilo ...

Programming is fun, but writing good software is hard ...
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 12:13 - pre 177 meseci
Nisi pozorno pročitao moj post. Dogoditi če ti se da JMBG koji se prepiše iz osobne ne prođe validaciju, bez obzira šta se građanin vodi pod tim JMBG. Preporučam da koristiš neki drugi PK a ne JMBG.
I ne moraš putovati na lokaciju, koristi TeamViewer ili UltraVNC.
F
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.ppp.panet.co.yu.



+3 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 12:33 - pre 177 meseci
OK, shvatio ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9514
*.teletrader.com.



+10254 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 13:31 - pre 177 meseci
JMBG može da ima pogrešnu kontrolnu cifru. Kako - ne znam, ali ajde, verujem da si u praksi susretao i takve primere. Ipak, to nije razlog da JMBG ne bude PK.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 13:58 - pre 177 meseci
Citat:
Java Beograd: JMBG može da ima pogrešnu kontrolnu cifru. Kako - ne znam, ali ajde, verujem da si u praksi susretao i takve primere. Ipak, to nije razlog da JMBG ne bude PK.


Ima po forumima slučajeva gdje ljudi iz prakse pišu da im daje grešku u JMBG-u (meni se također jednom dogodilo). Ne znam, neka sam odluči šta će mu biti PK, ali šta ako je JMBG PK, a ti mu ne dopuštaš da unosi JMBG ako ne prolazi kontrolu? Možda je bolje da stavi neki npr. surogat key kao PK, ali da dozvoli manipulaciju JMBG-om kao da je PK...
F
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.adacta.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 14:26 - pre 177 meseci
Citat:
Java Beograd: Ipak, to nije razlog da JMBG ne bude PK.

Deševalo se u praksi da 2 osobe imaju isti JMBG što je dovoljno da JMBG ne bude PK. Jednostavno, govoruće šifre nikada ne bi trebale da budu PK.
Ne znam šta ta aplikacija treba da radi, ali recimo da je unos/pretraga osoba iz Srbije po JMBG.
Želite da proširite svoje poslovanje i da unosite osobe sa Novog Zelanda. Šta je onda PK? SSN?
Koja je pretraga brža, po int ili varchar polju?
Zatim, stvar sigurnosti.
Ako pravite web apliakciju i pozivate stranicu za detaljan prikaz osobe. Kako ide taj poziv?
www.nekisajt.com/PersonDetails.aspx?osoba_id=12234234234...

 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9514
*.teletrader.com.



+10254 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 14:31 - pre 177 meseci
Citat:
Dejan Carić: Jednostavno, govoruće šifre nikada ne bi trebale da budu PK.

Da, sa ovim drugim se slažem, to je iz teorije baze podataka. Ni ja to ne praktikujem.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.ppp.panet.co.yu.



+3 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 16:21 - pre 177 meseci
Ja nisam imao baze na fakultetu - davno sam diplomirao :) ... interesuje me sta se podrazumijeva pod 'govorucim' siframa ? ... JMBG nece biti PK, nisam se dobro izrazio, ali je zamisljen da bude , da se tako izrazim, glavno polje za pretragu (pored polja, recimo, prezime, broj neke clanske kartice i slicno ...) prilikom kreiranja, da ga tako nazovem, pracenja nekog korisnika u nekom intervalu vremena ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
93.86.151.*

Sajt: www.dcaric.com


+26 Profil

icon Re: Provjera JMBG-a ...21.09.2009. u 19:25 - pre 177 meseci
Govoruće šifre su one koje imaju neko logičko značenje i koje se koriste za prikaz u tvojoj aplikaciji.
Recimo, broj lične karte isto može biti govoruća šifra. Ako radiš poslovne aplikacije, onda recimo broj fakture, itd.
Ukoliko se pretraga najviše radi po matičnom broju, onda se nad tim poljem podigne index da bi upit brže vraćao podatke.
 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.88.*

ICQ: 20785904


+4 Profil

icon Re: Provjera JMBG-a ...22.09.2009. u 20:51 - pre 177 meseci
Citat:
int zbir = 7 * (Convert.ToInt32(niz[0] - 0x30) + Convert.ToInt32(niz[6] - 0x30));



int zbir = 7*(niz[0]-'0') + niz[6]-'0'
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.ppp.panet.co.yu.



+3 Profil

icon Provjera JMBG-a ...24.09.2009. u 12:42 - pre 177 meseci
Evo koda za provjeru unijetog JMBG-a (provjerava datum rodjenja i kontrolnu cifru) ... nadam se da ce bar nekom biti od koristi:
Code:

        private bool provjeriJMBG( string jmbgUnos)
        {
            if ( jmbgUnos.Length == 13) // provjera duzine unosa ...
            {
                int[] danaUmjesecu = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
                char[] niz = jmbgUnos.ToCharArray(0, 13); // pretvori u niz karaktera

                // prvo provjera unosa godine rodjenja
                char[] godinaRodjenja = jmbgUnos.ToCharArray(4, 3); // izvuci cifre koje se odnose na godinu rodjenja
                int pomGodina = 100 * (Convert.ToInt32(godinaRodjenja[0] - '0')) +
                                 10 * (Convert.ToInt32(godinaRodjenja[1] - '0')) +
                                       Convert.ToInt32(godinaRodjenja[2] - '0'); // napravi godinu rodjenja

                if (godinaRodjenja[0] == '0') // neko ko je rodjen u XXI vijeku ...
                    pomGodina += 2000;
                else
                    pomGodina += 1000; // ko je rodjen u XX vijeku

                if (pomGodina < 1900) // trenutno, godina ne moze biti manja od 1900-e !
                {
                    MessageBox.Show("Unesena godina rodjenja manja od 1900-e godine !!!");
                    return false;
                }
                else
                {
                    if (pomGodina > DateTime.Now.Year) // niti veca od tekuce godine !
                    {
                        MessageBox.Show("Unesena godina rodjenja veca od tekuce godine !!!");
                        return false;
                    }
                }

                // provjera unosa mjeseca rodjenja
                char[] mjesecRodjenja = jmbgUnos.ToCharArray(2, 2); // izvuci cifre koje se odnose na mjesec rodjenja
                int pomMjesec = 10 * (Convert.ToInt32(mjesecRodjenja[0] - '0')) +
                                      Convert.ToInt32(mjesecRodjenja[1] - '0');
                if (pomMjesec > 12 || pomMjesec < 1) // mjesec mora biti <= 12 i > 0 
                {
                    MessageBox.Show("Pogresno unesen mjesec rodjenja (treca i cetvrta cifra) !!!");
                    return false;
                }

                // provjera da li godina prestupna (zbog broja dana u mjesecu)
                if (((pomGodina % 4) == 0) && (((pomGodina % 100) != 0) || ((pomGodina % 400) == 0))) // prestupna godina
                {
                    danaUmjesecu[1] = 29; // koriguj broj dana za februar
                }

                // provjera unosa dana po mjesecu ...
                char[] danRodjenja = jmbgUnos.ToCharArray(0, 2);
                int pomDan = 10 * (Convert.ToInt32(danRodjenja[0] - '0')) +
                                   Convert.ToInt32(danRodjenja[1] - '0');

                if (pomDan > danaUmjesecu[pomMjesec - 1] || pomDan < 1)
                {
                    MessageBox.Show("Pogresno unesen dan rodjenja (prva i druga cifra) !!!");
                    return false;
                }

                int zbir = 0;

                // formula za racunanje kontrolnog zbira ...
                for (int i = 0; i < 6; i++)
                    zbir += (7 - i) * (Convert.ToInt32(niz[i] - '0') + Convert.ToInt32(niz[6 + i] - '0'));
                int ostatak = zbir % 11; // ostatak dijeljenja zbira sa 11
                int razlika = 11 - ostatak; // razlika

                // kontrola 
                if (ostatak == 1)// ako je ostatak 1, JMBG je POGRESAN !
                {
                    MessageBox.Show("Unijeti maticni broj NIJE ispravan ! (Ostatak=1)");
                    return false;
                }
                else if (ostatak == 0) // ako je Ostatak=0, i kontrolna cifra=0, JMBG je ispravan
                {
                    if (Convert.ToInt32(niz[12] - '0').Equals(0))
                    {
                        MessageBox.Show("Unijeti maticni broj je ISPRAVAN !(ostatak=0,kontrolna cifra=0)");
                        return true;
                    }
                    else
                    {
                        MessageBox.Show("Unijeti maticni broj NIJE ispravan !(ostatak=0,kontrolna cifra!=0)");
                        return false;
                    }
                }
                else if (razlika == (niz[12] - '0'))
                {
                    MessageBox.Show("Unijeti maticni broj je ISPRAVAN !(razlika=kontrolna cifra)");
                    return true;
                }
                else
                {
                    MessageBox.Show("Unijeti maticni broj NIJE ispravan !(razlika!=kontrolna cifra)");
                    return false;
                }
            }
            else
            {
                MessageBox.Show("JMBG mora biti dugacak 13 karaktera!!! \r\n Unesite JMBG ponovo");
                return false;
            }
        }


[Shadowed: dodati [code] tagovi.]

[Ovu poruku je menjao Shadowed dana 24.09.2009. u 13:58 GMT+1]
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
*.ppp.panet.co.yu.



+3 Profil

icon Re: Provjera JMBG-a ...02.10.2009. u 12:58 - pre 177 meseci
Moze mala pomoc u vezi pitanja: koji format izabrati za JMBG u bazi? bigint ili string? ako je bigint, kako da rijesim problem vodece nule (oni koji su rodjeni, recimo 01.02.xxx) ...

Hvala ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.88.*

ICQ: 20785904


+4 Profil

icon Re: Provjera JMBG-a ...03.10.2009. u 13:09 - pre 177 meseci
char(13) ako ocekujes samo jugovice... varchar(50) npr, ako nisi siguran
 
Odgovor na temu

[es] :: .NET :: Provjera JMBG-a ...

[ Pregleda: 19412 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.