Ayuda con informe en crystal report en C# WPF

georal

Bovino maduro
#1
como les va compañeros del corral...
hoy ando por acá molestándolos un poco :)

verán, he tenido algunos problemas manejando los reportes con crystal report, he probado varias cosas y sigue sin funcionar.
les cuento...

Para comenzar es una aplicación C# WPF sql server 2008 y estoy trabajando con .Net 4.
Para poder utilizar el CrystalReportViewer creo una ventana de tipo Form y sobre ella coloco el CrystalReportViewer.

tengo un data set con dos tablas; DataTable1 y en sus columnas (NombreCuenta y Monto) DataTable2 y en sus columnas (NombreCuenta y Monto)
ahora vengo creo un nuevo reporte y con el asistente elijo el dataSet que voy a utilizar y elijo los datos que se van a mostrar en el reporte (que son los que se encuentran en ambas tablas del DataSet).

Para llenar el reporte utilizo el siguiente código dentro del formulario.

String cadena1 = "select NombreCuenta, Monto from tabla1 where NombreCuenta = xxxx";
String cadena2 = "select NombreCuenta, Monto from tabla1 where NombreCuenta = yyy";

DataSet1 ds = new DataSet1();

sqlDataAdapter da = new sqlDataAdaptar (cadena1, "cadena de conexión");
da.Fill(ds, "DataTable1");
da.SelectCommand.CommandText = cadena2;
da.Fill(ds, "DataTable2");

CrystalReport1 reporte = new CrystalReport1();
reporte.SetDataSource(ds);
crystalReportViewer1.ReportSource = reporte;

pero al final en el reporte no se muestra la información!!

ALGO MÁS
si solo quiero llenar una de las tablas que estan dentro del DataSet por ejemplo el DataTable1,
en el asistente elijo que solo quiero mostrar los datos de esa tabla y el código que utilizo es:


String cadena = "select NombreCuenta, Monto from tabla1 where NombreCuenta = yyy";

DataSet1 ds = new DataSet1();

sqlDataAdapter da = new sqlDataAdaptar (cadena, "cadena de conexión");
da.Fill(ds);

CrystalReport1 reporte = new CrystalReport1();
reporte.SetDataSource(ds);
crystalReportViewer1.ReportSource = reporte;


y todo funciona muy bien!!
los datos se muestran en el reporte!

OTRA COSA
si el primer código lo ejecuto en una aplicación windows form
no me da ningún problema...tiene que ver el hecho de que la ventana de tipo Form este dentro de una aplicación WPF??? si este es el caso como puedo solucionarlo para hacer que mi reporte funcione??

de verdad ya intente varias cosas y sigue sin funcionar...

Espero puedan ayudarme!
y de antemano gracias!!
 

jmvd70

Bovino adicto
#2
Saludos partner

No mencionas la distribución de tu reporte, pero supongo que estás tratando de poner las dos tablas en la misma página en forma de lista o me equivoco ?

Eso normalmente no se puede hacer (dos tablas en la misma página, paralelamente) es algo inusual.

Lo que te recomiendo es:

opción 1: que crees un solo dataset con una sola tabla con cuatro columnas (NombreCuenta1, Monto1, NombreCuenta2 y Monto2) para que los puedas acomodar en forma de lista y la tienes que llenar a mano con las consultas.

opción 2: que la segunda consulta la crees en forma de subreporte si es imperativo que los crees de forma independiente.

Espero te sirva.

Suerte.
 

georal

Bovino maduro
#3
Saludos partner

No mencionas la distribución de tu reporte, pero supongo que estás tratando de poner las dos tablas en la misma página en forma de lista o me equivoco ?

Eso normalmente no se puede hacer (dos tablas en la misma página, paralelamente) es algo inusual.

Lo que te recomiendo es:

opción 1: que crees un solo dataset con una sola tabla con cuatro columnas (NombreCuenta1, Monto1, NombreCuenta2 y Monto2) para que los puedas acomodar en forma de lista y la tienes que llenar a mano con las consultas.

opción 2: que la segunda consulta la crees en forma de subreporte si es imperativo que los crees de forma independiente.

Espero te sirva.

Suerte.

Una consulta para llenar cada columna del DataSet....mmm me parece interesante.. me podrías poner un ejemplo que de lo que mes estas diciendo! te lo agradecería bastante!

Para serte sincero no había escuchado lo de los subreportes! recién comienzo con CrystalReport y no tenia ni idea! Me parece muy interesante, lo voy a probar!

SOLO OTRA COSA
Sí lo quiero poner en forma de lista.
Me mencionaste que normalmente no se puede hacer...
si vuelves a revisar el primer código que escribí, mencioné que si lo pruebo en una aplicación WindowsForm me funciona muy bien..
sin embargo tengo problemas con el código cuando lo uso en una ventana de tipo Form en la aplicación WPF,
los comandos que se utilizan deben cambiar en algo y es eso lo que no he podido encontrar!

si me pudieras ayudar con eso también te lo agradecía bastante!!

Y Gracias por estar respondiendo a mis dudas!! :)
 

jmvd70

Bovino adicto
#4
Para ayudarte mejor, deberías de poner el mensaje o descripción del error que te pone, ya que no es posible que no funcione sin mencionar el porque no funciona.

Cuando es una consulta sencilla, siempre funciona sin problemas.

En el caso de que vayas a poner las cuatro columnas, debes hacerlo así:

0. Creas un dataset nuevo, vacio.
1. Creas una tabla nueva en memoria, vacia.
2. Creas las columnas y las agregas a la tabla
3. Haces tu primer consulta y llenas las primeras dos columnas de tu tabla
4. Haces tu segunda consulta y llenas la tercera y cuarta columna.
5. Agregas la tabla al data set
6. Le pasas ese dataset al reporte

No es difícil pero es un poco laborioso, la verdad tendría que hacerte practicamente el programa y de momento no tengo el tiempo necesario.

La parte del WPF no creo que sea lo que está evitando el funcionamiento.

Si tienes más dudas, lo comentamos.

Suerte.
 

georal

Bovino maduro
#5
Para ayudarte mejor, deberías de poner el mensaje o descripción del error que te pone, ya que no es posible que no funcione sin mencionar el porque no funciona.

Cuando es una consulta sencilla, siempre funciona sin problemas.

En el caso de que vayas a poner las cuatro columnas, debes hacerlo así:

0. Creas un dataset nuevo, vacio.
1. Creas una tabla nueva en memoria, vacia.
2. Creas las columnas y las agregas a la tabla
3. Haces tu primer consulta y llenas las primeras dos columnas de tu tabla
4. Haces tu segunda consulta y llenas la tercera y cuarta columna.
5. Agregas la tabla al data set
6. Le pasas ese dataset al reporte

No es difícil pero es un poco laborioso, la verdad tendría que hacerte practicamente el programa y de momento no tengo el tiempo necesario.

La parte del WPF no creo que sea lo que está evitando el funcionamiento.

Si tienes más dudas, lo comentamos.

Suerte.
Gracias..y pues si parece algo laborioso lo que me estas diciendo pero voy a tratar de averiguar algo al respecto...

Bueno la vdd esque no me tira ningún error o me sale algún tipo de mensaje, cuando ejecuto el programa y me voy a la parte de reporte pues me entra sin ningún problema, me muestra el nombre de las columnas que estoy utilizando pero no me muestra ningún dato.

ésta ultima ves lo hice usando subreportes que fue lo que me habías sugerido, el código que use fue el siguiente (lo pongo tal cual lo estoy usando y te agradecería que me dijeras si lo estoy haciendo de forma correcta)


//DataSet2 tiene por columnas NombreCuenta1 y Monto1
//DataSet3 tiepo por columnas NombreCuenta2 y Monto2

String cadena1 = "select NombreCuenta as NombreCuenta1, Monto as Monto1, NombreTipo from tblCuenta inner join tblTipoCuenta on tblCuenta.idCuenta = tblTipoCuenta.idTipoCuenta where NombreTipo = 'Ventas'";


String cadena2 = "select NombreCuenta as NombreCuenta2, Monto as Monto2, NombreTipo from tblCuenta inner join tblTipoCuenta on tblCuenta.idCuenta = tblTipoCuenta.idTipoCuenta where NombreTipo = 'Activo'";


DataSet2 ds2 = new DataSet2();
DataSet3 ds3 = new DataSet3();


try
{
SqlDataAdapter da2 = new SqlDataAdapter(cadena1, Conexion.conectar);
CrystalReport2 reporte = new CrystalReport2();
da2.Fill(ds2);
reporte.SetDataSource(ds2);
crystalReportViewer1.ReportSource = reporte;
reporte.Refresh();


SqlDataAdapter da3 = new SqlDataAdapter(cadena2, Conexion.conectar);
CrystalReport3 reporte3 = new CrystalReport3();
da3.Fill(ds3);
reporte3.SetDataSource(ds3);
reporte.Subreports[0].SetDataSource(ds3);
crystalReportViewer1.ReportSource = reporte;


}
catch (Exception e)
{
MessageBox.Show(e.Message);
}


y lo único que me aparece es



no importa que código utilice solo muestra el nombre de las columnas
y nada de info :S

ya me desespere!!
sera que mi VS tendrá algún problema!?

GRACIAS POR TU AYUDA!
 

jmvd70

Bovino adicto
#6
Saludos partner

Disculpa la tardanza he tenido algo de chamba.
La verdad tendría que ver cómo está organizado tu proyecto.

Veo que no validas la cantidad de datos que está leyendo el DS.

SqlDataAdapter da2 = new SqlDataAdapter(cadena1, Conexion.conectar);
CrystalReport2 reporte = new CrystalReport2();
da2.Fill(ds2);
if (ds2.tables[0].rows.count<=0)
{
MessageBox.Show("No se encontró información para imprimir !");
}

reporte.SetDataSource(ds2);
crystalReportViewer1.ReportSource = reporte;
reporte.Refresh();


Según mis cálculos debería ser más o menos así:

SqlDataAdapter da2 = new SqlDataAdapter(cadena1, Conexion.conectar);
SqlDataAdapter da3 = new SqlDataAdapter(cadena2, Conexion.conectar);
CrystalReport2 reporte = new CrystalReport2();
da2.Fill(ds2);
da3.Fill(ds3);
if (ds2.tables[0].rows.count<=0)
{
MessageBox.Show("No se encontró información para imprimir !");
}
if (ds3.tables[0].rows.count<=0)
{
MessageBox.Show("No se encontró información para imprimir !");
}


reporte.SetDataSource(ds2);
reporte.Subreports[0].SetDataSource(ds3);

crystalReportViewer1.ReportSource = reporte;
reporte.Refresh();


O como mencionas.
Probar tu proyecto en otro equipo o en otra versión de VS.
 
Arriba