Maturant: Savić Nikola, IV-4, Elektrotehničar računara
Predmet: Računarske mreže i komunikacije
Tema: E-DEVNIK KLIJENTSKA APLIKACIJA

 

interfejs_start

OLG

Zadatak praktičnog rada je izrada  e-dnevnik  klijent aplikacije  za potrebe škole. U pitanju je izrada Windows aplikacije za generisanje XML fajla sa ocenama učenika za potrebe Web aplikacije za prikazivanje ocena učenika na sajtu škole. Aplikacija treba  da sve potrebne podatke preuzme iz posebno kreirane baze podataka i na osnovu njih generiše xml fajl formata potrebnog  Web aplikaciji za prikaz ocena učenika. Web aplikacija u ovom slučaju je Online Grades sistem za onlajn pregled i unos ocena učenika.

 

Tehnologije i alati upotrebljeni za razvoj aplikacije:
Microsoft Visual Studio 2008 Express Edition, .NET Framework, C#, SQL, ADO.NET, Microsoft Access 2007, Online Grades, XML.

Maturski rad (Word dokument, source code i instalaciju programa) možete preuzeti ovde.

 

  {edocs}Maturski/e-dnevnik.doc,750,600,link{/edocs}

 


2.1 Namena aplikacije-osnovne mogućnosti

e-dnevnik klijent je aplikacija koja služi za eksportovanje ocena učenika na e-dnevnik server ocena škole,koristeći š kolsku bazu podataka sa ocenama organizovanu na specifičan način. Ova aplikacija nije elektronski dnevnik za vođenje ocena učenika,već samo klijent aplikacija koja iz posebno organizovane baze podataka preuzima potrebne podatke i stvara xml fajl potreban za unos na e-dnevnik aplikaciju na severu (u sklopu internet prezentacije škole). Učitavanje  tog fajla je ručno,u sklopu odgovarajuće strane Online Grades  sistema škole.

2.2Izgled prozora aplikacije

interfejs_start

2.3 Rad sa aplikacijom –koraci ka generisanju xml fajla
  1. Pokretanje aplikacije se vrši klikom na prečicu programa na desktopu ili na ikonicu programa u start meniju.

ikonica

     

    1. Poruka po prvom pokretanju koja saopštava da prethodna podešavanja programa nisu pronađena se javlja ako:

     

     prvo_pokretanje

    Ukoliko su sva podešavanja pronađena i ispravna aplikacija će sama pronaći bazu podataka sa ocenama učenika i sama ponuditi naziv i lokaciju generisanog xml fajla.

    1. Pronalaženje baze podataka klikom na dugme učitaj je potrebno ukoliko se želi promeniti baza podataka koja se koristi ili po prvom pokretanju programa.U svakom slučaju naziv baze podataka koja se trenutno koristi i njena lokacija je data odmah pored dugmeta Učitaj.
    2. Unos korisničkog imena i lozinke za e-dnevnik škole u odgovarajuće tekst boksove.Lozinka koja se unosi je ista ona koju profesori koriste za pristup svom nalogu na e-dnevniku škole.Unos je obavezan.
    3. Unos imena predavača se odnosi na stvarno ime profesora i prikazuje se na odgovarajućim stranama e-dnevnika na internetu.Ovo je obavezno polje.
    4. Izbor perioda tj. perioda školske godine  na koji se odnose ocene je zahtevano i obavezno polje.Potrebno je iz padajuće liste izabrati odgovarajući period.
    5. Komentar o odeljenju/predmetu nije obavezan i odnosi se na lična zapažanja o ukupnom učinku odeljenja iz nekog predmeta koja se prikazuju u okviru liste sa ocenama svih učenika određenog odeljenja.Maksimalno 1000 karaktera.

    1. Izbor predmeta jeste izbor odgovarajućeg predmeta na koji seodnose ocene učenika.Zbog specifičnosti Online Grades   sistema nije moguće odjedanput eksportovati sve ocene svih učenika jednog odeljenja za sve predmete već samo za jedan predmet.Ovo je obavezno polje i ukoliko se ne odabere ni jedan predmet aplokacija će prikazati poruku o grešci.
    2. Izbor odeljenja iz padajuće liste je obavezno i ovim se eksportuju ocene učenika samo izabranog odeljenja. Ovo je obavezno polje i ukoliko se ne odabere ni jedno odeljenje aplikacija će prikazati poruku o grešci.
    3. Izbor lokacije i naziva eksportovanog xml fajla ukoliko nije ponuđena  ni jedna lokacija ili se ona želi promeniti, vrši klikom na dugme EKSPORT .Nakon odabira naziva i likacije ista se prikazuje uodmah pored dugmeta.Naziv nije bitan ali se preporučuje da to bude nešto u vezi sa profesorom,predmetom,datumom eksporta i slično. 
    4. Eksportovanje započinje klikom na dugme eksportuj .Na izabranoj lokaciji se formira potreban xml fajl ukoliko su svi zahtevani parametri prisutni.U suprotnom dolazi do poruke o grešci. 
    5. Pomoć korisniku se dobija klikom na link pomoć,koji će prikazati sadržaj indeksa tema koje nude rešenja problema sa redom u aplikaciji.Ovaj sadržaj će se prikazati u podrazumevanom Web pregledaču. Takođe sadržavanjem kursora nad elementima prozora pojaciće se tooltip baloni sa uputstvima u vezi sa objektom ispod. 
    6. Kraj rada se vrši klikom na dugme zatvori a pritom se korisnik pita da li je siguran da želi da završi rad u aplikaciji.

    yes_no_dialog

       


       

      2.4 Pimer strukture generisanog  xml fajla

       RD1

      01

      Quarter 1: Reading

      login name

        

      password

      Mr. Teacher Name

      Kraj godine

      komentar oodeljenju

       

      2006-10-01

      Journal Intro.

      50

      Assignment Note Number one.

       

      2006-10-02

      Student Survey

      100

      Assignment Note number two.

       

      Summer Essay

      50

         

      4335

      50,yes,,50,50,50

      100.0

      A+

      2,,,

      Free text comments for this student.

       

      4987

      50,yes,10,47,45,50

      100.7

      A+

      3,,,

      Student comments for student 4987.

       

       



      2.5 Upload  xml fajla

      Nakon generisanja xml fajla sa ocena ,spremnog za učitavanje na e-dnevnik škole treba pristupiti i samom upload-u. To se radi na sledeći način:

      1. Logujte se na strani za profesore Online Grades sistema škole koristeći svoje korisničko ime i šifru.To je isto korisničko ime i šifra koja je prethodno unesena u e-dnevnik klijent aplikaciju prilikom kreiranja xml fajla.
      2. Kliknite na link Submit File nakon čega se otvara strana naslovljena Locate your export file... kao na slici submit
      3. Kliknite na dugme Browse i iz dijaloga pronađite odgovarajući fajl sa ocenama.Nakon toga kliknite na dugme OK
      4. Naziv fajla i lokacija će se pojaviti odmah pored dugmeta Browse.
      5. Kliknite na dugme Submit File to Online Grades
      6. Ukoliko je sve u redu dobićete poruku o uspešnom unosu ocena na sistem.Ako postoje greške probajte da ih ispravite na sledećoj strani uz pomoć administratora  Online Grades sistema škole.
      7. U ostalom pratite uputstva pomoći sistema ili administratora.

       


      3. Rad sa ugrađenom (coreDB)bazom podataka

       

      3.1 Osnovne napomene

       


      3.2 Sruktura baze podataka

       

      Kao što je već napomenuto,ovo je kostur za školsku bazu podataka sa tako definisanom strukturom koja je prilagođena specifičnoj organizaciji  Online Grades sistema.Samo ovakvoj bazi podatak može da pristupi klijentska aplikacija za generisanje xml fajla,tako da nije preporučljivo menjanje njene osnovne strukture.Međutim njeno proširenje ne predstavlja problem normalnom funkcionisanju e-dnevnik klijenta.Zašto je baza ovako organizovana prizialazi iz specifičnosti potreba Online Grades sistema tj. od činjenice da je on prilagođen zapadnom sistemu školovanja.Prilikom izgradnje baze ovaj sistem je maksimalno prilagođen našem školskom sistemu ,a struktura podataka će biti kasnije objašnjena.

      layot_baze_finalver

      3.3 Sistem  organizacije podataka u bazi.Odnos pojedinih entiteta.

      Da bi se bolje razumela organizacija baze podataka mora se razumeti način na koji Online Grades sistem posmatra podatke o učenicima,ocenama,zadacima itd. Naime Online Grades sistem posmatra sve učenike ravnopravno(bez obzira na pripadnost odeljenju/razredu).Takođe ocene učenika se ne posmatraju na nivou predmeta , već na nivou pojedinačnih zadataka tj. aktivnosti na kojima učenici dobijaju ocene.Dakle jedina veza između učenika i zadataka jeste konkretno tabela ocena.Zbog toga  ova ugrađena baza podataka ima malo ,,čudniju“ organizaciju podataka u odnosu na klasičan sistem evidencije podataka o ocenama učenika.

      Zarad prilagođenja Online Grades sistema našem sistemu vođenja evidencije baza je organizovana na sledeći način:

      1. Top level tabele su Razredi (za tabelu Učenici) i Predmeti (za tabelu sa aktivnostima na kojima učenici mogu dobiti ocenu – Zadaci).Ove dve tabele na samo što logički približavaju organizaciju evidencije o učenicima nama poznatijem modelu,već služe i kao filter za izdvajanje neophodnih podataka prilikom generisanja eksporta.
      2. Tabela Zadaci  sadrži opise svih zadataka iz svih predmeta u školi,nezavisno od razreda,odeljenja ili predmeta.Isto tako i tabela Učenici sadrži podatke o svim učenicima nezavisno od razreda,odeljenja ipredmeta koji pohađaju.
      3. Jedina tabela koja povezuje ove prethodno navedene glavne strukture podataka jeste Tabela Ocena koja funkcioniše na odnosu učenik-zadatak

      ->ocena.

      Možda je najbolje pogledati sledeći dijagram zarad shvatanja organizacije podataka:


      3.4 Preporuke za popunjavanje baze podataka podacima

      Tokom izrade baze podataka  i njene organizacije došao sam do nekih zaključaka u vezi sa popunjavanjem tabela(što se najčešće odnosi na primarne ključeve tabela kod kojih  treba težiti da su funkcionalni i u isto vreme i human readable –razumljivi za ljude):

      1. Entitet Razredi treba posmatrati kao celinu.To znači da primarni ključ treba formirati u formi Naziv_obrazovnog_profila_godina_upisa  npr (EltehRac_2010).Kasnije možete menjati pojedinosti tipa Razred u kome su učenici konkretnog obrazovnog profila upisanog iste godine i numeracije odeljenja itd.
      2. Šifra učenika se mora sastojati samo od brojeva,nikako od slova inače dolazi do grešaka prilikom učitavanja eksport fajla.
      3. Šifra predmeta je najbolje da se organizuje u smislu predmeta kao kursa koji pohađaju učenici npr(Elektrotehnika1ili Mat2).
      4. Šifru zadatka je najbolje smisleno povezati sa konkretnom aktivnošću iz određenog predmeta npr. Mat2_Pismeni2 ili Merenja1_DomaciRad_1.2.2010.
      5. Što se tiče polja ID u tabeli ocena ono je bitno samo za aplikaciju za eksport,a kako je autonum tipa može da ima bilo koju vrednost.Bitno je pravilno povezati šifru učenika sa odgovarajućom šifrom zadatka,ako se prate predhodne preporuke to neće biti prevelik problem.

       

      3.5 Ugrađene forme za unos i sortirani prikaz podataka

       

      Pored ručnog popunjavanja bazu je moguće popuniti i uz pomoć ugrađenih formulara za unos podataka.Naravno modu se i isprogramirati posebne aplikacije za unos podataka,a masovno popunjavanje tabela se može izvršiti i učitavanjem spiska učenika ili predmeta iz Excela.

      Organizovano pregledavanje podataka i njihovo štampanje na primer je olakšano i moguće iz samog  Microsoft Access 2007 menadžera baze podataka.Dodavanje novih formi izveštaja je veoma lako i svako sa malo iskustava u Access-u možnje veoma lako da doda nove.Isto važi i za forme za unos podataka.

       

      3.6 Proširenje osnovne baze podataka

       

      Kao što je već napomenuto ova baza predstavlja samo kostur za izradu kompleksnije baze podataka .Njena nadogradnja je zato moguća i poželjna i zavisi samo od potreba zbog kojih se proširava.Jedini uslov je da se već ugrađeni elementi ne diraju,tj. da se ne briši i preimenjuju.Naravno ukoliko ova baza služi samo e-dnevnik klijentskoj aplikaciji nema potreba za nadogradnjom.



      4.  Izvorni kod programa

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      215
      216
      217
      218
      219
      220
      221
      222
      223
      224
      225
      226
      227
      228
      229
      230
      231
      232
      233
      234
      235
      236
      237
      238
      239
      240
      241
      242
      243
      244
      245
      246
      247
      248
      249
      250
      251
      252
      253
      254
      255
      256
      257
      258
      259
      260
      261
      262
      263
      264
      265
      266
      267
      268
      269
      270
      271
      272
      273
      274
      275
      276
      277
      278
      279
      280
      281
      282
      283
      284
      285
      286
      287
      288
      289
      290
      291
      292
      293
      294
      295
      296
      297
      298
      299
      300
      301
      302
      303
      304
      305
      306
      307
      308
      309
      310
      311
      312
      313
      314
      315
      316
      317
      318
      319
      320
      321
      322
      323
      324
      325
      326
      327
      328
      329
      330
      331
      332
      333
      334
      335
      336
      337
      338
      339
      340
      341
      342
      343
      344
      345
      346
      347
      348
      349
      350
      351
      352
      353
      354
      355
      356
      357
      358
      359
      360
      361
      362
      363
      364
      365
      366
      367
      368
      369
      370
      371
      372
      373
      374
      375
      376
      377
      378
      379
      380
      381
      382
      383
      384
      385
      386
      387
      388
      389
      390
      391
      392
      393
      394
      395
      396
      397
      398
      399
      400
      401
      402
      403
      404
      405
      406
      407
      408
      409
      410
      411
      412
      413
      414
      415
      416
      417
      418
      419
      420
      421
      422
      423
      424
      425
      426
      427
      428
      429
      430
      431
      432
      433
      434
      435
      436
      437
      438
      439
      440
      441
      442
      443
      444
      445
      446
      447
      448
      449
      450
      451
      452
      453
      454
      455
      456
      
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;
      using System.Data.OleDb;
      using System.IO;
       
      namespace WindowsFormsApplication1
      {
       public partial class Form1 : Form
       {
       public Form1()
       {
       InitializeComponent();
       }
       //bool ok = false;
       string output_path,inport_path;
       bool promene = false;
       string conection_string, comand_string;
       
       private void Form1_Load(object sender, EventArgs e)
       {
       txbIMe.Enabled = false;
       txbKomentar.Enabled = false;
       txbLogin.Enabled = false;
       txbPassword.Enabled = false;
       promene = true;
       try
       {
       StreamReader read = new StreamReader("lastset.txt");
       inport_path =read.ReadLine();
       output_path = read.ReadLine();
       read.Close();
       if (inport_path != "" && output_path != "")
       {
       
       IMPORT_PATH_LABEL.Text = inport_path;
       EXPORT_PATH_LABEL.Text = output_path;
       btnEXPORT.Enabled = true;
       txbIMe.Enabled = true;
       txbKomentar.Enabled = true;
       txbLogin.Enabled = true;
       txbPassword.Enabled = true;
       cmbODELJENJE.Enabled = true;
       cmbPeriod.Enabled = true;
       cmbPREDMET.Enabled = true;
       {
       try
       {
       conection_string = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", inport_path);
       // OleDbConnection Konekcija = new OleDbConnection();
       Konekcija.ConnectionString = conection_string;
       label_status.Text = "Program pristupa podataka! ";
       Konekcija.Open();
       //komanda
       //OleDbCommand Komanda = new OleDbCommand();
       Komanda.Connection = Konekcija;
       comand_string = "SELECT * FROM Predmeti;";
       Komanda.CommandText = comand_string;
       
       //data set
       // DataSet DS = new DataSet();
       
       //data adapter
       //OleDbDataAdapter DA = new OleDbDataAdapter();
       DA.SelectCommand = Komanda;
       
       DA.Fill(DS);
       
       //data reader
       // OleDbDataReader DR;
       
       DR = Komanda.ExecuteReader();
       //punjenje combo boxa-a
       while (DR.Read() == true)
       {
       cmbPREDMET.Items.Add(DR["Sifra_Predmeta"].ToString());
       
       }
       Konekcija.Close();
       
       comand_string = "SELECT ID FROM Razredi";
       Konekcija.ConnectionString = conection_string;
       Konekcija.Open();
       Komanda.CommandText = comand_string;
       DA.SelectCommand = Komanda;
       DA.Fill(DS);
       DR = Komanda.ExecuteReader();
       //punjenje combo boxa-a
       while (DR.Read() == true)
       {
       cmbODELJENJE.Items.Add(DR["ID"].ToString());
       
       }
       btnEXPORT.Enabled = true;
       button1.Enabled = true;
       
       //}
       Konekcija.Close();
       label_status.Text = "Program uspesno okoncao pristup bazi podataka. ";
       btnEXPORT.Enabled = true;
       button1.Enabled = true;
       }
       catch (FileNotFoundException)
       {
       MessageBox.Show("DATA BAZA NIJE PRONADJENA ILI SA NJOM NIJE MOGUCE USPOSTAVITI KONTAKT!", "OBAVESTENJE!");
       }
       }
       
       }
       
       
       
       else MessageBox.Show("Poslednja podesavanja programa nisu pronadjena.\nMoracete rucno da pronadjete bazu podataka!", "Obavestenje", MessageBoxButtons.OK);
       
       }
       catch (FileNotFoundException)
       {
       MessageBox.Show("Poslednja podesavanja programa nisu pronadjena.\nMoracete rucno da pronadjete bazu podataka!", "Obavestenje", MessageBoxButtons.OK);
       
       }
       
       label_status.Text = "Program uspesno pokrenut,ocekuje unos podataka! ";
       }
       OleDbConnection Konekcija = new OleDbConnection();
       OleDbCommand Komanda = new OleDbCommand();
       DataSet DS = new DataSet();
       OleDbDataAdapter DA = new OleDbDataAdapter();
       OleDbDataReader DR;
       
       private void btnIMPORT_Click(object sender, EventArgs e)
       {
       openFileDialog1.InitialDirectory = inport_path;
       try{
       
       if (openFileDialog1.ShowDialog() == DialogResult.OK)
       {
       //malo kozmetike
       {
       btnEXPORT.Enabled = true;
       txbIMe.Enabled = true;
       txbKomentar.Enabled = true;
       txbLogin.Enabled = true;
       txbPassword.Enabled = true;
       
       inport_path = openFileDialog1.FileName;
       IMPORT_PATH_LABEL.Text = inport_path;
       cmbODELJENJE.Enabled = true;
       cmbPeriod.Enabled = true;
       cmbPREDMET.Enabled = true;
       cmbODELJENJE.Items.Clear();
       cmbPREDMET.Items.Clear();
       }
       
       //konekcija 
       conection_string = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", Convert.ToString(openFileDialog1.FileName));
       // OleDbConnection Konekcija = new OleDbConnection();
       Konekcija.ConnectionString = conection_string;
       label_status.Text = "Program pristupa podataka! ";
       Konekcija.Open();
       //komanda
       //OleDbCommand Komanda = new OleDbCommand();
       Komanda.Connection = Konekcija;
       comand_string = "SELECT * FROM Predmeti;";
       Komanda.CommandText = comand_string;
       
       //data set
       // DataSet DS = new DataSet();
       
       //data adapter
       //OleDbDataAdapter DA = new OleDbDataAdapter();
       DA.SelectCommand = Komanda;
       
       DA.Fill(DS);
       
       //data reader
       // OleDbDataReader DR;
       
       DR = Komanda.ExecuteReader();
       //punjenje combo boxa-a
       while (DR.Read() == true)
       {
       cmbPREDMET.Items.Add(DR["Sifra_Predmeta"].ToString());
       
       }
       Konekcija.Close();
       
       comand_string = "SELECT ID FROM Razredi";
       Konekcija.ConnectionString = conection_string;
       Konekcija.Open();
       Komanda.CommandText = comand_string;
       DA.SelectCommand = Komanda;
       DA.Fill(DS);
       DR = Komanda.ExecuteReader();
       //punjenje combo boxa-a
       while (DR.Read() == true)
       {
       cmbODELJENJE.Items.Add(DR["ID"].ToString());
       
       }
       
       
       }
       Konekcija.Close();
       label_status.Text = "Program uspesno okoncao pristup bazi podataka. ";
       }
       
      catch (FileNotFoundException )
       {
       
       MessageBox.Show("DATA BAZA NIJE PRONADJENA ILI SA NJOM NIJE MOGUCE USPOSTAVITI KONTAKT!","OBAVESTENJE!");
       label_status.Text = "Program nije uspesno pristupio bazi podataka. ";
       }
       
       
       
       //
       // Komanda.Dispose();
       // Konekcija.Dispose();
       // DR.Dispose();
       }
       
       private void textBox4_TextChanged(object sender, EventArgs e)
       {
       
       }
       
       private void button3_Click(object sender, EventArgs e)
       {
       if (promene == false)
       {
       this.Close();
       }
       else
       {
       if(MessageBox.Show("Da li ste sigurni da zelite da prekinete rad?","Upozorenje!",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question)==DialogResult.Yes)
       {
       this.Close();
       }
       
       
       }
       }
       
       private void cmbPeriod_SelectedIndexChanged(object sender, EventArgs e)
       {
       
       
       }
       
       private void button1_Click(object sender, EventArgs e)
       {
       string tempString,tmp1,tmp2=" ";
       string period = Convert.ToString(cmbPeriod.SelectedItem);
       string odeljenje = Convert.ToString(cmbODELJENJE.SelectedItem);
       string predmet = Convert.ToString(cmbPREDMET.SelectedItem);
       string loggin = Convert.ToString(txbLogin.Text);
       string pass = Convert.ToString(txbPassword.Text);
       string ime = Convert.ToString(txbIMe.Text);
       string komentar = Convert.ToString(txbKomentar.Text);
       string temstring2;
       StreamWriter sr = new StreamWriter(output_path);
       
       //StreamReader sr3=new StreamReader("temp.txt");
       //set za konekciju sa ucenicima
       OleDbConnection Konekcija2 = new OleDbConnection();
       OleDbCommand Komanda2 = new OleDbCommand();
       DataSet DS2 = new DataSet();
       OleDbDataAdapter DA2 = new OleDbDataAdapter();
       OleDbDataReader DR2;
       //pocetak eksporta
       
       label_status.Text = "Program pristupa obradi .xml datoteke; ";
      sr.WriteLine(" ");
       
      //definicija odeljenja
      sr.WriteLine(" ");
      temstring2 = String.Format(" {0}  ",odeljenje);
      sr.WriteLine(temstring2);
      sr.WriteLine(" 01 ");
       Konekcija.Open();
       Komanda.Connection=Konekcija;
       tempString=string.Format("SELECT * FROM Predmeti WHERE Predmeti.Sifra_Predmeta='{0}';",predmet);
       Komanda.CommandText=tempString;
       DA.SelectCommand=Komanda;
       DA.Fill(DS);
       DR=Komanda.ExecuteReader();
       DR.Read(); 
      sr.WriteLine(" {0}  ",DR["Naziv_Predmeta"].ToString());
      sr.WriteLine(" {0} ",loggin);
      sr.WriteLine(" ");
      sr.WriteLine(" ");
      sr.WriteLine(" ");
      sr.WriteLine(" {0} ",pass);
      sr.WriteLine(" {0} ",ime);
      sr.WriteLine(" {0} ",period);
      sr.WriteLine(" {0} ",komentar);
      sr.WriteLine(" ");
      Konekcija.Close();
      //DR.Dispose();
      //definicija zadataka
       comand_string = String.Format("SELECT * FROM Zadaci,Predmeti WHERE Zadaci.Predmet_kome_zadatak_pripada=Predmeti.Sifra_Predmeta AND Predmeti.Sifra_predmeta='{0}' ORDER BY Datum_izrade_zadatka ;", predmet);
       Konekcija.Open();
       Komanda.Connection = Konekcija;
       Komanda.CommandText = comand_string;
       
       DA.SelectCommand = Komanda;
       DA.Fill(DS);
       DR = Komanda.ExecuteReader();
      //petlja za popunu tabele zadataka
      while(DR.Read()==true)
       {
      sr.WriteLine(" ");
      sr.WriteLine(" {0} ", DR["Datum_izrade_zadatka"].ToString());
      sr.WriteLine(" {0} ",DR["Naziv_zadatka"].ToString());
      sr.WriteLine(" {0} ",DR["MAX_bodova"].ToString());
      sr.WriteLine(" {0} ",DR["Komentar"].ToString());
      sr.WriteLine("");
       
      };
       Konekcija.Close();
      //definicaja ucenika u while petlji
       comand_string = String.Format("SELECT * FROM Ucenici,Razredi WHERE Ucenici.Razred=Razredi.ID AND Razredi.ID='{0}';", odeljenje);
       
       Konekcija.Open();
       Komanda.Connection = Konekcija;
       Komanda.CommandText = comand_string;
       
       DA.SelectCommand = Komanda;
       DA.Fill(DS);
       DR = Komanda.ExecuteReader();
       
      while (DR.Read() == true)
      {
       sr.WriteLine(" ");
       temstring2=DR["Sifra_ucenika"].ToString();
       sr.WriteLine(" {0} ",temstring2 );
       //sr.WriteLine(" ");
       //popuna ocena
       
       // ce mora da se deklarise jos jedan set objekata za konekciju sa bazom da bi se popunilie ocene!
       tempString = String.Format("SELECT * FROM Tabela_ocena,Zadaci,Ucenici WHERE Tabela_ocena.SIFRA_ZADATKA=Zadaci.ID_zadatka AND Tabela_ocena.SIFRA_UCENIKA=Ucenici.Sifra_ucenika AND Zadaci.Predmet_kome_zadatak_pripada='{0}' AND Tabela_ocena.SIFRA_UCENIKA='{1}';",predmet ,temstring2);
       Konekcija2.ConnectionString =conection_string;
       Konekcija2.Open();
       Komanda2.Connection = Konekcija2;
       Komanda2.CommandText = tempString;
       DA2.SelectCommand = Komanda2;
       DA2.Fill(DS2);
       DR2 = Komanda2.ExecuteReader();
       string tmp3="";
       while (DR2.Read() == true)
       {
       tmp1=String.Format("{0}" , DR2["Ocena_na_zadatku"].ToString());
       tmp2=String.Format("{0},{1}", tmp2 , tmp1);
       tmp3 = tmp2;
       };
       
       Konekcija2.Close();
       sr.WriteLine(" {0} ", tmp3);
       
       //sr.WriteLine("");
       sr.WriteLine(" ");
       sr.WriteLine(" {0} ", DR["Srednja_ocena"]);
       sr.WriteLine(",,,");
       //for(int x=0;x=i;i++)
       //{
       //temp_string2=string.Format(",{0}",temp_string);
       //temp_string=tempstring2;
       //};
       //sr.WriteLine("");
       sr.WriteLine(" ");
       sr.WriteLine("");
       
      };
      sr.WriteLine("");
      Konekcija.Close();
      sr.Close();
      label_status.Text = "Program uspesno okoncao pristup bazi podataka i formirao .xml datoteku. ";
       
      if (inport_path != "" || output_path != "")
      {
       StreamWriter sr2 = new StreamWriter("lastset.txt");
       
       sr2.WriteLine("{0}", inport_path);
       sr2.WriteLine("{0}", output_path);
       sr2.Close();
       
      }
       }
       
       private void btnEXPORT_Click(object sender, EventArgs e)
       {
       saveFileDialog1.InitialDirectory = output_path;
       if (saveFileDialog1.ShowDialog() == DialogResult.OK)
       {
       output_path = Convert.ToString(saveFileDialog1.FileName);
       EXPORT_PATH_LABEL.Text = output_path;
       button1.Enabled = true;
       
       }
       if (inport_path != "" || output_path != "")
       {
       StreamWriter sr2 = new StreamWriter("lastset.txt");
       
       sr2.WriteLine("{0}", inport_path);
       sr2.WriteLine("{0}", output_path);
       sr2.Close();
       
       }
       }
       
       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
       if (inport_path != "" || output_path != "")
       {
       StreamWriter sr2 = new StreamWriter("lastset.txt");
       
       sr2.WriteLine("{0}", inport_path);
       sr2.WriteLine("{0}", output_path);
       sr2.Close();
       
       }
       //
       Komanda.Dispose();
       Konekcija.Dispose();
       //DR.Dispose();
       }
       
       private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
       {
       try
       {
       VisitLink();
       }
       catch (Exception ex )
       {
       MessageBox.Show("Aplikacija ne moze da pokrene/pronadje index.htm .");
       }
      }
       
      private void VisitLink()
      {
       
       linkLabel1.LinkVisited = true;
       
       System.Diagnostics.Process.Start("index.htm");
      }
       
       }
       }
       
       

       


       



       

      5. Zaključak

       

      Tokom rada na razvoju ove aplikacije i pisanju izvornog koda došao sam do sledećih zaključaka i zapažanja:

      Dobre strane razvoja aplikacija u okviru  .Net Frameworka jesu lakoća pisanja koda i pojednostavljenje (posmatrano sa programerske strane) rada sa ključnim i komplikovanim sistemima kakav je na primer SQL baza podataka.Isto tako i sam način  na koji je aplikacija isprogramirana i dizajnirana nudi više prednosti:

      -dobra logička organizacija podataka u internoj bazi podataka

      -nezavisnost od postojanja internet konekcije sa e-dnevnik serverom  zarad generisanja xml fajla sa ocenama

      -lakoća korišćenja i jednostavnost

      Naravno primećene su i loše strane razvoja ovakve aplikacije u pomenutom okruženju/platformi:

      -potreba za postojanjem .Net Framework podrške na računaru korisnika ,verzije 2.0 ili više

      -opterećenje lokalne mreže u situaciji kada je baza podataka sa ocenama na jednom računaru u lokalnoj mreži a aplikacija pristupa sa drugog-to je posledica same prirode SQL upita bazi i delimične nefleksibilnosti ADO.NET-a .

      -nepotpuna kompatibilnost sa našim školskim sistemom,što je posledica same prirode Online Grades sistema.

       

      Ovakva klijentska aplikacija veoma dobro podmiruje potrebe za koje je namenjena.Međutim sam pristup razradi problema ,kao i njegovo rešavanje je donelo i set prednosti i mana.Ova aplikacija ,dakle,je specijalizovana samo za potrebe generisanja eksport fajla sa ocenama  za Online Grades sistem za prikazivanje ocena učenika na internetu.Ko takva ona odlično podmiruje potrebe jedne prosečne školske ustanove,mada je sam Online Grades sistem ipak optimizovaniji za visokoškolske ustanove.Mogućnost aplikacije da nezavisno od samog Online Grades sistema generiše fajl sa ocenama jeste i najveća prednost,ali i mana same aplikacije,jer kako je potpuno nezavistna u odnosu na sam sistem aplikacija generiše eksport fajl sa svim ocenama u bazi a ne vodi računa o onim koje već postoje u bazi Online Grades sistema.To dovodi do nepotrebnog zatrpavanja servera nepotrebnim podacima ,koje ovaj odvaja,i odbacuje, jer ih već ima.

      Dalji razvoj ovakve aplikacije je najpoželjnije voditi u smeru pune Web aplikacije napisane na primer u PHP-u koja je u potpunosti prilagođena Online Grades sistemu škole,ali koja i koristi samu bazu podataka ovog sistema za čuvanje i direktan unos podataka u sistem.Takođe trebalo bi zadržati izvesnu dozu nezavisnosti,tj. postojanja mogućnosti da se generiše eksport fajl za kasnije,poželjno,automatizovani proces aploada.


      Literatura

       

      Tokom izrade ovog maturskog rada korišćena je sledeća literatura i izvori:

      1. 1. Online Grades Internet Grade Posting System – dokumentacija vezana za način rada ovog sistema za prikazivanje ocena,kao i za format xml fajla za unos ocena i način na koji je organizovano arhiviranje podataka u bazi:  http://onlinegrades.sf.net/

      http://onlinegrades.sourceforge.net

      1. 2. Easy Grade Pro (EGP) – klasičan elektronski dnevnik potpuno prilagođen pomenuom sistemu.Korišćena je pomoć korisniku ovog programa radi lakšeg organizovanja baze podataka učenika. 
      2. 3. Mala škola programiranja – publikacija sa osnovama programiranja u C# i Microsoft Visual Studio 2008 kao i sa  osnovama upotrebe ADO.NET-a i SQL –a za potrebe aplikacije. http://www.microsoft.com/scg/obrazovanje/pil/programiranje/default.mspx 
      3. 4. Matična internet stranica Microsoft Visual Studio alata –puno korisnih primera i dokumentacije u vezi sa programiranjem u C# i Microsoft Visual Studio 2008 kao i o mogućnostima .NET Framework-a : http://www.microsoft.com/express/sql/default.aspx
      4. 5. Relacioni model baza podataka http://en.wikipedia.org/wiki/Relational_model
      5. 6. XML- format dokumenata,server parseri itd... http://www.w3.org/XML/