VISOKOŠOLSKI STROKOVNI ŠTUDIJ Informatika in tehnologije
Transcription
VISOKOŠOLSKI STROKOVNI ŠTUDIJ Informatika in tehnologije
VISOKOŠOLSKI STROKOVNI ŠTUDIJ Informatika in tehnologije komuniciranja Sistemska podpora informatiki in tehnologijam komuniciranja POROČILO PRAKTIČNEGA IZOBRAŢEVANJA V HAKL IT, d.o.o. Murska Sobota Študent: Miha Jerič E-pošta: miha.jeric@uni-mb.si GSM: 041-502-031 Vpisna številka: E1014145 Mentor v GD: Makovecki Boris Čas izobraţevanja: 21.3.2011 – 20.5.2011 2 3 Kazalo vsebine Uvod ........................................................................................................................................... 6 Opis gospodarske druţbe ........................................................................................................... 6 Programske rešitve ................................................................................................................. 7 Samostojne aplikacije ............................................................................................................. 8 Spletne rešitve ........................................................................................................................ 8 Sharepoint rešitve ................................................................................................................... 9 Opis praktičnega izobraţevanja – projektno delo .................................................................... 10 Scheduler service.................................................................................................................. 10 Flash banerji ......................................................................................................................... 10 Glavni projekt – Prikazovalnik za lekarne ........................................................................... 12 Oblikovanje izgleda.......................................................................................................... 12 Branje podatkov iz baze ................................................................................................... 13 Prikaz plavajočega teksta ................................................................................................. 14 Predvajanje medija ........................................................................................................... 15 Prikaz zaposlenih.................................................................................................................. 17 Konfiguracijska datoteka ...................................................................................................... 19 Zaključek .............................................................................................................................. 20 Sklep ......................................................................................................................................... 22 4 Kazalo slik Slika 1: Moduli informacijskega sistema ORKA.erp ................................................................. 7 Slika 2: Desno spodaj je izdelan baner za Terme3000 na www.thermencheck.com ............... 11 Slika 3: Drugi baner ................................................................................................................. 11 Slika 4: Osnovni izgled aplikacije ............................................................................................ 12 Slika 5: Prikazovalnik - prikazovanje slik................................................................................ 20 Slika 6: Prikazovalnik - prikazovanje videa ............................................................................. 21 5 Uvod Podjetje Hakl IT, d.o.o. je največji in vodilni ponudnik lekarniških informacijskih sistemov v Sloveniji, ter največji ponudnik IT rešitev v Prekmurju. Kot praktikant, sem bil dodeljen v oddelek za razvoj .NET aplikacij (v C#), razvijal pa sem še nekaj aplikacij za sodelavce tudi v drugih programskih jezih (php, Flash, Android aplikacije). Glavni del mojega praktičnega izobraţevanja, je bil razvoj aplikacije »Prikazovalnik« za lekarne, ki je bil naročen iz strani Pomurskih lekarn in sluţi za prikazovanje informacij o trenutnih zaposlenih, predvajanje reklam o zdravilih, plavajočega besedila ter še drugih informacij na zaslonu v lekarnah. Podrobnejši opis projekta bom opisal v naslednjih točkah poročila. Opis gospodarske družbe Osnovna dejavnost podjetja Hakl IT, ki ima 28 zaposlenih, je oskrba z računalniškimi programi, svetovanje in nabava ter vzdrţevanje informacijsko-komunikacijskih sistemov. Z lastnim razvojem programskih rešitev in načrtovanjem kompleksne informacijske infrastrukture ob uporabi najsodobnejših tehnologij implementirajo celovite informacijske sisteme ter jih vzdrţujejo. Korenine podjetja segajo v leto 1994, ko je bilo ustanovljeno druţinsko podjetje z imenom Hakl & Hakl d.n.o., ki se od vsega začetka ukvarja z razvojem poslovno informacijskih sistemov. Z pridobivanjem novih strank in povečevanjem števila prodanih licenc se je povečevalo tudi število zaposlenih. Da bi zagotovili dolgoročni razvoj so se zdruţili z skupino podjetij INTERING HOLDING ter ustanovili novo podjetje Hakl & Hakl IT d.o.o. ter mu poleg obstoječih nalog zaupali še načrtovanje in vzdrţevanje celovitih informacijskih sistemov. V začetku leta 2009 so se preimenovali v Hakl IT, d.o.o. 6 Programske rešitve ORKA.erp – celovit informacijski sistem Orka je celovita poslovna informacijska rešitev, ki je namenjena majhnim in srednje velikim podjetjem in predstavlja vsestransko zdruţljivo, prilagodljivo in učinkovito programsko opremo. Slika 1: Moduli informacijskega sistema ORKA.erp 7 ORKA.aor – lekarniško poslovanje Aplikacija omogoča načrtovanje, spremljanje in številne analize poslovanja lekarne, predvsem pa zagotavlja odlično podporo izdaji/prodaji zdravil in medicinsko tehničnih pripomočkov ter prodaji blaga v lekarnah. Program zagotavlja dosledno sledljivost prometa zdravil in blaga z omejenim rokom trajanja od trenutka prejema do končne izdaje/prodaje. ORKA.bi – podpora poslovnemu odločanju Vsebuje podatkovno skladišče, v katerega se prepisujejo, zdruţujejo in organizirajo podatki iz različnih podatkovnih baz, z namenom podpore poslovnemu odločanju. Samostojne aplikacije ORKA.aor ORKA.fin o ORKA.fin.VIDA o ORKA.fin.GK o ORKA.fin.BP o ORKA.fin.OS o ORKA.fin.BP+P ORKA.vp ORKA.pro o ORKA.pro.MAT o ORKA.pro.MEH ORKA.bi Plače Vozni park Tehtnice Spletne rešitve E-ceste Upravljanje spletne vsebine 8 Sharepoint rešitve Microsoft Office SharePoint Server 2007 Sharepoint services Celovite rešitve Poslovanje komunalno stanovanjskega podjetja Upravljanje podatkov v porazdeljenih podatkovnih bazah 9 Opis praktičnega izobraževanja – projektno delo Na prvi delovni dan v podjetju Hakl IT, d.o.o. sem bil najprej seznanjen z delom ter oddelki v podjetju. Kot praktikant sem bil nameščen v pisarno skupaj z še tremi sodelavci. Moja naloga je bila razvoj aplikacij v .NET okolju, ko sem imel čas, pa sem pomagal sodelavcem še v php-ju, Flashu, ter Android aplikacij. V začetku, ko sem se še privajal na delovno okolje, sem dobil za nalogo izdelat krajše programe, ki jih bom opisal v naslednjih točkah. Kasneje, ko sem se privadil na delovno okolje, sem dobil za izdelat večji projekt »Prikazovalnik za lekarne«. To je aplikacija, ki je ţe nameščena na 13 Pomurskih lekarnah, in je vidna obiskovalcem ob vstopu v lekarno. Prikazuje pa podatke o trenutno prisotnih zaposlenih, razne oglase o zdravilih, plavajoči tekst, ter še druge stvari, katere pa bom opisal v spodnjih točkah. Scheduler service To je bila prva aplikacija, ki sem jo moral izdelati. Aplikacija je dokaj enostavna, njena funkcionalnost pa je, da teče v ozadju kot servis, ter na vsakih x minut, poţene določeno aplikacijo ali skripto. Minute ter aplikacijo, ki se naj zaţene določimo v pripadajoči konfiguracijski datoteki. Flash banerji Med praktičnim izobraţevanjem, sem dobil za nalogo izdelati dva flash banerja za Terme 3000. Ker sem v flashu ţe malo delal, mi izdelava banerjev ni povzročala dosti preglavic. Pri tej nalogi sem se zelo sponznal z delom s strankami, saj sem moral baner kar nekajkrat popravljati da je bil v skladu z strankinimi pričakovanji, pa čeprav so bile to malenkosti, kot je sprememba pisave za 1px, in podobno. Na koncu je stranka potrdila izdelan baner, in sedaj ju ţe lahko vidimo na http://www.thermencheck.com/ ter http://www.pons.eu . 10 Slika 2: Desno spodaj je izdelan baner za Terme3000 na www.thermencheck.com Slika 3: Drugi baner 11 Glavni projekt – Prikazovalnik za lekarne Večji del mojega praktičnega izobraţevanja je bil povezan z izdelavo ter testiranjem aplikacije »Prikazovalnik za lekarne«. To je program, ki prikazuje različne informacije za posamezno lekarno. Podatki se pridobivajo iz podatkovne baze, glede na ID posamezne lekarne v kateri se nahaja. Program prikazuje različne informacije obiskovalcem lekarne, kot so trenutno prisotni zaposleni, plavajoči tekst z informacijami, verz, ter diaprojekcijo slik oziroma videa. Program je izdelan v .NET C# WPF projektu, kjer izgled aplikacije pišemo v XML obliki. Oblikovanje izgleda Ker je ţe sodelavec pričel z delom na tem projektu, sem imel ţe vnaprej pripravljeno bazo z podatki, ter spletni servis ki pridobiva podatke iz baze. Pravtako je bil ţe izdelan osnovni izgled aplikacije. Slika 4: Osnovni izgled aplikacije 12 Na sliki vidimo osnovni izgled aplikacije, kjer se bodo nahajali naslednji podatki: 1 – Naziv lekarne 2 – Prikazani podatki o trenutnih zaposlenih (prikazujejo se glede na čas kdaj delajo) 3 – Prikaz verza ali misli 4 – Prikaz slik ali video reklam za zdravila 5 – Plavajoči tekst z informacijami Ker je koda programa zelo obseţna, bom na kratko opisal postopek izdelave ter funkcionalnost aplikacije. Branje podatkov iz baze Ob zagonu aplikacije se najprej preko spletnega servisa pridobijo najnovejši podatki o zaposlenih, mediji, text... ti se nato shranijo v mapo določeno v konfiguracijski datoteki. namespace Prikazovalnik { class DataReciever { public static void RecieveData() { service.Service1 klient = new service.Service1(); // povezava na web service string pot = ConfigurationManager.AppSettings["pot"]; // pot kamor shranimo datoteke // poti do posameznih datotek string imeZap = pot + "xml\\" + ConfigurationManager.AppSettings["imeDatZaposlenih"]; string imeBesedila = pot + "xml\\" + ConfigurationManager.AppSettings["imeDatBesedila"]; string imeBesedila2 = pot + "xml\\" + ConfigurationManager.AppSettings["imeDatBesedila2"]; string imeMedia1 = pot + "xml\\" + ConfigurationManager.AppSettings["imeDatMediaZgoraj"]; string imeMedia2 = pot + "xml\\" + ConfigurationManager.AppSettings["imeDatMediaSpodaj"]; string mapaZap = pot + ConfigurationManager.AppSettings["imeMapeZap"]; string mapaMedia1 = pot + ConfigurationManager.AppSettings["imeMapeM1"]; string mapaMedia2 = pot + ConfigurationManager.AppSettings["imeMapeM2"]; int stLek = Int32.Parse(ConfigurationManager.AppSettings["stLek"]); // ID lekarne IDatotekaFileSystem f = new DatotekaFileSystem(); try { // prenesemo datoteke f.prenesiDatotekeFTP(klient, stLek, mapaZap, "zaposleni"); f.prenesiDatotekeFTP(klient, stLek, mapaMedia1, "media1"); f.prenesiDatotekeFTP(klient, stLek, mapaMedia2, "media2"); Directory.CreateDirectory(pot + "xml\\"); // prenesemo xml f.shraniZaposleni(klient, imeZap, stLek); // zaposleni f.shraniBesedilo(klient, imeBesedila, 1, stLek); // leteci text f.shraniBesedilo(klient, imeBesedila2, 2, stLek); // ostali text 13 f.shraniMedio(klient, imeMedia1, stLek, 1); // media1 f.shraniMedio(klient, imeMedia2, stLek, 2); // media2 } catch { //... } } } } Podatki se osveţujejo glede na določen čas v konfiguracijski datoteki. Prikaz plavajočega teksta Po pridobljenih podatkih, lahko sedaj te podatke preberemo ter prikaţemo na prikazovalniku private void plavajociTextM() { // spodnji text XMLReader reader = new XMLReader(); Besedilo plavajociText = new Besedilo(); readingData = true; try { plavajociText = reader.vrniFlowText(); } catch { plavajociText.Vsebina = "Pozdravljeni!"; plavajociText.Naslov = ""; } readingData = false; textAnim1.Text = Regex.Replace(plavajociText.Vsebina, "[^a-zA-Z09šŠĊĐţŢćĆĉĈ,:!?/_.]+", " ", RegexOptions.Compiled);//plavajociText.Vsebina; /**/ textAnim1.FontSize = 40; System.Globalization.CultureInfo enUsCultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-us"); Typeface fontTF = new Typeface(this.textAnim1.FontFamily, this.textAnim1.FontStyle, this.textAnim1.FontWeight, this.textAnim1.FontStretch); ; FormattedText frmmtText = new FormattedText(textAnim1.Text, enUsCultureInfo, FlowDirection.LeftToRight, fontTF, this.textAnim1.FontSize, this.textAnim1.Foreground); double stringSize = frmmtText.Width; /**/ Storyboard storyboardBottomText = new Storyboard(); DoubleAnimation tmp1 = new DoubleAnimation(); tmp1 = new DoubleAnimation(); tmp1.From = 0; tmp1.To = okno.ActualWidth + stringSize; //tmp1.RepeatBehavior = RepeatBehavior.Forever; Timeline.SetDesiredFrameRate(tmp1, 40); double equSlope = 0.022546419; double offSetY = 10.96286472; double fromSecValue = ((stringSize * equSlope) + offSetY) / 3; tmp1.Duration = new Duration(new TimeSpan(0, 0, (int)fromSecValue)); tmp1.Completed += new EventHandler(storyboardBottomText_Completed); textAnim1.BeginAnimation(TextBox.WidthProperty, tmp1); } 14 Zgornja koda preko objekta XMLReader prebere xml datoteko za plavajoči tekst, ter nato ustvari animacijo plavajočega teksta. Predvajanje medija Na desni strani prikazovalnika, se ves čas prikazuje projekcija slik ali video reklam. Metoda nextMedia() se kliče vedno ko se konča predvajanje video posnetka, ali pa preteče čas za prikaz slike (čas je nastavljen v bazi). Funkcija najprej preveri če je naslednji medij video ali slika, in v primeru da je video, ga razširi po 2/3 zaslona – nadomesti sredinski napis z verzom, v primeru da pa je medij slika, pa ga prikaţe v desni tretjini. private void nextMedia() { // predvajanje naslednje medije try { if (currentVideo == 0) // loadMedia(); // vedno ko pridemo na zaĉetek medijev, gremo preverit ĉe so se posodobili. if (seznamMedije.Count == 0) { // ĉe trenutno ni medije timerNextMedia.Stop(); timerNextMedia.Interval = new TimeSpan(0, 0, 10); // poskusimo ponovno preveriti vsakih 10 sekund. timerNextMedia.Start(); return; } if (okno.FindName("videoVideo") == null) okno.RegisterName("videoVideo", videoElement); if (okno.FindName("videoSlike") == null) okno.RegisterName("videoSlike", videoElementSlike); if (seznamMedije[currentVideo].tip == 2) // 2 = tip za video { // prikaţemo samo element za predvajanje videa videoElement.Visibility = Visibility.Visible; // vse ostale skrijemo videoElementSlike.Visibility = Visibility.Hidden; rect.Visibility = Visibility.Hidden; txtB.Visibility = Visibility.Hidden; spSlike.Visibility = Visibility.Hidden; // stretch videoElement.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; videoElement.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; BrushConverter bc = new BrushConverter(); modul2.Background = Brushes.Black; // nastavimo trenuten video ter ga zaĉnemo predvajati videoElement.Source = new Uri(seznamMedije[currentVideo].pot, UriKind.RelativeOrAbsolute); // seznamVideov timerNextMedia.Stop(); videoElement.LoadedBehavior = MediaState.Manual; videoElement.Volume = 0; videoElement.Play(); } if (seznamMedije[currentVideo].tip == 0) // 0 = tip za slike { // skrijemo element za predvajanje videa 15 videoElement.Visibility = Visibility.Hidden; // vse ostale prikaţemo videoElementSlike.Visibility = Visibility.Visible; rect.Visibility = Visibility.Visible; txtB.Visibility = Visibility.Visible; spSlike.Visibility = Visibility.Visible; modul2.Background = new SolidColorBrush(Color.FromRgb(213, 214, 198)); // pozicija slike Grid.SetRow(videoElementSlike, 1); Grid.SetColumn(videoElementSlike, 2); // align slike videoElementSlike.VerticalAlignment = VerticalAlignment.Top; videoElementSlike.HorizontalAlignment = HorizontalAlignment.Center; // nastavimo trenutno sliko ter jo predvajamo toliko ĉasa kot je nastavljeno v media2.xml videoElementSlike.Source = new Uri(seznamMedije[currentVideo].pot, UriKind.RelativeOrAbsolute); videoElementSlike.Width = 560; timerNextMedia.Stop(); timerNextMedia.Interval = new TimeSpan(0, 0, seznamMedije[currentVideo].casTrajanja); timerNextMedia.Start(); videoElementSlike.LoadedBehavior = MediaState.Manual; videoElementSlike.Play(); } // animacija - fade in DoubleAnimation animation = new DoubleAnimation(); animation.From = 0; animation.To = 1; animation.Duration = new Duration(new TimeSpan(0, 0, 3)); videoElement.BeginAnimation(MediaElement.OpacityProperty, animation); videoElementSlike.BeginAnimation(MediaElement.OpacityProperty, animation); currentVideo++; // nastavimo naslednji medij // ko pridemo do konca, gremo od zaĉetka if (currentVideo == seznamMedije.Count) currentVideo = 0; } catch { // ĉe pride do napake (npr. pri branju xml-a) poskusimo ponovno od zaĉetka seznama medijev currentVideo = 0; loadMedia(); nextMedia(); } } private void timerNextMedia_Tick(object sender, EventArgs e) { // ko se konĉa predvajanje ene slike (glede na ĉas ki je nastavljen v media2.xml) gremo na naslednji medij nextMedia(); } private void mediaElement1_MediaEnded(object sender, RoutedEventArgs e) { // ko se konĉa predvajanje videa, gremo na naslednji medij okno.Children.Remove(videoElement); nextMedia(); } 16 Prikaz zaposlenih Zaposleni se prikazujejo dinamično, in sicer so prikazani zaposleni ki so trenutno na delovnem mestu. To je rešeno tako, da ima vsak zaposleni v bazi vpisan svoj delovni čas, program pa potem preveri kateri zaposleni so v določeni lekarni ob določenem času prisotni. Tiste prikaţe na levi strani prikazovalnika. V konfiguracijski datoteki je nastavljeno število prikazanih zaposlenih na eni strani. V kolikor je zaposlenih več kot jih lahko prikaţemo naenkrat, jih menjujemo vsakih nekaj sekund (nastavitev). Koda za prikaz zaposlenih: private void showEmployes() { // prikaz zaposlenih Storyboard employesStoryboard = new Storyboard(); // odstranimo prejšnje zaposlene (ĉe so) if (gridZaposleni.Children.Contains(panelZaposleni)) gridZaposleni.Children.Remove(panelZaposleni); panelZaposleni = new StackPanel(); // barva ozadja BrushConverter bc = new BrushConverter(); Brush b = (Brush)bc.ConvertFrom("#37686C"); panelZaposleni.Background = b; // nastavimo pozicijo v gridu Grid.SetRow(panelZaposleni, 1); //Grid.SetColumn(panelZaposleni, 0); // naslov TextBlock naslov = new TextBlock(); naslov.Text = "Danes z vami:"; naslov.FontSize = 25; BrushConverter bc0 = new BrushConverter(); naslov.Foreground = (Brush)bc0.ConvertFrom("#99CAC7"); naslov.Margin = new Thickness(40, 20, 0, 15); panelZaposleni.Children.Add(naslov); // ko pridemo do zaĉetka zaposlenih na novo preberemo xml za morebitno spremembo if (currentEmploye == 0) { readingData = true; try { XMLReader reader2 = new XMLReader(); zaposleni = reader2.vrniZaposlene(); } catch { } readingData = false; } int count = 0; // spremenljivka z katero bomo preverili kdaj bo število prikaznih na eni "strani" enako nastavljenemu v appconfig (steviloPrikazanihZaposlenih) if (zaposleni.Count > 0) // ĉe so zaposleni sploh vnešeni { // dodajamo zaposlene na stackpanel, dokler jih na eni strani ne prikaţemo toliko kot je nastavljeno v appconfig (steviloPrikazanihZaposlenih) while (count < showNumber && currentEmploye < zaposleni.Count) 17 { Zaposleni zap = (Zaposleni)zaposleni[currentEmploye]; // ĉe ni vnešenega delovnega ĉasa, potem ga prikazujemo ves ĉas if(zap.Zacetek == "") zap.Zacetek = "00:00"; if (zap.Konec == "") zap.Konec = "23:59"; //************************************************************* DateTime now = DateTime.Now; // trenutni datum // preverimo ĉe trenutni zaposleni dela na ta dan, ob tem ĉasu - ĉe ne ga preskoĉimo in gremo na naslednjega if ((zap.Datum == now.Day + "." + now.Month + "." + now.Year) && (DateTime.Parse(zap.Zacetek).TimeOfDay <= now.TimeOfDay) && (DateTime.Parse(zap.Konec).TimeOfDay > now.TimeOfDay)) { StackPanel panel = new StackPanel(); if (okno.FindName("panelz" + count) != null) okno.UnregisterName("panelz" + count); okno.RegisterName("panelz" + count, panel); Grid.SetRow(panel, 0); Grid.SetColumn(panel, 0); // ime, priimek, naziv, pisava ... TextBlock imePriimek = new TextBlock(); imePriimek.Text = Regex.Replace(zap.Ime, @"\s", "") + " " + Regex.Replace(zap.Priimek, @"\s", ""); imePriimek.Foreground = Brushes.White; imePriimek.FontSize = 23; BrushConverter bc1 = new BrushConverter(); imePriimek.Foreground = (Brush)bc1.ConvertFrom("#F0FAFF"); panel.Children.Add(imePriimek); TextBlock naziv = new TextBlock(); naziv.Text = zap.Naziv; naziv.FontSize = 20; BrushConverter bc2 = new BrushConverter(); naziv.Foreground = (Brush)bc2.ConvertFrom("#99CAC7"); naziv.Margin = new Thickness(0, 0, 0, 15); panel.Children.Add(naziv); // slika zaposlenega (ĉe obstaja) Image slika = new Image(); if (zap.Slika != "") { Uri uri = new Uri(zap.Slika, UriKind.RelativeOrAbsolute); ImageSource imgSource = new BitmapImage(uri); slika.Width = 100; slika.Source = imgSource; slika.Margin = new Thickness(0, 5, 10, 0); } // dockpanel (slika na levi strani; ime, priimek, naziv na desni) DockPanel dockpanel = new DockPanel(); dockpanel.Margin = new Thickness(40, 0, 0, 0); if (slika.Height != 0) dockpanel.Children.Add(slika); dockpanel.Children.Add(panel); if (slika.Height != 0) DockPanel.SetDock(slika, Dock.Left); DockPanel.SetDock(panel, Dock.Right); panelZaposleni.Children.Add(dockpanel); // ĉe imamo veĉ zaposlenih kot jih lahko prikaţemo na eni strani, potem dodamo fade animacijo za prikaz naslednjih zaposlenih if (checkNextEmployees(0) > showNumber) { DoubleAnimation animation = new DoubleAnimation(); animation.From = 0; 18 animation.To = 1; animation.BeginTime = new TimeSpan(0, 0, 0); animation.Duration = new Duration(new TimeSpan(0, 0, 1)); Storyboard.SetTargetName(animation, "panelz" + count); Storyboard.SetTargetProperty(animation, new PropertyPath(Panel.OpacityProperty)); employesStoryboard.Children.Add(animation); } count++; } currentEmploye++; // naslednji zaposleni } } // ĉe nimamo veĉ zaposlenih za prikazati, gremo na zaĉetek if (checkNextEmployees(currentEmploye) == 0) currentEmploye = 0; if (count > 0) // ĉe imamo zaposlene za prikazati { // fade naslednjih zaposlenih if (checkNextEmployees(0) > showNumber) employesStoryboard.Begin(this, true); gridZaposleni.Children.Add(panelZaposleni); //prikaz zaposlenih Grid.SetRow(panelZaposleni, 0); } } Konfiguracijska datoteka V konfiguracijski datoteki so nastavljeni vsi pomembnejši parametri za pravilno delovanje prikazovalnika. Tukaj nastavimo lokacijo kamor naj se shranjujejo vsi podatki za prikazovanje (video, slike, text), ID lekarne, ter nastavitve povezane z prikazom (čas prikazovanja, čas posodabljanja novih podatkov iz spletnega servisa, …) Konfiguracija: <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <section name="Prikazovalnik.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> </sectionGroup> </configSections> <applicationSettings> <Prikazovalnik.Properties.Settings> <setting name="Prikazovalnik_service_Service1" serializeAs="String"> <value>http://****/Service1.asmx</value> </setting> </Prikazovalnik.Properties.Settings> </applicationSettings> <appSettings> <!--pot--> <add key="pot" value="D:\Lekarna\lekarna_podatki\"/> <!--imena xml-jev--> <add key="imeDatZaposlenih" value="zaposleni.xml"/> <add key="imeDatBesedila" value="besedilo.xml"/> <add key="imeDatBesedila2" value="besedilo2.xml"/> <add key="imeDatMediaZgoraj" value="media1.xml"/> <add key="imeDatMediaSpodaj" value="media2.xml"/> <!--imena map kjer se naj shranjujejo slike, filmi...--> <add key="imeMapeZap" value="zaposleni"/> <add key="imeMapeM1" value="media1"/> <add key="imeMapeM2" value="media2"/> <add key="imeMapeXML" value="xml"/> 19 <!--podatki enote--> <add key="stLek" value="11"/> <add key="nazivLekarne" value="Lekarna"/> <add key="kontaktniPodatki" value="Pomurske Lekarne Kocljeva 2 9000 Murska Sobota www.pomurske-lekarne.si"/> <!--ĉas osveţevanja podatkov o zaposlenih, medije, ... --> <add key="casOsvezevanjaPodatkov" value="5"/> <!-- minute --> <!-- število naenkrat prikazanih zaposlenih --> <add key="steviloPrikazanihZaposlenih" value="4"/> <!-- na koliko sekund naj se prikaţe naslednjih n-zaposlenih ĉe jih ne moremo prikazati na eni strani (v sekundah) --> <add key="hitrostPrikazovanjaZaposlenih" value="5"/> <!-- sekunde --> </appSettings> <startup><supportedRuntime version="v2.0.50727"/></startup></configuration> Zaključek V zgornjih točkah je le na kratko opisano delovanje prikazovalnika. Celotna koda je zelo obširna, zato sem opisal le glavne funkcije programa. Na spodnji sliki je prikazano delovanje prikazovalnika na eni izmed pomurskih lekarn. Slika 5: Prikazovalnik - prikazovanje slik 20 Slika 6: Prikazovalnik - prikazovanje videa Na sliki 5 je prikazano delovanje prikazovalnika ko prikazuje sliko. Trajanje prikaza slike je nastavljeno v bazi za vsako sliko posebej. To si nastavljajo lekarne same, preko uporabniškega vmesnika kjer dodajajo nove medije, podatke o zaposlenih, ter druge nastavitve. Na sliki 6 je prikazano delovanje prikazovalnika ko prikazuje video. Takrat se video prikazuje po 2/3 celotnega prikazovalnika. Ko se predvajanje videa konča, prikazovalnik preveri naslednji medij ter ga prikaţe. Če je naslednji medij slika, preklopi nazaj v pogled kakršen je viden na sliki 5, sicer pa se nadaljuje predvajanje videa kot na sliki 6. 21 Sklep Še enkrat bi se rad zahvalil podjetju Hakl IT, d.o.o. za omogočeno praktično izobraţevanje. Delo mi je bilo zelo všeč, saj so bili vsi zelo prijazni, ter so mi rade volje pomagali v primeru teţav. V sklopu praktičnega izobraţevanja sem dobil dosti izkušenj, ki mi bodo prav gotovo pomagale v prihodnosti. Spoznal sem delo v kolektivu, delo na projektih, pa tudi delo z strankami. Pridobil sem tudi dosti novega znanja iz podatkovnih baz, saj je v podjetju dosti opravka z le temi. Prav tako sem nadgradil svoje znanje iz programskih jezikov, saj sem se poleg nadgradnje jezika c# ter podatkovnih baz, naučil tudi izdelavo flash animacij. 22