none
COMO GENERAR REPORTES EN VBASIC 2005 A TRAVES DE PARAMETROS Y POR CODIGO RRS feed

  • Pregunta

  • Quiero Relizar reportes por ADO.NET y no encuentro nada Alguien puede ayudarme necesito el codigo e implementar los parametros respectivos en VSBASIC2005

     

    Gracias

    miércoles, 16 de junio de 2010 15:43

Respuestas

  • Te sugiero que añadas un ReportViewer a un formulario y lo configures para mostrar los informes .rdlc que desees. Estos .rdlc son definiciones de informes. Tanto el código para el formulario como la creación inicial del informe los puedes realizar automáticamente con los asistentes de Visual Studio.

    Una vez que tengas un .rdlc, abrelo con un editor y verás que dentro tiene XML. Este XML describe las características del informe que se emite, y puedes manipularlo por código igual que cualquier otro archivo XML si deseas alterar desde tu programa las características del informe.

    Nota: necesitas para esto un Visual Studio Professional por lo menos. En la versión Express (gratuita), si no me equivoco, no se incluye el editor de informes.

     

    miércoles, 16 de junio de 2010 16:30
    Moderador
  • Hola, como dice Alberto, puedes crear un reporte con ReportViewer, al principio es un poco engorroso, pero con el tiempo verás que funciona muy bien, lo primero que deberías hacer es agregar a tu proyecto un archivo de tipo DataSet, en este dataset creas una Tabla y le adicionas las columnas de datos que quieres poner en el informe, esto por  que así es la forma más facil de diseñar tu informe.

    Ahora abres tu informe, le adicionas el dataset al informe, acto seguido le adicionas un control de tipo tabla  y le arrastras los campos que quieras mostrar en la tabla.

    En este informe también puedes crearle parámetros del informe según desees.

    Por último creas un formulario web con un control de report viewer y puedes también crear los diferentes controles que requieras para que el usuario pueda filtrar el informe, basado en estos controles haces tu consulta contra el origen de datos de tu elección y obtienes un dataset, el siguiente paso sería conectar este dataset con el informe con un código parecido a este :

    DataTable dt;
    dt = BindData(idGrado);			// Este método hace la consulta que desees.
    if (dt != null && dt.Rows.Count > 0)
    {
     //provide local report information to viewer
     if (ReportViewer1.LocalReport.DataSources.Count > 0)
      ReportViewer1.LocalReport.DataSources.Clear();
    
     // Aqui asignamos el nombre genérico de la empresa para parametrizar los reportes.
     ReportParameter NombreColegio = new ReportParameter("NombreColegio", Session["NombreColegio"].ToString());
     ReportParameter Logo = new ReportParameter("Logo", "file://" + Server.MapPath(Session["Logo"].ToString()));
     ReportParameter Periodo = new ReportParameter("Periodo", Session["Periodo"].ToString());
     this.ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { NombreColegio, Logo, Periodo });
    
     // Aqui inserta los datos del reporte.
     ReportDataSource rds = new ReportDataSource();
     rds.Name = "dsPrueba";		// Aqui debes colocar el mismo nombre del dataset que creaste en el informe.
     rds.Value = dt;
     ReportViewer1.LocalReport.DataSources.Add(rds);
     ReportViewer1.Visible = true;
     ReportViewer1.ZoomPercent = 100;
    }
    Saludos,
    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    miércoles, 16 de junio de 2010 20:05

Todas las respuestas

  • Te sugiero que añadas un ReportViewer a un formulario y lo configures para mostrar los informes .rdlc que desees. Estos .rdlc son definiciones de informes. Tanto el código para el formulario como la creación inicial del informe los puedes realizar automáticamente con los asistentes de Visual Studio.

    Una vez que tengas un .rdlc, abrelo con un editor y verás que dentro tiene XML. Este XML describe las características del informe que se emite, y puedes manipularlo por código igual que cualquier otro archivo XML si deseas alterar desde tu programa las características del informe.

    Nota: necesitas para esto un Visual Studio Professional por lo menos. En la versión Express (gratuita), si no me equivoco, no se incluye el editor de informes.

     

    miércoles, 16 de junio de 2010 16:30
    Moderador
  • Hola, como dice Alberto, puedes crear un reporte con ReportViewer, al principio es un poco engorroso, pero con el tiempo verás que funciona muy bien, lo primero que deberías hacer es agregar a tu proyecto un archivo de tipo DataSet, en este dataset creas una Tabla y le adicionas las columnas de datos que quieres poner en el informe, esto por  que así es la forma más facil de diseñar tu informe.

    Ahora abres tu informe, le adicionas el dataset al informe, acto seguido le adicionas un control de tipo tabla  y le arrastras los campos que quieras mostrar en la tabla.

    En este informe también puedes crearle parámetros del informe según desees.

    Por último creas un formulario web con un control de report viewer y puedes también crear los diferentes controles que requieras para que el usuario pueda filtrar el informe, basado en estos controles haces tu consulta contra el origen de datos de tu elección y obtienes un dataset, el siguiente paso sería conectar este dataset con el informe con un código parecido a este :

    DataTable dt;
    dt = BindData(idGrado);			// Este método hace la consulta que desees.
    if (dt != null && dt.Rows.Count > 0)
    {
     //provide local report information to viewer
     if (ReportViewer1.LocalReport.DataSources.Count > 0)
      ReportViewer1.LocalReport.DataSources.Clear();
    
     // Aqui asignamos el nombre genérico de la empresa para parametrizar los reportes.
     ReportParameter NombreColegio = new ReportParameter("NombreColegio", Session["NombreColegio"].ToString());
     ReportParameter Logo = new ReportParameter("Logo", "file://" + Server.MapPath(Session["Logo"].ToString()));
     ReportParameter Periodo = new ReportParameter("Periodo", Session["Periodo"].ToString());
     this.ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { NombreColegio, Logo, Periodo });
    
     // Aqui inserta los datos del reporte.
     ReportDataSource rds = new ReportDataSource();
     rds.Name = "dsPrueba";		// Aqui debes colocar el mismo nombre del dataset que creaste en el informe.
     rds.Value = dt;
     ReportViewer1.LocalReport.DataSources.Add(rds);
     ReportViewer1.Visible = true;
     ReportViewer1.ZoomPercent = 100;
    }
    Saludos,
    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    miércoles, 16 de junio de 2010 20:05
  • tengo un report con un subreport, mi problema es que no reconoce el campo del enlace entre ellos

    tengo una clase clInforme:

    Imports System.Net.Mail
    Imports CrystalDecisions.CrystalReports
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Shared
    Imports CrystalDecisions.Windows
    
    Public Class clInformeCrystal
    
      Private Shared loginfo As CrystalDecisions.Shared.ConnectionInfo
    
      Public Shared Pantalla As Boolean = True
      Public Shared Impresora As Boolean = False
      Public Shared Exportar_Email As Boolean = False
      Public Shared CuentaDestinatario_Email As String
      Public Shared Asunto_Email As String
      Public Shared Mensaje_Email As String
      Public Shared Adjunto_Email As String
      Public Shared OutlookExpress_EMail As Boolean = False
      Public Shared Outlook_EMail As Boolean = False
      Public Shared WindowsMail_EMail As Boolean = False
      Public Shared SMTP_Email As Boolean = False
      Public Shared CuentaOrigen_Email As String
      Public Shared ServidorSMTP_Email As String
      Public Shared RutaRpt As String
      Public Shared stillOpen As Boolean
      Public Shared custTitle As String
      Public Shared Formula As String
      Public Shared ConsultaSQL As String
    
        
      Public Shared Sub conectar()
        loginfo = (Nothing)
        loginfo = New CrystalDecisions.Shared.ConnectionInfo
        RutaRpt = Entorno.CaminoReports
      End Sub
    
    
      Private Shared Function logonrpt(ByRef reporte As ReportDocument) As Boolean
        Dim crtableLogoninfos As New TableLogOnInfos
        Dim crtableLogoninfo As New TableLogOnInfo
        Dim crConnectionInfo As New ConnectionInfo
        Dim CrTables As Tables
        Dim CrTable As Table
        If loginfo.ServerName = "" Then
          loginfo.ServerName = reporte.Database.Tables(0).LogOnInfo.ConnectionInfo.ServerName
        Else
          crConnectionInfo = loginfo
        End If
    
        CrTables = reporte.Database.Tables
        For Each CrTable In CrTables
          crtableLogoninfo = CrTable.LogOnInfo
          crtableLogoninfo.ConnectionInfo = crConnectionInfo
          CrTable.ApplyLogOnInfo(crtableLogoninfo)
        Next
      End Function
    
    Public Overloads Shared Sub Imprimir(ByVal nombrereporte As String, ByVal Copias As Integer, ByVal TablaAgrupar() As String, ByVal CamposAgrupar() As String, ByVal TablaOrdenar() As String, ByVal CamposOrdenar() As String, ByVal Modal As Boolean, ByVal ParamArray Par() As String)
        Dim forma As New frmInformeCrystal
        Dim rpt As New ReportDocument
    
        Dim DataSource As System.Data.DataSet
        Dim mRSA As SqlDataAdapter
        Dim CN As clConn
    
        Call Application.DoEvents()
    
        If Copias <= 0 Then
          Copias = 1
        End If
    
        If RutaRpt.Trim.Length = 0 Then
          rpt.Load(nombrereporte, OpenReportMethod.OpenReportByDefault)
        ElseIf Mid(RutaRpt.Trim, RutaRpt.Trim.Length, 1) = "\" Then
          rpt.Load(RutaRpt & nombrereporte, OpenReportMethod.OpenReportByDefault)
        Else
          rpt.Load(RutaRpt & "\" & nombrereporte, OpenReportMethod.OpenReportByTempCopy)
        End If
    
        rpt.Refresh()
        rpt.ReportOptions.EnableSaveDataWithReport = False
    
        Call Application.DoEvents()
    
        If Len(Trim(ConsultaSQL)) <> 0 Then
          CN = New clConn
          mRSA = CN.CrearDataAdapter(ConsultaSQL, CN.Conexion)
          DataSource = New DataSet
          mRSA.Fill(DataSource, "comando")
    
          If DataSource Is Nothing Then
            MsgBox("No hay datos para mostrar", MsgBoxStyle.Information, "Sin datos para este registro")
            Exit Sub
          End If
          rpt.SetDataSource(DataSource)
        End If
    
        Call Application.DoEvents()
    
        Call Parametros(rpt.ParameterFields, Par)
        Call Agrupar(rpt, TablaAgrupar, CamposAgrupar)
        Call Ordenar(rpt, TablaOrdenar, CamposOrdenar)
    
        logonrpt(rpt)
    
        'Configurar aquí cualquier opción de exportación 
    
        Dim opt As New ExportOptions
    
        opt = rpt.ExportOptions
    
        'Configurar aquí cualquier opción de impresión 
    
        Dim prn As PrintOptions
    
        prn = rpt.PrintOptions
    
    
        If Impresora Then
          forma.Dispose()
          forma = Nothing
          rpt.RecordSelectionFormula = Formula
          rpt.PrintToPrinter(Copias, False, 0, 0)
          Exit Sub
        End If
    
        If Pantalla Then
          forma.WindowState = FormWindowState.Maximized
          With forma.InformeCrystal
            .Top = 0
            .Left = 0
            .DisplayBackgroundEdge = False
            .DisplayGroupTree = False
            .DisplayToolbar = True
            .EnableDrillDown = True
            .BorderStyle = BorderStyle.Fixed3D
            .DisplayStatusBar = True
            .ShowCloseButton = True
            .ShowExportButton = True
            .ShowGotoPageButton = True
            .ShowGroupTreeButton = False
            .ShowPageNavigateButtons = True
            .ShowPrintButton = True
            .ShowRefreshButton = True
            .ShowTextSearchButton = True
            .ShowZoomButton = True
            .ReportSource = rpt
            .SelectionFormula = Formula
            forma.Text = custTitle
            If Modal Then
              forma.ShowDialog()
            Else
              forma.Show()
            End If
            Exit Sub
          End With
        End If
    
      End Sub
    
    
      Private Shared Sub Parametros(ByRef ParametrosInforme As ParameterFields, ByVal ParamArray matriz() As String)
    
        Dim c As Long, p1, p2 As String, l As Integer
    
        For c = 0 To matriz.Length - 1
    
          l = InStr(matriz(c), ";")
    
          If l > 0 Then
    
            p1 = Mid(matriz(c), 1, l - 1)
    
            p2 = Mid(matriz(c), l + 1, Len(matriz(c)) - l)
    
    
            Dim dVal As New ParameterDiscreteValue
            dVal.Value = p2
    
            
            ParametrosInforme(p1).CurrentValues.Add(dVal)
    
          End If
        Next
    
      End Sub
    
      Private Shared Sub Ordenar(ByRef Report As ReportDocument, ByVal Tabla() As String, ByVal Campo() As String)
        Dim INDICE_T As Long
        Dim INDICE_I As Long
    
        If Tabla(0) = "" Then
          Exit Sub
        End If
    
        INDICE_T = 0
        For INDICE_I = 0 To Report.DataDefinition.SortFields.Count - 1
          Application.DoEvents()
          If CInt(Report.DataDefinition.SortFields(INDICE_I).SortType) <> 0 Then
            Dim FieldDef As FieldDefinition
            FieldDef = Report.Database.Tables(Tabla(INDICE_T)).Fields(Campo(INDICE_T))
            Report.DataDefinition.SortFields.Item(INDICE_I).Field = FieldDef
            FieldDef.Dispose()
            FieldDef = Nothing
            INDICE_T = INDICE_T + 1
          End If
        Next
      End Sub
    
      Private Shared Sub Agrupar(ByRef Report As ReportDocument, ByVal Tabla() As String, ByVal Campo() As String)
        Dim INDICE_T As Long
        Dim INDICE_I As Long
    
        If Tabla(0) = "" Then
          Exit Sub
        End If
    
        INDICE_T = 0
        For INDICE_I = 0 To Report.DataDefinition.SortFields.Count - 1
          Application.DoEvents()
          If CInt(Report.DataDefinition.SortFields(INDICE_I).SortType) = 0 Then
            Dim FieldDef As FieldDefinition
            FieldDef = Report.Database.Tables(Tabla(INDICE_T)).Fields(Campo(INDICE_T))
            Report.DataDefinition.SortFields.Item(INDICE_I).Field = FieldDef
            FieldDef.Dispose()
            FieldDef = Nothing
            INDICE_T = INDICE_T + 1
          End If
        Next
    
      End Sub
    
    
    
    
    
    End Class
    
    y esta es la llamada desde el formulario para imprimir
    Private Sub btnImprimir_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click
        Dim TablaAgrupar(0) As String
        Dim CamposAgrupar(0) As String
        Dim TablaOrdenar(0) As String
        Dim CamposOrdenar(0) As String
    
        Dim CWHERE As String
    
        Dim FICHERO As String
    
    
        CWHERE = " WHERE codigocontrolpartidas=" & Partida.Codigo
    
        SQL = "SELECT ....."'seleccciono los registros que quiero imprimir es una select larga y con mucho join
        
    	clInformeCrystal.conectar()
    
        clInformeCrystal.ConsultaSQL = SQL 
        clInformeCrystal.Formula = ""
       
    
        FICHERO = "ControlPartida.RPT"
    
    
        TablaOrdenar(0) = "comando"
        CamposOrdenar(0) = "NUMEROPARTIDA" 
        Cursor = Cursors.WaitCursor
    
    
        clInformeCrystal.Pantalla = True
        clInformeCrystal.Impresora = False
    
    
        clInformeCrystal.Imprimir(FICHERO, 1, TablaAgrupar, CamposAgrupar, TablaOrdenar, CamposOrdenar, False, "EMPRESA;" & NombreEmpresa, "calidad;" & mCalidad) ', "sub;" & Partida.Codigo)
    
    
    
        Cursor = Cursors.Default
      End Sub
     

    el subreport se llama granjasPartida  y el parametro de enlace es ?pm-codigocontrolpartida=granjaspartida.partida

    ambos report estan hechos con comando


    Aran
    jueves, 17 de junio de 2010 8:46
  • Muchas gracias por su valioso aporte ahora pasamos con mucha mas experiencia y a realizarlo en Reporting Services. Por favor si alguien conoce sobre la herramienta de Microsoft que permite diseñar correctamente Software agradeceré enormemente.

    1) Necesito dominar Abstract Factory, Singlenton y otras, así  mismo MVC 5

    2) Necesito dominar la herramienta Enterprise Library

    Si tienen algo sobre estos temas por favor un link bastará

    Gracias de antemano

    miércoles, 25 de junio de 2014 23:59