Skip to content

Impariamo Xojo: Report senza database

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.