In Xojo esistono gli strumenti per realizzare dei report e come la maggioranza di questi il riferimento sono dei dati provenienti da un database. Ma non è strettamente necessario. Possono esistere casi in cui i dati sono memorizzati in altro modo ma possiamo comunque generare il nostro report.
In questo post non vediamo come impaginare il report, ma come realizzare una sorgente dati per esso pur non avendo un database.
Poniamo di avere come dati da utilizzare nel report un vettore di dati che sono, ad esempio una struttura (magari sono dati che provengono da uno strumento esterno e quindi che abbiamo ricevuto come struttura)
La struttura ad esempio ha questa dichiarazione:
Structure Struttura numero1 As Integer nome1 As String*32 importo1 As Currency End Structure |
Creiamo una classe che sarà la nostra sorgente dati per il report:
Class sorgenteReport //Proprietà data() As Struttura //Conterrà i nostri dati Private mRigaReport As Integer //Ci servirà dopo //Aggiungiamo un costruttore per rendere locali alla classe //i dati che vogliamo stampare Sub Constructor(refData() as Struttura) data=refData End Sub End Class |
Implementare l’interfaccia
Per rendere utile per il report questa classe dovremo fare in modo che venga vista come sorgente dati. Per fare questo selezioniamo la classe e premiamo il pulsante Interfaces: Choose (o selezioniamo il comando dal menù contestuale Implement Interface).
Appare una lista di interfacce presenti (quelle di base di Xojo e, nel caso, quelle che abbiamo definito noi). Selezioniamo Reports.Dataset.
Nella nostra classe appaiono una serie di metodi che andiamo a completare:
Function EOF() As Boolean // Part of the Reports.Dataset interface. // Indica se siamo arrivati alla fine dei dati Return mRigaReport>data.Ubound End Function Function Field(idx As Integer) As Variant // Part of the Reports.Dataset interface. // Restituisce il valore di un campo indicato per posizione Select Case idx Case 0 Return Field("Numero1") Case 1 Return Field("Nome1") Case 2 Return Field("Importo1") Else Return "" End Select End Function Function Field(name As String) As Variant // Part of the Reports.Dataset interface. // Restituisce il valore di un campo indicato per nome Select Case name Case "Numero1" Return data(mRigaReport).numero1 Case "Nome1" Return data(mRigaReport).nome1 Case "Importo1" Return data(mRigaReport).importo1 End Select End Function Function NextRecord() As Boolean // Part of the Reports.Dataset interface. // Chiede alla sorgente dati di avanzare alla // struttura successiva mRigaReport=mRigaReport+1 End Function Sub Run() // Part of the Reports.Dataset interface. // Chiede alla sorgente dati di posizionarsi // all'inizio della sequenza di dati mRigaReport=0 End Sub Function Type(fieldName as string) As integer // Part of the Reports.Dataset interface. // Suggerisce il tipo di dato rappresentato dal campo // I valori sono quelli riportati in // http://docs.xojo.com/index.php/Database.FieldSchema Select Case fieldName Case "Numero1" Return 3 //Intero Case "Importo1" Return 11 //Currency Case Else Return 5 //Testo lo usiamo anche come generico End Select End Function |
Fatto questo possiamo utilizzare la nostra sorgente dati. Poniamo che in una finestra abbiamo i dati memorizzati in una proprietà MiaStruttura (che è un vettore di Struttura)
Aggiungiamo un pulsante per stampare il report e nell’evento Action inseriamo:
//Creiamo la sorgente Dim sorgente As New sorgenteReport(MiaStruttura) //Creiamo le impostazioni di stampa Dim ps As New PrinterSetup //Creiamo il riferimento alla struttura fisica del report Dim rpt As New StrutturaReport //Se accettiamo le impostazioni di stampa lanciamo il report If ps.PageSetupDialog Then Dim g As Graphics g = OpenPrinterDialog(ps) If g <> Nil Then If rpt.Run(sorgente, ps) Then //Lanciamo il report con la nostra sorgente If rpt.Document <> Nil Then rpt.Document.Print(g) End If End If End If End If |
E il nostro report è pronto per essere stampato anche se non abbiamo un database.