Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 15 odgovora
  • 21.952 pregleda

Najnovija ↓

Provjera JMBG-a ... 20.09.2009. u 23:00 · pre 208 meseci #1
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();
}
}
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 21.09.2009. u 09:12 · pre 208 meseci #2
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 :-)
Potpis
F
Re: Provjera JMBG-a ... 21.09.2009. u 09:27 · pre 208 meseci #3
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
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Provjera JMBG-a ... 21.09.2009. u 11:13 · pre 208 meseci #4
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 ...
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 21.09.2009. u 13:13 · pre 208 meseci #5
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.
Potpis
F
Re: Provjera JMBG-a ... 21.09.2009. u 13:33 · pre 208 meseci #6
OK, shvatio ...
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 21.09.2009. u 14:31 · pre 208 meseci #7
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.
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Provjera JMBG-a ... 21.09.2009. u 14:58 · pre 208 meseci #8
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...
Potpis
F
Re: Provjera JMBG-a ... 21.09.2009. u 15:26 · pre 208 meseci #9
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...
Potpis
gramatika srpskog jezika
testovi iz srpskog jezika
jezičke nedoumice
Re: Provjera JMBG-a ... 21.09.2009. u 15:31 · pre 208 meseci #10
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.
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Provjera JMBG-a ... 21.09.2009. u 17:21 · pre 208 meseci #11
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 ...
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 21.09.2009. u 20:25 · pre 208 meseci #12
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.
Potpis
gramatika srpskog jezika
testovi iz srpskog jezika
jezičke nedoumice
Re: Provjera JMBG-a ... 22.09.2009. u 21:51 · pre 208 meseci #13
Citat:
int zbir = 7 * (Convert.ToInt32(niz[0] - 0x30) + Convert.ToInt32(niz[6] - 0x30));



int zbir = 7*(niz[0]-'0') + niz[6]-'0'
Provjera JMBG-a ... 24.09.2009. u 13:42 · pre 208 meseci
izmenjeno 1 put, poslednji put Shadowed 24.09.2009. u 13:58
  1. Shadowed24.09.2009. u 13:58zapis iz teksta poruke
#14
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.]
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 02.10.2009. u 13:58 · pre 207 meseci #15
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 ...
Potpis
Programming is fun, but writing good software is hard ...
Re: Provjera JMBG-a ... 03.10.2009. u 14:09 · pre 207 meseci #16
char(13) ako ocekujes samo jugovice... varchar(50) npr, ako nisi siguran
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme