tfzr - index · web viewdopuna sql skripta i prilagođavanje horizontalno i vertikalno...

7
DISTRIBUIRANI INFORMACIONI SISTEMI, SK 2019/20 VEŽBE, 8. ČAS ZADATAK: Realizovati unapredjenje aplikacije dodavanjem dodatne tabele TIP PREVOZA (ID, Tip, BrojDece). Povezati relacijom i realizovati transakciju kojom se prilikom unosa deteta azurira i ukupan broj dece prema navedenom tipu prevoza za to dete. Primeniti na sve horizontalno i vertikalno particionisane baze podataka. 1. Dopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T] GO CREATE TABLE [dbo].[DETE]( [JMBG] [int] NOT NULL, [Prezime] [nvarchar](40) NOT NULL, [Ime] [nvarchar](40) NOT NULL, [Adresa] [nvarchar](60) NOT NULL, [Telefon] [nvarchar](60) NOT NULL, [KoristiPrevoz] [bit] NOT NULL, [ID_TipPrevoza] [nvarchar](10) NOT NULL, [ZiviSaRoditeljima] [bit] NOT NULL, [ImeMajke] [nvarchar](60) NOT NULL, [ImeOca] [nvarchar](60) NOT NULL, [BrojDeceUPorodici] int NULL, [ImaTezeBolesti] [bit] NOT NULL, [OpisBolesti] [nvarchar](100) NOT NULL, [BrojacPoslednjeIzmene] [timestamp] NOT NULL ) GO ALTER TABLE [dbo].[DETE] ADD CONSTRAINT [PK_DETE] PRIMARY KEY CLUSTERED ( [JMBG] ASC ) GO CREATE TABLE [dbo].[TIP_PREVOZA]( [ID] [nvarchar](10) NOT NULL PRIMARY KEY, [Naziv] [nvarchar](50) NOT NULL, [BrojDece] [int] NULL ) ALTER TABLE [dbo].[Dete] ADD CONSTRAINT [FK_Dete_TipPrevoza] FOREIGN KEY([ID_TipPrevoza]) REFERENCES [dbo].[TIP_PREVOZA] ([ID]) ON UPDATE CASCADE GO

Upload: others

Post on 23-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

DISTRIBUIRANI INFORMACIONI SISTEMI, SK 2019/20

VEŽBE, 8. ČAS

ZADATAK:

Realizovati unapredjenje aplikacije dodavanjem dodatne tabele TIP PREVOZA (ID, Tip, BrojDece). Povezati relacijom i realizovati transakciju kojom se prilikom unosa deteta azurira i ukupan broj dece prema navedenom tipu prevoza za to dete. Primeniti na sve horizontalno i vertikalno particionisane baze podataka.

1. Dopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka

USE [master]GO

CREATE DATABASE [DIS2020_DecaTS_2T] GO

USE [DIS2020_DecaTS_2T]GO

CREATE TABLE [dbo].[DETE]([JMBG] [int] NOT NULL,[Prezime] [nvarchar](40) NOT NULL,[Ime] [nvarchar](40) NOT NULL,[Adresa] [nvarchar](60) NOT NULL,[Telefon] [nvarchar](60) NOT NULL,[KoristiPrevoz] [bit] NOT NULL,[ID_TipPrevoza] [nvarchar](10) NOT NULL,[ZiviSaRoditeljima] [bit] NOT NULL,[ImeMajke] [nvarchar](60) NOT NULL,[ImeOca] [nvarchar](60) NOT NULL,[BrojDeceUPorodici] int NULL,[ImaTezeBolesti] [bit] NOT NULL,[OpisBolesti] [nvarchar](100) NOT NULL,[BrojacPoslednjeIzmene] [timestamp] NOT NULL

)GO

ALTER TABLE [dbo].[DETE]ADD CONSTRAINT [PK_DETE] PRIMARY KEY CLUSTERED (

[JMBG] ASC)

GO

CREATE TABLE [dbo].[TIP_PREVOZA]([ID] [nvarchar](10) NOT NULL PRIMARY KEY,[Naziv] [nvarchar](50) NOT NULL,[BrojDece] [int] NULL

)

ALTER TABLE [dbo].[Dete] ADD CONSTRAINT[FK_Dete_TipPrevoza] FOREIGN KEY([ID_TipPrevoza])REFERENCES [dbo].[TIP_PREVOZA] ([ID])ON UPDATE CASCADEGO

Napomena: sve baze podataka u tabeli Dete treba da imaju ID tipa prevoza, da bi se moglo povezati sa tabelom TipPrevoza koju sada ima svaka baza podataka.

2. KOREKCIJA NAZIVA BAZA PODATAKA U WEB CONFIG , JER SU MENJANI NAZIVI BAZA PODATAKA. U KATALOGU SE NE MORA NISTA MENJATI.

Page 2: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

3. Imamo vec na korisnickom interfejsu combo box za tip prevoza (drop down lista). Obrisati ručno postavljene vrednosti (Items, Collection, Remove).

Page 3: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

4. Punjenje combo boxa iz pomocne tabele, posebna procedura za punjenje combo boxa koja se poziva na page load.

5. Izvođenje ID tipa prevoza na osnovu naziva iz drop down liste.

private string DajIDTipPrevozaIZNaziva(string NazivTipPrevoza) { // polje koje vraca vrednost string IDTipPrevoza ="";

// konektovanje na bp objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings["KonekcijaDecaOsnovna"].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju();

clsSqlTabela objTabelaTipPrevoza = new clsSqlTabela(objKonekcija, "TIP_PREVOZA"); DataSet dsPodaciTipPrevoza = new DataSet(); dsPodaciTipPrevoza = objTabelaTipPrevoza.DajPodatke("select ID from TIP_PREVOZA where Naziv='" + NazivTipPrevoza + "'"); if (dsPodaciTipPrevoza.Tables[0].Rows.Count >0) IDTipPrevoza= dsPodaciTipPrevoza.Tables[0].Rows[0].ItemArray[0].ToString(); return IDTipPrevoza; }

Page 4: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

6. Izmene SQL upita , jer vertikalne particionisane baze podataka sve treba da imaju IDTip prevoza.

7. Dodati putem transakcije prvo podatke o tipu prevoza u bazu podataka koja nije osnovna (ako vec ne postoji takav tip prevoza koji se sada koristi), pa odmah zatim dodati zapis u tabelu dete. Moramo prvo dodati u sifarnicku tabelu, jer je uspostavljena relacija I nece moci da se doda to dete jer ID tipa prevoza konkretnog deteta treba da ukazuje na postojeci zapis. U okviru iste transakcije uvecati broj dece koja odgovaraju tom tipu prevoza. Za svaku horizontalno particionisanu bazu podataka taj ukupan broj dece je razlicit, jer horizontalno particionisane baze podataka imaju podskup zapisa. Osnovna I sve vertikalne imaju identicne ove ukupne brojeve dece po tipu prevoza.

NAPOMENE:

Prvo kreiramo listu upita i tamo stavljamo sve upite koje ulaze u paket.

List<string> lstListaSQLUpita = new List<string>();

Biramo iz klase clsSQLTabela varijantu metode IzvrsiAzuriranje (overload metoda) koja radi sa listom sql upita i transakcijama.

bool UspehAzuriranja = objTabela.IzvrsiAzuriranje(lstListaSQLUpita);

Page 5: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

Da bismo mogli da proverimo ukupan broj zapisa neke tabele, bez obaveznog prethodnog pokretanja DajPodatke kojom se puni interni dataset, kreirana je nova metoda u klasi clsSQLTabela. Metoda se zove DajUkupanBrojSlogova.

Page 6: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

KONAČAN KOD NA METODI IzvršiUpisPodataka:

Radi sa osnovnom bazom podataka jedan po jedan upit bez zajednicke transakcije za vise upita nad razlicitim bazama podataka, a sve ostale baze podataka rade sa listom i paketno transakcijom izvrsavaju upit nad pomocnom tabelom tip prevoza (dodavanje ili izmena zapisa) i nakon toga nad osnovnom tabelom Dete, koja zavisi od sifarnicke tabele TipPrevoza.

NAPOMENA: Moze se ovaj kod transformisati tako da se I osnovna baza podataka obradjuje kroz paketnu transakciju.

private string IzvrsiUpisPodataka(string NazivStringaKonekcijeIzWebConfig, string ModalitetRada, clsDete objDete, Int64 noviIntTimeStamp, clsTipPrevoza objTipPrevoza) { string PorukaUspehaSnimanja = ""; string SQLUpitDodajTipPrevoza = ""; string SQLUpitDodajDete = ""; int ukupnoDeceZaTipPrevoza = 0; bool UspehAzuriranja=true; // inace se stavlja na false, ali moramo staviti na true jer posle se koristi logicko AND nad parcijalnim rezultatima, pa da ne ponistimo u startu sve //1. ################## konektovanje na bp objKonekcija.StringKonekcije = ConfigurationManager.ConnectionStrings[NazivStringaKonekcijeIzWebConfig].ConnectionString; bool UspehKonektovanja = objKonekcija.OtvoriKonekciju(); // ZAJEDNICKE PROMENLJIVE clsSqlTabela objTabelaTipPrevoza = new clsSqlTabela(objKonekcija, "TIP_PREVOZA"); clsSqlTabela objTabelaOsnovna = new clsSqlTabela(objKonekcija, "DETE"); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "DETE"); // stavljamo privremeno ovaj naziv tabele, jer moramo, ali ce se koristiti univerzalno prilikom izvrsavanja raznih upita nad obe tabele koji su postavljeni u listu SQL upita int UkupnoTipPrevoza = objTabelaTipPrevoza.DajUkupanBrojSlogova(); SQLUpitDodajTipPrevoza = "INSERT INTO TIP_PREVOZA VALUES ('" + objTipPrevoza.ID + "', '" + objTipPrevoza.Naziv + "', 1)"; // logicno je da je 1, jer dodavanjem novog deteta i njegovog tipa prevoza, onda imamo bar to 1 dete kao ukupan broj dece za taj tip prevoza SQLUpitDodajDete = this.FormirajUpit(ModalitetRada, objDete, noviIntTimeStamp);

// ##################### PRIPREMA UPITA U LISTU ###################################### // formiranje liste stringova za prikupljanje vise upita da se izvrse paketno putem transakcije List<string> lstListaSQLUpita = new List<string>();

// ########## PRVO SE OBRADJUJE TIP PREVOZA KAO SIFARNICKA TABELA, JER OD NJE ZAVISI OSNOVNA TABELA DETE if (UkupnoTipPrevoza == 0) { // prazna je tabela TIP PREVOZA, uneti bar taj jedan zapis lstListaSQLUpita.Add(SQLUpitDodajTipPrevoza); } else { // nije prazna tabela TIP PREVOZA, provera da li taj tip postoji DataSet dsPodaciTipPrevoza = objTabelaTipPrevoza.DajPodatke("Select * from TIP_PREVOZA where Naziv ='" + objTipPrevoza.Naziv + "'"); int BrojPronadjenihZapisa = objTabelaTipPrevoza.DajBrojSlogova(); if (BrojPronadjenihZapisa == 0) { // nije pronadjen bas taj zapis, dopuna novim tipom prevoza lstListaSQLUpita.Add(SQLUpitDodajTipPrevoza); } else { // azuriranje ukupnog broja dece za pronadjeni tip ukupnoDeceZaTipPrevoza = int.Parse(dsPodaciTipPrevoza.Tables[0].Rows[0].ItemArray[2].ToString()); ukupnoDeceZaTipPrevoza++; string SQLUpitIzmenaTipPrevoza = "Update TIP_PREVOZA set BrojDece=" + ukupnoDeceZaTipPrevoza.ToString() + " where Naziv='" + objTipPrevoza.Naziv + "'"; lstListaSQLUpita.Add(SQLUpitIzmenaTipPrevoza); } } // 3.3. OBRADA OSNOVNE TABELE DETE lstListaSQLUpita.Add(SQLUpitDodajDete);

// ################# IZVRSAVANJE SVIH UPITA #################################### if (!ModalitetRada.Equals("osnovna")) {

Page 7: TFZR - Index · Web viewDopuna SQL skripta i prilagođavanje horizontalno i vertikalno particionisanim bazama podataka USE [master] GO CREATE DATABASE [DIS2020_DecaTS_2T] GO USE [DIS2020_DecaTS_2T]

UspehAzuriranja= objTabela.IzvrsiAzuriranje(lstListaSQLUpita); } else { // OSNOVNA BAZA PODATAKA - mora se pojedinacno izvrsavati svaki upit, zbog time stamp int UkupnoUpita = lstListaSQLUpita.Count; string SQLUpitZaIzvrsavanje = ""; bool UspehIzvrsavanjaUpita = true; for (int brojUpita = 0; brojUpita < UkupnoUpita; brojUpita++) { SQLUpitZaIzvrsavanje = lstListaSQLUpita[brojUpita].ToString(); UspehIzvrsavanjaUpita =objTabela.IzvrsiAzuriranje(SQLUpitZaIzvrsavanje); UspehAzuriranja = UspehAzuriranja && UspehIzvrsavanjaUpita; } } if (UspehAzuriranja) { PorukaUspehaSnimanja = PorukaUspehaSnimanja + "USPESNO SNIMANJE NOVIH PODATAKA!"; } else { PorukaUspehaSnimanja = PorukaUspehaSnimanja + "Greska!"; } // else uspeh

return PorukaUspehaSnimanja;

}