Solución: Revisar la manera en que se envían los datos a los diferentes informes.
El informe1 se llenan con parámetros de campos fórmula que envío desde mi formulario, el informe2 se llena con un DataTable que contiene la información necesaria. ¿Cuál es el error? Que el informe1 no contiene el DataTable del informe2 y por eso no se muestra la información.
Desgraciadamente, el informe1 o el informe principal debe contener TODOS los DataTables de los otros subinformes (por si tengo más de uno), porque del informe principal se envía los datos a los informes secundarios o subreportes. Solo hay que tener un poquito de cuidado al tratar con la información de los diferentes DataTables, sobre todo si los nombres son iguales.
Recomendación: Usar DataTables con nombres diferentes para cada reporte, porque si no se puede caer en inconsistencias.
De allí, el enviar la información a los diferentes reportes y subinformes es de lo más sencillo, como lo indico en el siguiente ejemplo.
Private Sub Cargar_Rep_Sub() 'CrystalReport1 es el informe1 (el principal) Dim rdInforme As New CrystalReport1 'El informe principal solo recibe campos fórmulas rdInforme.DataDefinition.FormulaFields("campo1").Text = Label1.Text rdInforme.DataDefinition.FormulaFields("campo2").Text = Text1.Text 'Anteriormente, en informe1.rpt tuve que añadir el dataTable del informe2.rpt 'Aquí se envía los datos al informe principal rdInforme.SetDataSource(dataTable) 'Asigno el visor al reporte Form1.CrystalReportViewer1.ReportSource = rdInforme End Sub
¿Pero, qué pasa si tengo dos o más dataTables? ¿Cómo envío dos dataTables a un mismo reporte?
Para ello se utiliza un dataSet tipo con los dataTables creados anteriormente, como lo explico en otra sección, la diferencia radica en la forma en que se llenan estas dataTables.
Generalmente, para llenar mis datos que obtengo de diferente lugares (por ejemplo un SP o un select), lo realizo de esta manera.
Try Dim dtTabla as New DataTable adapter.Fill(dtTabla) Catch expSQL As SqlException MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception") Exit Sub End Try
Pero para llenar las tablas del dataSet tipo se realiza así.
Try 'dtTabla es el nombre de la tabla que se encuentra dentro del dataSet tipo adapter.Fill(dataSet1, "dtTabla") Catch expSQL As SqlException MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception") Exit Sub End Try
Luego, para enviar los datos al Crystal Report se asigna el dataSet.
Private Sub Cargar_Reporte() 'CrystalReport1 es el informe1 (el principal) Dim rdInforme As New CrystalReport1 'Aquí se envía los datos al informe principal rdInforme.SetDataSource(dataSet1) 'Asigno el visor al reporte Form1.CrystalReportViewer1.ReportSource = rdInforme End Sub