Tuesday, November 27, 2007

Upotrebljivi izvestaji

Reporting Services, osnovno

SQL Server Reporting Services (skraceno SSRS) je intergralni deo paketa MS SQL Servera 2005 (posto cak i u Express ediciji!) i cini platformu za kreiranje izvestaja, kako mu samo i ime kaze.
Izvestaji mogu da sadrze tabele, grafikone i slike.
Ukratko, sve ono sto mozete da uradite u Excelu sa grafikonima mozete i ovde, pa cak i vise.

Izvestaji se prave na osnovu podataka sa bilo kog klasicnog izvora koji je "citljiv" Microsoft-u, znaci MS SQL baze podataka, XML, ODBC i jos nekih. Iskreno, zacudilo me je sto ima citanje podataka iz Oracle baze, SAP-a i Hyperion-a.

Za kreiranje (dizajniranje) izvestaja koristi se MS Visual Studio 2005. Kao projekat se navodi Reporting Service Project koji se nalazi u sekciji Business Intelligence koji se dobija nakon instalacije MS SQL Servera 2005 na masini ka kojoj vec postoji instaliran MS Visual Studio 2005.

Pre ikakvog rada treba proveriti da li je Reporting Services ukljucen (Start > Programs > Microsoft SQL Server 2005 > Configuration Tools).

Izvestaj se kreira iz Wizarda ili manuelno tako sto se prvo naprave izvori podataka koji ce se koristiti u izvestaju u tabu DataSources. Nakon kreirane konekcije i upita (ili store procedure) koja nam daje podatke, ide se u dizajn mod gde se kreiraju elementi izvestaja koji se prevlace iz Toolboxa.
Jako koristan objekat je Matix (matrica) koja kreira trodimenzionalnu tabelu, sto je jako korisno kada imamo podatke koji se ponavljaju u jednoj koloni (na primer, godine, a jel neko pomenuo redudantnost?!).
Druga korisna stvar je "ugradjeni" mehanizam collapse/expand koji funkcionise po principu "sad me vidis, sad me vidis" (Hide: true/false) kada postoji zavisnost od drugih objekata koji se nalaze u izvestaju (moze cak biti i textbox). I jedno upozorenje, ovde textbox nije standardni texbox koji je otvoren za unos texta, vec je Label kontrola. Grafikoni mogu biti u vidu pite, barova, linija, u 3d-u.
Zatim sledi klasicna igrarija sa bojama, filtriranjem, sortiranjem i sl.

Izvestaj se moze videti kako ce izgledati sa podacima u Preview tabu. Svi izvestaju se cuvaju u RDL fajlu, koji je zapravo XML. Kada smo zadovoljni sa izgledom izvestaja i ostaje nam da uradimo Deploy na localhostu i da se divimo svom "umecu".

Po defaultu, izvestaji se nalaze na localhost masini (localhost/reportingservices/).
Ok. I sta sad?

Ove izvestaje koje ste napravili se mogu implementirati u windows i web aplikacije, pomocu odgovarajucih kontrola, naravno u .NET okruzenju.

VBA za Reporting Services i cemu sve to?

Od pocetka je Microsoft gurao u svoje aplikacije i dodatne stvari koje navodno "olaksavaju zivot". Medju njima je i Visual Basic for Applications (VBA) koji je upakovan u MS Ofiice od verzije 5 koja je izasla 1993. godine.

Najkoriscenij je u MS Excel-u, te ako ste i obicni korisnik ovog progama, sigurno se koristili i VBA, ali nesvesno. Sama kalkulacija sa izracuvanje sume skupa celija je VBA (funkcija Sum).

Kasnije se VBA ustalio i u ostalim MS aplikacijama, pa i u sam MS Visual Studio. Koristio sam ga dosta za pravljenje izvestaja, pomaze mnogo u smanjenju resursa "sa druge strane" (citaj baze podataka) jer ima sve agregatne funkcije (sum, count, avg...) koje ima i bilo koja verzija SQL-a.
Stoga je lakse ne opterecivati RDBMS (Relation DataBase Managment System), vec sva izracunavanja raditi na nivou svoje aplikacije, u ovom slucaju sa serverske strane.

Takodje, Progam Flow funkcije (programskog toka) olaksavaju posao, neizmerljivo.
Na primer, imao sam izvestaj sa rezultujucom tabelom (DataSet) koja daje mesece, ali kao brojeve. Kako bi izvestaj bio dopadljiviji, morao sam da prikazujem mesece po svim imenima. Za ovo sam koristio funkciju Choose, i kao izraz (Expression) u textbox polje sam uneo:
=Choose(Field!Mes.Value, "Jan", "Feb", "Mar"...)
(tri tacke znaci da ima jos, ali me mrzi ka kucam)
Ova funkcija uzima vrednost polja (prvi parametar) koji predstavlja index niza koji je unesen, a to su meseci (kao drugi parametar) i vraca vrednost tog clana, tj vraca naziv meseca. Napomena da ovde niz krece od 1, a ne od 0.
Drugi parametar moze biti bilo koji objekat.
Ok, konkretno u ovom slucaju sam mogao da koristim i funkciju Month(Field!Mes!Value), s tim sto se mora podesiti Report na zeljeni jezik, ako ne zelimo da imamo engleske nazive meseci.

Drugi primer je funkcija Iif (da, ima dva slova I, malo i) koja predstavlja svojevstan if-else programski blok. Imao sam takodje u pomenutoj tabeli vrednosti za pol, te je 1 predstavljalo muski, a broj 2 je predstavljao zenski. Te sam uradio sledece:
= Iif(Field!Pol.Value=1, "Muski", "Zenski")
Ovim sam dobio da mi se u polju prikazuju vrednosti "Muski" ili "Zenski" u zavisnosti da li je uslov iz prvog parametra ispunjen. Ako je uslov tacan (true) ispisuje se drugi parametar, ako uslov nije tacan, ispisuje se treci parametar.

Ovu funkciju sam koristio i za jos neke stvari, kao na primer, da pitam da li postoji unet parametar na nivou Reporta. Kao izraz za filter tabele sam uneo
Field!Atribut.Value = Iif(IsNothing(Parameter!Atrubut.Value), Field!Atribut.Value, Parameter!Atrubut.Value)

Funkcija IsNothing (ustvari IsNull) takodje vraca true ili false u zavisnosti da li je uneti parametar null ili ima neku vrednost (na primer nula ;)). Ako Report parametar postoji, uzmi ga i prikazi samo one zapise koji su mu jednaki, ako ne postoji, prikazi sve zapise u tabeli iz DataSet-a.

Posto ovo nije pravi If uslov kao u klasicnom programiranju, te nema Else, prilikom postavljanja vise uslova, uzima se u obzir funkcija Switch. Ovo sam koristio kada sam prikazivao sumarne podatke (konkretno medicinski slucajevi za bolesti) po polovima, ili ukupne. Pol se bira kao parametar izvestaja i ima vrednosti 0, 1 i 2. Nula oznacava da se prikazje izvestaj za oba pola, 1 je muski a 2 je zenski pol. U ovom slucaju sam u DataSet-u imao kolonu Muski i kolonu Zenski sa ukupnim brojem slucaja za pojedinu bolest. Kao izraz za polje u tabeli sam koristio:
= Switch(Parameter!Pol.Value=0, Field!Muski.Value+Field!Zenski.Value, Parameter!Pol.Value=1, Field!Muski.Value, Parameter!Pol.Value=2, Field!Zenski.Value)
Ova funkcija radi kao i klasican Switch - Case u programskim jezicima. Prvi parametar je uslov, drugi je izraz koji se izvrsava ako je uslov zadovoljen, treci parametar je drugi uslov, cetrvrti je izraz koji se izvrsava ako je uslov iz treceg parametra zadovoljen i tako dalje, respektivno.

Ovo su sve tri funkcije toka koje se mogu naci pri dizajniranju RS izvestaja.
Ne verujem da VBA olaksava zivot, ali olaksava da se neki zadaci izvrse na jednostavniji i brzi nacin, i da izbegnete odgovor "ne moze" na jos jedno u nizu klijentovih pitanja.

(Inter)nacionali domeni

Imam rodjake koji zive u mestu Torredembarra u Spaniji. Zapravo u Kataloniji, u 80 km od Barselone. Dali su mi par adresa nekih web sajtova kako bih imao sliku o tome gde i kako zive.
Vidim ja, svi sajtovi su pod domenom .cat. Hmm, rekoh, da nije mozda opet neka muvacina kao sto je sa SR, CC, TK i sl.
Krenem da istrazujem i dodjem do informacije da je domen CAT zvanicno odobren od ICANN-a (Internet Corporation for Assigned Names and Numbers) decembra 2005. i da registar .cat domena vodi fondacija puntCAT.

Pomenuta fondacija je predala zahtev ICANN-u za dobijanje domena .cat, navodeci kao cilj tj, nameru "da sluzi katalonskoj lingvistici (koja se inace razlikuje od spanske) i kulturnoj zajednici na Internetu, ostvarivanje komunikacije na katalonskom, promovisanje razlicitih aspekata katalonske kulture". Ukoliko sajt nije kompletno na katalonskom, na skoro (ako ne i na) svakom sajtu postoji izbor jezika, bilo kroz tekst, bilo kroz zastavu. Ovo je jako interesantno, jer pitanje je da li zastava, kao simbol, moze da predstavlja samo jezik? Ili mozda nesto vise?

Drugo, za neke sajtove moze da se kaze da krse "pravila", tako da postoje sajtovi koji su klasicni korporativni (http://www.tv3.cat, http://www.telecos.cat/), pa cak i komercijalni (npr. http://www.active24.cat). Mozda samo predstavljaju odrzavanje katalonskog jezika...


Da se razumemo, nemam ja nista protiv, ali sve ovo me je povelo na razmisljanje da li mozda moze Vojvodina da dobije svoj .voj domen koji bi na primer sluzio Madjarima koji zive u Srbiji, onda domen .rom koj bi sluzio Romima za ocuvanje romskog jezika i kulture, .sum za promovisanje Sumadije, pa na kraju i .kos koji bi koristili albanci sa Kosova (ukoliko se ne odcepe).


Valjda i ovde vazi pravilo, kako kaze ona narodna, "ko te jebe kad si glup".

Google broji klikove

Nekoliko puta sam spazio da linkovi na rezultatima pretrage (saznah i za novu skracenicu - SERP (Search Engine Results Page)) imaju "prefikse" (ne pricam o servisam aAdWords i AdSense).
Link sada nisam sacuvao, ali je ocigledno da Google uradi jedan mali "inkrement" u svojoj bazi.
Za sta ona sluzi (kakvo glupo pitanje?!) i zasto ti podaci nisu dostupni, ko zna.

Inace, ovo brojanje se ne pojavljuje uvek (uglavnom traje jedan dan) i ne za sve reci koje se koriste u pretrazivanju. Na primer, gledajuci kakvo je stanje sa mojim Receptima (www.recepti.co.yu) neki dan, Google tada brojao klikove samo za kljuci rec "recepti". Za ostale reci po kojima sam pretrazivao, sve je bilo normalno.

Kad nadjem link, poslacu ga, imam ga negde, samo da ga iskopam...

Internet marketing .cl

Chile je u ovom segmentu totalno OUT. Iako ima firmi, koje se prvenstveno bave izradom web sajtova, koje se bave optimizacijom za pretrazivace i reklamiranjem na Internet pretrazivacima, situacija je kao u Srbiji pre 2 godine - nikog to ne zanima.

Najcesci vid marketinga je "guerilla" (gerila, ili reklamiranje "udri po svemu") koji naravno rade samo velike firme (banke, osiguravajuca drustva i robne kuce) i ministrastva.

Na primer, interesantno je da sajt www.pcfactory.cl, inace najveci prodavac kompjuterske opreme za SOHO (SmallOfficeHomeOffice) i za krajnje korisnike, ima preko 20.000 poseta dnevno, a da pritom sa pretrazivaca dolazi svega 6% poseta. Svi ostali idu na sajt direktnim ukucavanjem adrese u browser.

Cenim da je ista situacija i sa velikim robnim kucama Paris, Falabella i Ripley koji kao i PCFactory, imaju online prodaju gde su neke cene nize nego u radnji.

Tuesday, November 20, 2007

Odlucio sam da ne smaram ljude....

...pa sam sve postove o svojoj profesionalnoj delaatnosti prebacio ovde.
Ne smaram one koji nisu u IT-u, a i meni bre lakse ovako. Ako nesto zaboravim znam gde da trazim.
:)

Monday, March 12, 2007

GridView skrivena kolona

Namece se potreba da korisnik ne vidi identifikator (ID) zapisa koji se prikazuje u tabeli, jer njemu taj broj u vecini slucajeva nista ne znaci. Tabela se kreira pomocu web kontrole GridView.

Na "prvu loptu" sam uradio analogiju da DataGrid kontrolom i pokusao da stavim sirinu kolone 0 (width = 0). Medjutim, kolona se i dalje prikazivala.
Usledilo je drugo resenje koje se bazira na sakrivanju kolone postavljanjem propertija (osobine) Visible na vrednost False u objektu GridViewColumn.

Medjutim, posto se kontrola kreira pre punjenja (binding-a) vrednost Visible se mora postaviti na true kako bi se u kolonu uopste i smestili podaci.

GridViewPodaci.Columns[0].Visible = true;
GridViewPodaci.DataBind();
GridViewPodaci.Columns[0].Visible = false;

Dakle, prvo se kolona oznaci vidljivom, zatim se podaci umetnu u kolonu koju potom sakrivamo od pogleda korisnika.