115
UNIVERZITET U NOVOM SADU TEHNIČKI FAKULTET »MIHAJLO PUPIN« ZRENJANIN Mr Ljubica Kazi Prof. dr Biljana Radulović UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum za vežbe - Zrenjanin, maj 2014.

UNIVERZITET U NOVOM SADU - tfzr.uns.ac.rs Skripta2014.pdf · viŠeslojna arhitektura u objektnom okruŽenju 2.1. uvod - klijent-server arhitektura Клијент-сервер модел

  • Upload
    vothuy

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

UNIVERZITET U NOVOM SADU

TEHNIČKI FAKULTET »MIHAJLO PUPIN«

ZRENJANIN

Mr Ljubica Kazi

Prof. dr Biljana Radulović

UVOD U DISTRIBUIRANE INFORMACIONE SISTEME

- praktikum za vežbe -

Zrenjanin, maj 2014.

Autori:

Mr Ljubica Kazi

Prof. dr Biljana Radulović

Recenzenti:

prof. dr Borislav Odadžić

prof. dr Branko Markoski

Izdavač:

Tehnički fakultet «Mihajlo Pupin», Zrenjanin

Za izdavača:

prof. dr Milan Pavlović, dekan

Nastavno-naučno veće

Tehničkog fakulteta «Mihajlo Pupin» u Zrenjaninu donelo je odluku ____

godine da se rukopis ove knjige može koristiti kao udžbenik Fakulteta.

Tehnička obrada:

Ljubica Kazi

Štampa:

Elektronsko izdanje

Tiraž:

200 komada

ISBN:

-

PREDGOVOR

Praktikum je namenjen studentima master studija na predmetu

Distribuirani informacioni sistemi na Tehničkom fakultetu »Mihajlo

Pupin« u Zrenjaninu. Nastao je kao rezultat višegodišnjeg rada autora u

nastavi pomenutog predmeta.

U okviru praktikuma za svaku od tema dat je teorijski uvod i rešen

primer. Primeri su realizovani koristeći Microsoft Visual Studio .NET 2010

i MS SQL Server 2008 R2.

Namera autora je da u narednim izdanjima ovaj priručnik dobije izgled

zaokružene celine u smislu praktične implementacije savremenih

tehnologija u razvoju distribuiranih informacionih sistema.

Zahvalnost za kritički pregled dugujemo recenzentima,

U Zrenjaninu, maj 2014.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

I

SADRŽAJ:

1. UVOD - DISTRIBUIRANI INFORMACIONI SISTEMI 1

1.1. Arhitektura informacionog sistema 1

1.2. Definicija distribuiranog informacionog sistema 3

2. VIŠESLOJNA ARHITEKTURA U OBJEKTNOM OKRUŽENJU 4

2.1. Uvod - Klijent-server arhitektura 4

2.2. Struktura višeslojne aplikacije u objektnom okruženju 6

2.3. Rešen primer 7

3. DISTRIBUIRANE BAZE PODATAKA 29

3.1. Uvod - Distribuirane baze podataka i SUBP 29

3.2. Rešeni primeri 31

3.2.1. Horizontalna i vertikalna particija baze podataka 31

3.2.2. Katalog distribuirane baze podataka 37

3.2.3. Master detail, distribuirane transakcije i XML 45

4. WEB APLIKACIJE, WEB SERVISI I XML 65

4.1. Personalizovane web aplikacije 65

4.2. Web servisi 84

4.2.1. Definicija i primer realizacije i korišćenja web servisa 84

4.2.2. Postupak kreiranja i testiranja web servisa 84

4.2.3. Korišćenje web servisa u web aplikaciji 89

4.2.4. Korišćenje raspoloživih besplatnih web servisa 95

4.3. Web aplikacija sa transakcijama, web servisima i XML 99

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

1

1. DISTRIBUIRANI INFORMACIONI SISTEMI

1.1. ARHITEKTURA INFORMACIONOG SISTEMA

„Информациони систем у организацији обезбеђује процесе и

информације корисне члановима организације и његовим

клијентима“ [1].

Општа дефиниција информационог система описује га као „систем

који има улаз и излаз информацијског карактера“ [2].

„Информациони систем укључује све ресурсе који су ангажовани у

прикупљању, управљању, коришћењу и достављању

информационих ресурса у организацији.„ [3] »Полазећи од

системског приступа, информациони систем можемо дефинисати као

сређени скуп метода, процеса и операција за прикупљање, чување,

обраду, преношење и дистрибуцију података у оквиру једне

организације, укључујући и опрему која се у те сврхе користи и

људе који се тим активностима баве.» [4] Рачунарски подржани

информациони системи називају се заједничким именом

„Информациони системи засновани на рачунару (Computer-based

information system) [5].

»Архитектура информационог система је део ширег скупа

архитектура и модела који су релевантни за организацију. На

различитим нивоима архитектуре можемо разликовати:

Архитектуру организације/предузећа (Enterprise Architecture),

Aрхитектуру информационог система (ISA – Information

System Architecture),

Sофтверску архитектуру (SWA – Software Architecture).« [6]

„Информациони системи расту и развијају се у различитости

технологије, домена примене, броја корисника, географској

дистрибуираности, броја функционалних јединица, компоненти и

веза између њих. Мноштво архитектурних шаблона (pattern-a)

појавили су се у настојању увођења реда. Дизајн архитектуре има

кључну улогу у развоју информационог система. То је први корак

којим се спецификације захтева претварају у радни систем који се

састоји од хардвера и софтвера.“ [7] Zachman-ov framework [8] je

први одвојио концепт SWA и ISA, односно показао да SWA није

једини који чини ISA.

Према [6], архитектуру информационог система чине подсистеми,

односно архитектуре:

ИНФОРМАЦИОНА АРХИТЕКТУРА – архитектура података,

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

2

АПЛИКАЦИОНА АРХИТЕКТУРА – функционална архитектура,

ТЕХНОЛОШКА АРХИТЕКТУРА – инфраструктурно-платформска

архитектура.

“Поред технологије „информациони систем се темељи на

систематично успостављеном и промењиваном скупу

организацијских правила у вези с носиоцима задатака

информирања. Потребно је утврдити путеве информирања, права и

обавезе информирања, те методе и начине обраде информација које

служе носиоцима задатака као подлога за доношење пословних и

других одлука“ [2].

LITERATURA

[1] David Avison, Guy Fitzgerald, „Information systems development:

Methodologies, Techniques and Tools“, McGraw-Hill, 2003.

[2] Ljubomir Dulović: „Osnovi informaciologije i informacione

tehnologije“, Institut za nuklearne nauke Vinča, Beograd, 1991.

[3] Elmasri Ramez, Navathe Shamkant: “Fundamentals of database

systems”, Addison Wesley, 2007.

[4] Михаило Јауковић: „Увод у информационе системе“, Техничка

књига, Београд, 1992.

[5] Neđo Balaban, Živan Ristić, Jovica Đurković: „Principi informatike“,

Savremena administracija, Beograd, 1996.

[6] Vasconcelos A, Soursa P, Tribolet J: Information system Architecture

Metrics: an Enterprise Engineering Evaluation Approach, The Electronic

Journal of Information Systems Evaluation, Vol 10, Issue 1, pp 91-122,

ISSN 1566-6379, www.ejise.com

[7] Lockemann P.: Information system Architectures: From Art to

Science, Conference BTW2003 (Business, Technologie and Web)

Proceeedings 2003., http://doeseno.informatik.uni-

leipzig.de/proceedings/paper/keynote_lockeman.pdf

[8] Zachman, John, A Framework for Information System Architecture,

IBM system journal Vol.26 Nº 3, 1987, p.276 – 292.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

3

1.2. DEFINICIJA DISTRIBUIRANOG INFORMACIONOG SISTEMA

Главни разлог за изградњу дистрибуираног информационог система

и дистрибуиране базе података је да се на одговарајући начин

обезбеди подршка информационих захтева корисника реалног

система, чије пословање обухвата шире географско подручје [1].

Према [1], под појмом дистрибуирани информациони систем

подразумева се информациони систем који подржава дистрибуирану

обраду података, над дистрибуираном базом података.

„Дистрибуирана база података представља такву базу података у

којој су подаци физички смештени на најмање два сервера базе

података. Без обзира што су делови дистрибуиране базе података

расподељени на више сервера, реч је о једној бази података која у

логичком смислу представља јединствену целину. Предуслов за

формирање и коришћење дистрибуиране базе података је да сви

сервери базе података који партиципирају у дистрибуцији, буду

повезани комуникационом мрежом.“ [1].

“Дистрибуирана обрада података је обрада података над

дистрибуираном базом података, при чему задаци логике обраде

података и управљања обрадом података могу се расподелити на све

сервере који партиципирају у дистрибуцији. На основу ове

дефиниције произилази да обрада података, код које су делови базе

података смештени на више различитих рачунара, или различитих

меморијских уређаја, при чему је сама обрада података увек

централизована, односно није могуће извршити дистрибуцију

задатака логике обраде података и управљања обрадом података, не

представља дистрибуирану обраду.“ [1]

LITERATURA

[1] Mogin Pavle, Lukovic Ivan, Govedarica Miro: “Principi projektovanja

baza podataka”, Fakultet tehničkih nauka, Novi Sad, 2000.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

4

2. VIŠESLOJNA ARHITEKTURA U OBJEKTNOM OKRUŽENJU

2.1. UVOD - KLIJENT-SERVER ARHITEKTURA

Клијент-сервер модел обраде података „представља такву врсту

дистрибуиране обраде података, код које се функције једног

корисничког програма расподељују на најмање два процеса, који

међусобно комуницирају. Процеси који учествују у клијент-сервер

обради се класификују на два типа: клијентски процеси и серверски

процеси, при чему je логика комуникације клијентског и серверског

процеса таква да клијентски процес шаље поруку серверском

процесу, којом захтева „услугу“ серверског процеса, а серверски

процес одговара на захтев клијентског процеса тако што, било

успешно или неуспешно, извршава захтевани задатак и шаље

поруку клијентском процесу. Та порука представља резултат

траженог задатка. „[1]

Рачунар намењен извршавању клијентских процеса назива се

клијент, а рачунар намењен извршавању серверских процеса назива

се сервер. [1]

Расподела задатака у клијент-сервер систему може се груписати на

[1]:

1. Управљање презентацијом : рад са корисничким интерфејсом

- екранским формама, приказом и штампом извештаја,

употреба менија, икона и других графичких елемената

корисничког интерфејса

2. Логика презентације: трансформисање података са

презентационог на концептуални ниво и обратно, покретање

трансакција и обрада порука о резултатима рада трансакција,

обрада података који се налазе у радној зони програма,

обрада резултата дијалога корисника и програма.

3. Прослеђивање порука и података

4. Логика обраде података: трансформисање података с

концептуалног на физички ниво и обратно, управљање

операцијама читања и ажурирања података, спровођење

контроле конзистентности података, обрада грешака које могу

настати при реализацији операција читања и ажурирања или

контроли конзистентности.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

5

5. Управљање обрадом података: улазно-излазне активности –

отварање и затварање датотека, физички и логички пренос

података ка-из меморијског уређаја у радну меморију,

детекција грешака при реализацији улазно-излазних

операција.

У трослојном моделу клијент-сервер система, основни елементи

архитектуре су [1]:

1. Сервер базе података – задужен је за подршку управљања

обрадом података и логике обраде података

2. Апликациони сервер – задужен је за подршку логике

презентације

3. Апликациони клијент – задужен је за подршку управљања

презентацијом.

LITERATURA

[1] Mogin Pavle, Lukovic Ivan, Govedarica Miro: “Principi projektovanja

baza podataka”, Fakultet tehničkih nauka, Novi Sad, 2000.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

6

2.2. STRUKTURA VIŠESLOJNE APLIKACIJE U OBJEKTNOM OKRUŽENJU

U ovom odeljku opisana je struktura višeslojne aplikacije u objektnom

okruženju, koja se realizuje u okviru praktične nastave na Tehničkom

fakultetu „Mihajlo Pupin“ u Zrenjaninu, u okviru nastavnih predmeta

Informacioni sistemi 2 na osnovnim studijama, kao i Distribuirani

informacioni sistemi i Sistemi za upravljanje poslovnim procesima na

master studijama. Slojevi između korisničkog interfejsa i baze podataka

su biblioteke klasa.

Osnovna arhitektura prikazana je tabelom:

PREZEN

TAC

ION

I SLO

J

Korisnički interfejs Windows aplikacije / Web aplikacije

Standardne klase korisničkog interfejsa iz razvojnog okruženja

Elementi vizualnog dela korisničkog interfejsa

Biblioteka klasa korisničkog interfejsa

Zadužene za preuzimanje podataka i realizaciju zadatih komandi sa korisničkog interfejsa

APLIK

ATIV

NI

PO

SLO

VN

I

SLO

J

Biblioteka klasa radnih tokova i poslovnih procesa

Biblioteka klasa poslovnih entiteta Po strukturi bliske semantici poslovanja i strukturi dokumentacije u poslovnom okruženju

Podsistem za upravljanje poslovnim pravilima

SLO

J PO

DATAKA

Interfejs klase Sakrivaju implementaciju i omogućavaju vezu ka različitim DB klasama u odnosu na različite SUBP u okviru kojih su realizovani

DB klase Klase koje implementiraju vezu tehnoloških klasa sa semantičkim klasama podataka

Klase podataka (Semantičke klase)

Semantičke klase bez tehnologije, po strukturi slične strukturi tabela iz baze podataka, sadrže klase tipa pojedinac (set-get) i klase kolekcija (npr. uređene liste) koje kao elemente sadrže objekte klasa pojedinca

Tehnološke klase Realizuju vezu ka konkretnim tipovima baza podataka, kao i citanje i upis podataka, nezavisno od semantike

SUBP + baza podataka Sistem za upravljanje bazom podataka, sama baza podataka sa svim elementima koji uključuju i aktivne mehanizme – uskladištene procedure, trigere i sl.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

7

2.3. REŠEN PRIMER

Zadatak:

Realizovati višeslojnu aplikaciju sa podslojevima u sloju podataka i

vezu ka korisničkom interfejsu radi realizacije unosa i tabelarnog

prikaza podataka.

Prikaz strukture aplikacije:

PREZENTACIONI

SLOJ

Windows aplikacija

SLOJ PODATAKA Db klase (DBBankaSQL.dll)

Klase podataka ()

Klase za interoperabilnost (DataInteropUtils.dll)

Tehnoloske klase (SQLDBUtils.dll)

Konfiguracioni fajl (PodesavanjaSQL.XML)

Baza podataka (Banka.mdf)

SUBP/DBMS (MS SQL Server 2008 R2)

Izgled strukture aplikacije po folderima:

Redosled kreiranja slojeva je počev od broja 01, tj. od kreiranja baze

podataka, koristeći SQL skript. Tehnološke klase I klase za

interoperabilnost se mogu koristiti u različitim projektima. Biblioteku

klasa podataka (04) možemo kreirati konektovanjem na bazu

podataka i korišćenjem nekog od generatora koda ili iz CASE alata

(npr. Sybase Power Designer). Pritom dobijamo samo klase

pojedince (imaju set-get metode). U biblioteku klasa podataka

moramo sami dodati klase kolekcija pojedinaca, npr. Uredjene liste

klasa pojedinaca. Takodje, sami moramo kreirati I DB klase, kojima

se povezuju klase podataka I tehnoloske klase, radi realizacije

operacija citanja i manipulacije podacima (unos, brisanje, izmena).

Konačno, korisnički interfejs se obraća DB klasi sa zahtevima.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

8

BAZA PODATAKA

Dijagram – shema relacione baze podataka MS SQL Server - Banka.mdf

SQL SKRIPT za kreiranje baze podataka:

create database BANKA go use BANKA go create table Entitet ( IdEntiteta bigint not null IDENTITY, Naziv varchar(150) not null, Adresa varchar(70) not null, Telefon varchar(50) null, Email varchar(50) null, web varchar(200) null, StanjeRacuna money not null, constraint PK_ENTITET primary key nonclustered (IdEntiteta) ) go create unique index Entitet_AK on Entitet ( Email ASC ) go create table Uplata ( ID bigint not null IDENTITY, IdFirme bigint not null, IdKomit bigint not null, DatumPlacanja datetime not null, IznosUplate money not null, constraint PK_UPLATA primary key nonclustered (ID) )

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

9

go create index "je uplatio_FK" on Uplata ( IdKomit ASC ) go create index "je primio_FK" on Uplata ( IdFirme ASC ) go

alter table Uplata add constraint FK_Uplatio foreign key (IdKomit) references Entitet (IdEntiteta); go alter table Uplata add constraint FK_Primio foreign key (IdFirme) references Entitet (IdEntiteta); go

KONFIGURACIONI XML FAJL

Konfiguracioni XML fajl sadrži podesavanja osobina za pristupanje SQL

Server bazi podataka (PodesavanjaSQL.XML). Postavljen je tako da se

čita iz korisnickog interfejsa (najbolje postaviti u bin/debug folder gde se

nalazi Exe fajl programa, a inače može da se postavi na neku fiksnu

skrivenu lokaciju) kako bi se olaksale eventualne promene lokacije baze

(naziva SQL Server instance) ili naziva baze podataka.

PodesavanjaSQL.XML

<?xml version="1.0"?>

<podesavanja>

<podesavanje>

<nazivSQLinstance>29-01</nazivSQLinstance>

<nazivBaze>Banka</nazivBaze>

<putanjaBaze></putanjaBaze>

<KorisnickoIme></KorisnickoIme>

<Sifra></Sifra>

</podesavanje>

</podesavanja>

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

10

TEHNOLOŠKE KLASE

Ove klase olakšavaju rad sa konkretnim sistemom za upravljanje

bazama podataka, koristeći standardne biblioteke klasa.

KLASA string konekcije

Public static klasa za dinamičko kreiranje stringa konekcije, u zavisnosti

od raspoloživih parametara.

namespace SQLDBUtils { public static class clsStringKonekcije { public static string DajStringKonekcije(string pPutanjaSQLBaze, string pNazivSQL_DBMSinstance, string pNazivBaze, string pUsername, string pPassword) { string mStringKonekcije=""; if (pPutanjaSQLBaze.Length.Equals(0) || pPutanjaSQLBaze == null) { mStringKonekcije = "Data Source=" + pNazivSQL_DBMSinstance + " ;Initial Catalog=" + pNazivBaze + ";"; } else { mStringKonekcije = "Data Source=.\\" + pNazivSQL_DBMSinstance + ";AttachDbFilename=" + pPutanjaSQLBaze + "\\" + pNazivBaze + ";Connect Timeout=30;User Instance=True"; } if (pUsername.Length.Equals(0) || pUsername == null) {

mStringKonekcije = mStringKonekcije + "Integrated Security=True;"; } else { mStringKonekcije = mStringKonekcije + "User ID=" + pUsername + ";Password=" + pPassword; } return mStringKonekcije; } } }

KLASA konekcija

Klasa za rad sa konekcijom do celine baze podataka.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

11

using System.Data.SqlClient; namespace SQLDBUtils { public class clsSQLKonekcija { /* ODGOVORNOST: Konekcija na celinu baze podataka, SQL server tipa */ #region ATRIBUTI private SqlConnection pKonekcija; // private string pPutanjaSQLBaze; private string pNazivBaze; private string pNazivSQL_DBMSinstance; private string pUsername; private string pPassword; #endregion #region KONSTRUKTOR public clsSQLKonekcija(string nazivSQL_DBMSInstance, string putanjaSqlBaze, string NazivBaze, string Korisnik, string Sifra) { pPutanjaSQLBaze = putanjaSqlBaze; pNazivBaze = NazivBaze; pNazivSQL_DBMSinstance = nazivSQL_DBMSInstance; pUsername = Korisnik; pPassword = Sifra; } #endregion #region PRIVATNE METODE #endregion #region JAVNE METODE public bool OtvoriKonekciju() { bool uspeh; pKonekcija = new SqlConnection(); pKonekcija.ConnectionString = clsStringKonekcije.DajStringKonekcije(pPutanjaSQLBaze,pNazivSQL_DBMSinstance,pNazivBaze,pUsername,pPassword); try { pKonekcija.Open(); uspeh = true; } catch { uspeh = false;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

12

} return uspeh; } public SqlConnection DajKonekciju() { return pKonekcija; } public void ZatvoriKonekciju() { pPutanjaSQLBaze = ""; pKonekcija.Close(); pKonekcija.Dispose(); } #endregion } }

KLASA tabela

Klasa za rad sa podacima iz tabela, koristeći sql upite. using System.Data.SqlClient; namespace SQLDBUtils { public class clsSQLTabela { /* ODGOVORNOST: Rad sa podacima iz baze podataka, ne mora samo iz jedne tabele */ #region Atributi private string pNazivTabele; private clsSQLKonekcija pKonekcija; private SqlDataAdapter pAdapter;

private System.Data.DataSet pDataSet; #endregion #region Konstruktor public clsSQLTabela(clsSQLKonekcija Konekcija, string NazivTabele) // Konekcija mora biti prethodno otvorena { pKonekcija = Konekcija; pNazivTabele = NazivTabele; } #endregion #region Privatne metode

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

13

private void KreirajAdapter(string SelectUpit, string InsertUpit, string DeleteUpit, string UpdateUpit) { SqlCommand mSelectKomanda, mInsertKomanda, mDeleteKomanda, mUpdateKomanda; mSelectKomanda = new SqlCommand(); mSelectKomanda.CommandText = SelectUpit; mSelectKomanda.Connection = pKonekcija.DajKonekciju(); mInsertKomanda = new SqlCommand(); mInsertKomanda.CommandText = InsertUpit; mInsertKomanda.Connection = pKonekcija.DajKonekciju();

mDeleteKomanda = new SqlCommand(); mDeleteKomanda.CommandText = DeleteUpit; mDeleteKomanda.Connection = pKonekcija.DajKonekciju(); mUpdateKomanda = new SqlCommand(); mUpdateKomanda.CommandText = UpdateUpit; mUpdateKomanda.Connection = pKonekcija.DajKonekciju(); pAdapter = new SqlDataAdapter(); pAdapter.SelectCommand = mSelectKomanda; pAdapter.InsertCommand = mInsertKomanda; pAdapter.UpdateCommand = mUpdateKomanda; pAdapter.DeleteCommand = mDeleteKomanda; } private void KreirajDataset() { pDataSet = new System.Data.DataSet(); pAdapter.Fill(pDataSet, pNazivTabele); } private void ZatvoriAdapterDataset() { pAdapter.Dispose(); pDataSet.Dispose(); } #endregion #region Javne metode public System.Data.DataSet DajPodatke(string SelectUpit) // izdvaja podatke u odnosu na dat selectupit { KreirajAdapter(SelectUpit, "", "", ""); KreirajDataset(); return pDataSet; } public int DajBrojSlogova() { int BrojSlogova = pDataSet.Tables[0].Rows.Count; return BrojSlogova; } public bool IzvrsiAzuriranje(string Upit)

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

14

// izvrzava azuriranje unos/brisanje/izmena u odnosu na dati i upit { // bool uspeh = false; SqlConnection mKonekcija; SqlCommand Komanda; SqlTransaction mTransakcija = null; try { mKonekcija = pKonekcija.DajKonekciju(); // aktivan kod // povezivanje

Komanda = new SqlCommand(); Komanda.Connection = mKonekcija; Komanda = mKonekcija.CreateCommand(); // pokretanje // NE TREBA OPEN JER DOBIJAMO OTVORENU KONEKCIJU KROZ KONSTRUKTOR // mKonekcija.Open(); mTransakcija = mKonekcija.BeginTransaction(); Komanda.Transaction = mTransakcija; Komanda.CommandText = Upit; Komanda.ExecuteNonQuery(); mTransakcija.Commit(); uspeh = true; } catch { mTransakcija.Rollback(); uspeh = false; } return uspeh; } #endregion } }

KLASA transakcija

Klase za rad sa transakcijama. SQL upite koji treba da se izvrše

postavljamo u uređenu listu, pa se izvršavaju “paketno” u okviru

zajedničke transakcije.

using System.Data.SqlClient; namespace SQLDBUtils { public class clsSQLTransakcija { #region ATRIBUTI private SqlConnection pKonekcija;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

15

private SqlCommand komanda; private SqlTransaction transakcija; private List<string> objListaUpita; private int RedniBroj; #endregion #region KONSTRUKTOR public clsSQLTransakcija()

{ pKonekcija = new SqlConnection(); komanda = new SqlCommand(); objListaUpita = new List<string> (); RedniBroj = 0; } #endregion #region PRIVATNE METODE #endregion #region JAVNE METODE public void DodajUpit(string noviUpit) { objListaUpita.Add(noviUpit); RedniBroj++; } public bool IzvrsiTransakciju() { // podrazumeva se da je konekcija otvorena i kao takva prosledjena //pKonekcija.Open(); bool uspeh = false; try { komanda = pKonekcija.CreateCommand(); transakcija = pKonekcija.BeginTransaction(); komanda.Transaction = transakcija; for (int i = 0; i < RedniBroj; i++) { komanda.CommandText = objListaUpita[i].ToString(); komanda.ExecuteNonQuery(); } transakcija.Commit(); //pKonekcija.Close(); uspeh = true; } catch { uspeh = false; }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

16

return uspeh; } #endregion } }

KLASE ZA INTEROPERABILNOST

Ove klase služe za omogućavanje rada sa različitim formatima datoteka,

kojima se omogućava razmena podataka između različitih aplikacija, tj.

Interoperabilnost podataka.

Klasa za rad sa tekstualnom datotekom

namespace DataInteropUtils { public static class clsTXT { #region JAVNE METODE public static string ProcitajFajl(string PutanjaFajla) { string sadrzajFajla; System.IO.StreamReader file = new System.IO.StreamReader(PutanjaFajla); sadrzajFajla = file.ReadToEnd(); file.Close(); return sadrzajFajla; } #endregion } }

Klasa za rad sa XML

namespace DataInteropUtils { public static class clsXML { #region JAVNE METODE public static void ObrisiXMLfajl(string PutanjaiNazivXMLFajla) { System.IO.FileInfo pomfile = new System.IO.FileInfo(PutanjaiNazivXMLFajla); pomfile.Delete();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

17

} //------------------------- public static string KreirajXMLfajl(System.Data.DataSet ds, bool ProveraPostojanja, string PutanjaiNazivXMLFajla, string PutanjaiNazivXMLSheme) { System.IO.FileInfo pomfile = new System.IO.FileInfo(PutanjaiNazivXMLFajla); if ((ProveraPostojanja == true) && (pomfile.Exists)) { return "Ne mozete kreirati fajl jer je vec kreiran. Zadnji put kreiran fajl - datum:" +

pomfile.LastWriteTime.Date.Day.ToString() + "." + pomfile.LastWriteTime.Date.Month.ToString() + "." + pomfile.LastWriteTime.Date.Year.ToString() + " vreme:" + pomfile.LastWriteTime.Hour.ToString() + ":" + pomfile.LastWriteTime.Minute.ToString() + ":" + pomfile.LastWriteTime.Second.ToString(); } else { ds.WriteXml(PutanjaiNazivXMLFajla); ds.WriteXmlSchema(PutanjaiNazivXMLSheme); return "Uspesno ste kreirali XML fajl"; } } //------------------------------- public static System.Data.DataSet UcitajXMLuDataset(string PutanjaINazivXMLfajla) { System.Data.DataSet ds = new System.Data.DataSet(); ds.ReadXml(PutanjaINazivXMLfajla); return ds; } #endregion } }

Klasa za rad sa Excel

Dodajemo referencu na ExcelLibrary.dll, raspoloživa besplatno sa:

https://code.google.com/p/excellibrary/downloads/list

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

18

using ExcelLibrary; namespace DataInteropUtils { public static class clsXLS { #region JAVNE METODE public static bool SnimiXLS(System.Data.DataSet ds, string nazivXLSfajla) { try {

ExcelLibrary.DataSetHelper.CreateWorkbook(nazivXLSfajla, ds); } catch { return false; } return true; } #endregion } }

KLASE PODATAKA

Sadrže klase tipa pojedinac I klase kolekcija pojedinaca.

Klasa pojedinac – ima samo set-get metode

using System; namespace OOMBanka { public class Entitet { private long pIDentiteta; private string pNaziv; private string pAdresa; private string pTelefon; private string pEmail; private string pWeb; private decimal pStanjeRacuna; public long IDentiteta { get { return pIDentiteta; } set { if (this.pIDentiteta != value) this.pIDentiteta = value;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

19

} } public string Naziv { get { return pNaziv; } set { if (this.pNaziv != value)

this.pNaziv = value; } } public string Adresa { get { return pAdresa; } set { if (this.pAdresa != value) this.pAdresa = value; } } public string Telefon { get { return pTelefon; } set { if (this.pTelefon != value) this.pTelefon = value; } } public string Email { get { return pEmail; } set { if (this.pEmail != value) this.pEmail = value; } } public string Web

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

20

{ get { return pWeb; } set { if (this.pWeb != value) this.pWeb = value; } }

public decimal StanjeRacuna { get { return pStanjeRacuna; } set { if (this.pStanjeRacuna != value) this.pStanjeRacuna = value; } } } }

KLASA kolekcija pojedinaca – uređena lista //DODATO using System.Collections; namespace OOMBanka

{ public class EntitetUredjenaLista { #region ATRIBUTI private ArrayList listaEntiteta; #endregion #region KONSTRUKTOR public EntitetUredjenaLista() { listaEntiteta = new ArrayList(); } #endregion #region METODE public void ObrisiArrayListuEntiteta() { listaEntiteta.Clear();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

21

} public int DajBrojElemenataListeEntiteta() { return listaEntiteta.Count; } public void DodajElementArrayListeEntiteta(Entitet objNoviEntitet) { listaEntiteta.Add(objNoviEntitet); } public void ObrisiElementArrayListeEntiteta(Entitet objEntitetZaBrisanje) { listaEntiteta.Remove(objEntitetZaBrisanje);

} public void ObrisiElementArrayListeEntitetaSaPozicije(int pozicija) { listaEntiteta.RemoveAt(pozicija); } public void UmetniElementArrayListeEntitetaNaPoziciju(Entitet objNoviEntitet, int pozicija) { listaEntiteta.Insert(pozicija, objNoviEntitet); } public void ObrisiSkupElemenataListePocevOdPozicije(int pocetnapozicija, int duzina) { listaEntiteta.RemoveRange(pocetnapozicija, duzina); } #endregion } }

DB BIBLIOTEKA KLASA

U ovom primeru data je veza DBklase za tabelu Entitet direktno koristeci

uskladistene procedure iz baze podataka.

// DODATO using System.Data; using System.Data.SqlClient; // using DataInteropUtils; using SQLDBUtils; using OOMBanka; namespace DBBankaSQL {

public class DBEntitet { #region ATRIBUTI private string putanjaFajlaStringKonekcije; // OSTAJE PUBLIC, BEZ SET/GET public Entitet pEntitet = new Entitet (); #endregion

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

22

#region KONSTRUKTOR public DBEntitet(string pPutanjaFajlaStringaKonekcije) { putanjaFajlaStringKonekcije = pPutanjaFajlaStringaKonekcije; } #endregion #region PRIVATNE METODE

private string DajStringKonekcije(string pPutanjaFajla) { string stringkon=""; // preuzimanje parametara iz XML fajla sa podesavanjima DataSet ds = clsXML.UcitajXMLuDataset(pPutanjaFajla); string nazivSQLinstance=ds.Tables[0].Rows[0].ItemArray[0].ToString(); string nazivBaze=ds.Tables[0].Rows[0].ItemArray[1].ToString(); string putanjaBaze=ds.Tables[0].Rows[0].ItemArray[2].ToString(); string KorisnickoIme=ds.Tables[0].Rows[0].ItemArray[3].ToString(); string Sifra=ds.Tables[0].Rows[0].ItemArray[4].ToString(); // stringkon = clsStringKonekcije.DajStringKonekcije(putanjaBaze, nazivSQLinstance, nazivBaze, KorisnickoIme, Sifra); return stringkon; } #endregion #region JAVNE METODE public DataTable DajSveEntitete() { DataTable TabelaPodataka = new DataTable(); try { // PREUZIMANJE PODATAKA // otvaranje konekcije SqlConnection Veza = new SqlConnection(DajStringKonekcije(putanjaFajlaStringKonekcije)); Veza.Open(); // preuzimanje podataka u dr SqlCommand Komanda = new SqlCommand("DajSveEntitete2grupa", Veza); Komanda.CommandType = CommandType.StoredProcedure; SqlDataReader dr = Komanda.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows) {

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

23

TabelaPodataka.Load(dr); } else { } } catch (Exception ex) { string greska=ex.Message.ToString(); } return TabelaPodataka;

} public DataTable DajEntitetePoNazivu(string naziv) { DataTable TabelaPodataka = new DataTable(); try { // PREUZIMANJE PODATAKA // otvaranje konekcije SqlConnection Veza = new SqlConnection(DajStringKonekcije(putanjaFajlaStringKonekcije)); Veza.Open(); // preuzimanje podataka u dr SqlCommand Komanda = new SqlCommand("DajEntitetePoNazivu2grupa", Veza); Komanda.CommandType = CommandType.StoredProcedure; Komanda.Parameters.Add("@Naziv", SqlDbType.VarChar).Value = naziv; SqlDataReader dr = Komanda.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows) { TabelaPodataka.Load(dr); } else { } } catch (Exception ex) { string greska = ex.Message.ToString(); } return TabelaPodataka; } public int DodajNoviEntitet() { int brslogova = 0;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

24

try { SqlConnection Veza = new SqlConnection(DajStringKonekcije(putanjaFajlaStringKonekcije)); Veza.Open(); SqlCommand Komanda = new SqlCommand("DodajNoviEntitet", Veza); Komanda.CommandType = CommandType.StoredProcedure; Komanda.Parameters.Add("@Naziv", SqlDbType.VarChar).Value = pEntitet.Naziv; Komanda.Parameters.Add("@Adresa", SqlDbType.VarChar).Value = pEntitet.Adresa;

Komanda.Parameters.Add("@Telefon", SqlDbType.VarChar).Value = pEntitet.Telefon; Komanda.Parameters.Add("@Email", SqlDbType.VarChar).Value = pEntitet.Email; Komanda.Parameters.Add("@web", SqlDbType.VarChar).Value = pEntitet.Web; Komanda.Parameters.Add("@StanjeRacuna", SqlDbType.Money).Value = pEntitet.StanjeRacuna; brslogova = Komanda.ExecuteNonQuery(); Veza.Close(); Veza.Dispose(); } catch (Exception ex) { string greska= ex.Message.ToString(); } return brslogova; } #endregion } }

ZADATAK:

1. Napisati stored procedure za citanje i upis podataka.

2. Realizovati DB klasu koristeci klase podataka I tehnoloske klase.

KORISNIČKI INTERFEJS

Forma za unos podataka – kartica za unos

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

25

Forma za unos podataka – kartica za tabelarni prikaz

U realizaciji dodate reference na odgovarajuće biblioteke klasa (*.dll

fajlove):

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

26

PROGRAMSKI KOD KORISNICKOG INTERFEJSA – direktno koristi samo

metode DBBankaSQL klase.

using DBBankaSQL; namespace KorisnickiInterfejs { public partial class frmEntitet : Form { // ############################################### // ATRIBUTI DBEntitet objDBEntitet ; DataTable TabelaPodataka; // ############################################ // KONSTRUKTOR public frmEntitet() { InitializeComponent(); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

27

// ############################################ // NASE METODE private string PutanjaAplikacije() { string path; path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); return path; } // ############################################ // DOGADJAJI private void btnSve_Click(object sender, EventArgs e) { try { TabelaPodataka = objDBEntitet.DajSveEntitete(); dgvEntiteti.DataSource = TabelaPodataka; dgvEntiteti.Refresh(); } catch (Exception ex) { MessageBox.Show("Greska:" + ex.Message.ToString()); } } private void frmEntitet_Load(object sender, EventArgs e) { string putanjaXMLparametara = PutanjaAplikacije() + "\\PodesavanjaSQL.XML"; objDBEntitet = new DBEntitet(putanjaXMLparametara); TabelaPodataka = new DataTable(); } private void btnFiltriraj_Click(object sender, EventArgs e) { TabelaPodataka = objDBEntitet.DajEntitetePoNazivu(txtFilter.Text); dgvEntiteti.DataSource = TabelaPodataka; dgvEntiteti.Refresh(); } private void btnPotvrdi_Click(object sender, EventArgs e) { objDBEntitet.pEntitet.Naziv = txtNaziv.Text; objDBEntitet.pEntitet.Adresa = txtAdresa.Text; objDBEntitet.pEntitet.Telefon = txtTelefon.Text; objDBEntitet.pEntitet.Email = txtEmail.Text; objDBEntitet.pEntitet.Web = txtWeb.Text; objDBEntitet.pEntitet.StanjeRacuna =0; try

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

28

{ int brojslogova =objDBEntitet.DodajNoviEntitet(); if (brojslogova > 0) { MessageBox.Show("Successful add!"); } else { MessageBox.Show("Error in adding!"); } } catch (Exception ex) { MessageBox.Show ("GRESKA:" + ex.Message.ToString()); } } // kraj procedure } // kraj klase forme } // kraj namespace

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

29

3. DISTRIBUIRANE BAZE PODATAKA

3.1. DISTRIBUIRANE BAZE PODATAKA I SUBP

Дистрибуирана база података може бити организована као [1]:

хомогена (коришћен је само један систем за управљање базом

података),

хетерогена (коришћено је најмање два система за управљање

базом података).

Једна од најважнијих особина дистрибуираних база података је

дистрибуциона транспарентност односно независност – све

апликације информационог система треба да буду независне од

дистрибуције података по серверима, што значи да измене у начину

дистрибуирања података по серверима не смеју утицати на рад

апликација. Крајњи корисници дистрибуираног информационог

система у принципу не треба да познају његову архитектуру. Ни

програмер апликација информационог система не треба да познаје

начин дистрибуције базе података по серверима, већ апликације

треба да функционишу независно од тога како је извршена

дистрибуција базе података.

Дистрибуирани системи за управљање базама података [1]–

системи за управљање базама података проширени механизмима и

језиком за опис дистрибуције шеме базе података и репликације

података по серверима, а такође и елементима који омогућавају

симултано коришћење и ажурирање података, дистрибуираних на

различите сервере базе података. Треба да омогућавају реализацију

глобалних трансакција, закључавања, репликације, опоравка базе

података.

Пројектовање дистрибуције информационог система састоји се у

фазама: стратегија, анализа и пројектовање. Резултат пројектовања

су документи:

1. Спецификација дистрибуција апликација по типовима

локација – дистрибуциона шема апликација

2. Спецификација дистрибуције базе података по типовима

локација – дистрибуциона шема базе података

3. Спецификација репликације података у дистрибуираној бази

података – репликациона шема базе података.

Дистрибуциона шема базе података – укључује тзв. „Чисту

дистрибуцију“ шеме базе података, где поједини делови базе

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

30

података на појединим локацијама немају редундансу (понављање

података, односно структуре). Чиста дистрибуција се постиже

фрагментацијом шеме базе података. Идеја увођења фрагментације

шеме базе података је у томе да се изврши партиционисање шеме

базе података, које ће представљати локалне базе података.

Партиционисањем се добија фрагментациона шема базе података.

Распоређивањем фрагмената шеме базе података на типове локација

добија се дистрибуциона шема базе података. Постоје следеће врсте

фрагментација:

1. Вертикална (одређен број колона табеле чува се у једној

фрагментираној бази података, други скуп колона у другој

фрагментираној бази).

2. Хоризонтална – записи се према неком критеријуму

разврставања чувају у различитим базама података исте

структуре табела.

3. Комбинована (хоризонтално-вертикална).

LITERATURA

[1] Mogin Pavle, Lukovic Ivan, Govedarica Miro: “Principi projektovanja

baza podataka”, Fakultet tehničkih nauka, Novi Sad, 2000.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

31

3.2. REŠEN PRIMERI

3.2.1. HORIZONTALNA I VERTIKALNA PARTICIJA BAZE

PODATAKA

ZADATAK Data je baza podataka Banka.mdb i tabela Klijent.

1. Kreirati horizontalno (prema drzavljanstvu) i vertikalno (licni podaci i finansijski

podaci) particionisane baze podataka.

2. Transformisati baze podataka u MS SQL Server.

3. Realizovati Windows aplikaciju za unos podataka u sve baze podataka.

4. Realizovati tabelarni prikaz objedinjenih podataka iz horizontalno particionisanih

baza podataka.

KREIRANJE PARTICIONISANIH BAZA PODATAKA

Particionisane baze podataka su baze podataka nastale na osnovu

osnovne baze podataka:

1. Vertikalnom particijom, za neku tabelu u bazi podataka se

pojedine kolone prebacuju u drugu bazu podataka, pri čemu

ostaje isti primarni ključ. Dobijamo 2 ili više drugih baza

podataka sa tabelama koji se isto zovu, ali imaju različitu

strukturu, gde im je zajednički jedino primarni ključ. U ovom

primeru, to je podela ličnih i finansijskih podataka. Znači,

imaćemo: BankaLičniPodaci.mdb (mdf) i

BankaFinansijskiPodaci.mdb

2. Horizontalnom particijom kreiramo druge baze podataka

identične strukture tabela, samo što se, prilikom upisa u bazu

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

32

podataka, podaci „razvrstavaju“ tako da dobijamo različite zapise

(slogove) u različitim bazama podataka. U ovom slučaju,

imaćemo bazu podataka za klijentima iz Srbije i posebnu bazu

podataka sa klijentima iz inostranstva. Znači, imaćemo:

BankaKlijentiSrbija.mdb i BankaKlijentiInostranstvo.mdb.

KORISNIČKI INTERFEJS PROGRAMA

Unos podataka

Tabelarni prikaz podataka

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

33

PROGRAMSKI KOD KORISNIČKOG INTERFEJSA: using System.Data.SqlClient; // using DataInteropUtils; using GeneralUtils; using SqlDBUtils; namespace DISProgram { public partial class Form1 : Form { //ATRIBUTI clsSqlKonekcija objKonekcija;

//HORIZONTALNO PARTICIONISANE clsSqlKonekcija objKonekcijaSRP; clsSqlKonekcija objKonekcijaNEM; //NASE PROCEDURE private void OtvoriKonekciju(string NazivRacunara, string NazivBaze) { // KONEKCIJA ZA POCETNU objKonekcija = new clsSqlKonekcija(NazivRacunara, "", NazivBaze); objKonekcijaSRP = new clsSqlKonekcija(NazivRacunara, "", NazivBaze); objKonekcijaNEM = new clsSqlKonekcija(NazivRacunara, "", NazivBaze); bool uspeh = objKonekcija.OtvoriKonekciju(); // bool uspehSRP = objKonekcijaSRP.OtvoriKonekciju(); // bool uspehNEM = objKonekcijaNEM.OtvoriKonekciju(); } // IZDVAJANJE PODATAKA IZ TABELE private System.Data.DataSet IzdvojPodatke(clsSqlKonekcija Konekcija, string NazivTabele, string SelectUpit) { clsSqlTabela objTabela = new clsSqlTabela(Konekcija, NazivTabele); System.Data.DataSet dsPodaci = objTabela.DajPodatke(SelectUpit); return dsPodaci; } private void NapuniGrid(DataGridView dgv, System.Data.DataSet ds) {

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

34

// povezivanje grida sa datasetom dgv.DataSource = ds.Tables[0]; dgv.Refresh(); } private int DodajKlijentaUBazu(string NazivBaze, string NazivSqlInstance) { int brojslogova = 0; SqlConnection Veza = new SqlConnection("Data Source=" + NazivSqlInstance + ";Initial Catalog=" + NazivBaze + ";Integrated Security=True"); Veza.Open();

SqlCommand Komanda = new SqlCommand("DodajNovogKlijenta", Veza); Komanda.CommandType = CommandType.StoredProcedure; Komanda.Parameters.Add("@JMBG", SqlDbType.NVarChar).Value = txtJMBG.Text; Komanda.Parameters.Add("@Prezime", SqlDbType.NVarChar).Value = txtPrezime.Text; Komanda.Parameters.Add("@Ime", SqlDbType.NVarChar).Value = txtIme.Text; Komanda.Parameters.Add("@DatumUpisa", SqlDbType.NVarChar).Value = DTPDatumUpisa.Text; Komanda.Parameters.Add("@GodinaRodjenja", SqlDbType.NVarChar).Value = txtGR.Text; Komanda.Parameters.Add("@MestoStanovanja", SqlDbType.NVarChar).Value = txtMS.Text; Komanda.Parameters.Add("@AdresaStanovanja", SqlDbType.NVarChar).Value = txtAS.Text; Komanda.Parameters.Add("@Drzavljanstvo", SqlDbType.NVarChar).Value = cmbDrzavljanstvo.Text; Komanda.Parameters.Add("@BrojOtvorenihRacuna", SqlDbType.SmallInt).Value = int.Parse(txtBOR.Text); Komanda.Parameters.Add("@MesecniProsekPrimanja", SqlDbType.Real).Value = Single.Parse(txtMPP.Text); if (RBDA.Checked) { Komanda.Parameters.Add("@RedovnaPrimanja", SqlDbType.Bit).Value = 1; } else { Komanda.Parameters.Add("@RedovnaPrimanja", SqlDbType.Bit).Value = 0; } brojslogova = Komanda.ExecuteNonQuery(); Veza.Close(); Veza.Dispose(); return brojslogova; } private System.Data.DataSet SpojPodatke(System.Data.DataSet ds1, System.Data.DataSet ds2) { System.Data.DataSet dsZajedno; dsZajedno = ds1.Copy();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

35

dsZajedno.Merge(ds2); return dsZajedno; } //KONSTRUKTOR public Form1() { InitializeComponent(); }

//DOGAĐAJI private void btnSnimi_Click(object sender, EventArgs e) { //--------------------------pocetna baza int brojslogova = DodajKlijentaUBazu("DISBankaSQL", "29-11"); if (brojslogova > 0) { MessageBox.Show("Uspesno dodavanje u Osnovnu bazu podataka!"); } else { MessageBox.Show("Neuspeh dodavanja u Osnovnu bazu podataka!"); } switch (cmbDrzavljanstvo.Text) { case "SRPSKO": //------------------------BSC Horizontalna Particija int brojslogovasrp = DodajKlijentaUBazu("DISBankaSrbijaSQL", "29-11"); if (brojslogovasrp > 0) { MessageBox.Show("Uspesno dodavanje u Srpsku bazu podataka!"); } else { MessageBox.Show("Neuspeh dodavanja u Srpsku bazu podataka! "); } break; case "NEMACKO": int brojslogovanem = DodajKlijentaUBazu("DISBankaInostranstvoSQL", "29-11");

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

36

if (brojslogovanem > 0) { MessageBox.Show("Uspesno dodavanje u Inostranu bazu podataka!"); } else { MessageBox.Show("Neuspeh dodavanja u Inostranu bazu podataka! "); } break;

} } private void btnSVIPocetna_Click(object sender, EventArgs e) { OtvoriKonekciju("29-11", "DISBankaSQL"); System.Data.DataSet dsPodaciIzTabele = IzdvojPodatke(objKonekcija, "Klijent", "select * from Klijent"); NapuniGrid(dgvKlijenti, dsPodaciIzTabele); } private void btnSVISrpsko_Click(object sender, EventArgs e) { OtvoriKonekciju("29-11", "DISBankaSrbijaSQL"); System.Data.DataSet dsPodaciIzTabele = IzdvojPodatke(objKonekcijaSRP, "Klijent", "select * from Klijent"); NapuniGrid(dgvKlijenti, dsPodaciIzTabele); } private void btnSVINemacko_Click(object sender, EventArgs e) { OtvoriKonekciju("29-11", "DISBankaInostranstvoSQL"); System.Data.DataSet dsPodaciIzTabele = IzdvojPodatke(objKonekcijaNEM, "Klijent", "select * from Klijent"); NapuniGrid(dgvKlijenti, dsPodaciIzTabele); } private void btnObjedinjeno_Click(object sender, EventArgs e) { System.Data.DataSet dsSRP; System.Data.DataSet dsNEM; System.Data.DataSet dsZAJEDNO; OtvoriKonekciju("29-11", "DISBankaSrbijaSQL"); dsSRP = IzdvojPodatke(objKonekcijaSRP, "Klijent", "select * from Klijent"); OtvoriKonekciju("29-11", "DISBankaInostranstvoSQL"); dsNEM = IzdvojPodatke(objKonekcijaNEM, "Klijent", "select * from Klijent"); dsZAJEDNO = SpojPodatke(dsSRP, dsNEM); NapuniGrid(dgvZajedno, dsZAJEDNO); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

37

3.2.2. KATALOG DISTRIBUIRANE BAZE PODATAKA Katalog distribuirane baze podataka predstavlja zapis o lokacijama i karakteristikama pojedinih baza podataka koje predstavljaju rezervnu kopiju ili particiju (horizontalnu ili vertikalnu) osnovne baze podataka. ZADATAK: Realizovati istovremeno snimanje podataka u više baza podataka, čije su lokacije i karakteristike zabeležene u katalogu distribuirane baze podataka. BAZA PODATAKA Katalog lokacija - Katalog.mdf

Osnovna baza podataka – Fakultet.mdf

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

38

SQL skript za kreiranje baze podataka KATALOG

USE [master]

GO

CREATE DATABASE [KatalogDIS]

GO

USE [KatalogDIS]

GO

CREATE TABLE [dbo].[Lokacija](

[IDLokacije] [int] IDENTITY(1,1) NOT NULL,

[StringKonekcije] [nvarchar](100) NOT NULL,

[TipLokacije] [nvarchar](50) NOT NULL,

[Segment] [nvarchar](50) NOT NULL

)

GO

ALTER TABLE [dbo].[Lokacija]

ADD CONSTRAINT [PK_Lokacija] PRIMARY KEY CLUSTERED

(

[IDLokacije] ASC

)

GO

CREATE TABLE [dbo].[Dnevnik](

[Id] [int] IDENTITY(1,1) NOT NULL,

[IdLokacije] [int] NOT NULL,

[DatumVremeTr] [datetime] NOT NULL,

[Uspeh] [bit] NOT NULL

)

GO

ALTER TABLE [dbo].[Dnevnik]

ADD CONSTRAINT [PK_Dnevnik] PRIMARY KEY CLUSTERED

(

[Id] ASC

)

GO

ALTER TABLE [dbo].[Dnevnik]

ADD CONSTRAINT [FK_Dnevnik_Lokacija] FOREIGN KEY ([IdLokacije])

REFERENCES [dbo].[Lokacija] ([IDLokacije])

ON UPDATE CASCADE

GO

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

39

SQL skript za kreiranje osnovne baze podataka FAKULTET

USE [master]

GO

CREATE DATABASE [FakultetDIS]

GO

USE [FakultetDIS]

GO

CREATE TABLE [dbo].[Student](

[JMBG] [char](13) NOT NULL,

[Prezime] [nvarchar](40) NOT NULL,

[Ime] [nvarchar](40) NOT NULL,

[Smer] [nvarchar](100) NOT NULL,

[GodinaStudija] [int] NOT NULL

)

GO

ALTER TABLE [dbo].[Student]

ADD CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED

(

[JMBG] ASC

)

GO

Koristeci isti SQL skript, kreirana je baza podataka FakultetBekap,

FakultetLic (sa licnim podacima), FakultetStud (sa podacima o

studiranju).

Podaci o kreiranim bazama podataka unete su u Katalog.

Kreiran je projekat tipa Windows aplikacije, u kojem je kreirana klasa

clsStudent, koja ce biti koriscena za preuzimanje podataka sa

korisnickog interfejsa:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

40

namespace Katalog { public class clsStudent { private string pJMBG; private string pPrezime; private string pIme; private string pSmer; private int pGodinaStudija; public string JMBG {

get { return pJMBG; } set { pJMBG = value; } } public string Prezime { get { return pPrezime; } set { pPrezime = value; } } public string Ime { get { return pIme; } set { pIme = value; } } public string Smer { get { return pSmer; } set { pSmer = value; } } public int GodinaStudija { get { return pGodinaStudija; } set { pGodinaStudija = value; } } } }

Kreiran je korisnicki interfejs.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

41

PROGRAMSKI KOD KORISNIČKOG INTERFEJSA:

using System.Data.SqlClient; namespace Katalog { public partial class frmUnos : Form { // ATRIBUTI string StringKonekcijeKataloga = "Data Source=BUBILIS; Initial Catalog=KatalogDIS; Integrated Security=True"; string StringKonekcijeOsnovna = "Data Source=BUBILIS; Initial Catalog=FakultetDIS; Integrated Security=True"; string StringKonekcijeLicni = "Data Source=BUBILIS; Initial Catalog=FakultetDISlic; Integrated Security=True"; string StringKonekcijeStudije = "Data Source=BUBILIS; Initial Catalog=FakultetDISstud; Integrated Security=True"; string StringKonekcijeBekap = "Data Source=BUBILIS; Initial Catalog=FakultetDISbekap; Integrated Security=True"; // konstruktor public frmUnos() { InitializeComponent(); } // **** NASE PROCEDURE

private void IsprazniKontrole() { txtJMBG.Text = ""; txtPrezime.Text = "";

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

42

txtIme.Text = ""; txtSmer.Text = ""; txtGodinaStudija.Text = ""; } private int SnimiDnevnik(string IdLokacije, int uspeh) { int brojzapisasnimljen = 0; // konektovanje na bazu SqlConnection Veza = new SqlConnection(StringKonekcijeKataloga); Veza.Open();

// snimanje podataka String strSQL = ""; string VremeSad = DateTime.Now.ToString(); strSQL = "Insert into Dnevnik(IdLokacije, DatumVremeTr, uspeh) values (" + IdLokacije + ",'" + VremeSad + "'," + uspeh + ")"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); brojzapisasnimljen = Komanda.ExecuteNonQuery(); // diskonektovanje sa baze Veza.Close(); Veza.Dispose(); return brojzapisasnimljen; } private int SnimiPodatke(clsStudent noviStudent) { int UkupnoSnimljeno = 0; // konektovanje na bazu SqlConnection Veza = new SqlConnection(StringKonekcijeKataloga); Veza.Open(); String strSQL; strSQL = "Select * from Lokacija"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); while (dr.Read()) { string IDLokacije = dr["IdLokacije"].ToString(); string StringKonekcije = dr["StringKonekcije"].ToString(); string tip =dr["TipLokacije"].ToString(); string segment = dr["Segment"].ToString(); try { int i = SnimiStudenta(noviStudent, StringKonekcije, tip, segment); UkupnoSnimljeno = UkupnoSnimljeno + i; SnimiDnevnik(IDLokacije, 1); } catch (Exception ex) {

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

43

SnimiDnevnik(IDLokacije, 0); } } // diskonektovanje sa baze dr.Close(); Veza.Close(); Veza.Dispose(); return UkupnoSnimljeno;

} private int SnimiStudenta(clsStudent noviStudent, string StringKonekcije, string tip, string segment) { int brojslogova = 0; // konektovanje na bazu SqlConnection Veza = new SqlConnection(StringKonekcije); Veza.Open(); // snimanje podataka String strSQL = ""; switch (tip) { case "osnovna": strSQL = "Insert into Student(JMBG, Prezime, Ime, Smer, GodinaStudija) values ('" + noviStudent.JMBG + "', '" + noviStudent.Prezime + "', '" + noviStudent.Ime + "','" + noviStudent.Smer + "', " + noviStudent.GodinaStudija.ToString() + ")"; break; case "verpart": if (segment.Equals("licni")) { strSQL = "Insert into Student(JMBG, Prezime, Ime) values ('" + noviStudent.JMBG + "', '" + noviStudent.Prezime + "', '" + noviStudent.Ime + "')"; } else { strSQL = "Insert into Student(JMBG, Smer, GodinaStudija) values ('" + noviStudent.JMBG + "', '" + noviStudent.Smer + "', " + noviStudent.GodinaStudija.ToString() + ")"; } break; case "horpart": // TO DO break; } // KRAJ SWITCH SqlCommand Komanda = new SqlCommand(strSQL, Veza); brojslogova = Komanda.ExecuteNonQuery();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

44

// diskonektovanje sa baze Veza.Close(); Veza.Dispose(); return brojslogova; } private DataTable UcitajSve(string StringKonekcije) { DataTable TabelaPodataka = new DataTable(); // konekcija na bazu

SqlConnection Veza = new SqlConnection(StringKonekcije); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select * from Student"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows) { TabelaPodataka.Load(dr); } dr.Close(); Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private void PrikaziPodatke(DataTable TabelaPodataka) { dgvStudenti.DataSource = TabelaPodataka; dgvStudenti.Refresh(); } // dogadjaji private void btnUnos_Click(object sender, EventArgs e) { IsprazniKontrole(); txtJMBG.Focus(); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

45

private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); } private void btnPotvrdi_Click(object sender, EventArgs e) { clsStudent objNoviStudent = new clsStudent (); objNoviStudent.JMBG = txtJMBG.Text; objNoviStudent.Prezime = txtPrezime.Text; objNoviStudent.Ime = txtIme.Text; objNoviStudent.Smer = txtSmer.Text;

objNoviStudent.GodinaStudija = int.Parse(txtGodinaStudija.Text); try { int brojSlogova=SnimiPodatke(objNoviStudent); MessageBox.Show("Snimljeno je:" + brojSlogova.ToString() + " slogova."); PrikaziPodatke(UcitajSve(StringKonekcijeOsnovna)); } catch (Exception ex) { MessageBox.Show("greska:" + ex.Message.ToString()); } } private void btnOsnovnaBaza_Click(object sender, EventArgs e) { PrikaziPodatke(UcitajSve(StringKonekcijeOsnovna)); } private void btnLicniPodaci_Click(object sender, EventArgs e) { PrikaziPodatke(UcitajSve(StringKonekcijeLicni)); } private void btnStudijePodaci_Click(object sender, EventArgs e) { PrikaziPodatke(UcitajSve(StringKonekcijeStudije)); } private void btnBekap_Click(object sender, EventArgs e) { PrikaziPodatke(UcitajSve(StringKonekcijeBekap)); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

46

3.2.3. MASTER DETAIL, DISTRIBUIRANE TRANSAKCIJE I XML

ZADATAK:

Realizovati unos podataka na formi tipa master-detail, tako sto ce se

snimiti privremeno zaglavlje u tabelu sa zaglavljem, a podaci o

stavkama snimati u pomocnu privremenu tabelu. Prilikom unosa

podataka koristi se XML fajl sa podacima potrebnim za unos podataka.

Nakon završetka unosa podataka, u okviru glavnog tastera za snimanje

celine, podatke snimiti u glavnu i bekap bazu podataka, a isprazniti

pomoćnu bazu podataka. Sve izvršavati u okviru transakcija nad

pojedinačnim bazama podataka (s obzirom da svaka ima odnos master-

detail), a zatim i distribuiranu transakciju u okviru TransactionScope (na

raspolaganju je od .Net framework 4.5 verzije) objekta, kojim se

objedinjuju transakcije nad više različitih baza podataka.

U okviru tabelarnog prikaza, izborom stavke gornjeg grida, u donjem

gridu se prikazuju podaci o stavkama za odgovarajuce zaglavlje. U

okviru tabelarnog prikaza realizovati i filtriranje i snimanje slozenog XML

fajla tipa master-detail.

BAZA PODATAKA

Osnovna baza podataka - Prodavnica.mdf

SQL skript za kreiranje osnovne baze podataka

create database ProdavnicaDIS6CAS

go

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

47

use ProdavnicaDIS6CAS

go

create table Racun (

BrojRacuna varchar(50) not null,

DatumRacuna datetime not null,

UkupanIznos money not null,

constraint PK_RACUN primary key nonclustered (BrojRacuna)

)

go

create table StavkaRacuna (

BrojRacuna varchar(50) not null,

SifraRobe varchar(50) not null,

Kolicina int not null,

CenaJM money null,

constraint PK_STAVKARACUNA primary key nonclustered (BrojRacuna, SifraRobe)

)

go

create index "pripada_FK" on StavkaRacuna (

BrojRacuna ASC

)

go

alter table StavkaRacuna

add constraint FK_Sadrzi foreign key (BrojRacuna)

references Racun (BrojRacuna);

go

CREATE PROCEDURE DajRacune

AS

BEGIN

select * from Racun

END

go

CREATE PROCEDURE DodajNoviRacun(

@BrojRacuna varchar(50),

@DatumRacuna datetime,

@UkupanIznos money

)

AS

BEGIN

insert into Racun(BrojRacuna, DatumRacuna, UkupanIznos) values (@BrojRacuna,

@DatumRacuna, @UkupanIznos)

END

go

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

48

CREATE PROCEDURE DajStavkeRacuna(

@BrojRacuna varchar(50)

)

AS

BEGIN

select * from StavkaRacuna where BrojRacuna=@BrojRacuna

END

go

CREATE PROCEDURE DodajNovuStavku(

@BrojRacuna varchar(50),

@SifraRobe varchar(50),

@Kolicina int,

@CenaJM money

)

AS

BEGIN

insert into StavkaRacuna(BrojRacuna, SifraRobe, Kolicina, CenaJM) values (@BrojRacuna,

@SifraRobe, @Kolicina, @CenaJM)

END

go

Koristeći isti SQL skript, kreirana je i ProdavnicaTEMP.mdf (privremena

baza), kao i ProdavnicaBEKAP.mdf (rezervna kopija baze podataka).

XML FAJL SA PODACIMA O ROBI – Roba.XML

<?xml version="1.0" standalone="yes"?>

<SpisakRobe>

<Roba>

<Sifra>1</Sifra>

<Naziv>Jabuke</Naziv>

</Roba>

<Roba>

<Sifra>2</Sifra>

<Naziv>Kruske</Naziv>

</Roba>

<Roba>

<Sifra>3</Sifra>

<Naziv>Lubenice</Naziv>

</Roba>

<Roba>

<Sifra>5</Sifra>

<Naziv>Sok</Naziv>

</Roba>

<Roba>

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

49

<Sifra>4</Sifra>

<Naziv>Sveska</Naziv>

</Roba>

</SpisakRobe>

KORISNIČKI INTERFEJS

Prva kartica – prikaz podataka u DataGrid-u iz XML fajla

Druga kartica – unos podataka

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

50

Treca kartica – tabelarni prikaz tipa master-detail sa filtriranjem

Izvorni kod korisnickog interfejsa:

// using System.Data.SqlClient; using System.Xml; // FRAMEWORK 4.5 //using System.Transactions;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

51

namespace KIprodavnica { public partial class frmRacun : Form { // atributi Single UkupanIznos = 0; SqlConnection VezaTemp; string ConnStringTemp="Data Source=29-01; Initial Catalog=ProdavnicaTemp; Integrated Security=True;"; SqlConnection VezaGlavna;

string ConnStringGlavna = "Data Source=29-01; Initial Catalog=ProdavnicaDIS6cas; Integrated Security=True;"; SqlConnection VezaBekap; string ConnStringBekap = "Data Source=29-01; Initial Catalog=ProdavnicaBekap; Integrated Security=True;"; string DanasnjiDatum; DataTable TabelaPodataka; // ZA TABELARNI DataTable TabelaZaglavlje; DataTable TabelaStavke; bool kliknuto; // ZA SIFARNIK ROBE DataSet dsRoba; bool novaroba; // konstruktor public frmRacun() { InitializeComponent(); } // privatne NASE metode private void ObrisiKontrole() { txtBrojRacuna.Text = ""; lblDatumRacuna.Text = ""; ObrisiKontroleStavke(); } private void ObrisiKontroleStavke() { txtSifraRobe.Text = ""; txtCenaJM.Text = ""; txtKolicina.Text = ""; txtNazivRobe.Text = "";

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

52

} private void PostaviDanasnjiDatum() { lblDatumRacuna.Text = DateTime.Now.Day.ToString() + "." + DateTime.Now.Month.ToString() + "." + DateTime.Now.Year.ToString() + "."; } private DataTable UcitajRacune() { // PREUZIMANJE PODATAKA

TabelaZaglavlje.Clear(); try { // PREUZIMANJE PODATAKA // otvaranje konekcije // preuzimanje podataka u dr SqlCommand KomandaGrid = new SqlCommand("select * from Racun", VezaGlavna); SqlDataReader dr = KomandaGrid.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows) { TabelaZaglavlje.Load(dr); } else { } } catch (Exception exGrid) { string greskagrid = exGrid.Message.ToString(); MessageBox.Show("greska u gridu:" + greskagrid); } return TabelaZaglavlje; } private void PrikaziSveRacune() { DataTable Tabela = UcitajRacune(); // POVEZIVANJE GRIDA SA PODACIMA dgvRacuni.DataSource = Tabela; dgvRacuni.Refresh(); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

53

private void PrikaziPodatkeUGridu(DataGridView grid, DataTable Podaci) { grid.DataSource = Podaci; grid.Refresh(); } private DataTable UcitajRacunZaBrojRacuna(string brojracuna) { // PRIKAZIVANJE PODATAKA U GRIDU

// PREUZIMANJE PODATAKA TabelaZaglavlje.Clear(); try { // PREUZIMANJE PODATAKA // otvaranje konekcije // preuzimanje podataka u dr SqlCommand KomandaGrid = new SqlCommand("select * from Racun where BrojRacuna='" + brojracuna + "'", VezaGlavna); SqlDataReader dr = KomandaGrid.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows) { TabelaZaglavlje.Load(dr); } else { } } catch (Exception exGrid) { string greskagrid = exGrid.Message.ToString(); MessageBox.Show("greska u gridu:" + greskagrid); } return TabelaZaglavlje; } private void PrikaziRacunePoBrojuRacuna(string brojracuna) { DataTable Tabela = UcitajRacunZaBrojRacuna(brojracuna); // POVEZIVANJE GRIDA SA PODACIMA dgvRacuni.DataSource = Tabela; dgvRacuni.Refresh(); } private DataTable UcitajStavkeRacuna(string brojracuna)

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

54

{ TabelaStavke.Clear(); try { // preuzimanje podataka u dr SqlCommand KomandaGrid = new SqlCommand("select * from StavkaRacuna where BrojRacuna='" + brojracuna + "'", VezaGlavna); SqlDataReader dr = KomandaGrid.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows)

{ TabelaStavke.Load(dr); } else { MessageBox.Show("Nema unetih stavki!"); dr.Close(); } } catch (Exception exGrid) { string greskagrid = exGrid.Message.ToString(); MessageBox.Show("greska u gridu:" + greskagrid); } return TabelaStavke; } private void PrikaziStavkeRacuna(string brojracuna) { DataTable Tabela = UcitajStavkeRacuna(brojracuna); // POVEZIVANJE GRIDA SA PODACIMA dgvStavkeRacunaPretraga.DataSource = Tabela; dgvStavkeRacunaPretraga.Refresh(); } private string DajNazivRobe(string sifrarobe) { string naziv = ""; for (int i = 0; i < dsRoba.Tables[0].Rows.Count; i++) { if (dsRoba.Tables[0].Rows[i].ItemArray[0].ToString().Equals(sifrarobe)) { naziv = dsRoba.Tables[0].Rows[i].ItemArray[1].ToString(); } }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

55

return naziv; } private bool PostojiRoba(string sifrarobe) { bool postoji = false; for (int i = 0; i < dsRoba.Tables[0].Rows.Count; i++) { if (dsRoba.Tables[0].Rows[i].ItemArray[0].ToString().Equals(sifrarobe)) { postoji = true;

} } return postoji; } // ********************dogadjaji // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% private void btnNoviRacun_Click(object sender, EventArgs e) { // ZADAJEMO INICIJALNE VREDNOSTI ObrisiKontrole(); novaroba = false; txtNazivRobe.Enabled = false; PostaviDanasnjiDatum(); lblIznosRacuna.Text = "0"; // // ******************************************** // snimanje u temp bazu - RACUN // ********************************************* int brslogova = 0; try { SqlCommand Komanda = new SqlCommand("insert into Racun(BrojRacuna, DatumRacuna, UkupanIznos) values ('TEMP'," + DanasnjiDatum + ",0 )", VezaTemp); brslogova = Komanda.ExecuteNonQuery(); } catch (Exception ex) { string greska = ex.Message.ToString(); } }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

56

private void frmRacun_Load(object sender, EventArgs e) { ObrisiKontrole(); // OTVARANJE TEMPORARY BAZE VezaTemp = new SqlConnection(ConnStringTemp); VezaTemp.Open(); // OTVARANJE GLAVNE BAZE VezaGlavna = new SqlConnection(ConnStringGlavna); VezaGlavna.Open(); // OTVARANJE BEKAP BAZE

VezaBekap = new SqlConnection(ConnStringBekap); VezaBekap.Open(); DanasnjiDatum = "'" + DateTime.Now.Month.ToString() + "/" + DateTime.Now.Day.ToString() + "/" + DateTime.Now.Year.ToString() + "'"; // grid TabelaZaglavlje = new DataTable(); TabelaStavke = new DataTable(); // sifarnik dsRoba = new DataSet(); dsRoba.ReadXml("Roba.XML"); dgvRoba.DataSource = dsRoba.Tables[0]; dgvRoba.Refresh(); } private void btnNovaStavka_Click(object sender, EventArgs e) { ObrisiKontroleStavke(); novaroba = false; txtNazivRobe.Enabled = false; } private void btnPotvrdiStavku_Click(object sender, EventArgs e) { // **************** // ***preuzimanje iz KI //************************** // racun //string BrojRacuna = txtBrojRacuna.Text; // // stavka string SifraRobe = txtSifraRobe.Text; string Kolicina = txtKolicina.Text; string CenaJM = txtCenaJM.Text;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

57

// azuriranje ukupnog iznosa UkupanIznos = UkupanIznos + Single.Parse(CenaJM) * Single.Parse(Kolicina); lblIznosRacuna.Text = UkupanIznos.ToString (); // ************************************** // - snimanje stavke // **************************************

int brslogovastavka = 0; try { SqlCommand Komanda = new SqlCommand("insert into StavkaRacuna(BrojRacuna, SifraRobe, Kolicina, CenaJM) values ('TEMP', '" + SifraRobe + "'," + Kolicina + "," + CenaJM + ")", VezaTemp); brslogovastavka = Komanda.ExecuteNonQuery(); } catch (Exception ex) { string greska = ex.Message.ToString(); } // ***************** // * prikazivanje podataka u gridu // ************************** // PREUZIMANJE PODATAKA TabelaPodataka = new DataTable(); try { // PREUZIMANJE PODATAKA // otvaranje konekcije // preuzimanje podataka u dr SqlCommand Komanda = new SqlCommand("select SifraRobe, Kolicina, CenaJM from StavkaRacuna where BrojRacuna='TEMP'", VezaTemp); SqlDataReader dr = Komanda.ExecuteReader(); // PRIKAZIVANJE PODATAKA U GRIDU if (dr.HasRows) { TabelaPodataka.Load(dr); } else

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

58

{ } } catch (Exception ex) { string greska = ex.Message.ToString(); } // POVEZIVANJE GRIDA SA PODACIMA dgvStavkeRacuna.DataSource = TabelaPodataka; dgvStavkeRacuna.Refresh();

} private void frmRacun_FormClosing(object sender, FormClosingEventArgs e) { VezaTemp.Close(); VezaTemp.Dispose(); // VezaGlavna.Close(); VezaGlavna.Dispose(); // VezaBekap.Close(); VezaBekap.Dispose(); } private void btnSnimiRacun_Click(object sender, EventArgs e) { // Samo pocev od Framework 4.5 postoji TransactionScope //TransactionScope tsInstance = new TransactionScope(); //using (tsInstance) //{ // **************** SNIMANJE U GLAVNU BAZU // snimanje zaglavlja racuna SqlTransaction objTransakcijaGlavna = VezaGlavna.BeginTransaction(); int brojslogovaZag = 0; SqlCommand KomandaZag = new SqlCommand("insert into Racun(BrojRacuna, DatumRacuna, UkupanIznos) values ('" + txtBrojRacuna.Text + "'," + DanasnjiDatum + "," + UkupanIznos + ")", VezaGlavna); KomandaZag.Transaction = objTransakcijaGlavna; brojslogovaZag = KomandaZag.ExecuteNonQuery(); // snimanje stavki SqlCommand KomandaStG = new SqlCommand();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

59

KomandaStG.Connection = VezaGlavna; KomandaStG.Transaction = objTransakcijaGlavna; for (int i = 0; i < TabelaPodataka.Rows.Count; i++) { string SifraRobe = TabelaPodataka.Rows[i].ItemArray[0].ToString(); string Kolicina = TabelaPodataka.Rows[i].ItemArray[1].ToString(); string CenaJM = TabelaPodataka.Rows[i].ItemArray[2].ToString(); string Upit = "insert into StavkaRacuna(BrojRacuna, SifraRobe, Kolicina,

CenaJM) values ('" + txtBrojRacuna.Text + "', '" + SifraRobe + "'," + Kolicina + "," + CenaJM + ")"; KomandaStG.CommandText = Upit; int brslogovastavka = KomandaStG.ExecuteNonQuery(); } objTransakcijaGlavna.Commit(); // ********************* // SNIMANJE U BEKAP BAZU // snimanje zaglavlja racuna SqlTransaction objTransakcijaBekap = VezaBekap.BeginTransaction(); int brojslogovaBekap = 0; SqlCommand KomandaBekap = new SqlCommand("insert into Racun(BrojRacuna, DatumRacuna, UkupanIznos) values ('" + txtBrojRacuna.Text + "'," + DanasnjiDatum + "," + UkupanIznos + ")", VezaBekap); KomandaBekap.Transaction = objTransakcijaBekap; brojslogovaBekap = KomandaBekap.ExecuteNonQuery(); // snimanje stavki SqlCommand KomandaStBekap = new SqlCommand(); KomandaStBekap.Connection = VezaBekap; KomandaStBekap.Transaction = objTransakcijaBekap; for (int i = 0; i < TabelaPodataka.Rows.Count; i++) { string SifraRobe = TabelaPodataka.Rows[i].ItemArray[0].ToString(); string Kolicina = TabelaPodataka.Rows[i].ItemArray[1].ToString(); string CenaJM = TabelaPodataka.Rows[i].ItemArray[2].ToString();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

60

string Upit = "insert into StavkaRacuna(BrojRacuna, SifraRobe, Kolicina, CenaJM) values ('" + txtBrojRacuna.Text + "', '" + SifraRobe + "'," + Kolicina + "," + CenaJM + ")"; KomandaStBekap.CommandText = Upit; int brslogovastavka = KomandaStBekap.ExecuteNonQuery(); } objTransakcijaBekap.Commit();

// **************** BRISANJE TEMP BAZE *************** SqlTransaction objTransakcijaTemp = VezaTemp.BeginTransaction(); int brojslogovaStT = 0; SqlCommand KomandaStT = new SqlCommand("delete from StavkaRacuna where BrojRacuna='TEMP'", VezaTemp); KomandaStT.Transaction = objTransakcijaTemp; brojslogovaStT = KomandaStT.ExecuteNonQuery(); int brojslogovaZagT = 0; SqlCommand KomandaZagT = new SqlCommand("delete from Racun where BrojRacuna='TEMP'", VezaTemp); KomandaZagT.Transaction = objTransakcijaTemp; brojslogovaZagT = KomandaZagT.ExecuteNonQuery(); objTransakcijaTemp.Commit(); // ****************************************************** //} //tsInstance.Complete(); MessageBox.Show("USPESNO SNIMLJENI PODACI!"); } private void txtSifraRobe_Leave(object sender, EventArgs e) { // provera da li postoji bool postoji = PostojiRoba(txtSifraRobe.Text); if (postoji) { // ako postoji prikazi naziv string naziv = DajNazivRobe(txtSifraRobe.Text); txtNazivRobe.Enabled = false; txtNazivRobe.Text = naziv; novaroba = false;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

61

} else { // ako ne postoji, prikazi poruku i ponudi da doda novi txtNazivRobe.Text = ""; MessageBox.Show("Ne postoji roba sa datom sifrom! Mozete uneti novu!"); txtNazivRobe.Enabled = true; txtNazivRobe.Focus(); } } private void txtNazivRobe_Leave(object sender, EventArgs e)

{ if (novaroba) { DataRow red = dsRoba.Tables[0].NewRow(); red[0] = txtSifraRobe.Text; red[1] = txtNazivRobe.Text; dsRoba.Tables[0].Rows.Add(red); dsRoba.WriteXml("Roba.XML"); } } private void txtNazivRobe_KeyDown(object sender, KeyEventArgs e) { novaroba = true; } private void btnPrikaziSve_Click(object sender, EventArgs e) { //PrikaziSveRacune(); PrikaziPodatkeUGridu(dgvRacuni, UcitajRacune()); kliknuto = false; } private void btnFiltriraj_Click(object sender, EventArgs e) { kliknuto = false; PrikaziPodatkeUGridu(dgvRacuni, UcitajRacunZaBrojRacuna(txtFilter.Text)); } private void dgvRacuni_MouseDown(object sender, MouseEventArgs e) { kliknuto = true; } private void dgvRacuni_CurrentCellChanged(object sender, EventArgs e) { if (kliknuto) { // OCITAVANJE POZICIJE

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

62

int RedniBrojReda = dgvRacuni.CurrentCell.RowIndex; string ID = dgvRacuni.Rows[RedniBrojReda].Cells[0].Value.ToString(); // PrikaziStavkeRacuna(ID); } } private void btnSnimiXML_Click(object sender, EventArgs e) { XmlWriterSettings podesavanja = new XmlWriterSettings(); podesavanja.Indent = true;

XmlWriter writer = XmlWriter.Create("RacuniStavke.xml", podesavanja); writer.WriteStartDocument(); writer.WriteComment("Spisak racuna i stavki racuna!"); writer.WriteStartElement("Racuni"); DataTable TabelaRacuna = UcitajRacune(); for (int i = 0; i < TabelaRacuna.Rows.Count; i++) { // ZA SVAKI RACUN writer.WriteStartElement("Racun"); writer.WriteElementString("BrojRacuna", TabelaRacuna.Rows[i].ItemArray[0].ToString()); writer.WriteElementString("DatumRacuna", TabelaRacuna.Rows[i].ItemArray[1].ToString()); writer.WriteElementString("UkupanIznos", TabelaRacuna.Rows[i].ItemArray[2].ToString()); DataTable TabelaStavkiRacuna = UcitajStavkeRacuna(TabelaRacuna.Rows[i].ItemArray[0].ToString()); if (TabelaStavkiRacuna.Rows.Count > 0) // da li ima stavki racuna { for (int j = 0; j < TabelaStavkiRacuna.Rows.Count; j++) { // ZA SVAKU STAVKU RACUNA writer.WriteStartElement("StavkaRacuna"); writer.WriteElementString("BrojRacuna", TabelaStavkiRacuna.Rows[j].ItemArray[0].ToString()); writer.WriteElementString("SifraRobe", TabelaStavkiRacuna.Rows[j].ItemArray[1].ToString()); writer.WriteElementString("Kolicina", TabelaStavkiRacuna.Rows[j].ItemArray[2].ToString()); writer.WriteElementString("CenaJM", TabelaStavkiRacuna.Rows[j].ItemArray[3].ToString()); writer.WriteEndElement(); // za ucenika } // KRAJ CIKLUSA ZA STAVKU }// kraj IF ako ima stavki u racunu writer.WriteEndElement(); // za konkretnI RACUN

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

63

}// KRAJ CIKLUSA ZA RACUN writer.WriteEndElement(); // za racune writer.WriteEndDocument(); writer.Flush(); writer.Close(); MessageBox.Show("Snimljen slozeni XML!"); }

} }

REZULTUJUĆI SLOŽENI XML – tipa master-detail

<?xml version="1.0" encoding="utf-8"?> <!--Spisak racuna i stavki racuna!--> <Racuni> <Racun> <BrojRacuna>250/2014</BrojRacuna> <DatumRacuna>4/16/2014 12:00:00 AM</DatumRacuna> <UkupanIznos>190.0000</UkupanIznos> <StavkaRacuna> <BrojRacuna>250/2014</BrojRacuna> <SifraRobe>123</SifraRobe> <Kolicina>2</Kolicina> <CenaJM>50.0000</CenaJM> </StavkaRacuna> <StavkaRacuna> <BrojRacuna>250/2014</BrojRacuna> <SifraRobe>678</SifraRobe> <Kolicina>3</Kolicina> <CenaJM>30.0000</CenaJM> </StavkaRacuna> </Racun> <Racun> <BrojRacuna>55/2014</BrojRacuna> <DatumRacuna>4/30/2014 12:00:00 AM</DatumRacuna> <UkupanIznos>2520.0000</UkupanIznos> <StavkaRacuna> <BrojRacuna>55/2014</BrojRacuna>

<SifraRobe>1</SifraRobe> <Kolicina>3</Kolicina> <CenaJM>40.0000</CenaJM> </StavkaRacuna> <StavkaRacuna> <BrojRacuna>55/2014</BrojRacuna>

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

64

<SifraRobe>54</SifraRobe> <Kolicina>4</Kolicina> <CenaJM>600.0000</CenaJM> </StavkaRacuna> </Racun> </Racuni>

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

65

4. WEB APLIKACIJE, XML I WEB SERVISI

4.1. PERSONALIZOVANE WEB APLIKACIJE

ZADATAK:

Dat je SQL script za kreiranje baze podataka. Realizovati web aplikaciju

koja davati različite opcije u zavisnosti od profila prijavljenog korisnika

(personalizacija).

Realizovati formu za unos podataka, tako sto se koriste podaci iz druge

pomocne tabele koristeci drop down listu. Realizovati tabelarni prikaz sa

filtriranjem. Realizovati formu za izbor parametara stampe – spisak svih

ili filtriranje podataka prema nekom kriterijumu, a zatim omogućiti

ucitavanje printer-friendly stranice sa odgovarajućim podacima.

BAZA PODATAKA – Fakultet.mdf

SQL SKRIPT za kreiranje baze podataka

USE [master] GO CREATE DATABASE [Fakultet] GO USE [Fakultet] GO CREATE TABLE [dbo].[Smer]( [Id] [nvarchar](10) NOT NULL,

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

66

[Naziv] [nvarchar](50) NOT NULL, [NivoStudija] [char](3) NOT NULL ) GO ALTER TABLE [dbo].[Smer] ADD CONSTRAINT [PK_Smer] PRIMARY KEY CLUSTERED ( [Id] ASC ) GO

CREATE TABLE [dbo].[ProfilKorisnika]( [IdProfila] [nvarchar](10) NOT NULL, [NazivProfila] [nvarchar](50) NOT NULL ) GO ALTER TABLE [dbo].[ProfilKorisnika] ADD CONSTRAINT [PK_ProfilKorisnika] PRIMARY KEY CLUSTERED ( [IdProfila] ASC ) GO CREATE TABLE [dbo].[Korisnik]( [ID] [int] IDENTITY(1,1) NOT NULL, [Prezime] [nvarchar](40) NOT NULL, [Ime] [nvarchar](30) NOT NULL, [KorisnickoIme] [nvarchar](20) NOT NULL, [Sifra] [nvarchar](30) NOT NULL, [Email] [nvarchar](40) NOT NULL, [IdProfila] [nvarchar](10) NOT NULL ) GO ALTER TABLE [dbo].[Korisnik] ADD CONSTRAINT [PK_Korisnik] PRIMARY KEY CLUSTERED ( [ID] ASC ) GO CREATE TABLE [dbo].[Student]( [BrojIndeksa] [nvarchar](15) NOT NULL, [Prezime] [nvarchar](40) NOT NULL, [Ime] [nvarchar](30) NOT NULL, [Email] [nvarchar](40) NOT NULL, [IdSmera] [nvarchar](10) NOT NULL, [StanjeRacuna] [float] NULL ) GO ALTER TABLE [dbo].[Student] ADD CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

67

( [BrojIndeksa] ASC ) GO CREATE TABLE [dbo].[Uplata]( [IdUplate] [bigint] IDENTITY(1,1) NOT NULL, [DatumUplate] [datetime] NOT NULL, [IznosUplate] [float] NOT NULL, [BrojIndeksa] [nvarchar](15) NOT NULL ) GO

ALTER TABLE [dbo].[Uplata] ADD CONSTRAINT [PK_Uplata] PRIMARY KEY CLUSTERED ( [IdUplate] ASC ) GO ALTER TABLE [dbo].[Korisnik] ADD CONSTRAINT [FK_Korisnik_ProfilKorisnika] FOREIGN KEY([IdProfila]) REFERENCES [dbo].[ProfilKorisnika] ([IdProfila]) ON UPDATE CASCADE GO ALTER TABLE [dbo].[Student] ADD CONSTRAINT [FK_Student_Smer] FOREIGN KEY([IdSmera]) REFERENCES [dbo].[Smer] ([Id]) ON UPDATE CASCADE GO ALTER TABLE [dbo].[Uplata] ADD CONSTRAINT [FK_Uplata_Student] FOREIGN KEY([BrojIndeksa]) REFERENCES [dbo].[Student] ([BrojIndeksa]) ON UPDATE CASCADE GO

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

68

DETALJNIJI ZADATAK:

Pod profilom RACUNOVODSTVO:

Realizovati:

1. Formu za unos podataka o uplati studenta, koja istovremeno sa upisom

novog zapisa u tabelu Uplata, transakcijom azurira (menja) stanje racuna

u tabeli Student. Datum se bira iz Calendar kontrole. Broj indeksa se bira

iz combo box-a.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

69

NAPOMENA: Da bi prikazao Ime i prezime, na dogadjaju SelectedIndexChanged,

mora biti drop down list postavljen na AUTOPOST=TRUE, da bi ta procedura uopste

radila (reagovala).

2. Formu za tabelarni prikaz podataka sa filterom prema broju indeksa.

3. Formu za izbor parametara stampe – prikaz svih uplata ili filtrirani prikaz

uplata studenta ciji se broj indeksa bira iz drop down liste.

Sa ove forme se ucitavaju konkretne forme za prikaz printer friendly stranica.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

70

4. Printer-friendly stranica “SPISAK SVIH”

Printer-friendly stranica “FILTRIRANI PRIKAZ” se bira izborom parametra:

Rezultujuća printer-friendly stranica “FILTRIRANI PRIKAZ”

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

71

NAPOMENE O RAZMENI PODATAKA IZMEĐU ASPX STRANICA:

1. Razmena podataka između stranice za prijavu (Login) i stranice

sa osnovnim menijem (Welcome) je koristeći sesije.

KREIRANJE SESIJE I PROMENLJIVE U SESIJI: Session.Add("KorisnikImePrezime", ImePrezime);

Session.Add("StatusKorisnika", Status);

ČITANJE SESIJE: lblImePrezime.Text = Session["KorisnikImePrezime"].ToString();

2. Razmena podataka između stranice sa parametrima štampe I

stranice sa pripremom za štampu (“printer friendly”) je koristeći

parametre:

SLANJE: Response.Redirect("UplataStampaFilter.aspx?BrojIndeks

a=" + ddlBrojIndeksa.Text);

FORMIRA: http://localhost:1135/UplataStampaFilter.aspx?BrojIndeksa=2/14-14

CITANJE od strane druge stranice: string

BrojIndeksa=

Request.QueryString["BrojIndeksa"].ToString();

PROGRAMSKI KOD STRANICE ZA UNOS PODATAKA

// using System.Data.SqlClient; using System.Data; using System.Configuration; namespace FakultetInfo { public partial class UplataUnos : System.Web.UI.Page { // NASE PROCEDURE private void IsprazniKontrole() { ddlBrojIndeksa.Text = "izaberite..."; txtDatumUplate.Text = ""; txtIznosUplate.Text = ""; } private void NapuniCombo() {

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

72

// konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select BrojIndeksa from Student order by BrojIndeksa"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader();

// punjenje combo ddlBrojIndeksa.Items.Clear(); ddlBrojIndeksa.Items.Add("izaberite..."); while (dr.Read()) { ddlBrojIndeksa.Items.Add(dr["BrojIndeksa"].ToString()); } // diskonektovanje sa baze dr.Close(); Veza.Close(); Veza.Dispose(); } private string DajImePrezime(string BrojIndeksa) { string ImePrezime = ""; string strSQL = ""; SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select Ime + ' ' + Prezime as [ImePrezime] from Student where BrojIndeksa='" + BrojIndeksa + "'"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) { if (dr["ImePrezime"] != null) { ImePrezime = dr["ImePrezime"].ToString(); } } return ImePrezime; } private string DajStanjeRacuna(string BrojIndeksa) { String strStanjeRacuna = "0"; // konektovanje na bazu

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

73

SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQLPrikaz; strSQLPrikaz = "Select StanjeRacuna from Student where BrojIndeksa='" + BrojIndeksa + "'"; SqlCommand KomandaPrikaz = new SqlCommand(strSQLPrikaz, Veza); SqlDataReader drPrikaz = KomandaPrikaz.ExecuteReader();

// transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (drPrikaz.HasRows) { bool citanje = drPrikaz.Read(); strStanjeRacuna = drPrikaz["StanjeRacuna"].ToString(); } else { strStanjeRacuna = "0"; } Veza.Close(); Veza.Dispose(); return strStanjeRacuna; } private bool SnimiPodatke(clsUplata objNovaUplata) { bool uspeh = false; int brojslogovaUnos = 0; int brojslogovaIzmena = 0; // string BrojIndeksa = objNovaUplata.BrojIndeksa; // --------------------------------------------------------------------- // *****1.********* OCITAVANJE STANJA RACUNA IZ TABELE Student *********** // string strStanjeRacuna = DajStanjeRacuna(BrojIndeksa); //******************* konektovanje na bazu

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

74

SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // ------------------------------------------------------------------------ // *********** 2. OTVARANJE TRANSAKCIJE SqlTransaction objTransakcija = Veza.BeginTransaction();

// --------------------------------------------------------------------- // *****3.********* SNIMANJE UNOSA U TABELU Uplata *****************// // formatiranje za sql string Datum = "'" + objNovaUplata.DatumUplate.Month.ToString() + "/" + objNovaUplata.DatumUplate.Day.ToString() + "/" + objNovaUplata.DatumUplate.Year.ToString() + "'"; // snimanje podataka String strSQLUnos; // NE STAVLJAMO ID, JER JE IDENTITY, auto increment strSQLUnos = "Insert into Uplata (DatumUplate, IznosUplate, BrojIndeksa) values (" + Datum + ", " + objNovaUplata.Iznos + ", '" + BrojIndeksa + "')"; SqlCommand KomandaUnos = new SqlCommand(strSQLUnos, Veza); // dodeljivanje komande transakciji KomandaUnos.Transaction = objTransakcija; brojslogovaUnos = KomandaUnos.ExecuteNonQuery(); // --------------------------------------------------------------------- // ******4. ********* KREIRANJE NOVOG STANJA RACUNA ZA NAVEDENOG STUDENTA ********** // Single StanjeRacuna = 0; StanjeRacuna = Single.Parse(strStanjeRacuna) + Single.Parse(objNovaUplata.Iznos); // --------------------------------------------------------------------- // *****5.********* SNIMANJE IZMENE U TABELU Student *****************// // snimanje podataka String strSQLIzmena; // NE STAVLJAMO ID, JER JE IDENTITY, auto increment strSQLIzmena = "Update Student set StanjeRacuna=" + StanjeRacuna.ToString () + " where Student.BrojIndeksa='" + BrojIndeksa + "'"; SqlCommand KomandaIzmena = new SqlCommand(strSQLIzmena, Veza); // dodeljivanje komande transakciji KomandaIzmena.Transaction = objTransakcija; brojslogovaIzmena = KomandaIzmena.ExecuteNonQuery(); // ------------------------------------------------------------------------------------

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

75

// ******* 6. ***********IZVRSAVANJE TRANSAKCIJE *************************************** objTransakcija.Commit(); // --------------------------------------------------------------------- // *********7. *************** diskonektovanje sa baze ****************************// objTransakcija.Dispose(); Veza.Close(); Veza.Dispose();

int ukupnoslogova = brojslogovaUnos + brojslogovaIzmena; uspeh = (ukupnoslogova == 2); return uspeh; } // DOGADJAJI protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { NapuniCombo(); } } protected void ddlBrojIndeksa_TextChanged(object sender, EventArgs e) { } protected void ddlBrojIndeksa_SelectedIndexChanged(object sender, EventArgs e) { lblImePrezime.Text = DajImePrezime(ddlBrojIndeksa.Items[ddlBrojIndeksa.SelectedIndex].ToString()); } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { txtDatumUplate.Text = Calendar1.SelectedDate.Day.ToString() + "." + Calendar1.SelectedDate.Month.ToString() + "." + Calendar1.SelectedDate.Year.ToString() + "."; } protected void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); } protected void btnUnos_Click(object sender, EventArgs e) { clsUplata objUplata = new clsUplata();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

76

objUplata.BrojIndeksa = ddlBrojIndeksa.Text; objUplata.DatumUplate = Calendar1.SelectedDate; objUplata.Iznos = txtIznosUplate.Text; bool uspeh = SnimiPodatke(objUplata); string porukauspeha = ""; if (uspeh) { porukauspeha = "USPEH snimanja!"; } else {

porukauspeha = "NEUSPEH snimanja!"; }; //PORUKA O USPEHU lblStatus.Visible = true; lblStatus.Text = porukauspeha; // Msg box ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + porukauspeha + "');", true); } } }

PROGRAMSKI KOD STRANICE ZA TABELARNI PRIKAZ SA FILTEROM

// using System.Data.SqlClient; using System.Data; using System.Configuration; namespace FakultetInfo { public partial class UnosTabelarni : System.Web.UI.Page { private DataTable UcitajSveUplate() { DataTable TabelaPodataka = new DataTable(); // konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select CAST(Day(DatumUplate) as nvarchar(2)) + '.' + CAST(Month(DatumUplate) as nvarchar(2)) + '.' + CAST(Year(DatumUplate) as nvarchar(4)) + '.' as [Datum uplate], Student.BrojIndeksa as [Broj indeksa], Student.Prezime as [Prezime studenta], Student.Ime as [Ime studenta], IznosUplate as

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

77

Iznos from Uplata inner join student on Uplata.BrojIndeksa=Student.BrojIndeksa order by DatumUplate desc"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows)

{ TabelaPodataka.Load(dr); } dr.Close(); Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private DataTable UcitajUplatePoBrojuIndeksa(string BrojIndeksa) { DataTable TabelaPodataka = new DataTable(); // konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select CAST(Day(DatumUplate) as nvarchar(2)) + '.' + CAST(Month(DatumUplate) as nvarchar(2)) + '.' + CAST(Year(DatumUplate) as nvarchar(4)) + '.' as [Datum uplate], Student.BrojIndeksa as [Broj indeksa], Student.Prezime as [Prezime studenta], Student.Ime as [Ime studenta], IznosUplate as Iznos from Uplata inner join student on Uplata.BrojIndeksa=Student.BrojIndeksa where Uplata.BrojIndeksa='" + BrojIndeksa + "' order by DatumUplate desc"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows) { TabelaPodataka.Load(dr); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

78

dr.Close(); Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private void PrikaziPodatke(DataTable TabelaPodataka) { gvUplate.DataSource = TabelaPodataka; gvUplate.DataBind();

} protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { PrikaziPodatke(UcitajSveUplate()); } } protected void btnFilter_Click(object sender, EventArgs e) { PrikaziPodatke(UcitajUplatePoBrojuIndeksa(txtFilter.Text)); } protected void btnSvi_Click(object sender, EventArgs e) { txtFilter.Text = ""; PrikaziPodatke(UcitajSveUplate()); } } }

PROGRAMSKI KOD STRANICE ZA IZBOR PARAMETARA STAMPE

// using System.Data.SqlClient; using System.Data; using System.Configuration; namespace FakultetInfo { public partial class UplataStampaParametri : System.Web.UI.Page { private void NapuniCombo() { // konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString);

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

79

Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select BrojIndeksa from Student order by BrojIndeksa"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // punjenje combo ddlBrojIndeksa.Items.Clear(); ddlBrojIndeksa.Items.Add("izaberite...");

while (dr.Read()) { ddlBrojIndeksa.Items.Add(dr["BrojIndeksa"].ToString()); } // diskonektovanje sa baze dr.Close(); Veza.Close(); Veza.Dispose(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { NapuniCombo(); } } protected void btnPrikazi_Click(object sender, EventArgs e) { if (rdbVrsteStampe.SelectedIndex == 0) { Response.Redirect("UplataStampaSpisak.aspx"); } else { Response.Redirect("UplataStampaFilter.aspx?BrojIndeksa=" + ddlBrojIndeksa.Text); } } } }

PROGRAMSKI KOD Printer-friendly STRANICE “SPISAK SVIH”

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

80

using System.Data.SqlClient; using System.Data; using System.Configuration; namespace FakultetInfo { public partial class UplataStampaSpisak : System.Web.UI.Page { private DataTable UcitajSveUplate() { DataTable TabelaPodataka = new DataTable();

// konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select CAST(Day(DatumUplate) as nvarchar(2)) + '.' + CAST(Month(DatumUplate) as nvarchar(2)) + '.' + CAST(Year(DatumUplate) as nvarchar(4)) + '.' as [Datum uplate], Student.BrojIndeksa as [Broj indeksa], Student.Prezime as [Prezime studenta], Student.Ime as [Ime studenta], IznosUplate as Iznos from Uplata inner join student on Uplata.BrojIndeksa=Student.BrojIndeksa order by DatumUplate desc"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows) { TabelaPodataka.Load(dr); } dr.Close(); Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private void PrikaziPodatke(DataTable TabelaPodataka) { gvUplate.DataSource = TabelaPodataka; gvUplate.DataBind(); } protected void Page_Load(object sender, EventArgs e)

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

81

{ PrikaziPodatke(UcitajSveUplate() ); } } }

PROGRAMSKI KOD Printer-friendly STRANICE “FILTRIRANI PRIKAZ”

using System.Data.SqlClient; using System.Data; using System.Configuration; namespace FakultetInfo { public partial class UplataStampa : System.Web.UI.Page { // NASE PROCEDURE private string DajImePrezime(string BrojIndeksa) { string ImePrezime = ""; string strSQL = ""; SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select Ime + ' ' + Prezime as [ImePrezime] from Student where BrojIndeksa='" + BrojIndeksa + "'";

SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) { if (dr["ImePrezime"] != null) { ImePrezime = dr["ImePrezime"].ToString(); } } return ImePrezime; } private string DajStanjeRacuna(string BrojIndeksa) { string StanjeRacuna = ""; string strSQL = ""; SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select StanjeRacuna from Student where BrojIndeksa='" + BrojIndeksa + "'"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) {

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

82

if (dr["StanjeRacuna"] != null) { StanjeRacuna = dr["StanjeRacuna"].ToString(); } } return StanjeRacuna; } private DataTable UcitajUplatePoBrojuIndeksa(string BrojIndeksa) { DataTable TabelaPodataka = new DataTable();

// konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select CAST(Day(DatumUplate) as nvarchar(2)) + '.' + CAST(Month(DatumUplate) as nvarchar(2)) + '.' + CAST(Year(DatumUplate) as nvarchar(4)) + '.' as [Datum uplate], IznosUplate as Iznos from Uplata where BrojIndeksa='" + BrojIndeksa + "' order by DatumUplate desc"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows) { TabelaPodataka.Load(dr); } dr.Close(); Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private void PrikaziPodatke(DataTable TabelaPodataka) { gvUplateStudenta.DataSource = TabelaPodataka; gvUplateStudenta.DataBind(); }

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

83

// DOGADJAJI protected void Page_Load(object sender, EventArgs e) { // preuzimanje vrednosti sa stranice sa parametrima string BrojIndeksa= Request.QueryString["BrojIndeksa"].ToString(); // lblBrojIndeksa.Text = BrojIndeksa; lblImePrezime.Text = DajImePrezime(BrojIndeksa); lblStanjeRacuna.Text = DajStanjeRacuna(BrojIndeksa); PrikaziPodatke(UcitajUplatePoBrojuIndeksa(BrojIndeksa)); } }

}

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

84

4.2. WEB SERVISI

4.2.1. Definicija i primer realizacije i korišćenja

web servisa Web servis je definisan kao:

“Web services are components on a Web server that a client application

can call by making HTTP requests across the Web. ASP.NET enables you

to create custom Web services or to use built-in application services,

and to call these services from any client application.” (preuzeto sa:

http://msdn.microsoft.com/en-us/library/t745kdsh.aspx)

Postupak kreiranja web servisa raspoloživ je na:

http://msdn.microsoft.com/en-us/library/8wbhsy70.aspx

Projekat sa kreiranim web servisom predstavlja biblioteku klasa, gde je

web servis zapravo klasa sa javnim metodama. Fajl takve klase ima

ekstenziju “asmx”.

Primer web aplikacije koja koristi web servis dat je na sledećoj slici:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

85

4.2.2. Postupak kreiranja web servisa

1. Biramo framework 3.5, tip projekta web, ASP.Net Web

service application. Biramo folder gde će web servis biti

snimljen.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

86

2. Dobijamo automatski primer Hello World proceduru za

prikaz stringa:

3. Menjamo naziv procedure i tekst ispisa.

NAPOMENA:

Da bismo mogli da koristimo web servis, potrebno je da ga

testiramo.

4. Kliknemo u Solution explorer na Service1.asmx i izaberemo

F5.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

87

5. Dobijamo:

Gde je najvaznija URL adresa sa izvrsivim kodom:

6. Kad kliknemo na link PrikaziPoruku, dobijamo:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

88

7. Kad kliknemo na INVOKE dugme, dobijamo rezultat izvrsavanja u

obliku XML-a:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

89

4.2.3. Korišćenje web servisa u web aplikaciji

1. Kreiramo web aplikaciju asp.net, u okviru 4.0 frameworka.

2. Dodajemo na Default.aspx stranicu taster i imenovanu labelu:

3. Dodajemo reference na web servis (Project, Add Service

Reference):

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

90

4. Dobijamo:

5. Biramo Advanced:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

91

6.Biramo Add Web reference i unosimo url adresu web servisa:

NAPOMENA:

Prethodno, web servis mora biti startovan, tj. Navedena lokalhost

adresa mora biti validna:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

92

7.Kopiramo URL adresu servisa:

http://localhost:1441/Service1.asmx

u deo za unos URL adrese web servisa i dobijamo:

8. Unos naziva (alijasa) reference na web servis (umesto localhost)

u text box desno:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

93

9. Kliknemo Add Reference.

10. Dobijamo u Solution Exploreru Web aplikacije novu stavku: Web

Reference – ProbniWS.

11. U programskom kodu web aplikacije instanciramo objekat klase

iz web servisa i pozivamo metodu:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

94

12. Pokrecemo web aplikaciju, da bismo isprobali koriscenje web

servisa. Kliknemo na taster PRIKAZI

13. Dobijamo rec: “Dobrodosli !” cime smo potvrdili da web servis

radi.

14. Zaustavicemo izvrsavanje web servisa i ponovo pokrenuti Web

aplikaciju.

15. Takodje se uspesno izvrsava aplikacija i prikazuje rec

“Dobrodosli!”.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

95

4.2.4. Korišćenje raspoloživih besplatnih web servisa

Postoje web sajtovi na kojima se hostuju besplatni web servisi. Dovoljno

je samo u okviru dodavanja web servisa u našoj web aplikaciji dodati

URL sa tim web servisom i možemo koristiti njegove klase i metode.

Jedan od takvih sajtova je www.webservicex.net. U nastavku dajemo

primere besplatnih web servisa sa ovog sajta.

PRVI PRIMER - Slanje SMS

URL:

Ubacujemo link u nasu web aplikaciju:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

96

Dodeljujemo naziv:

Novi web servis se pojavio na spisku u solution exploreru:

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

97

Pozivamo objekat za slanje SMS:

DRUGI PRIMER: bar code generator

Biramo stranicu, zatim kliknemo na CLICK HERE da bismo dobili novi

prozor sa kompletnim URL za ASMX fajl web servisa.

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

98

TRECI PRIMER – GEO IP ADRESA za razlicite zemlje

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

99

4.3. WEB APLIKACIJE SA WEB SERVISIMA I XML ZADATAK: Na osnovu datog XML fajla kreirati web servis koji

omogućava čitanje podataka, odnosno izdvajanje podatka na osnovu

prosleđene vrednosti parametra. Kreirani web servis koristiti u okviru

web aplikacije, kako bi obezbedio sve potrebne podatke za realizaciju

unosa podataka.

DETALJAN ZADATAK:

Dat je SQL script za kreiranje baze podataka TRGOVINA. Realizovati web

aplikaciju koja ce omoguciti:

1. Unos podataka u tabelu prodaja, koristeci podatke iz tabele Roba

i podatke iz XML fajla (odnosno Web servisa) sa cenovnikom

robe. Prilikom unosa podataka u tabelu Prodaja, izvrsiti izmenu

(u okviru transakcije) podataka u tabeli Roba koji se odnose na

kolicinu na lageru.

2. Tabelarni prikaz prodaje.

BAZA PODATAKA

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

100

SQL SKRIPT ZA KREIRANJE BAZE PODATAKA

USE [master]

GO

CREATE DATABASE [TRGOVINA]

GO

USE [TRGOVINA]

GO

CREATE TABLE [dbo].[Roba](

[SifraRobe] [nvarchar](10) NOT NULL,

[NazivRobe] [nvarchar](50) NOT NULL,

[JedinicaMere] [nvarchar] (15) NOT NULL,

[KolicinaLager] [int] NOT NULL

)

ALTER TABLE [dbo].[Roba]

ADD CONSTRAINT [PK_Roba] PRIMARY KEY CLUSTERED

(

[SifraRobe] ASC

)

GO

CREATE TABLE [dbo].[Prodaja](

[IdProdaje] [int] IDENTITY(1,1) NOT NULL,

[DatumProdaje] [datetime] NOT NULL,

[IdRobe] [nvarchar](10) NOT NULL,

[Kolicina] [int] NOT NULL,

[CenaJM] [money] NOT NULL,

[NaplacenIznos] [money] NOT NULL

)

ALTER TABLE [dbo].[Prodaja]

ADD CONSTRAINT [PK_Prodaja] PRIMARY KEY CLUSTERED

(

[IdProdaje] ASC

)

GO

ALTER TABLE [dbo].[Prodaja] ADD CONSTRAINT [FK_Prodaja_Roba] FOREIGN

KEY([IdRobe])

REFERENCES [dbo].[Roba] ([SifraRobe])

ON UPDATE CASCADE

GO

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

101

XML FAJL SA PODACIMA O CENOVNIKU - Cenovnik.XML

<?xml version="1.0" standalone="yes"?>

<SpisakRobe>

<Roba>

<Sifra>1</Sifra>

<Cena>40</Cena>

</Roba>

<Roba>

<Sifra>2</Sifra>

<Cena>120</Cena>

</Roba>

<Roba>

<Sifra>3</Sifra>

<Cena>540</Cena>

</Roba>

</SpisakRobe>

KORISNIČKI INTERFEJS STRANICE ZA UNOS PODATAKA

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

102

KORISNIČKI INTERFEJS STRANICE ZA TABELARNI PRIKAZ PODATAKA

PROGRAMSKI KOD WEB SERVISA

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

103

Kreiran je web servis. Postavljen je podfolder XMLfajlovi gde se

nalazi fajl “Cenovnik.XML”. Web servis čita sadržaj XML fajla I vraća odgovarajuću vrednost.

using System.Data; namespace WebService1 { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string DajCenuJM(string SifraRobe) // IZ XML fajla sa Cenovnikom {

string Cena = ""; DataSet dsCenovnik = new DataSet(); dsCenovnik.ReadXml(Server.MapPath("~/") + "XMLfajlovi/Cenovnik.XML"); // filtriranje dataset-a DataRow[] result = dsCenovnik.Tables[0].Select("Sifra=" + SifraRobe); Cena = result[0].ItemArray[1].ToString(); return Cena;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

104

} }

PROGRAMSKI KOD WEB APLIKACIJE KOJA KORISTI WEB SERVIS

Stranica za unos podataka

Klasa clsProdaja.cs

U okviru projekta Web aplikacije, kreirana je klasa za preuzimanje

podataka iz korisničkog interfejsa.

namespace WebTrgovina { public class clsProdaja { private DateTime pDanasnjiDatum; private string pNazivRobe; private string pKolicina; private string pCena; private string pIznos; public DateTime DanasnjiDatum { get { return pDanasnjiDatum; } set { pDanasnjiDatum = value; } } public string NazivRobe { get { return pNazivRobe; } set { pNazivRobe = value; } } public string Kolicina { get { return pKolicina; } set { pKolicina = value; } } public string Cena {

get { return pCena; } set { pCena = value; } } public string Iznos { get { return pIznos; } set { pIznos = value; } } } }

Programski kod stranice za unos podataka

// using System.Data.SqlClient;

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

105

using System.Data; using System.Configuration; namespace WebTrgovina { public partial class _Default : System.Web.UI.Page { // NASE PROCEDURE private void IsprazniKontrole() { //lblDatum.Text = "";

ddlRoba.Text = "izaberite..."; lblCenaJM.Text = "-"; txtKolicina.Text = "-"; lblIznos.Text = "-"; } private void NapuniCombo() { // konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select NazivRobe from Roba order by NazivRobe"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // punjenje combo ddlRoba.Items.Clear(); ddlRoba.Items.Add("izaberite..."); while (dr.Read()) { ddlRoba.Items.Add(dr["NazivRobe"].ToString()); } // diskonektovanje sa baze dr.Close(); Veza.Close(); Veza.Dispose(); } private string DajJedinicuMere(string NazivRobe) { string JM = ""; string strSQL = "";

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

106

SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select JedinicaMere from Roba where NazivRobe='" + NazivRobe + "'"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) { if (dr["JedinicaMere"] != null) { JM = dr["JedinicaMere"].ToString();

} } return JM; } private string DajSifruRobe(string NazivRobe) // { string SIFRA = ""; string strSQL = ""; SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select SifraRobe from Roba where NazivRobe='" + NazivRobe + "'"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) { if (dr["SifraRobe"] != null) { SIFRA = dr["SifraRobe"].ToString(); } } return SIFRA; } private string DajCenuJM(string SifraRobe) // IZ Web servisa sa cenovnikom { string Cena = ""; CenovnikWS.Service1 objServisCena = new CenovnikWS.Service1(); Cena=objServisCena.DajCenuJM(SifraRobe); return Cena; } private string DajKolicinuNaLageru(string NazivRobe) { string LAGER = ""; string strSQL = "";

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

107

SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); strSQL = "Select KolicinaLager from Roba where NazivRobe='" + NazivRobe + "'"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); if (dr.Read()) { if (dr["KolicinaLager"] != null) { LAGER = dr["KolicinaLager"].ToString();

} } return LAGER; } private bool SnimiPodatke(clsProdaja objNovaProdaja) { bool uspeh = false; int brojslogovaUnos = 0; int brojslogovaIzmena = 0; // string NazivRobe = objNovaProdaja.NazivRobe; // --------------------------------------------------------------------- // *****1.********* OCITAVANJE KOLICINE NA LAGERU IZ TABELE Roba *********** // string strKolicinaLager = DajKolicinuNaLageru(NazivRobe); //******************* konektovanje na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // ------------------------------------------------------------------------ // *********** 2. OTVARANJE TRANSAKCIJE SqlTransaction objTransakcija = Veza.BeginTransaction(); // --------------------------------------------------------------------- // *****3.********* SNIMANJE UNOSA U TABELU Uplata *****************// // formatiranje za sql string Datum = "'" + objNovaProdaja.DanasnjiDatum.Month.ToString() + "/" + objNovaProdaja.DanasnjiDatum.Day.ToString() + "/" + objNovaProdaja.DanasnjiDatum.Year.ToString() + "'";

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

108

string IdRobe = DajSifruRobe(objNovaProdaja.NazivRobe); // snimanje podataka String strSQLUnos; // NE STAVLJAMO ID, JER JE IDENTITY, auto increment strSQLUnos = "Insert into Prodaja(DatumProdaje, IdRobe, Kolicina, CenaJM, NaplacenIznos) values (" + Datum + ", '" + IdRobe + "', " + objNovaProdaja.Kolicina + "," + objNovaProdaja.Cena + "," + objNovaProdaja.Iznos + ")"; SqlCommand KomandaUnos = new SqlCommand(strSQLUnos, Veza); // dodeljivanje komande transakciji KomandaUnos.Transaction = objTransakcija; brojslogovaUnos = KomandaUnos.ExecuteNonQuery();

// --------------------------------------------------------------------- // ******4. ********* KREIRANJE NOVOG STANJA RACUNA ZA NAVEDENOG STUDENTA ********** // Single LagerKolicina = 0; LagerKolicina = Single.Parse(strKolicinaLager) - Single.Parse(objNovaProdaja.Kolicina); // --------------------------------------------------------------------- // *****5.********* SNIMANJE IZMENE U TABELU Student *****************// // snimanje podataka String strSQLIzmena; // NE STAVLJAMO ID, JER JE IDENTITY, auto increment strSQLIzmena = "Update Roba set KolicinaLager=" + LagerKolicina.ToString() + " where Roba.SifraRobe='" + IdRobe + "'"; SqlCommand KomandaIzmena = new SqlCommand(strSQLIzmena, Veza); // dodeljivanje komande transakciji KomandaIzmena.Transaction = objTransakcija; brojslogovaIzmena = KomandaIzmena.ExecuteNonQuery(); // ------------------------------------------------------------------------------------ // ******* 6. ***********IZVRSAVANJE TRANSAKCIJE *************************************** objTransakcija.Commit(); // --------------------------------------------------------------------- // *********7. *************** diskonektovanje sa baze ****************************// objTransakcija.Dispose(); Veza.Close(); Veza.Dispose(); int ukupnoslogova = brojslogovaUnos + brojslogovaIzmena; uspeh = (ukupnoslogova == 2); return uspeh; } // ---------------------------------------------

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

109

// ****************DOGADJAJI ******************* protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { lblDatum.Text = DateTime.Now.Day.ToString() + "." + DateTime.Now.Month.ToString() + "." + DateTime.Now.Year.ToString() + "."; NapuniCombo(); } } protected void ddlRoba_SelectedIndexChanged(object sender, EventArgs e)

{ lblJedinicaMere.Text = DajJedinicuMere(ddlRoba.Items[ddlRoba.SelectedIndex].ToString()); lblJedMere.Text = lblJedinicaMere.Text; lblCenaJM.Text = DajCenuJM(DajSifruRobe(ddlRoba.Items[ddlRoba.SelectedIndex].ToString())); } protected void btnIzracunaj_Click(object sender, EventArgs e) { Single UkupanIznos = Single.Parse(lblCenaJM.Text) * Single.Parse(txtKolicina.Text); lblIznos.Text = UkupanIznos.ToString(); } protected void btnSnimi_Click(object sender, EventArgs e) { clsProdaja objProdaja = new clsProdaja(); objProdaja.DanasnjiDatum = DateTime.Now.Date; objProdaja.NazivRobe = ddlRoba.Text; objProdaja.Kolicina = txtKolicina.Text; objProdaja.Cena = lblCenaJM.Text; objProdaja.Iznos = lblIznos.Text; bool uspeh = SnimiPodatke(objProdaja); string porukauspeha = ""; if (uspeh) { porukauspeha = "USPEH snimanja!"; } else { porukauspeha = "NEUSPEH snimanja!"; }; //PORUKA O USPEHU lblStatus.Visible = true; lblStatus.Text = porukauspeha; // Msg box ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + porukauspeha + "');", true); } protected void btnOdustani_Click(object sender, EventArgs e)

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

110

{ IsprazniKontrole(); } } }

Programski kod stranice za tabelarni prikaz podataka

using System.Data; using System.Data.SqlClient; using System.Configuration; namespace WebTrgovina { public partial class Tabelarni : System.Web.UI.Page { //NASE PROCEDURE private DataTable UcitajSve() { DataTable TabelaPodataka = new DataTable(); // konekcija na bazu SqlConnection Veza = new SqlConnection(ConfigurationManager.ConnectionStrings["NasaKonekcija"].ConnectionString); Veza.Open(); // preuzimanje podataka String strSQL; strSQL = "Select CAST(Day(Prodaja.DatumProdaje) as nvarchar(2)) + '.' + CAST(Month(Prodaja.DatumProdaje) as nvarchar(2)) + '.' + CAST(Year(Prodaja.DatumProdaje) as nvarchar(4)) + '.' as [Datum prodaje], Roba.NazivRobe as [Naziv Robe], Prodaja.Kolicina, Roba.JedinicaMere as [Jedinica mere], CAST (CAST (Prodaja.CenaJM as DECIMAL(10,0)) AS nvarchar(10)) + ' din' as [Cena jedinice mere], CAST (CAST (Prodaja.NaplacenIznos as DECIMAL(10,0)) AS nvarchar(10)) + ' din' as [Naplacen iznos] from Prodaja inner join Roba on Roba.SifraRobe=Prodaja.IdRobe order by Prodaja.DatumProdaje desc, Roba.NazivRobe asc"; SqlCommand Komanda = new SqlCommand(strSQL, Veza); SqlDataReader dr = Komanda.ExecuteReader(); // transformacija datareader u data table // - ne mora, u web aplikaciji se moze povezati direktno // grid sa data readerom, ali postoji problem zbog zatvaranja konekcije // pa je bolje ipak da se podati postave u datatable, koji nije direktno povezan sa bazom if (dr.HasRows)

{ TabelaPodataka.Load(dr); } dr.Close();

Kazi Ljubica, Radulović Biljana UVOD U DISTRIBUIRANE INFORMACIONE SISTEME - praktikum

111

Veza.Close(); Veza.Dispose(); return TabelaPodataka; } private void PrikaziPodatke(DataTable TabelaPodataka) { gvProdaja.DataSource = TabelaPodataka; gvProdaja.DataBind(); }

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { PrikaziPodatke(UcitajSve()); } } } }