BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Dynamiczne systemy raportowe

17-05-2005 03:15 | Szybiszj
Poniższy artykuł poświęcony jest tworzeniu dynamicznych systemów raportowych za pomocą narzędzia „MS SQL Server Reporting Services”, które z dnia na dzień cieszy się coraz większą popularnością w śród właścicieli średnich i dużych firm. Cóż – w dzisiejszych czasach dynamiczne systemy raportowe są bardzo ważnym elementem każdej większej dobrze prosperującej firmy, a Reporting Services posiada dwie fundamentalne zalety. Po pierwsze daje możliwość łatwego administrowania, zarządzania i nadawania pr

Wstęp – opis środowiska.

 

Reporting Services to środowisko, które pozwala użytkownikom o różnym poziomie zaawansowania na tworzenie własnych dynamicznych raportów. Mimo że możemy dodać kod programu do raportu w celu większej możliwości kontrolowania formatowania i danych, nie musimy mieć żadnego doświadczenia w programowaniu. Gotowe raporty mogły być udostępnione przez Internet lub intranet w kilku formatach, między innymi PDF i TIFF, które wyglądają dobrze zarówno w przeglądarce, jak i na wydruku. Ponadto Reporting Services zapewniają infrastrukturę, która powoduje, że dostęp do tych raportów jest wygodny i bezpieczny. Zamiast budowania nowego środowiska do tworzenia raportów w Reporting Services, Microsoft wykorzystał istniejące już środowisko dostępne w Visual Studio .NET. Możemy więc wprowadzaa kompletne raporty z Visual Studio .NET do Reporting Services, który zarządza bezpieczeństwem, buforowaniem danych i innymi funkcjami raportującymi. Reporting Services dostarcza odbiorcom raporty w różnych formatach wykorzystując zarówno metodę typu pull (pobierania na życzenie), jak i push (dostarczanie według planu). „Klejem” łczącym raport zaprojektowany w Visual Studio.NET z raportem dostarczanym przez Reporting Services jest język RDL (Report Definition Language). Język ten oparty jestna XML i obejmuje wszystkie informacje dotyczące projektu raportu. Raport tworzymy jako dokument RDL w Visual Studio. Następnie Visual Studio wprowadza RDL do Reporting Services, który zapisuje go w bazie danych SQL Server. Kiedy Reporting Services dostarcza raport do użytkownika, przetwarza definicję RDL raportu, przekładając ją na bardziej zrozumiały format, taki jak strona HTML lub dokument PDF.

 

 

Składniki potrzebne do instalacji

 

1)       OS: Windows

2)       IIS (internetowe usługi informacyjne)

3)       Microsoft  .NET Framework 1.1

4)       Microsoft SQL Server 2000

5)       Microsoft SQL Server 2000 Service Pack 3

6)       Microsoft Visual Studio .NET

7)       Microsoft SQL Server 2000 Reporting Services

8)       Microsoft SQL Server 2000 Reporting Services

Uwaga: Składniki powinny być instalowane zgodnie z  kolejnością na liście

 


 

 

 

 

 

 

 

Tutorial – Tworzenie raportu w środowisku Reporting Services

 

 

 

Otwieranie nowego projektu

 

Wybieramy: File ->  New Project -> Business Intelligence Project -> Report Project i klikamy ok.

 

 

 

 

 

 

 

Zakładka Data

 

Zakładka Data służy do tworzenia DataSet’ów wykorzystanych  później w innych miejscach aplikacji albo do wypełniania comboboxów z parametrami, za pomocą których można filtrować dane pojawiające się w raporcie, albo do dostarczenia danych do tabel, wykresów itp. samego raportu.

 

 

  

 

Tworzenie nowego DataSetu składa się z dwóch etapów. W pierwszym należy ustalić połączenie z wybranym serwerem SQL a następnie z odpowiednią bazą (rysunek poniżej). W drugim etapie należy natomiast napisać polecenie dla serwera w języku SQL  który wybierze z tabel interesujące nas dane (rysunek powyżej). Należy tu podkreślić, że tworzenie zapytań SQL może się sprowadzać do naprawdę bardzo prostej operacji, gdyż możemy je zaprojektować za pomocą Query Designera.

 

 

 

 

Ponieważ w Dane które pojawiają się w DataSet’ach często uzależnione są od parametrów istnieje możliwość edytowania listy parametrów. Aby to uczynić należy kliknąć zakładkę Report -> Report parameters.. (rysunek poniżej). Gdy to uczynimy pojawi się przed nami okno Report Parameters w którym będzie można dla każdego parametru ustalić takie właściwości jak typ danych, wartość początkową, oraz DataSet z którego czerpane będą dane do wypełnienia rozwijanej listy dla tego parametru.

 

 

 

 

 

 

 

 

Zakładka Layout

 

Zakładka Layout pozwala na projektowanie wyglądu raportu. Udostępnia ona opcje zbliżone do tych, które daje nam Web Form w aplikacji webowej, mające zapewnić możliwość wykonania nawet dość skomplikowanego interfejsu graficznego w bardzo prosty sposób. Mimo wielu podobieństw między zakładką layout naszego raportu, a Web Formem istnieją także dość znaczące różnice, z których najważniejszą jest funkcjonowanie kontrolki Table – ponieważ dane którymi jest wypełniana czerpane są z bazy danych. Każdej tabeli należy więc przypisać odpowiedni DataSet, a następnie (tak jak na poniższym rysunku) wybrać nazwy pól, które będą pojawiały się w określonych komórkach naszej tablei. Dodatkową opcją jest grupowanie według odpowiedniej kolumny DataSetu oraz przysłanianie duplikatów rekordu.

 

  

 

 

Często używaną opcją jest również dodawanie do raportu nagłówka lub stopki, które wyświetlane są na każdej stronie raportu. Można w nich umieścić np. takie informacje jak nazwa raportu, numer strony, data uruchomienia – bardzo przydatna, gdy później eksportujemy raport, lub go drukujemy, aby można było dokłanie określić, z którego dnia i godziny zawiera dane.

 

Ponieważ nie sposób opisać wszystkie opcje, które daje nam reporting services chciał bym jedynie zwrócić jeszcze uwagę na jedną, ale uważam że ważną cechę tego narzędzia do tworzenia raportów, którą jest możliwość dodawania do raportu własnych funkcji napisanych w języku Visual Basic .NET. Łatwo się przekonać, że mimo bardzo wielu możliwości Reporting Services, nie zawsze można osiągnąć pożądany efekt. Często stajemy przed ograniczeniami, których nie da się obejść w inny sposób niż właśnie dopisując własne instrukcje. Aby dopisać własny kod do raportu należy kliknąć zakładkę Reprot -> Report Porperties -> Code

 

 

 

 

 

 

 

  

Zakładka Preview

 

Zakładka preview udostępnia możliwość oglądania efektów naszej pracy nad pojedynczym raportem, bez potrzeby  publikowania całego projektu na serwerze. Uważam że rozwiązanie to jest bardzo przydatne zewzględu na to, że często jeden projekt zawiera kilkanaście raportów, więc publikowanie  aplikacji jest w takich wypadkach wyjątkowo czasochłonne, zwłaszcza że trwa to dość długo nawet, gdy projekt składa się tylko z jednego raportu.

Niestety – muszę z przykrością przyznać, że tutaj nie zawsze wszstko działa tak jak należy i często trzeba zbudować całą aplikację, aby sprawdzić jak będzie się ona zachowywać i wyglądać w normalnych warunkach. Mimo to uważam, że zakładka preview może być bardzo pomocna.

 

 

 

 

 

 

  

 

Report Server

 

Gdy raport zostaje skończony zostaje opublikowany na specjalnym serwerze „Report Server” , który umożliwia właścicielowi zarządzanie raportami. Można tu przydzielać prawa dostępu dla poszczególnych użytkowników, zmieniać parametry dotyczące połączenia z serwerem SQL oraz modyfikować wiele innych parametrów. Przede wszystkim jest to jednak serwer, który może być widoczny zarówno w sieci LAN jak i w Internecie z pomocą, którego można oglądać raporty z dowolnego miejsca na ziemi.

 

 

 

 

 


 

 

 

 

  

 

 

Prezentacja projektu bazy danych z ocenami studentów.

 

Po krótkiej prezentacji i tutorialu dotyczącym tworzenia systemów raportowych w środowisku Reporting Services chciałbym przedstawić państwu również projekt bazy danych z ocenami studentów na uczelni, który może być doskonałym przykładem jak dynamiczne systemy raportowe mogą zostać wykorzystane w normalnym życiu.

 

 

Opis projektu

Projekt składał się z trzech komponentów, z których każdy jest stworzony w innym środowisku.

 

1) Baza danych – która stworzona jest za pomocą narzędzia Microsoft SQL Serwer.

 

2) Interfejsu Windowsowego – za pomocą  którego można edytować bazę. Interfejs napisany został w języku C#.NET jako Windows Application.

 

3) Interfejsu WWW  - który prezentuje rekordy znajdujące się w Bazie danych. Interfejs stworzony został w Środowisku Visual Studio.NET Reporting Services.

 

 

 

Baza danych

 

Baza danych składa się z 9 tabel i zaprojektowana jest w taki sposób, aby zapewnić odpowiednią funkcjonalność tworzonej aplikacji. Przy projektowaniu zwróciłem szczególną uwagę na to, aby dane zajmowały jak najmniej miejsca w bazie w celu zapewnienia aplikacji jak najlepszej skalowalność.

(Poniższy rysunek przedstawia diagram bazy danych)

 

 

 

 

Poniżej przedstawiam najciekawsze zapytania SQL do bazy danych

 

---Pobieranie informacji o średnich ocenach---

select 

 ROUND(AVG(ocena),2 )as srednia,

 Studenci.nazwisko as nazwisko,

 Grupy.numer as grupa,

 Semestry.numer as semestr,

 Kierunki.nazwa as kierunek,

 Wydziały.nazwa as wydzial

from Wydziały inner join Kierunki on Wydziały.id=id_wydział

inner join Grupy on Kierunki.id= id_kierunek

inner join Semestry on Semestry.id = id_semestr

inner join Studenci on Studenci.id_grupa=Grupy.id

inner join Oceny on id_student =id_indeks

inner join Zajecia on Zajecia.id=id_zajec

inner join Przedmioty on Przedmioty.id = id_przedmiot

inner join Wykładowcy on Wykładowcy.id =id_wykładowca

where

(id_wydział=@wydział OR @wydział=0) AND

(id_kierunek=@kierunek OR @kierunek=0) AND

(Grupy.id=@grupa OR @grupa=0) AND

(id_semestr=@semestr OR @semestr=0) AND

(id_indeks=@student OR @student=0) AND

(id_przedmiot=@przedmiot OR @przedmiot =0 )AND

(id_wykładowca= @wykładowca OR @wykładowca =0)

group by  Wydziały.nazwa, Kierunki.nazwa, Semestry.numer, Grupy.numer, Studenci.nazwisko

order by srednia

 

 

--Wstawianie nowych ocen do bazy---

DECLARE @id int; SELECT     @id = (MAX(id) + 1)

FROM Oceny;

INSERT INTO Oceny(id, ocena, komentarz, id_student, id_zajec)

VALUES (@id, @ocena, @komentarz, @student, @zajecia);

 

 

 

--Pobieranie studentów z odpowiedniej grupy—

  IF EXISTS (SELECT     id_indeks

  FROM         Studenci

   WHERE     id_grupa = @grupa)

   SELECT     id_indeks, nazwisko

   FROM         Studenci

   WHERE     id_grupa = @grupa

   ORDER BY nazwisko; ELSE

   SELECT     id_indeks = 0, nazwisko = 'b

 

 

Interfejs Windows

 

Interfejs windowsowy zaprojektowany został w celu umożliwienia osobom upoważnionym edytowania rekordów bazy danych. Składa się on z 8 okien, które umożliwiają przeglądanie, modyfikowanie oraz dodanie nowych rekordów do bazy danych. Dane wyświetlone w tabeli filtrowane są za pomocą parametrów zawartych w comboboxach po prawej stronie interfejsu.

 

 

 

 

 

Ze względu na i tak obszerną już wielkość tego artykułu poniżej przedstawię tylko wybrane elementy kodu źródłowego okna przedstawionego na rysunku poniżej. W celu łatwiejszego zrozumienia poniższego kodu umieściłem w nim najistotniejsze komentarze.

 

private void Form1_Load(object sender, System.EventArgs e)

{

  try{

    //Wypełnianie Semestry

    adapterSemestry.Fill(dataSetSemestr);

    comboSemestr.DataSource=dataSetSemestr;

    comboSemestr.DisplayMember="Semestry.numer";

    comboSemestr.ValueMember="Semestry.id";

                       

    //Wypełnianie Wydziały

    adapterWydział.Fill(dataSetWydzial1);

    comboWydział.DataSource= dataSetWydzial1;

    comboWydział.DisplayMember="Wydziały.nazwa";

    comboWydział.ValueMember="Wydziały.id";

                       

    //Wypełnianie Kierunki

    adapterKierunki.SelectCommand.Parameters[0].Value     

    =comboWydział.SelectedValue;

   

    adapterKierunki.Fill(dataSetKierunek);

    comboKierunek.DataSource=dataSetKierunek;

    comboKierunek.DisplayMember="Kierunki.nazwa";

    comboKierunek.ValueMember="Kierunki.id";

 

    //Wypełnianie Grupy

    adapterGrupa.SelectCommand.Parameters[0].Value =    

    comboKierunek.SelectedValue;

    adapterGrupa.SelectCommand.Parameters[1].Value =

    comboSemestr.SelectedValue;

    adapterGrupa.Fill(dataSetGrupa);

    comboGrupa.DataSource=dataSetGrupa;

    comboGrupa.DisplayMember="Grupy.numer";

    comboGrupa.ValueMember="Grupy.id";

                       

    //Wypełnianie grida

    sqlDataAdapter1.SelectCommand.Parameters[0].Value =    

    comboGrupa.SelectedValue;

    sqlDataAdapter1.Fill(dataSet1);

    dataGrid1.DataSource=dataSet1.Tables[0];

    this.readOnly_check();

  }

  catch(System.Exception se)

  {

    MessageBox.Show(se.ToString());

  }

}

 

private void button2_Click(object sender, System.EventArgs e)

{

  try

  {

    //odświerzanie tabeli

    dataSet1.Clear();

    sqlDataAdapter1.Fill(dataSet1);

    dataGrid1.DataSource=dataSet1.Tables[0];

    MessageBox.Show(this.Name + " - odświerzono pomyślnie");

  }

  catch(System.Exception se)

  {

    MessageBox.Show(se.ToString());

  }

}

 

private void button1_Click(object sender, System.EventArgs e)

{    

  try

  {  

    //Zapisywanie rekordów w bazie

    sqlDataAdapter1.InsertCommand.Parameters[0].Value =

    comboGrupa.SelectedValue;

    sqlDataAdapter1.Update(dataSet1);

    dataSet1.Clear();

    sqlDataAdapter1.Fill(dataSet1);

    dataGrid1.DataSource=dataSet1.Tables[0];

    MessageBox.Show(this.Name + " - zapisano pomyślnie");

  }

  catch(System.Exception se)

  {

    try

    {

      if(se.ToString().Substring(36,24)=="Violation of PRIMARY KEY")

        MessageBox.Show("Student o wpisanym indexsie już istnieje");

      else

        MessageBox.Show(se.ToString());

    }

    catch(System.Exception ees){

       ees.ToString();

    }

  }

}

     

//Comboboxy

private void comboWydział_SelectedIndexChanged(object sender, System.EventArgs e)

{

  try

  {

    //poniższe instrukcje warunkowe sprawdzają czy wybrane wartości w

    //comboboxach z parametrami

    //mają wartości inne niż null i są typu int32 - wrunek ten jest

    //konieczny ponieważ czasem

    //gdy dane jednego comboboxu zależą od drugiego, to przy zmianie

    //wybranej pozycji

    //zdarz się że w drugim comboboxsie pojawi się np wartość null lub inna

    //niż int32 która

    //z koleji zgłasza wyjątek

    if(comboSemestr.SelectedValue!=null &&

      comboWydział.SelectedValue!=null &&

      comboGrupa.SelectedValue!=null &&

      comboKierunek.SelectedValue!=null )

    {

                       

      if(

comboWydział.SelectedValue.GetType()==Type.GetType("System.Int32")

      &&

      comboKierunek.SelectedValue.GetType()==Type.GetType("System.Int32")

&&          comboGrupa.SelectedValue.GetType()==Type.GetType("System.Int32")

&&                            comboSemestr.SelectedValue.GetType()==Type.GetType("System.Int32"))

      {          

                                  

        //Wypełnianie Kierunki

        dataSetKierunek.Clear();

        adapterKierunki.SelectCommand.Parameters[0].Value =

        comboWydział.SelectedValue;

        adapterKierunki.Fill(dataSetKierunek);

        comboKierunek.DataSource=dataSetKierunek;

                                  

                            

 

        //Wypełnianie Grupy

        dataSetGrupa.Clear();

        adapterGrupa.SelectCommand.Parameters[0].Value =

        comboKierunek.SelectedValue;

        adapterGrupa.SelectCommand.Parameters[1].Value =   

        comboSemestr.SelectedValue;

        adapterGrupa.Fill(dataSetGrupa);

        comboGrupa.DataSource=dataSetGrupa;

                                  

 

        //Odświeżanie Grida

        dataSet1.Clear();

        sqlDataAdapter1.SelectCommand.Parameters[0].Value =

        comboGrupa.SelectedValue;

        sqlDataAdapter1.Fill(dataSet1);

        dataGrid1.DataSource=dataSet1.Tables[0];

        this.readOnly_check();

      }

    }

  }

  catch(System.Exception se)

  {

      MessageBox.Show(se.ToString());

  }

}

 

private void comboSemestr_SelectedIndexChanged(object sender, System.EventArgs e)

{

  try

  {

    if(comboSemestr.SelectedValue!=null &&

      comboWydział.SelectedValue!=null &&

      comboGrupa.SelectedValue!=null &&

      comboKierunek.SelectedValue!=null )

    {

if(   comboWydział.SelectedValue.GetType()== Type.GetType("System.Int32") &&

comboKierunek.SelectedValue.GetType() ==   Type.GetType("System.Int32")&&

      comboGrupa.SelectedValue.GetType() ==

Type.GetType("System.Int32")&&

      comboSemestr.SelectedValue.GetType() ==

Type.GetType("System.Int32"))

      {                                             

        //odświeżanie comboboxa grupa

        dataSetGrupa.Clear();

        adapterGrupa.SelectCommand.Parameters[0].Value = 

        comboKierunek.SelectedValue;

        adapterGrupa.SelectCommand.Parameters[1].Value =

        comboSemestr.SelectedValue;

        adapterGrupa.Fill(dataSetGrupa);

        comboGrupa.DataSource=dataSetGrupa;

                                  

                            

        //Odświeżanie Grida

        dataSet1.Clear();

        sqlDataAdapter1.SelectCommand.Parameters[0].Value =

        comboGrupa.SelectedValue;

        sqlDataAdapter1.Fill(dataSet1);

        dataGrid1.DataSource=dataSet1.Tables[0];

        this.readOnly_check();

      }

    }

  }

  catch(System.Exception se)

  {

      MessageBox.Show(se.ToString());

  }

}

 

private void comboKierunek_SelectedIndexChanged(object sender, System.EventArgs e)

{

  try

  {  

    if(comboSemestr.SelectedValue!=null &&

    comboWydział.SelectedValue!=null &&

    comboGrupa.SelectedValue!=null &&

    comboKierunek.SelectedValue!=null )

    {

      if( comboWydział.SelectedValue.GetType() ==  

        Type.GetType("System.Int32") &&

        comboKierunek.SelectedValue.GetType() ==  

        Type.GetType("System.Int32")&&

        comboGrupa.SelectedValue.GetType() ==

        Type.GetType("System.Int32")&&

        comboSemestr.SelectedValue.GetType() ==

        Type.GetType("System.Int32"))

      {          

 

        //odświeżanie comboboxa grupa

        dataSetGrupa.Clear();

adapterGrupa.SelectCommand.Parameters[0].Value =  

comboKierunek.SelectedValue;

        adapterGrupa.SelectCommand.Parameters[1].Value = 

        comboSemestr.SelectedValue;

        adapterGrupa.Fill(dataSetGrupa);

        comboGrupa.DataSource=dataSetGrupa;

                                        

        //Odświeżanie Grida

        dataSet1.Clear();

        sqlDataAdapter1.SelectCommand.Parameters[0].Value =

        comboGrupa.SelectedValue;

        sqlDataAdapter1.Fill(dataSet1);

        dataGrid1.DataSource=dataSet1.Tables[0];

        this.readOnly_check();

      }    

    }

  }

  catch(System.Exception se)

  {

     MessageBox.Show(se.ToString());

  }

}

 

private void comboGrupa_SelectedIndexChanged(object sender, System.EventArgs e)

{

  try

  {  

    if(comboSemestr.SelectedValue!=null &&

       comboWydział.SelectedValue!=null &&

       comboGrupa.SelectedValue!=null &&

       comboKierunek.SelectedValue!=null )

    {

                       

      if(   comboWydział.SelectedValue.GetType() ==

            Type.GetType("System.Int32") &&

            comboKierunek.SelectedValue.GetType() ==

Type.GetType("System.Int32")&&

comboGrupa.SelectedValue.GetType() == Type.GetType("System.Int32")&&

comboSemestr.SelectedValue.GetType() == Type.GetType("System.Int32"))

      {          

 

        //Odświeżanie Grida

        dataSet1.Clear();

        sqlDataAdapter1.SelectCommand.Parameters[0].Value =

        comboGrupa.SelectedValue;

        sqlDataAdapter1.Fill(dataSet1);

        dataGrid1.DataSource=dataSet1.Tables[0];

        this.readOnly_check();

      }    

    }

  }

  catch(System.Exception se)

  {

    MessageBox.Show(se.ToString());

  }

}

           

//Jeżeli w którymś z comboboźów wybrana wartość jest równa zero to grid

//jest blokowany i

// nie można do niego dopisywać nowych rekordów

//ma to uchronić użytkownika przed wpisywaniem nowych studentów np do grupy

//która nie istnieje

private void readOnly_check()

{

  dataGrid1.ReadOnly=false;

  if(comboSemestr.SelectedValue.ToString()=="0" ||

      comboWydział.SelectedValue.ToString()=="0" ||

      comboGrupa.SelectedValue.ToString()=="0" ||

      comboKierunek.SelectedValue.ToString()=="0" )

  {  

 

      dataGrid1.ReadOnly=true;

  }

}

 

           

Interfejs WWW

 

Interfejs WWW zaprojektowany został w celu umożliwienia studentom oraz np. osobom pracującym w dziekanacie przeglądania rekordów bazy danych. Ogólnodostępnym raportem jest jedynie raport z ocenami pojedynczego studenta, który można obejrzeć po podaniu numeru indexu oraz odpowiadającemu mu hasła. Pozostałe 3 raporty – Oceny studentów, Średnia ocen, oraz Średnia ocen wykres - dostępne są jedynie dla pracowników uczelni. Mogą być one przeznaczone do tworzenia statystyk gdyż umożliwiają filtrowanie ocen studentów za pomocą bardzo wielu parametrów.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     

 

 

     

 

 


 

 

 

 

Podsumowanie

 

Mam nadzieję że powyższy artykuł dał państwu możliwość wstępnego zapoznania się ze środowiskiem MS SQL Server Reporting Services i zachęcił was do bardziej wnikliwego zapoznania się z tym narzędziem. Wierzę również, że prezentowana przeze mnie aplikacja była dobrym przykładem, w jaki sposób raporty stworzone w Reporting Services mogą zostać zastosowane w rzeczywistości.

 

 

Podobne artykuły

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.