петак, 05. фебруар 2016.

MBS: Kako se sve zovete, 1 deo



Skoro svaka kompanija u svojim bazama podataka ima tabelu klijenata, zaposlenih ili tabelu osoba. Jedna od takvih tabela uglavnom sadrži kolone za ime, srednje ime i prezime klijenta. Kod kompanija koje se bave trgovinom se uglavnom očekuje da klijent ili službenik unese puno ime klijenta kao na kreditnim karticama u bazu putem softvera, sistema ili web stranice i to je najjednostavnije napraviti. Čak je to svugde praksa. Ali šta ako to nama nije dovoljno? Kad vidite nečije ime vi ne znate da li je to ime osobe rođenjem, da li osoba nosi prezime udajom ili je jednostavno promenila svoje ime i prezime. MBS je vaš lični sistem i on se od starta pravi da sadrži maksimalno što više informacija i zato MBS sadrži informacije o svim vašim imenima. Jedino nema potrebe da pamti svako prezime iz više brakova, već samo iz onog zadnjeg. Sva imena su takođe ispisana na 4 strana jezika. Kad bi ste sve te mogućnosti stavili u jednu tabelu, dobili bi ste mnoštvo praznih polja u tabeli i ponavljanje podataka što je neprihvatljivo. Ali ako taj posao podelite u više tabela na pametan način, onda nema potrebe da odustajemo od naših želja čak iako se negde podaci ponavljaju ili tabela sadrži i po neko prazno polje.


( Window FirstName povezan sa window-ima Languages i Flags )


Možda će te se pitati zašto morate pisati nečije ime na više jezika. Što komplikujem? Na primer; imate napisano puno ime Stefani Joanne Angelina Germanotta. Prvo većina ljudi i ne zna pročitati ovo ime, čak ne zna ni koja je ovo osoba. Vaš sistem vama mora biti jasan u potpunosti. Bez jasnoće nema znanja ni boljeg pamćenja. Sa MBS vi će te znati i kako se ovo ime piše na engleskom, srpskom, nemačkom i na nekom četvrtom jeziku po vašoj volji. Pored vašeg punog imena MBS takođe mora da sadrži i polja za vaš nadimak i za umetničko ime. Inače navedeno ime osobe vam ništa ne znači. Ali ako znate da je navedeno ime, puno ime Lady Gaga-e, onda definitivno i samo ime kod vas dobija neki smisao. Zato su zahtevi MBS-a mnogo veći od 3 polja u jednoj tabeli. Razumem da je kompleksnost programiranja svega toga tolika da bi većina programera digla ruke od takvog posla, jer ako se MBS samo sa nazivom osobe ovoliko bavi, kako tek izgledaju ostale stavke u tabeli osobe. Ali razumite i vi da MBS je MBS, pametan sistem baziran na što više detalja i informacija a ne na puki prioritet. MBS je čak osnova za pravljenje veštačke inteligencije. Nema potrebe da ne umete da pročitate nečije ime. Znači prvo su bitni zahtevi jer sve što hoćete u vašem sistemu to treba i da implementirajte ukoliko to nije nešto nemoguće. U MBS-u, imena su postavljena u više window-a i tabela:

  • Ime osobe
  • Srednje ime osobe ili svega što može stojati između imena i prezimena
  • Prezime osobe

Zatim:

  • Puno ime i prezime osobe rođenjem
  • Puno ime i prezime udajom
  • Puno ime i prezime promenom imena i prezimena

Zatim:

  • Nadimak osobe
  • Umetničko ime osobe

I svi ovi zahtevi moraju biti na engleskom, srpskom, nemačkom jeziku i četvrti jezik je vaš izbor. Ukoliko upisujemo u sistem Brus Li-ja, četvrti jezik će logički predstavljati kineski jezik. Znači nama četvrti jezik nije poznat ukoliko ga sami ne odredimo i zbog toga mora imati i izbor jezika što je dodatno polje u tabeli. Radi jednostavnosti četvrti jezik sam nazvao ime pod lokalnim jezikom i on se bira sa window-a Languages o kojem je pisano u prethodnom postu ovde.

Kako da tu kompleksnost pojednostavimo i smanjimo toliki unos podataka? 
 
Prvo se pravi posebno tabela za ime, srednje ime i prezime. Zatim se prave pogledi, window i povezuje se sa već napravljenim window-ima za jezike i zastave. Dobra vest je da je prvi window First Names – imena osoba, sam po sebi kompleksan ali čak sledećih 5 window-a su identični.   Pogledajte prvo kako izgleda First Names window.




( Window FirstNames je osnova za 5 identičnih window-a u nazivima osobe )


Kao što vidite na slici u window-u FirstNames unosite samo ime neke osobe. Svako ime se unosi samo jednom a koristi se gde god vam treba. Takođe imena prevodite u tabeli za imena jednom i koliko god da koristite to ime vi više nikad ne morate ponovo unositi prevod imena. Tačnije, vaše ime sa svim prevodima je samo jedan broj u tabeli koja će koristiti tabelu sa imenima. Na takav način vi ste eliminisali mnoga polja u tabelama gde bi inače pisali i prevode imena.

Obratite pažnju na kontrolu ListBox. Do sada ListBox kontrole zastava i jezika nisu u preteranom broju i neće praviti problem, ali s obzirom da ListBox kontrola sa imenima može sadržati i hiljade imena, prvo je neophodno da kontroli omogućite VirtualizingPanel i to u pikselima:

<ListBox x:Name="listBoxFirstNames" Canvas.Top="50" Canvas.Left="10" Height="311" Width="240"
                 ItemTemplate="{StaticResource FirstNameDataTemplate}"
                 VirtualizingPanel.IsVirtualizing="True"
                 VirtualizingPanel.ScrollUnit="Pixel"
                 SelectionChanged="listBoxLanguages_SelectionChanged">

</ListBox>  

Na ovaj način ste se osigurali od prenatrpanosti ListBox kontrole i učitavanja ListBox kontrole u memoriju koje bi trajalo previše dugo. Ispod ListBox kontrole se takođe nalazi i TextBox kontrola koja nam služi za pretragu i filtriranje imena u ListBox kontroli. Filtriranje takođe obezbeđuje da čak kad unesete jedno slovo, da se pojave sva imena u ListBox kontroli koja sadrže to slovo bez obzira da li je ono prvo. To se postiže što iskodirate filtriranje liste sa imenima u Changed događaju kontrole TextBox za pretragu:

private void textBoxSearch_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (textBoxSearch.Text != String.Empty)
            {
                string textOriginal = textBoxSearch.Text.Trim();
                string upper = textOriginal.ToUpper();
                string lower = textOriginal.ToLower();

                try
                {
                    using (FirstNamesEntities db = new FirstNamesEntities())
                    {
                        var searchFiltered = from fName in db.FirstNamesViews.ToList()
                                             let fNameText = fName.FirstNameENG
                                             where fNameText.StartsWith(lower)
                                             || fNameText.StartsWith(upper)
                                             || fNameText.Contains(textOriginal)
                                             select fName;

                        listBoxFirstNames.ItemsSource = searchFiltered;

                    }
                }
                catch (Exception)
                {
                    textBoxSearch.Text = textOriginal;

                }               
            }
        }

Na ovaj način takođe dolazite lakše do imena koje vam treba. Ime na engleskom, nemačkom i srpskom mogu biti ista, ali u svakom slučaju poželjno ih je unositi nego ostavljati prazna polja. Za početak unos imena nije obavezan ali u kasnijoj fazi bi bilo poželjno da budu. Pored kontrole TextBox-a koji predstavlja kontrolu za unos lokalnog jezika se nalazi dugme sa slikom umesto natpisa. Ovo dugme poziva window sa jezicima i kad vi izaberete neki jezik, na dugmetu se iscrta i zastava za jezik koji predstavlja. Takođe, ukoliko niste sigurni koja zastava predstavlja koji jezik, dovoljno je da postavite kursor miša iznad zastave na dugmetu i da vam se pojavi ToolTip sa natpisom jezika. Pogledajte prvo na sledećoj slici window LastNames koji je identičan FirstNames window-u.


( Window LastNames je identičan window-ima FirstName i MiddleName )

Kad postavite kursor na bilo koje ime, na ToolTip-u se iscrtaju zastave na nemačkom i srpskom jeziku, sa nazivom imena na tim jezicima. To se može proširiti i da se prikazuje izabrani jezik promenom DataTemplate-a kontrole ListBox ukoliko je polje za lokalni jezik uneseno. Ali kod ToolTip-a od dugmeta za jezike, je nešto drugo. To je isprogramirano kodom, u događaju SelectionChanged kontrole ListBox i koristi se Content umesto kontrole koja bi sadržavala tekst.

// ToolTip for language
ToolTip toolTipLanguage = new ToolTip();
toolTipLanguage.Background = new SolidColorBrush(Colors.Black);
toolTipLanguage.Foreground = new SolidColorBrush(Colors.Yellow);
toolTipLanguage.Content = firstNames.LanguageENG;
buttonLanguages.ToolTip = toolTipLanguage;  

Međutim problem je šta kad je ToolTip prazan? To jest kad u njemu ne piše ništa. Onda vam se pojavljuje prazan kvadrat. Da bi se rešio taj problem, neophodno je da u fajl stilova, napišete stil koji će se pobrinuti da vam se ToolTip ne prikazuje ako je prazan. U MBS-u ovaj stil je dodat fajlu MbsStyle.xaml zaduženom za sve stilove celog sistema.

<!-- Style to hide tool tips that have an empty content. -->
<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
   <Style.Triggers>
       <Trigger Property="Content"
                Value="{x:Static sys:String.Empty}">
           <Setter Property="Visibility"
                Value="Collapsed" />
       </Trigger>
       <Trigger Property="Content"
                Value="{x:Null}">
           <Setter Property="Visibility"
                Value="Collapsed" />
          </Trigger>
      </Style.Triggers>
  </Style>   

Da bi vaš window funkcionisao sa window-ima Languages i Flags, morate uvesti i napraviti reference za navedene window-e. Window-i FirstNames i LastNames imaju ograničene TextBox kontrole na 20 karaktera. Window MiddleNames morate proširiti na 30 karaktera jer kao što vidite, Lejdi Gaga ima dva imena koje tretiramo kao jedno polje srednjeg imena.


( Window MiddleName može sadržavati više imena )

Nastaviće se!

Srećno sa programiranjem!