Sei sulla pagina 1di 16

1.

AX 2012 reporting service


Microsoft SQL Server reporting services (SSRS) lo strumento ufficiale per lo sviluppo dei report in AX 2012. SSRS un servizio incluso in SQL server.

Il vecchio freamework di reportistica ancora presente nel sitema, ma solo per compatibilit, considerato deprecated e verr eliminato nella prossima versione di AX. SSRS si basa sul nuovo framework di classi SysOperation che andr a sostituire il vecchio RunBase.

Lo strumento principale di lavoro il Report Designer integrato in Visual Studio che si occupa della gestione del design del report. Se dallAOT si prova ad espandere il nodo design del report vediamo che non contiene elementi di layout editabili:

I Principali vantaggi dei report di Reporting Services sono:

Visualizzare i dati organizzati in aree dati predefinite (tabelle, matrici e liste...) La modifica del layout realmente visuale, ottenendo con pochi click un resa grafica che col vecchio framework avrebbe richiesto molto pi tempo (es: righe verticali) Visualizzare report per utilizzo personale oppure pubblicarli su un server di report o un sito di SharePoint Definire espressioni che offrono la possibilit di personalizzare il modo in cui i dati del report vengono filtrati, raggruppati ordinati e visualizzati Le logiche del report sono nettamente separate dal suo layout

2. AX 2012 report
Alla base di qualsiasi report SSRS ci possono essere sostanzialmente due tipi di datasource:

Query Tabelle temporanee


Vedremo come costruire il report con i due tipi di datasource, ma la differenza principale rispetto al vecchio framework che:

non si pu pi accedere direttamente al dato che si vuole visualizzare


Dato che i report sono dentro visual studio da l che bisogner lavorare, lato AX dovremo solo esporre le informazioni da visualizzare. Se reporting service configurato correttamente e da visual studio 2010 clicchiamo su Application explorer (Ctrl+d) vedremo apparire nel riquadro di sinistra lAOT dellAOS a cui SSRS punta:

Ovviamente fatta eccezione del nodo SSRS al quale possiamo aggiungere nuovi elementi, tutti gli altri nodi sono in sola visualizzazione.

2.1 Report SSRS basati su Query:


Per prima cosa dobbiamo creare la query lato AX oppure possiamo utilizzare una query standard. Come esempio utilizzaremo una query custom su inventTable:

Apriamo ora visual studio e creiamo un progetto per il nostro report. Scegliamo come templete di progetto Dynamics AX project , selezionare Report model ed inseriamo il nome del progetto:

A questo punto si aprir la finestra solution explorer che conterr lalbero del nostro progetto al quale dobbiamo aggiungere il report facendo click col destro sul progetto > Add > Report:

Rinominiamo il report in SR_InventTable facendo clic col tasto destro sul report > rinomina. Aggiungiamo la nostra query come dataset del report. Facciamo click col destro sul nodo dataset , selezioniamo New dataset e rinominiamolo in InventTable. A questo punto dovrebbe aprirsi in basso a destra la form delle propriet del dataset:

La propriet Data source type fondamentale perch quella che determina se il report basato su query (query) o su classi, in questo caso dovremo selezionare Report data provider, (approfondiremo questo caso pi avanti). Facciamo click su [...] e nella form che si apre vengono mostrate tutte le query di AX.

Selezioniamo SR_InventTableQuery , poi clicchiamo Next, vengono mostrati tutti i campi e i metodi display che possono essere visualizzati nel report. Possiamo selezionare quelli che ci interessano o prenderli tutti flaggando All field e All display method:

Scegliamo tutti i campi e prendiamo inventSiteId() e inventlocationId() , clicchiamo OK. Se tutto andato a buon fine, espandendo il nodo fields del nostro dataset abbiamo tutti i campi della query pi i due metodi diplay che abbiamo selezionato

Le modifiche al dataset si concludono qu, possiamo ora iniziare a lavorare sul design. Per cominciare facciamo tasto destro sul design e aggiungiamo un nodo precision design poi sempre col tasto destro sul precision design clicchiamo su Edit using designer

Si apre leditor dei report di visual studio:

Come vediamo dalla figura, nel riquadro report data a sinistra, sono disponibili i campi ed i metodi diplay selezionati dalla query che possono essere utilizzati nel report. Larea centrale larea di lavoro, in cui si lavora sul layout e nella quale si posso aggiungere oggetti grafici predefiniti come caselle di testo, righe, tabelle, immagini etc... Nel riquadro in basso a destra sono visualizzate le propriet delloggetto selezionato. Una volta terminato il lavoro si pu salvare il progetto in viasual studio direttamente del nodo Visual studio project dellAOT e riaprirli direttamente da l:

Approfondiremo pi avanti lutilizzo del design editor, nel prossimo paragrafo vedremo come implementare report basati su X++.

2.2 Report SSRS basati su X++:


Il concetto che st alla base di questa tecnica il seguente: 1. 2. 3. 4. Costruisci un framework di classi (sysOperation) Crea una o pi tabelle tamporanea Il framework di classi popola la tabella temporanea Mostra sul report i campi della tabella temporanea

2.2.1 Il Framework di classi


Le classi che come minimo dovremo implementare sono almeno tre: Report data controller: Questa classe dovr estendere SrsReportRunController. Questa classe si occupa di controllare lesecuzione del report e della dialog di lancio, convalidare i parametri ed effettuare altre validazioni prima dellesecuzioni del report . Report data contract: Questa classe utilizzata per pacchettizzare i dati che saranno poi passati al report SSRS Di fatto la classe che sostituisce i metodi dialog() e getFromDialog() nel vecchio framework runbase. Sostanzialmente la classe non altro che una dichiarazione di varabili globali, ognuna col il suo relativo metodo parm. Non estende nessuna classe ma nella class declaration deve obblicatoriamente avere la dichiarazione di attributo che dichiara la classe come dataContract del report. Riportiamo come esempio la classe standard SalesInvoiceContract che gestisce il report della fattura da ordine cliente. [DataContractAttribute] public class SalesInvoiceContract { RecId recordId; RecId formLetterRecordId; Report data provider: deve estendere SRSReportDataProviderBase. Deve dichiarare come attributo la sua dataContract, da cui prelever i dati, dichiara il buffer di tabella temporanea che sar usata come dataset del report con relativo metodo get per recuperarlo, dovr inoltre contenere il metodo ProcessReport() che di fatto il vecchio fetch() del report in cui si definiscono tutte le logiche per il recuperano dei dati da visualizzare (X++ Business Logic), e si salvano nella tabella temporanea. [ SRSReportParameterAttribute(classstr(<contractClass>)) ] class ReportDP extends SRSReportDataProviderBase { TempTable TempTable ; } [SRSReportDataSetAttribute('TempTable')] public TempTable getTempTable() { select TempTable; return TempTable; } Nel metodo process report dovremo per prima cosa recuperare listanza della dataContract chiamando il metodo standard this.parmDataContract(); e recuperare i valori di filtro tramite i metodi parm(). Una volta recuperati i valori possiamo eseguire la query e popolare la tabella temporanea. Un template base del metodo processreport potrebbe essere il seguente:

public void processReport() { <lista dei parametri> <datacontract> dataContract; dataContract = this.parmDataContract(); <recuperare I valori dei parametri tramite i metodi parm> ttsbegin; while select { tmpTable.clear(); tmpTable.Field_1 = valore_1; .. tmpTable.Field_n = valore_n; tmpTable.insert(); } ttscommit; }

Ogni volta che si effettua una modifica alle classi del report e si ricompila necessario effettuare una ricompilazione incrementale del CIL, dato che il framewrok sysoperation poggia in parte su una parte di codice Compilato introdotta in AX 2012. Di solito la parte che inserisce i dati nella tabella temporanea relegata in un metodo a parte. Se il report risulta complesso si consiglia di usare pi dataset. Per esempio si pu avere un dataset per i dati di testata e uno per i dati delle righe. Per aggiungere ulteriori dataset dobbiamo per prima cosa aggiunegere il metodo get() della tabella temporanea, poi dobbiamo inserire allinizio del metodo process report la striga di connessione per agganciare i record che si stanno inserendo alla transazione corrente
DatasetName.setConnection(this.parmUserConnection());

N.B: Per aggiungere questo metodo la classe dataprovider dovr estendere SrsReportDataProviderPreProcess Ci necessario perch a volte la tabella della classe provider potrebbe essere non temporaneave contenere record diversi relativi a transazioni diverse, appartenenti cio ad instanze diverse di reporting service. Grazie a questa istruzione se si effettua una select firstonly sul buffer che stiamo ciclando siamo sicuri di individuare la riga corretta anche se la tabella contenesse pi record assicurandoci quindi lutilizzo del datasource nel giusto contesto. Il metodo set connection infatti lega il transacionId del buffer al transactionId corrente. Il fatto di avere pi datasource, oltre che aumentare la leggibilit del codice, consente anche di superare un noto bug di SSRS che non riesce a gestire tabelle con pi di 255 campi.

2.2.2 Validazioni:
Se si vogliono effettuare validazioni, la classe contract dovr implementare linterfaccia SysOperationValidateble: implements SysOperationValidatable a questo punto sar obbligatorio fare loverride del metodo validate(), per es possiamo scrivere: public boolean validate() { boolean isValid = true; if (!TransDate) { isValid = checkFailed(Error); } return isValid; }

2.2.3 Utilizzo di query:


Se nella dialog di lancio vogliamo integrare lutilizzo di query (Tasto seleziona) sar sufficente aggiungere lattributo SRSReportQueryAttribute nella Class declaration della data provider indicando il nome della query che vogliamo caricare:
[SRSReportQueryAttribute (querystr(CustTable))] //transazioni clienti

Nel metodo processReport si recupera la query tramite il metodo standard parmQuery() in questo modo: QueryRun queryRun = new QueryRun(this.parmQuery()); ed utilizzare poi il classico while (queryRun.next()) { } Per scorrere i record della query. Se da visual studio espandiamo il nodo dei parametri del report, vediamo il parametro chiamato DynamicParameter che indica il nostro query run. Per quanto riguarda la tabella temporanea bisogna settare la propriet tableType come TempDB o InMemory. Si consiglia di usare InMemory per tabelle piccole (con meno di 1000 records); Usare TempDB per gestire tabelle pi grandi e migliorare le performance dato che in AX 2012 con questa opzione la tabella viene scritta direttamente dentro SQLServer. A questo punto in visual studio, nelle propriet del dataset settiamo la propriet Report data provider, clicchiamo su [..] che questa volta mostrer la lista delle classi dataprovider disponibili:

Click su next, come nel caso della query dovremo selezionare i campi e i metodi display da tenere in considerazione, clicchiamo infine su OK per rendere effettive le modifiche ed iniziare a lavorare sul layout col report design di visual studio.

10

3. Report Designer (Visual Studio 2010)

Per prima cosa aggiungiamo al report lheader e il footer. Da notare che a differenza del vecchio framework consentito lutilizzo di un solo header e di un solo footer Tasto destro sul repor -> Add -> page header, pagefooter. Come vediamo dalla figura, nel riquadro delle propriet possiamo impostare le dimensioni, i margini, il colo di sfondo etcc.. non esiste il concetto di Fit to page, cura del programmatore settare correttamente le dimensioni. Lintero report pu essere agevolmente ridimensionato semplicemente trascinandone i bordi i in alternativa settando il valore della propriet size. Molto utile risulta quindi il righello (tasto destro -> view -> ruler). I valori delle dimensioni possono essere espresse in pollici (in), centimetri(cm) oppure millimetri(mm). Il tab preview ci consente di visualizzare unanteprima veloce del report.

3.1 Gestione Label/TextBox


Per creare una label dobbiamo utilizzare una TextBox. Dopo ever creato la label possiamo inserire il testo al suo interno. Facciamo tasto desto sulla text box:

11

Per inserire il testo e gestirlo come label di AX dobbiamo selezionare expression ed inserire per esempio:

=Labels!@SYS336181
La sintassi dei comandi particolare di SSRS e si inspira comunque al C#, il riquadro in basso a sinistra ci viene in aiuto suggerendoci la sintassi delle funzioni pi comuni che si possono utilizzare. Se invece della Label volessimo visualizzare un campo del report la sintassi la seguente:

=Fields!InvoiceId.Value
In alternativa possiamo trascinare il campo che ci interessa dal riquadro report data direttamente allinterno del campo di testo Per visualizzare un parametro (per esempio la company) dobbiamo scrivere:

=Parameters!AX_CompanyName.Value
O trascinare il parametro dal nodo parameters nella textbox Possiamo selezionare Cut /Copy / Paste /Delete per tagliare / copiare /incollare o cancellare lelemento. Il sottomenu Layuout contiene una serie di funzioni molto utili per gestire la nostra texbox: Align left/center/right/top/middle/bottom per allineare una texbox nella stessa posizione di unaltra Make same height/width Per impostare stessa altezza/larghezza di unaltra textbox selazionata

NB: selezionare almeno due texbox per attivare il menu Il menu Text box properties apre le propriet delloggetto, da qu possiamo impostare diverse caratteristiche delloggetto:

12

General: Possiamo impostare il nome delloggetto , il suo valore e lhelptext Number: Serve ad impostare il formato del contenuto numerico, per esempio se deve essere in valuta o contenere date/ora , percentuale, si pu inoltre specificare un formato custom. Alignment: Specifica le propriet di allineamento e il padding, ossiam il margine del contenuto dal bordo Font: Serve a settare le propriet del carattere, la dimensione e lo stile Border: In questo men possiamo impostare le propriet del bordo Fill: Serve ad impostare il colore del riempimento ed eventuali immagini di sfondo Visibility: Imposta la visibilit delloggetto, pu essere true/false , vincolata dal valore di un campo del report o vincolata da un espressione. Possiamo per esempio decidere che lelemento sia visibile in base al valore assunto da un altro campo del report o da un parametro: es1: se il valore del campo > 0 visibile altrimenti no =IIF(Fields![nomeCampo].Value > 0 , True, False) Es2: se il valore del parametro Yes visualizza il campo alrtimenti no =IIF(Parameters![nomeParametro].Value = "Yes", True, False)

Notare limportanza del tasto funzione f(x) presente su quasi tutte le popriet. Questo potente strumento consente una notevole flessibilit del layout del report dato che oltre agli oggetti applicato anche alla funzioni di split e raggruppamento. Possiamo per esempio mettere una condizione sulla propriet background nella righe di un tablix per alternare il colore dello sfondo delle righe del report: Es3: se il numero di riga pari imposta sfondo bianco, altrimenti sfondo grigio =iif(RowNumber(Nothing) Mod 2, "#ffffff", "#f0f0f0") Dove la parola chiave Nothing consente di ottenere un conteggio parziale delle righe nell'area dati pi esterna, in alternativa si pu inserire il nome del tablix o il valore di un campo (per esempio linenum) Interactive sorting: contiene opzioni sullordinamento Action: per gestire funzioni di ipertesto

Possiamo effettuare selezioni multiple degli elementi del report e muoverli in blocco tedendo premuto il tasto ctrl + tasto freccia

3.2 Gestione Immagini


Per inserire unimmagine nel report dobbiamo semplicemente aggiungere un campo di tipo image ed inserire come espressione il valore del campo image properties -> use this field -> cliccare su fx ed inserire = Fields!CompanyLogo.Value

13

3.3 Le aree dati Tablix (Tabelle/matrici)

I tablix sono strumenti molto utili per stampare I dati del report. Si possono aggiungere solo nel corpo del report. Impostando la propriet datasetname il tablix cicler in automatico tutti i record del dataset. La prima riga di intestazione, la seconda conterr i dati da visualzzare. I tablix possono essere espansi a piacimento aggiungendo tutte le colonne che ci servono, ogni colonna pu essere ridimensionata a piacimento trasciando il bordo. Lutilizzo di una tabella piuttosto che una matrice dipende dal contesto, la differenza sostanziale nei raggruppamenti, nelle matrici infatti si possono creare raggruppamenti sia per riga che per colonna, nelle tabella il ragruppamento solo per righe. I raggruppamenti in SSRS sono identificati da una piccola parentesi quadrata gialla che appare sul bordo destro della cella:

Come si evince dalla figura nelle matrici il raggruppamento possibile anche per colonna. In realt esiste anche una terza area dati in cui possibile organizzare i dati: larea dati List che consiste in un elenco in formato libero in cui Non obbligatorio utilizzare un layout griglia ma possibile posizionare liberamente i campi all'interno dell'elenco. Le funzionalit Tablix includono la visualizzazione dei dati di dettaglio o di aggregazioni per i dati raggruppati in righe e colonne. inoltre possibile creare gruppi nidificati. I dati raggruppati possono essere filtrati e ordinati e si possono inoltre combinare con semplici operazioni i gruppi includendo pi espressioni di raggruppamento in una definizione di gruppo, possibile aggiungere i totali per un gruppo o i totali complessivi per l'area dati. Si possono nascondere le righe o le colonne per semplificare un report e consentire all'utente di attivare la visualizzazione dei dati nascosti. Lutilizzo dei tablix consentito solamente nel body del report

3.4 Gestione raggruppamenti nei Tablix


Le righe all'interno di un gruppo si ripetono una volta per ogni valore univoco del gruppo e vengono utilizzate in genere per i riepiloghi di aggregazione.Quando si seleziona una cella della Tablix, gli handle di riga e colonna e le parentesi all'interno dell'area dati Tablix mostrano i gruppi a cui appartiene una cella. In questa figura sono riportati gli indicatori visivi seguenti:

14

Possiamo aggiungere altri campi di raggruppamento trascinando i campi dal riquadro report data al riquadro row gruop, nidificandoli secondo i nostri criteri di raggruppamento

Per inserire i totaloni e subtotali per guppo ci baster fare click col destro sul gruppo/sottogruppo che ci interessa e cliccare AddTotal, SSRS creer in automatico la cella con la somma della colonna.

In generale la sintassi di SSRS per effettuare la somma la seguente: =Sum(Fields![nomeCampo].Value) per ogni riga/colonna del tablix si pu gestire la visibilit e lordinamento, mentre per ciascuna cella possiamo impostare tutte le propiet della textbox (impostando per esempio la visualizzazione dei soli bordi laterali si possono ottenere le righe verticali!!)

15

4. Deploy del report


Una volta terminate le modifiche al layout dobbiamo fare il deploy della soluzione per rendere effettive le modifiche in AX

si consiglia quindi di eseguire VisualStudio come utente amministratore.

16