Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
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:
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:
Ovviamente fatta eccezione del nodo SSRS al quale possiamo aggiungere nuovi elementi, tutti gli altri nodi sono in sola visualizzazione.
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
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++.
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; }
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
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.
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
13
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
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
16