none
crystal reports cpn dataset vb.net 2005 RRS feed

  • Pregunta

  • Hola estoy desarrolando una aplicacion windows forms con vb.net 2005 y realice unos reportes en total 3 con crystal reports, pero no me gusta la forma o mejor dicho no es la mas adecuada en cuanto a performance hablo.

    Lo que hago es asociar el reporte en tiempo de diseño a traves el explorador de servidores con una tabla de la base de datos con sql server 2005 trabajo.

    Y en tiempo de ejecucion cada ves que tengo que hacer el reporte elimino todos los registros de la tabla de la base de datos que esta asociada al reporte y cargo los datos que debe mostrar el reporte.

    Ahora fijanse si la cantidad de registros a mostrar crece dia a dia y sin importar eso es ineficiente cargar y y eliminar cada ves que hago un reporte.

    Otra opcion:

    Se que se puede realizar a traves de dataset tipados (se le llaman a los dataset creados en tiempo de diseño) y no tipados (creados en tiempo de ejecucion), ahora no se puede crear a traves de un dataset no tipado verdad? digo asociarlo a un reporte de crystal reports porque la consulta la genero en tiempo de ejecucion no con una vista y el reporte de crystal reports exige hacerlo (establecer una conexion en diseño) o por lo menos eso creo.

    Y con dataset tipados vi como se crea y se asocia en tiempo de diseño al reporte crystal reports pero en tiempo de diseño hago la consulta y con un dataAdapter  con la propiedad fill lo quiero cargar al dataset y da un error en tiempo de diseño no se puede realizar la operacion porque es de tipo me dice.

    Me pueden ayudar a comprender bien como hacerlo¿?

     

    Saludos

    Atte.Dante Tagliavini

    lunes, 28 de enero de 2008 2:03

Respuestas

  • ok, te entiendo. Esa es la forma que uso yo. Genere una Tabla fisicamente en la Base de Datos y esta asociada al crystal reports.

    Ahora para que te quede claro, como es dinamica la consulta no puedo usar una vista porque de acuerdo a un codigo de un departamento obtengo los datos de la base de datos y para ello uso un procedimiento almacenado y con los datos obtenidos cargo los datos en la tabla fisica y listo ya tengo los datos para el reporte.

    Ahora te hago una pregunta se puede asociar un procedimiento almacenado a un reporte de crystal reports¿? seria mas sencillo o mejor dicho me ahorraria crear una tabla en la base de datos.

     

    Saludos

     

     

    lunes, 28 de enero de 2008 12:42

Todas las respuestas

  • No acabo de comprender concretamente cual es el problema, pero en todo caso, en el punto que comentas en que no se puede (no sabes) cambiar la conexión a la base de datos en el informe en tiempo de ejecución, creo que el siguiente hilo te puede ser de ayuda:

    http://forums.microsoft.com/msdn-es/ShowPost.aspx?PostID=2628335&SiteID=11

     

     

     

    Salud y suerte!

    lunes, 28 de enero de 2008 9:18
    Moderador
  • Basicamente el problema y una preunta te hago ya que estamos.

     

    1- Te parece adecuado que realice de esa manera  el reporte en crystal reports ¿? Digo Estableciendo de antemano la conexion con una tabla de sql server 2005 y cada ves que realizo el reporte limpio la Tabla(DELETE) y vuelvo a cargar los datos (INSERT) de este modo siempre tengolos datos en el reporte.

     

    2- El problema es que no entiendo como trabajar con dataset tipados con crystal reports. y vique crystal reports solo trabaja con dataset fuertemente tipados. Ahora lei mucho pero encontre mucho ejemplo pero con el vb.net 2003 no con el 2005 me podrias mostrar al ejemplo con codigo¿?

     

    Saludos

    Atte. Dante Tagliavini

     

    lunes, 28 de enero de 2008 12:10
  •  Creed55 Escribió:

    1- Te parece adecuado que realice de esa manera  el reporte en crystal reports ¿? Digo Estableciendo de antemano la conexion con una tabla de sql server 2005 y cada ves que realizo el reporte limpio la Tabla(DELETE) y vuelvo a cargar los datos (INSERT) de este modo siempre tengolos datos en el reporte.

     

    Lo que no entiendo es por qué necesitas crear este tipo de tabla temporal en lugar de usar vistas en la base de datos.

     

     Creed55 Escribió:

    2- El problema es que no entiendo como trabajar con dataset tipados con crystal reports. y vique crystal reports solo trabaja con dataset fuertemente tipados. Ahora lei mucho pero encontre mucho ejemplo pero con el vb.net 2003 no con el 2005 me podrias mostrar al ejemplo con codigo¿?

     

    Lo siento, pero no suelo usar Datasets tipados... Sad

     

    Salud y suerte!

    lunes, 28 de enero de 2008 12:15
    Moderador
  • ok si tenes razon lo que pasa es que no trabajo mucho con subconsultas de sql server y lo hice en 2 pasos a la consulta y a los datos los iba generando en 2 partes por eso pero te mando el problema de sql server si queres por aqui o por el foro de sql server mejor y me respondes.

    Yo tampoco uso dataset tipados solo vi en la web que otros usuarios lo usan y pense como solucion nada mas.

    Ahora una ultima cosa antes de entraren sql server, vos como lo trabajas generalemente obtenes los datos con vistas y asocias la vista al crystal reports asi me decis que lo haga¿?

     

    Saludos

    Atte. Dante Tagliavini

    lunes, 28 de enero de 2008 12:23
  • Yo por lo general intento realizarlo mediante vistas en el SQL Server. Si el informe es demasiado complejo y necesitas crear una tabla "al vuelo" para posteriormente vincularla a Crystal Reports, lo más sencillo es crearte la tabla físicamente en el servidor. De este modo el enlace al informe puede ser fijo.

     

    Saludos.

     

    lunes, 28 de enero de 2008 12:29
    Moderador
  • ok, te entiendo. Esa es la forma que uso yo. Genere una Tabla fisicamente en la Base de Datos y esta asociada al crystal reports.

    Ahora para que te quede claro, como es dinamica la consulta no puedo usar una vista porque de acuerdo a un codigo de un departamento obtengo los datos de la base de datos y para ello uso un procedimiento almacenado y con los datos obtenidos cargo los datos en la tabla fisica y listo ya tengo los datos para el reporte.

    Ahora te hago una pregunta se puede asociar un procedimiento almacenado a un reporte de crystal reports¿? seria mas sencillo o mejor dicho me ahorraria crear una tabla en la base de datos.

     

    Saludos

     

     

    lunes, 28 de enero de 2008 12:42
  • Hola , mira crear una tabla para insertar los valores en el y despues eliminarlos esta bien , pero mi recomendacion es que no trabajes asi , mejor trabaja con storeprocedures , asociandolos a cystals reports , es mas sencillo , y mas eficiente .
    Tambien en cuanto a performance se refiere , crystals reports asociado a cualquier lenguaje .net , crea una gran carga de memoria cada vez que se ejecutan , y no se liberan solas tienes que liberarlas mediante otro proceso especial .
    Te paso el codigo para que envies paramentros desde los storeprocedures hacia crystals reports :

    Code Snippet

    Imports System.Data
    Imports System.Data.SqlClient
    Imports CrystalDecisions.CrystalReports
    Imports CrystalDecisions.Shared
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Windows

    Public Class Reporte_Salidas

    Private Sub Reporte_Salidas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
    Dim connection As New ConnectionInfo
    Dim report As New Salidas_Almacen
    Dim parametro As ParameterField
    Dim parametro2 As ParameterField
    Dim server as string = "Tu Servidor"
    Dim database as string = "Tu DB"
    Dim user as string = "Tu User"
    Dim pass as string = "Tu Pass"


    connection.Type = ConnectionInfoType.SQL

    ''Rpt_Salidas_Vals es el nombre del Form,
    ''tanto fecha_ini como fecha_fin, son
    ''Datetime pickers
    ''@fecha_ini y @fecha_final , son las variables
    ''des Store procedure , que esta en la Base de Datos.

    parametro = report.ParameterFields("@fecha_ini")
    parametro.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_ini.Value.Date)


    parametro2 = report.ParameterFields("@fecha_final")
    parametro2.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_fin.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59))

    CrystalReportViewer1.ReportSource = report

    SetDBLogonForReport(connection, report)
    Catch ex As Exception
    MessageBox.Show(ex.Message.ToString)
    End Try
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
    Dim myTables As Tables = myReportDocument.Database.Tables
    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
    Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
    myTableLogonInfo.ConnectionInfo = myConnectionInfo
    myTable.ApplyLogOnInfo(myTableLogonInfo)
    Next
    End Sub


    Espero te se util
    sábado, 25 de octubre de 2008 18:06
  •  Marco_AEF Escribió:
    Hola , mira crear una tabla para insertar los valores en el y despues eliminarlos esta bien , pero mi recomendacion es que no trabajes asi , mejor trabaja con storeprocedures , asociandolos a cystals reports , es mas sencillo , y mas eficiente .
    Tambien en cuanto a performance se refiere , crystals reports asociado a cualquier lenguaje .net , crea una gran carga de memoria cada vez que se ejecutan , y no se liberan solas tienes que liberarlas mediante otro proceso especial .
    Te paso el codigo para que envies paramentros desde los storeprocedures hacia crystals reports :

    Code Snippet

    Imports System.Data
    Imports System.Data.SqlClient
    Imports CrystalDecisions.CrystalReports
    Imports CrystalDecisions.Shared
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Windows

    Public Class Reporte_Salidas

    Private Sub Reporte_Salidas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
    Dim connection As New ConnectionInfo
    Dim report As New Salidas_Almacen
    Dim parametro As ParameterField
    Dim parametro2 As ParameterField
    Dim server as string = "Tu Servidor"
    Dim database as string = "Tu DB"
    Dim user as string = "Tu User"
    Dim pass as string = "Tu Pass"


    connection.Type = ConnectionInfoType.SQL

    ''Rpt_Salidas_Vals es el nombre del Form,
    ''tanto fecha_ini como fecha_fin, son
    ''Datetime pickers
    ''@fecha_ini y @fecha_final , son las variables
    ''des Store procedure , que esta en la Base de Datos.

    parametro = report.ParameterFields("@fecha_ini")
    parametro.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_ini.Value.Date)


    parametro2 = report.ParameterFields("@fecha_final")
    parametro2.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_fin.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59))

    CrystalReportViewer1.ReportSource = report

    SetDBLogonForReport(connection, report)
    Catch ex As Exception
    MessageBox.Show(ex.Message.ToString)
    End Try
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
    Dim myTables As Tables = myReportDocument.Database.Tables
    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
    Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
    myTableLogonInfo.ConnectionInfo = myConnectionInfo
    myTable.ApplyLogOnInfo(myTableLogonInfo)
    Next
    End Sub

    Aprovechando tengo 140 tablas en Access y tengo que mostrarlas en un solo reporte pero no se como hacer me podrian desir como con esta manera

    martes, 28 de octubre de 2008 3:34
  •  Marco_AEF Escribió:
    Hola , mira crear una tabla para insertar los valores en el y despues eliminarlos esta bien , pero mi recomendacion es que no trabajes asi , mejor trabaja con storeprocedures , asociandolos a cystals reports , es mas sencillo , y mas eficiente .
    Tambien en cuanto a performance se refiere , crystals reports asociado a cualquier lenguaje .net , crea una gran carga de memoria cada vez que se ejecutan , y no se liberan solas tienes que liberarlas mediante otro proceso especial .
    Te paso el codigo para que envies paramentros desde los storeprocedures hacia crystals reports :

    Code Snippet

    Imports System.Data
    Imports System.Data.SqlClient
    Imports CrystalDecisions.CrystalReports
    Imports CrystalDecisions.Shared
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Windows

    Public Class Reporte_Salidas

    Private Sub Reporte_Salidas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
    Dim connection As New ConnectionInfo
    Dim report As New Salidas_Almacen
    Dim parametro As ParameterField
    Dim parametro2 As ParameterField
    Dim server as string = "Tu Servidor"
    Dim database as string = "Tu DB"
    Dim user as string = "Tu User"
    Dim pass as string = "Tu Pass"


    connection.Type = ConnectionInfoType.SQL

    ''Rpt_Salidas_Vals es el nombre del Form,
    ''tanto fecha_ini como fecha_fin, son
    ''Datetime pickers
    ''@fecha_ini y @fecha_final , son las variables
    ''des Store procedure , que esta en la Base de Datos.

    parametro = report.ParameterFields("@fecha_ini")
    parametro.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_ini.Value.Date)


    parametro2 = report.ParameterFields("@fecha_final")
    parametro2.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_fin.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59))

    CrystalReportViewer1.ReportSource = report

    SetDBLogonForReport(connection, report)
    Catch ex As Exception
    MessageBox.Show(ex.Message.ToString)
    End Try
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
    Dim myTables As Tables = myReportDocument.Database.Tables
    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
    Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
    myTableLogonInfo.ConnectionInfo = myConnectionInfo
    myTable.ApplyLogOnInfo(myTableLogonInfo)
    Next
    End Sub

    Aprovechando tengo 140 tablas en Access y tengo que mostrarlas en un solo reporte pero no se como hacer me podrian desir como con esta manera?

    martes, 28 de octubre de 2008 3:34
  • Hola tengo duda si esto me pueda servir para conectar 140 tablas de accss en un solo crystal reports?
    Code Snippet

    Imports System.Data
    Imports System.Data.SqlClient
    Imports CrystalDecisions.CrystalReports
    Imports CrystalDecisions.Shared
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Windows

    Public Class Reporte_Salidas

    Private Sub Reporte_Salidas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
    Dim connection As New ConnectionInfo
    Dim report As New Salidas_Almacen
    Dim parametro As ParameterField
    Dim parametro2 As ParameterField
    Dim server as string = "Tu Servidor"
    Dim database as string = "Tu DB"
    Dim user as string = "Tu User"
    Dim pass as string = "Tu Pass"


    connection.Type = ConnectionInfoType.SQL

    ''Rpt_Salidas_Vals es el nombre del Form,
    ''tanto fecha_ini como fecha_fin, son
    ''Datetime pickers
    ''@fecha_ini y @fecha_final , son las variables
    ''des Store procedure , que esta en la Base de Datos.

    parametro = report.ParameterFields("@fecha_ini")
    parametro.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_ini.Value.Date)


    parametro2 = report.ParameterFields("@fecha_final")
    parametro2.CurrentValues.AddValue(Rpt_Salidas_Vals.fecha_fin.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59))

    CrystalReportViewer1.ReportSource = report

    SetDBLogonForReport(connection, report)
    Catch ex As Exception
    MessageBox.Show(ex.Message.ToString)
    End Try
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
    Dim myTables As Tables = myReportDocument.Database.Tables
    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
    Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
    myTableLogonInfo.ConnectionInfo = myConnectionInfo
    myTable.ApplyLogOnInfo(myTableLogonInfo)
    Next
    End Sub

    martes, 28 de octubre de 2008 3:39
  • Bueno , creo que lo unico que tendrias que checar es la cadena de conexion de crystals con Access, por lo demas se debe de poder .

    Con un store procedure puedes selecionar datos de varias tablas .

    Espero te sirva de ayuda.

     

    martes, 28 de octubre de 2008 16:06