Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
UNIVERZITET U NOVOM SADUTEHNIČKI FAKULTET „MIHAJLO PUPIN”
ZRENJANIN
SEMINARSKI RADIz predmeta: Distribuirani informacioni sistemiTema: Veb aplikacija za Kadrovsku evidenciju
Profesor: Student:Doc. dr Ljubica Kazi Jelena Adamov MIT 22/19
Zrenjanin, 2020.
Sadržaj1. Opis poslovnog procesa.................................................................................................22. UML modeli u okviru dizajna sistema..........................................................................3
2.1 Use case dijagram....................................................................................................32.2 Dijagram komonenti................................................................................................32.3 Dijagram razmeštaja................................................................................................4
3. Korisničko uputstvo.......................................................................................................54. Implementacija..............................................................................................................7
4. 1 Opis primenjene tehnologije i alata........................................................................74. 2 Karakteristični delovi programskog koda sa objašnjenjima...................................7
4. 2. 1 Prvi deo – Distribucija podataka....................................................................74. 2. 2 Drugi deo – Distribucija procesiranja...........................................................15
5. Zaključak.....................................................................................................................206. Literatura.....................................................................................................................21
1
1. Opis poslovnog procesa
U ovom radu prikazan je razvoj veb aplikacije za praktičnu evidenciju zaposlenih – Kadrovska evidencija. Ova aplikacija nam omogućava evidentiranje podataka o svakom zaposlenom, kao što su: lični podaci (JMBG, prezime, ime, broj lične karte, telefon), podaci o obrazovanju (stepen stručne spreme i završena škola), radno mesto, kao i podaci o stanovanju (opština stanovanja, mesto i adresa). Ove podatke moguće je unositi, tabelarno prikazivati i raditi proveru vertikalno i horizontalno particionisanih baza podataka u kojima su isti smešteni.
2
2. UML modeli u okviru dizajna sistema
2.1 Use case dijagram
Use case dijagram (dijagram slučajeva korišćenja) prikazuje skup slučajeva korišćenja i aktera. Koristi se da specificira neku funkcionalnost i ponašanje nekog subjekta. On vizualizuje ponašanje sistema. Služi korisniku da razume šta sistem radi, a verifikatoru da proveri funkcionisanje. [1]
Slika 1. Use Case dijagram
2.2 Dijagram komonenti
Komponenta je zamenljivi deo sistema. Dijagram komponenti prikazuje organizaciju i zavisnosti između komponenata. Namenjen je prikazu strukturne relacije između softverskih komponenti sistema. On ilustruje delove softvera, ugrađene kontrolere i slično, i ima veći stepen apstrakcije od dijagrama klasa. [1]
3
Slika 2. Dijagram komponenti
2.3 Dijagram razmeštaja
Dijagram razmeštaja prikazuje statički pogled run-time hardverske konfiguracije i softverskih komponenti koje se izvršavaju na tim čvorovima. Dijagram razmeštaja prikazuje hardver sistema, softver koji je instaliran na tom sistemu i srednji sloj koji se koristi za povezivanje međusobno razdvojenih mašina. [1]
Slika 3. Dijagram razmeštaja
4
3. Korisničko uputstvo
Nakon pokretanja veb aplikacije Kadrovska evidencija, pojavljuje se sledeći ekran:
Slika 4. Početna strana aplikacije
Aplikacija omogućava unos podataka o novom zaposlenom. Na sledećoj slici prikazana je stranica za unos:
Slika 5. Unos podataka
Nakon toga, podatke je moguće pregledati tabelarno i izvršiti proveru istih, kako bi se utvrdilo da li su podaci usaglašeni u horizontalno particionisanim i u vertikalno
5
particionisanim bazama podataka. Ukoliko to nije slučaj, dobićemo izveštaj sličan ovom:
Slika 6. Provera usklađenosti baza podataka
Ukoliko je došlo do neke greške, vrši se oporavak baza. Nakon toga, na stranici za proveru podataka dobijamo izveštaj da su sve baze usaglašene:
Slika 7. Izveštaj nakon oporavka baza podataka
6
4. Implementacija
4. 1 Opis primenjene tehnologije i alata
U ovom seminarskom radu korišćen je Visual Studio .NET 2010 i Microsoft SQL Server 2008 R2. U okviru realizacije programskog koda:
- Korisnički interfejs predstavljaju ASPX Web forme,- Klase za rad sa podacima sa korisničkog interfejsa i baze podataka su iz
standardnog paketa klasa za rad sa SQL serverom (SQLClient),- KlasePodataka, PrezentacionLogika su sopstvene klase,- WebServis služi za podršku interfejsu putem web protokola.
4. 2 Karakteristični delovi programskog koda sa objašnjenjima
4. 2. 1 Prvi deo – Distribucija podataka
Kreirana je osnovna baza podataka, a po ugledu na nju horizontalno particionisane baze, kao i vertikalno particionisane baze podataka. Imamo dve horizontalno particionisane baze - zaposleni sa visokom stručnom spremom, odnosno srednjom stručnom spremom. Kod vertikalno particionisanih baza podataka imamo četiri baze – lični podaci, obrazovanje, radno mesto i stanovanje zaposlenog. Kreiran je i katalog, koji predstavlja bazu podataka i sadrži podatke o baznim relacijama. [2]
U Visual Studio-u su kreirane klase clsZaposleni i clsZaposleniSaTimeStamp, i forme za unos podataka, tabelarni prikaz, i proveru i oporavak baza podataka. Najvažniji delovi koda programskog rešenja dati su u listingu ispod.
Unos podataka// metoda sa preuzimanje podataka sa korisničkog interfejsaprivate clsZaposleni PreuzimiPodatkeSaKI() { clsZaposleni objZaposleni = new clsZaposleni(); // preuzimanje vrednosti sa korisnickog interfejsa // u atribute objekta klase objZaposleni.JMBG = txbJMBG.Text; objZaposleni.Prezime = txbPrezime.Text; objZaposleni.Ime = txbIme.Text; objZaposleni.BrojLicneKarte = txbBrojLicneKarte.Text; objZaposleni.Telefon = txbTelefon.Text; objZaposleni.OpstinaStanovanja = txbOpstinaStanovanja.Text; objZaposleni.MestoStanovanja = txbMestoStanovanja.Text; objZaposleni.AdresaStanovanja = txbAdresaStanovanja.Text; objZaposleni.ZavrsenaSkola = txbZavrsenaSkola.Text; objZaposleni.RadnoMesto = ddlRadnoMesto.Text;
// za bool bool StrucnaSprema = cbStrucnaSprema.Checked; if (StrucnaSprema) { objZaposleni.StrucnaSprema = "1"; } else { objZaposleni.StrucnaSprema = "0"; }
return objZaposleni; }
// metoda za formiranje upita za unos u baze podataka
7
private string FormirajUpit(string ModalitetRada, clsZaposleni objZaposleni, Int64 intVrednostTimeStamp) { string Upit = "";
switch (ModalitetRada) { case "osnovna": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.Prezime + "','" + objZaposleni.Ime + "','" + objZaposleni.BrojLicneKarte + "','" + objZaposleni.Telefon + "'," + objZaposleni.OpstinaStanovanja + ", '" + objZaposleni.MestoStanovanja + "'," + objZaposleni.AdresaStanovanja + ",'" + objZaposleni.StrucnaSprema + "','" + objZaposleni.ZavrsenaSkola + "'," + objZaposleni.RadnoMesto + "',DEFAULT)"; break; case "horizontalna": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.Prezime + "','" + objZaposleni.Ime + "','" + objZaposleni.BrojLicneKarte + "','" + objZaposleni.Telefon + "'," + objZaposleni.OpstinaStanovanja + ", '" + objZaposleni.MestoStanovanja + "'," + objZaposleni.AdresaStanovanja + ",'" + objZaposleni.StrucnaSprema + "','" + objZaposleni.ZavrsenaSkola + "'," + objZaposleni.RadnoMesto + "'," + intVrednostTimeStamp.ToString() + ")"; break; case "licni": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.Prezime + "','" + objZaposleni.Ime + "','" + objZaposleni.BrojLicneKarte + "','" + objZaposleni.Telefon + "'," + intVrednostTimeStamp.ToString() + ")"; break; case "obrazovanje": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.StrucnaSprema + "','" + objZaposleni.ZavrsenaSkola + "," + intVrednostTimeStamp.ToString() + ")"; break; case "radno": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.RadnoMesto + "'," + intVrednostTimeStamp.ToString() + ")"; break; case "stanovanje": Upit = "INSERT INTO Zaposleni VALUES (" + objZaposleni.JMBG + ", '" + objZaposleni.OpstinaStanovanja + ", '" + objZaposleni.MestoStanovanja + "'," + objZaposleni.AdresaStanovanja + "'," + intVrednostTimeStamp.ToString() + ")"; break; }
return Upit; }
// metoda za upis podatakaprivate string IzvrsiUpisPodataka(string NazivStringaKonekcijeIzWebConfig, string ModalitetRada, clsZaposleni objZaposleni, Int64 noviIntTimeStamp) { string PorukaUspehaSnimanja = ""; // konektovanje na bp objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcijeIzWebConfig].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// izvrsavanje upita objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = this.FormirajUpit(ModalitetRada, objZaposleni, noviIntTimeStamp); bool UspehAzuriranja = objTabela.IzvrsiAzuriranje(SQLUpit);
PorukaUspehaSnimanja = SQLUpit; if (UspehAzuriranja) { PorukaUspehaSnimanja = PorukaUspehaSnimanja + "USPESNO SNIMANJE NOVIH PODATAKA!"; } else { PorukaUspehaSnimanja = PorukaUspehaSnimanja + "Greska!"; } // uspeh
8
return PorukaUspehaSnimanja; }
Tabelarni prikaz podataka// metoda za učitavanje katalogaprivate DataSet UcitajKatalog(string PutanjaXML) { DataSet dsKatalog = new DataSet(); dsKatalog.ReadXml(PutanjaXML); return dsKatalog; }
// metoda za učitavanje podataka iz baze podatakaprivate DataSet UcitajSve(string NazivStringaKonekcije) { DataSet dsPodaci = new DataSet();
// konekcija na bazu clsSqlKonekcija objKonekcija; objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// preuzimanje podataka clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = "select * from Zaposleni"; dsPodaci = objTabela.DajPodatke(SQLUpit);
return dsPodaci; }
// metoda za pripremu podataka za prikaz u grid-uprivate DataSet PripremiPodatkeZaPrikaz(DataSet dsKatalog) { DataSet dsObjedinjeniPodaci = new DataSet(); DataRow[] drFullBP = dsKatalog.Tables[0].Select("ModalitetRada='horizontalna'"); foreach (DataRow dr in drFullBP) { if (!dr.ItemArray[0].ToString().Equals("OSNOVNA")) { //za svaki bazu iz filtriranog kataloga ucitati podatke u ds string NazivStringaKonekcijeIzKataloga = dr.ItemArray[1].ToString(); DataSet dsPodaciBazePod = UcitajSve(NazivStringaKonekcijeIzKataloga); // spojiti dobijen ds sa centralnim ds dsObjedinjeniPodaci = SpojPodatke(dsPodaciBazePod, dsObjedinjeniPodaci); } } return dsObjedinjeniPodaci; }
Provera podataka// metoda za dobijanje ukupnog broja zaposlenihprivate int DajUkupanBrojZaposlenih(string NazivStringaKonekcije) { DataSet dsPodaci = new DataSet(); int brojZaposlenih = 0;
// konekcija na bazu clsSqlKonekcija objKonekcija; objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// preuzimanje podataka
9
clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = "select count (JMBG) as ukupnoZaposlenih from Zaposleni"; dsPodaci = objTabela.DajPodatke(SQLUpit);
try { brojZaposlenih = int.Parse(dsPodaci.Tables[0].Rows[0].ItemArray[0].ToString()); } catch (Exception greska) { brojZaposlenih = 0; }
return brojZaposlenih; }
// metoda za dobijanje broja zaposlenih prema stručnoj spremiprivate int DajUkupanBrojZaposlenihPremaSS(string NazivStringaKonekcije, bool ZaposleniSSS) { DataSet dsPodaci = new DataSet(); int brojZaposlenih = 0;
// konekcija na bazu clsSqlKonekcija objKonekcija; objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// preuzimanje podataka clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = ""; if (ZaposleniSSS) { SQLUpit = "select count (JMBG) as ukupnoZaposlenih from Zaposleni where StrucnaSprema=0"; } else //VSS { SQLUpit = "select count (JMBG) as ukupnoZaposlenih from Zaposleni where StrucnaSprema=1"; } dsPodaci = objTabela.DajPodatke(SQLUpit);
try { brojZaposlenih = int.Parse(dsPodaci.Tables[0].Rows[0].ItemArray[0].ToString()); } catch (Exception greska) { brojZaposlenih = 0; }
return brojZaposlenih; }
// formiranje liste zaposlenihprivate List<clsZaposleniSaTimeStamp> DajListuObjekataZaposleni(DataSet dsPodaciZaListu) { // promenljive clsZaposleniSaTimeStamp objZaposleniSaTimeStamp; List<clsZaposleniSaTimeStamp> objListaObjekataZaposlenih = new List<clsZaposleniSaTimeStamp>(); int ukupnoZapisaZaListu = dsPodaciZaListu.Tables[0].Rows.Count; string strStrucnaSprema = "";
for (int brojacZapisa = 0; brojacZapisa < ukupnoZapisaZaListu; brojacZapisa++) { // priprema elementa liste
10
objZaposleniSaTimeStamp = new clsZaposleniSaTimeStamp(); objZaposleniSaTimeStamp.JMBG = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[0].ToString(); objZaposleniSaTimeStamp.Prezime = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[1].ToString(); objZaposleniSaTimeStamp.Ime = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[2].ToString(); objZaposleniSaTimeStamp.BrojLicneKarte = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[3].ToString(); objZaposleniSaTimeStamp.Telefon = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[4].ToString(); objZaposleniSaTimeStamp.OpstinaStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[5].ToString(); objZaposleniSaTimeStamp.MestoStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[6].ToString(); objZaposleniSaTimeStamp.AdresaStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[7].ToString();
if ((dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[8].ToString().Equals("true")) || (dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[8].ToString().Equals("1"))) { strStrucnaSprema = "1"; } else { strStrucnaSprema = "0"; } objZaposleniSaTimeStamp.StrucnaSprema = strStrucnaSprema;
objZaposleniSaTimeStamp.ZavrsenaSkola = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[9].ToString(); objZaposleniSaTimeStamp.RadnoMesto = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[10].ToString(); objZaposleniSaTimeStamp.IntTimeStamp = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[11].ToString(); // dodavanje elemenat na listu objListaObjekataZaposlenih.Add(objZaposleniSaTimeStamp); }
return objListaObjekataZaposlenih; }
// unos nedostajućih podataka u baze podataka (ukoliko postoji)private string UpisiUBazuPodatakaNedostajuceZapise(string NazivStringaKonekcije, List<string> lstStringoviUpita) { //zajednicke promenljive string porukaUspehaSnimanja = ""; bool UspehAzuriranja = false;
// konekcija na bazu podataka clsSqlKonekcija objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// izvrsavanje upita clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni");
try { UspehAzuriranja = objTabela.IzvrsiAzuriranje(lstStringoviUpita); if (UspehAzuriranja) { porukaUspehaSnimanja = "Uspeh snimanja! Snimljeno ukupno:" + lstStringoviUpita.Count.ToString() + " zapisa!"; } else { porukaUspehaSnimanja = "Neuspeh snimanja!"; } } catch (Exception greska)
11
{ porukaUspehaSnimanja = "Greska:" + greska.Message; }
return porukaUspehaSnimanja; }
// provera usklađenosti svih bazaprotected void btnProveriUskladjenostPodataka_Click(object sender, EventArgs e) { // zajednicke promenljive DataSet dsZapisiOsnovneNakonTimeStampa = new DataSet(); List<string> lstStringoviUpita = new List<string>(); string strModalitetRadaSaBP = ""; string IzvestajODodavanjuZapisa = ""; string tekstIzvestajaStatusaBP=""; string dodatniTekst = ""; List<clsZaposleniSaTimeStamp> lstListaObjekataZaposleniSaTimeStamp = new List<clsZaposleniSaTimeStamp>();
// 1. prebrojavanje broja zapisa za centralnu bazu podataka int ukupnoOsnovna = DajUkupanBrojZaposlenih("KonekcijaZaposleniOsnovna"); txbIzvestaj.Text = "Osnovna baza podataka - broj zapisa:" + ukupnoOsnovna.ToString() + System.Environment.NewLine; // izdvajanje poslednje time stamp vrednosti, radi uporedjivanja sta nedostaje Int64 poslednjiTimeStampOsnovna = DajPoslednjiTimeStamp("KonekcijaZaposleniOsnovna", true);
txbIzvestaj.Text = txbIzvestaj.Text + " " + System.Environment.NewLine; // 2. PROVERA ZA VERTIKALNO PARTICIONISANE BAZE PODATAKA txbIzvestaj.Text = txbIzvestaj.Text + "PROVERA VERTIKALNO PARTICIONISANIH BAZA PODATAKA"; txbIzvestaj.Text = txbIzvestaj.Text + " " + System.Environment.NewLine;
int ukupnoVertikalna = 0; string statusUskladjenostiVertikalna = ""; Int64 poslednjiTimeStampVertikalna = 0;
DataRow[] drVertikalneBP = dsKatalog.Tables[0].Select("ModalitetRada<>'horizontalna'"); foreach (DataRow dr in drVertikalneBP) { strModalitetRadaSaBP=dr.ItemArray[2].ToString(); if (!strModalitetRadaSaBP.Equals("osnovna")) { //za svaki bazu iz filtriranog kataloga ucitati podatke u ds string NazivStringaKonekcijeIzKataloga = dr.ItemArray[1].ToString(); ukupnoVertikalna = DajUkupanBrojZaposlenih(NazivStringaKonekcijeIzKataloga); if (ukupnoOsnovna == ukupnoVertikalna) { statusUskladjenostiVertikalna = "Ima sve zapise!"; tekstIzvestajaStatusaBP =txbIzvestaj.Text + " BP:" + NazivStringaKonekcijeIzKataloga + " - broj zapisa:" + ukupnoVertikalna.ToString() + " =" + statusUskladjenostiVertikalna + System.Environment.NewLine; } else { statusUskladjenostiVertikalna = "Nema sve zapise!"; // izdvajanje poslednje time stamp vrednosti poslednjiTimeStampVertikalna = DajPoslednjiTimeStamp(NazivStringaKonekcijeIzKataloga, false);
// izdvajanje koji zapisi nedostaju u odnosu na time stamp dsZapisiOsnovneNakonTimeStampa = DajZapiseOsnovneBazePodatakaNakonTimeStampa("KonekcijaZaposleniOsnovna", poslednjiTimeStampVertikalna);
// prebacujemo sadrzaj data seta u listu objekata klase clsZaposleniSaTimeStamp lstListaObjekataZaposleniSaTimeStamp =
12
DajListuObjekataZaposleni(dsZapisiOsnovneNakonTimeStampa);
// formiranje niza stringova sa insert into sa nedostajucim lstStringoviUpita = DajListuStringovaUpita(strModalitetRadaSaBP, lstListaObjekataZaposleniSaTimeStamp);
// poziv objTabela.IzvrsiAzuriranje (lista stringova insert into upita) koji radi sa transakcijom IzvestajODodavanjuZapisa = UpisiUBazuPodatakaNedostajuceZapise(NazivStringaKonekcijeIzKataloga, lstStringoviUpita);
// IZVESTAJ O URADJENOM: dodatniTekst = "Broj nedostajucih zapisa:" + dsZapisiOsnovneNakonTimeStampa.Tables[0].Rows.Count.ToString() + " Izvestaj dodavanje:" + IzvestajODodavanjuZapisa; tekstIzvestajaStatusaBP =txbIzvestaj.Text + " BP:" + NazivStringaKonekcijeIzKataloga + " - broj zapisa:" + ukupnoVertikalna.ToString() + " =" + statusUskladjenostiVertikalna + dodatniTekst + System.Environment.NewLine; } txbIzvestaj.Text = tekstIzvestajaStatusaBP; } }
// PROVERA ZA HORIZONTALNO PARTICIONISANE BAZE PODATAKA txbIzvestaj.Text = txbIzvestaj.Text + " " + System.Environment.NewLine; txbIzvestaj.Text = txbIzvestaj.Text + "PROVERA HORIZONTALNO PARTICIONISANIH BAZA PODATAKA"; txbIzvestaj.Text = txbIzvestaj.Text + " " + System.Environment.NewLine;
// ******************* osnovna int ukupnoZaposlenihSSS = DajUkupanBrojZaposlenihPremaSS("KonekcijaZaposleniOsnovna", true); txbIzvestaj.Text = txbIzvestaj.Text + " " + "Osnovna baza podataka - broj zaposlenih SSS:" + ukupnoZaposlenihSSS.ToString() + System.Environment.NewLine; int ukupnoZaposlenihVSS = DajUkupanBrojZaposlenihPremaSS("KonekcijaZaposleniOsnovna", false); txbIzvestaj.Text = txbIzvestaj.Text + " " + "Osnovna baza podataka - broj zaposlenih VSS:" + ukupnoZaposlenihVSS.ToString() + System.Environment.NewLine;
// ******************* horizontalno particionisane strModalitetRadaSaBP = "horizontalna"; // vazi za sve horizontalne (SSS i VSS)
// ******************** SSS int ukupnoZaposlenihUSSSBP = DajUkupanBrojZaposlenih("KonekcijaZaposleniSSS"); string statusUskladjenostiSSS = ""; Int64 poslednjiTimeStampSSS = 0;
// if (ukupnoZaposlenihSSS == ukupnoZaposlenihUSSSBP) { statusUskladjenostiSSS = "Ima sve zapise!"; tekstIzvestajaStatusaBP = txbIzvestaj.Text + " BP:" + "KonekcijaZaposleniSSS" + " - broj zapisa:" + ukupnoZaposlenihSSS.ToString() + " =" + statusUskladjenostiSSS + System.Environment.NewLine;
} else { statusUskladjenostiSSS = "Nema sve zapise!"; // izdvajanje poslednje time stamp vrednosti poslednjiTimeStampSSS = DajPoslednjiTimeStamp("KonekcijaZaposleniSSS", false);
// izdvajanje koji zapisi nedostaju u odnosu na time stamp dsZapisiOsnovneNakonTimeStampa = DajZapiseOsnovneBazePodatakaNakonTimeStampa("KonekcijaZaposleniOsnovna", poslednjiTimeStampSSS);
// prebacujemo sadrzaj data seta u listu objekata klase clsZaposleniSaTimeStamp lstListaObjekataZaposleniSaTimeStamp =
13
DajListuObjekataZaposleni(dsZapisiOsnovneNakonTimeStampa);
// formiranje niza stringova sa insert into sa nedostajucim lstStringoviUpita = DajListuStringovaUpita(strModalitetRadaSaBP, lstListaObjekataZaposleniSaTimeStamp);
// poziv objTabela.IzvrsiAzuriranje (lista stringova insert into upita) koji radi sa transakcijom IzvestajODodavanjuZapisa = UpisiUBazuPodatakaNedostajuceZapise("KonekcijaZaposleniSSS", lstStringoviUpita);
// IZVESTAJ O URADJENOM: dodatniTekst = "Broj nedostajucih zapisa:" + dsZapisiOsnovneNakonTimeStampa.Tables[0].Rows.Count.ToString() + " Izvestaj dodavanje:" + IzvestajODodavanjuZapisa; tekstIzvestajaStatusaBP = txbIzvestaj.Text + " BP:" + "KonekcijaZaposleniSSS" + " - broj zapisa:" + ukupnoVertikalna.ToString() + " =" + statusUskladjenostiSSS + dodatniTekst + System.Environment.NewLine; } txbIzvestaj.Text = tekstIzvestajaStatusaBP;
// ************************ VSS int ukupnoZaposlenihUVSSBP = DajUkupanBrojZaposlenih("KonekcijaZaposleniVSS"); string statusUskladjenostiVSS = ""; Int64 poslednjiTimeStampVSS = 0;
// if (ukupnoZaposlenihVSS == ukupnoZaposlenihUVSSBP) { statusUskladjenostiVSS = "Ima sve zapise!"; tekstIzvestajaStatusaBP = txbIzvestaj.Text + " BP:" + "KonekcijaZaposleniVSS" + " - broj zapisa:" + ukupnoZaposlenihVSS.ToString() + " =" + statusUskladjenostiVSS + System.Environment.NewLine; } else { statusUskladjenostiVSS = "Nema sve zapise!"; // izdvajanje poslednje time stamp vrednosti poslednjiTimeStampVSS = DajPoslednjiTimeStamp("KonekcijaZaposleniVSS", false);
// izdvajanje koji zapisi nedostaju u odnosu na time stamp dsZapisiOsnovneNakonTimeStampa = DajZapiseOsnovneBazePodatakaNakonTimeStampa("KonekcijaZaposleniOsnovna", poslednjiTimeStampVSS);
// prebacujemo sadrzaj data seta u listu objekata klase clsZaposleniSaTimeStamp lstListaObjekataZaposleniSaTimeStamp = DajListuObjekataZaposleni(dsZapisiOsnovneNakonTimeStampa);
// formiranje niza stringova sa insert into sa nedostajucim lstStringoviUpita = DajListuStringovaUpita(strModalitetRadaSaBP, lstListaObjekataZaposleniSaTimeStamp);
// poziv objTabela.IzvrsiAzuriranje (lista stringova insert into upita) koji radi sa transakcijom IzvestajODodavanjuZapisa = UpisiUBazuPodatakaNedostajuceZapise("KonekcijaZaposleniVSS", lstStringoviUpita);
// IZVESTAJ O URADJENOM: dodatniTekst = "Broj nedostajucih zapisa:" + dsZapisiOsnovneNakonTimeStampa.Tables[0].Rows.Count.ToString() + " Izvestaj dodavanje:" + IzvestajODodavanjuZapisa; tekstIzvestajaStatusaBP = txbIzvestaj.Text + " BP:" + "KonekcijaZaposleniVSS" + " - broj zapisa:" + ukupnoVertikalna.ToString() + " =" + statusUskladjenostiVSS + dodatniTekst + System.Environment.NewLine;
} txbIzvestaj.Text = tekstIzvestajaStatusaBP; }
Katalog
14
// Katalog.xml<SpisakBazaPodataka> <BazaPodataka> <OpisBaze>OSNOVNA</OpisBaze> <NazivKonekcije>KonekcijaZaposleniOsnovna</NazivKonekcije> <ModalitetRada>osnovna</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Horiz-VSS Zaposleni</OpisBaze> <NazivKonekcije>KonekcijaZaposleniVSS</NazivKonekcije> <ModalitetRada>horizontalna</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Horiz-SSS Zaposleni</OpisBaze> <NazivKonekcije>KonekcijaZaposleniSSS</NazivKonekcije> <ModalitetRada>horizontalna</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Vert-Licni</OpisBaze> <NazivKonekcije>KonekcijaZaposleniLicniPodaci</NazivKonekcije> <ModalitetRada>licni</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Vert-Obrazovanje</OpisBaze> <NazivKonekcije>KonekcijaZaposleniObrazovanje</NazivKonekcije> <ModalitetRada>obrazovanje</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Vert-Radno mesto</OpisBaze> <NazivKonekcije>KonekcijaZaposleniRadnoMesto</NazivKonekcije> <ModalitetRada>radno</ModalitetRada> </BazaPodataka> <BazaPodataka> <OpisBaze>Vert-Stanovanje</OpisBaze> <NazivKonekcije>KonekcijaZaposleniStanovanje</NazivKonekcije> <ModalitetRada>stanovanje</ModalitetRada> </BazaPodataka></SpisakBazaPodataka>
Listing 1. Delovi programskog koda rešenja – distribucija podataka
4. 2. 2 Drugi deo – Distribucija procesiranja
U ovom delu seminarskog rada kreirana je veb aplikacija za Kadrovsku evidenciju primenom višeslojnosti. U okviru slojeva se nalaze:
- sloj za rad sa podacima - clsZaposleni, clsZaposleniSaTimeStamp, clsZaposleniDB, clsListaZaposleniSaTimeStamp, clsKatalog;
- sloj poslovne logike - clsPoslovnoPravilo, u okviru koje se određuje da li za određeno radno mesto ima slobodnih mesta za zapošljavanje;
- sloj servisa - čita podatke iz XML fajla o maksimalnom broju zaposlenih za svako radno mesto i koristi se u okviru poslovne logike;
- prezentacioni sloj - sastoji se iz Korisničkog interfejsa i Prezentacione logike. U okviru Korisničkog interfejsa imamo metode za prikupljanje podataka sa korisničkog interfejsa i prikaz istih. U Prezentacionoj logici najvažnije je napomenuti metode vezane za validaciju podataka.
Sloj za rad sa podacima// u okviru klasa clsZaposleni i clsZaposleniSaTimeStamp postoje set i get metode// klasa clsZaposleniDB koristi SqlDBUtils zbog realizacije osnovnih CRUD operacija // metoda za učitavanje svih zaposlenih private DataSet UcitajSve(string NazivStringaKonekcije) { DataSet dsPodaci = new DataSet();
15
// konekcija na bazu clsSqlKonekcija objKonekcija; objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// preuzimanje podataka clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = "select * from Zaposleni"; dsPodaci = objTabela.DajPodatke(SQLUpit);
return dsPodaci; }
// metoda za broj zaposlenih prema stručnoj spremi private int DajUkupanBrojZaposlenihPremaSS(string NazivStringaKonekcije, bool ZaposleniSSS) { DataSet dsPodaci = new DataSet(); int brojZaposlenih = 0;
// konekcija na bazu clsSqlKonekcija objKonekcija; objKonekcija = new clsSqlKonekcija(); objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcije].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();
// preuzimanje podataka clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Zaposleni"); string SQLUpit = ""; if (ZaposleniSSS) { SQLUpit = "select count (JMBG) as ukupnoZaposlenih from Zaposleni where StrucnaSprema=0"; } else //VSS { SQLUpit = "select count (JMBG) as ukupnoZaposlenih from Zaposleni where StrucnaSprema=1"; } dsPodaci = objTabela.DajPodatke(SQLUpit);
try { brojZaposlenih = int.Parse(dsPodaci.Tables[0].Rows[0].ItemArray[0].ToString()); } catch (Exception greska) { brojZaposlenih = 0; }
return brojZaposlenih; }
// pronalazak zaposlenog po JMBG-u public DataSet DajZaposlenogPoJMBG(int JMBG) { DataSet dsPodaci = new DataSet();
SqlConnection Veza = new SqlConnection(pStringKonekcije); Veza.Open(); SqlCommand Komanda = new SqlCommand("DajZaposlenogPoJMBG", Veza); Komanda.CommandType = CommandType.StoredProcedure; Komanda.Parameters.Add("@JMBG", SqlDbType.Int).Value = JMBG; SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = Komanda; da.Fill(dsPodaci); Veza.Close(); Veza.Dispose();
16
return dsPodaci; }
// klasa clsListaZaposleniSaTimeStamp // lista zaposlenih private List<clsZaposleniSaTimeStamp> DajListuObjekataZaposleni(DataSet dsPodaciZaListu) { // promenljive clsZaposleniSaTimeStamp objZaposleniSaTimeStamp; // samo deklarisemo, a instanciramo vise puta u for ciklusu List<clsZaposleniSaTimeStamp> objListaObjekataZaposlenih = new List<clsZaposleniSaTimeStamp>(); int ukupnoZapisaZaListu = dsPodaciZaListu.Tables[0].Rows.Count; string strStrucnaSprema = "";
for (int brojacZapisa = 0; brojacZapisa < ukupnoZapisaZaListu; brojacZapisa++) { // priprema elementa liste objZaposleniSaTimeStamp = new clsZaposleniSaTimeStamp(); objZaposleniSaTimeStamp.JMBG = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[0].ToString(); objZaposleniSaTimeStamp.Prezime = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[1].ToString(); objZaposleniSaTimeStamp.Ime = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[2].ToString(); objZaposleniSaTimeStamp.BrojLicneKarte = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[3].ToString(); objZaposleniSaTimeStamp.Telefon = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[4].ToString(); objZaposleniSaTimeStamp.OpstinaStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[5].ToString(); objZaposleniSaTimeStamp.MestoStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[6].ToString(); objZaposleniSaTimeStamp.AdresaStanovanja = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[7].ToString();
if ((dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[8].ToString().Equals("true")) || (dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[8].ToString().Equals("1"))) { strStrucnaSprema = "1"; } else { strStrucnaSprema = "0"; } objZaposleniSaTimeStamp.StrucnaSprema = strStrucnaSprema;
objZaposleniSaTimeStamp.ZavrsenaSkola = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[9].ToString(); objZaposleniSaTimeStamp.RadnoMesto = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[10].ToString(); objZaposleniSaTimeStamp.IntTimeStamp = dsPodaciZaListu.Tables[0].Rows[brojacZapisa].ItemArray[11].ToString(); // dodavanje elemenat na listu objListaObjekataZaposlenih.Add(objZaposleniSaTimeStamp); }
return objListaObjekataZaposlenih; }
Sloj poslovne logike// metoda za proveru slobodnih mesta za zapošljavanjepublic bool DaLiImaMestaZaZaposljavanje(string RadnoMestoIzBazePodataka) { // pravilo za maxBrZaposlenih bool imaMesta = false;
int UkupnoZaposlenih = 0; clsZaposleniDB objZaposleniDB = new clsZaposleniDB(pStringKonekcije);
17
UkupnoZaposlenih = objZaposleniDB.DajUkupnoZaposlenihZaRadnoMesto(RadnoMestoIzBazePodataka);
string RadnoMestoWS = ""; KadrovskiPodaci.Service1 objOgranicenja = new KadrovskiPodaci.Service1(); int MaxBrojZaposlenih = objOgranicenja.DajMaxBrojZaposlenih(RadnoMestoWS);
if (UkupnoZaposlenih < MaxBrojZaposlenih) { imaMesta = true; } else { imaMesta = false; }
return imaMesta; }
Sloj servisa// metode za iščitavanje svih ograničenja, kao i pojedinačnih za svako radno mesto[WebMethod] public DataSet DajSvaOgranjcenja() { DataSet dsOgranicenja = new DataSet(); dsOgranicenja.ReadXml(Server.MapPath("~/") + "XML/Ogranicenja.xml");
return dsOgranicenja; }
[WebMethod] public int DajMaxBrojZaposlenih(string pomRadnoMesto) { int MaxBrojZaposlenih = 0; DataSet dsOgranicenja = new DataSet(); dsOgranicenja.ReadXml(Server.MapPath("~/") + "XML/Ogranicenja.xml"); // filtriranje dataset-a DataRow[] result = dsOgranicenja.Tables[0].Select("RadnoMesto='" + pomRadnoMesto + "'"); MaxBrojZaposlenih = int.Parse(result[0].ItemArray[1].ToString());
return MaxBrojZaposlenih; }
// Ogranicenja.xml<SpisakOgranicenja> <OgranicenjeRadnogMesta> <RadnoMesto>racunovodja</RadnoMesto> <MaxBrZaposlenih>2</MaxBrZaposlenih> </OgranicenjeRadnogMesta> <OgranicenjeRadnogMesta> <RadnoMesto>administrativni radnik</RadnoMesto> <MaxBrZaposlenih>3</MaxBrZaposlenih> </OgranicenjeRadnogMesta> <OgranicenjeRadnogMesta> <RadnoMesto>sekretar</RadnoMesto> <MaxBrZaposlenih>2</MaxBrZaposlenih> </OgranicenjeRadnogMesta></SpisakOgranicenja>
Prezentacioni sloj (sastoji se iz korisničkog interfejsa i prezentacione logike) Korisnički interfejs// preuzimanje podataka sa korisničkog interfejsaprivate void PreuzmiPodatkeSaKI()
18
{ // preuzimanje vrednosti sa korisnickog interfejsa u atribute prezentacione logike objFormaZaposleniUnos.JMBG = txbJMBG.Text; objFormaZaposleniUnos.Prezime = txbPrezime.Text; objFormaZaposleniUnos.Ime = txbIme.Text; objFormaZaposleniUnos.BrojLicneKarte = txbBrojLicneKarte.Text; objFormaZaposleniUnos.Telefon = txbTelefon.Text; objFormaZaposleniUnos.OpstinaStanovanja = txbOpstinaStanovanja.Text; objFormaZaposleniUnos.MestoStanovanja = txbMestoStanovanja.Text; objFormaZaposleniUnos.AdresaStanovanja = txbAdresaStanovanja.Text; objFormaZaposleniUnos.StrucnaSprema = cbStrucnaSprema.Checked; objFormaZaposleniUnos.ZavrsenaSkola = txbZavrsenaSkola.Text; objFormaZaposleniUnos.RadnoMesto = ddlRadnoMesto.Text; }
// prikaz podatakaprivate void PrikaziPodatke(GridView gv, DataTable TabelaPodataka) { gv.DataSource = TabelaPodataka; gv.DataBind(); }
Prezentaciona logika// provera da li su popunjena sva poljapublic bool DaLiJeSvePopunjeno() { bool SvePopunjeno = false;
if ((pJMBG.Length > 0) && (pPrezime.Length > 0) && (pIme.Length > 0) && (pBrojLicneKarte.Length > 0) && (pTelefon.Length > 0) && (pOpstinaStanovanja.Length > 0) && (pMestoStanovanja.Length > 0) && (pAdresaStanovanja.Length > 0) && (pMestoStanovanja.Length > 0) && (pStrucnaSprema.Length > 0) && (pZavrsenaSkola.Length > 0) && (!pRadnoMesto.Equals("Izaberite..."))) { SvePopunjeno = true; } else { SvePopunjeno = false; }
return SvePopunjeno; }
// provera jedinstvenosti zapisapublic bool DaLiJeJedinstvenZapis() { bool JedinstvenZapis = false; DataSet dsPodaci = new DataSet(); clsZaposleniDB objZaposleniDB = new clsZaposleniDB(pStringKonekcije); dsPodaci = objZaposleniDB.DajZaposlenogPoJMBG(int.Parse(pJMBG));
if (dsPodaci.Tables[0].Rows.Count == 0) { JedinstvenZapis = true; } else { JedinstvenZapis = false; }
return JedinstvenZapis; }
// provera usklađenosti sa poslovnim pravilimapublic bool DaLiSuPodaciUskladjeniSaPoslovnimPravilima() { // odnosi se na maxBrZaposlenih bool UskladjeniPodaci = false;
19
clsPoslovnaPravila objPoslovnaPravila = new clsPoslovnaPravila(pStringKonekcije); clsZaposleniDB objZaposleniDB = new clsZaposleniDB(pStringKonekcije); string RadnoMesto = objZaposleniDB.DajUkupnoZaposlenihZaRadnoMesto(pRadnoMesto);
UskladjeniPodaci = objPoslovnaPravila.DaLiImaMestaZaZaposljavanje(RadnoMesto);
return UskladjeniPodaci; }
Listing 2. Delovi programskog koda rešenja – distribucija procesiranja
20
5. Zaključak
U ovom seminarskom radu prikazana je veb aplikacija za kadrovsku evidenciju. Prikazane su osnovne funkcije koje pruža ova aplikacija, kao i sam dizajn.
U prvom delu su prikazani modeli, odnosno dijagrami softvera, kao i opis tehnologija koje su korišćene u izradi ove aplikacije – Microsoft Visual Studio, Microsoft SQL Server, ASP.NET, C#. Prikazana je implementacija i bitni delovi programskog koda aplikacije, kako distribucije podataka, tako i distribucije procesiranja.
21
6. Literatura
Internet adrese
[1] Definicija i korišćenje use case dijagrama, dijagrama razmeštaja, dijagrama komponenti, dijagrama klasa, https://www.vps.ns.ac.rs/Materijal/mat22117.pdf
Skripte
[2]Tehnologije distribuiranih informacionih sistema, http://tfzr.rs/Content/files/0/UDZBENIK%20Tehnologije%20distribuiranih%20informacionih%20sistema.pdf
22