marți, 28 iulie 2009

Lucru cu fisiere XML in ASP.NET

XML (Extensible Markup Language) reprezinta un limbaj de marcare prin care pot fi definite structuri ierarhice de date in fisiere de tip text. Acest limbaj a fost definit pentru a permite implementarea unei metode independenta de tehnologiile Web si pentru gestiunea bazelor de date existente care sa fie utilizata la descrierea si utilizarea datelor.

Principalele caracteristici ale tehnologiei XML sunt:
  • defineste un limbaj de marcare asemanator HTML si SGML;
  • definita pentru a permite descrierea structurilor de date si al datelor;
  • utilizata pentru a transporta date intre aplicatii si platforme diferite;
  • bazata pe utilizarea fisierelor text cu extensia .xml;
  • independenta de platformele hardware si software;
  • implementata de browser-ele Web existente
  • datele descrise formeaza o structura ierarhica.

Datele descrise prin limbajul XML sunt stocate in fisiere text cu extensia .xml in care trebuie respectate o serie de reguli (o descriere completa a limbajului poate fi gasita la www.w3.org/XML/):
  • limbajul este case-sensitive facand diferenta intre literele mari si mici;
  • tag-urile de descriere a datelor sunt definite de utilizator, spre deosebire de HTML unde sunt predefinite;
  • structura ierarhica trebuie sa contina un element radacina;
  • un element poate contine text, unul sau mai multe elemente sau nimic;
  • orice eticheta de inceput trebuie sa aiba asociata o eticheta de inchidere; daca elementul este gol, atunci eticheta de inceput poate fi inchisa prin simbolul /;
  • numele etichetelor trebuie sa inceapa cu o litera; numele xml, Xml, XML sunt rezervate;
  • comentariile sunt inserate intre ;
  • trebuie pastrata structura ierarhica si elementele trebuie sa fie imbricate in mod corespunzator (ordinea de inserare a etichetelor de inchidere este inversa celei de inserare a etichetelor de deschidere);
  • elementele pot avea atribute ale caror valori pot fi definite utilizand ghilimele sau apostrof.

Daca se doreste stocarea informatiilor despre angajatii unei firme intr-un fisier XMl, atunci o forma simpla de definire a acestuia este:

<angajati>
<angajat id=”123”>
<nume>Popescu Ion</nume>
<departament>Clienti</departament>
<functie>Manager</functie>
</angajat>
<angajat id=”123”>
<nume>Gheorghe Anca</nume>
<departament>Vanzari</departament>
<functie>Casiera</functie>
</angajat>
</angajati>

Pentru a permite o validare sumara a documentului XML si pentru a indica setul de caractere utilizat la descrierea continutului, la inceputul fisierului se da o declaratie de tipul

<?xml version="1.0" encoding="utf-8" ?>

Aceasta informatie nu este obligatorie insa repreinta o zona de descriere a documentului XML.

Pentru a afisa si prelucra aceste date dintr-o aplicatie ASP.NET se vor utiliza clase definite in framework-ul .NET si la care programatorul are acces prin API-ul (application programming interface) parser-ului XML inclus in framework. Acest parser implementeaza standardul XML DOM (Document Object Model) definit de consortiul W3C (www.w3.org/DOM) si reprezinta un document XML sub forma unei structuri arborescente in care elementele sunt reprezentate de noduri.
In namespace-ul System.Xml sunt definite clasele:
  • XmlReader – clasa abstracta utilizata pentru a citit date dintr-un fisier XML
  • XmlTextReader – implementeaza un parser XML derivat din XmlReader ce nu face validari si ce permite doar operatia de citire;
  • XmlWriter - abstracta utilizata pentru a scrie date intr-un fisier XML;
  • XmlTextWriter – implementeaza o clasa derivata din XmlWriter ce permite generarea unui document XML;
  • XmlDocument – implementeaza un parser XML conform specificatiilor XML DOM;
  • XmlNode – clasa asociata unui singur nod dintr-un document XML;
  • XmlNodeList – gestioneaza o lista de obiecte XmlNode;
  • XmlElement – un element din documentul XML
  • XmlAttribute – reprezinta un atribut al unui element din documentul XML
Daca se considera o pagina ASP.NET in care exista un buton si un label, LabelAngajati, conform structurii
<form id="form1" runat="server">

<div>

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Lista angajati" />

<br />

<br />

<asp:Label ID="LabelAngajati" runat="server"></asp:Label>

</div>

</form>

, afisarea datelor angajatilor din documentul XML la activarea butonului este realizata prin functia

protected void Button1_Click(object sender, EventArgs e)

{

XmlDocument doc = new XmlDocument();

//deschidere document XML local

doc.Load(Server.MapPath("angajati.xml"));


LabelAngajati.Text = "";

//generare lista noduri de tip angajat

XmlNodeList lista = doc.GetElementsByTagName("angajat");

//parcurgere lista noduri

foreach (XmlNode angajat in lista)

{

//preluarea valoare atribut nod curent

string id = angajat.Attributes["id"].Value;

//preluare valori noduri fiu

string functie = angajat["functie"].FirstChild.Value;

string nume = angajat["nume"].FirstChild.Value;

string departament = angajat["departament"].FirstChild.Value;

//afisare date preluate din fisierul XML

LabelAngajati.Text += "<strong>Angajat :" + nume + " - " + id + "</strong><br/>";

LabelAngajati.Text += "Functie :" + functie + "<br/>";

LabelAngajati.Text += "Departament :" + departament + "<br/>";

}

}



ce este abonata la evenimentul Click al controlului. In secventa anterioara, preluarea textului asociat unui element se realizeaza prin proprietatea FirstChild a nodului. Acelasi rezultat este obtinut, pentru valorile de tip text, prin proprietatea InnerText. De exemplu, extragerea numelui se face si prin

string nume = angajat["nume"].InnerText;

Un exemplu practic al utilitatii documentelor XML este dat de prelucrarea informatiilor cu privire la cursul valutar. Banca Nationala a Romaniei furnizeaza zilnic informatii valutare prin intermediul unui document XML publicat la adresa http://www.bnr.ro/nbrfxrates.xml. Transferand datele pe baza acestui suport este permisa realizarea unei multitudini de aplicatii, diferite ca tehnologie, pentru afisarea cursului valutar.
Prelucrarea documentului XML se face prin intermediul claselor .NET descrise anterior, insa se pune problema accesarii acestui fisier. Solutia eficienta este data de accesarea la distanta a documentului, iar acest lucru este posibil prin intermediul metodei Load a obiectului XmlDocument

doc.Load("http://www.bnr.ro/nbrfxrates.xml");

Parcurgerea ratelor de schimb se face cautand nodurile Rate.

miercuri, 22 iulie 2009

VLOOKUP intre doua foi de calcul

In aceasta prezentare vom vedea cum se foloseste functia de cautare pe verticala (VLOOKUP) atunci cand tabela de consultare se afla in alta foaie de calcul decat cea in care aplicam functia .

Avem asadar in prima foaie de calcul (Sheet 1) o tabela cu incasarile relaizate de mai multi agenti de vanzare ai unei firme in mai multe tranzactii efectuate . Codurile fiecaruia dintre agenti sunt trecute in prima coloana a tabelei , iar in a treia coloana sumele incasate in diferite tranzactii efectuate de acestia . Folosind functia vlookup va trebui ca pe cea de-a doua coloana sa completam numele fiecarui agent in functie de cod .


In imaginea de mai jos avem o parte a celei de-a doua foi de calcul , in care se gaseste tabela de cautare
Asadar pentru a completa coloana Nume in tabela din Sheet1 , vom folosi functia vlookup cu urmatoarele argumente : vlookup(A2;'Tabela de cautare'!$A$1:$B$10;2) .
Intai aplicam functia pe prima linie din coloana Nume . Primul argument , A2 , este cheia de consultare sau valoarea dupa care se cauta (in cazul nostru codul inscris in prima linie a tabelei) . Al doilea argument este tabela de cautare , iar al treilea este numarul coloanei din tabela de cautare de pe care vreau sa mi se returneze valoarea corespunzatoare codului ce apare ca prim argument al functiei .
Cum vom introduce aceste argumente ?
Pentru a introduce primul argument selectam celula A2 .
Pentru a introduce al doilea argument mergem in cealalta foaie de calcul si selectam aria de celule A1:B10 , iar in functie , inaintea acestei adrese , va aparea numele foii de calcul in care se afla tabela de cautare , astfel : 'Tabela de cautare'!$A$1:$B$10 .
Pentru a introduce cel de-al treilea argument , adica numarul coloanei de pe care vreau sa-mi fie returnata valoarea corespunzatoare cheii de consultare , raman in cea de-a doua foaie de calcul si introduc numarul coloanei in functia vlookup care apare sub meniu , in bara functiei .
Acest lucuru este reprezentat in imaginea de mai jos , unde se observa ca fisierul este deschis pe cea de-a doua foaie de calcul (nu pe prima , acolo unde am introdus initial functia vlookup) . Iar bara in care apare functia inscrisa de noi in prima foaie de calcul este indicata printr-o sageata .
ATENTIE! Trebuie respectati obligatoriu acesti pasi pentru ca vlookup-ul sa nu returneze o eroare . Adica trebuie neaparat ca atunci cand introducem in functie numarul coloanei , sa ramanem in foaia de calcul in care avem tabela de cautare si nu sa ne intoarcem in foaia de calcul in care aplicam functia .

Dupa aplicarea functiei in primul rand al coloanei Nume si dupa incrementarea pe restul coloanei , tabela din prima foaie de calcul va arata astfel :

luni, 6 iulie 2009

Utilizarea protocoalelor POP3 si SMTP in JAVA - Partea 2

2.Protocolul SMTP

SMTP (Simple Mail Transfer Protocol) este un protocol simplu, folosit pentru transmiterea mesajelor în format electronic pe Internet. SMTP foloseşte portul de aplicaţie 25 TCP şi determină adresa unui server SMTP pe baza înregistrării MX (Mail eXchange) din configuraţia serverului DNS.

Metoda pentru conectarea la un server ce recunoaste protocolul SMTP si trimiterea unui email catre o adresa trimisa ca parametru:


import sun.net.smtp.SmtpClient;

import java.io.*;

//sunt trimise ca parametri urmatoarele informatii:
//String destinationAddress - adresa catre care va fi trimisa mailul (ex. //'mihai.mogos@gmail.com')
//String smtpServer - adresa serverului ce recunoaste protocolul SMTP
//String subject - subiectul emailului ce va fi trimis
//Strin pathFileName - calea catre fisierul ce contine textul mesajului

public boolean forwardEmailMsg(
String destinationAddress,
String smtpServer,
String subject,
String pathFileName)
{


StringBuffer message = new StringBuffer(
"No message found");

try{


//Se realizeaza conexiunea cu serverul ce recunoaste protocolul SMTP
//Pentru asta se creaza un obiect din clasa sun.net.smtp.SmtpClient


SmtpClient smtp =
new SmtpClient(smtpServer);

//se seteaza adresa de email catrea care se va trimite mesajul electronic
//folosindu-se metoda from(String) cat si metoda to(String)




smtp.from(destinationAddress);

smtp.to(destinationAddress);


//se creaza corpul mesajului concatentndu-se fiecare linie
//din fisierul a carui cale a fost trimisa ca parametru


message = new StringBuffer(readLines(
pathFileName,null,null));


//se insereaza subiectul mesajului ca parte a obiectului
//de tip StringBuffer folosit pentru conceperea mesajului


message = message.insert(message.indexOf(
"Subject: ")+9,fwdTag);


//Get an output stream for the message


PrintStream msg = smtp.startMessage();


//Write the message into the output

// stream.


msg.println(new String(message));


//Close the stream and send the message


smtp.closeServer();


return true;


}catch( Exception e ){


e.printStackTrace();


System.out.println(
"while forwarding email");


//Sound an alarm.


Toolkit.getDefaultToolkit().beep();


try{


Thread.currentThread().sleep(500);


}catch(Exception ex){


System.out.println(ex);


}//end catch


Toolkit.getDefaultToolkit().beep();



//Return false to indicate that the msg

// was not successfully forwarded.


return false;


}//end catch


}//end forwardEmailMsg


miercuri, 1 iulie 2009

Grafic mixt

In acest tutorial vom vedea cum putem crea un grafic mixt sau cum putem transforma un grafic simplu intr-unul mixt .
Avem in imaginea urmatoare date despre vanzarile reusite de 4 agenti de vanzare ale unei firme in cele 4 trimestre ale unui an :

Pentru a sintetiza aceste date printr-un grafic selectam tabela (A1:F6) si din meniu alegem Insert-Chart . Va aparea casuta de dialog pentru grafice si la primul pas alegem un grafic de tip liniar(atentie, pentru grafic am selectat inclusv linia de total din tabela)

Mai departe vom stabili daca seriile graficului sunt pe linii sau pe coloane (alegem Series in rows) .


Dupa apasrea butonului Finish graficul va arata astfel :

Observam ca in afara de cel 4 serii liniare care ne redau vanzarile celor 4 agenti in fiecare dintre cele 4 trimestre ale anului , avem si o a cincea serie , cea pentru total. Inutilitatea acestei serii, ca serie liniara , este evidenta , datele din linia de total a tabelei neputand fi comparate cu cele din celelalte linii decat ca raport intre parte si intreg . Totusi putem transforma seria liniara de total intr-un grafic PIE in felul urmator: dam click dreapta pe seria respectiva si din lista de optiuni alegem Chart Type . Astfel ne va aparea din nou casuta de dialog in care va trebui sa alegem tipul de grafic , dar de data aceasta numai pentru seria Total . La rubrica Chart Type alegem Pie .

Rezultatul obtinut va arata astfel :

Avem acum un grafic mixt : seriile liniare redau evolutia in timp a vanzarilor ralizate de fiecare dintre cei 4 agenti , iar cel de tip Pie ne reda raportul dintre vanzarile fiecarui trimestru si cele pe intregul an .