Introducción
Comúnmente cuando uno confecciona un reporte la información que se usara proviene de una tabla o consulta a una base de datos, pero suele suceder que a veces se necesite información de orígenes distintos, como ser el caso de controles del propio formulario, donde el usuario cargado información.
Este el caso planteado en el articulo, como generar un reporte en Crystal Reprots, pero utilizando información que no se encuentra en una base de datos, sino que esta aun contenida en los controles del formulario, no hay una tabla a la cual se puede vincular el reporte.
Para resolver este problema se hará uso de DataSet Tipados, los cuales no solo brindaran el esquema necesario para definir la estructura de datos que usara el reporte, sino que además será contenedor de los datos que luego se asignaran como origen de datos.
Información Adicional
Como referencia adicional podría mencionar dos excelente artículos que han sido de mucha ayuda, los cuales detallan muy bien como hacer uso de los reportes vinculados a DataSet Tipados, pero en este caso si toman la información mediante una consulta a la db.
Creación de Reportes con Crystal Reports en Visual Studio 2005/2008
Creación del reporte
Uno de los primeros paso consiste en la creación del reporte, para el mismo es necesario definir los datos o mejor dicho el esquema de los mismos, tarea que será responsabilidad del DataSet Tipado.
Es por ello que en el ejemplo podrán ver un archivo de nombre dtCompra.xsd, este es precisamente el DataSet que se usara en el reporte y definirá la estructura de datos del mismo.
En este se han creado manualmente dos DataTable que representan los datos del cliente y los ítems que ha seleccionado en la compra.
Ambas tablas se han creado de forma manual, arrastrando los datatable de la toolbox de la izquierda, y luego agregando sus columnas. Al no existir base de dato alguna, es necesario crear estas de forma manual, no se tiene ayuda del “Solution Explorer” para arrastrar tablas y crearlas dinámicamente, justamente porque no existen.
Una vez creado el esquema de los datos se procede con el reporte, para ello se agrega uno nuevo en el proyecto, en este caso con el nombre de Factura.rpt, y se configuran los datos mediante la opciones del “Field Explorer”, agregando el origen de datos, como muestra la imagen:
Del cuadro de dialogo siguiente se selecciona el DataSet creado en el paso previo:
Por ultimo, el asistente de Crystal permitirá redefinir como se vinculan las tablas, en este caso por representar información a distinto nivel no existe una relación, pero si se desarrollara algún reporte del estilo maestro-detalles, podría existir un vinculo entre las tablas.
Una vez concluidos los pasos para configurar el esquema de datos del reporte, arrastrando los campos al reporte, podría armar un reporte similar a este:
Carga de los datos en el DataSet Tipado
El siguiente paso consiste en volcar la información ingresada por el usuario en los controles al dataset tipado, creando en dtComrpas.xsd
Para esto se codifico un método responsable de esta tarea:
private dtCompra GenerarFactura() { dtCompra facturacion = new dtCompra(); // // Agrego el registro con la info del cliente // dtCompra.DatosClienteRow rowDatosCliente = facturacion.DatosCliente.NewDatosClienteRow(); rowDatosCliente.Nombre = txtNombre.Text; rowDatosCliente.Direccion = txtDireccion.Text; rowDatosCliente.Telefono = txtTelefono.Text; rowDatosCliente.DNI = txtDni.Text; facturacion.DatosCliente.AddDatosClienteRow(rowDatosCliente); // // Itero por cada fila del DataGridView creando el registro // en el DataTabla // foreach (DataGridViewRow row in dgvCompras.Rows) { dtCompra.ComprasRow rowCompra = facturacion.Compras.NewComprasRow(); rowCompra.Descripcion = Convert.ToString(row.Cells["Descripcion"].Value); rowCompra.PrecioUnitario = Convert.ToInt32(row.Cells["PrecioUnitario"].Value); rowCompra.Cantidad = Convert.ToInt32(row.Cells["Cantidad"].Value); facturacion.Compras.AddComprasRow(rowCompra); } return facturacion; }
Este método es fundamental ya que será el encargado de cargar los datos en una instancia del dataset tipado, para ello tomara el contenido de los controles y los agregara como registros en el DataTable que corresponda.
Es de apreciar como opera con el DataGridView, recorriendo cada fila del mismo, tomando los valores de sus celdas y creando nuevos registros en el datatable que representa las Compras.
Visualización del Reporte
Una vez que tenemos los datos cargados en una instancia del DataSet, solo queda asignarlos como origen de datos del reporte.
Para esta operación el reporte será mostrador en un formulario especialmente creado para tal fin.
Pero hay un detalle, los datos han sido creado en un formulario distinto, es por eso usa la técnica por medio del constructor para pasar la información de un formulario a otro. Esto podrá visualizarse en el formulario frmVisorFactura.
public partial class frmVisorFactura : Form { dtCompra _datosreporte; private frmVisorFactura() { InitializeComponent(); } public frmVisorFactura(dtCompra datos): this() { _datosreporte = datos; } private void frmVisorFactura_Load(object sender, EventArgs e) { Factura _factura = new Factura(); _factura.SetDataSource(_datosreporte); crwFactura.ReportSource = _factura; } }
Allí se ha agregado un constructor que acepta como parámetro el dataset que requiere el reporte para visualizarse.
También puede verse como en el evento Load se hace uso de los datos pasados al formulario y como son asignados al DataSource de la instancia del reporte.
Desde el frmCompra (donde el Usuario de la aplicación ingresa los datos), solo basta con invocar al formulario de la siguiente manera:
private void btnReporte_Click(object sender, EventArgs e) { dtCompra datos = GenerarFactura(); frmVisorFactura frm = new frmVisorFactura(datos); frm.Show(); }
En al primer línea se invoca al método que carga la estructura de datos, y en las siguiente se crea la instancia del formulario que contienen el control Crystal Report Viewer, al cual se le pasa en el constructor la información a visualizar.
Hay que remarcar en este punto el porque de todo esta lógica en al comunicación de los formularios. Resulta que uno de ellos es el que contiene la información y el otro es el que permite la visualización, la idea es mantener bien clara la separación de responsabilidades de cada uno, y no tener que acceder desde un formulario a los controles del otro, eso no es correcto, pero si se usa un medio que permita la comunicación, como ser en este caso el dataset tipado ,se puede trabajar en cada formulario de forma transparente y prolija.
[C#]
|
[VB.NET]
|
leandro, no te das una idea de cómo acabás de salvarme la vida!
ResponderEliminarmil gracias!
Gracias viejo, tus aportes son interesantisimos.. muchos de nosotros te debemos, gran parte del conocimiento que aportas.. muchas gracias nuevamente, exitos
ResponderEliminarHola que tal Leandro. una preguntita en la parte en que doy doble clik en un datagridview y me lleva los datos al de compras. me sale este error:Referencia a objeto no establecida como instancia de un objeto, cuando lo ejecuto en la parte de :ISeleccionProducto parent = this.Owner as ISeleccionProducto;
ResponderEliminarparent.AgregarProducto(row);
agradezco tu iluminacion.
hola Gabriel
ResponderEliminarEstas analizando este ejemplo de exportacion de los datos de la grila a Crystal ?
Lo pregunto porque este articulo en no explica sobre la comunicacion entre formularios.
Bien, mas alla de eso, quizas el problema sea presente porque al abrir el formulario en cuestion no estas asignando el parametro owner del metodo Show()
El Show() del formulario tiene un parametro owner que deberia asignar con "this", esto especifica la propiedad Owner que luego usas para castear con la interfaz.
form2.Show(this);
Por supuesto el formulario padre debera implementar ISeleccionProducto, sino el cast con el uso de "as" devolvera un null.
saludos
Soy mas especifico: cuando en el frmproductos das doble click a algun producto, el lo lleva a el frmcompras. yo lo hice igual que vos, pero cuando lo ejecuto y doy doble click en algun producto, me para y me dice que hay ese error.
ResponderEliminarprivate void dgvbusqueda_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
DataGridViewRow row = this.dgvbusqueda.Rows[e.RowIndex];
ISeleccionProducto parent = this.Owner as ISeleccionProducto;
parent.AgregarProducto(row);
this.Close();
}
y me señala la linea parent.AgregarProducto(row);, supuestamente porque en parent es null. pero yo agregue la inerfaz, la llame en la form principal, hice todo como vos lo tenes. mi dgv esta enlazada a una base de datos sql pero los datos los muestra bien.
hola Gabriel
ResponderEliminarLa verdad es bastante raro el problema, si ahs definido la interfaz en el form padre y has pasado el parametro en el Show() para que la propiedad Owner tenga un valor, no tendrias que tener problemas.
Hagamos una cosa envia al mail del contacto el proyecto (en un zip) asi lo reviso, no prometo que sea una respuesta inmediata, pero en cuanto em hago un rato veo porque es que no toma el cast del form a la interfaz.
saludos
Normalmente no soy de los que opina pero tu articulo es super interesante.te doy gracias porque era exxactamente lo que buscaba
ResponderEliminarGracias Leandro, pero me da un ERROR
ResponderEliminarMe he descargado tu ejemplo y me da el siguiente error
Error 1 'Properties' no es un miembro de 'GrillaExportarCrystal'.
C:\[vb.net]GrillaExportarCrystal\GrillaExportarCrystal\ProductosDataSet.Designer.vb
856 47 GrillaExportarCrystal
En esta linea
Me._connection.ConnectionString = Global.GrillaExportarCrystal.Properties.Settings.Default.ProductosConnectionString
No se a que se debe, solo he descomprimido y ejecutado
Tengo la Version VB.NET 2010 y el CR 2010 instalado
GRACIAS
hola Enrique
ResponderEliminarSobre los dataset has probado usar la opcion: imagen
con esta se re-genera el codigo del dataset.
saludos
Leandro, no puedo cargar tu aplicacion, me da ese error
ResponderEliminarAun sigo con mi duda de los subinformes no se como hacerlo
hola Enrique
ResponderEliminarProbe el codigo en VS2010 y obtuve el mismo problema.
Para solucionarlo solo remueve la "Properties" dejando la linea como esta:
Me._connection.ConnectionString = Global.GrillaExportarCrystal.Settings.Default.ProductosConnectionString
saludos
Leandro, te pido por favor que me eches una mano con el tema de los subinformes en Dataset. Indicame paso a paso lo que debo hacer. Te digo lo que yo he hecho
ResponderEliminar1) He creado un Dataset, lo he abierto y manualmente he creado las tablas con sus campos, que coinciden con los que me devuelven las consultas. NO he conectado el Dataset a nada, solo he creado las tablas manualmente
2) No se en que capa de las que tengo, he de crear los dataset
3) No se que referencias he de utilizar
4) No se como asignar al dataset una tabla en concreto, lo que me dijiste NO funciona
Ayudame, por favor, llevo muchos dias atascado con esto y no soy capaz de hacerlo
GRACIAS
hola Enrique
ResponderEliminarCreo que el foro es un mejor lugar para ver este tema, por eso lo seguimos en esta consulta:
Acceder a las tablas de un Dataset
saludos
Q tal Lendro e leido muchos de tus foros y en verdad son muy interesantes..
ResponderEliminarPero tengo una consulta talvez tu me puedes salvar.
Tengo hecho un reporte y en el visor del crysta me debe presentar mas o menos 300 reportes pero solo 15 reportes me toma el estilo que tiene el rpt (letra en negrita, tamaño de letra); a partir del 16 reporte la letra me sale mas grande y distorsionado a pesar que uso la misma plantilla para todos. Ya he revisado en internet pero no e conseguido solucionar este problema.
De antemano Gracias.
Por si acaso te dejo mi mail mario_a20@hotmail.com
hola Mario, que tal
ResponderEliminarCuando dices 300 o 16 haces referencia a reportes, o sea tienes 300 .rpt creados ? o son campos de un mismo reporte ?
Bien por lo pronto una prueba que pdorias ahcer es intercambiar de lugar los campos o reportes poneidno estos 15 que funcioana en ultimo lugar y tomar otroa que no funciona para ver si es un problema de posicionamiento por el cual sucede este defecto
Igual es raro, pero si se trata de 300 campos en un reporte me parece tambien un poco mucho campos, no ahs evaluado en separarlo en mas reportes
saludos
Gracias Leandro por contestar a mi pregunta..
ResponderEliminarTe comento un poco de lo que se trata necesito imprimir de una sola 300 o 400 facturas que se generan al dia.
Genero 1 rpt para cada factura en total son (300 rpt) hasta aqui no hay problema. Estos rpt los cargo en una lista[]y realizo un foreach de la lista y por cada rpt creo un visor(Crystalreportviewer) y lo add al pagina aspx. El problema se presenta cuando muestra el reporte Nº16 desde aqui hasta los 300 pierde el reporte el estilo es decir la letra se hace mas grande se quitan las negritas.
E intentado solucionar el problema pero ya llevo varias semanas y hasta hoy no lo consigo. Por favor tu ayuda.
O si existe alguna otra forma de que se impriman todas las facturas a la vez en el lado del cliente; o talvez como se puede incluir todos los rpt en uno solo; o como generar un archivo pdf que contenga todos los rpt. Porque el objetivo de esto es imprimir todas las facturas a la vez sea como sea. no necesariamente se deben visualizar.
Por cierto utilizo C#2005 y crystal 9
En espera de tus comentarios
Gracias
Saludos
hola Mario
ResponderEliminarPero no necestias hacerlo de esta forma, si quieres enviar 300 hojas de factura, crear el rpt con el template de una, que ocupe toda una hoja, pero luego cuando lances el reporte enviar la informacion de las 300 facturas como registros en el dataset tipado, Crystal solo tomara cada una de las rows del datatable con la info de la factura y generara 300 hojas (una por cada factura) representado el template.
No necesitas hacer un foreach y lanzar 300 rpt para esto, crystal lo haces directo si envias toda la info en el dataset.
Has la prueba, carga 3 facturas en el datatable que esta en el dataset que envias al reporte, y veras como lo genera, pero lanzalo solo una vez.
saludos
Leandro, tienes el codigo para visual 2005 ?
ResponderEliminarhola epicentro
ResponderEliminarEl tema es que no dispongo a mano del VS2005, ademas no seria una simple conversion, ya que hacia atras se debe armar el ejemplo completo, porque la version de Crystal es otra.
Igualmente lo que podrias hacer es abrir la solucion con el VS2008 o 2010 Express, el cual lo descargas libremente:
http://www.microsoft.com/express/Downloads/
y puedes luego inspeccionar el codigo para pasarlo a tu desarrollo. La version Express conviven sin problemas con otras que tengas.
Por ahi no puedas ejecutarlo porque la version Express no cuenta con Crystal, pero si podrias analizar como esta confeccionado.
saludos
Que tal.
ResponderEliminarLlevaba 2 semanas buscando como pasar datos del datagridview al reporte y sin resultados :(
Al fin pude lograrlo gracias a tu aporte. En serio, mil gracias!!! De verdad que me has ayudo bastante.
hola Angelica
ResponderEliminarme alegro que hay resultado util el articulo
saludos
Muchas Gracias Leandro me fue de gran Utilidad...
ResponderEliminarHola Leandro, acabo de empezar a trabajar con Crystal en Visual Studio 2010 y me ha tocado el mayor de los problemas. Te explico mi situacion: tengo que crear un reporte basado en una consulta, pero dicha consulta contiene checkbox en el formulario por lo que los campos que se muestren en el Report varian en cada consulta, el DataSet no es unico por consulta especifica sino que a traves de el sale la consulta segun los parametros que especificamos y los checkbox que marcamos.
ResponderEliminarando perdido a la hora de saber como hacerlo ya que no puedo cargar todos los campos en el Report, solo los necesarios vinculados a una consulta que es recogida por un DataGrid.
Muchas Gracias
hola Nismo
ResponderEliminarSi necesitas aplcias filtros en tu query que varien respecto a la seleccion podrias apcliar el cocnepto de Criteria
como explico aqui
http://social.msdn.microsoft.com/Forums/es/vcses/thread/c50aaa3e-3f92-4c1e-85a2-72259e3605b6
veras que uso en el parametro la comparacion con NULL, esto es para que se anule ese filtro en caso de pasar un DbNull.Value desde codigo
En tu caso podrias pasar el filtro si el check esta marcado, o DbNull.Value en caso de no estarlo, de esta forma lo haces dinamico
saludos
Hola Leandro, he conseguido que me cargue los datos que quiero en la tabla del dataset pero a la hora de mostar el formulario no lo mustra, llega a la parte en la que debaria mostrarlo pero no tira el Crystal, solo el form de Visual. Lo tengo todo tal cual lo has redactado en el tutorial y no salta ningun error ni warning.
ResponderEliminarAlguna posible ayuda??
hola Nismo
ResponderEliminarBueno la verdad puede ser por muchas causas el problema
pero has validado si se carga el datatable con registros ?
o sea si los datatabled e datasert tipado se cargan con registros que el grid mostrara
pon un breakpoint en el codigo y pasa por sobre los nombres de los datatable, para poder inspeccionar su contenido, si los datatable no tienen registro es logico que el reporte no mostrara nada
si tienes filtros definidos en la query prueba de quitarlos para ver si en ese caso si muestra datos el reporte
saludos
Master, Leandro
ResponderEliminarMe sirvio mucho el ejemplo en .net
por favor desde hace un buen tiempo tengo un gran delima con crystal reports el detalle es, tengo una pantalla de reportes campos fechainicial y fechafinal lo que deseo es obtener informacion de tablas mediante parametros de fecha.. por favor te agradeceria mucho tu ayuda con este gran delima...
seria mucho mejor si estamos en contacto por correo, mi correo es rpachas@dm.pe por favor necesito tu ayuda... M4STER :)
Gracias.......
ResponderEliminarGracias.......
ResponderEliminarhola Orlando Raul
ResponderEliminarsi sus tu reporte conectado a un dataset tipados deberia ser tan simple como aplicar los filtro a la query que carga los datos en el dataset
podria aplicar la tecnica que menciono aqui
[ADO.NET] Filtrar rango de fechas
como veras usas parametros en la query y conversores de tipos para adaptar el filtro
saludos
Como hago para meter una grilla en crystal report 9 con visual basic 6 pro.
ResponderEliminarcon lo que tú escribiste ninguna instrucción me funciona.
saludos
edu
hola eedu
ResponderEliminares que lo escrito aqui corresponde a .net (VS2008), o sea no es VB6, por eso no aplica
saludos
Hola capo como te va
ResponderEliminarSabes yo tengo una grilla datagridview que muesta los datos de diferentes consultas y quiero pasarla a un reporte RDLC para despues imprimirlo o guardarlo en pdf o excel
la idea es la misma la que se me ocurre hacer un dataset temporal
los nombres de la columnas de mi datagridview siempre son
COD,DESCRIPCION,FAB,MODELO,SERIE,CLIENTE,CONTRATO,SITIO
no tendras algo parecido para vb2010
hola 000
ResponderEliminarpero el ejmeplo de este articulo aplicaria perfectamente ya sea 2008 o 2010, esto no cambia en nada
quizas no puedas abrir el reporte de Crystal en 2010, pero si usas Reporting entonces no lo necesitas, solo toma la idea de como se pasa los registrod el gris al dataset tipado
y eso es todo, luego asignas este como origen de datos del reporte .rdlc
saludos
Hola Leando, mira acabo de realizar todo lo que muestras, tal cual.Pero no me aparecen los datos en el crystal report, verifique que el dataset estuviera cargado en el form frm_visorfactura colocando un datagridview y cargandole las tablas[0] y luego la[1] del dataset en dicho form y me los muestra sin problemas. Pero al realizar
ResponderEliminarFactura _factura = new Factura();
_factura.SetDataSource(_datosreporte);
crwFactura.ReportSource = _factura;
me arroja el crystal solo con las columnas q especifique en la creacion del reporte, sin ningun dato del dataset. Alguna idea de que pueda ser??
Saludos y Gracias
Increiblemente lo solucione borrando la relacion entre las tablas que antes habia establecido.
ResponderEliminarSaludos
hola es un buen tutorial pero espero me puedas ayudar con una duda que tengo, como le puedo hacer para agregar directamente los datos que ya tengo en mi GridView a el reporte?
ResponderEliminarhola ERNESTOIII
ResponderEliminarlo podrias hacer de la misma forma que se eplcia aqui, solo que en lugar de recorrer las filas del DataGridViewRow, recorrerias las del GridView
foreach(GridViewRow row in GridView1.Rows){
string val1 = row.Cells[0].Text;
.
.
}
y asi con todas las columnas cargando el dataset que definas para el reporte en Crystal
Nota: recuerda que si la columan es del tipo ItemTemplate deberias usar el FindControl()
saludos
Buenas tardes!!
ResponderEliminarHe hecho todo lo que has comentado y al generar mi crystal report no me muestra ningún dato, solamente el rpt vacío... :s tienes idea de que es lo que este pasando?
hola Angie
ResponderEliminarbueno, las causas pueden ser varias
pero estas saundo dataset tipados en el reporte?
si es asi en el codigo cargas una instancia de este mismo dataset tipado
lo pregunto porque puede suceder que si se usa un dataset sin tipo los nombres de las columnas no coincidan por lo tanto no sabra mostrar la informacion
saludos
Buenos dias Leandro la verdad me has salvado casi todo el pescuezo con ésta magnifica solución, solo que al cargar los datos me trae los datos de una de las tablas la misma cantidad de veces que la otra tabla , me explico mas específicamente, si la tabla B trae 7 registros que los carga de una dataGridView la tabla A muestra 10 de sus registros 7 veces, si multiplicamos son 70 datos que muestra lo cual no es lo que buscaba , si podría tener una respuesta me serviría demasiado.
ResponderEliminarDesde ya muchas grax.
hola Nyu
ResponderEliminarpero estas tablas que mencionas son dos datatable diferentes dentro de un mismo Dataset tipado ?
porque quizas lo que falta es establecer la Relation, o sea la relacion este los campos que unen esta tablas
sin relacion y al ponerlo en el reporte seguro aplique un join entre los datos de ambos cruzando todo con todo
tambien prueba de definir secciones que generen cortes de control
o sea la tabla A definelo en una seccion y la tabla B en el detalle, no ambas en el detalle
saludos
Estimado Leandro yo tengo el mismo problema q Nyu, el asunto es que son dos cosas diferentes, no son maestro esclavo, un datset devuelve 5 registros y el otro 12, necesito que se presenten por separado. en espera de tu ayuda urgente. Muchas gracias..
ResponderEliminarhola VERILU
ResponderEliminarvalida si en el DataBase Expert
no se estan relacionado las tablas
imagen
esto puede que crystal lo este creando de form automatica, podrias probar de elimiar la relacion
saludos
Hola Leandro
ResponderEliminarPrimero que todo gracias.
Use tu código para cargar el dataset, pero al momento de pasarlo al crystal report, solo aparece la primera linea del DataGrid.
Una consulta adicional. es posible pasar datos de los textbox del formulario, usando parametros y al mismo tiempo pasar los datos del datagrid?
hola Marx
ResponderEliminarhas validado cuando cargas el dataset que este tenga todos los registros que quieras mostrar ? puedes poner un breakpoint en el codigo he inspeccionar pasando el mouse por sobre la variable del dataset para ver su contenido
ademas recuerda que en el reporte los campos deberias ponerlos en la seccion de detalle
puedes pasar parametros de valores simples a un reporte, pero no entendi que tendria que ver esta accion con un grid
saludos
Hola Leandro que tal de nuevo yo x aka jejeje... Muchas gracias, oye la verdad me costo trabajo interpretar tu codigo o mas bien la aplicación jeje... pero gracias a Dios le entendi al fin con dificultades pero ahi voy... Muchas Gracias amigo eres bueno en lo q haces en verdad, Felicidades... Hasta pronto y Gracias de Nuevo...
ResponderEliminarLeandro, ¿tu código me servirá para implementarlo en ASP? Para crear una factura/boleta como en lo que me pudiste ayudar en el foro de MSDN.
ResponderEliminarPD: Te agregué en facebook, por si tal vez te encuentre conectado y puedas apoyarme si no fuera mucha molestia.
Saludos
hola StevenLlaja
ResponderEliminarla tecnica va mas alla de un ambiente web o winforms, por lo que podrias aplicarla
por supuesto la logica que alli uso para recorrer un datagridview y volcar los datos, eso si no te va a ser util
pero si sabes como recorrer un gridview o algun otro control de asp.net podrias cargar desde codigo el dataset tipado y luego asignarlo al reporte de crystal
saludos
Hola Leandro, en toolbox crystal report document me aparece deshabilitado y no hay manera de agregarlo, alguna solucion? Ya instale y reinstale el soft de la pagina oficial y nada.. Y lo mas raro es que en un codigo que descargo tuyo me aparece, osea que esta instalado pero como hago para que se me habilite, alguna ayuda?
ResponderEliminarhola mauriciohamak
ResponderEliminarque distibucion de VS estas usando? porque recuerda que no puedes suar Crystal con una version Express del VS
saludos
Hola Leandro, tengo un problema y decidi probar tu proyecto. mi problema esta en que yo lo que hago es llenar el grid sin base de datos lo lleno de selecciones de combobox y textbox, pero a la hora de darle generar reporte y me abre la ventana solo me manda los valores que son string veras tengo dos string y dos numericos cantidad y precio
ResponderEliminarlos numericos no los muestra y mi codificacion es esta:
ResponderEliminarDim report As New CrystalReport_Grid
Dim ds As New DataSet
Try
'agregar nueva tabla al dataset
ds.Tables.Add("DataSet_TIPxsd")
'agregar las columnas
Dim col As DataColumn
For Each dgvCol As DataGridViewColumn In DataGridView2.Columns
col = New DataColumn(dgvCol.Name)
ds.Tables("DataSet_TIPxsd").Columns.Add(col)
Next
Dim row As DataRow
Dim colcount As Integer = DataGridView2.Columns.Count - 1
For i As Integer = 0 To DataGridView2.Rows.Count - 1
row = ds.Tables("DataSet_TIPxsd").Rows.Add
For Each column As DataGridViewColumn In DataGridView2.Columns
row.Item(column.Index) = DataGridView2.Rows.Item(i).Cells(column.Index).Value
Next
Next
Catch ex As Exception
MessageBox.Show("Error Converting from DataGridView" & ex.InnerException.ToString, _
"Error Converting from DataGridView", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
report.SetDataSource(ds.Tables(0))
Me.CrystalReportViewer1.ReportSource = report
'Me.DataGridView2.DataSource = ds.Tables(0)
'Form_Reporte_Grid_Compras.Show()
ds.Dispose()
ds = Nothing
el asunto es que necesito mandar esa info del datagrid a crystal para generar un reporte instantaneo de la orden de compra asi el usuario podra guardarlo en formato pdf o imprimirlo, los datos si se guardan en base pero me gustaria que el usuario lo genere en el momento, pues ya genere reportes por lotes de compras pero quedarian solo por registro historico, este reporte que deseo generar es para uso instantaneo.....gracias de antemano
ResponderEliminarhola MIND CORRUPTER
ResponderEliminarel primer punto que validaria es si esl dataset se ha cargado de forma correcta, para eso pon un breakpoint y luego de cargar el dataset usa
DataSet Visualizer
para ver si los datos estan correctos
asegurate que los nombres de las columnas son los mismos que sua el reporte
es mas aconsejaria que uses un dataset tipado, o sea que definas un .xsd como en el articulo y no un dataset sin tipo como el que usas, asi evitaras problemas
saludos
gracias Leandro, repecto al dataset si he creado uno que se llama DataSet_TIPxsd.xsd con los 4 campos en el datatable1 ahora con respecto a tu ejemplo lo he acondiuvionado asi:
ResponderEliminarPrivate Function GenerarFactura() As DataSet_Tipado
Dim facturacion As New DataSet_Tipado()
'
' Itero por cada fila del DataGridView creando el registro
' en el DataTable
'
For Each row As DataGridViewRow In DataGridView2.Rows
Dim rowCompra As DataSet_Tipado.detalleRow = facturacion.detalle.NewdetalleRow()
rowCompra.Material = Convert.ToString(row.Cells("material").Value)
rowCompra._Unidad___Medida = Convert.ToString(row.Cells("unidad_medida").Value)
rowCompra.Cantidad = Convert.ToDecimal(row.Cells("canridad").Value)
rowCompra.Precio = Convert.ToDecimal(row.Cells("precio_item").Value)
facturacion.detalle.AdddetalleRow(rowCompra)
Next
Return facturacion
End Function
y el codigo del boton que genera el reporte seria este segun tu codigo:
ResponderEliminarDim datos As DataSet_Tipado = GenerarFactura()
Dim frm As New Form_Reporte_Grid_Compras(datos)
frm.Show()
pero cuando compilo me marca error en esta fila en donde tu le pasas el argumento datos dentro del parentesis:
Form_Reporte_Grid_Compras(datos)
el error dice "Demasiados argumentos para Public Sub New ()"
cabe destacar que en tu codigo unicamente he cambiado a lo de mi dataset campos despues de eso es tu codificacion integra.....gracias
gracias Leandro ya lo pude hacer funcionar, tu ayuda es muy util para mi de verdad gracias.....es bueno contar contigo...cuidate
ResponderEliminarhola MIND CORRUPTER
ResponderEliminarahh que bien, que bueno que funciono
Hola leandro! fijate que tengo un problema... al momento de generar el reporte me pide id y contraseña para la conexion a la base de datos cuando lo que estoy usando es el data set que cree segun los pasos de tu ejemplo...
ResponderEliminarhola chorchi
ResponderEliminarpero estas conectando el reporte por emdi de un dataset tipado ? proque de ser asi no deberia solicitar autenticacion
has validado si asignas correctamente el datasource?
de casualidad habias conectado el reporte originalmente a la db y despues lo cambiaste ? porque podria haber quedado la conexion previa
saludos
pues segun vi el crystalreportviewer parece ser el problema no estoy muy seguro... porque cuando cargo el formulario con el crv al estar carganado el reporte me da el mensaje de autenticacion... y probe con el dataset tipado y incluso con un dataset de una base de datos que estoy utilizando y en ambos casos pasa lo mismo...
ResponderEliminarhola chorchi
ResponderEliminara modo de prueba crea un reporte crystal de cero, pero conectandolo al dataset tipado desde el comienzo
solo para validar que el haberlo conectado a la db y despues cambiado no dejo algo de la conexion y es esta la que intenta conectarse y pedir autenticacion
saludos
hola de nuevo Leandro!! ya descubri cual era el problema por el cual me pedia autenticacion... al parecer el net framework era lo que causaba el problema... estaba en la version 4 pero al pasarla a la 3.5 me funciono perfectamente... igual gracias por las sugerencias...
ResponderEliminarSaludos Sr. Leandro
ResponderEliminartengo una pregunta sobre este proyecto. es como yo puedo guardar esto en una base de datos ya que aqui hay una relacion de uno a muchos. esto para guardarlo en una tabla y poder consultarlos.
gracias
hola luis de la cruz
ResponderEliminarno entendi
que relacion tiene este articulo en donde no se hace uso de ninguna db, con lo que planteas de una relacion uno a muchos y una db ?
de que db se trata? y que estructura de datos planteas grabar
saludos
Saludos
ResponderEliminarlo que pregunto es como puedo almacenar esto en una base de datos.
!osea! que se ase un pedido de 10 a 15 productos como puedo guardarlos en una base de datos con un id_factura
Gracias
disculpe
ResponderEliminarguardar todos estos procutos y los datos del cliente con el mismo Id_factura
Mil Gracias.
Sr. Leandro Por favor puede publicar ejemplos de crystal reports con subreportes, embebido , incrustado , es que tengo un problema , he hecho un reporte con 3 store procedure y solo m muestra uno los demas nada, apesar que los he vinculado.. se agradeceria bastante gracias
ResponderEliminarMuchas garcias
ResponderEliminarLeandro es muy interesante tu blog.
ResponderEliminarPero necesecito algo de ayuda, ya tengo mi aplicacion creada, me falta la factura, pero el problema es que en el dataGridView de productos selecciono uno y me lo coloca en el otro datagridView, y ahi tengo el problema, quiero q el programa me vaya acumulando los productos y la cantidad de productos selccionados.
Me explico Mejor:
ResponderEliminarejemplo: del dgvProductos seleciono
Martillo, me coloca en el otro datagridview y el campo Cantidad me sale 1, porq solo me han seleccionado un martillo, si selecciono una pala igual hace pero, si selecciono otro martillo como hago para que no me agrege otra fila de martillo sino que en la que ya esta me agrege en el campo Cantidad se me vaya sumando cada vez que agrege otro producto de uno que ya esta seleccionado???
hola eisaac
ResponderEliminarpodrias aplicar una busqueda sobre el segundo datagridview y validar si el articulo que quieres agregar no existe previamente
podrias ayudarte con linq
DataGridViewRow row = DataGridView1.Rows.Cast().FirstOrDefault(x=> Convert.ToInt32(x.Cells["idproducto"].Value) == idprodseelccionado)
if(row == null){
//aqui creas una nueva row porque no existe ese producto
}
else
{
row.Cells["cantidad"].Value = convert.Toint32(row.Cells["cantidad"].Value) + 1;
}
saludos
Hago todo el procedimiento pero al cargar el reporte me sale un pantalla que me pide Id. de sesión y contraseña para acceso a base de datos y no tengo ninguna base de datos.
ResponderEliminarhola Erick
ResponderEliminaro sea estas asignado el reporte a un dataset tipado ?
si es asi te aseguras de asignar correctamente el SetDataSource() para ponerle los datos al repote? porque sino lo haces el reporte intentara tomarlo de algun sitio para conectarse
saludos
Hola Leandro, estoy con un proyecto similar pero estoy usando reportViewer tengo un problemita al usar el dataSet tipado la cosa es que no se bien como llamar al metodo para que me cargue los datos del dataTable al reporte que quiero generar en tu ejemplo seria en el evento load del frmVisorFactu use la misma metodologia de tu ejemplo. Desde ya gracias.
ResponderEliminarhola Augusto
ResponderEliminarla verdad no entendi el planteo
veo que quieres enviar datos a un formularios, pero no quedo claro de dodne los estas tomando
saludos
Los datos del formulario los cargo en una instancia del dataSet hasta ahí me funciona bien, en el formulario donde voy a visualizar el reporte le agrego el constructor que acepta como parámetro el dataset que requiere el reporte para visualizarse.Es problema es que no se como asignarle el dataSet como origen de datos del reporte, recuerdo que estoy usando la herramienta de visual reportViewer no el crystal report. Espero haberme explicado mejor en el planteo del problema. Gracias
ResponderEliminarhola Augusto
ResponderEliminaro sea estas usando Reporting Service, tiene un rdlc
usarias algo como ser:
ReportDataSource dataSourceProductos = new ReportDataSource("Productos_Productos", ObtenerLista());
reportViewer1.LocalReport.DataSources.Add(dataSourceProductos);
[Reporting Service] Campo Imagen desde un DataSet Tipado
http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/9b8160af-c8c1-43c2-831f-228e1488bc1d/
saludos
Hola Leandro si estoy usando Reporting Service sigo sin hacer que visualice el reporte estuve viendo los enlaces que publicaste y efectivamente es como me lo as indicado en mi caso queda
ResponderEliminarReportDataSource dataSourceInforme = new ReportDataSource("dsInformeDiario", _datosReportes);
this.reportViewer1.LocalReport.DataSources.Add(dataSourceInforme);
this.reportViewer1.RefreshReport();
incluso probé poniendo un breakpoint para asegurarme que los datos se cargan en el dataTable y hasta ahí llega sin problemas, tampoco siquiera me visualiza el formato del .rdlc me muestra solo la barra de herramienta del reportViewer pero como si estuviera bloqueada no se si podrá ser un problema de referencia, en uno de los enlaces agrega una referencia el el archivo .config pero esta trabajando sobre una aplicación web en mi caso es una aplicación de escritorio estoy usando VS2010 ultimate Framework,Version=v4.0.
Seguiré probando... desde ya muchas gracias por el tiempo son muy buenos todos tus aportes saludos.
hola Augusto
ResponderEliminaresto en que entorno sucede, se produce cuando ejecutas desde el VS, o se presenta cuando llevas el desarrollo a la pc del usuario ?
saludos
Hola Leandro, se produce cuando lo ejecuto desde el VS aun no lo e probado en la pc del usuario, igual e echo otros reportes con Reporting Service pero sacando datos desde una BD y con eso no e tenido problemas en ninguno de los entornos.
ResponderEliminarhola Augusto
ResponderEliminarpues la verdad no me explico que podra estar sucediendo
-podrias validar si asignas correctamente el rdlc
-o si defines el ReportDataSource, recuerda que el nombre que le pones debe coincidir con el del reporte
-validar que verdaderamente haya datos que asignes
-podrias poner un textbox con un texto fijo en el rdlc y cargarlo, aunque no hay datos este deberia verse
saludos
Hola Leandro, el problema esta en que no encuentra la ruta del .rdlc e estado probando con la propiedad ReportPath para asignarle la ruta del .rdlc pero lamentablemente sin éxito. Te consulto hay otra manera de asignar los datos al reporte sin usar ReportDataSource? o como podría asignar correctamente la ruta del reporte tal vez ahí me este equivocando probé de varias formas que estuve buscando pero ninguna resulto. Gracias saludos.
ResponderEliminarhola Augusto
ResponderEliminarpor lo que comentas estas usando Reporting Service, no?
lo pregunto porque este articulo trata sobre Crystal Reports, con lo cual el reporte deberia ser un .rpt, no un .rdlc
porque es que no puede resolver la ruta del reporte? has probado la ruta completa de forma fija para ver si la toma
o sino podrias configurarla en el app.config para tomarla desde alli
saludos
Hola Leandro,si uso Reporting Service ahí lo configure desde app.config y me funciono muchas gracias! Saludos.
ResponderEliminarHola leandro tengo una pregunta y ya he visto algunos ejemplos pero no logro conseguir lo que quiero hacer te explico
ResponderEliminarquiero hacer un reporte de un solo registro de una bd con un formulario busco el nombre y cargar los datos en el datagrid y verlos en un reporte de crystal reports
Ya puedo generar reportes con la informacion completa que tengo en las tablas pero lo que no he podido es hacer que solo se vea el regristo que elijo
Me podrias orientar con eso te lo agradecere enormemente
Saludos
Jocelyn F
hola Jocelyn
ResponderEliminarsi unes el reporte a un dataset tipada podrias cargar en este un unico registro y luego usar los campos en una seccion que no sea el Details, podrias crear una seccion propia o usar el header para poner los campos alli
de esta forma podrias diseñar un reporte que muestree un unico item
imagino la query a la db para recuperar ese registro sabes hacerlo
saludos
el dataset ya lo tengo realizado
ResponderEliminary para obtener el registro tengo un botón buscar con el sig código
Dim buscar As String = ("Select * from EvaluacionEmp where Nombre_empleado = '" & solicitante.Text & "'")
Dim comando As New OleDb.OleDbCommand(buscar, conexion)
Dim adapter As OleDbDataReader = comando.ExecuteReader
DataGridView1.DataSource = RepCalMo
conexion.Close()
Algo estoy haciendo mal, serias tan amable de darme un ejemplo de como hacerlo
Gracias por tu atención y pronta respuesta
Saludos
Jocelyn
hola Jocelyn
ResponderEliminarlo que veo es que estas filtrando por el nombre, lo cual no veo que usar el = este correcto, deberias usar el LIKE
ademas de usan parametros y un datatable
Dim buscar As String = "Select * from EvaluacionEmp where Nombre_empleado LIKE '%' + @filtro + '%'"
Dim comando As New OleDb.OleDbCommand(buscar, conexion)
comando.Parameters.AddwithValue("@filtro", solicitante.Text)
Dim da As OleDbDataAdapter(comando)
Dim dt As New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt
saludos
Hola Leandro
ResponderEliminarMuchas gracias por tu pronta respuesta
Me ha servido a la perfección tu respuesta
Pero en el reporte no me hace el filtro me salen los registros que tengo el bd ahora solo tengo 2 por las pruebas y los dos me salen
el código que tengo en formulario donde tengo el cristal report viwer es el sig si me puedes orientar haber en que parte estoy mal supongo que es en la consulta es que soy algo nueva en esto
Private Sub ImpEvalua_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim sqlConn As OleDb.OleDbConnection
Dim clAA As OleDb.OleDbDataAdapter
Dim dsdat As New Rep_califMO
Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BDTorsa.accdb"
Dim StrCommCAA As String = "SELECT * FROM EvaluacionEmp"
Try
'Crear los DataAdapters
sqlConn = New OleDb.OleDbConnection(strConn)
clAA = New OleDb.OleDbDataAdapter(StrCommCAA, sqlConn)
'Poblar las tablas del dataset desde los dataAdaperts
clAA.Fill(dsdat, "EvaluacionEmp")
'Poblar el informe con el dataSet y mostrarlo
Dim info As New CalifManobra
info.SetDataSource(dsdat)
CrystalReportViewer1.ReportSource = info
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
Te agradezco que te tomes la molestia en responder gracia
Saludos Jocelyn F
hola Jocelyn
ResponderEliminarpero si en la tabla tienes dos registros es logico que en el reporte mostrara los dos, ya que la query no tiene ningun filtro, defines la tabla completa
sino deberias poner algun filtro
SELECT * FROM EvaluacionEmp WHERE campo = @param
si filtras en la query se mostrara lo que definas en el parametro
saludos
Hola Leandro
ResponderEliminarGracias por tu respuesta y disculpa mi ignorancia pero no se muy bien lo de los parámetros me podrias explicar como aplicarlo
Gracias
Saludos
hola Jocelyn
ResponderEliminarpero a que parametros haces referencia, a los de la query sql o a los que asignas directo al reporte ?
o sea estas exportando los datos directo del control al reporte, no veo que parametros necesitarias
saludos
Hola Leandro
ResponderEliminarPerdon me confundi era el filtro que me decias que hiciera en la consulta del reporte
Es algo asi como lo que me explicaste en el query de la búsqueda??
Muchas gracias por tu ayuda
hola Jocelyn
ResponderEliminarADO.NET - Parte 1 - Recuperar Información Sql Server
analiza el titulo: "Recuperar un solo registro (DataReader)"
asi es como desde codigo defines un parametro
saludos
hola Leandro
ResponderEliminarDisculpa que te de tanta lata pero de verdad no entendí muy bien hice una prueba ya que mi bd es de Access pero no me trae ningún registro ahora
esto es lo que puse algo me hace falta
Dim sqlConn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\BDTorsa.accdb")
Dim dsdat As New Rep_califMO
sqlConn.Open()
Try
Dim consulta As String = ("SELECT * FROM EvaluacionEmp where Nombre_empleado")
Dim comando As New OleDb.OleDbCommand(consulta, sqlConn)
Dim DR As OleDbDataReader = comando.ExecuteReader
Dim info As New CalifManobra
info.SetDataSource(dsdat)
CrystalReportViewer1.ReportSource = info
DR.Close()
sqlConn.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
gracias y disculpa por tanta molestia
saludos
hola Jocelyn
ResponderEliminarno trae nada porque te falta todo el proceso de conversion del reader en una List
se supone que debes pasar una coleccion como dato al reporte
deberias hacer un while(reader.Read())
para recorer todos los registros del reader y convertirlos a una lista del tipo CalifManobra
esa lista es la que asignarias al reporte
saludos
Hola Leandro
ResponderEliminarGracias por tu respuesta pero sigo perdida con lo que me comentas hice algo asi
Dim consulta As String = ("SELECT * FROM EvaluacionEmp where Nombre_empleado")
Dim comando As New OleDb.OleDbCommand(consulta, sqlConn)
sqlConn.Open()
Dim DR As OleDbDataReader = comando.ExecuteReader
While DR.Read()
Console.WriteLine(vbTab & DR.GetInt32(2))
End While
Pero aun asi no me da ningún resultado seria mucha molestia si me lo explicas con un ejemplo
Y disculpa por la molestia
Saludos Jocelyn F
hola Jocelyn
ResponderEliminarsi pones un breakpoint en el codigo, puedes validar que no ingresa al While ?
porque si es asi entonces quiere decir que la tabla no tiene registros que recorrer
valida que el connection string esta apuntando al archivo de db correcto
saludos
Tengo problemas al generar el reporte de crystal report en un nuevo webforms. Segui el tutorial del sitio http://ltuttini.blogspot.com.ar/2010/05/crystal-reports-exportar-datagridview.html
ResponderEliminarya pude crear los dataset tipados y los datos obtenerlos del gridview y grabar a los dataset
private CargaSalidas GenerarSalida()
{
CargaSalidas salidas = new CargaSalidas();
foreach (GridViewRow row in GridView1.Rows)
{
CargaSalidas.TablaSalidasRow rowSalida = salidas.TablaSalidas.NewTablaSalidasRow();
rowSalida.Codigo = row.Cells[0].Text;
rowSalida.Cantidad = System.Convert.ToInt32(row.Cells[1].Text);
rowSalida.Unidad = row.Cells[2].Text;
rowSalida.Detalle = row.Cells[3].Text;
rowSalida.Funcionario_Solicitante = row.Cells[4].Text;
salidas.TablaSalidas.AddTablaSalidasRow(rowSalida);
}
return salidas;
}
protected void Button1_Click(object sender, EventArgs e)
{
CargaSalidas datos= GenerarSalida();
MuestraReporte frm = new MuestraReporte(datos);
frm.show(); // aca no aparace el metodo show()
}
El webform a mostrar es:
public partial class MuestraReporte : System.Web.UI.Page
{
CargaSalidas _datosreporte;
private MuestraReporte()
{
InitializeComponent(); // aca no puedo ver esta función, que using utiliza o como se lo genera?
}
public MuestraReporte(CargaSalidas datos)
: this()
{
_datosreporte = datos;
}
protected void Page_Load(object sender, EventArgs e)
{
ReporteSolicitudSalidas _salidas = new ReporteSolicitudSalidas();
_salidas.SetDataSource(_datosreporte); // aca no puedo agregar la fuente del reporte (ReportSource ) en el ejemplo es crwFactura.ReportSource = _factura;
}
}
en la misma página puedo generar el reporte, el problema es que no puedo enviar los datos del gridview a crystal report mediante una nueva pagina (WebForm)
Gracias por la ayuda y colaboración
juan pablo cruz
hola Juan Pablo
ResponderEliminarpara pasar los datos de un form a otro vas a tener que utilizar el objeto Session
entonces asignas el dataset al session para asi recuperarlo en la otra pagina
saludos
Muchas gracias Leandro tango una aplicación que carga los datos primero en caja de textos para luego pasarlas a datagridview y luego de ello aplico las ideas expuesta su excelente ejemplo para observarlas en un report pero me genera este error
ResponderEliminarColumn named Codigo cannot be found. Parameter name: columnName
lo cual me tiene desconsertado.
Agradezco tu ayuda.
hola Abner
ResponderEliminarlo que habria que determinar es a que columna hace referencia, si a la del datagridview o a la del datatable
puedes validar que en ambos tengas una columna con este nombre ?
podrias poner un breakpoint en la linea donde usas esta columna y validar si el nombre que intentas utilizar es valido
saludos
Gracias Leandro. Lo resolví estableciendo el nombre de cada columna mediante código al datagridview y luego agregando a datatable cada columna con el respectivo nombre del datagridview después se hace un recorrido para cargarlo en el Crystal Reports. Listo. Ahora lo que necesito es que a la hora de imprimir en la impresora de Tikets sea continuo y se dentega donde termina última las línea.
ResponderEliminarhola Abner
ResponderEliminarhasta donde use siempre Crystal este defin paginas para el reporte, hacerlo continuo la verdad nunca lo he intentado
yo creo que para eso deberias haber usado el PrintDocument y GDI para enviar a impresora el diseño del ticket
saludos
Hola Leandro.
ResponderEliminarEstuve programando la idea de imprimir con printDocument pero los datos del datagridview pierden el formato a la hora de imprimir y la factura no le gusta a los clientes. Un Ejemplo de ello:
Codi Prod. Preci. Cant. Subto.
2 Tarjeta 10000 2 20000
6 Disco Duro 30000 1 30000
8 KBR3 150 2 300
Saludos.
hola Abner
ResponderEliminarpero si usas el printdocument deberias espaciar los valores, quizas aplicando la tecnica que planteo aqui
http://social.msdn.microsoft.com/Forums/en-US/17d91435-2a2a-46ff-b978-62d0d1ed4dc8/alinear-texto
saludos
Hola Leandro
ResponderEliminarBuena idea expuesta en el Link, estoy probando contar el contenido de las celda para de ahi asignar una variable que permite por medio de la funciòn space(), establecer un formato para la impresión. La duda es que funcion debo usar para contar el contenido de las celdas.
Saludos Abner
hola Abner
ResponderEliminara que llamas contar ? es quizas una sumatoria
porque crystal tiene opciones para crear campos de este tipo, solo que debes definirlo en diferente secciones, por ejemplo en el detalle pones en campo con los valores y en otra seccion el campo sumatoria para que agrupe y sume lo del nivel anterior
si haces boton derecho sobre el cmapo en las opciones del menu desplegable estaria esa opcion de sumatoria
saludos
Buenas tardes leandro segui tu manual y cree esta linea
ResponderEliminarPrivate Function GenerarReporte() As imp_not_cert
Dim datos As New imp_not_cert()
Dim rowslaumnos As imp_not_cert.alumnos_matriculadosRow = GenerarReporte.alumnos_matriculados.Newalumnos_matriculadosRow
rowslaumnos.nombre = txtnombrealum.Text
rowslaumnos.apellido = txtapellido.Text
rowslaumnos.matricula = txtcedula.Text
rowslaumnos.lugarnac = txtlugnac.Text
rowslaumnos.fechanac = txtfechanac.Text
rowslaumnos.edo = txtedo.Text
datos.alumnos_matriculados.Addalumnos_matriculadosRow(rowslaumnos)
Return GenerarReporte
End Function
y me sale el siguiente error :Referencia a objeto no establecida como instancia de un objeto.
Gracias!!!
ResponderEliminarHola Leandro, espero puedas ayudarme, tengo creado mi reporte con el asistente y obtengo parametros a traves de un procedimiento almacenado, pero cuando inserto datos en el textBox solo me muestra con los parametros del ultimo reporte que cargue en visual en el diseñador de reportes en la vista grafica. si meto otro parametro me dice que no se pudo conectar a la base de datos. Ayuda
ResponderEliminarhola ITSSMT
ResponderEliminarpero los reportes que creas no los asignas a un CrystalReportViewer que ubicas en el form ?
porque en el control viewer pude cambiar de reporte mediante codigo, al hacerlo debes volver asignar los parametros ya que creas un ReportDocument nuevo para cargar el nuevo reporte que estas instanciando
saludos
hola leandro, tengo una pregunta.. al intentar cargar el crystalreport solo me abre el formulario en donde se encuentra pero no carga datos en el reporte.. yo cargo mis datos manualmente con textbox en un datagrid y se supone que se carga ese datagrid en el dataset y luego se muestra en el reporte pero no ocurre nada.. que puedo hacer??
ResponderEliminarhola sheccid
ResponderEliminarinspeccionaste el dataset que cargas con los datos del grid para estas bien seguro que los datos estan alli contenidos?
define un breakpoint en la linea donde asignas el datasource de crystal y usa la opcion
DataSet Visualizer
para inspeccionar el dataset y ver si hay datos que asignas al reporte
saludos
Hola Leandro.
ResponderEliminarUna vez mas tu ayuda me salvo, implemente tu codigo adaptandolo a mi sistema y realmente muestra el reporte, pero solo un detalle, al tratar de crear un reporte de una factura con un mas de 1 detalle , ya sean 2 o 3 solo me muestra el primero. sabes que debo hacer para poder mostrar todo lo del datagried?.. al recorrer en foreach debería guardarmelo en facturacion.Compras.AddComprasRow(rowCompra); cada vez que lo recorre
Atento a tus comentarios!
Leandro como se hace el breakpoint del dataset? ya intente cargarlo en un datagrid y no funciona..
ResponderEliminarhola sheccid
ResponderEliminarimagino en algun lugar realizas el Fill() del dataset, no?
bueno en la linea siguiente al fill es que pondrias el breakpoint
pero me pregunto sabes lo que es un breakpoint ? conoces como definirlo
saludos
Leandro, no se si el problema sea en que el datagrid lo hago de esta forma: dataGridView1.Rows.Add(textBox1.Text,textBox2.Text,textBox3.Text,textBox4.Text);
ResponderEliminary no desde la base de datos, y posteriormente cargo en el dataset haciendo lo de tu ejemplo.. no uso un "Fill" ya que no cargo dataset de base de datos.. no se si me explique y me puedas ayudar..
hola sheccid
ResponderEliminarbien, entonces como recorrer los items del grid para volcarlos al dataset que asignarias al reporte ?
porque quizas el problema este cuando recorres el grid para tomar los datos que mostraras al reporte, luego de hacer esto podrias poner un breakpoint he inspeccionar cuantos rows cargaste en ese dataset
saludos
buenos días tengo una duda es que quiero hacer un reporte en crystal reports de visto tu tutorial y me salta una duda de como podre hacer para mostrar el mismo registro n veces en el reporte de crystal reports
ResponderEliminarejemplo tengo lo siguiente la tabla suscriptores
en la cual tengo
los datos del siguiente suscriptor
HÉCTOR MANUEL RODRÍGUEZ
DIRECCION C.PEDREGAL
COL. LA MERCED II
FECHA DE INICIO: 14/05/2012
FECHA DE TERMINACIÓN: 14/10/2012
N° DE EJEMPLARES: 3
REPERTIRLO 3 EN CRYSTAL REPORTS
holsa KEKO
ResponderEliminarcual es el origen de datos del reporte ? es un dataset una coleccion o conectas el reporte directo a la db
si es un dataset podrias desde codigo generar los datos, insetando 3 rows iguales, esas rows generaran items en el reporte identicos
saludos
ok de hecho lo tengo conectado directamente a la base de datos pero en estos momentos estoy checando informacion de como hacerlo con un dataset tipado de antemanoa hagradeceria si me pudieras decir masomenos como creo esos items para generar los renglones iguales
ResponderEliminarhola KEKO
ResponderEliminaren este mismo articulo realizo la creacion de datos desde codigo para crear rows en el dataset tipado que asignare el reporte
habias analizado el codigo este mismo articulo ?
saludos
fíjate que si leei lo que viene en tu blog y descargue el archivo de csharp pero no lo puedo ver en el visual studio 2010 estoy viendo la posibilidad de descargar el visual studio 2008 para checarlo bien gracias por el aporte
ResponderEliminarhola KEKO
ResponderEliminarpero al abrirlo en VS2010, no te lo convierte
tienes instalado la version de Crystal que se integra con VS2010?
igualmente lo que consultabas esta alli en el articulo no necesitas ver el codigo
en el codigo que puse en este articulo muestro como recorrer un grid y volcar los datos al dataset tipado, no necesitas ver el codigo del VS
saludos
si es lo que estaba viendo y también estaba checando como hacer la conexión del data set con la base de datos pero me percatado que mas bien la conexión la haces directamente con los controles es decir del datagrid lo envías directamente al dataset tipado y luego al reporte
ResponderEliminarmira lo que quiero hacer es lo siguiente tengo una base de datos en sql server 2008 con tres tablas
que son
Suscriptores(id_sub, nombre,apellido paterno, apellido materno, dirección, colonia,c.p., ciudad,estado,teléfono,fecha inicial, fecha de finalización, numero de ejemplares,pub_id, rep_id)
publicaciones(pub_id,nombre,descripcion)
repartidores(rep_id, nombre(s), apeido paterno,apellido materno,ruta)
de los cueles quiero mandar en crystal reports solo los datos que que están en negrita
pero quiero que cierta información se repita en el reporte,es decir en la base de datos viene un campo que dice numero de ejemplares según el numero que contenga ese campo se debe de repetir tal renglón mi duda es si hago el data set tipado tengo que conectar tanto la base de datos al data set como al reporte o cargo directamente los datos des de los controles del datagrid y lo demás
Hola de antemano, gracias, bueno tengo un problema cuando paso por esta linea
ResponderEliminar_factura.SetDataSource(datosreporte);
resulta que me dice: No se encuentra el informe en los recursos de manifiesto. Genere el proyecto y vuelva a intentarlo.
:( no se lo que pueda pasar pero, miro y creo que no me esta llenando los datos
hola gabriel
ResponderEliminarla verdad un error bastante raro
en la solucion tienes creado el .rpt?
es raro que te mencione el manifiesto
esto sucede cuando ejecutas desde el VS, o cuando lo haces desde el .exe ?
saludos
Ese Problema se Presenta porque importo o remplazo el archivo sin abrirlo por el diseñador, debe abrirlo y guardar cambios como si hubiese realizado alguna modificación y listo.
Eliminarhola espero y me puedas ayudar, ¿como le hago para que los registros que yo selecciono de un datagridview se visulicen en un crystal report?
ResponderEliminarhola Luis
ResponderEliminarpodrias aplicar la misma tecnica de este articulo, solo que al recorrer los registros pondrias un if que valide si la columna del checkbox esta seleccionado
si lo esta pones ese valor en el datatable para llevarlo al reporte
para validar usarios
if(Convert.ToBoolean(row.Cells["nombrecol"].Value)){
//aqui pones el valor en el dt
}
con esto validas si esta marcado el check para esa columna
saludos
perdon por la insitencia te pongo el codigo haber si lo entiendes:
ResponderEliminarTODA ESTE CODIGO ES DEL BOTON IMPRIMIR
Private Sub btnimprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnimprimir.Click
Try
For Each row As DataGridViewRow In dgdatos1.Rows
Dim marcado As Boolean = Convert.ToBoolean(row.Cells("Imprimir").Value)
If marcado Then
Dim onekey As Integer = Convert.ToInt32(row.Cells("id_entrada").Value)
Dim vdb As New datos
Dim func As New procedimientos
vdb._id = onekey
If func.imprimir(vdb) Then
Else
MessageBox.Show("No se puede imprimir los registros", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Y ESTE OTRO CODIGO ES DE UNA FUNCION QUE HE CREADO A PARTE
Try
conectado()
cmd = New SqlCommand("imprimir_registro")
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = conexion
cmd.Parameters.Add("@id_entrada", SqlDbType.NVarChar, 50).Value = dts._id
If cmd.ExecuteNonQuery Then
Dim rpt As New pruebareporte
Dim formulario As New reportep1
Dim dt As New DataTable
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
rpt.SetDataSource(dt)
formulario.CrystalReportViewer1.ReportSource = rpt
formulario.CrystalReportViewer1.Dock = DockStyle.Fill
Dim frmreporte As New Form
With frmreporte
.Controls.Add(formulario.CrystalReportViewer1)
.Text = "REPORTE DEL DIA"
.WindowState = FormWindowState.Maximized
.ShowDialog()
End With
Return True
Else
Return False
End If
Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try
End Function
EL PROBLEMA ES QUE SI SELECCIONA LOS REGISTROS QUE QUIERO QUE IMPRIMA PERO LOS HACE UNO POR UNO, Y LO QUE YO QUIERO ES QUE APAREAZCAN EN UNA SOLA HOJA PARA IMPRIMIR
hola Luis
ResponderEliminarpues la verdad no me queda nada claro porque por cada row que recorres ejecutas un procedure
para que un ExecuteNonQuery(), la verdad no entiendo cual es el objetivo
carga un dataset en memoria con los datos y asigna este al reporte, no conectes el repote directo a la db, no lo necesitas
si requieres datos adicionales a lo sumo realiza un SELECT
saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarPrivate Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
ResponderEliminarTry
If txtbuscar.Text <> "" Then
buscar = "select * from Entrada_correspondencia where fecha_recepcion='" & Me.txtbuscar.Text & "'"
adapter = New SqlClient.SqlDataAdapter(buscar, conectarme)
adapter.Fill(dataset, "Entrada_correspondencia")
Me.dgdatos3.DataSource = dataset
Me.dgdatos3.DataMember = "Entrada_correspondencia"
dgdatos3.Columns.Item("Imprimir").Visible = False
'btnimprimir.Enabled = True
btnbuscar.Enabled = False
Else
MessageBox.Show("Debes ingresar la fecha a buscar", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
End Try
End Sub
Private Sub btnimprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnimprimir.Click
Try
Dim rpt As New pruebareporte
Dim formulario As New reportep1
dat.Clear()
buscar = "select * from Entrada_correspondencia where fecha_recepcion='" & Me.txtbuscar.Text & "'"
adapter = New SqlClient.SqlDataAdapter(buscar, conectarme)
adapter.Fill(dat, "Entrada_correspondencia")
rpt.SetDataSource(dat)
formulario.CrystalReportViewer1.ReportSource = rpt
formulario.CrystalReportViewer1.Dock = DockStyle.Fill
Dim frmreporte As New Form
With frmreporte
.Controls.Add(formulario.CrystalReportViewer1)
.Text = "REPORTE DEL DIA"
.WindowState = FormWindowState.Maximized
.ShowDialog()
End With
Catch ex As Exception
conectarme.Close()
End Try
btnbuscar.Enabled = False
btnbuscar.Enabled = True
btnimprimir.Enabled = False
limpiar()
bueno a partir de este codigo como haria la seleccion de los resgistros que quiero imprimir, de casualidad tendras un correo electronico, el mio es oz240789@gmail.com
hola leandro muchas gracias por el tutorial le he implementado en mi proyecto pero cada vez que quiero que me aparesca en el reportviewer me pideo una clave y usuario del dataset porfavor me prodrias ayudaqr
ResponderEliminarHola Leandro, tengo una gran duda;
ResponderEliminarcomo hago para que al hacer clic en una fila de datagrid de vb.net me abra la informacion de la fila en un crystal report.......gracias de antemano
hola
ResponderEliminarlogre llevar el un data grid a un reporte con existo, pero cuanto trato de llevar 3 grid a un reporte de la misma manera no me funciona.
hice un data table por cada grid pero el primero se me repiten los valores al igual que el 2 pero el tercer datatable sale con los catos correctos.
Cual sera el problema
hola Francisco
ResponderEliminarque seria exactamente que se repiten los valores ?
estas teniendo en cuenta de crear una nueva instancia de los datatable cuando cambias de grid, porque si usas la misma instancia es logico que seguira agregando alli mismo
tambien deberias agregar esos 3 datatable a un unico dataset para asignarlo al reporte
saludos
resubi las imagenes y links caidos por favor!, muy util el aporte y aun 5 años despues tiene toda la validez!
ResponderEliminarhola Juan
ResponderEliminarya se encuentra actualizado el articulo
saludos
Hola Leandro una consulta, estoy haciendo un Reporte con un ReportViewer creo un DataSet sin conexion asi como tu ejemplo añadiendo los campos, creo el ReportViewer pero en el reporte no me aparece la opcion de "Field Explore" por ningun lado busque en la opcion otros y tampoco, tambien al momento de llamar a mi reporte ejemplo:
ResponderEliminarDim reporte As New ReporteEntrada(este es mi .rdlc)
me sale error "El tipo ReporteEntrada no esta definido" que es lo que puedo hacer? ya que quiero llevar esa aplicacion a otra PC por eso no hago la conexion con el asistente, me podrias ayudar? gracias =)
hola Luis
ResponderEliminarpero un rdlc no es un reporte de Crystal, es Reporting Service lo que estas utilizando, este articulo no aplica de la misma forma
[Reporting Service] Campo Imagen desde un DataSet Tipado
saludos
hola Leandro, Dios le benidga quisiera conversar con usted para saber si en mi proyecto puedo usar el diseño suyo?, muchas gracias por responder
ResponderEliminarhola marcosandy
ResponderEliminarclaro por supuesto, todo lo que este en el blog puede usarlo sin problemas
saludos
tuttini por favor no se puedes ayudarme hacer reportes con crystal report y postgre en c# aunque sea un ejemplo básico pero la verdad es que no hay como hacerlo =/
ResponderEliminarhola Michael
ResponderEliminarPero si sabes como usar ado.net para conectarte a postgre ya tendria el asunto resuelto
El el reporte lo generas a partir de un dataset tipado, esa parte no se se modifica
Define un dataset tipado el cual cargas usando ado.net con el provider de postgre, cuando tengas eso solo lo asignas como origen de datos del reporte
saludos
Buenas tardes tengo un problema con una propiedad que me marca que no existe. Descrgue el archivo que esta en one drive, y al cargar el sln normal me marca que tiene 24 errores, lo abro desde visual y convierto los archivos debido a que esta en VB 2010 y tengo el 2012 al terminar de hacer la importacion me dice:
ResponderEliminarGrillaExportarCrystal.sln: Visual Studio debe realizar cambios no funcionales en este proyecto para poder abrirlo en esta versión y en Visual Studio 2010 SP1 sin afectar al comportamiento del proyecto.
Abre el proyecto y solo me marca este error:
'Properties' no es un miembro de 'GrillaExportarCrystal'.
Es el unico error que me marca y me dice el autocorrecto que no esta declarado la clase pero, no se donde declararla o que dll me hace falta.
Gracias, me esta siendo de mucha ayuda esta pagina
se me olvidaba, esta es la linea que me marca error
EliminarMe._connection.ConnectionString = Global.GrillaExportarCrystal.Properties.Settings.Default.ProductosConnectionString
que se encuentra dentro de productosDataSet.xsd linea 856 la parte que me marca subrayado de error es
GrillaExportarCrystal.Properties
Gracias nuevamente
hola
Eliminarrecuerda que Crystal reportes desde la version VS2010 no esta integrado, sino que se instala por separado
La pregunta seria, instalaste crystal al VS2010 ?
Respecto a las Properties revisa las propiedades del proyecto, hay una solapa "Settings"
imagen
es alli donde deberia definirse ProductosConnectionString, valida que este definido
saludos
Hola buen dia gracias por la respuesta:
EliminarSi, instale el msi version 13 y descargue el instalador para el visual (el de 300 megas) version 13
En cuanto a la solapa deja la busco por que esa no la vi, igual ya estaba un poco cansado
Gracias
Ingrese al apartado que viene la imagen, y la propuedad true esta es gris, no me deja cambiarlo
EliminarGracias
Lo solucione copiando las cadenas y cambiando el valro de dodne indica a true y aun asi, me sigue marcando el mismo error
EliminarGracias
Hola Leandro....
ResponderEliminarTengo un pequeño detalle..
Te platico tengo el proyecto de este blog, y lo compile en mi VS2012 y funciono de maravilla, cree un nuevo proyecto donde uno dos dataTable para mostrarlos en un grid y posteriormente mostrarlo en un Crw como lo muestras aqui... pensando que tu ejemplo cargo bien, me di a la tarea de realizarlo en mi proyecto sin embargo me lanza este error...
No se puede cargar el archivo o ensamblado 'file:///C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.
y No he podido solucionarlo
Espero tu valiosa ayuda y de antemano gracias
Muchas gracias Leandro, todo muy claro!
ResponderEliminarAmigo me has ayudado mucho, estoy muy agradecido! tengo un buen rato buscando ayuda en esto!
ResponderEliminarhola amigos gracias de antemano
ResponderEliminarestoy empezando en visual estudio y tengo un proyecto
en un form hago una consulta de pedido ya sea por numero o me muestre todos los pedidos el resultado de la consulta me lo muestra en un datagridview pero el detalle esta en que quiero pasar esos datos del datagridview u reporte de cristal report ya he leido algunos blog pero no logro pasarlos
dejo el codigo del form
If txtbuscapedido.Text = "" Then
MsgBox("DEVE INGRESAR UN PEDIDO")
txtbuscapedido.Focus()
Else
Dim SQL As String = "select numpedido, fechapedido, almacenpedido, almacensurtido, usuariopedido, estatus from pedido where (numpedido = '" & txtbuscapedido.Text & "')"
Dim MiConexion As New SqlConnection("Data Source=IPSERVIDOR;Initial Catalog=MITABLA;Integrated Security=True")
Dim Rs As SqlDataReader
Dim Com As New SqlCommand
Dim cadena As SqlDataAdapter = New SqlDataAdapter(SQL, MiConexion) ' para validar que halla registro
Dim DT As DataTable = New DataTable ' para validar que halla registro
cadena.Fill(DT) ' para validar que halla registro
Com.Connection = MiConexion
MiConexion.Open() 'abrimos la conexion
Com = New SqlCommand(SQL, MiConexion)
If DT.Rows.Count > 0 Then ' si el cout es diferente de cero si hay registro y HACE LA CONSULTA
Rs = Com.ExecuteReader()
Rs.Read()
DataGridView1.DataSource = DT
DataGridView1.Columns(0).HeaderText = "# DE PEDIDO"
DataGridView1.Columns(1).HeaderText = "FECHA PEDIDO"
DataGridView1.Columns(2).HeaderText = "ALMACEN PEDIDO"
DataGridView1.Columns(3).HeaderText = "ALMACEN SURTIRA"
DataGridView1.Columns(4).HeaderText = "QUIEN HACE PEDIDO"
DataGridView1.Columns(5).HeaderText = "ESTATUS"
Rs.Close()
MiConexion.Close()
txtbuscapedido.Text = ""
txtbuscapedido.Focus()
Else
'si no hay dato manda este mensaje
MessageBox.Show("no Existe Existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End If
ALGUIEN ME PUEDE INDICAR ALGO POR FAVOR MUCHAS GRACIAS
Hola Leandro en el caso que tambien tengamos un subreport seria muy complicado hacer lo mismo ? Sabes de algun ejemplo o enlace ? Por otro lado tengo problemas al visualizar un report creado en VS2008 con VS2017 ya que me tira excepciones cuando hago un ExportToDisk o cuando intento vincular datos al report pero curiosamente si relleno los campos del report desde el codigo de VS2017 como tu haces en este ejemplo con los DataSet tipados sin hacer consulta sql desde el propio report no tengo problemas de visualizacion. La dificultad como te decia es que tengo reports que tienen subreports
ResponderEliminar