domingo, 2 de mayo de 2010

[Crystal Reports] Exportar DataGridView a Crystal

 

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.

Informes Crystal Reports

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.

crystal4

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:

crystal1

Del cuadro de dialogo siguiente se selecciona el DataSet creado en el paso previo:

crystal2

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.

crystal3

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:

crystal5

 

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]

159 comentarios:

  1. leandro, no te das una idea de cómo acabás de salvarme la vida!

    mil gracias!

    ResponderEliminar
  2. Gracias viejo, tus aportes son interesantisimos.. muchos de nosotros te debemos, gran parte del conocimiento que aportas.. muchas gracias nuevamente, exitos

    ResponderEliminar
  3. Hola 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;
    parent.AgregarProducto(row);
    agradezco tu iluminacion.

    ResponderEliminar
  4. hola Gabriel

    Estas 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

    ResponderEliminar
  5. 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.
    private 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.

    ResponderEliminar
  6. hola Gabriel

    La 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

    ResponderEliminar
  7. Normalmente no soy de los que opina pero tu articulo es super interesante.te doy gracias porque era exxactamente lo que buscaba

    ResponderEliminar
  8. Gracias Leandro, pero me da un ERROR



    Me 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

    ResponderEliminar
  9. hola Enrique

    Sobre los dataset has probado usar la opcion: imagen

    con esta se re-genera el codigo del dataset.

    saludos

    ResponderEliminar
  10. Leandro, no puedo cargar tu aplicacion, me da ese error

    Aun sigo con mi duda de los subinformes no se como hacerlo

    ResponderEliminar
  11. hola Enrique

    Probe 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

    ResponderEliminar
  12. 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
    1) 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

    ResponderEliminar
  13. hola Enrique

    Creo 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

    ResponderEliminar
  14. Q tal Lendro e leido muchos de tus foros y en verdad son muy interesantes..
    Pero 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

    ResponderEliminar
  15. hola Mario, que tal

    Cuando 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

    ResponderEliminar
  16. Gracias Leandro por contestar a mi pregunta..
    Te 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

    ResponderEliminar
  17. hola Mario

    Pero 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

    ResponderEliminar
  18. Leandro, tienes el codigo para visual 2005 ?

    ResponderEliminar
  19. hola epicentro

    El 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

    ResponderEliminar
  20. Que tal.

    Llevaba 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.

    ResponderEliminar
  21. hola Angelica

    me alegro que hay resultado util el articulo


    saludos

    ResponderEliminar
  22. Muchas Gracias Leandro me fue de gran Utilidad...

    ResponderEliminar
  23. Hola 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.
    ando 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

    ResponderEliminar
  24. hola Nismo

    Si 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

    ResponderEliminar
  25. 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.
    Alguna posible ayuda??

    ResponderEliminar
  26. hola Nismo

    Bueno 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

    ResponderEliminar
  27. Master, Leandro
    Me 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 :)

    ResponderEliminar
  28. hola Orlando Raul

    si 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

    ResponderEliminar
  29. Como hago para meter una grilla en crystal report 9 con visual basic 6 pro.

    con lo que tú escribiste ninguna instrucción me funciona.

    saludos
    edu

    ResponderEliminar
  30. hola eedu

    es que lo escrito aqui corresponde a .net (VS2008), o sea no es VB6, por eso no aplica


    saludos

    ResponderEliminar
  31. Hola capo como te va

    Sabes 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

    ResponderEliminar
  32. hola 000

    pero 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

    ResponderEliminar
  33. 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
    Factura _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

    ResponderEliminar
  34. Increiblemente lo solucione borrando la relacion entre las tablas que antes habia establecido.

    Saludos

    ResponderEliminar
  35. 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?

    ResponderEliminar
  36. hola ERNESTOIII

    lo 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

    ResponderEliminar
  37. Buenas tardes!!

    He 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?

    ResponderEliminar
  38. hola Angie

    bueno, 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

    ResponderEliminar
  39. 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.

    Desde ya muchas grax.

    ResponderEliminar
  40. hola Nyu

    pero 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

    ResponderEliminar
  41. 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..

    ResponderEliminar
  42. hola VERILU

    valida 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

    ResponderEliminar
  43. Hola Leandro

    Primero 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?

    ResponderEliminar
  44. hola Marx

    has 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

    ResponderEliminar
  45. 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...

    ResponderEliminar
  46. Leandro, ¿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.

    PD: Te agregué en facebook, por si tal vez te encuentre conectado y puedas apoyarme si no fuera mucha molestia.

    Saludos

    ResponderEliminar
  47. hola StevenLlaja

    la 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

    ResponderEliminar
  48. 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?

    ResponderEliminar
  49. hola mauriciohamak

    que distibucion de VS estas usando? porque recuerda que no puedes suar Crystal con una version Express del VS

    saludos

    ResponderEliminar
  50. 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

    ResponderEliminar
  51. los numericos no los muestra y mi codificacion es esta:

    Dim 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

    ResponderEliminar
  52. 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

    ResponderEliminar
  53. hola MIND CORRUPTER

    el 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

    ResponderEliminar
  54. 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:

    Private 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

    ResponderEliminar
  55. y el codigo del boton que genera el reporte seria este segun tu codigo:

    Dim 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

    ResponderEliminar
  56. gracias Leandro ya lo pude hacer funcionar, tu ayuda es muy util para mi de verdad gracias.....es bueno contar contigo...cuidate

    ResponderEliminar
  57. hola MIND CORRUPTER

    ahh que bien, que bueno que funciono

    ResponderEliminar
  58. 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...

    ResponderEliminar
  59. hola chorchi

    pero 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

    ResponderEliminar
  60. 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...

    ResponderEliminar
  61. hola chorchi

    a 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

    ResponderEliminar
  62. 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...

    ResponderEliminar
  63. Saludos Sr. Leandro
    tengo 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

    ResponderEliminar
  64. hola luis de la cruz

    no 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

    ResponderEliminar
  65. Saludos
    lo 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

    ResponderEliminar
  66. disculpe
    guardar todos estos procutos y los datos del cliente con el mismo Id_factura

    Mil Gracias.

    ResponderEliminar
  67. 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

    ResponderEliminar
  68. Leandro es muy interesante tu blog.
    Pero 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.

    ResponderEliminar
  69. Me explico Mejor:
    ejemplo: 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???

    ResponderEliminar
  70. hola eisaac

    podrias 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

    ResponderEliminar
  71. 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.

    ResponderEliminar
  72. hola Erick

    o 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

    ResponderEliminar
  73. 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.

    ResponderEliminar
  74. hola Augusto

    la verdad no entendi el planteo

    veo que quieres enviar datos a un formularios, pero no quedo claro de dodne los estas tomando

    saludos

    ResponderEliminar
  75. 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

    ResponderEliminar
  76. hola Augusto

    o 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

    ResponderEliminar
  77. 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
    ReportDataSource 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.

    ResponderEliminar
  78. hola Augusto

    esto en que entorno sucede, se produce cuando ejecutas desde el VS, o se presenta cuando llevas el desarrollo a la pc del usuario ?

    saludos

    ResponderEliminar
  79. 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.

    ResponderEliminar
  80. hola Augusto

    pues 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

    ResponderEliminar
  81. 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.

    ResponderEliminar
  82. hola Augusto

    por 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

    ResponderEliminar
  83. Hola Leandro,si uso Reporting Service ahí lo configure desde app.config y me funciono muchas gracias! Saludos.

    ResponderEliminar
  84. Hola leandro tengo una pregunta y ya he visto algunos ejemplos pero no logro conseguir lo que quiero hacer te explico
    quiero 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

    ResponderEliminar
  85. hola Jocelyn

    si 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

    ResponderEliminar
  86. el dataset ya lo tengo realizado
    y 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

    ResponderEliminar
  87. hola Jocelyn

    lo 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

    ResponderEliminar
  88. Hola Leandro
    Muchas 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

    ResponderEliminar
  89. hola Jocelyn

    pero 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

    ResponderEliminar
  90. Hola Leandro

    Gracias por tu respuesta y disculpa mi ignorancia pero no se muy bien lo de los parámetros me podrias explicar como aplicarlo
    Gracias

    Saludos

    ResponderEliminar
  91. hola Jocelyn

    pero 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

    ResponderEliminar
  92. Hola Leandro
    Perdon 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

    ResponderEliminar
  93. hola Jocelyn

    ADO.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

    ResponderEliminar
  94. hola Leandro
    Disculpa 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

    ResponderEliminar
  95. hola Jocelyn

    no 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

    ResponderEliminar
  96. Hola Leandro

    Gracias 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

    ResponderEliminar
  97. hola Jocelyn

    si 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

    ResponderEliminar
  98. 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

    ya 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

    ResponderEliminar
  99. hola Juan Pablo

    para 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

    ResponderEliminar
  100. 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
    Column named Codigo cannot be found. Parameter name: columnName
    lo cual me tiene desconsertado.
    Agradezco tu ayuda.

    ResponderEliminar
  101. hola Abner

    lo 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

    ResponderEliminar
  102. 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.

    ResponderEliminar
  103. hola Abner

    hasta 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

    ResponderEliminar
  104. Hola Leandro.
    Estuve 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.

    ResponderEliminar
  105. hola Abner

    pero 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

    ResponderEliminar
  106. Hola Leandro
    Buena 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

    ResponderEliminar
  107. hola Abner

    a 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

    ResponderEliminar
  108. Buenas tardes leandro segui tu manual y cree esta linea

    Private 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.

    ResponderEliminar
  109. Hola 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

    ResponderEliminar
  110. hola ITSSMT

    pero 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

    ResponderEliminar
  111. 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??

    ResponderEliminar
  112. hola sheccid

    inspeccionaste 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

    ResponderEliminar
  113. Hola Leandro.

    Una 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!

    ResponderEliminar
  114. Leandro como se hace el breakpoint del dataset? ya intente cargarlo en un datagrid y no funciona..

    ResponderEliminar
  115. hola sheccid

    imagino 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

    ResponderEliminar
  116. 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);

    y 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..

    ResponderEliminar
  117. hola sheccid

    bien, 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

    ResponderEliminar
  118. 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

    ejemplo 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

    ResponderEliminar
  119. holsa KEKO

    cual 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

    ResponderEliminar
  120. 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

    ResponderEliminar
  121. hola KEKO

    en 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

    ResponderEliminar
  122. 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

    ResponderEliminar
  123. hola KEKO

    pero 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

    ResponderEliminar
  124. 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

    mira 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

    ResponderEliminar
  125. Hola de antemano, gracias, bueno tengo un problema cuando paso por esta linea
    _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

    ResponderEliminar
  126. hola gabriel

    la 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

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  127. hola espero y me puedas ayudar, ¿como le hago para que los registros que yo selecciono de un datagridview se visulicen en un crystal report?

    ResponderEliminar
  128. hola Luis

    podrias 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

    ResponderEliminar
  129. perdon por la insitencia te pongo el codigo haber si lo entiendes:

    TODA 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

    ResponderEliminar
  130. hola Luis

    pues 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

    ResponderEliminar
  131. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  132. Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click

    Try

    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

    ResponderEliminar
  133. 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

    ResponderEliminar
  134. Hola Leandro, tengo una gran duda;
    como 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

    ResponderEliminar
  135. hola
    logre 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

    ResponderEliminar
  136. hola Francisco

    que 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

    ResponderEliminar
  137. resubi las imagenes y links caidos por favor!, muy util el aporte y aun 5 años despues tiene toda la validez!

    ResponderEliminar
  138. hola Juan

    ya se encuentra actualizado el articulo


    saludos

    ResponderEliminar
  139. 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:
    Dim 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 =)

    ResponderEliminar
  140. hola Luis

    pero 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

    ResponderEliminar
  141. 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

    ResponderEliminar
  142. hola marcosandy

    claro por supuesto, todo lo que este en el blog puede usarlo sin problemas

    saludos

    ResponderEliminar
  143. 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 =/

    ResponderEliminar
  144. hola Michael

    Pero 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

    ResponderEliminar
  145. 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:
    GrillaExportarCrystal.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

    ResponderEliminar
    Respuestas
    1. se me olvidaba, esta es la linea que me marca error

      Me._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

      Eliminar
    2. hola
      recuerda 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

      Eliminar
    3. Hola buen dia gracias por la respuesta:

      Si, 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

      Eliminar
    4. Ingrese al apartado que viene la imagen, y la propuedad true esta es gris, no me deja cambiarlo

      Gracias

      Eliminar
    5. Lo solucione copiando las cadenas y cambiando el valro de dodne indica a true y aun asi, me sigue marcando el mismo error

      Gracias

      Eliminar
  146. Hola Leandro....
    Tengo 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

    ResponderEliminar
  147. Muchas gracias Leandro, todo muy claro!

    ResponderEliminar
  148. Amigo me has ayudado mucho, estoy muy agradecido! tengo un buen rato buscando ayuda en esto!

    ResponderEliminar
  149. hola amigos gracias de antemano

    estoy 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

    ResponderEliminar