Kreiranje biznis aplikacija pomoću VS LightSwitch na TechDays 2011 u Sarajevu – Step by Step

U prethodnom blog postu sam najavio predavanje na konferenciji Microsoft TechDays 2011 u Sarajevu .

Predavanje je održano u skoro popunjenoj konferencijskoj sali hotela Sarajevo sa oko 100 učesnika. Fotografije sa konferencije održane 23.05.2011:

IMG_0547 IMG_6589 IMG_0552

U nastavku teksta ću prikazati način kako je moguće napraviti uz pomoć Visual Studio LightSwitch Beta 2 poslovnu aplikaciju za rad očne klinike (Vision Clinic) sa funkcionalnostima za manipulaciju sa podacima kao što su: unos, izmjena i pregled pacijenata, unos recepata za pacijenta, pregled proizvoda, pregled proizvoda na osnovu kategorije, popusti za proizvod i aktuelna cijena proizvoda. Kao primjer eksterne baze ću koristiti Contoso Database sa linka: http://code.msdn.microsoft.com/lightswitch.

Povezivanje sa eksternom bazom i kreiranje entiteta

U okviru Visual Studio potrebno je kreirati LightSwitch projekat sa nazivom VisionClinic. Za potrebe aplikacije potrebno je povezati se na external data source (Database) – PrescriptionDatabase, tabele Product (proizvodi) i Rebate (popusti).

image

Nakon povezivanja sa tabelama Product i Rebate, potrebno je podesiti atribute entieta Product.MSRP na tip Money, Product.ProductImage na Image, ProductRebate.Rebate na Money. Na ovaj način ne mijenjamo tip podataka nego samo kažemo LightSwitch da interpretira podatak kao Money kako bi ispravno prikazao podatak i koristio određena biznis pravila. Sledeći entiteti koje je potrebno kreirati su Patient (pacijent) i Prescription (recept) koristeći Add Table na Data Sources u okviru Solution Explorer-a.

Entitet Patient sa tipovima za svaki atribut (polje):

image

Full Name je kreiran kao Computed Property pri čemu će predstavlajti cijeli entiet Patient. Za Full name je potrebno unijeti kod na Edit Method:

result = LastName + " " + FirstName;

Za AccountNumber potrebno je dodati regex validaciju (Custom Validation):

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)");
     }
}

Odabirom entiteta Patient i izborom FullName za Summary Property u Properties smo postavili da atribut FullName predstavlja Patient.

Kako bi evidentirali recept kreiraćemo entitet Prescription (recept) i atribut RxDate-datum kreiranja recepta:

image

Kako bi završili model podataka potrebno je na entitet Prescription dodati veze (Relationship) na Patient (From Prescription to Patient:  Many To One) i Product (From Prescription to Product: Many To One). Kod veze Patient i Product ostvarena je veza između dva entieta iz dvije različite baze te je veza sa isprekidanim linijama.

Kreiranje ekrana za manipulaciju

Osnovni koncept u LightSwitch za manipulaciju sa podacima se naziva Screen. Za potrebe aplikacije ću kreirati sledeće ekrane (Add Screen u okviru Solution Explorer-a):

  • New Data Screen za entiet Patient (prikazati PatientDetails)
  • Detail Screen za enitet Patient (prikazati Patient Details i Patient Prescription)
  • Search Data Screen za entitet Patient

image

Za Screen Detail Screen za Patient se vidi koliko LightSwitch pomaže u procesu generisanja funkcionalnosti bez dodatnog posla kao što su: dodavanje i brisanje Prescription, export podataka u Microsoft Excel, pretraživanje Prescription, izmjena podataka za Patient. Za recept se može veoma jednostavno dodati dogme koje će raditi brisanje recepta i odmah snimanje sa sledećim kodom za dugme My Delete u metodi MyDelete_Execute():

this.Prescriptions.DeleteSelected();
this.Save();

Veoma zgodna funkcionalnost u okviru LightSwitch je mogućnost izmjene rasporeda elemenata na Screen u toku izvršavanja programa dok je još u Debug modu (Design Screen):

image

Na ovaj način je ubrzan proces sređivanja elemenata u okviru Screen-a jer nije potrebno u više iteracija raditi zaustavljanje aplikacije, izvršiti određenu izmjenu te opet pokrenuti program nego je sve to moguće u Live modu, dok aplikacija funkcioniše.

Kreiranje upita

Screen se može kreirati ne samo na osnovu entieta nego i na osnovu upita (Query). Za potrebe primjera ćemo kreirati Query za entitet Product (Add Query) sa nazivom: ProductByCategory

image

Cilj upita je da se na osnovu njega kreira List and Detail Screen (prikazati ProductDetails i ProductRebate) na osnovu koga je moguće unosom kategorije odabrati pripadajući Product.

Kada smo kreirali List and Detail Screen, potrebno je na nivou entiteta  product dodati Computed Property sa nazivom TotalCost čija uloga je da izračunava trenutnu cijenu proizvoda uzimajući u obzir preporučenu cijenu (MSRP) proizvoda i popuste za dati proizvod. U kod za TotalCost (EditMethod) unijeti sledeći kod:

decimal rebates = default(Decimal);
foreach (var item in ProductRebates)
{
  if (item.RebateStart <= System.DateTime.Today & item.RebateEnd >= System.DateTime.Today)
  {
    rebates = rebates + item.Rebate.Value;
   }
}
result = this.MSRP - rebates;

Kako je TotalCost novokreirano polje, potrebno je dodati polje na ekran sa Add:

image

Konačan izgled ekrana izgleda kao na sledećoj slici:

image

Pokretanjem napravljenog ekrana potrebno je unijeti u polje Product Category naziv kategorije nakon čega će se prikazati spisak svih proizvoda koji pripadaju odgovarajućoj kategoriji. Odabirom proizvoda moguće je mijenjati podatke za proizvod. Promjenom ili preporučene cijene (MSRP) ili popusta kreirano polje TotalCost se automatski preračunava.

Dozvole u LightSwitch

Microsoft Visual Studio LightSwitch ima ugrađene mogućnosti za autentifikaciju i autorizaciju bez ikakvog dodatnog programiranja. Kao primjer kreiraćemo dvije dozvole za rad u aplikaciji:

  • CanViewPatient – omogućava na nivou ekrana pokretanje Search Patient
  • CanInsertPatient – omogućava na osnovu entiteta Insert u bazu Patient

image

Da bi implementirali ove privilegije, prvo ćemo dodati CanViewPatient za SearchPatient/Write Code za metodu SearchPatients_CanRun:

this.User.HasPermission(Permissions.CanViewPatient);

Za CanViewPatient smo omogućili u Debug modu da se pokreće ekran (Granted for debug).

Privilegiju CanInsertPatient postavljamo na nivou entiteta Patient/Write Code za metodu Patients_CanInsert:

this.Application.User.HasPermission(Permissions.CanInsertPatient);

Pokušaj snimanja podataka za jednog pacijenta će biti onemogućen nakon akcije Save jer nismo u Debug modu omogućili snimanje podataka.

Publikovanje aplikacije u LightSwitch

Ono što je novina u Beta 2 verziji je da LightSwitch omogućava pored kreiranja desktop i web aplikacija i postavljanje aplikacija na Cloud na Windows Azure kao Host Application Services što značajno povećava upotrebljivost aplikacije.

image

Kao primjer smo odradili Publish VisionClinic aplikacije kao desktop aplikacije (out of browser Silverlight app). Kao rezultat akcije, nakon par ekrana gdje je potrebno odabrati bazu gdje će se odraditi kreiranje šeme baze kao i ostalih administrativnih podataka, dobija se setup.exe program  i ClickOnce Manifest na osnovu kojih je moguće odraditi proces instaliranja VisionClinic aplikacije. Do foldera gdje su smješteni instalacioni fajlovi se može doći pomoću desnog klika na Solution ‘VisionClinic’ i opcije Open Folder in Windows Explorer te putanje VisionClinic\Publish.

Na osnovu pokazanog primjera se može izvesti zaključak da je LightSwitch alata kojim se na veoma jednostavan način može kreirati poslovna aplikacija kako za desktop tako i za Web.

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 Microsoft Conference, Step by Step 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