понедељак, 11. јануар 2016.

MBS: Strani jezici, Languages


Posle prvog window-a Picture Editor koji nam sa lakoćom omogućava da unesemo ili snimimo sliku na računar iz sistema; tačnije iz baze podataka; zatim Flags, window koji sadrži zastave, sad je na redu window Languages. Kao što vidite u programiranju MBS-a, prvo se posvećujemo sporednim stvarima ali kako polako odmičemo naš sistem od starta već radi i postaje korisniji i za naše druge  window-e. Znači mi već od starta povezujemo i koristimo već isprogramirano u narednim koracima i samo takav pametan pristup omogućava brže, bolje i lakše širenje sistema. Možete pomisliti da razvoj sistema postaje zahtevan zbog mnogo unosa podataka, ali nigde ne piše da vi sad odmah morate uneti sve zastave i jezike koje postoje na svetu. Opustite se; vaš sistem se gradi polako; ništa se ne radi preko noći; možete imati i neke nerešene stvari prilikom programiranja koje će te kasnije rešavati ali funkcionalnost mora da postoji jer ne možete dodati zastavu jezicima ako window sa zastavama ne funkcioniše. Ako neki window ne funkcioniše onda nemojte prelaziti na drugi window. Znači funkcionalnost je primarna ali nije primarno da sad morate uneti u bazu podataka sve zastave i strane jezike na svetu za jedan dan. Neke ne morate nikad da unosite, samo one koje vama trebaju i kad vam trebaju. 



( Window Languages, MBS sistema, bez vidljivog kursora na slici )


U MBS, window sa nazivima stranih jezika nam je neophodan jer pored engleskog, nemačkog i srpskog jezika, vi ćete verovatno hteti da znate i kako se na lokalnom jeziku neke države piše naziv države ili puno ime neke osobe. Npr. imamo ime poznatog glumca Bruce Lee na engleskom jeziku, to je primarno za sistem; isto se piše i na nemačkom; zatim Brus Li na srpskom jeziku da uvek znamo pročitati šta piše na engleskom, ali je važno da znamo i kako se Brus Li piše na kineskom, njegovom maternjem jeziku. Zato moramo omogućiti da korisnik u window-ima gde mu je potreban neki drugi jezik, izabere i označi što je pisao na drugom jeziku. Zato se koristi Languages. Pogledajte navedenu sliku i prva stvar koju će te primetiti da window Languages izgleda skoro identično sa prethodnim window-om Flags. Jedino što je dodato je još jedan TextBox gde unosimo skraćenicu za jezike. Postoje dve vrste skraćenica za jezike: skraćenica sa 2 slova i skraćenica sa 3 slova. MBS koristi samo skraćenicu sa 3 slova identične Windows 10 skraćenicama u Language Preferences. Ukoliko ste isprogramirali window za Flags vi će te sa lakoćom isprogramirati Languages, međutim u kodu postoji bitna razlika.

O kakvoj razlici je reč, osim što zastave uzimamo iz Flags?

Languages je programiran tako da on preuzima ID od Flags, znači broj preko koga se korisniku prikazuje slika zastava. Korisnik samo ima utisak da se zastava sa Flags kopirala na window Languages. Na vama je to da omogućite kodiranjem. Pogledajte sliku:


( Window Languages koristi window Flags za unos zastava )

Vi na Languages window-u možete preko ID da u ToolTip-u dugmeta zastave, prikažete i naziv zastave, kad se kursor miša nalazi iznad dugmeta gde je prikazana zastava, na sva 3 jezika. Ja to za sada nisam implementirao, to je stvar izbora ali ne znači da neću u budućnosti. Naravno tu su i uvek komplikacije prilikom programiranja MBS iako sve funkcioniše.

Kakve komplikacije mogu imati stručnjaci za programiranje?

Pa oni najviše i imaju komplikacija jer oni programiraju. Npr. ja sam pokušao pristup Lambda metodom da punim listBoxLanguages.

var listLanguages = db.LanguagesTables.Join(db.FlagsTables, l => l.ID_Language,
                                                                     f => f.ID_Flag,
                                                                     (l, f) => new
                                                                     {
                                                                         l.ID_Language,
                                                                         l.ID_Flag,
                                                                         l.LanguageENG,
                                                                         l.LanguageDEU,
                                                                         l.LanguageSRP,
                                                                         l.Abbreviation,
                                                                         f.Picture
                                                                     }).OrderBy(l =>    l.LanguageENG);

Zašto ovo neće da mi radi i još mnogo drugih odličnih pristupa, ja to u ovom momentu ne znam; ali sam zato primenio sasvim neplanirani drugačiji pristup. Ja sam u bazi podataka napravio ViewLanguages i njega sa lakoćom koristim za punjenje listBoxLanguages. Pogledajte sliku:


( Pogled, LanguagesView prikazuje tabele povezanim iako nisu )

U bazi podataka tabela Languages ne sme biti u relaciji sa ni jednom tabelom. Mnogi će se trenutno zapitati o čemu ja govorim. Vidite, kod pravljenja relacija vi možete praviti relaciju jedan na jedan, jedan na više ili više na više. Krasno, ali ne možete svaku tabelu da povezujete sa svakom tabelom kako vi hoćete. Kad dođete u situaciju da tabelu ne možete da povežete sa nekom tabelom jer je ona na nekom nivou preko drugih tabela već povezana na neku tabelu; najveći profesionalci za baze podataka će vam na vaše pitanje kako da to uradim, odgovoriti da vi nemate pojma umesto da vam odgovore kako. Najbolji odgovor koji sam dobio od svih stručnjaka koje sam pitao isto pitanje bio je odgovor: „To što ti hoćeš nisu relacije, već veštačka inteligencija!“ Ali mi nisu rešili problem. Na kraju sam ja shvatio sam; samo ukoliko ste sigurni da se vaša tabela neće vezati za tabele koje mogu na indirektan način doći u situaciju da budu u relaciji onda pravite relaciju sa njom ili je ostavite bez relacije. Tu nastupa View-pogled. Kao što vidite na slici tabele Flags i Languages su u relaciji u pogledu iako tabele nisu u relaciji u bazi podataka.


( Diagram u bazi podataka pokazuje da tabele nisu u relaciji )

Zahvaljujući pogledima u bazi podataka vi možete tabelu Languages da koristite kao da je ona povezana sa svakom tabelom gde vam je potrebna. Vidite, to trenutno kod mene funkcioniše, ali šta ako nešto što radi ili što bi trebalo da radi ne radi. Ukoliko ja ovaj pogled podesim da mi takođe sortira podatke o jezicima, to će u bazi podataka raditi. Ali u sistemu on neće prikazati sortirane podatke iako ne postoji ni jedan razlog da to ne čini koji je meni poznat. Ja sam to rešio sortiranjem u kodu u MBS. Da li sad razumete zašto i kako bez obzira na vašu stručnost u praksi uvek imate komplikacije. Pre mnogo godina sam pravio MSSQL BackUp fajlove i onda sam doživeo da MSSQL neće da ih otvori, prijavljujući grešku koju je on sam napravio prilikom arhiviranja. Mnogo truda, rada i godina je iščezlo preko noći zajedno sa podacima koje sam izgubio. MSSQL BackUp nije pouzdano rešenje i MBS ga neće koristiti iako bi trebao da bude. Jednostavno, navikavajte se na svakakve komplikacije ali budite i fleksibilni. Učinite sve što možete da vam MBS radi posao ali tamo gde to ne možete, menjajte pristup.  

Srećno sa programiranjem!