none
llevar datos de un datagrid creado en tiempo de ejecucion(no enlazado a datos) a un reporte crystal report RRS feed

  • Pregunta

  • Tengo el siguiente codigo, el primer bloque  es una function que me hace una lista de dias de la semana, especificamente lunes y recibe tres parametros. El Segundo bloque de codigo es el metodo que me acomoda los datos dentro de un datagridview y me hace un calculo matematico a base de una cantidad que pongo en uno de los parametros.  El detalle es que este datagridview no esta enlazado a ninguna base de datos sino que lo creo en tiempo de ejecucion y quisiera poder tomar los datos de ese datagridview y ponerlos en un reporte de crystal report, todos lo ejemplos que he visto son buscando los datos en una table y ese no es mi caso , gracias

     Public Function Fechas(ByVal f1 As DateTime, ByVal f2 As DateTime, ByVal ds As DayOfWeek) As IEnumerable(Of DateTime)
            Dim fecha As DateTime
            Dim dif As Integer = f1.DayOfWeek - ds
    
            Select Case dif
                Case Is < 0
                    fecha = f1.AddDays(-dif)
                Case Is > 0
                    fecha = f1.AddDays(7 - dif)
                Case Else
                    fecha = f1
            End Select
    
            Dim lista As New List(Of DateTime)
    
            While Not fecha > f2
                lista.Add(fecha)
                fecha = fecha.AddDays(7)
            End While
    
            Return lista
        End Function

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim diaDeLaSemana As DayOfWeek = DayOfWeek.Monday
            Dim fechainicial As DateTime = MaskedTextBox1.Text
            Dim fechafinal As DateTime = MaskedTextBox2.Text
            Dim deuda As Decimal = CDec(TextBox1.Text)
    
            Dim listaDiasLunes As IEnumerable(Of DateTime) = Fechas(fechainicial, fechafinal, diaDeLaSemana)
    
            DataGridView1.Columns.Add("fecha", "Fecha")
            DataGridView1.Columns("fecha").ValueType = GetType(DateTime)
            DataGridView1.Columns("fecha").DefaultCellStyle.Format = "dddd dd/MM/yyyy"
            DataGridView1.Columns("fecha").Width = 150
            DataGridView1.Columns.Add("cuota", "Cuota")
            DataGridView1.Columns("cuota").ValueType = GetType(Decimal)
            DataGridView1.Columns("cuota").DefaultCellStyle.Format = "C2"
    
            For Each dia As DateTime In listaDiasLunes
                DataGridView1.Rows.Add(dia, deuda / listaDiasLunes.Count)
            Next
        End Sub

    • Cambiado Enrique M. Montejo sábado, 3 de enero de 2015 7:38 Pregunta relacionada con Crystal Reports.
    martes, 30 de diciembre de 2014 10:54

Respuestas

  • Hola:
    El ejemplo consta de 2 Forms, el primero el que tu enseñas, y el segundo el Form donde se visualiza el informe.

    El codigo del Form1 es.

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim diaDeLaSemana As DayOfWeek = DayOfWeek.Monday
            Dim fechainicial As DateTime = CDate(Me.MaskedTextBox1.Text)
            Dim fechafinal As DateTime = CDate(MaskedTextBox2.Text)
            Dim deuda As Decimal = CDec(TextBox1.Text)
            Dim listaDiasLunes As New List(Of Registro)
            listaDiasLunes = Fechas(fechainicial, fechafinal, diaDeLaSemana)
            Me.DataGridView1.DataSource = listaDiasLunes
        End Sub

        Public Function Fechas(ByVal f1 As DateTime, ByVal f2 As DateTime, ByVal ds As DayOfWeek) As List(Of Registro)
            Dim fecha As DateTime
            Dim dif As Integer = f1.DayOfWeek - ds
            '
            Select Case dif
                Case Is < 0
                    fecha = f1.AddDays(-dif)
                Case Is > 0
                    fecha = f1.AddDays(7 - dif)
                Case Else
                    fecha = f1
            End Select
            '
            Dim lista As New List(Of Registro)
            Dim liContador As Integer = 0
            While Not fecha > f2
                lista.Add(New Registro(fecha, CDec(Me.TextBox1.Text)))
                fecha = fecha.AddDays(7)
            End While
            For Each lRegistro As Registro In lista
                lRegistro.Cuota = lRegistro.Cuota / lista.Count
            Next
            Return lista
        End Function

    'Este botón es para visualizar el listado

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim lLista As New List(Of Registro)
            lLista = CType(Me.DataGridView1.DataSource, List(Of Registro))
            Using loForm As New FrmCrystal
                loForm.Lista = lLista
                loForm.ShowDialog()
            End Using
        End Sub
    End Class

    El segundo Form se llama FrmCrystal y tiene 1 CrystalReportViewer llamado crvInforme.
    Este es su codigo

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.Data.OleDb
    Imports CrystalDecisions.CrystalReports.Engine

    Public Class FrmCrystal
        Private mLista As List(Of Registro)

        Public Property Lista() As List(Of Registro)
            Get
                Return mLista
            End Get
            Set(ByVal value As List(Of Registro))
                mLista = value
            End Set
        End Property

        Private Sub FrmCrystal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim rptInforme As New CrystalReport1
                rptInforme.SetDataSource(mLista)
                Me.crvInforme.ReportSource = rptInforme
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "FrmCrystal_Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.Close()
            End Try
        End Sub
    End Class

    El fichero RPT se llama CrystalReport1 y lo tendras que crear con 2 campos llamados FECHA y CUOTA.

    Se usa una clase llamada Registro, este es su codigo

    Public Class Registro
        Private mFecha As Date
        Private mCuota As Decimal

        Public Property Fecha() As Date
            Get
                Return mFecha
            End Get
            Set(ByVal value As Date)
                mFecha = value
            End Set
        End Property

        Public Property Cuota() As Decimal
            Get
                Return mCuota
            End Get
            Set(ByVal value As Decimal)
                mCuota = value
            End Set
        End Property

        Public Sub New(ByVal vFecha As Date, ByVal vCuota As Decimal)
            Me.Fecha = vFecha
            Me.Cuota = vCuota
        End Sub
    End Class

    Espero que te sirva.
    Un saludo desde Bilbo
    Carlos


    martes, 30 de diciembre de 2014 12:37

Todas las respuestas

  • Hola:
    El ejemplo consta de 2 Forms, el primero el que tu enseñas, y el segundo el Form donde se visualiza el informe.

    El codigo del Form1 es.

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim diaDeLaSemana As DayOfWeek = DayOfWeek.Monday
            Dim fechainicial As DateTime = CDate(Me.MaskedTextBox1.Text)
            Dim fechafinal As DateTime = CDate(MaskedTextBox2.Text)
            Dim deuda As Decimal = CDec(TextBox1.Text)
            Dim listaDiasLunes As New List(Of Registro)
            listaDiasLunes = Fechas(fechainicial, fechafinal, diaDeLaSemana)
            Me.DataGridView1.DataSource = listaDiasLunes
        End Sub

        Public Function Fechas(ByVal f1 As DateTime, ByVal f2 As DateTime, ByVal ds As DayOfWeek) As List(Of Registro)
            Dim fecha As DateTime
            Dim dif As Integer = f1.DayOfWeek - ds
            '
            Select Case dif
                Case Is < 0
                    fecha = f1.AddDays(-dif)
                Case Is > 0
                    fecha = f1.AddDays(7 - dif)
                Case Else
                    fecha = f1
            End Select
            '
            Dim lista As New List(Of Registro)
            Dim liContador As Integer = 0
            While Not fecha > f2
                lista.Add(New Registro(fecha, CDec(Me.TextBox1.Text)))
                fecha = fecha.AddDays(7)
            End While
            For Each lRegistro As Registro In lista
                lRegistro.Cuota = lRegistro.Cuota / lista.Count
            Next
            Return lista
        End Function

    'Este botón es para visualizar el listado

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim lLista As New List(Of Registro)
            lLista = CType(Me.DataGridView1.DataSource, List(Of Registro))
            Using loForm As New FrmCrystal
                loForm.Lista = lLista
                loForm.ShowDialog()
            End Using
        End Sub
    End Class

    El segundo Form se llama FrmCrystal y tiene 1 CrystalReportViewer llamado crvInforme.
    Este es su codigo

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.Data.OleDb
    Imports CrystalDecisions.CrystalReports.Engine

    Public Class FrmCrystal
        Private mLista As List(Of Registro)

        Public Property Lista() As List(Of Registro)
            Get
                Return mLista
            End Get
            Set(ByVal value As List(Of Registro))
                mLista = value
            End Set
        End Property

        Private Sub FrmCrystal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim rptInforme As New CrystalReport1
                rptInforme.SetDataSource(mLista)
                Me.crvInforme.ReportSource = rptInforme
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "FrmCrystal_Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.Close()
            End Try
        End Sub
    End Class

    El fichero RPT se llama CrystalReport1 y lo tendras que crear con 2 campos llamados FECHA y CUOTA.

    Se usa una clase llamada Registro, este es su codigo

    Public Class Registro
        Private mFecha As Date
        Private mCuota As Decimal

        Public Property Fecha() As Date
            Get
                Return mFecha
            End Get
            Set(ByVal value As Date)
                mFecha = value
            End Set
        End Property

        Public Property Cuota() As Decimal
            Get
                Return mCuota
            End Get
            Set(ByVal value As Decimal)
                mCuota = value
            End Set
        End Property

        Public Sub New(ByVal vFecha As Date, ByVal vCuota As Decimal)
            Me.Fecha = vFecha
            Me.Cuota = vCuota
        End Sub
    End Class

    Espero que te sirva.
    Un saludo desde Bilbo
    Carlos


    martes, 30 de diciembre de 2014 12:37
  • El fichero RPT se llama CrystalReport1 y lo tendras que crear con 2 campos llamados FECHA y CUOTA.

    Carlos esto es lo unico que no entendi del todo, estoy trabajando con el codigo a ver si me funciona como quiero pero como puedo crear dos campos al fichero RPT, como lo puedo hacer

    martes, 30 de diciembre de 2014 20:00
  • Hola:
    Cuando creas un fichero RPT, ¿Como agregas los campos a dicho fichero?
    La respuesta a tu pregunta, la tienes que saber.
    Como pista, create una tabla con 2 campos llamados FECHA y CUOTA y crea un fichero RPT y agrega dichos campos a dicho fichero.
    En el programa le cargas los datos desconectados que tienen dichos campos.
    Espero que se entienda

    Un saludo desde Bilbo
    Carlos

    miércoles, 14 de enero de 2015 10:12