Korišćenje izraza za izračunavanje vrednosti
Ranije ste imali prilike da vidite kako izgledaju izrazi kada ste u Report Designer-u prevlačili polja iz Dataset prozora u ćelije. Na primer, prva ćelija u redu detalja u Vašem izveštaju sadrži izraz =Fields!Product.Value. Ovo je najjednostavniji izraz. Kao i svaki drugi izraz, počinje sa znakom jednako (=) i napisan je u Microsoft Visual Basic-u. Ovaj izraz se odnosi na Product polje. Koristi se standardna sintaksa Visual Basic-a za kolekciju, u kojoj je Fields naziv objekta kolekcije, Product je naziv objekta u kolekciji i Value je svojstvo objekta. U ovom slučaju, izraz vraća vrednost polja Product u Fields kolekciji za trenutni red.
Moguće je kreirati mnogo složenije izraze korišćenjem funkcija ili kombinovanjem izraza za polje i matematičkih operatora kako bi se izvršila određena izračunavanja. Izraz u drugoj ćeliji =Sum(Fields!SalesAmount.Value), je primer izraza koji koristi agregatnu funkciju, o kojima ćete učiti kasnije. Izrazi se najčešće koriste za prikaz vrednosti polja i izračunatih vrednosti u izrazu.
Kada imate podatke za Vaš izveštaj, često ćete imati potrebu da izvedete dodatna izračunavanja koristeći te podatke da biste došli do vrednosti koje se ne čuvaju u bazi podataka. Na primer, možda ćete imati potrebu da u izveštaj uključite maržu za proizvod. Marža pretstavlja razliku između cene po kojoj se proizvod prodaje i troška izrade proizvoda. Iako marža nije vrednost koja se čuva u bazi podataka, ona se može izračunati iz vrednosti koje se čuvaju u bazi podataka, tako što je potrebno napraviti izraz koji oduzima CostAmount od SalesAmount. Izraz će biti dodat kao izračunato polje u dataset i koristiće se u tabeli kao da je deo originalnog dataset-a.
Ne baziraju se svi izrazi na poljima iz dataset-a. Drugi tip izraza koji ćete možda želeti da koristite u izveštaju se može kreirati korišćenjem globalne promenljive (global variable). Reporting Services pruža informacije o izveštaju, kao što je broj strane, kojoj se može pristupiti kroz Globals kolekciju. Na primer, da bi se pratio broj strana u izveštaju, mogu se koristiti PageNumber i TotalPages globalne promenljive, kako bi se pristupilo ovim podacima koje Reporting Services čuva. Može se kreirati polje za čuvanje izraza ili se on može uneti direktno u textbox. Na ovaj način možete izbeći pisanje koda za pristupanje broju strane.
Treći tip izraza koji se može koristiti u izveštaju su izrazi stavki izveštaja (report item expression). Za kreiranje ovih izraza koristi se ReportItems kolekcija da bi se pristupilo vrednosti uskladištenoj u textbox-u. Vrednost u textbox-u, ako je izvedena iz izraza polja, kao što je primer sa maržom, ne dolazi direktno iz dataset-a već se čuva tu da bi bila prikazana u izveštaju ili da bi se koristila u drugom izrazu. O textbox-u se može razmišljati ne samo kao o stavci za prikaz, već kao i o oblasti u kojoj će biti čuvana vrednost, koja može biti korišćena kao deo drugog izračunavanja.
Kreiranje izračunatih polja
Dataset prozor inicijalno sadrži listu polja iz baze sadržanih u dataset-u koji ste kreirali. Vi možete dodati izraz koji pretstavlja izračunato polje u listi. Jednom kreirano izračunato polje u dataset-u, može se koristiti u izveštaju kao i svako drugo polje iz dataset-a. Takođe, biće tretirano na isti način, za svaki red u dataset-u. Ako je potreno jedan izraz koristiti na nekoliko mesta, dobro je kreirati izračunato polje, tako da ukoliko je potrebno kasnije promeniti izraz to treba učiniti samo na jednom mestu. Međutim, takođe je moguće uneti izraz direktno u textbox kada se on koristi samo na jednom ili dva mesta.
Sada ćete kreirati polje koje će računati maržu za svaki proizvod. Nakon toga u izveštaj ćete dodati novu kolonu u koju ćete smestiti ovo polje.
- Pokrenite SQL Server Business Intelligence Development Studio i otvorite solution My
Adventure Works koji ste ranije kreirali.
- Otvorite Product Profitability izveštaj ako nije već otvoren, duplim klikom na naziv izveštaja u Solution Explorer-u.
- U Dataset prozoru proširite DataDetail, desni klik bilo gde u istom prozoru, a onda izaberite Add, nakon čega će se otvoriti Add New Field dijalog boks. Setite se da kada se doda polje, u redu zaglavlja će se pojaviti naziv polja.
- Za naziv polja unesite Margin.
- Izaberite Calculated Field opciju, a zatim kliknite na Expression koje se nalazi sa desne strane Calculated Field textbox-a. Edit Expression dijalog boks izgleda kao na slici.
Zapazite pet objekata kolekcija u listi na dnu leve strane dijalog boksa: Constants, Globals, Parameters, Fields (DataDetail) i Datasets.
- Kliknite na Fields (DataDetail) da biste videli njegove članove.
- Uradite dupli klik na SalesAmount da biste ga dodali u Expression panel. U Expression panelu, postavite kursor iza =Fields!SalesAmount.Value i onda unesite – (znak minus).
- Dupli klik na CostAmount polje u Fields panelu, da biste završili izraz. Edit Expression dijalog boks sada izgleda kao na slici.
- Alternativno, može se izraz uneti direktno, kucanjem izraza u polje, ali je mnogo sigurnije dodavati polja u izraz duplim klikom na odgovarajuće polje, pošto se tako izbegavaju greške u kucanju. Takođe, pošto je Microsoft Visual Basic .NET casesensitive, morate voditi računa o velikim i malim slovima u izrazu.
- Kliknite na OK da biste zatvorili Edit Expression dijalog boks. Izraz je dodat u Calculated Field textbox kao što je prikazano na slici.
- Kliknite na OK da biste zatvorili Add New Field dijalog boks. Margine polje je sada deo dataset-a i vidi se u Dataset prozoru, kao što je prikazano na slici.
- Snimite izveštaj.
U sledećem koraku dodaćete novu kolonu u tabelu, a u red detalja ćete smestiti izračunato polje Margin. U red podnožja dodaćete izraz koji računa među zbir marži.
- Kliknite na tabelu da bi se pojavili markeri. Desnim klikom na marker treće kolone (Order Quantity), a zatim izaberite Insert Column To The Right. Sada Vaš ekran izgleda kao na slici.
Nova kolona se pojavila u tabeli. Nova kolona je formatirana kao i kolona koju ste selektovali. U ovom slučaju, Format svojstvo Order Quantity kolone je postavljeno na N0, što je vrednost automatski dodeljena Format svojstvu nove kolone.
- Kliknite na Margin u Dataset prozoru i prevucite polje u poslednju ćeliju u redu detalja. Primetićete da je naziv polja dodeljeno automatski. Takođe, izraz postavljen u redu detalja je izraz koji referencira Margin polje i ne pretstavlja izraz koji je u pozadini, koji ste dodelili ovom polju.
- Prevucite Margin iz Dataset prozora u poslednju ćeliju table1_SubCategory podnožja, odma ispod reda detalja. Sum funkcija je automatski dodata u izraz za polje, zato što je u pitanju red podnožja.
- Pritisnite Enter kako biste selektovali izraz u ovoj ćeliji. Kopirajte izraz na clipboard, kliknite dva puta na ćeliju ispod, koja se nalazi u table1_Category podnožju, tako da se kursor pojavi u textbox-u, a zatim sadržaj iz clipboard-a prenesite u ćeliju.
Postoji razlika između kopiranja izraza u ćeliji i kopiranja ćelije. Kopiranjem izraza se ne kopira formatiranje u odredišnu ćeliju. Suprotno tome, kopiranjem ćelije se kopira formatiranje.
- Kliknite na poslednju ćeliju u podnožju tabele dva puta i zalepite izraz koji je još na clipboard-u, u ovu ćeliju.
- Kliknite na marker Margin kolone da biste selektovali sve ćelije u koloni i unesite C0 u Formatting svojstvo u Properties prozoru, kako bi se vrednost marže prikazivala kao valuta bez decimala.
- Snimite solution, a zatim pregledajte izveštaj da biste utvrdili da vrh izveštaja izgleda kao na slici.
Korišćenje globalnih promenljivih
Globalne promenljive su članice Globals kolekcije, u kojoj Reporting Services smešta informacije jedninstvene za izveštaj. Ove informacije se mogu prikazati u izveštaju, tako što se globalna promenljiva uključi u izraz smešten u textbox. Postoji šest globalnih promenljivih koje se mogu koristiti. Posebno je korisno dodati informacije o izveštaju na štampane izveštaje.
Globalne promenljive PageNumber i TotalPages mogu se koristiti samo u zaglavlju ili podnožju strane. Ostale globalne promenljive mogu se koristiti bilo gde, gde je moguće postaviti stavku izveštaja. Možete koristiti ExecutionTime da biste uključili datum i vreme kada je izveštaj izvršen. Da biste pomogli korisnicima da lociraju izveštaj online, možete uključiti naziv i lokaciju izveštaja korišćenjem ReportName, ReportServerUrl i ReportFolder (koji ukčjučuju celu putanju do izveštaja bez URL-a).
Globalne promenljive su drugačije od polja. Reporting Services ima vrednosti globalnih promenljivih tek posle procesiranja, a pre renderovanja izveštaja. Polja, se sa druge strane, popunjavaju vrednostima za vreme procesiranja i više nisu dostupne Reporting Services-u kada se procesiranje završi. Kao što ste naučili, podaci su nezavisni od izgleda izveštaja kako bi se omogućilo renderovanje u bilo koji format. Zbog toga neke informacije nisu dostupne za vreme procesiranja upita i spajanja u format izveštaja. Uzmimo za primer numerisanje strana. Izveštaj renderovan za preged u HTML-u ima drugačije numerisanje strana od istog izveštaja renderovanog za štampanje. Dok se izveštaj procesira i sprema za renderovanje, broj strane i ukupan broj strana neće biti dostupni kao vrednosti globalnih promenljivih.
Sada ćete izmeniti izraz u textbox-u prikazanom u zaglavlju strane i telo izveštaja da biste inkorporirali globalnu promenljivu ReportName u naslovu izveštaja.
- Kliknite na Layout tab, desnim klikom kliknite na textbox u zaglavlju strane, a onda izaberite Expressions.
- Zamenite postojeći izraz, Product Profitability Report sa = (znak jednako).
- Kliknite na Globals u krajnje levom panelu, kliknite na ReportName u srednjem panelu i zatim kliknite na Paste dugme.
Paste dugme će ubaciti izraz koji referencira selektovanu stavku u ovom slučaju Globals!ReportName, u Expression boks, kao što je prikazano na slici.
Obratite pažnju i na druge promenljive koje možete koristiti.
- Unesite +"Report" na kraju izraza tako da dobijete izraz =Globals!ReportName+" Report".
- Kliknite na OK.
- Desnim klikom kliknite na textbox koji sadrži naziv izveštaja u telu izveštaja, a zatim izaberite Expression.
- Zamenite postojeći izraz izrazom ="Adventure Works "+.
- Kliknite na Globals u krajnje levom panelu, dupli klik na ReportName u srednjem.
- Da biste završili izraz unesite + " Report" na kraju. Ceo izraz treba da izgleda ovako: ="Adventure Works "+ Globals!ReportName+" Report".
- Kliknite na OK.
- Snimite izvešta i pregledajte ga da biste proverili rezultate. Zapazite da je trenutni naziv izveštaja Adventure Works Product Profitability Report.
- Kliknite na Next Page dugme da biste proverili naslov u zaglavlju strane.
- U Solution Explorer-u, desni klik na Product Profitability.rdl, izaberite Rename, i onda unesite novo ime za izveštaj: Product Sales and Profitability.rdl.
- Kliknite na Refresh dugme u Preview toolbar-u da biste resetovali keširanu sesiju.
- Kliknite na Next Page dugme da biste proverili da li je naziv izveštaja ažuriran, kao što je na slici.
Korišćenje ReportItems kolekcije
ReportItems kolekcija sadrži textbox-ove izveštaja kao objekte. Možete koristiti izraz stavki izveštaja (report item expression) da biste prikazali vrednost textbox-a u drugom textbox-u ili da biste koristili vrednost kao deo nekog izračunavanja. Report item expression je sličan globalnim promenljivim zato što ga Reporting Services izračunava posle završetka procesiranja, a pre renderovanja. Izrazi polja u redovima detalja i agregiranim redovima moraju biti izračunati prvo od strane dataset-a, tako da textbox ima vrednost koja može biti korišćena od strane report item expression-a.
Report item expression, stoga može biti korišćen u situacijama kada je moguće izvršiti izračunavanja samo nakon što je dataset popunjen i računanje ne može biti izvedeno iz dataset-a. Na primer, za računanje međuzbira u tabeli, Sum funkcija je korišćena sa izrazom polja. Međutim, ako se korišćenjem izraza polja dobijaju procenti, Sum funkcija više nije primenljiva pošto se procenti ne mogu sabirati, jer bi se dobila pogrešna vrednost. Vrednost u procentima, u podnožju tabele, se ne može dobiti sabiranjem procenata iz redova detalja. U ovakvim slučajevima možete koristiti izraz stavke izveštaja za dobijanje ukupnog procenta u redovima u kojima koristite međuzbirove.
Izraz stavke izveštaja se koristi u textbox-evima unutar regiona podataka za vraćanje vrednosti textbox-eva koji su ili na istom nivou ili na višem nivou, ako je za region podataka definisano grupisanje. To znači da ne možete koristiti izraz u redu sa sumiranje, koji se odnosi na textbox u redu detalja. U suštini, to je zbog toga što izraz stavke izveštaja u regionu podataka izigrava pokazivač koji u jednom trenutku može pokazivati na jedan textbox, tako da može vratiti samo jedan rezultat. Zbog toga što više redova može biti na nižem nivou, ne postoji način da se odredi koji od redova sadrže vrednost koju report item expression treba da vrati.
Sada ćete napraviti izraz stavke izveštaja za računanje marže u procentima, u redovima detalja i zbira.
- Kliknite na Layout tab, kliknite na tabelu, desnim klikom kliknite na marker Margin kolone i zatim kliknite na Insert Column To The Right.
- U poslednjoj ćeliji zaglavlja tabele unesite Margin %.
- Kliknite na marker Margin % kolone da biste selektovali sve ćelije u koloni, a zatim unesite P1 u Format svojstvo, kako bi se izraz prikazao u procentima sa jednim decimalnim mestom.
- Desnim klikom kliknite na poslednju ćeliju u redu detalja, kliknite na Expression, unesite sledeći izraz u Expression panel i kliknite na OK.
=ReportItems!Margin.Value/ReportItems!SalesAmount.Value
Ovaj izraz možete takođe uneti direktno u textbox ili u Value svojstvo textbox-a u Properies prozoru.
Izraz vraća vrednost iz Margin textbox-a, a zatim deli vrednost sa vrednošću iz SalesAmount textbox-a. Ovo izračunavanje će biti izvršeno za svaki red detalja u izveštaju. Takođe možete koristiti i izraz =Fields!Margin.Value/Fields!SalesAmount.Value i dobićete isti rezultat, ali zasada koristite ReportItems kolekciju tako da možete naučiti nešto o ponašanju ove kolekcije u sledećim koracima.
- Unesite sledeći izraz u poslednju ćeliju podnožja tabele:
=Sum(ReportItems!Margin.Value)/Sum(ReportItems!SalesAmount.Value)
Ovaj izraz nije validan i proizvešće grešku.
- Kliknite na Preview tab. Vaš ekran izgleda kao na slici (redosled grešaka može biti drugačiji).
U Layout modu ne postoji funkcija za proveru grešaka. Da biste testirali izraz morate pregledati izveštaj.
U donjem delu ekrana u output prozoru prikazane su dve greške koje upućuju na korišćenje agregatne funkcije u stavci izveštaja. Ista poruka je prikazana dva puta, zbog toga što izraz koji ste dodali sadrži dve instance ReportItems-a. Dok god je textbox u tabeli u telu izveštaja i nije u zaglavlju i podnožju strane, ne može da se koristi Sum funkcija u njegovom izrazu.
Druge dve poruke odnose se na korišćenje dometa grupisanja sa stavkama izveštaja. Ovde se poruka prikazuje dva puta ali se odnosi na dve stavke izveštaja, na Margin i Sales Amount posebno. U ovom slučaju, greška se pojavila zato što se izraz nalazi u redu za sumiranje, a referencira stavku u redu detalja. Da bi se izbegla ova greška potrebno je u izrazu stavke izveštaja u textbox-u referencirati samo textbox koji se nalazi u podnožju tabele.
- Kliknite na Layout tab, kliknite na Sales Amount ćeliju u podnožju tabele, a zatim promenite Name svojstvo u SalesAmount_Total u Properties prozoru.
- Kliknite na Margin ćeliju u istom redu i promenite Name svojstvo u Margin_Total.
- Unesite sledeći izraz za poslednju ćeliju podnožja tabele:
=ReportItems!Margin_Total.Value/ReportItems!SalesAmount_Total.Value
Ovaj izraz koristi sume Margin koju deli sa SalesAmount sumom. Važno je zapaziti da se izraz stavke izveštaja odnosi samo na textbox-eve u istoj grupi – podnožje tabele - i ne koristi agregatnu funkciju. Vrednosti referenciranih textbox-eva Margin_Total i SalesAmount_Total su već dobijene iz agregatnih funkcija, tako da ne postoji potreba da se koristi druga agregatna funkcija.
- Kliknite na Sales Amount ćeliju u table1_Category podnožju, a onda promenite Name svojstvo u SalesAmount_Category.
- Kliknite na Margin ćeliju u istom redu, a zatim promenite Name svojstvo u Margin_Category.
- Dodajte sledeći izraz u Margin % ćeliju u table1_Category podnožju:
=ReportItems!Margin_Category.Value/ReportItems!SalesAmount_Category.Value
- Kliknite na na Sales Amount ćeliju u table1_SubCategory podnožju, promenite Name svojstvo u SalesAmount_SubCategory, a zatim kliknite na Margin ćeliju u istom redu i promenite Name svojstvo u Margin_SubCategory.
- Dodajte sledeći izraz u Margin % ćeliju u table1_SubCategory podnožju:
=ReportItems!Margin_SubCategory.Value/ReportItems!SalesAmount_SubCategory.Value
- Snimite solution, a zatim pregledajte izveštaj. Vrh Vašeg izveštaja izgleda kao na slici.
Marža u procentima se sada prikazuje korektno.