Ciao Ragazzi ho un grosso problema con i cristal report, sono stato tutto il giorno a cercare di capire come fare a far visualizzare dati all'interno di un oggetto contenente dati e una lista di oggetti di un'altro tipo. Qualche idea e soprattutto c'è modo di farlo senza usare i dataset?

Grazie JAck

JJ Kuku Jan
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Con i report Microsoft è sufficiente utilizzare il Data Source Configuration Wizard (menù Data, Add New Data Source quindi selezioni Object come origine dei dati e, proseguendo, selezioni l'oggetto dal namespace della tua applicazione).

Non uso CR ma dovrebbe esserci qualcosa di simile (Database Expert, Project Data, .NET Objects).

Ciao.

.:. Marcello Rutter .:.
ok li l'ho provato anche io ma nonostante ciò il bordello rimane perche nn so come passargli l'oggetto e soprattutto nn so che oggetto passargli e come deve essere fatto.

Grazie JAck

JJ Kuku Jan
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Il problema allora non è CR ma il resto dell'applicazione. Premesso che non uso CR provo a postare un piccolo esempio (VB2005, crea nuovo progetto di tipo Windows Forms).

Prima di tutto devi predisporre la classe che farà da origine dati. Su questo argomento potremmo scrivere per ore perché ci sono precise tecniche di implementazione. Per non perdere il nostro obiettivo (agganciare il report ad una origine dati basata su oggetti .NET) tralascio questo argomento e passo al sodo. Creiamo una banale classe (progetto, nuova classe, Cliente.vb) per gestire i dati di un cliente.

Public Class Cliente

    Private _id As String
    Private _text As String

    Public Sub New(ByVal i As String, ByVal t As String)
        Me.Id = i
        Me.Text = t
    End Sub

    Public Property Id() As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            _id = value
        End Set
    End Property

    Public Property Text() As String
        Get
            Return _text
        End Get
        Set(ByVal value As String)
            _text = value
        End Set
    End Property

End Class


La classe gestisce due proprietà (codice e nome del cliente). A questo punto (dopo aver compilato il programma) dovrai specificare quale oggetto utilizzare come origine dati del report (a tale proposito aggiungerai, per il nostro esempio, un nuovo crystal report al progetto). Devi procedere come da precedenti istruzioni (Database Expert, Project Data, .NET Objects, LaMiaApplicazione.Cliente). Una volta specificata l'origine dati trascina semplicemente le proprietà dell'oggetto nella superficie di progettazione del report.

L'ultimo passaggio consiste nell'eseguire il binding dei dati tra report e classe .NET. Chiaramente questa attività viene di norma svolta leggendo dei dati da un database (la tabella clienti) e creando istanze della classe (una per ogni record). Senza entrare nel merito di questo passaggio simuleremo il tutto semplicemente aprendo il Form1 (creato automaticamente nel tuo progetto), inserendo un semplice bottone ed associando il codice che segue all'evento Click del bottone:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' Simulo il popolamento della classe che, si presume, avvenga tramite un database
        ' Allo scopo creo "una lista" di oggetti "Cliente"
        Dim c1 As New List(Of Cliente)

        c1.Add(New Cliente("1.1", "Cliente 1.1"))
        c1.Add(New Cliente("1.2", "Cliente 1.2"))

        ' Creo l'istanza del report
        Dim c As New CrystalReport1
        ' Assegno il datasource (trasformando la lista di oggetti in un array di oggetti di tipo Cliente)
        c.Database.Tables(0).SetDataSource(c1.ToArray())
        ' Esportoil report
        c.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.HTML40, "C:\MioReport.htm")

        ' Finito

    End Sub


Ho commentato il codice quindi non dovresti avere difficoltà di interpretazione (in ogni caso siamo qui, posta ancora).

Soluzioni alternative a quella illustrata e che non utilizzino DataSet consistono spesso nel produrre contenuti XML da dare in pasto al sistema di reporting (resto sul vago perché uso spesso questa tecnica ma, ripeto, non so se CR lo consenta).

Ciao.

.:. Marcello Rutter .:.
2 messaggi dal 14 settembre 2007
Esiste anche un'altra soluzione che consiste nell'utilizzare dei file di definizione dei campi (sono files di testo dove viene dichiarato il tipo di dato e la dimensione).
ma scusa allora non hai capito se io ho una classe cosi fatta:

Public class Indirizzo
private indirizzo as string
private citta as string
..
..
property etc
..
end class

Public Class Cliente

Private _id As String
Private _text As String
private _address As Indirizzo

Public Sub New(ByVal i As String, ByVal t As String)
Me.Id = i
Me.Text = t
End Sub

Public Property Id() As String
Get
Return _id
End Get
Set(ByVal value As String)
_id = value
End Set
End Property

Public Property Text() As String
Get
Return _text
End Get
Set(ByVal value As String)
_text = value
End Set
End Property

End Class

Il problema sul'ereditarietà di VS e la composizione di oggetti. Quando vado a impostare i dati sul report non vengono visualizzate le proprietà con oggetti diversi dai tipi base. Si vede che è ancora troppo vincolato ai database.

Spero in Orcas!! Per risolvere il mio problema ho dovuto spaghettare andando a recuperare i dati dal database e non direttamente dagli oggetti.

JJ Kuku Jan
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Sicuramente non ho capito il tuo problema, come hai scritto. Nel frattempo mi sono guardato i diversi tutorial disponibili per Crystal Report per VS2005 inerenti il binding con oggetti .NET e nessuno di questi riporta casi di oggetti complessi. Il problema, però, non sta tanto in .NET quanto nel sistema impiegato da CR per mappare gli oggetti nativi e trasformarli in tabelle interne (infatti il problema esiste sia in fase di progettazione del report che in fase di esecuzione dove, invece, si potrebbe sospettare di disporre dell'origine dati originale - cosa non vera - e magari utilizzarla in campi di tipo unbound - a questo punto soluzione non possibile).

Farò qualche ulteriore prova nei prossimi giorni (solo per curiosità personale a questo punto) cercando di approfondire CR.

Buon proseguimento.

.:. Marcello Rutter .:.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.