NePo
Birželis 11, 2007

Ataskaitų generavimas

Dirbdamas su Visual Studio pastebėjau, kad šis įrankis turi… Norėjau pasakyti neturi daug naudingų pagalbinių priemonių, kokių tikėtumėmės iš analogiškų sistemų. Šį kartą man reikėjo, jog programa darytų ataskaitas, tačiau jokio tam skirto komponeto neradau. Vienas iš variantų - Crystal Report, bėda ta, jog jis nėra standartinis priedas ir ne gana to dar truputį kainuoja. Todėl norėčiau pakalbėti apie antrą būdą, kuris mane pilnai patenkino.

Kad nereiktų išgalvoti kokios nors sudėtingos programos pasinaudosiu anksčiau savo sukurta programa apie kurią jau rašiau straipsnyje “Darbas su XML failais”. Tiems, kurie neskaitė ansktesnio mano straipsnio, tikiuosi nekils keblumų.

Pati metodo idėja: failą galima pasidaryti kokį norime ir vėliau atvaizduoti naršyklėje. Tam reikės susipažinti su stiliaus failais. Aš pirmą kartą pažvelgęs į šio failo kodą supratau kas, kaip ir kur. Tikiuosi jums irgi seksis taip pat gerai.

Pirmiausia prisiminkim kaip atrodo mūsų failas:

<books>
  <book>
    <title>Davinci code</title>
    <price>19.95</price>
  </book>
  <book>
    <title>Hackers guide</title>
    <price>49.99</price>
  </book>
</books>

Kaip matote turinys labai kuklus: viso labo turime tik knygos pavadinimą ir kainą.

stilių failas labiau panašesnis į HTML nei į CSS failą, jo turinys bus toks:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2>Ataskaita</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Pavadinimas</th>
      <th align="left">Kaina</th>
    </tr>
    <xsl:for-each select="books/book">
    <tr>
      <th ><xsl:value-of select="title"/></th>
      <th  ><xsl:value-of select="price"/></th>
    </tr>
    </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Į ką reikia atkreipti dėmesį? Iš pradžių mes apsirašome visokius stiliaus elementus, kurie visiškai nesvarbūs. Tuomet < :for-each select=”books/book”> eilutė nurodo, jog iš viso sąrašo išrinkti elementus, su kuriais bus atliekami veiksmai, tai tarsi ciklo atidarymas. books pagrindinis viso XML failo elementas, o book - smulkesnis, su kuriuo ir bus atliekami kartojami veiksmai. Toliau parodome, kokius elementus paimti < :value-of select=”title”/>. Aš nurodžiau paimti abu, tačiau, jeigu nenorite, nenurodykite, tuomet ataskaitoje tas elementas nefigūruos.

Rodos, šioje dalyje viskas, dabar laikas pasikurti Visual Studio ir parašyti šiek tiek kodo. Pirmiausiai įsidedu button, kuriame rašysiu kodą, tačiau dar prieš rašant, reikia įsidėti keletą papildomų bibliotekų: System., System..XPath, System.., tikiuosi šitas dvi įsidėsite be vargo patys, tačiau be jų mums dar reikės Microsoft HTML Object Library (mshtml) ir Microsoft Internet Controls, kas beje reiškia, jog nepriklausomai nuo to, kokia pas jus naršyklė yra standartinė, vis tiek ataskaitos bus atidaromos būtent IE (kaip beje elgiasi ir ICQ6). Komponentų pridėjimui paspauskite dešinį ant projekto pavadinimo ir pasirinkite Add Reference ->COM ir ten susiraskite reikiamas bibliotekas.

Tikiuosi jau susitvarkėte su bibliotekomis? Tuomet parašykime šiek tiek kodo

string xml="BOOKS3.XML";
string xsl = "BOOKS.XSL";
XmlTextReader xmlStringReader = new XmlTextReader(xml);
XPathDocument xPathDocument = new XPathDocument(xmlStringReader);
XmlTextReader xslTextReader = new XmlTextReader(xsl);
 
XslTransform xslTransform = new XslTransform();
xslTransform.Load(xslTextReader, null, GetType().Assembly.Evidence);
StringWriter htmlStringWriter = new StringWriter();
xslTransform.Transform(xPathDocument, null, htmlStringWriter, null);
string html = htmlStringWriter.ToString();
 
xmlStringReader.Close();
xslTextReader.Close();
htmlStringWriter.Close();

Kai rašiau ankstesnę programą šiek tiek žaidžiau su openFileDialog ir saveFileDialog , šį kartą darau statiškai, pasitobulinsite patys.
Taigi, pirmose dvejuose eilutėse apsirašau failus, su kuriais dirbsiu. XmlTextReader nuskaito failą, o XPathDocument paverčia jį į XPath duomenų modelį. Tuomet nuskaitomas failas ir sukuriama XslTransform transformacija, kuri susieja ir failą bei paverčia juos į HTML. Šitoje dalyje viskas.

SHDocVw.InternetExplorer internetExplorer = new SHDocVw.InternetExplorerClass();
SHDocVw.IWebBrowser2 webBrowser = (SHDocVw.IWebBrowser2)internetExplorer;
webBrowser.Visible = true;
object noValue = System.Reflection.Missing.Value;
webBrowser.Navigate("about:blank", ref noValue, ref noValue, ref noValue, ref noValue);
mshtml.IHTMLDocument2 htmlDoc = internetExplorer.Document as mshtml.IHTMLDocument2;
htmlDoc.writeln(html);
htmlDoc.close();

Pažiūrėję į šį kodą tikriausiai supratote, kam reikėjo tų dviejų papildomų komponentų, nes būtent dabar jų pagalba yra sukuriamas IE objektas. Iš pradžių užkraunamas tuščias puslapis ir tik tada jame pateikiama ataskaita.
npata.jpg

Kaip matote vaizdelis nėra stebuklingas, bet jeigu pasitreniruotumėte galėtumėte padaryti ir geriau.

Tai labai paprastas būdas daryti ataskaitas, tačiau galbūt jis ne visus ir ne visuomet tenkins, jeigu kas turite kitų idėjų, kaip galima būtų generuoti ataskaitas su Visual Studio nesikuklinkit, pasidalinkit.

Nuorodos:
XSL pagrindai
XQuery 1.0 and XPath 2.0 Data Model (XDM)

Panašūs straipsniai


“Ataskaitų generavimas” komentarų: 1

  1. vytas

    Sveiks,
    jei reikia generuoti web ataskaitas is .NET aplikaciju naudok SQL Server Reporting Services kuris ateina su nemokama SQL serverio versija (Express Edition). Duomenis ataskaitom galima imti netik is SQL bet ir is kitu duomenu saltiniu. Cia daugiau informacijos: _http://msdn2.microsoft.com/en-us/sql/aa336316.aspx

    Be to Crystal Report komponentai kurie ateina su Visual Studio yra “nemokami” t.y. nereikia moketi papildomai. Juos gali pilnai naudoti savo programoje ir sukurti normalia ataskaita. Papildomas Crystal licencijas ir produktus tau reiketu pirkti jei nori kad ataiskaitas kurtu pazangus vartotojai ir tureti daugiau funkcionalumo.
    Sekmes!

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.