This document contains code for validating Serbian personal identification numbers (JMBG) in both C# and T-SQL.
The C# code defines a class to store validation results and a method that validates a JMBG by checking the length, format, checksum, and date of birth.
The T-SQL code contains a stored procedure that validates a JMBG by extracting the digits, calculating the checksum, validating the date of birth, and checking for duplicates. It returns the date of birth and any warning messages.
A second T-SQL stored procedure is described for ranking student candidates by calculating their total, high school, and entrance exam scores. It populates temporary tables to store candidate
This document contains code for validating Serbian personal identification numbers (JMBG) in both C# and T-SQL.
The C# code defines a class to store validation results and a method that validates a JMBG by checking the length, format, checksum, and date of birth.
The T-SQL code contains a stored procedure that validates a JMBG by extracting the digits, calculating the checksum, validating the date of birth, and checking for duplicates. It returns the date of birth and any warning messages.
A second T-SQL stored procedure is described for ranking student candidates by calculating their total, high school, and entrance exam scores. It populates temporary tables to store candidate
This document contains code for validating Serbian personal identification numbers (JMBG) in both C# and T-SQL.
The C# code defines a class to store validation results and a method that validates a JMBG by checking the length, format, checksum, and date of birth.
The T-SQL code contains a stored procedure that validates a JMBG by extracting the digits, calculating the checksum, validating the date of birth, and checking for duplicates. It returns the date of birth and any warning messages.
A second T-SQL stored procedure is described for ranking student candidates by calculating their total, high school, and entrance exam scores. It populates temporary tables to store candidate
This document contains code for validating Serbian personal identification numbers (JMBG) in both C# and T-SQL.
The C# code defines a class to store validation results and a method that validates a JMBG by checking the length, format, checksum, and date of birth.
The T-SQL code contains a stored procedure that validates a JMBG by extracting the digits, calculating the checksum, validating the date of birth, and checking for duplicates. It returns the date of birth and any warning messages.
A second T-SQL stored procedure is described for ranking student candidates by calculating their total, high school, and entrance exam scores. It populates temporary tables to store candidate
response.response.hasData = true; response.response.success = true; response.response.error = new ErrorData(); if (JMBG.Length != 13) { response.response.error.message = "JMBG mora sadrati 13 brojeva"; response.response.success = false; } else { int tmpC; for (int i = 0; i < 13; i++) { if (!int.TryParse(JMBG[i].ToString(), out tmpC)) { response.response.error.message = "JMBG mora sadrati samo brojeve"; response.response.success = false; i = 14; } } if (response.response.success) { int[] cifre = new int[13]; int ostatak = 0; DateTime dRodjenja = new DateTime(); for (int i = 0; i < 13; i++) { cifre[i] = int.Parse(JMBG[i].ToString()); } ostatak = 11 - ((7 * (cifre[0] + cifre[6]) + 6 * (cifre[1] + cifre[7]) + 5 * (cifre[2] + cifre[8]) + 4 * (cifre[3] + cifre[9]) + 3 * (cifre[4] + cifre[10]) + 2 * (cifre[5] + cifre[11])) % 11);
if (ostatak > 9) { ostatak = 0; } if (ostatak != cifre[12]) { response.response.error.message = "JMBG nije proao proveru po modulu 13"; response.response.success = false; } else { int dan = int.Parse(JMBG.Substring(0, 2)); int mesec = int.Parse(JMBG.Substring(2, 2)); int godina = int.Parse(JMBG.Substring(4, 3)); if (godina > 500) { godina += 1000; } else { godina += 2000; } try { dRodjenja = new DateTime(godina, mesec, dan); } catch { response.response.error.message = "JMBG ne sadri ispravan datum roenja"; response.response.success = false; } response.dRodjenja = dRodjenja; if (int.Parse(JMBG.Substring(9,3)) > 499) { response.pol = ''; } else { response.pol = 'M'; } } } } return response; }
JMBGInfo klasa: public class JMBGInfo { public CommandResponse response = new CommandResponse(); public char pol; public DateTime dRodjenja = new DateTime(); }
Procedura u T-SQL-u: ALTER PROCEDURE [student].[validateJMB4student] @sessionId char(36), @JMB nvarchar(13), @studentId INT = NULL
DECLARE @varUserSession INT SELECT @varUserSession = dbo.cpSession(@sessionId) if (@varUserSession = 0) begin raiserror('MSSQL >> Vrednost sessionId nije ispravna - AKCIJA SE OTKAZUJE !',16,1) ; return END
DECLARE @c1 int DECLARE @c2 int DECLARE @c3 int DECLARE @c4 int DECLARE @c5 int DECLARE @c6 int DECLARE @c7 int DECLARE @c8 int DECLARE @c9 int DECLARE @c10 int DECLARE @c11 int DECLARE @c12 int DECLARE @k int declare @res int declare @ostatak INT
begin try set @c1=substring(@JMB,1,1) set @c2=substring(@JMB,2,1) set @c3=substring(@JMB,3,1) set @c4=substring(@JMB,4,1) set @c5=substring(@JMB,5,1) set @c6=substring(@JMB,6,1) set @c7=substring(@JMB,7,1) set @c8=substring(@JMB,8,1) set @c9=substring(@JMB,9,1) set @c10=substring(@JMB,10,1) set @c11=substring(@JMB,11,1) set @c12=substring(@JMB,12,1) set @k=substring(@JMB,13,1) end try begin catch RAISERROR('JMB ne sme sadrati druge karaktere osim numerikih',16,1); return end CATCH
SET @varDan = SUBSTRING(@JMB,1,2) SET @varMesec = SUBSTRING(@JMB,3,2) SET @varGodina = CASE WHEN @c5=9 THEN '1' + SUBSTRING(@JMB,5,3) ELSE '2' + SUBSTRING(@JMB,5,3) END
BEGIN TRY SELECT @varDatum = CAST(@varGodina+@varMesec+@varDan AS DATE) END TRY BEGIN CATCH RAISERROR('JMB mora sadrati ispravan datum',16,1); return end CATCH
if(len(@JMB)<>13) begin RAISERROR('JMB mora biti dugaak 13 karaktera',16,1); return end
set @c1=7*@c1 set @c2=6*@c2 set @c3=5*@c3 set @c4=4*@c4 set @c5=3*@c5 set @c6=2*@c6 set @c7=7*@c7 set @c8=6*@c8 set @c9=5*@c9 set @c10=4*@c10 set @c11=3*@c11 set @c12=2*@c12
set @res=@c1+@c2+@c3+@c4+@c5+@c6+@c7+@c8+@c9+@c10+@c11+@c12
set @ostatak=@res % 11 set @ostatak=11-@ostatak
if(@ostatak=11) set @ostatak=0
if(@ostatak<>@k) begin RAISERROR('JMB nije proao proveru po modulu 13',16,1); return END
IF (EXISTS(SELECT * FROM student.student WHERE JMB = @JMB AND (@studentId IS NULL OR studentId <> @studentId))) BEGIN SET @varPoruka = 'Pod unetim brojem je ve upisan student ' + (SELECT TOP 1 prezime + ' ' + ime + 'sa brojem indeksa ' + indeks FROM student.student WHERE JMB = @JMB AND (@studentId IS NULL OR studentId <> @studentId)) END
INSERT INTO @result ( datumRodjenja, warning ) VALUES ( @varDatum, -- datumRodjenja - date @varPoruka -- warning - varchar(max) ) SELECT CONVERT(VARCHAR, datumRodjenja) AS datumRodjenja, warning FROM @result
END
Procedura za rangiranje studenata (tu je i izraunavanje broja bodova iz srednje kole i na prijemnom): USE [medicina] GO /****** Object: StoredProcedure [student].[generateRangListaKandidat] Script Date: 22.08.2014 9:34:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROCEDURE [student].[generateRangListaKandidat] -- Add the parameters for the stored procedure here @sessionId CHAR(36), @upisniRok2skolskaGodinaId INT, @studijskiProgramId INT = NULL AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;
DECLARE @varUserSession INT DECLARE @curKandidatId INT DECLARE @curIme VARCHAR(50) DECLARE @curPrezime VARCHAR(50) DECLARE @curImeRoditelja VARCHAR(50) DECLARE @curJmbg CHAR(13) DECLARE @curSifra VARCHAR(30) DECLARE @curStudijskiProgramId INT DECLARE @curStudijskiProgramNaziv VARCHAR(50) DECLARE @varUspehUkupno DECIMAL(5,2) DECLARE @varUspehSrednjaSkola DECIMAL(4,2) DECLARE @varUspehPrijemni DECIMAL(4,2) DECLARE @varZadovoljenPrijemni BIT DECLARE @varStatusKandidata TINYINT DECLARE @curStudijskiProgram4rangiranjeId INT DECLARE @curMestaBudzet TINYINT DECLARE @curMestaSamofinansiranje TINYINT DECLARE @curOdustao BIT DECLARE @varPredmet1 VARCHAR(150) DECLARE @varPredmet2 VARCHAR(150) DECLARE @varPredmet1Bodovi DECIMAL(5,2) DECLARE @varPredmet2Bodovi DECIMAL(5,2) DECLARE @i INT = 0 DECLARE @tmpId INT DECLARE @tmpBodovi DECIMAL(5,2) DECLARE @tmpPrijemni DECIMAL(5,2)
SELECT @varUserSession = dbo.cpSession(@sessionId) IF (@varUserSession = 0) BEGIN RAISERROR('MSSQL >> Vrednost sessionId nije ispravna - AKCIJA SE OTKAZUJE !',16,1); RETURN END
DECLARE curKandidatRangListaI CURSOR FAST_FORWARD FOR SELECT k.kandidatId ,k.ime ,k.prezime ,k.imeRoditelja ,k.jmbg ,k.sifra ,k.studijskiProgramId ,sp.naziv AS nazivStudijskogPrograma ,k.odustao FROM student.kandidat AS k LEFT OUTER JOIN student.studijskiProgram AS sp ON k.studijskiProgramId = sp.studijskiProgramId WHERE k.upisniRok2skolskaGodinaId = @upisniRok2skolskaGodinaId AND (@studijskiProgramId IS NULL OR k.studijskiProgramId = @studijskiProgramId) --AND k.odustao = 0 ORDER BY k.studijskiProgramId
OPEN curKandidatRangListaI
FETCH NEXT FROM curKandidatRangListaI INTO @curKandidatId
,@curIme
,@curPrezime
,@curImeRoditelja
,@curJmbg
,@curSifra
,@curStudijskiProgramId
,@curStudijskiProgramNaziv
,@curOdustao
WHILE @@FETCH_STATUS = 0 BEGIN -- svaki put se bodovi za predmet1 i predmet2 postavljaju na 0 SELECT @varPredmet1 = 0, @varPredmet2 = 0, @varPredmet1Bodovi = 0, @varPredmet2Bodovi = 0
-- uspeh koji je kandidat osvojio u srednjoj skoli SELECT @varUspehSrednjaSkola = (student.kandidat.prosekI + student.kandidat.prosekII + student.kandidat.prosekIII + student.kandidat.prosekIV) * 2 FROM student.kandidat WHERE student.kandidat.kandidatId = @curKandidatId
-- uspeh koji je kandidat osvojio na prijemnom SELECT @varUspehPrijemni = SUM(student.kandidat2predmet4prijemni.rezultat) FROM student.kandidat2predmet4prijemni WHERE student.kandidat2predmet4prijemni.kandidatId = @curKandidatId IF(@varUspehPrijemni IS NULL) SELECT @varUspehPrijemni = 0
-- ukupno bodova SET @varUspehUkupno = @varUspehPrijemni + @varUspehSrednjaSkola
--provera da li je kandidat osvojio minimalno bodova na prijemnom iz svakog predmeta IF EXISTS(SELECT * FROM student.kandidat2predmet4prijemni AS k2p2p LEFT OUTER JOIN student.predmet4prijemni AS p4p ON k2p2p.predmet4prijemniId = p4p.predmet4prijemniId WHERE k2p2p.rezultat < p4p.prag AND k2p2p.kandidatId = @curKandidatId) BEGIN SET @varZadovoljenPrijemni = 0 END ELSE BEGIN SET @varZadovoljenPrijemni = 1 END
-- na osnovu toga da li je kandidat presao prag za polaganje prijemnog postavlja se status kandidata. 1-budzet, -- 2-samofinansiranje, 3-van kvote, 4-nije polozio prijemni, 5-nije pristupio ispitu IF(@curOdustao = 1) BEGIN SET @varStatusKandidata = 5 END ELSE IF(@varZadovoljenPrijemni = 0 OR @varUspehPrijemni = 0) BEGIN SET @varStatusKandidata = 4 END ELSE BEGIN SET @varStatusKandidata = 2 END
-- podaci o predmetima sa primenog SELECT @varPredmet1 = p4p.naziv + ':' + CONVERT(VARCHAR(15), k2p4p.rezultat) ,@varPredmet1Bodovi = rezultat FROM student.kandidat2predmet4prijemni AS k2p4p LEFT OUTER JOIN student.predmet4prijemni AS p4p ON k2p4p.predmet4prijemniId = p4p.predmet4prijemniId LEFT OUTER JOIN student.predmet4prijemni2studijskiProgram AS p4p2sp ON p4p.predmet4prijemniId = p4p2sp.predmet4prijemniId LEFT OUTER JOIN student.studijskiProgram2upisniRok AS sp2ur ON p4p2sp.studijskiProgram2upisniRokId = sp2ur.studijskiProgram2upisniRokId WHERE k2p4p.kandidatId = @curKandidatId AND rbr = 1 AND studijskiProgramId = @curStudijskiProgramId --ORDER BY k2p4p.kandidat2predmet4prijemniId ASC
SELECT @varPredmet2 = p4p.naziv + ':' + CONVERT(VARCHAR(15), k2p4p.rezultat) ,@varPredmet2Bodovi = rezultat FROM student.kandidat2predmet4prijemni AS k2p4p LEFT OUTER JOIN student.predmet4prijemni AS p4p ON k2p4p.predmet4prijemniId = p4p.predmet4prijemniId LEFT OUTER JOIN student.predmet4prijemni2studijskiProgram AS p4p2sp ON p4p.predmet4prijemniId = p4p2sp.predmet4prijemniId LEFT OUTER JOIN student.studijskiProgram2upisniRok AS sp2ur ON p4p2sp.studijskiProgram2upisniRokId = sp2ur.studijskiProgram2upisniRokId WHERE k2p4p.kandidatId = @curKandidatId AND rbr = 2 AND studijskiProgramId = @curStudijskiProgramId --ORDER BY k2p4p.kandidat2predmet4prijemniId DESC
-- prebacivanje na budzet kandidata DECLARE curStudijskiProgram CURSOR FAST_FORWARD FOR SELECT student.studijskiProgram2upisniRok.studijskiProgramId ,student.studijskiProgram2upisniRok.mestaBudzet ,student.studijskiProgram2upisniRok.mestaSamofinansiranje FROM student.studijskiProgram2upisniRok
OPEN curStudijskiProgram
FETCH NEXT FROM curStudijskiProgram INTO @curStudijskiProgram4rangiranjeId
,@curMestaBudzet
,@curMestaSamofinansiranje
WHILE @@FETCH_STATUS = 0 BEGIN
SELECT @tmpBodovi = 0, @tmpPrijemni = 0
-- status kandidata se prebacuje na budzet (1) za sve studente koji se uklapaju u kvotu UPDATE TOP(@curMestaBudzet) @orderedList SET statusKandidata = 1 WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 2
-- selektujemo najmanji broj bodova na budzetu kako bismo proverili da li ima jos kandidata sa tim brojem bodova SELECT TOP 1 @tmpBodovi = uspehUkupno, @tmpPrijemni = uspehPrijemni FROM @orderedList WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 1 ORDER BY uspehUkupno DESC, uspehPrijemni DESC
-- sve kandidate koji imaju isti broj bodova kao poslednji na listi na budzetu prebacujemo na budzet UPDATE @orderedList SET statusKandidata = 1 WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 2 AND uspehUkupno = @tmpBodovi AND uspehPrijemni >= @tmpPrijemni
-- status kandidata se prebacuje na ispod crte (3) za sve studente koji se ne uklapaju u kvotu UPDATE @orderedList SET statusKandidata = 3 WHERE kandidatId NOT IN (SELECT TOP(@curMestaSamofinansiranje) kandidatId FROM @orderedList WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 2) AND studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 2
-- selektujemo najmanji broj bodova na samofinansiranju kako bismo proverili da li ima jos kandidata sa tim brojem bodova SELECT TOP 1 @tmpBodovi = uspehUkupno, @tmpPrijemni = uspehPrijemni FROM @orderedList WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 2 ORDER BY uspehUkupno DESC, uspehPrijemni DESC
-- sve kandidate koji imaju isti broj bodova kao poslednji na listi na samofinansiranju prebacujemo na samofinansiranje UPDATE @orderedList SET statusKandidata = 2 WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND statusKandidata = 3 AND uspehUkupno = @tmpBodovi AND uspehPrijemni >= @tmpPrijemni
FETCH NEXT FROM curStudijskiProgram INTO @curStudijskiProgram4rangiranjeId
,@curMestaBudzet
,@curMestaSamofinansiranje
END
CLOSE curStudijskiProgram DEALLOCATE curStudijskiProgram
END TRY BEGIN CATCH
DECLARE @error VARCHAR(MAX) SET @error = ERROR_MESSAGE()
SELECT ROW_NUMBER() OVER (PARTITION BY [@orderedList].studijskiProgramId ORDER BY [@orderedList].studijskiProgramId) AS redniBroj ,[@orderedList].kandidatId ,[@orderedList].ime ,[@orderedList].prezime ,[@orderedList].imeRoditelja ,[@orderedList].jmbg ,[@orderedList].sifra ,[@orderedList].studijskiProgramId ,[@orderedList].nazivStudijskogPrograma ,[@orderedList].uspehSrednjaSkola ,[@orderedList].uspehPrijemni ,[@orderedList].uspehUkupno ,[@orderedList].zadovoljenPrijemni ,[@orderedList].statusKandidata ,[@orderedList].punNaziv ,[@orderedList].predmet1 ,[@orderedList].predmet2 ,[@orderedList].predmet1Bodovi ,[@orderedList].predmet2Bodovi ,[@orderedList].odustao FROM @orderedList END