reportviewer c#

Upload: jorge-carlos-ckarlos

Post on 02-Jun-2018

312 views

Category:

Documents


2 download

TRANSCRIPT

  • 8/10/2019 ReportViewer c#

    1/93

  • 8/10/2019 ReportViewer c#

    2/93

    Agregue un LocalReport, deje el nombre default:

    Ahora, crearemos las clases contenedoras de las entidades, recuerde que una entidad esta

    http://lh6.ggpht.com/-Xfn_HNOifp8/Uld0eVQpOlI/AAAAAAAAAJQ/zUYotyk3AKk/s1600-h/newReport1.pnghttp://lh5.ggpht.com/-GYx_C3J6wmU/Uld0cPs5ZRI/AAAAAAAAAJA/xTFAb_eaXnU/s1600-h/newItem4.pnghttp://lh4.ggpht.com/-i4Fcig0xTZ8/UmnkA9__LkI/AAAAAAAAAT8/fb6xiW3_nc0/s1600-h/l19%255B2%255D.pnghttp://lh6.ggpht.com/-Xfn_HNOifp8/Uld0eVQpOlI/AAAAAAAAAJQ/zUYotyk3AKk/s1600-h/newReport1.pnghttp://lh5.ggpht.com/-GYx_C3J6wmU/Uld0cPs5ZRI/AAAAAAAAAJA/xTFAb_eaXnU/s1600-h/newItem4.pnghttp://lh4.ggpht.com/-i4Fcig0xTZ8/UmnkA9__LkI/AAAAAAAAAT8/fb6xiW3_nc0/s1600-h/l19%255B2%255D.pnghttp://lh6.ggpht.com/-Xfn_HNOifp8/Uld0eVQpOlI/AAAAAAAAAJQ/zUYotyk3AKk/s1600-h/newReport1.pnghttp://lh5.ggpht.com/-GYx_C3J6wmU/Uld0cPs5ZRI/AAAAAAAAAJA/xTFAb_eaXnU/s1600-h/newItem4.pnghttp://lh4.ggpht.com/-i4Fcig0xTZ8/UmnkA9__LkI/AAAAAAAAAT8/fb6xiW3_nc0/s1600-h/l19%255B2%255D.png
  • 8/10/2019 ReportViewer c#

    3/93

    compuesta por campos y propiedades.

    Inserte una nueva clase y nmbrela EArt iculo, la cual contendr todas las propiedades de la

    entidad Articulo, la clase deber de quedar con esta estructura:

    Cdigo C#:

    namespace ReportViewerInvoiceReport_CSharp

    {

    public class EArticulo

    {

    public int Numero { get; set; }

    public string Upc { get; set; }

    public string Descripcion { get; set; }

    public decimal Piezas { get; set; }

    public decimal Precio { get; set; }

    public decimal Importe { get; set; }

    }

    }

    Cdigo Vb.Net:

    Public Class EArticulo

    Public Property Numero() As Integer

    Public Property Upc() As String

    Public Property Descripcion() As String

    Public Property Piezas() As Decimal

    Public Property Precio() As Decimal

    Public Property Importe() As Decimal

    End Class

    Despus inserte una nueva clase y nmbrela EFactura, esta clase contendr todas las

    propiedades del encabezado de la factura, la clase deber de quedar con esta estructura:

    Cdigo C#:

    using System;

    using System.Collections.Generic;

    namespace ReportViewerInvoiceReport_CSharp

    {

    public class EFactura

    {public int Numero { get; set; }

    public string Nombre { get; set; }

    public string Rfc { get; set; }

    public string Direccion { get; set; }

    public decimal Subtotal { get; set; }

    public decimal Iva { get; set; }

    public decimal Total { get; set; }

  • 8/10/2019 ReportViewer c#

    4/93

    public DateTime FechaFacturacion { get; set; }

    //Creamos una lista con una nueva Instancia de la clase Articulo

    //esta lista contendra el detalle de la factura

    public List Detail = new List();

    }

    }

    Cdigo Vb.Net:

    Imports System.Collections.Generic

    Public Class EFactura

    Public Property Numero() As Integer

    Public Property Nombre() As String

    Public Property Rfc() As String

    Public Property Direccion() As String

    Public Property Subtotal() As Decimal

    Public Property Iva() As Decimal

    Public Property Total() As Decimal

    Public Property FechaFacturacion() As DateTime

    'Creamos una lista con una nueva Instancia de la clase Articulo

    'esta lista contendra el detalle de la factura

    Public Detail As New List(Of EArticulo)()

    End Class

    Configurar el Reporte del informe Report1.rdlc

    Para poder usar las clases de EFacturapara llenar el Encabezado del reporte y EArt iculopara el

    detalle del mismo, primero debemos de generar el proyecto, para ello localice el men Generar

    > Generar Solucin

    Establecer la fuente de datos del Reporte

    Active el cuadro Datos del informe, Men Ve r>Datos del informe

  • 8/10/2019 ReportViewer c#

    5/93

    Establezca el Nombredel conjunto de datos y haga click sobre el botn Nuevo:

    Seleccione Objetoy haga Click sobre el botn Siguiente:

    http://lh6.ggpht.com/-q6Pcno3zCy4/Uld0iKYK9TI/AAAAAAAAAJw/mE2u5Deilvg/s1600-h/dataS13.pnghttp://lh3.ggpht.com/-1ta40FPIARI/Uld0gWTGBBI/AAAAAAAAAUM/TSf2cxwDe-I/s1600-h/dataSet%255B2%255D.pnghttp://lh6.ggpht.com/-q6Pcno3zCy4/Uld0iKYK9TI/AAAAAAAAAJw/mE2u5Deilvg/s1600-h/dataS13.pnghttp://lh3.ggpht.com/-1ta40FPIARI/Uld0gWTGBBI/AAAAAAAAAUM/TSf2cxwDe-I/s1600-h/dataSet%255B2%255D.png
  • 8/10/2019 ReportViewer c#

    6/93

    Seleccione la clase EFactura, recuerde que esta clase contiene las propiedades para el

    encabezado de la factura y haga Click sobre el botn Finalizar (Si no hubiera generado el proyecto

    estas clases no estaran visibles, as que si no las ve por favor cierre la ventana y genere la

    solucin):

    Observe que ya tiene una fuente de datos seleccionada, solo haga Click en el botn Aceptar:

    http://lh4.ggpht.com/-or36FAA3UK4/Uld0lteGyXI/AAAAAAAAAKQ/RNbLyzuOp80/s1600-h/sele3.pnghttp://lh3.ggpht.com/-SO_MohnYBME/Uld0j5ywVpI/AAAAAAAAAKA/dzadN3n8JdQ/s1600-h/obje3.pnghttp://lh4.ggpht.com/-or36FAA3UK4/Uld0lteGyXI/AAAAAAAAAKQ/RNbLyzuOp80/s1600-h/sele3.pnghttp://lh3.ggpht.com/-SO_MohnYBME/Uld0j5ywVpI/AAAAAAAAAKA/dzadN3n8JdQ/s1600-h/obje3.png
  • 8/10/2019 ReportViewer c#

    7/93

    Bien, ya tiene una Fuente de datos configurada:

    Siga los mismos pasos para agregar la fuente de datos para el detalle del reporte solo que ahora

    seleccionara la clase EArticulo, al final tendr un resultado como el siguiente:

    http://lh3.ggpht.com/-laOvJ2716cw/Uld0pMGDG4I/AAAAAAAAAUc/687ExaCA0AM/s1600-h/l2%255B1%255D.pnghttp://lh6.ggpht.com/-Ao9uWzT3sL4/Uld0niAQ4KI/AAAAAAAAAKg/hGL_f24UuDY/s1600-h/l13.pnghttp://lh3.ggpht.com/-laOvJ2716cw/Uld0pMGDG4I/AAAAAAAAAUc/687ExaCA0AM/s1600-h/l2%255B1%255D.pnghttp://lh6.ggpht.com/-Ao9uWzT3sL4/Uld0niAQ4KI/AAAAAAAAAKg/hGL_f24UuDY/s1600-h/l13.png
  • 8/10/2019 ReportViewer c#

    8/93

    Configurar tamao y encabezado del informe

    Active la regla del informe para ello men Informe> Regla

    Configure el tamao del informe, men Informe> Propiedades del inform e

    Un punto muy importante en este paso es tener presente el Ancho o alto del reporte dependiendo

    que tipo de orientacin se haya elegido, en este caso el ancho es lo que interesa, considere que

    http://lh6.ggpht.com/-p5GPstfozUU/Uld0tVm9m-I/AAAAAAAAAU8/ANzNVtR-jGw/s1600-h/l4%255B1%255D.pnghttp://lh5.ggpht.com/-tlBBiJuPGUw/Uld0qiVjcMI/AAAAAAAAAUs/NN0NNachh5c/s1600-h/l3%255B1%255D.pnghttp://lh6.ggpht.com/-p5GPstfozUU/Uld0tVm9m-I/AAAAAAAAAU8/ANzNVtR-jGw/s1600-h/l4%255B1%255D.pnghttp://lh5.ggpht.com/-tlBBiJuPGUw/Uld0qiVjcMI/AAAAAAAAAUs/NN0NNachh5c/s1600-h/l3%255B1%255D.png
  • 8/10/2019 ReportViewer c#

    9/93

    tiene un ancho mximo de 21.59 cm. a este espacio le restara el valor total de los mrgenes que

    son 2.0 cm en total ya que configuro un margen de 0.5 cm, dando un espacio de trabajo real

    disponible de 19.59 cm., si en el diseo de nuestro reporte nos pasamos de este espacio

    disponible nuestro reporte en lugar de mostrarnos una hoja nos mostrar ara dos, normalmente la

    segunda hoja sin o con pocos datos.

    Bien, continuemos

    Agregue un encabezado de reporte, men Informe> Agregar encabezado de pagina

    Active el cuadro de herramientas, men Ve r> Cuadro de herramientas:

    Arrastre tantos Cuadros de texto como se requieran, recuerde que nuestros datos provienen de

    una clase, entonces por cada campo-propiedad de la clase tiene que crear un control Cuadro de

    texto para poder visualizar el datoesto de crear un control po r cada propiedades de la clase

    origen es nicamente para este reporte, en realidad usted puede elegir que datos mostrar y cuales

    no.

    Configurar control cuadro de texto:

    Click derecho sobre el control cuadro de texto que deseemos configurar:

    Recuerde que establecer un nombre a los controles que vayamos utilizando es de vital importancia

    porque ser en base a este como los identificaremos, en proyectos pequeos tal vez no tenga

    problemas si deja los nombres asignados por default pero, en proyectos grandes esta malapractica nos provocara constantes dolores de cabeza, entonces, nunca olvide ponerle un nombre a

    los controles. Considere que el nombre debe de identificar fcilmente al control al que hace

    referencia y al dato que contendr o al cual estar relacionado, en este caso tx tFacturaes muy

    descriptivo, ya que se entiende que es un control textBox o cuadro de texto y que contendr el

    numero de factura.

    Para definir el origen del dato que mostrara el control cuadro de texto despliegue el ComboBox

    http://lh6.ggpht.com/--cWkT4tSWPE/Uld0vtB0x2I/AAAAAAAAAVM/zLDL6F9fvds/s1600-h/l5%255B2%255D.png
  • 8/10/2019 ReportViewer c#

    10/93

    Valor, vera que este estar cargado con las propiedades de las clases las cuales definimos como

    fuente de datos, no le ser difcil identificar a que clase pertenece cada una ya que al final podra

    ver el nombre que le puso al origen de datos.

    Desactivar la casilla Permit i r aum entar el alto puede resultar muy importante para conservar un

    buen diseo, tener activada esta casilla permite que el control cambie de tamao en tiempo de

    ejecucin adecundose al tamao del valor que contiene, modificando con esto el diseo hasta el

    punto de generar hojas innecesarias.

    http://lh3.ggpht.com/-f-XXKGGU5zk/Uld0xlHFhZI/AAAAAAAAALs/PGKuHJSMuEQ/s1600-h/l104.png
  • 8/10/2019 ReportViewer c#

    11/93

    http://lh5.ggpht.com/-4nC1y0EhjLk/Uld01f6kKJI/AAAAAAAAAVs/8HqzygvgAuE/s1600-h/l7%255B2%255D.pnghttp://lh5.ggpht.com/-L8GYrv7gMeM/Uld0zvzj_8I/AAAAAAAAAVc/3yFJNBQ8L6E/s1600-h/l6%255B1%255D.pnghttp://lh5.ggpht.com/-4nC1y0EhjLk/Uld01f6kKJI/AAAAAAAAAVs/8HqzygvgAuE/s1600-h/l7%255B2%255D.pnghttp://lh5.ggpht.com/-L8GYrv7gMeM/Uld0zvzj_8I/AAAAAAAAAVc/3yFJNBQ8L6E/s1600-h/l6%255B1%255D.png
  • 8/10/2019 ReportViewer c#

    12/93

    En este ejemplo el campo Factura ser del tipo numrico por lo cual para conservar un formato de

    numero correcto, tendr que configurar el lenguaje que utilizara el campo, para mi ubicacin

    (Mxico) la configuracin de lenguaje ser es-Mex, para configurar esta propiedad:

    Selecc ione el control cu adro de texto> Presione F4:

    Si no hiciera esto, un formato numrico podra no mostrarse correctamente por ejemplo la cantidad

    Mil doscientos cincuenta y seis con cincuenta y seis decimales en Mxico ser 1,256.56 pero en

    Espaa se escribira de esta manera 1.256,56. Esta configuracin debemos de hacerla aun si en la

    http://lh6.ggpht.com/-wdh1Y_OR6tM/Uld05O3acYI/AAAAAAAAAWM/paI3AR00VTY/s1600-h/l9%255B1%255D.pnghttp://lh3.ggpht.com/-fWwSTn9Fun8/Uld03QECqwI/AAAAAAAAAV8/ajuI4ho0pT0/s1600-h/l8%255B2%255D.pnghttp://lh6.ggpht.com/-wdh1Y_OR6tM/Uld05O3acYI/AAAAAAAAAWM/paI3AR00VTY/s1600-h/l9%255B1%255D.pnghttp://lh3.ggpht.com/-fWwSTn9Fun8/Uld03QECqwI/AAAAAAAAAV8/ajuI4ho0pT0/s1600-h/l8%255B2%255D.png
  • 8/10/2019 ReportViewer c#

    13/93

    clase Main de nuestro proyecto hayamos definido un lenguaje de manera predeterminada.

    Agregar parmetros al Reporte:

    Para abarcar mas sobre el tema de ReportViewer y local report, subamos un poco mas el nivel de

    nuestro proyecto agregando parmetros al mismo, esto no siempre es necesario as que en este

    articulo solo lo haremos para fines ilustrativos, es decir, para cuando lleguemos a necesitarlo

    tendremos el conocimiento disponible de como usarlos.

    En el Datos del inform e> Click derecho sobre Parametros> Agregar parametro:

    De nuevo, recuerde que nombrar correctamente a cada control que agregamos es de vital

    importancia:

    http://lh3.ggpht.com/-WSir-IijrI0/Uld06yAwRCI/AAAAAAAAAM8/7UzJ7PlpPTc/s1600-h/l116.png
  • 8/10/2019 ReportViewer c#

    14/93

    Agregue un nuevo parmetro y nmbrelo parametroEmpresa.

    Ahora, arrastre dos controles Cuadro de texto al informe, y vaya a las propiedades para configurar

    el valor a mostrar:

    http://lh4.ggpht.com/-S-mwL2Yupjo/Uld0-bzHGTI/AAAAAAAAANc/dH7bVhgzL_Q/s1600-h/l133.pnghttp://lh6.ggpht.com/-JbQ7ZSgLIgM/Uld084Z7ezI/AAAAAAAAANM/2rC2Fv2SLSo/s1600-h/l124.pnghttp://lh4.ggpht.com/-S-mwL2Yupjo/Uld0-bzHGTI/AAAAAAAAANc/dH7bVhgzL_Q/s1600-h/l133.pnghttp://lh6.ggpht.com/-JbQ7ZSgLIgM/Uld084Z7ezI/AAAAAAAAANM/2rC2Fv2SLSo/s1600-h/l124.png
  • 8/10/2019 ReportViewer c#

    15/93

    Haga lo mismo para el segundo control agregado, veamos como va nuestro diseo del informe:

    Para el detalle del informe, agregue un Tabla arrastrndola desde el cuadro de herramientas, vaya

    a las propiedades de la tabla recin agregada, ubique la propiedad DataSetName par establecer el

    origen de datos y seleccione Detalle, recuerde que ese fue el nombre que establecimos al origen

    de datos:

    http://lh3.ggpht.com/-5dP37_AeMKI/Uld1CYYiEVI/AAAAAAAAAN8/zNuQ10uPV9M/s1600-h/l159.pnghttp://lh4.ggpht.com/-qVs1tvECLeE/Uld1AULrhMI/AAAAAAAAANs/_xBdcH-riwE/s1600-h/l143.pnghttp://lh3.ggpht.com/-5dP37_AeMKI/Uld1CYYiEVI/AAAAAAAAAN8/zNuQ10uPV9M/s1600-h/l159.pnghttp://lh4.ggpht.com/-qVs1tvECLeE/Uld1AULrhMI/AAAAAAAAANs/_xBdcH-riwE/s1600-h/l143.png
  • 8/10/2019 ReportViewer c#

    16/93

    Agregue las columnas que falten para completar el cuerpo del informe, para ello haga Click

    derecho sobre la tabla, Insertar columna, Izquierda o derecha.

    Despus establezca el valor que mostrara cada columna, para ello tiene dos opciones, seleccionar

    el valor desde el icono que vera en la esquina superior derecha de cada celda o ir a propiedades

    del cuadro de texto tal cual como lo hizo anteriormente:

    Establezca el tamao de fuente, borde, tipo de dato, lenguaje a utilizar (recuerde lo comentado

    anteriormente sobre el formato de numero/moneda)

    Como va nuestro diseo de informe?

    http://lh3.ggpht.com/-TRclJ5RHyHw/Uld1FaVCDjI/AAAAAAAAAOc/yPDxneADMQg/s1600-h/l173.pnghttp://lh5.ggpht.com/-WOjyoOW98yo/Uld1D05y55I/AAAAAAAAAOM/RnqviXqskSg/s1600-h/l163.pnghttp://lh3.ggpht.com/-TRclJ5RHyHw/Uld1FaVCDjI/AAAAAAAAAOc/yPDxneADMQg/s1600-h/l173.pnghttp://lh5.ggpht.com/-WOjyoOW98yo/Uld1D05y55I/AAAAAAAAAOM/RnqviXqskSg/s1600-h/l163.png
  • 8/10/2019 ReportViewer c#

    17/93

    Si tienen un resultado como este, pueden dar su tarea por terminada en cuanto al diseo del

    informe si aun no lo logran, todo es cuestin que revisen como configurar un control TextBox o

    cuadro de texto como gusten llamarlo y ponerse a ver Alineacin, tipo de fuente, borde, relleno,

    etc

    Hasta aqu daremos por terminado nuestro diseo, ahora vayamos a:

    Establecer una Lista Genrica como DataSource de un local report:

    Ubique el Formulario contenedor del ReportViewer llamado FacturaRpt, seleccione el icono

    superior derecho del reportViewer> Seleccione el local report que utilizaremos (el nico que

    hemos diseado)

    Una vez echo lo anterior, genere el evento Load del Formulario, para ello puede hacer doble click

    sobre la barra de titulo o seleccionar el form y presionar la tecla de funcin F4, esto abrir la caja

    de propiedades, en la parte superior podr ver un icono con forma de rayo de color amarillo, haga

    http://lh3.ggpht.com/-t1PFFenKnZk/Uld1IYcSo2I/AAAAAAAAAO8/RR7wvcrcCHY/s1600-h/l205.pnghttp://lh4.ggpht.com/-00x3wfJEm3k/Uld1Gu2CYgI/AAAAAAAAAOs/cXi7eKqoCz4/s1600-h/l187.pnghttp://lh3.ggpht.com/-t1PFFenKnZk/Uld1IYcSo2I/AAAAAAAAAO8/RR7wvcrcCHY/s1600-h/l205.pnghttp://lh4.ggpht.com/-00x3wfJEm3k/Uld1Gu2CYgI/AAAAAAAAAOs/cXi7eKqoCz4/s1600-h/l187.png
  • 8/10/2019 ReportViewer c#

    18/93

    click sobre el para ver los eventos que implementa el control, despus ubique el Evento que le

    interese implementar en este caso nos interesa el evento Load.

    Copie y pegue el siguiente cdigo:

    Cdigo C#:

    using System;

    using System.Collections.Generic;

    using System.Windows.Forms;

    using Microsoft.Reporting.WinForms;

    namespace ReportViewerInvoiceReport_CSharp

    {

    public partial class FacturaRpt : Form

    {

    //

    //Cree dos listas una para el Encabezado y otra para el detalle

    //

    public List Invoice = new List();

    public List Detail = new List();

    //

    //Cree las propiedades publicas Titulo y Empresa

    //

    public string Titulo { get; set; }

    public string Empresa { get; set; }

    public FacturaRpt()

    {

    InitializeComponent();

    }

    private void FacturaRpt_Load(object sender, EventArgs e)

    {

    //Limpiemos el DataSource del informe

    reportViewer1.LocalReport.DataSources.Clear();

    //

    //Establezcamos los parmetros que enviaremos al reporte

    //recuerde que son dos para el titulo del reporte y para el

    nombre de la empresa

    //ReportParameter[] parameters = new ReportParameter[2];

    parameters[0] = new ReportParameter("parameterTitulo",

    Titulo);

    parameters[1] = new ReportParameter("parameterEmpresa",

    Empresa);

    //

  • 8/10/2019 ReportViewer c#

    19/93

    //Establezcamos la lista como Datasource del informe

    //

    reportViewer1.LocalReport.DataSources.Add(new

    ReportDataSource("Encabezado", Invoice));

    reportViewer1.LocalReport.DataSources.Add(new

    ReportDataSource("Detalle", Detail));

    //

    //Enviemos la lista de parametros

    //

    reportViewer1.LocalReport.SetParameters(parameters);

    //

    //Hagamos un refresh al reportViewer

    //

    reportViewer1.RefreshReport();

    }

    }

    }

    Cdigo Vb.Net:

    Imports Microsoft.Reporting.WinForms

    Public Class FacturaRpt

    '

    'Cree dos listas una para el Encabezado y otra para el detalle

    '

    Public Invoice As New List(Of EFactura)()

    Public Detail As New List(Of EArticulo)()

    '

    'Cree las propiedades publicas Titulo y Empresa

    '

    Public Property Titulo() As String

    Public Property Empresa() As String

    Private Sub FacturaRpt_Load(sender As System.Object, e As

    System.EventArgs) Handles MyBase.Load

    'Limpiemos el DataSource del informe

    ReportViewer1.LocalReport.DataSources.Clear()

    '

    'Establezcamos los parametros que enviaremos al reporte'recuerde que son dos para el titulo del reporte y para el nombre

    de la empresa

    '

    Dim parameters As ReportParameter() = New ReportParameter(1) {}

    parameters(0) = New ReportParameter("parameterTitulo", Titulo)

    parameters(1) = New ReportParameter("parameterEmpresa", Empresa)

  • 8/10/2019 ReportViewer c#

    20/93

    '

    'Establezcamos la lista como Datasource del informe

    '

    ReportViewer1.LocalReport.DataSources.Add(New

    ReportDataSource("Encabezado", Invoice))

    ReportViewer1.LocalReport.DataSources.Add(New

    ReportDataSource("Detalle", Detail))

    '

    'Enviemos la lista de parametros

    '

    ReportViewer1.LocalReport.SetParameters(parameters)

    '

    'Hagamos un refresh al reportViewer

    '

    ReportViewer1.RefreshReport()

    End Sub

    End Class

    Hagamos lo ultimo que falta, enviar los datos desde el formulario principal:

    Genere el Evento load del Formulario principal,

    Despus de generado el evento trate de seguir estas lneas de cdigo, escriba linea por linea si

    copia y pega ser mas complicado que comprenda (suponiendo que su experiencia en desarrollo

    no es amplia):

    Cdigo C#:

    http://lh3.ggpht.com/-5GIESh0xmms/Uld1KWWe-8I/AAAAAAAAAPM/vetfiAqpEOg/s1600-h/VsEvent3.png
  • 8/10/2019 ReportViewer c#

    21/93

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Windows.Forms;

    namespace ReportViewerInvoiceReport_CSharp

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    ///

    /// Funcion encargada de llenar el control DataGridView

    /// Jos Luis Garca Bautista

    ///

    /// Una lista generica de la clase artculo

    private static List FillDgv()

    {

    //

    //Cree una lista generica de la entidad EArticulo

    //

    List listaArticulos = new List();

    //

    //Instancie la clase EArticulo para agregar datos a la lista

    //

    EArticulo item = new EArticulo

    {

    //Establezca valores a cada una de

    las propiedades

    Numero = 1,

    Upc = "7501020405680",

    Descripcion = "Descripcin del

    artculo 1",

    Piezas = 6,

    Precio = new decimal(12.50),

    Importe = (decimal)(6 * 12.5),};

    //

    //Agregamos el Item a la lista

    //

    listaArticulos.Add(item);

    EArticulo item1 = new EArticulo

  • 8/10/2019 ReportViewer c#

    22/93

    {

    Numero = 2,

    Upc = "7501040805610",

    Descripcion = "Descripcin del

    artculo 2",

    Piezas = 3,

    Precio = new decimal(22.50),

    Importe = (decimal)(3 * 22.5),

    };

    listaArticulos.Add(item1);

    EArticulo item2 = new EArticulo

    {

    Numero = 3,

    Upc = "0412200805610",

    Descripcion = "Descripcin del artculo 3",

    Piezas = 20,

    Precio = new decimal(52.80),

    Importe = (decimal)(20 * 52.80),

    };

    listaArticulos.Add(item2);

    return listaArticulos;

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    //

    //La funcion GenerateNumber() se utiliza unicamente para

    generar un Nmero

    //aleatorio que simulara ser el numerod e factura

    txtnumero.Text = GenerateNumber().ToString();

    //Establecemos la propiedad AutoGenerateColumns en False para

    evitar que se agreguen

    //nuevas columnas a la derecha de las que creamos en tiempo

    de diseo.

    //

    dgvdetalle.AutoGenerateColumns = false;

    ////Establecemos el DataSource del control DataGridView

    //

    dgvdetalle.DataSource = FillDgv();

    //

    //Mapeamos las propiedades de la clase devuelta por la

    Funcion FillDgv()

  • 8/10/2019 ReportViewer c#

    23/93

    //recuerde que esta funcion devuelve una lista del tipo

    EArticulo

    //

    dgvdetalle.Columns["columnNumero"].DataPropertyName =

    "Numero";

    dgvdetalle.Columns["columnUpc"].DataPropertyName = "Upc";

    dgvdetalle.Columns["columnDescripcion"].DataPropertyName =

    "Descripcion";

    dgvdetalle.Columns["columnPiezas"].DataPropertyName =

    "Piezas";

    dgvdetalle.Columns["columnPrecio"].DataPropertyName =

    "Precio";

    dgvdetalle.Columns["columnImporte"].DataPropertyName =

    "Importe";

    //

    //Hacemos las sumatorias usando un mtodo de extensin de

    Linq

    //

    decimal sum = FillDgv().Sum(x => x.Importe);

    decimal iva = (Math.Round(((sum / 116) * 16), 2));

    decimal subtotal = Math.Round(sum - iva, 2);

    txttotal.Text = Convert.ToString(Math.Round(sum, 2));

    txtiva.Text = Convert.ToString(iva);

    txtsubtotal.Text = Convert.ToString(subtotal);

    }

    private static int GenerateNumber()

    {

    Random rdm = new Random();

    return rdm.Next();

    }

    private void InvoiceGenerate()

    {

    //

    //Hacemos una instancia de la clase EFactura para//llenarla con los valores contenidos en los controles del

    Formulario

    EFactura invoice = new EFactura();

    invoice.Numero = Convert.ToInt32(txtnumero.Text);

    invoice.Nombre = txtnombre.Text;

    invoice.Rfc = txtrfc.Text;

    invoice.Direccion = txtdireccion.Text;

  • 8/10/2019 ReportViewer c#

    24/93

    invoice.FechaFacturacion = dtpfecha.Value.Date;

    invoice.Subtotal = Convert.ToDecimal(txtsubtotal.Text);

    invoice.Iva = Convert.ToDecimal(txtiva.Text);

    invoice.Total = Convert.ToDecimal(txttotal.Text);

    //Recorremos los Rows existentes actualmente en el control

    DataGridView

    //para asignar los datos a las propiedades

    foreach (DataGridViewRow row in dgvdetalle.Rows)

    {

    EArticulo article = new EArticulo();

    //

    //Vamos tomando los valores de las celdas del row que

    estamos

    //recorriendo actualmente y asignamos su valor a la

    propiedad de la clase intanciada

    //

    article.Numero =

    Convert.ToInt32(row.Cells["columnNumero"].Value);

    article.Upc =

    Convert.ToString(row.Cells["columnUpc"].Value);

    article.Descripcion =

    Convert.ToString(row.Cells["columnDescripcion"].Value);

    article.Piezas =

    Convert.ToDecimal(row.Cells["columnPiezas"].Value);

    article.Precio =

    Convert.ToDecimal(row.Cells["columnPrecio"].Value);

    article.Importe =

    Convert.ToDecimal(row.Cells["columnImporte"].Value);

    //

    //Vamos agregando el Item a la lista del detalle

    //

    invoice.Detail.Add(article);

    }

    //

    //Creamos una instancia del Formulario que contiene nuestro

    //ReportViewer

    //FacturaRpt frm = new FacturaRpt();

    //

    //Usamos las propiedades publicas del formulario, aqui es

    donde enviamos el valor

    //que se mostrara en los parametros creados en el

    LocalReport, para este ejemplo

  • 8/10/2019 ReportViewer c#

    25/93

    //estamos Seteando los valores directamente pero usted puede

    usar algun control

    //

    frm.Titulo = "Este es un ejemplo de Factura";

    frm.Empresa = "Este es un ejemplo del Nombre de la Empresa";

    //

    //Recuerde que invoice es una Lista Generica declarada en el

    FacturaRtp, es una lista

    //porque el origen de datos del LocalReport unicamente

    permite ser enlazado a objetos que

    //implementen IEnumerable.

    //

    //Usamos el metod Add porque Invoice es una lista e invoice

    es una entidad simple

    frm.Invoice.Add(invoice);

    //

    //Enviamos el detalle de la Factura, como Detail es una lista

    e invoide.Details tambien

    //es un lista del tipo EArticulo bastara con igualarla

    //

    frm.Detail = invoice.Detail;

    frm.Show();

    }

    private void btnImprimir_Click(object sender, EventArgs e)

    {

    InvoiceGenerate();

    }

    }

    }

    Cdigo Vb.Net:

    Public Class Form1

    '''

    ''' Funcion encargada de llenar el control DataGridView

    ''' Jos Luis Garca Bautista

    '''

    ''' Una lista generica de la clase artculo

    Private Shared Function FillDgv() As List(Of EArticulo)

    ''Cree una lista generica de la entidad EArticulo

    '

    Dim listaArticulos As New List(Of EArticulo)()

    '

    'Instancie la clase EArticulo para agregar datos a la lista

    '

    'Establezca valores a cada una de las propiedades

  • 8/10/2019 ReportViewer c#

    26/93

    Dim item As New EArticulo()

    item.Numero = 1

    item.Upc = "7501020405680"

    item.Descripcion = "Descripcin del artculo 1"

    item.Piezas = 6

    item.Precio = New Decimal(12.5)

    item.Importe = CDec(6 * 12.5)

    '

    'Agregamos el Item a la lista

    '

    listaArticulos.Add(item)

    Dim item1 As New EArticulo()

    item1.Numero = 2

    item1.Upc = "7501040805610"

    item1.Descripcion = "Descripcin del artculo 2"

    item1.Piezas = 3

    item1.Precio = New Decimal(22.5)

    item1.Importe = CDec(3 * 22.5)

    listaArticulos.Add(item1)

    Dim item2 As New EArticulo()

    item2.Numero = 3

    item2.Upc = "0412200805610"

    item2.Descripcion = "Descripcin del artculo 3"

    item2.Piezas = 20

    item2.Precio = New Decimal(52.8)

    item2.Importe = CDec(20 * 52.8)

    listaArticulos.Add(item2)

    Return listaArticulos

    End Function

    Private Sub Form1_Load(sender As System.Object, e As

    System.EventArgs) Handles MyBase.Load

    '

    'La funcion GenerateNumber() se utiliza unicamente para generar

    un Nmero'aleatorio que simulara ser el numerod e factura

    txtnumero.Text = GenerateNumber().ToString()

    'Establecemos la propiedad AutoGenerateColumns en False para

    evitar que se agreguen

    'nuevas columnas a la derecha de las que creamos en tiempo de

    diseo.

  • 8/10/2019 ReportViewer c#

    27/93

    '

    dgvdetalle.AutoGenerateColumns = False

    '

    'Establecemos el DataSource del control DataGridView

    '

    dgvdetalle.DataSource = FillDgv()

    '

    'Mapeamos las propiedades de la clase devuelta por la Funcion

    FillDgv()

    'recuerde que esta funcion devuelve una lista del tipo EArticulo

    '

    dgvdetalle.Columns("columnNumero").DataPropertyName = "Numero"

    dgvdetalle.Columns("columnUpc").DataPropertyName = "Upc"

    dgvdetalle.Columns("columnDescripcion").DataPropertyName =

    "Descripcion"

    dgvdetalle.Columns("columnPiezas").DataPropertyName = "Piezas"

    dgvdetalle.Columns("columnPrecio").DataPropertyName = "Precio"

    dgvdetalle.Columns("columnImporte").DataPropertyName = "Importe"

    '

    'Hacemos las sumatorias usando un mtodo de extensin de Linq

    '

    Dim sum As Decimal = FillDgv().Sum(Function(x) x.Importe)

    Dim iva As Decimal = (Math.Round(((sum / 116) * 16), 2))

    Dim subtotal As Decimal = Math.Round(sum - iva, 2)

    txttotal.Text = Convert.ToString(Math.Round(sum, 2))

    txtiva.Text = Convert.ToString(iva)

    txtsubtotal.Text = Convert.ToString(subtotal)

    End Sub

    Private Shared Function GenerateNumber() As Integer

    Dim rdm As New Random()

    Return rdm.[Next]()

    End Function

    Private Sub InvoiceGenerate()

    '

    'Hacemos una instancia de la clase EFactura para

    'llenarla con los valores contenidos en los controles delFormulario

    Dim invoice As New EFactura()

    invoice.Numero = Convert.ToInt32(txtnumero.Text)

    invoice.Nombre = txtnombre.Text

    invoice.Rfc = txtrfc.Text

    invoice.Direccion = txtdireccion.Text

    invoice.FechaFacturacion = dtpfecha.Value.[Date]

  • 8/10/2019 ReportViewer c#

    28/93

    invoice.Subtotal = Convert.ToDecimal(txtsubtotal.Text)

    invoice.Iva = Convert.ToDecimal(txtiva.Text)

    invoice.Total = Convert.ToDecimal(txttotal.Text)

    'Recorremos los Rows existentes actualmente en el control

    DataGridView

    'para asignar los datos a las propiedades

    For Each row As DataGridViewRow In dgvdetalle.Rows

    Dim article As New EArticulo()

    '

    'Vamos tomando los valores de las celdas del row que estamos

    'recorriendo actualmente y asignamos su valor a la propiedad

    de la clase intanciada

    '

    article.Numero =

    Convert.ToInt32(row.Cells("columnNumero").Value)

    article.Upc = Convert.ToString(row.Cells("columnUpc").Value)

    article.Descripcion =

    Convert.ToString(row.Cells("columnDescripcion").Value)

    article.Piezas =

    Convert.ToDecimal(row.Cells("columnPiezas").Value)

    article.Precio =

    Convert.ToDecimal(row.Cells("columnPrecio").Value)

    article.Importe =

    Convert.ToDecimal(row.Cells("columnImporte").Value)

    '

    'Vamos agregando el Item a la lista del detalle

    '

    invoice.Detail.Add(article)

    Next

    '

    'Creamos una instancia del Formulario que contiene nuestro

    'ReportViewer

    '

    Dim frm As New FacturaRpt()

    '

    'Usamos las propiedades publicas del formulario, aqui es donde

    enviamos el valor'que se mostrara en los parametros creados en el LocalReport,

    para este ejemplo

    'estamos Seteando los valores directamente pero usted puede usar

    algun control

    '

    frm.Titulo = "Este es un ejemplo de Factura"

    frm.Empresa = "Este es un ejemplo del Nombre de la Empresa"

  • 8/10/2019 ReportViewer c#

    29/93

    '

    'Recuerde que invoice es una Lista Generica declarada en

    FacturaRtp, es una lista

    'porque el origen de datos del LocalReport unicamente permite ser

    enlazado a objetos que

    'implementen IEnumerable.

    '

    'Usamos el metod Add porque Invoice es una lista e invoice es una

    entidad simple

    frm.Invoice.Add(invoice)

    '

    'Enviamos el detalle de la Factura, como Detail es una lista e

    invoide.Details tambien

    'es un lista del tipo EArticulo bastara con igualarla

    '

    frm.Detail = invoice.Detail

    frm.Show()

    End Sub

    Private Sub btnImprimir_Click(sender As System.Object, e As

    System.EventArgs) Handles btnImprimir.Click

    InvoiceGenerate()

    End Sub

    End Class

    Ahora solo queda probar nuestra aplicacin:

    Llenamos los datos:

    Presione el botn Imprimir, si sigui al pie de la letra el Articulo tendr un reporte como este:

    http://lh6.ggpht.com/-t2_1MZvnOMU/Uld1L0DDr0I/AAAAAAAAAPc/EiTZ9vL3yIM/s1600-h/l21%255B4%255D.png
  • 8/10/2019 ReportViewer c#

    30/93

    Observe, en el reporte el Formato numrico y Mdena, al igual que no tenemos hojas de mas sindatos

    Ahora, exporte el reporte a Pdf y observe que los mrgenes estn dentro del limite, sin generar

    hojas de mas, ni salirse de los mrgenes:

    Bueno, hemos llegado al final de este tutorial, en un entrega posterior abordaremos las imgenes

    en Reportes Locales y utilizaremos una Bd como fuente de datos para nuestro reporte.

    Saludos desde Monterrey, Nuevo Len Mxico!

    Ejemplo C#

    http://sdrv.ms/1gv6OxGhttp://sdrv.ms/1gv6OxGhttp://lh5.ggpht.com/-596PbYc7zaw/Uld1PHZNapI/AAAAAAAAAP8/_8XtNwZeq_Q/s1600-h/l23%255B8%255D.pnghttp://lh5.ggpht.com/-u6CY9smr2Hw/Uld1Nu93ptI/AAAAAAAAAPs/W1iDnEzKDvY/s1600-h/l22%255B4%255D.pnghttp://lh5.ggpht.com/-596PbYc7zaw/Uld1PHZNapI/AAAAAAAAAP8/_8XtNwZeq_Q/s1600-h/l23%255B8%255D.pnghttp://lh5.ggpht.com/-u6CY9smr2Hw/Uld1Nu93ptI/AAAAAAAAAPs/W1iDnEzKDvY/s1600-h/l22%255B4%255D.pnghttp://sdrv.ms/1gv6OxG
  • 8/10/2019 ReportViewer c#

    31/93

    Ejemplo Vb.Net

    Nota: El pr oyecto fue desarro llado en Vs2010 Ultmate us ando Fram ework 4.0

    Programacin en 3 capasHola a todos:

    Despus de tantos meses de tener abandonado el Blog por fin hoy se libera un espacio en mi

    agenda, tiempo que he decidido compartir con todos y cada uno de ustedes.

    En este articulo hablare y tratare de explicar con los detalles mas mnimos que es la arquitectura 3

    capas, cuales son sus ventajas, como empezar un proyecto 3 capas, cuales son las diferencias

    entre cada una de ellas, como comunicarlas y como crear un proyecto con la arquitectura 3 capas

    utilizando Visual Studio 2012.

    Antes de comenzar a leer este articulo recuerde que: El objetivo no es otro mas que el de orientar

    a los Parvulos .Netsobre la arquitectura de software 3 capas, todo lo escrito en este articulo no es

    ensayado, no es revisado por nadie mas, por lo cual podra contener errores gramaticales y

    sintcticos, el articulo y sus conceptos no pretenden ser la verdad absoluta del tema, sintase en

    confianza de dejar sus comentarios y opiniones en la seccin de comentarios al final del mismo y si

    lo considera prudente enveme un correo electrnico por medio del formulario de contacto y por

    ultimo si el articulo le es de utilidad por favor considere dejar un comentario de agradecimiento.

    Requisitos:Visual Studio 2012, Framework 4.0, el proveedor de datos SqlCompact 4.0 instalado en

    su equipo y muchas ganas de aprender.

    Como siempre recomiendo encarecidamente que antes de descargar los proyectos de ejemplo

    (que les pondr al final de articulo), traten de hacerlo ustedes mismos siguiendo paso a paso todo

    lo que se mencionara aqu, si tienen dudas en uno en especifico no duden en contactarme.

    Dicho todo lo anterior, comencemos

    Arquitectura 3 capas en .Net

    Ha creado usted software?Si?, entonces sabe lo complejo que resulta crear rutinas y

    funciones para cada uno de los formularios, importar todas las referencias del motor de base dedatos en cada uno de los formularios, cambiar cdigo aqu y all (porque tiene copias del mismo

    cdigo en muchos lugares), escribir la lgica de validacin de campos dentro del evento, corregir

    los bugs que pudieran presentarse y no se diga de implementarles mejoras al software, etc., No?

    entonces no se preocupe este es un buen manual de como evitarse muchos dolores de cabeza en

    diseo de su arquitectura a seguir.

    Para que se de una mejor idea de que hablo, por favor descargue este proyecto de ejemplo,

    http://sdrv.ms/H5GSuYhttp://sdrv.ms/H5GSuYhttp://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.htmlhttp://1drv.ms/1uQagughttp://1drv.ms/1uQagughttp://1drv.ms/1uQagughttp://1drv.ms/1uQagughttp://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.htmlhttp://sdrv.ms/H5GSuY
  • 8/10/2019 ReportViewer c#

    32/93

    ejectelo, analice el cdigo, observe como para realizar una misma funcionalidad en dos lugares

    diferentes tuvimos que escribir casi las mismas lneas de cdigo.

    A partir de aqu en adelante estaremos trabajando con el proyecto descargado, aplicndole la

    Arquitectura 3 capas para demostrar como esta Arquitectura de Diseo nos ayuda a:

    Separar responsabilidades, cada capa tiene una funcin especifica y no interviene con lade las dems.

    Reutilizar cdigo

    La separacin de roles en tres capas, hace mas fcil reemplazar o modificar a una, sinafectar a los mdulos restantes

    El cdigo de la capa intermedia puede ser reutilizado por mltiples

    Capacidad de migrar nuestro motor de Base de Datos sin grandes impactos al resto delproyecto.

    Poder cambiar el Front de nuestra aplicacin sin afectar a la lgica de nuestra aplicacin nia la Base de datos

    Bien como ya hemos mencionado La Arquitectura de diseo 3 capas, consiste en dividir el diseo

    del software en sus tres principales componentes:1. La Interfaz o UI (User in terface):Esta Capa es la encargada de interactuar con el

    usuario, es decir, son aquellas ventanas, mensajes, cuadros de dilogos o paginas web

    (en el caso del desarrollo web), que el usuario final utiliza para comunicarse con la

    aplicacin, por medio de esta capa el usuario solicita que se ejecuten las tareas

    proporcionando parmetros de entrada. Esta capa se comunica con la capa de Lgica de

    Negocio, enviando y solicitando informacin y con la capa de Entidades usando sus

    objetos.

    2. La lgica de negocio o Bus iness Logic :Se encarga de implementar, como su

    nombre lo dice, la lgica del negocio, es decir, todo lo que el Software debe de considerar

    antes de realizar una accin o el proceso que debe de seguir despus de realizar una

    accin. Por ejemplo: Antes de solicitar a la capa de Datos la insercin de un grupo deregistros en una tabla, valida que vayan todos los campos mandatorios dentro de esa

    solicitud si esta condicin no se cumple entonces rechaza la insercin e informa del

    usuario del status de su solicitud, solicitar a la base de datos que valide la presencia de un

    registro antes de insertar el siguiente, validar los tipos de datos, etc. esos ejemplos por

    mencionar los mas bsicos y generales. Esta capa recibe de la Capa de Presentacinlas

    solicitudes, valida que las condiciones que establece el negocio se cumplan antes de

    realizar dicha accin o de hacer la respectiva solicitud a la Capa de Acceso a Datos

    3. El acceso a Datos o Data Access:Esta capa es la encargada de la comunicacin

    con la base de datos, en esta capa descansaran todas nuestras acciones CRUD (Create,

    Read, Update y Delete), ser la nica que sabr que motor de base d e datos se esta

    utilizando pero le ser completamente desconocido el front, es decir, jams sabr sinuestra aplicacin es una aplicacin web o desktop. Se encarga de recibir las peticiones de

    la Capa de Lgica de Negocio, ejecutar dichas acciones y devolver el resultado a la misma

    capa.

    4. Capa de Ent idades o Ent i ty L ayer :Aunque aparentemente es una cuarta capa

    realmente no lo es, esta capa se encarga de contener todos aquellos objetos (clases) que

    representan al negocio, y esta es la nica que puede ser instanciada en las 3 capas

    anteriores, es decir, solo ella puede tener comunicacin con el resto pero su funcin se

  • 8/10/2019 ReportViewer c#

    33/93

    limita a nicamente ser un puente de transporte de datos. Esta capa complementa a la

    Capa de Negocio

    Para una mejor compresin de la comunicacin de las 3 capas:

    Hasta aqu, hemos visto la teora de lo que representa la Arquitectura 3 Capas, pero

    Como es que debo representar la Arquitectura 3 Capas en un proyecto de Visual Studio?

    Para haya es a donde vamos.

    1. Abra el Visual Studio 2012 y cree un proyecto Vaco y nmbrelo CSharp-3Capas-Primer

    Entrega

    http://lh4.ggpht.com/-My7ziuED4ZM/VCOWKbAvQtI/AAAAAAAAAd0/Ooia32qrrLU/s1600-h/tres-capas7.png
  • 8/10/2019 ReportViewer c#

    34/93

    2. Dirjase al Explorador de soluciones y haga click derecho sobre el proyecto que acabamos de

    crear:

    3. Del men desplegado seleccione Agregar->Nuevo Proyecto:

    http://lh6.ggpht.com/-qW4h4jw81LA/VCOWQTK5vBI/AAAAAAAAAeU/CrIGvBndcVs/s1600-h/image7.pnghttp://lh4.ggpht.com/-K-NcR7ScQks/VCOWNQ4ziBI/AAAAAAAAAeE/dBFa4ZG_F0E/s1600-h/image3.pnghttp://lh6.ggpht.com/-qW4h4jw81LA/VCOWQTK5vBI/AAAAAAAAAeU/CrIGvBndcVs/s1600-h/image7.pnghttp://lh4.ggpht.com/-K-NcR7ScQks/VCOWNQ4ziBI/AAAAAAAAAeE/dBFa4ZG_F0E/s1600-h/image3.png
  • 8/10/2019 ReportViewer c#

    35/93

    4. Seleccione, Instalado>Visual C#> Windows>Aplicacin de Windows Forms> En el

    campo Nombre escriba, Tienda-Presentacion y presione el botn Aceptar.

    5. Repita el paso 2, 3 y en el 4, seleccione un tipo de proyecto Biblioteca de Clases y establezca

    como nombre Tienda-LogicaNegocio

    6.Repita el paso 2, 3 y en el 4, utilice el nombre Tienda-AccesoDatos

    7. Repita el paso 2, 3 y en el 4 utilice el nombre Tienda-Entidades

    Como va nuestro diseo'?

    http://lh6.ggpht.com/-yEoJaiEW_RY/VCOWXQz5tQI/AAAAAAAAAe0/Ja_1etZTcPM/s1600-h/image23.pnghttp://lh3.ggpht.com/-GHYbeL5Idk0/VCOWTl3Ri1I/AAAAAAAAAek/jM-AlJyngNI/s1600-h/image11.pnghttp://lh6.ggpht.com/-yEoJaiEW_RY/VCOWXQz5tQI/AAAAAAAAAe0/Ja_1etZTcPM/s1600-h/image23.pnghttp://lh3.ggpht.com/-GHYbeL5Idk0/VCOWTl3Ri1I/AAAAAAAAAek/jM-AlJyngNI/s1600-h/image11.png
  • 8/10/2019 ReportViewer c#

    36/93

    Observe que cuando creamos el proyecto principal en automtico se creo un proyecto vaco,

    eliminemos ese proyecto para dejar la siguiente estructura:

    Ahora ya tenemos nuestra estructura completa, observe que creamos 4 proyectos dentro del

    principal (que lo iniciamos como proyecto vaco), recuerde que el proyecto de Entidades en este

    caso Tienda-Entidades no es una capa, mas bien, complementa a la capa de Lgica de Negocio.

    Continuemos con nuestro diseo

    Capa de Entidades

    Recuerde que en esta capa estarn alojados los objetos (clases) con los cuales estaremos

    trabajando, con estos objetos estaremos persistiendo las tablas de la base de datos que

    utilizaremos.

    La base de datos que usaremos contiene una sola tabla llamada Producto la cual contiene 5

    http://lh4.ggpht.com/-MtlT3ZRyRtU/VCOWf0WdtlI/AAAAAAAAAfU/ORSAVsOwCyg/s1600-h/image31.pnghttp://lh4.ggpht.com/-TzMrSL_r2D4/VCOWbNxYjxI/AAAAAAAAAfE/dao0xNy3Rtg/s1600-h/image27.pnghttp://lh4.ggpht.com/-MtlT3ZRyRtU/VCOWf0WdtlI/AAAAAAAAAfU/ORSAVsOwCyg/s1600-h/image31.pnghttp://lh4.ggpht.com/-TzMrSL_r2D4/VCOWbNxYjxI/AAAAAAAAAfE/dao0xNy3Rtg/s1600-h/image27.png
  • 8/10/2019 ReportViewer c#

    37/93

    campos (Id int, Descripcin nvarchar, Marca nvarchar, Precio nvarchar), por lo cual laCapa de

    Entidadescontendr un Objeto llamado Productocon 5 propiedades publicas cada uno de ellos

    respetando el tipo de dato con el cual esta declarado en la base de datos.

    Para declarar nuestra Entidad Producto:

    1. Agregue una clase al proyecto Tienda-Entidades y llmela EProducto (La letra E es por

    convecin, es decir, todos los objetos de nuestra capa de Entidades llevaran la letra E al principio

    para que desde donde las lleguemos a utilizar sepamos que ese Objeto es una Entidad evitando

    con esto confusiones con otros objetos), dentro agregue las siguientes lneas de cdigo:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace Tienda_Entidades

    {

    public class EProducto

    {

    public int Id { get; set; }

    public string Descripcion { get; set; }

    public string Marca { get; set; }

    public decimal Precio { get; set; }

    }

    }

    Si tuviramos mas tablas en nuestra base de datos tendramos que crear la misma cantidad de

    objetos en nuestra capa de Entidades y dentro contendran la misma cantidad de propiedades

    como campos tiene la tabla siempre respetando el tipo de dato con lo que estos campos estn

    declarados.

    Capa de acceso a Datos

    Recordemos que la capa de datos es usada por la capa de lgica y la capa de lgica es llamada

    por la capa de presentacin, as que usaremos ese mismo orden para crear nuestras

    configuraciones y nuestras lneas de cdigo.

    1. Agreguemos un archivo de configuracin (App.Config) a nuestra capa de datos recuerde que

    una de las caractersticas principales del archivo de configuraciones es que podemos establecer

    una cadena de conexin la cual accederemos fcilmente desde cualquier lugar del proyecto que lo

    contiene, que es lo que en esta ocasin nos interesa.

    Nuestro archivo de configuraciones lo tenemos que agregar en nuestro proyecto de presentacin, y

  • 8/10/2019 ReportViewer c#

    38/93

    no porque lo vaya a utilizar sino que nuestro software cada vez que arranque buscara este archivo

    en el directorio desde donde se este ejecutando la aplicacin, para efectos de prueba ser en la

    carpeta ..bin\debug pero cuando nuestro proyecto este instalado, el archivo quedara desplegado

    justo en la carpeta raz de nuestra instalacin junto con el .exe por tal motivo deber de estar en

    el mismo proyecto que esta marcado como proyecto de inicio.

    Para agregar un archivo de configuraciones siga estos pasos:

    - Click derecho sobre el proyecto Tienda-AccesoDatos>Agregar> Nuevo elemento

    2. En el proyecto que descargaron anteriormente si observaron viene embebida un archivo de base

    de datos llamado DataBase1.sdf que noes otra cosa mas que un archivo de base de datos propios

    del motor SQlCompact, cree una carpeta en la unidad C y llmela Proyecto -3Capas, despus

    copien este archivo en ese path.

    3. Abran el archivo de configuraciones desde el Explorador de soluciones, Copien las siguientes

    lneas de cdigo, borren el contenido del App.Config y pguenlas en su lugar:

    http://lh6.ggpht.com/-oI0in6p6AtQ/VCOWjMtaBwI/AAAAAAAAAfk/lynQygggOHs/s1600-h/image35.png
  • 8/10/2019 ReportViewer c#

    39/93

    Observen que el DataSourceapunta a la carpeta que acabamos de crear en la unidad C Data

    Source=C:\Proyecto-3Capas\Database1.sdf", esta cadena en proyetos reales normalmente

    apuntara a un servidor de datos, pero para fines ilustrativos, este directorio nos servir muy bien.

    Volvamos a nuestra Capa de Datos

    4. Agreguemos las referencias a las libreras System.Configurationpara esto, Click sobre nuestra

    capa de datos (proyecto Tienda-AccesoDatos) >Agregar Referencia

    5. Agregue una segunda referencia ahora a System.Data.SqlServeCe(esta librera no siempre

    aparece, si este es su caso presione el botn Examinar localice la Dll dentro de archivos de

    programa y seleccinela), presione Aceptar.

    6. Ya tenemos nuestroApp.Config(en el proyecto de arranque)apuntando a nuestra base de datos

    y tenemos las dos referencias que necesitamos, System.Configurationpara poder accesar y leer el

    archivo de configuraciones y el System.Data.SqlServerCepara poder usar los objetos de acceso a

    http://lh4.ggpht.com/-2Wz88ZyVFQY/VCOWrBXU96I/AAAAAAAAAgE/EZxtdFnh6Ps/s1600-h/image43.pnghttp://lh5.ggpht.com/-i5V9TpQZP_k/VCOWmvBnAOI/AAAAAAAAAf0/XBsD8x7PBlQ/s1600-h/image39.pnghttp://lh4.ggpht.com/-2Wz88ZyVFQY/VCOWrBXU96I/AAAAAAAAAgE/EZxtdFnh6Ps/s1600-h/image43.pnghttp://lh5.ggpht.com/-i5V9TpQZP_k/VCOWmvBnAOI/AAAAAAAAAf0/XBsD8x7PBlQ/s1600-h/image39.png
  • 8/10/2019 ReportViewer c#

    40/93

    datos propios del motor SQLCOMPACT en nuestra Capa de Datos.

    Como nuestra capa de Acceso a Datos, debe de tener la capacidad de Insertar, Leer, Actualizar y

    Eliminar registros de la tabla Productos, requiere de una comunicacin directa con la capa de

    Entidades, para por ejemplo, al momento de que se le solicite la insercin de un Producto en lugar

    de enviarle 5 parmetros con los datos del producto se le envi un Objeto y Cual ser este

    objeto? nada mas y nada menos que nuestro objeto EProductocreado en la capa de Entidades, de

    esta manera ya no trabajaremos con datos sino con objetos llenando, enviando y leyendo

    propiedades.

    Para lograr la comunicacin entre la Capa de Datos y la Capa de Entidades se requiere de la

    referencia de una en la otra, en este caso la referencia de la Capa de Entidades dentro de la Capa

    de Datos, para ello:

    7. Click derecho sobre nuestro proyecto Tienda-AccesoDatos > Agregar Referencia

    8. Solucin> Proyectos> Seleccione Tienda-Entidades

    http://lh3.ggpht.com/-hksyngl4VMo/VCOWy3FQ3PI/AAAAAAAAAgk/68PA2A0iDzc/s1600-h/image8.pnghttp://lh3.ggpht.com/-9kkvTEZ6c90/VCOWvI-HaDI/AAAAAAAAAgU/ESeiBN7PpYI/s1600-h/image41.pnghttp://lh3.ggpht.com/-hksyngl4VMo/VCOWy3FQ3PI/AAAAAAAAAgk/68PA2A0iDzc/s1600-h/image8.pnghttp://lh3.ggpht.com/-9kkvTEZ6c90/VCOWvI-HaDI/AAAAAAAAAgU/ESeiBN7PpYI/s1600-h/image41.png
  • 8/10/2019 ReportViewer c#

    41/93

    Observe como se a creado un nuevo elemento en nuestra carpeta de Referencias del proyecto

    Tienda-AccesoDatos

    9. Inserte una clase nueva llamada ProductoDal de donde Dal vendr de Data Access Layer,

    dentro de la clase que acaba de crear tiene que declarar el espacio de

    nombres System.Configuration, System.Data.SqlServerCey del proyecto de Entidades, adems

    tiene que declarar la clase como publica (para que la Capa de Lgica de Negocio pueda tener

    acceso a ella)

    Ya tenemos el puente de comunicacin entre nuestras Entidades y nuestra Capa de Datos. Solo

    resta comenzar a codificar las acciones que querramos hacer con nuestra tabla Producto, recuerde

    que el objeto ProductoDalnicamente tiene como responsabilidad trabajar con todo aquello

    relacionado con Producto, as que comencemos haciendo la codificacin para Insertar, Traer todos

    los registros existentes en nuestra tabla Producto, Traer, Actualizar y Eliminar por Id.

    Para hacer esta tarea mas sencilla le proporcionare el cdigo que deber de poner en la clase

    ProductoDal, pero, trate de escribirel cdigo para vaya analizando la estructura del mismo.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    http://lh6.ggpht.com/-REBpidNkxBs/VCOW5HPy-2I/AAAAAAAAAhE/kR5htDX60h0/s1600-h/image201.pnghttp://lh3.ggpht.com/-zc3WxHHrNLE/VCOW2Hj3EQI/AAAAAAAAAg0/7A3uN60-L7c/s1600-h/image12.pnghttp://lh6.ggpht.com/-REBpidNkxBs/VCOW5HPy-2I/AAAAAAAAAhE/kR5htDX60h0/s1600-h/image201.pnghttp://lh3.ggpht.com/-zc3WxHHrNLE/VCOW2Hj3EQI/AAAAAAAAAg0/7A3uN60-L7c/s1600-h/image12.png
  • 8/10/2019 ReportViewer c#

    42/93

    //nuestras importaciones del Espacio de nombres que estaremos utilizando,

    //recuerde que estas son las referencias que realizamos hace unos

    momentos...

    using System.Configuration;

    using System.Data.SqlServerCe;

    using Tienda_Entidades;

    namespace Tienda_AccesoDatos

    {

    //Definimos el acceso de nuestra clase como public, asegurando con

    esto su accesibilidad desde

    //otros proyectos.

    public class ProductoDal

    {

    //Primero y siguiendo el orden de las acciones CRUD

    //Crearemos un Mtodo que se encarga de insertar un nuevo

    Producto es nuestra tabla Producto

    ///

    /// Inserta un nuevo Producto en la tabla Producto

    ///

    /// Entidad contenedora de los valores a

    insertar

    /// Jos Luis Garca Bautista

    public void Insert(EProducto producto)

    {

    //Creamos nuestro objeto de conexion usando nuestro archivo

    de configuraciones

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    //Declaramos nuestra consulta de Accin Sql parametrizada

    const string sqlQuery =

    "INSERT INTO Producto (Descripcion, Marca, Precio)

    VALUES (@descripcion, @marca, @precio)";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlQuery,

    cnx))

    {

    //El primero de los cambios significativos con

    respecto al ejemplo descargado es que aqui...//ya no leeremos controles sino usaremos las

    propiedades del Objeto EProducto de nuestra capa

    //de entidades...

    cmd.Parameters.AddWithValue("@descripcion",

    producto.Descripcion);

    cmd.Parameters.AddWithValue("@marca",

    producto.Marca);

  • 8/10/2019 ReportViewer c#

    43/93

    cmd.Parameters.AddWithValue("@precio",

    producto.Precio);

    cmd.ExecuteNonQuery();

    }

    }

    }

    ///

    /// Devuelve una lista de Productos ordenados por el campo Id de

    manera Ascendente

    ///

    /// Lista de productos

    /// Jos Luis Garca Bautista

    public List GetAll()

    {

    //Declaramos una lista del objeto EProducto la cual ser la

    encargada de

    //regresar una coleccin de los elementos que se obtengan de

    la BD

    //

    //La lista substituye a DataTable utilizado en el proyecto de

    ejemplo

    List productos = new List();

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    const string sqlQuery = "SELECT * FROM Producto ORDER BY

    Id ASC";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlQuery,

    cnx))

    {

    SqlCeDataReader dataReader = cmd.ExecuteReader();

    //

    //Preguntamos si el DataReader fue devuelto con datos

    while (dataReader.Read()){

    //

    //Instanciamos al objeto Eproducto para llenar

    sus propiedades

    EProducto producto = new EProducto

    {

  • 8/10/2019 ReportViewer c#

    44/93

    Id =

    Convert.ToInt32(dataReader["Id"]),

    Descripcion =

    Convert.ToString(dataReader["Descripcion"]),

    Marca =

    Convert.ToString(dataReader["Marca"]),

    Precio =

    Convert.ToDecimal(dataReader["Precio"])

    };

    //

    //Insertamos el objeto Producto dentro de la

    lista Productos

    productos.Add(producto);

    }

    }

    }

    return productos;

    }

    ///

    /// Devuelve un Objeto Producto

    ///

    /// Id del producto a buscar

    /// Un registro con los valores del Producto

    /// Jos Luis Garca Bautista

    public EProducto GetByid(int idProducto)

    {

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    const string sqlGetById = "SELECT * FROM Producto WHERE

    Id = @id";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlGetById,

    cnx))

    {

    //

    //Utilizamos el valor del parmetro idProducto paraenviarlo al parmetro declarado en la consulta

    //de seleccin SQL

    cmd.Parameters.AddWithValue("@id", idProducto);

    SqlCeDataReader dataReader = cmd.ExecuteReader();

    if (dataReader.Read())

    {

    EProducto producto = new EProducto

  • 8/10/2019 ReportViewer c#

    45/93

    {

    Id = Convert.ToInt32(dataReader["Id"]),

    Descripcion =

    Convert.ToString(dataReader["Descripcion"]),

    Marca =

    Convert.ToString(dataReader["Marca"]),

    Precio =

    Convert.ToDecimal(dataReader["Precio"])

    };

    return producto;

    }

    }

    }

    return null;

    }

    ///

    /// Actualiza el Producto correspondiente al Id proporcionado

    ///

    /// Valores utilizados para hacer el

    Update al registro

    /// Jos Luis Garca Bautista

    public void Update(EProducto producto)

    {

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    const string sqlQuery =

    "UPDATE Producto SET Descripcion = @descripcion,

    Marca = @marca, Precio = @precio WHERE Id = @id";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlQuery,

    cnx))

    {

    cmd.Parameters.AddWithValue("@descripcion",

    producto.Descripcion);

    cmd.Parameters.AddWithValue("@marca",producto.Marca);

    cmd.Parameters.AddWithValue("@precio",

    producto.Precio);

    cmd.Parameters.AddWithValue("@id", producto.Id);

    cmd.ExecuteNonQuery();

    }

  • 8/10/2019 ReportViewer c#

    46/93

    }

    }

    ///

    /// Elimina un registro coincidente con el Id Proporcionado

    ///

    /// Id del registro a Eliminar

    /// Jos Luis Garca Bautista

    public void Delete(int idproducto)

    {

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    const string sqlQuery = "DELETE FROM Producto WHERE Id =

    @id";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlQuery,

    cnx))

    {

    cmd.Parameters.AddWithValue("@id", idproducto);

    cmd.ExecuteNonQuery();

    }

    }

    }

    }

    }

    Observe como desde nuestros diferentes Mtodos y funciones estamos haciendo uso del

    objeto EProductodeclarado en la capa de EntidadesObserve tambin como nuestra

    clase ProductosDalno valida que el valor de las propiedades de EProductocontengan datos o

    sean del tipo de dato correcto porque ese es trabajo de?La Capa de Lgica de Negocio

    Capa de Lgica de Negocio

    Recuerde que la capa de Lgica es la encargada de establecer toda la lgica que el negocio

    establece para llevar a cabo una accin o despus de haber realizado un proceso, y esta se

    comunica directamente con la Capa de Acceso a Datos, por lo cual tenemos que hacer la

    referencia al Proyecto Tienda-AccesoDatos y para ello:

    1. Click derecho sobre nuestro proyecto Tienda-LogicaNegocio > Agregar Referencia

  • 8/10/2019 ReportViewer c#

    47/93

    8.Solucin> Proyectos> Seleccione Tienda-AccesoDatos y Tienda-Entidades

    Observe como se acaban de agregar nuestras referencias:

    http://lh5.ggpht.com/-bi-gim7oMSw/VCOXAmcbE1I/AAAAAAAAAhk/vjlzWUF6FpA/s1600-h/image16.pnghttp://lh3.ggpht.com/-1CGsXKxn5CE/VCOW84qYwlI/AAAAAAAAAhU/m0T4QqWte2M/s1600-h/image4%255B1%255D.pnghttp://lh5.ggpht.com/-bi-gim7oMSw/VCOXAmcbE1I/AAAAAAAAAhk/vjlzWUF6FpA/s1600-h/image16.pnghttp://lh3.ggpht.com/-1CGsXKxn5CE/VCOW84qYwlI/AAAAAAAAAhU/m0T4QqWte2M/s1600-h/image4%255B1%255D.png
  • 8/10/2019 ReportViewer c#

    48/93

    9. Agregue una nueva clase y llmela ProductoBol, haga losusingde las referencias que

    acabamos de crear, establezca el nivel de acceso como publicy copie la siguiente estructura de

    cdigo:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    //

    //Hacemos las importaciones del espacio de nombres de los dos proyectos

    que referenciamos

    //observe como esta capa solo referencio a Tienda-AccessData y no a

    Tienda-Presentacion

    //observe tambin como aqu no es requerida la referencia a

    System.Data.SqlServerCe

    using Tienda_AccesoDatos;

    using Tienda_Entidades;

    namespace Tienda_LogicaNegocio

    {

    public class ProductoBol

    {

    //Instanciamos nuestra clase ProductoDal para poder utilizar sus

    miembros

    private ProductoDal _productoDal = new ProductoDal();

    //

    //El uso de la clase StringBuilder nos ayudara a devolver los

    mensajes de las validaciones

    public readonly StringBuilder stringBuilder = new StringBuilder();

    http://lh6.ggpht.com/-z0ALzjSwXdY/VCOXCgkkqZI/AAAAAAAAAh0/2QUDXiXpnOM/s1600-h/image20%255B1%255D.png
  • 8/10/2019 ReportViewer c#

    49/93

    //

    //Creamos nuestro mtodo para Insertar un nuevo Producto, observe

    como este mtodo tampoco valida los el contenido

    //de las propiedades, sino que manda a llamar a una Funcin que

    tiene como tarea nica hacer esta validacin

    //

    public void Registrar(EProducto producto)

    {

    if(ValidarProducto(producto))

    {

    if (_productoDal.GetByid(producto.Id) == null)

    {

    _productoDal.Insert(producto);

    }

    else

    _productoDal.Update(producto);

    }

    }

    public List Todos()

    {

    return _productoDal.GetAll();

    }

    public EProducto TraerPorId(int idProduct)

    {

    stringBuilder.Clear();

    if (idProduct == 0) stringBuilder.Append("Por favor

    proporcione un valor de Id valido");

    if(stringBuilder.Length == 0)

    {

    return _productoDal.GetByid(idProduct);

    }

    return null;

    }

    public void Eliminar(int idProduct)

    {

    stringBuilder.Clear();

    if (idProduct == 0) stringBuilder.Append("Por favor

    proporcione un valor de Id valido");

  • 8/10/2019 ReportViewer c#

    50/93

    if (stringBuilder.Length == 0)

    {

    _productoDal.Delete(idProduct);

    }

    }

    private bool ValidarProducto(EProducto producto)

    {

    stringBuilder.Clear();

    if (string.IsNullOrEmpty(producto.Descripcion))

    stringBuilder.Append("El campo Descripcin es obligatorio");

    if (string.IsNullOrEmpty(producto.Marca))

    stringBuilder.Append(Environment.NewLine + "El campo Marca es

    obligatorio");

    if (producto.Precio

  • 8/10/2019 ReportViewer c#

    51/93

    11. En el formulario que tenemos por default llamado Form1 disee una interfaz como la

    siguiente:

    12. Observe las siguientes lneas de cdigo, genere los eventos involucrados y copie el cdigo de

    ejemplo:

    using System;

    using System.Collections.Generic;

    http://lh5.ggpht.com/-dM9vOgYhx_c/VCOaJ8peqxI/AAAAAAAAAio/wXJTdt4OE7o/s1600-h/image%255B4%255D.pnghttp://lh3.ggpht.com/-ZTVyf-vHKhA/VCOXFY_Kt3I/AAAAAAAAAiE/D6dqG1DkWAg/s1600-h/image24.pnghttp://lh5.ggpht.com/-dM9vOgYhx_c/VCOaJ8peqxI/AAAAAAAAAio/wXJTdt4OE7o/s1600-h/image%255B4%255D.pnghttp://lh3.ggpht.com/-ZTVyf-vHKhA/VCOXFY_Kt3I/AAAAAAAAAiE/D6dqG1DkWAg/s1600-h/image24.png
  • 8/10/2019 ReportViewer c#

    52/93

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;

    //

    //Hacemos las importaciones del espacio de nombres de los dos proyectos

    que referenciamos

    //observe como esta capa solo referencio a Tienda-LogicNegocio y a

    Tienda-Entidades

    //observe como no se referencia a la clase de acceso a Datos

    using Tienda_LogicaNegocio;

    using Tienda_Entidades;

    namespace Tienda_Presentacion

    {

    public partial class Form1 : Form

    {

    //

    //

    //Creamos las instancias de la clase Eproducto y ProductoBol

    private EProducto _producto;

    private readonly ProductoBol _productoBol = new ProductoBol();

    public Form1()

    {

    InitializeComponent();

    }

    //

    //Creamos los mtodos generales llenando y leyendo objetos

    //

    private void Guardar()

    {

    try

    {

    if (_producto == null) _producto = new EProducto();

    _producto.Id = Convert.ToInt32(txtId.Text);_producto.Descripcion = txtDescripcion.Text;

    _producto.Marca = txtMarca.Text;

    _producto.Precio = Convert.ToDecimal(txtPrecio.Text);

    _productoBol.Registrar(_producto);

    if (_productoBol.stringBuilder.Length != 0)

  • 8/10/2019 ReportViewer c#

    53/93

    {

    MessageBox.Show(_productoBol.stringBuilder.ToString(), "Para

    continuar:");

    }

    else

    {

    MessageBox.Show("Producto registrado/actualizado con

    xito");

    TraerTodos();

    }

    }

    catch (Exception ex)

    {

    MessageBox.Show(string.Format("Error: {0}", ex.Message),

    "Error inesperado");

    }

    }

    private void TraerTodos()

    {

    List productos = _productoBol.Todos();

    if (productos.Count > 0)

    {

    dgvDatos.AutoGenerateColumns = false;

    dgvDatos.DataSource = productos;

    dgvDatos.Columns["columnId"].DataPropertyName = "Id";

    dgvDatos.Columns["columnDescripcion"].DataPropertyName =

    "Descripcion";

    dgvDatos.Columns["columnMarca"].DataPropertyName =

    "Marca";

    dgvDatos.Columns["columnPrecio"].DataPropertyName =

    "Precio";

    }

    else

    MessageBox.Show("No existen producto Registrado");

    }

    private void TraerPorId(int id)

    {

    try

    {

    _producto = _productoBol.TraerPorId(id);

    if (_producto != null)

  • 8/10/2019 ReportViewer c#

    54/93

    {

    txtId.Text = Convert.ToString(_producto.Id);

    txtDescripcion.Text = _producto.Descripcion;

    txtMarca.Text = _producto.Marca;

    txtPrecio.Text = Convert.ToString(_producto.Precio);

    }

    else

    MessageBox.Show("El Producto solicitado no existe");

    }

    catch (Exception ex)

    {

    MessageBox.Show(string.Format("Error: {0}", ex.Message),

    "Error inesperado");

    }

    }

    private void Eliminar(int id)

    {

    try

    {

    _productoBol.Eliminar(id);

    MessageBox.Show("Producto eliminado satisfactoriamente");

    TraerTodos();

    }

    catch (Exception ex)

    {

    MessageBox.Show(string.Format("Error: {0}", ex.Message),

    "Error inesperado");

    }

    }

    //

    //

    //Usamos nuestros metodos y funciones generales, observe como no

    hemos repetido codigo en ningun lado

    //haciendo con esto que nuestras tareas de actualizacion sean mas

    sencillas para nosotros o para

    //al asignado en realizarlas...private void btnAgregar_Click(object sender, EventArgs e)

    {

    Guardar();

    }

    private void txtId_KeyDown(object sender, KeyEventArgs e)

    {

  • 8/10/2019 ReportViewer c#

    55/93

    if (e.KeyData == Keys.Enter &&

    !string.IsNullOrWhiteSpace(txtId.Text))

    {

    e.SuppressKeyPress = true;

    TraerPorId(Convert.ToInt32(txtId.Text));

    }

    }

    private void txtPrecio_KeyDown(object sender, KeyEventArgs e)

    {

    if (e.KeyData == Keys.Enter)

    {

    e.SuppressKeyPress = true;

    Guardar();

    }

    }

    private void btbnBuscar_Click(object sender, EventArgs e)

    {

    if (!string.IsNullOrWhiteSpace(txtId.Text))

    {

    TraerPorId(Convert.ToInt32(txtId.Text));

    }

    }

    private void btnEliminar_Click(object sender, EventArgs e)

    {

    if (!string.IsNullOrWhiteSpace(txtId.Text))

    {

    Eliminar(Convert.ToInt32(txtId.Text));

    }

    }

    }

    }

    De nuevo observe como esta capa desconoce si existe una capa de Datos y mucho menos que

    motor de base de datos se utiliza, tampoco se encarga de implementar las reglas de validacin ni

    de lgica de negocio, su tarea es interactuar con el usuario pidiendo y desplegando informacin.

    Que es lo que falta?

    Solo nos resta probar el proyectopero eso, ser tarea suyaEjecute el proyecto, inserte un

    nuevo registro, busque un registro por id, edite su informacin, elimine un producto, depure el

    cdigo lnea a lnea para viva de paso a paso como es que va pasando de capa de capa enviando

    y trayendo informacin.

  • 8/10/2019 ReportViewer c#

    56/93

    Aqu termina nuestro articulo sobre Arquitectura 3 Capas, espero haya sido de su agrado y que la

    explicacin haya sido lo bastante clara, en caso de que tenga alguna duda por favor deje su

    pregunta en la seccin de comentarios o escrbame por medio del formulario de contacto.

    Escribir este articulo me llevo mas de 4 horas, dejar un comentario de agradecimiento le tomara 5

    minutos.

    Saludos desde Monterrey, Nuevo Len Mxico!

    Ejemplo C#

    Ejemplo Vb.Net

    Programacin en 3 capasHola a todos:

    Despus de tantos meses de tener abandonado el Blog por fin hoy se libera un espacio en mi

    agenda, tiempo que he decidido compartir con todos y cada uno de ustedes.

    En este articulo hablare y tratare de explicar con los detalles mas mnimos que es la arquitectura 3

    capas, cuales son sus ventajas, como empezar un proyecto 3 capas, cuales son las diferencias

    entre cada una de ellas, como comunicarlas y como crear un proyecto con la arquitectura 3 capas

    utilizando Visual Studio 2012.

    Antes de comenzar a leer este articulo recuerde que: El objetivo no es otro mas que el de orientar

    a los Parvulos .Netsobre la arquitectura de software 3 capas, todo lo escrito en este articulo no es

    ensayado, no es revisado por nadie mas, por lo cual podra contener errores gramaticales y

    sintcticos, el articulo y sus conceptos no pretenden ser la verdad absoluta del tema, sintase en

    confianza de dejar sus comentarios y opiniones en la seccin de comentarios al final del mismo y si

    lo considera prudente enveme un correo electrnico por medio del formulario de contacto y por

    ultimo si el articulo le es de utilidad por favor considere dejar un comentario de agradecimiento.

    Requisitos:Visual Studio 2012, Framework 4.0, el proveedor de datos SqlCompact 4.0 instalado en

    su equipo y muchas ganas de aprender.

    Como siempre recomiendo encarecidamente que antes de descargar los proyectos de ejemplo

    (que les pondr al final de articulo), traten de hacerlo ustedes mismos siguiendo paso a paso todo

    lo que se mencionara aqu, si tienen dudas en uno en especifico no duden en contactarme.

    Dicho todo lo anterior, comencemos

    Arquitectura 3 capas en .Net

    Ha creado usted software?Si?, entonces sabe lo complejo que resulta crear rutinas y

    http://1drv.ms/ZOBje3http://1drv.ms/ZOBje3http://1drv.ms/1mBZ1Vhhttp://1drv.ms/1mBZ1Vhhttp://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.htmlhttp://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.htmlhttp://1drv.ms/1mBZ1Vhhttp://1drv.ms/ZOBje3
  • 8/10/2019 ReportViewer c#

    57/93

    funciones para cada uno de los formularios, importar todas las referencias del motor de base de

    datos en cada uno de los formularios, cambiar cdigo aqu y all (porque tiene copias del mismo

    cdigo en muchos lugares), escribir la lgica de validacin de campos dentro del evento, corregir

    los bugs que pudieran presentarse y no se diga de implementarles mejoras al software, etc., No?

    entonces no se preocupe este es un buen manual de como evitarse muchos dolores de cabeza en

    diseo de su arquitectura a seguir.

    Para que se de una mejor idea de que hablo, por favor descargue este proyecto de ejemplo,

    ejectelo, analice el cdigo, observe como para realizar una misma funcionalidad en dos lugares

    diferentes tuvimos que escribir casi las mismas lneas de cdigo.

    A partir de aqu en adelante estaremos trabajando con el proyecto descargado, aplicndole la

    Arquitectura 3 capas para demostrar como esta Arquitectura de Diseo nos ayuda a:

    Separar responsabilidades, cada capa tiene una funcin especifica y no interviene con lade las dems.

    Reutilizar cdigo

    La separacin de roles en tres capas, hace mas fcil reemplazar o modificar a una, sin

    afectar a los mdulos restantes

    El cdigo de la capa intermedia puede ser reutilizado por mltiples

    Capacidad de migrar nuestro motor de Base de Datos sin grandes impactos al resto delproyecto.

    Poder cambiar el Front de nuestra aplicacin sin afectar a la lgica de nuestra aplicacin nia la Base de datos

    Bien como ya hemos mencionado La Arquitectura de diseo 3 capas, consiste en dividir el diseo

    del software en sus tres principales componentes:

    1. La Interfaz o UI (User in terface):Esta Capa es la encargada de interactuar con el

    usuario, es decir, son aquellas ventanas, mensajes, cuadros de dilogos o paginas web

    (en el caso del desarrollo web), que el usuario final utiliza para comunicarse con la

    aplicacin, por medio de esta capa el usuario solicita que se ejecuten las tareas

    proporcionando parmetros de entrada. Esta capa se comunica con la capa de Lgica de

    Negocio, enviando y solicitando informacin y con la capa de Entidades usando sus

    objetos.

    2. La lgica de negocio o Bus iness Logic :Se encarga de implementar, como su

    nombre lo dice, la lgica del negocio, es decir, todo lo que el Software debe de considerar

    antes de realizar una accin o el proceso que debe de seguir despus de realizar una

    accin. Por ejemplo: Antes de solicitar a la capa de Datos la insercin de un grupo de

    registros en una tabla, valida que vayan todos los campos mandatorios dentro de esa

    solicitud si esta condicin no se cumple entonces rechaza la insercin e informa del

    usuario del status de su solicitud, solicitar a la base de datos que valide la presencia de un

    registro antes de insertar el siguiente, validar los tipos de datos, etc. esos ejemplos por

    mencionar los mas bsicos y generales. Esta capa recibe de la Capa de Presentacinlas

    solicitudes, valida que las condiciones que establece el negocio se cumplan antes de

    realizar dicha accin o de hacer la respectiva solicitud a la Capa de Acceso a Datos

    3. El acceso a Datos o Data Access:Esta capa es la encargada de la comunicacin

    con la base de datos, en esta capa descansaran todas nuestras acciones CRUD (Create,

    Read, Update y Delete), ser la nica que sabr que motor de base de datos se esta

    utilizando pero le ser completamente desconocido el front, es decir, jams sabr si

    http://1drv.ms/1uQagughttp://1drv.ms/1uQagughttp://1drv.ms/1uQagughttp://1drv.ms/1uQagug
  • 8/10/2019 ReportViewer c#

    58/93

    nuestra aplicacin es una aplicacin web o desktop. Se encarga de recibir las peticiones de

    la Capa de Lgica de Negocio, ejecutar dichas acciones y devolver el resultado a la misma

    capa.

    4. Capa de Ent idades o Ent i ty L ayer :Aunque aparentemente es una cuarta capa

    realmente no lo es, esta capa se encarga de contener todos aquellos objetos (clases) que

    representan al negocio, y esta es la nica que puede ser instanciada en las 3 capasanteriores, es decir, solo ella puede tener comunicacin con el resto pero su funcin se

    limita a nicamente ser un puente de transporte de datos. Esta capa complementa a la

    Capa de Negocio

    Para una mejor compresin de la comunicacin de las 3 capas:

    Hasta aqu, hemos visto la teora de lo que representa la Arquitectura 3 Capas, pero

    Como es que debo representar la Arquitectura 3 Capas en un proyecto de Visual Studio?

    Para haya es a donde vamos.

    1. Abra el Visual Studio 2012 y cree un proyecto Vaco y nmbrelo CSharp-3Capas-Primer

    Entrega

    http://lh4.ggpht.com/-My7ziuED4ZM/VCOWKbAvQtI/AAAAAAAAAd0/Ooia32qrrLU/s1600-h/tres-capas7.png
  • 8/10/2019 ReportViewer c#

    59/93

    2. Dirjase al Explorador de soluciones y haga click derecho sobre el proyecto que acabamos de

    crear:

    3. Del men desplegado seleccione Agregar->Nuevo Proyecto:

    http://lh6.ggpht.com/-qW4h4jw81LA/VCOWQTK5vBI/AAAAAAAAAeU/CrIGvBndcVs/s1600-h/image7.pnghttp://lh4.ggpht.com/-K-NcR7ScQks/VCOWNQ4ziBI/AAAAAAAAAeE/dBFa4ZG_F0E/s1600-h/image3.pnghttp://lh6.ggpht.com/-qW4h4jw81LA/VCOWQTK5vBI/AAAAAAAAAeU/CrIGvBndcVs/s1600-h/image7.pnghttp://lh4.ggpht.com/-K-NcR7ScQks/VCOWNQ4ziBI/AAAAAAAAAeE/dBFa4ZG_F0E/s1600-h/image3.png
  • 8/10/2019 ReportViewer c#

    60/93

    4. Seleccione, Instalado>Visual C#> Windows>Aplicacin de Windows Forms> En el

    campo Nombre escriba, Tienda-Presentacion y presione el botn Aceptar.

    5. Repita el paso 2, 3 y en el 4, seleccione un tipo de proyecto Biblioteca de Clases y establezca

    como nombre Tienda-LogicaNegocio

    6.Repita el paso 2, 3 y en el 4, utilice el nombre Tienda-AccesoDatos

    7. Repita el paso 2, 3 y en el 4 utilice el nombre Tienda-Entidades

    Como va nuestro diseo'?

    http://lh6.ggpht.com/-yEoJaiEW_RY/VCOWXQz5tQI/AAAAAAAAAe0/Ja_1etZTcPM/s1600-h/image23.pnghttp://lh3.ggpht.com/-GHYbeL5Idk0/VCOWTl3Ri1I/AAAAAAAAAek/jM-AlJyngNI/s1600-h/image11.pnghttp://lh6.ggpht.com/-yEoJaiEW_RY/VCOWXQz5tQI/AAAAAAAAAe0/Ja_1etZTcPM/s1600-h/image23.pnghttp://lh3.ggpht.com/-GHYbeL5Idk0/VCOWTl3Ri1I/AAAAAAAAAek/jM-AlJyngNI/s1600-h/image11.png
  • 8/10/2019 ReportViewer c#

    61/93

    Observe que cuando creamos el proyecto principal en automtico se creo un proyecto vaco,

    eliminemos ese proyecto para dejar la siguiente estructura:

    Ahora ya tenemos nuestra estructura completa, observe que creamos 4 proyectos dentro del

    principal (que lo iniciamos como proyecto vaco), recuerde que el proyecto de Entidades en este

    caso Tienda-Entidades no es una capa, mas bien, complementa a la capa de Lgica de Negocio.

    Continuemos con nuestro diseo

    Capa de Entidades

    Recuerde que en esta capa estarn alojados los objetos (clases) con los cuales estaremos

    trabajando, con estos objetos estaremos persistiendo las tablas de la base de datos que

    utilizaremos.

    La base de datos que usaremos contiene una sola tabla llamada Producto la cual contiene 5

    http://lh4.ggpht.com/-MtlT3ZRyRtU/VCOWf0WdtlI/AAAAAAAAAfU/ORSAVsOwCyg/s1600-h/image31.pnghttp://lh4.ggpht.com/-TzMrSL_r2D4/VCOWbNxYjxI/AAAAAAAAAfE/dao0xNy3Rtg/s1600-h/image27.pnghttp://lh4.ggpht.com/-MtlT3ZRyRtU/VCOWf0WdtlI/AAAAAAAAAfU/ORSAVsOwCyg/s1600-h/image31.pnghttp://lh4.ggpht.com/-TzMrSL_r2D4/VCOWbNxYjxI/AAAAAAAAAfE/dao0xNy3Rtg/s1600-h/image27.png
  • 8/10/2019 ReportViewer c#

    62/93

    campos (Id int, Descripcin nvarchar, Marca nvarchar, Precio nvarchar), por lo cual laCapa de

    Entidadescontendr un Objeto llamado Productocon 5 propiedades publicas cada uno de ellos

    respetando el tipo de dato con el cual esta declarado en la base de datos.

    Para declarar nuestra Entidad Producto:

    1. Agregue una clase al proyecto Tienda-Entidades y llmela EProducto (La letra E es por

    convecin, es decir, todos los objetos de nuestra capa de Entidades llevaran la letra E al principio

    para que desde donde las lleguemos a utilizar sepamos que ese Objeto es una Entidad evitando

    con esto confusiones con otros objetos), dentro agregue las siguientes lneas de cdigo:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace Tienda_Entidades

    {

    public class EProducto

    {

    public int Id { get; set; }

    public string Descripcion { get; set; }

    public string Marca { get; set; }

    public decimal Precio { get; set; }

    }

    }

    Si tuviramos mas tablas en nuestra base de datos tendramos que crear la misma cantidad deobjetos en nuestra capa de Entidades y dentro contendran la misma cantidad de propiedades

    como campos tiene la tabla siempre respetando el tipo de dato con lo que estos campos estn

    declarados.

    Capa de acceso a Datos

    Recordemos que la capa de datos es usada por la capa de lgica y la capa de lgica es llamada

    por la capa de presentacin, as que usaremos ese mismo orden para crear nuestras

    configuraciones y nuestras lneas de cdigo.

    1. Agreguemos un archivo de configuracin (App.Config) a nuestra capa de datos recuerde queuna de las caractersticas principales del archivo de configuraciones es que podemos establecer

    una cadena de conexin la cual accederemos fcilmente desde cualquier lugar del proyecto que lo

    contiene, que es lo que en esta ocasin nos interesa.

    Nuestro archivo de configuraciones lo tenemos que agregar en nuestro proyecto de presentacin, y

    no porque lo vaya a utilizar sino que nuestro software cada vez que arranque buscara este archivo

    en el directorio desde donde se este ejecutando la aplicacin, para efectos de prueba ser en la

  • 8/10/2019 ReportViewer c#

    63/93

    carpeta ..bin\debug pero cuando nuestro proyecto este instalado, el archivo quedara desplegado

    justo en la carpeta raz de nuestra instalacin junto con el .exe por tal motivo deber de estar en

    el mismo proyecto que esta marcado como proyecto de inicio.

    Para agregar un archivo de configuraciones siga estos pasos:

    - Click derecho sobre el proyecto Tienda-AccesoDatos>Agregar> Nuevo elemento

    2. En el proyecto que descargaron anteriormente si observaron viene embebida un archivo de base

    de datos llamado DataBase1.sdf que noes otra cosa mas que un archivo de base de datos propios

    del motor SQlCompact, cree una carpeta en la unidad C y llmela Proyecto -3Capas, despus

    copien este archivo en ese path.

    3. Abran el archivo de configuraciones desde el Explorador de soluciones, Copien las siguientes

    lneas de cdigo, borren el contenido del App.Config y pguenlas en su lugar:

    http://lh6.ggpht.com/-oI0in6p6AtQ/VCOWjMtaBwI/AAAAAAAAAfk/lynQygggOHs/s1600-h/image35.png
  • 8/10/2019 ReportViewer c#

    64/93

    Observen que el DataSourceapunta a la carpeta que acabamos de crear en la unidad C Data

    Source=C:\Proyecto-3Capas\Database1.sdf", esta cadena en proyetos reales normalmente

    apuntara a un servidor de datos, pero para fines ilustrativos, este directorio nos servir muy bien.

    Volvamos a nuestra Capa de Datos

    4. Agreguemos las referencias a las libreras System.Configurationpara esto, Click sobre nuestra

    capa de datos (proyecto Tienda-AccesoDatos) >Agregar Referencia

    5. Agregue una segunda referencia ahora a System.Data.SqlServeCe(esta librera no siempre

    aparece, si este es su caso presione el botn Examinar localice la Dll dentro de archivos de

    programa y seleccinela), presione Aceptar.

    6. Ya tenemos nuestroApp.Config(en el proyecto de arranque)apuntando a nuestra base de datos

    y tenemos las dos referencias que necesitamos, System.Configurationpara poder accesar y leer el

    archivo de configuraciones y el System.Data.SqlServerCepara poder usar los objetos de acceso a

    datos propios del motor SQLCOMPACT en nuestra Capa de Datos.

    http://lh4.ggpht.com/-2Wz88ZyVFQY/VCOWrBXU96I/AAAAAAAAAgE/EZxtdFnh6Ps/s1600-h/image43.pnghttp://lh5.ggpht.com/-i5V9TpQZP_k/VCOWmvBnAOI/AAAAAAAAAf0/XBsD8x7PBlQ/s1600-h/image39.pnghttp://lh4.ggpht.com/-2Wz88ZyVFQY/VCOWrBXU96I/AAAAAAAAAgE/EZxtdFnh6Ps/s1600-h/image43.pnghttp://lh5.ggpht.com/-i5V9TpQZP_k/VCOWmvBnAOI/AAAAAAAAAf0/XBsD8x7PBlQ/s1600-h/image39.png
  • 8/10/2019 ReportViewer c#

    65/93

    Como nuestra capa de Acceso a Datos, debe de tener la capacidad de Insertar, Leer, Actualizar y

    Eliminar registros de la tabla Productos, requiere de una comunicacin directa con la capa de

    Entidades, para por ejemplo, al momento de que se le solicite la insercin de un Producto en lugar

    de enviarle 5 parmetros con los datos del producto se le envi un Objeto y Cual ser este

    objeto? nada mas y nada menos que nuestro objetoEProducto

    creado en la capa de Entidades, de

    esta manera ya no trabajaremos con datos sino con objetos llenando, enviando y leyendo

    propiedades.

    Para lograr la comunicacin entre la Capa de Datos y la Capa de Entidades se requiere de la

    referencia de una en la otra, en este caso la referencia de la Capa de Entidades dentro de la Capa

    de Datos, para ello:

    7. Click derecho sobre nuestro proyecto Tienda-AccesoDatos > Agregar Referencia

    8. Solucin> Proyectos> Seleccione Tienda-Entidades

    Observe como se a creado un nuevo elemento en nuestra carpeta de Referencias del proyecto

    http://lh3.ggpht.com/-hksyngl4VMo/VCOWy3FQ3PI/AAAAAAAAAgk/68PA2A0iDzc/s1600-h/image8.pnghttp://lh3.ggpht.com/-9kkvTEZ6c90/VCOWvI-HaDI/AAAAAAAAAgU/ESeiBN7PpYI/s1600-h/image41.pnghttp://lh3.ggpht.com/-hksyngl4VMo/VCOWy3FQ3PI/AAAAAAAAAgk/68PA2A0iDzc/s1600-h/image8.pnghttp://lh3.ggpht.com/-9kkvTEZ6c90/VCOWvI-HaDI/AAAAAAAAAgU/ESeiBN7PpYI/s1600-h/image41.png
  • 8/10/2019 ReportViewer c#

    66/93

    Tienda-AccesoDatos

    9. Inserte una clase nueva llamada ProductoDal de donde Dal vendr de Data Access Layer,

    dentro de la clase que acaba de crear tiene que declarar el espacio de

    nombres System.Configuration, System.Data.SqlServerCey del proyecto de Entidades, adems

    tiene que declarar la clase como publica (para que la Capa de Lgica de Negocio pueda tener

    acceso a ella)

    Ya tenemos el puente de comunicacin entre nuestras Entidades y nuestra Capa de Datos. Solo

    resta comenzar a codificar las acciones que querramos hacer con nuestra tabla Producto, recuerde

    que el objeto ProductoDalnicamente tiene como responsabilidad trabajar con todo aquello

    relacionado con Producto, as que comencemos haciendo la codificacin para Insertar, Traer todos

    los registros existentes en nuestra tabla Producto, Traer, Actualizar y Eliminar por Id.

    Para hacer esta tarea mas sencilla le proporcionare el cdigo que deber de poner en la clase

    ProductoDal, pero, trate de escribir el cdigo para vaya analizando la estructura del mismo.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    //nuestras importaciones del Espacio de nombres que estaremos utilizando,

    http://lh6.ggpht.com/-REBpidNkxBs/VCOW5HPy-2I/AAAAAAAAAhE/kR5htDX60h0/s1600-h/image201.pnghttp://lh3.ggpht.com/-zc3WxHHrNLE/VCOW2Hj3EQI/AAAAAAAAAg0/7A3uN60-L7c/s1600-h/image12.pnghttp://lh6.ggpht.com/-REBpidNkxBs/VCOW5HPy-2I/AAAAAAAAAhE/kR5htDX60h0/s1600-h/image201.pnghttp://lh3.ggpht.com/-zc3WxHHrNLE/VCOW2Hj3EQI/AAAAAAAAAg0/7A3uN60-L7c/s1600-h/image12.png
  • 8/10/2019 ReportViewer c#

    67/93

    //recuerde que estas son las referencias que realizamos hace unos

    momentos...

    using System.Configuration;

    using System.Data.SqlServerCe;

    using Tienda_Entidades;

    namespace Tienda_AccesoDatos

    {

    //Definimos el acceso de nuestra clase como public, asegurando con

    esto su accesibilidad desde

    //otros proyectos.

    public class ProductoDal

    {

    //Primero y siguiendo el orden de las acciones CRUD

    //Crearemos un Mtodo que se encarga de insertar un nuevo

    Producto es nuestra tabla Producto

    ///

    /// Inserta un nuevo Producto en la tabla Producto

    ///

    /// Entidad contenedora de los valores a

    insertar

    /// Jos Luis Garca Bautista

    public void Insert(EProducto producto)

    {

    //Creamos nuestro objeto de conexion usando nuestro archivo

    de configuraciones

    using (SqlCeConnection cnx = new

    SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToStr

    ing()))

    {

    cnx.Open();

    //Declaramos nuestra consulta de Accin Sql parametrizada

    const string sqlQuery =

    "INSERT INTO Producto (Descripcion, Marca, Precio)

    VALUES (@descripcion, @marca, @precio)";

    using (SqlCeCommand cmd = new SqlCeCommand(sqlQuery,

    cnx))

    {

    //El primero de los cambios significativos con

    respecto al ejemplo descargado es que aqui...

    //ya no leeremos controles sino usaremos laspropiedades del Objeto EProducto de nuestra capa

    //de entidades...

    cmd.Parameters.AddWithValue("@descripcion",

    producto.Descripcion);

    cmd.Parameters.AddWithValue("@marca",

    producto.Marca);

  • 8/10/2019 ReportViewer c#

    68/93

    cmd.Parameters.AddWithValue("@precio",

    producto.Precio);

    cmd.ExecuteNonQuery();

    }

    }

    }

    ///

    /// Devuelve una lista de Productos ordenados por el campo Id de

    manera Ascendente

    ///

    /// Lista de productos

    /// Jos Luis Garca Bautista

    public List GetAll()

    {