Sommario
Nel presente articolo sono descritti i passi da seguire per poter creare un esempio di un'applicazione scritta in linguaggio C# che consente di effettuare l'autenticazione al prodotto Perfetto e l'estrazione dei dati attraverso un report di Perfetto, utilizzando la tecnologia Magic Link.
Per facilitare la lettura dell'articolo di seguito un indice delle sezioni dell'articolo:
- Creazione del progetto
- Creazione della maschera di connessione di login
- Inserimento ai Web Services di Perfetto
- Connessioneai Web Services
- Autenticazione
- Creazione della maschera di ricerca e di visualizzazione dati
- Richiesta dati report a Perfetto
- Lettura e visualizzazione dati report
- Disconnessione
- Aprire "Visual Studio", in questo esempio è stato utilizzato Visual Studio 2010
- Selezionare "Nuovo progetto..."
- Scegliere "Applicazione Windows Form"
- Inserire il nome del progetto "ReportSample"
Creazione della maschera di connessione e di login
Nel seguente paragrafo è mostrato come creare l'interfaccia grafica di connessione e di login a Perfetto. Essa è divisa in due parti, una rivolta alla gestione della connessione ai Web Services di Perfetto e una dedicata all'autenticazione dell'utente.
I passi da seguire per realizzare la maschera sono:
- Assegnare il nome, LoginForm, alla proprietà Text della Form.
- Inserire i campi relativi alla fase di connessione:
- GroupBox per Connection
- TextBox per Server
- TextBox per Port
- TextBox per Installation
- button per verificare la connessione ai Web Services
- Inserire i campi relativi alla fase di login:
- GroupBox per Login
- TextBox per User
- TextBox per Password
- TextBox per Company
- TextBox per Producer Key
- button per richiedere la login
Inserimento riferimenti ai Web Services di Perfetto
Per poter accedere ai metodi web che consentono all'utente di registrarsi e chiamare un report in Perfetto, è necessario aggiungere i riferimenti ai Web Services di Perfetto.
Le operazioni da seguire per aggiungere un riferimento web sono le seguenti:
- posizionarsi sul nodo del progetto dell'albero dell'"Esplora soluzioni"
- fare click con il tasto destro del mouse
- selezionare la voce "Aggiungi riferimento al servizio"
- premere il pulsante "Avanzate..."
- fare click sul pulsante "Aggiungi riferimento Web..."
- inserire il percorso del Web Service
- digitare il nome del riferimento
- premere sul pulsante "Aggiungi riferimento"
Per l'esempio è necessario inserire il riferimento per LoginManager e EasyLookService.
Una volta inseriti i riferimenti ai Web Services è necessario creare una loro istanza nel seguente modo:
private LoginManager.MicroareaLoginManager aLogManager = new LoginManager.MicroareaLoginManager();
private EasyLook.EasyLookService aEasyLook = new EasyLook.EasyLookService();
Connessione ai Web Services
Per potersi connettere ai Web Services in modo dinamico, è necessario poter impostare il nome del server dove risiedono, il numero della porta e il nome dell'installazione.
Di seguito è visualizzato il codice che mostra come chiamare la maschera di connessione dalla maschera principale, come valorizzare l'URL del riferimento web e come verificare la validità del web service:
private LoginForm loginForm;
private void MainForm_Load(object sender, EventArgs e)
{
loginForm = new LoginForm(aLoginManager);
loginForm.ShowDialog();
...
}
public partial class LoginForm : Form
{
private LoginManager.MicroareaLoginManager aLogMan;
public LoginForm(LoginManager.MicroareaLoginManager aLoginManager)
{
aLogMan = aLoginManager;
InitializeComponent();
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textServer.Text) || string.IsNullOrEmpty(textInstallation.Text))
{
MessageBox.Show("Insert Server and Installation");
return;
}
string LogManagerConnectionString = "http://{0}:{1}/{2}/LoginManager/LoginManager.asmx";
string serverName = textServer.Text;
int portNumber = 80;
Int32.TryParse(textPort.Text, out portNumber);
string installationName = textInstallation.Text;
aLogMan.Url = string.Format(LogManagerConnectionString, serverName, portNumber,
installationName);
try
{
bool bConnected = aLogMan.IsAlive();
if (bConnected)
{
Globals.ServerName = serverName;
Globals.PortNumber = portNumber;
Globals.InstallationName = installationName;
}
else
{
MessageBox.Show("Connection error!");
return;
}
}
catch (Exception logExc)
{
MessageBox.Show(string.Format("Exception occurred: {0}", logExc.Message));
return;
}
textServer.Enabled = false;
textPort.Enabled = false;
textInstallation.Enabled = false;
btnConnect.Enabled = false;
textUser.Enabled = true;
textPassword.Enabled = true;
textCompany.Enabled = true;
textProdKey.Enabled = true;
btnLogin.Enabled = true;
}
...
}
Se la connessione ha successo vengono salvati il nome del server, il numero della porta e il nome dell'installazione e disabilitati i campi legati alla connessione e abilitati campi relativi alla login.
Autenticazione
Nella seguente sezione sono descritti i passi necessari ad effettuare l'autenticazione al sistema mediante l'utilizzo del metodo web LoginCompact del LoginManager.
Nel seguente codice è mostrato come recuperare i valori dei campi relativi alla login e passare tali valori al metodo LoginCompact per ottenere il codice di autenticazione:
private void btnLogin_Click(object sender, EventArgs e)
{
string authToken = string.Empty;
string user = textUser.Text;
string company = textCompany.Text;
string password = textPassword.Text;
string prodKey = textProdKey.Text;
try
{
int aResult = aLogManager.LoginCompact(ref user, ref company,
password, prodKey, false, out authToken);
if (aResult == 0)
{
Globals.AuthenticationToken = authToken;
MessageBox.Show("Connected!");
this.Close();
}
else
MessageBox.Show(string.Format("Error occurred, code: {0}", aResult));
}
catch (Exception logExc)
{
MessageBox.Show(string.Format("Exception occurred: {0}", logExc.Message));
}
}
Se la fase di autenticazione va a buon fine viene salvato il codice di autenticazione e chiusa la maschera di connessione e login.
Creazione della maschera di ricerca e di visualizzazione dati
Nel seguente paragrafo è illustrato come creare l'interfaccia grafica di selezione e di visualizzazione dati di un report di Perfetto. Essa è divisa in due parti, una rivolta ai parametri di filtro da passare al report e una dedicata alla visualizzazione dei dati in formato tabellare e grafico.
I passi da seguire per realizzare la maschera sono:
- Assegnare il nome, Hours employees, alla proprietà Text della Form.
- Inserire i campi relativi alla fase di filtro:
- GroupBox per Filter
- TextBox per Job
- TextBox per Year
- button per chiamare il report
- Inserire i campi relativi alla visualizzazione dei dati:
- Chart per Grafico
- DataGridView per Elenco Dipendenti
Richiesta dati report a Perfetto
Per inviare a Perfetto una richiesta relativa un report si deve utilizzare il metodo XmlExecuteReport del Web Service EasyLook e passare ad esso una stringa xml contenente i parametri di filtro del report.
Nel codice seguente è mostrato come creare la stringa xml dei parametri da inviare e come invocare il metodo XmlExecuteReport impostando i parametri in modo corretto:
private void btn_Find_Click(object sender, EventArgs e)
{
string job = textJob.Text;
string year = textYear.Text;
string nsRep = "Report.ImpiantiNET.Rapportini.OreDipendentePerCommessa";
string xmlNs = "http://www.microarea.it/Schema/2004/Smart/ImpiantiNET/Rapportini/
OreDipendentePerCommessa.xsd";
string repParams = "<?xml version=\"1.0\"?>" +
"<maxs:Rapportino tbNamespace=\""+nsRep+"\" xmlns:maxs=\""+xmlNs+"\">" +
"<maxs:Parameters>" +
"<maxs:NoName title=\"Selezione\">" +
"<maxs:Group1 title=\"Commessa\">" +
"<maxs:AskComm type=\"String\" length=\"15\" title=\"Dal\"
controlType=\"Text\" inputLimit=\"Lower\">"+ job +"</maxs:AskComm>" +
"<maxs:EndComm type=\"String\" length=\"15\" title=\"Al\"
controlType=\"Text\" inputLimit=\"Upper\">" + job + "</maxs:EndComm>" +
"</maxs:Group1>" +
"<maxs:Group2 title=\"Dipendente\">" +
"<maxs:ASkDip type=\"DateTime\" length=\"8\" title=\"Dal\"
controlType=\"Text\"></maxs:ASkDip>" +
"<maxs:EndDip type=\"DateTime\" length=\"8\" title=\"Al\"
controlType=\"Text\"></maxs:EndDip>" +
"</maxs:Group2>" +
"<maxs:Group3 title=\"Periodo\">" +
"<maxs:AskData type=\"String\" length=\"15\" title=\"Dal\"
controlType=\"Text\" inputLimit=\"Lower\">" + year + "-01-01</maxs:AskData>" +
"<maxs:EndData type=\"String\" length=\"15\" title=\"Al\"
controlType=\"Text\" inputLimit=\"Upper\">" + year + "-12-01</maxs:EndData>" +
"</maxs:Group3>" +
"</maxs:NoName>" +
"</maxs:Parameters>" +
"</maxs:Rapportino>";
try
{
string[] GetDataTextResult = aEasyLook.XmlExecuteReport(Globals.AuthenticationToken,
repParams, applicationDate, "Standard", false);
...
}
catch (Exception ex)
{
MessageBox.Show(string.Format("Exception caught in XmlExecuteReport: {0}",
ex.ToString()));
}
}
Lettura e visualizzazione dati report
Nel seguente sezione è mostrato come leggere e visualizzare i dati del report ritornati dal metodo web XmlExecuteReport.
Di seguito la classe che rappresenta l'entità dipendente:
class Employee
{
public string Code { get; set; }
public string Name { get; set; }
public string Hours { get; set; }
}
Nel codice seguente è mostrato come recuperare i dati relativi al dipendente dalla stringa xml, come valorizzare una mappa e una lista di oggetti Employee, come associare la lista alla griglia e come valorizzare il grafico:
string xmlReport = GetDataTextResult[0];
List<Employee> emplList = new List<Employee>();
Dictionary<string, int> emplMap = new Dictionary<string, int>();
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlReport);
XmlNamespaceManager xmlNsManager = new XmlNamespaceManager(doc.NameTable);
xmlNsManager.AddNamespace(doc.DocumentElement.Prefix, doc.DocumentElement.NamespaceURI);
foreach (XmlNode node in doc.SelectNodes(
"maxs:OreDipendentePerCommessa/maxs:ReportData/maxs:Table15/maxs:Row",
xmlNsManager))
{
string code = node.SelectSingleNode("maxs:Dipendente", xmlNsManager).InnerText;
string name = node.SelectSingleNode("maxs:Nome", xmlNsManager).InnerText;
string totHours = node.SelectSingleNode("maxs:OTotale", xmlNsManager).InnerText;
int nTotH = 0;
Int32.TryParse(totHours, out nTotH);
int mapValue;
if (emplMap.TryGetValue(code, out mapValue))
{
emplMap[code] = mapValue + nTotH;
}
else
{
emplMap.Add(code, nTotH);
emplList.Add(new Employee() { Code = code, Name = name });
}
}
foreach (Employee empl in emplList)
{
int mapValue;
if (emplMap.TryGetValue(empl.Code, out mapValue))
{
int nH = mapValue / 3600;
int nM = mapValue - (nH * 3600);
string sTotHours = string.Format("{0}:{1}", nH, nM);
empl.Hours = sTotHours;
}
// Add series.
Series series = this.chartHours.Series.Add(empl.Code);
// Add point.
DataPoint dataP = series.Points.Add(mapValue);
}
emplGrid.DataSource = emplList;
Disconnessione
Alla chiusura dell'applicazione è necessario disconnettere l'utente dal sistema invocando il metodo LogOff.
Di seguito il codice per eseguire la disconnessione:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (!string.IsNullOrEmpty(authenticationToken))
aLogManager.LogOff(authenticationToken);
}
Commenti