miércoles, 18 de febrero de 2009

Reportes con Visual Studio & AdventureWorks

Bueno vamos de frente a donde todos necesitan apoyo el motivo por el cual ustedes entraron a este espacio web.
Bueno vamos a crear una solucion y sus respectivos formularios con sus respectivos controles y su reporte trabajaremos con listOf osea generics y tambien veremos un reporte pero alimentado desde una clase tipo lista.
Creen una solucion que tenga como nombre el que ustedes gusten en mi caso se llamará "DemoReportesPor_VictorYucra.sln"
Creen un proyecto que le llamaran como gusten en mi caso yo le pondre de nombre "ReportesCrystal.vbproj"
Creen dos formularios que de nombre le pondran "Reporteador.vb" y "Visor.vb"
creen dos clases "Producto.vb" y "Procesos.vb"
luego diseñen el primer formulario Reporteador asi como en la siguiente imagen:

El formulario Visor lo realizaran de la siguiente manera:

seleccionen el control "CrystalReportViewer1" y realizen lo siguiente:

Passo 1: esta es una etiqueta inteligente donde podemos ver muchas opciones el cual nosotros seleccionaremos el que dice "Chose a Crystal Report", luego

Paso 2: seleccionaremos que reporte se enlazara con este formulario o este "CrystalReportViewer1", en si en un solo visor se pueden temer a varios reportes enlazados la idea solo es por codigo seleccionar que reporte sera mostrado.

Luego entraremos a la base de datos, en este caso trabajamos con : "AdventureWorks"
trabajaremos con la tabla "Product", creen el siguiente procedimiento almacenado:

create procedure consulta_Producto(@Name nvarchar(50), @ProductNumber nvarchar(25))
As
Begin
Select ProductID, Name, ProductNumber From Production.Product
Where Name Like '%' + @Name + '%' And
ProductNumber like '%' + @ProductNumber + '%'
End
Go

ahora entraremos a las clases, en la clase producto realizar el siguiente codigo:

Namespace BLL

Public Class Producto
Private fProductID As Integer
Public Property ProductID() As Integer
Get
Return fProductID
End Get
Set(ByVal value As Integer)
fProductID = value
End Set
End Property
Private fName As String
Public Property Name() As String
Get
Return fName
End Get
Set(ByVal value As String)
fName = value
End Set
End Property
Private fProductNumber As String
Public Property ProductNumber() As String
Get Return fProductNumber
End Get
Set(ByVal value As String)
fProductNumber = value
End Set
End Property
End Class
End Namespace


en la clase producto realizar el siguiente codigo:

Imports System.Data.SqlClient
Imports ReportesCrystal.BLL

Namespace DAL

Public Class Procesos
Public Function BuscarCliente(ByVal clsProducto As BLL.Producto, ByVal ocn As String) As List(Of Producto)
Try
Using cn As New SqlConnection(ocn)
Dim cmd As New SqlCommand("consulta_Producto", cn)
cmd.CommandType = CommandType.StoredProcedure
Dim Parametros() As SqlParameter = {New SqlParameter, New SqlParameter}
With Parametros(0)
.ParameterName = "@Name"
.DbType = DbType.String
.Size = 50
.Value = clsProducto.Name
End With
With Parametros(1)
.ParameterName = "@ProductNumber"
.DbType = DbType.String
.Size = 25
.Value = clsProducto.ProductNumber
End With

For pPar As Integer = 0 To 1
cmd.Parameters.Add(Parametros(pPar))
Next
cn.Open()
Dim oReader As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection And CommandBehavior.SingleRow)
Dim lProducto As New List(Of Producto)
Dim cProducto As Producto

If oReader.Read Then
While oReader.Read
cProducto = New Producto
With cProducto
.ProductID = oReader(0)
.Name = oReader(1)
.ProductNumber = oReader(2)
lProducto.Add(cProducto)
End With
End While
End If
Return lProducto
End Using
Catch ex As Exception
Return Nothing
End Try
End Function
End Class

End Namespace


en el Setting del proyecto ingresara algunos parametros como se muestra en la siguiente imagen esto es para la conexion a la base de datos:

ahora en el formulario que tiene como nombre Reporteador ingresara el siguiente codigo:

Public Class frmReporteador
Public Ocn As String
Public olstProd As New List(Of BLL.Producto)

Public Function CadenaConecion() As String
Try
Dim Conexion As String = "Data Source=" & My.Settings.DataSource & _
";Initial Catalog=" & My.Settings.BaseDatos & _
";User ID=" & My.Settings.usuario & _
";Password=" & My.Settings.password

Return Conexion
Catch ex As Exception
Return Nothing
End Try
End Function

Private Sub btnConsultar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConsultar.Click
Dim oProduct As New BLL.Producto
With oProduct
.Name = txtProductos.Text.Trim
.ProductNumber = txtSerie.Text.Trim
End With
Dim oProc As New DAL.Procesos

olstProd = oProc.BuscarCliente(oProduct, Ocn)
dtgProductos.DataSource = olstProd
End Sub

Private Sub Reporteador_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Ocn = CadenaConecion()
End Sub

Private Sub ImprimirResultadoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImprimirResultadoToolStripMenuItem.Click
Dim ReporteProd As New rptProducto
ReporteProd.SetDataSource(olstProd)
Visor.CrystalReportViewer1.ReportSource = ReporteProd
Visor.ShowDialog()
End Sub

Private Sub dtgProductos_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dtgProductos.MouseDown
If e.Button = Windows.Forms.MouseButtons.Right Then

With dtgProductos
Dim hti As DataGridView.HitTestInfo = .HitTest(e.X, e.Y)
If hti.Type = DataGridViewHitTestType.Cell Then
.CurrentCell = .Rows(hti.RowIndex).Cells(hti.ColumnIndex)
End If
End With
End If

End Sub
End Class

me olvidaba al proyecto tienen que agregarle tambien algunos controlcitos mas que son los siguientes...


Cuando ejecuten el resultado deveria ser:

el resultado del reporte luego de "Imprimir resultado".


Espero les haya sido de utilidad.

Atentamente se despide,

Victor Yucra
Desarrollador de Software