Per chi come me sviluppa su Nav da un può di tempo questo cambiamento è realmente importante, non solo da un punto di vista interfaccia di sviluppo ma anche da un punto di vista concettuale.
In pratica da Nav possiamo definire la sorgente dati (Dataset) che verrà visualizzato nel report mentre l’output grafico del report stesso è definito tramite Visual Studio e salvato nell’oggetto “report” di nav in formato Xml (RDLC).
Per vedere le potenzialità che offre questo nuovo modo di sviluppare report ne creiamo subito uno semplice, File > New.
Il nuovo layout di sviluppo è quasi simile al precedente, si devono creare i dataitem che costituiranno la sorgente dati, si possono indentare e dare un legame tra padre e figlio. La differenza è data dal fatto che non si effettua il design del report ma del set di dati, quindi per ciascun dataitem bisogna definire i campi necessari al processo di costruzione del layout grafico.
Creazione della sorgente Dati (DataSet)
La colonna DataType contiene i valori DataItem (per definire una tabella come sorgente dati) e Column (per definire il campo della tabella del dataitem padre da visualizzare successivamente nel layout del report).
La colonna DataSource permette di scegliere la tabella di origine dei dati se il valore della colonna precedente è impostato su Dataitem, seno permette di scegliere il campo della tabella del dataitem padre.
La colonna Name sarà utilizzata nel designer di Visual studio per referenziare il campo da visualizzare.
La colonna Include Caption permette di importare la caption ML del campo all’interno del designer di visual studio.
Cominciamo il design del nostro report di esempio inserendo una riga con DataType = DataItem, DataSource = Customer e Name = Customer, in questo modo stamperemo una lista di clienti.
Inseriamo una riga con DataType = Column e datasource = “No.”.
Ripetiamo l’ultima operazione per i campi Name, Address e City.
Dovrebbe corrispondere a quest’anteprima:
Si nota che ancora non abbiamo dato un Nome hai campi in modo da poterli usare nella costruzione del report, dato che successivamente in questo articolo andremo ad aggiungere un dataitem figlio per visualizzare le vendite di ciascun cliente, e dato che Visual Studio prende in considerazione una sola sorgente dati costituita da una tabella unica, per differenziare i campi della tabella clienti dai campi delle tabelle figlie successive, bisogna inserire il nome della tabella nel nome del campo.
In questo modo nel designer di visual studio sapremo a quale tabella appartengono i campi.
Il nome del campo “No.” Diventa Customer_No, il nome del campo Name diventa Customer_Name etc …
Il nome di ciascun elemento deve rispettare le regole definite nel Common Language Specification accessibile a questo indirizzo: http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx ad esempio è impossibile inserire un punto o uno spazio nel nome di un elemento.
Per ciascun campo (righe con data Type = Column) possiamo decidere di importare la caption ML in visual studio inserendo un segno di spunta nella colonna “Include Caption”.
A questo punto abbiamo definito la sorgente dati che corrisponde ad una lista di tutti i clienti presenti in tabella 18 “Customer”. Come nelle versioni precedenti di Nav per impostare un filtro e/o un ordinamento bisogna selezionare la riga corrispondente al dataitem e cliccare su proprietà.
La proprietà che ci interessa è DataItemTableView che ci permette di selezionare una chiave di ordinamento, il senso Crescente o Decrescente ed i filtri.
Creazione del Layout del report
File > Layout, e se in precedenza avete installato visual studio 2008 SP2 o Visual Studio 2010 SP1 con Report Viewer 2010 si dovrebbe aprire il designer del report. L’uso del condizionale è d’obbligo.Si può notare che nella finestra principale di Visual Studio sono presenti 2 schede (Report.rdlc e Report.xsd). La prima scheda contiene la visualizzazione grafica del layout del report, la struttura rdlc (in formato “Xml”) che verrà salvata all’interno dell’oggetto report di Nav mentre la seconda scheda contiene la struttura del dataset usato come sorgente dati dal report e passato come argomento da Nav.
Report di tipo lista
Per costruire una lista di clienti, bisogna posizionare un controllo Tablix di tipo Table prendendolo dalla Toolbar (View > ToolBar) con il drag and drop sulla superficie del report designer di visual studio.Questo controllo permette di visualizzare i dati contenuti nella tabella del Dataset in forma tabellare, in fatti la prima riga deve contenere l’intestazione della colonna mentre la seconda sarà ripetuta per ciascun record e visualizzerà i dati.
Settiamo per prima cosa la sorgente dati del controllo tablix facendo un click destro del mouse sull’angolo superiore sinistro del controllo e selezionando proprietà (Tablix properties …). In questo modo accediamo ad una finestra contenente tutte le proprietà del controllo suddivise per categorie, le stesse proprietà si possono modificare dalla barra laterale destra delle proprietà (View > Properties windows o F4).
La proprietà che gestisce l’assegnazione della sorgente dati è “DataSet name” valorizzabile tramite una lista a discesa contenente il nome del dataset creato automaticamente da Nav.
Le proprietà successive permettono di gestire il comportamento delle intestazioni delle colonne e delle righe (solo se ci sono gruppi impostati e lo vedremo in un altro articolo) così come il salto pagina prima del primo record e dopo l’ultimo record del dataset. E’ anche possibile gestire la visibilità del controllo, applicare dei filtri e cambiare ordinamento ma per ora non voglio approfondire troppo.
Ora dobbiamo assegnare a ciascuna colonna il campo da visualizzare, facendo click destro nel campo della seconda riga e selezionando Textbox properties e modificando il valore della proprietà value. Il pulsante “Fx” accanto alla proprietà permette di aprire un editor di codice Visual Basic che ci permette di controllare in modo più accurato il valore della colonna. Nella parte delle categorie dell’ editor di script, scegliendo Fields possiamo selezionare il campo da assegnare alla colonna.
Ripetiamo la stessa operazione per ciascuna colonna.
Rimane da assegnare un valore all’intestazione delle colonne, questo si può fare facilmente facendo un click destro su una casella della prima riga del Tablix e selezionando “Expression” per aprire l’editor di script direttamente. Dato che abbiamo inserito il segno di spunta “Include Caption” nell’editor di dataset in Nav, troviamo le caption di ciascun campo nella categoria “Parameters” dell’editor di script.
A questo punto abbiamo concluso il minimo indispensabile per stampare una lista di clienti.
Salviamo e chiudiamo Visual Studio, ritorniamo su Nav, cliccando su una riga qualsiasi del report dataset designer ma comunque diversa della riga selezionata, Nav riconosce le modifiche apportate al layout e ci chiede se vogliamo importarlo e salvarlo nel report.
Ovviamente clicchiamo “Si” perché seno perdiamo tutto il lavoro effettuato in visual studio.
Salviamo anche in Nav e lanciamo il report (Ctrl+R).
Per migliorare il layout dovremmo eliminare la griglia, ripetere l’intestazione delle colonne su ciascuna pagina ed inserire un titolo al report.
Visualizza > Layout e torniamo in Visual Studio. Click destro su una cella, TextBox Properties, nel gruppo “Border” possiamo gestire l’apparenza del bordo della cella, clicchiamo su “None” per eliminare il bordo. Ripetiamo questi passi per ciascuna cella della griglia.
Per ripetere l’intestazione delle colonne, dato che non ci sono gruppi e non ci sono intestazioni di gruppi non possiamo usare la proprietà “repeat header columns on each page” del tablix. Dobbiamo agire sulla finestra di gruppi che si trova in basso in visual studio, cliccando sulla freccia del panello dei gruppi e selezionando “Advanced Mode” possiamo visualizzare la sezione statica che corrisponde alla prima riga.
Basta selezionare la prima riga nel riquadro “Row Groups” che corrisponde a “(Static)” e premere su F4 o View > Properties per poter assegnare il valore True alla proprietà “RepeatOnNewPage”.
Salviamo, chiudiamo, clicchiamo yes, clicchiamo su una riga in Nav, clicchiamo Sì e salviamo. (Certo è un può macchinoso, almeno più di prima senz’altro). Ctrl+R per eseguire il report.
Report con più datItems
Ora vediamo come possiamo aggiungere i movimenti contabili cliente per ciascun cliente nel nostro report. Dobbiamo aggiungere un dataItem al designer del Dataset attuale come nuova riga in coda alle righe esistenti. Ovviamente la nuova riga deve essere indentata rispetto alla riga del dataitem dei clienti. DataType=DataItem, DataSource=21, visualizza > proprietà e settiamo un ordinamento al dataitem tramite la proprietà DataItemTableView, sceglierò la chiave di ordinamento “Document Type,Customer No.,Posting Date,Currency Code” ed un filtro per document Type = Invoice per visualizzare solo le fatture dei clienti. Rimane da “legare” i movimenti clienti al codice cliente tramite la proprietà “DataItemLink” del dataitem, useremo l’editor cliccando sul pulsante di assitButon per impostare il valore “Customer No.=FIELD(No.)”.
Aggiungiamo una riga per i campi “Posting Date”, “Document No.”, “Open”, “Due Date” e “remaining Amount”, per ciascun campo (ciascuna riga) specifichiamo il valore del Nome inserendo il prefisso “CustLdgEntry_” seguito dal nome del campo per differenziare i campi dei movimenti clienti dai campi del cliente in Visual Studio. Ricordiamoci che la sorgente dati è costituita da un'unica tabella dove le colonne corrispondono ai campi dei Dataitems e le righe ai Records.
Dobbiamo modificare il layout del report, la nostra sorgente dati “DataSet” è pronta, quindi Visualizza > Layout e si apre Visual Studio. Aggiungiamo le colonne della tabella movimenti clienti alla griglia per vedere cosa succede quando lanciamo il report. Click destro sull’intestazione dell’ultima colonna destra > Insert Column > Right, assegniamo il valore di ciascuna colonna tramite la proprietà value di ciascuna cella come abbiamo visto in precedenza.
Salviamo, chiudiamo, Yes, Click su un'altra riga, Yes, salviamo e Yes. Lanciamo il report Ctrl+R.
Come possiamo vedere l’indentazione del dataitem movimenti clienti a permesso a Nav di riempire il dataSet alternando un record cliente con i records movimenti clienti. La formattazione delle date e delle cifre decimali non è del tutto corretta, andiamo a modificare questo comportamento settando la proprietà Format nella finestra TextBox Properties (da click destro sulla cella). Nella categoria “Number” possiamo selezionare “Date” come tipo di formattazione.
Per quanto riguarda la formattazione della cella corrispondente all’importo residuo, potremo selezionare “Currency” come tipologia di formattazione oppure possiamo scegliere “Custom” in modo da specificare la formattazione di Nav. In effetti per ciascun campo di tipo decimal, nav passa la formattazione (specificata nella proprietà “decimal place” del campo stesso) in un campo virtuale del dataset nominato come il campo di origine seguito da suffisso Format. Quindi selezionando “Custom” appare un textbox accanto dove cliccando sul relativo pulsante “Fx” si apre la solita finestra di editor di script dove andremo a selezionare nei “Fields” il campo “RemainigAmountFormat”.
Ctrl+R e lanciamo il report.
Per migliorare l’interfaccia possiamo inserire una riga orizzontale dopo i dati del cliente per separare il cliente dai suoi movimenti ed una riga vuota dopo i movimenti per creare uno spazio e distaccare un gruppo da un altro.
Cominciamo ad aggiungere una riga al nostro controllo Tablix con un click destro sull’intestazione della seconda riga contenente i records e selezionando Insert Row > Insert Row Above per inserire una riga prima della seconda riga di dettaglio.
Cominciamo ad aggiungere una riga al nostro controllo Tablix con un click destro sull’intestazione della seconda riga contenente i records e selezionando Insert Row > Insert Row Above per inserire una riga prima della seconda riga di dettaglio.
Ora assegniamo il valore ai campi delle colonne del cliente nella prima riga (aggiunta in precedenza) e cancelliamo il valore nella riga sottostante. Dobbiamo aggiungere la linea di separazione tra riga cliente e righe movimenti selezionando ciascuna cella della riga cliente e modificando nel gruppo “Border” l’apposita proprietà. Cliccando sul pulsante in corrispondenza della riga inferiore si può aggiungere al layout.
Se eseguiamo il report così, i dati del cliente si ripeteranno per ciascun movimento quindi dobbiamo gestire la proprietà “visible” delle righe del Tablix. Per capire se il record corrente appartiene ad una tabella piuttosto che ad un'altra utilizzeremo due variabili globali di tipo intero che chiameremo iCustomer e iLedger, nel codice onAfterGetRecord dei dataItem inseriremo l’assegnazione 0 o 1 a ciascuna variabili. Ad esempio OnAfterGetRecord del dataItem Customer:
iCustomer := 1;
iLedger := 0;
Mentre OnAfterGetRecord del dataItem “Cust. Ledger Entry”:
iCustomer := 0;
iLedger := 1;
Aggiungiamo una riga di tipo column per ciascun dataitem in modo da trasferire il valore delle variabili nel dataSet con il valore della proprietà Name RecCustomer e RecLedger.
In Visual Studio cliccando sull’intestazione della riga in corrispondenza delle informazioni del cliente, possiamo selezionare la voce “Row Visibility” che ci permetterà di gestire la visibilità della riga tramite l’editor di script.
Selezioniamo “Show or Hide based on expression” e clicchiamo sul pulsante Fx. Prendiamo la category “Common Function” > Program Flow e l’”Item” IIF.
IIF(Espressione da valutare, Valore restituito se l’espressione è vera, Valore restituito se l’espressione è false).
Dato che la proprietà gestita in realtà è la proprietà Hide quindi nascondi la riga in base al valore della variabile RecCustomer, l’espressione diventa questa:
=IIf(Fields!RecCustomer.Value=1,False,True)
IIF(Espressione da valutare, Valore restituito se l’espressione è vera, Valore restituito se l’espressione è false).
Dato che la proprietà gestita in realtà è la proprietà Hide quindi nascondi la riga in base al valore della variabile RecCustomer, l’espressione diventa questa:
=IIf(Fields!RecCustomer.Value=1,False,True)
Facciamo la stessa cosa con la riga dei movimenti clienti e la variabile RecLedger. Salviamo, chiudiamo etc .. e lanciamo il report.
Il nostro report non è certo un modello di bellezza, ma abbiamo visto le funzionalità basilare per costruire un report semplice. Per migliorare il layout dovremo raggruppare per cliente e forzare un salto pagina per ciascun cliente in modo da separare meglio le informazioni.
Report con Tablix e Gruppi
Clicchiamo su una cella del tablix, nella barra dei gruppi facciamo click destro sul gruppo Dettagli e selezioniamo “Add Group Parent”. Questo ci permette di aggiungere un gruppo padre.
Impostiamo il campo “Customer No” come criterio di gruppo e scegliamo di aggiungere una riga di “Header” e di “Footer” per il gruppo. Trasferiamo i campi relativi al cliente dalla riga del cliente alla riga di “Header” del gruppo appena creata e cancelliamo la riga rimasta vuota.
Eliminiamo la colonna “Customer No” aggiunta dal wizard di creazione del gruppo, click destro sull'intestatazione e elimina colonna.
Ci rimane da impostare la proprietà del gruppo che ci permette di fare il salto pagina, click destro sul gruppo e “group properties”.
Page Breaks > Between each instance of group.
Salviamo chiudiamo etc.. e lanciamo il report.
Aggiungiamo un titolo al nostro report, la lista dei filtri impostati, il numero di pagina e la data del giorno e avremo finito il nostro compito.
Per implementare queste funzionalità bisognerà passare al processo di elaborazione del layout del report le informazioni: Titolo del report (anche in lingua), l’userid, la data del giorno ed i filtri impostati. Dovremmo creare una TextConstant che conterà il titolo del report e con l’aiuto delle gestione del multilingua della costante specificare le traduzioni eventuali. Creiamo la nostra costante ReportTitle, Visualizza > Gobals > TextConstant, Name = ReportTitle, Value = Fatturato per cliente.
Aggiungiamo una riga in cima alle colonne del dataitem Customer, DataType=Column, DataSource=ReportTitle, Name = ReportTitle.
Aggiungiamo un'altra riga di tipo colonna valorizzata con la variabile di sistema UserID, un'altra riga con la variabile WORKDATE ed un'altra ancora con l’espressione Customer.GETFILTERS.
Per implementare queste funzionalità bisognerà passare al processo di elaborazione del layout del report le informazioni: Titolo del report (anche in lingua), l’userid, la data del giorno ed i filtri impostati. Dovremmo creare una TextConstant che conterà il titolo del report e con l’aiuto delle gestione del multilingua della costante specificare le traduzioni eventuali. Creiamo la nostra costante ReportTitle, Visualizza > Gobals > TextConstant, Name = ReportTitle, Value = Fatturato per cliente.
Aggiungiamo una riga in cima alle colonne del dataitem Customer, DataType=Column, DataSource=ReportTitle, Name = ReportTitle.
Aggiungiamo un'altra riga di tipo colonna valorizzata con la variabile di sistema UserID, un'altra riga con la variabile WORKDATE ed un'altra ancora con l’espressione Customer.GETFILTERS.
In Visual Studio cliccando su la parte libera della pagina con il tasto destro possiamo aggiungere un Page Header.
Tramite il TextBox properties possiamo scegliere il font, la dimensione e lo stile del titolo. Ripetiamo li stessi passi per i filtri e per la data.
Per il textBox del numero di pagina, troviamo nella categoria “Built in Fields” dell’ editor di script della proprietà Value, la variabile di sistema “PageNo” che restituisce il numero di pagina corrente.
Salviamo, chiudiamo etc .. lanciamo il report.
Salviamo, chiudiamo etc .. lanciamo il report.
Decisamente meglio. Abbiamo concluso lo sviluppo di un report semplice in Nav 2013, tramite il Dataset Designer di Nav e Visual Studio.
Petrantoni Virgile
MCTS – DynamicsMCSD.Net
MCTS – Sql Server 2008
http://www.novalysis.it/Software/Dynamics%20Nav/
http://www.linkedin.com/pub/virgile-petrantoni/1a/66a/b9a