LightSwitch – Rad sa tabelama

U prethodnim blog postovima posvećenim Visual Studio LightSwitch Beta2 fokus je bio na kreiranju poslovnih aplikacija u cjelini, bez puno detaljisanja oko svakog pojedinačnog segmenta tog razvoja.

U narednim postovima ćemo se detaljnije pozabaviti sa svakim od pojedinačnih segmenata kao što su:

Savremena poslovna aplikacija ne može da se zamisli bez podataka smještenih u bazi podataka. Da bi uopšte mogli da radimo sa bazom prvi korak je da napravimo relacioni model baze podataka koji odgovara našem poslovnom procesu. U najopštijem smislu, model čine entiteti (u daljem tekstu tabele) i relacije između tabela.

Tabela

Kreiranje tabele je moguće izvesti na više načina:

  • Add Table sa desnim klikom miša na stavku Data Sources u okviru Solution Explorer ili
  • New Table u okviru Table Designer:

NewTable

Kreiranjem tabele dobijamo sledeće:

image

Prvo što je potrebno uraditi je dati naziv tabeli u zaglavlju tabele na mjestu “Table1Item”. Tačnije, ovo predstavlja naziv entiteta što predstavlja jednu pojavu, jednu stvar (u konkretnom primjeru-Patient). Ali ono što će LightSwitch odraditi za vas je da će se u Solution Exploreru pojaviti naziv tabele i to u množini (Patients). Bitan podatak za samu tabelu je i Summary property koji predstavlja reprezenta tabele. Ovaj podatak može biti bilo koje polje ali je preporuka da se, ako je to potrebno, kreira Computed property kojeg će činiti više polja, npr. Ime i prezime.

Polja

Nakon toga se unose podaci za polja tabele koga čine:

  • Name – naziv polja
  • Type – tip polja
  • Required – da li je polje obavezno ili ne prilikom inserta podatka u tabelu. Ako je polje obavezno onda validacija na nivou tabele radi svoj posao tako što ne dozvoljava Insert u tabelu ako ovo polje nije uneseno na ekranu. Ukoliko nam je neko polje bitno iz bilo kog razloga onda je potrebno da se polje proglasi obaveznim.

Pored standardnih tipova polja kao što su:

  • Binary,
  • Boolean,
  • Date,
  • DateTime,
  • Decimal,
  • Double,
  • Image,
  • Integer,
  • Long Integer,
  • Short Integer i
  • String

postoje i tipovi kao što su:

  • Email Address i
  • Phone Number

kod kojih je moguće definisati određene osobine kao što su:

  • Email Address – default email domain. U ovom slučaju je potrebno unijeti, na ekranu za unos podataka, samo dio emaila bez domena što značajno ubrzava i pojednostavljuje proces unosa podataka
  • Phone Number – phone number format. Moguće je definisanje formata broja telefona, tačnije više različitih formata koje je potrebno koristiti prilikom unosa podataka na ekranu za unos. Pored toga, prilikom unosa broja telefona na ekranu za unos, sam LightSwitch nudi polja za unos dodatnih podataka kao što su kod zemlje, pozivni broj grada, lokalni broj telefona i lokal:

PhoneNum

Svako od polja se može uključiti u jedinstveni index sa Include in Unique Index. Označavanjem da je polje dio jedinstvenog ključa obezbjeđuje se da se odgovarajuća pravila validacije automatski generišu u bazi podataka.

Pored toga, svako od polja, ako je “String” prirode može ući u obzir prilikom korištenja ekrana za pretraživanje sa Is Searchable. Ako se ovaj atribut ne uključi, prilikom pretrage u Search polju na ekranu koji uključuje ovu tabelu, neće se vršiti pretraga po ovom polju.

image

Computed Property

Ukoliko želimo da polje ima vrijednost sastavljenu od više polja onda ćemo koristiti Is Computed. Kreiraćemo Computed Property sa nazivom FullName te potom na link Edit Method za polje kreirati sledeći kod u metodi FullName_Compute:

result = LastName + " " + FirstName;

Da bi FullName imao svoju funkciju u potpunosti, potrebno je selektovati tabelu u kojoj se nalazi FullName i  odabrati Summary property da bude FullName. Praktična primjena ovoga bi bila na ekranu za pretraživanje pri čemu bi Full Name predstavljao tabelu i koji bi imao funkciju linka koji bi otvarao ekran sa detaljnim podacima o pacijentima:

image

Validacija

Za svako od polja u okviru tabele se može pisati određena custom validacija tako što odaberemo polje i u okviru Properties sekcije polja kliknemo na link Custom Validation:

CustomVal

Tako npr. validacija za unos računa u banci bi korišćenjem Regex-a bila:

partial void AccountNumber_Validate(EntityValidationResultsBuilder results)
{
  // results.AddPropertyError("");
  if (AccountNumber != null)
  {
    if (!System.Text.RegularExpressions.Regex.IsMatch(AccountNumber, @"^\d{3}-\d{3}-\d{8}-\d{2}"))
    {
     results.AddPropertyError("Provide a valid account number (ex 555-007-12345678-01)");
    }
  }
}

Poruka koju generiše LightSwitch aplikacija u okviru ekrana za unos podataka je:

image

Validacijom se forsira unos broja računa u određenom predefinisanom formatu. Ukoliko se ne unese ispravno račun, nije moguće preći na unos narednog polja jer ćemo dobiti poruku da obezbijedimo ispravan broj računa u traženom formatu.

Sortiranje

Po default-u LightSwitch sortira podatke po polju id koje se uvijek automatski kreira kada kreiramo novu tabelu. Kako sortiranje po ovom polju nije baš najbolje rješenje u svim slučajevima, postoje dva načina kako možemo odraditi sortiranje:

  • kreiranjem sorted query kojeg ćemo koristiti na svakom ekranu gdje je potrebno sortiranje prilikom prikaza podataka (detaljnije ćemo vidjeti ovaj konecpt kada budemo obrađivali upite)
  • izmjena sorta na strani servera za tabelu (middle tier). Ovaj sort će nasljediti svi upiti koji se kreiraju za datu tabelu.

Da bi ostvarili efikasniji sort, za tabelu Pacijent ćemo promijeniti upit na strani servera. U okviru table designer-a za tabelu Pacijent ćemo otvoriti Write Code i odabrati metodu Patients_All_PreprocessQuery:

image

U Code editoru će nam se otvoriti ApplicationDataService.cs što se izvršava na logičkom nivou (middle tier). U metodi ćemo odraditi override upita tako što ćemo dodati novi sort pomoću LINQ-a. Cijela metoda:

partial void Patients_All_PreprocessQuery(ref IQueryable query)
{
  query = from Patient s in query
  orderby s.LastName, s.FirstName
  select s;
}

Tabela koju smo koristili u cjelini izgleda:

image

Na kraju ćemo na nivou tabele odraditi praćenje informacije ko je i kada odradio kreiranje stavke u tabeli i kada je i ko izmjenio podatke. Snimanje podataka o momentu kreiranja stavke u tabeli ćemo odraditi automatski kada god se odradi Insert u tabelu Pacijent. U dizajneru tabele za tabelu Pacijent u Write Code ćemo odabrati metodu Patient_Created:

partial void Patient_Created()
{
  CreatedTime = DateTime.Now;
  UpdatedTime = DateTime.Now;
  UpdatedBy = Application.User.Name;
}

Pored snimanja informacije o Insertu u tabelu na nivou tabele, potrebno je pratiti i izmjene podataka. Napravićemo na middle tier u okviru metode Patients_Updating snimanje podataka u polja UpdatedTime i UpdatedBy:

partial void Patients_Updating(Patient entity)
{
  entity.UpdatedTime = DateTime.Now;
  entity.UpdatedBy = Application.User.Name;
}

Prilikom razvoja aplikacije pomoću Visual Studio LightSwitch i pokretanja aplikacije u Debug modu, moguće je izvršiti unos podataka kroz aplikaciju. Ti podaci se smještaju u internu bazu u okviru LightSwitch. Publish-ovanjem aplikacije se samo model podataka sa ostalim pravilima koje generiše LightSwitch exportuju u bazu koju podržava LightSwich.

U narednim postovima će biti detaljno objašnjeni sledeći koncepti koje nudi Microsoft Visual Studio LightSwitch a kao prva u nizu će biti relacije između tabela.

About Spaso Lazarevic

Spaso Lazarevic is Senior Software Developer working with Microsoft technologies. Leader of .NET User Group Bijeljina, speaker at Microsoft events, writter and blogger. Microsoft MVP for Visual C#.
This entry was posted in Programming and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s