21 de diciembre de 2012

ACME en VB con TableAdapter

Vamos a hacer un ACME(Actualizar, Consultar, Modificar, Eliminar) para una aplicación de escritorio, esta aplicación tendrá un formulario con un dataGridview para mostrar los datos, también tendrá un BindingNavigator para "navegar" por los datos que recuperemos en el Datagridview y enlazaramos el BindingSource del BindingNavigator para mostrar en tetxbox relativos con los campos de la tabla empleado(codigo, nombres, cargo, jefe, departamento) la información correspondiente del empleado por la que vayamos avanzando según avancemos con el BindingNavigator, al final tendremos un formulario asi:


Lo primero va ser crear un nuevo proyecto, en este ejemplo aparecen los códigos para VB y C# así que ustedes deciden que lenguaje utilizar (igual no escribiremos mucho código pues una de las ventajas de utilizar TableAdapter es que no te complicas demasiado escribiendo código) luego muestro en la imagen a continuación el Server Explorer la base de datos y la tabla a la que nos vamos a conectar, en la cual todos los campos son tipo string


Ahora vamos a agregar un nuevo elemento a nuestro proyecto que sera el Dataset sobre el que se trabajara, para esto nos colocamos en el Solution Explorer y damos click derecho sobre nuestro proyecto, nos vamos a agregar(Add) y New Item, tal como muestro en la imagen


agregamos un Dataset y como nombre le ponemos PruebaDS y click en aceptar, tal como se muestra


Al hacerlo lo primero que veremos sera una pantalla gris con esto y lo que vamos a hacer es "jalar", "arrastrar" la tabla empleados desde el Server Explorer a esta parte gris y ahora en la pantalla gris tendremos un DataTable


Tendremos este Datatable con el nombre empleado, que lo toma por defecto del nombre de la tabla, lo podemos cambiar pero en este ejemplo lo dejaremos así  ahora bien, se nos crean dos métodos en el empleadoTableAdapter que son Fill y GetData(), lo que haremos sera dar click derecho sobre la parte gris y agregar una query


Tendremos la siguiente ventana, aquí podemos escoger entre
  • Utilizar sentencias SQL y asi crear por nuestra cuenta la sentencia SQL a utilizar o bien
  • Crear un nuevo procedimiento almacenado que actuara sobre la tabla empleado y se guardara en la base de datos prueba y por ultimo
  • Utilizar un procedimiento almacenado existente en nuestra base.

Tal como lo muestra la imagen y para todas las acciones que crearemos sobre la base de datos seleccionaremos la primera opción, la de definir por nuestra cuenta la sentencia SQL a utilizar y damos click al botón Next 


a continuación escogeremos el tipo de query que se va a crear, aquí seleccionaremos la primera opción que tal como ven en la imagen es la de SELECT a fin que nos devuelva un conjunto de valores, aunque utilizaremos también el UPDATE, DELETE y el INSERT, al final la única que no utilizaremos sera opción 2.  


Aqui nos pide especificar la sentencia que utilizaremos, para el caso de SELECT en nuestro proyecto de ejemplo puede quedar tal como se muestra en la imagen, pero podemos modificarla según lo que queramos hacer, mas abajo en esta entrada encontraran las sentencias de UPDATE, DELETE e INSERT.

Antes de continuar, quiero hacerles notar que en caso deban hacer una consulta muy complicada o simplemente no recuerden como se construye adecuadamente una sentencia SQL, pueden hacer usos del Query Builder que es el botón que aparece en la parte inferior derecha



Luego pondremos un nombre a los métodos que deseamos agregar y damos click en finalizar


Acabamos de crear un query, si se fijan lo hicimos para la opción de seleccionar, al cual le deje el nombre de FillBySelect pero igualmente deberemos crear 3 mas, uno para Eliminar, otro para Insertar y otro para Modificar, al final el datatable nos queda así


y ahora muestro el Form que utilizaremos


Ahora bien, para utilizar nuestro tableadapter debemos escribir esto en código
Dim clientes As New PruebaDSTableAdapters.empleadoTableAdapter

y luego definimos la query que deseamos utilizar así:
clientes.nombre del query

Como ven el formulario utiliza un BindingNavigator y tiene un DataGridView para navegar y mostrar TODOS los datos respectivamente y conforme se avance en el DataGridView se irán mostrando los datos en los textbox, cada textbox se llama de acuerdo al campo de la tabla que va mostrar.

Todo lo anterior lo hace la función Mostrar

Codigo en VB
Private Sub Mostrar()
        Dim Clientes As New PruebaDSTableAdapters.empleadoTableAdapter
        Dim bs As New BindingSource
        bs.DataSource = Clientes.GetData
        DataGridView1.DataSource = bs
        BindingNavigator1.BindingSource = bs
        TCodigo.DataBindings.Clear()
        TCodigo.DataBindings.Add(New Binding("text", bs, "codigo"))
        TNombres.DataBindings.Clear()
        TNombres.DataBindings.Add(New Binding("text", bs, "nombres"))
        TCargo.DataBindings.Clear()
        TCargo.DataBindings.Add(New Binding("text", bs, "cargo"))
        TJefe.DataBindings.Clear()
        TJefe.DataBindings.Add(New Binding("text", bs, "jefe"))
        TDepartamento.DataBindings.Clear()
        TDepartamento.DataBindings.Add(New Binding("text", bs, "departamento"))
    End Sub

Codigo en C#
private void Mostrar() {

PruebaDSTableAdapters.empleadoTableAdapter clientes= new PruebaDSTableAdapters.empleadoTableAdapter();
            BindingSource bs = new BindingSource();
            bs.DataSource = clientes.GetData();
            bindingNavigator1.BindingSource = bs;
            dataGridView1.DataSource = bs;
            TCodigo.DataBindings.Clear();
            TCodigo.DataBindings.Add(new Binding("text", bs, "codigo"));
            TNombres.DataBindings.Clear();
            TNombres.DataBindings.Add(new Binding("text", bs, "nombres"));
            TCargo.DataBindings.Clear();
            TCargo.DataBindings.Add(new Binding("text", bs, "cargo"));
            TJefe.DataBindings.Clear();
            TJefe.DataBindings.Add(new Binding("text", bs, "jefe"));
            TDepartamento.DataBindings.Clear();
            TDepartamento.DataBindings.Add(new Binding("text", bs, "departamento"));
        }


Explicare el código del evento click para el botón consultar: busca el codigo en especifico que se escriba en el textbox llamado Tcodigo si lo encuentra lo muestra solo en el DataGridView pues por un dato no se va activa el BindingNavigator.
En caso de no escribir nada en el textbox Tcodigo y dar click al botón consultar entonces listara todos los datos en el Datagridview, igualmente utilizara un BindingNavigator y mostrara los datos según se avance en los textbox, muestro la consulta y el código del evento click del botón Consultar:

SELECT        codigo, nombres, cargo, jefe, departamento
FROM            empleado
WHERE        (codigo = @codigo)

Codigo en VB
Private Sub BConsultar_Click(sender As System.Object, e As System.EventArgs) Handles BConsultar.Click
        Dim Clientes As New PruebaDSTableAdapters.empleadoTableAdapter
       
        If (Not (String.IsNullOrEmpty(TCodigo.Text))) Then
            Me.DataGridView1.DataSource = Clientes.GetDataBySelect(Me.TCodigo.Text)
        Else
            Mostrar()
        End If
    End Sub

Codigo en C#
private void BConsultar_Click(object sender, EventArgs e){

PruebaDSTableAdapters.empleadoTableAdapter clientes = new   PruebaDSTableAdapters.empleadoTableAdapter();

            if (string.IsNullOrEmpty(TCodigo.Text))
            {
                Mostrar();
            }
            else {
                this.dataGridView1.DataSource = clientes.GetDataBySelect(TCodigo.Text);
            }
         }

  • Ahora el código del evento click para el boton Eliminar, muestro la consulta SQL que agregamos al Tableadapter y el código para el evento click del boton Eliminar:
DELETE FROM [dbo].[empleado]
WHERE ([codigo] = @codigo)

Codigo en VB
Private Sub BEliminar_Click(sender As System.Object, e As System.EventArgs) Handles BEliminar.Click

Dim clientes As New PruebaDSTableAdapters.empleadoTableAdapter
clientes.Eliminar(TCodigo.Text)
Mostrar()
End Sub

Codigo en C#
private void BEliminar_Click(object sender, EventArgs e){

PruebaDSTableAdapters.empleadoTableAdapter clientes= new PruebaDSTableAdapters.empleadoTableAdapter();
clientes.Eliminar(TCodigo.Text);
Mostrar();
        }

  • Para agregar datos tenemos la siguiente consulta y código para el evento click del botón Insertar:
INSERT INTO [dbo].[empleado] ([codigo], [nombres], [cargo], [jefe], [departamento]) 
VALUES (@codigo, @nombres, @cargo, @jefe, @departamento);

Codigo en VB
Private Sub BInsertar_Click(sender As System.Object, e As System.EventArgs) Handles BInsertar.Click
  
Dim clientes As New PruebaDSTableAdapters.empleadoTableAdapter
clientes.Insertar(TCodigo.Text, TNombres.Text, TCargo.Text, TJefe.Text, TDepartamento.Text)
Mostrar()
End Sub

Codigo en C#
private void BInsertar_Click(object sender, EventArgs e){
    
PruebaDSTableAdapters.empleadoTableAdapter clientes = new PruebaDSTableAdapters.empleadoTableAdapter();
clientes.Insertar(TCodigo.Text, TNombres.Text, TCargo.Text, TJefe.Text, TDepartamento.Text);
Mostrar();
        }

  • Para modificar datos tenemos la siguiente consulta y código para el evento click del botón Actualizar:
UPDATE       empleado
SET                nombres = @nombres, cargo = @cargo, jefe = @jefe, departamento = @departamento
WHERE        (codigo = @codigo); 

Codigo en VB
Private Sub BActualizar_Click(sender As System.Object, e As System.EventArgs) Handles BActualizar.Click

Dim clientes As New PruebaDSTableAdapters.empleadoTableAdapter
clientes.Modificar(TNombres.Text, TCargo.Text, TJefe.Text, TDepartamento.Text, TCodigo.Text)
Mostrar()
End Sub


Codigo en C#
private void BActualizar_Click(object sender, EventArgs e){

PruebaDSTableAdapters.empleadoTableAdapter clientes = new PruebaDSTableAdapters.empleadoTableAdapter();
clientes.Modificar(TNombres.Text, TCargo.Text, TJefe.Text, TDepartamento.Text, TCodigo.Text);
Mostrar();
        }


eso es todo :)



viernes, diciembre 21, 2012

20 de diciembre de 2012

Formato para dos decimales


Si ya tenemos el valor del cual solo queremos dos decimales, que en este caso es Salario, podemos aplicar cualquiera de las siguientes opciones

Format(Salario, “##,##0.00″)
Salario.ToString(“##,##0.00″)

19 de diciembre de 2012

ReportViewer con DataSet Tipado

Que pasa si hacemos una aplicación para un vecino, una empresa pequeñísima o incluso un proyecto para la universidad y nos piden mostrar información en un reporte? pues fácil lo podemos hacer super practico e incluso visualmente atractivo en Crystal Report asi: Reportes con Crystal Report.

Pero y si se da el típico caso del profesor que te dice: "pues ustedes sabrán como lo hacen pero yo no voy a instalar nada mas que el Framework para Visual Studio" entonces toca que buscar una solución y esa es crear reportes locales a la aplicación, a lo mejor no sea tan buena comparando esta solución con usar Crystal Report pero el resultado termina siendo el mismo, entregar al usuario un reporte con la información que necesita y listo para imprimir.

Vamos a hacer un reporte casero(local) para una aplicación de escritorio tanto en VB como en C#, la tabla que usaremos se llama empleado y tiene los siguientes campos:


Creamos un nuevo proyecto para escritorio y luego lo primero sera tener el Dataset y lo haremos desde la pestaña Data Sources en nuestro proyecto y seleccionamos agregar un nuevo Data Source al que llamaremos Datos con un DataTable llamado empleado, tal como se muestra:


listo, ya creamos un Dataset para nuestro reporte, ahora falta crear el reporte, para eso damos click derecho sobre nuestro proyecto en el Solution Explorer y agregamos un nuevo item que sera un reporte local y le dejamos como nombre Report1.rdlc(ten presente que el nombre que le des al reporte es muy importante para enlzar los datos) y lo guardamos en la misma carpeta de nuestro proyecto(igualmente la ubicacion de tu reporte es importante).




al hacer lo anterior tendremos una pantalla para diseñar nuestro reporte y en la parte izquierda una pestaña Toolbox desde la cual agregamos una tabla para nuestro ejemplo, tu puedes agregar una Matrix, Rectangle, List según lo necesites:


y al hacerlo se abrirá una ventana llamada Dataset Properties donde se nos pedirá definir una fuente de datos para poblar el reporte, aquí es donde usaremos el Dataset que creamos(aquel que se llamaba Datos) y el Datatable respectivo, se llena así:

Name: como nombre para nuestra fuente de datos para el reporte ponemos Datos.
Data source: el Dataset que creamos desde Data Sources y cuyo nombre es Datos
Avaible datasets: el nombre del Datatable del Dataset que creamos: empleado
si tienes alguna duda regresate a ver la segunda imagen de este blog


Ahora en la parte izquierda tendremos una pestaña llamada Report Data y desde ahí jalamos los campos del Dataset hacia la tabla que agregamos en nuestro reporte así:


este es nuestro reporte, de lo mas sencillo, aquí solo muestro como poblar el reporte desde un Dataset, ustedes sabrán cual es el diseño que quieran aplicar


Lo ultimo sera regresar a nuestro formulario que el proyecto crea por defecto: Form1.vb le especificamos que reporte utilizar al ReportViewer desde el Choose Report y vamos a agregar desde el Toolbox los siguientes elementos un reportViewer asi como un label, un textbox y un botón a fin que quede como la imagen:

Buscar un empleado en especifico o mostrarlos todos

como? si, a continuación muestro el código para el evento click del botón, lo que se hará es que al presionar el botón va buscar un dato es especifico según sea el código que se introduce en el textbox, pero en caso no se introduzca ningún código y se presione el botón Buscar entonces mostrara todos los datos de la tabla empleado y los mostrara en el reporte, dos pajaros de un tiro verdad? te muestro como listar todos lo datos de una tabla o solo uno en particular.

Codigo VB

Imports Microsoft.Reporting.WinForms
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1

Private Sub BBuscar_Click(sender As System.Object, e As System.EventArgs) Handles BBuscar.Click

Dim info As New Datos                    'instancia a Dataset Datos creado con el asistente
Dim da As New SqlDataAdapter
Dim cmd As New SqlCommand

Using Sql As New SqlConnection(My.Settings.cnn)
Sql.Open()
Using cmd
cmd.Connection = Sql

If (Not (String.IsNullOrEmpty(TextBox1.Text))) Then
cmd.CommandText = "select * from empleado where codigo=@codigo"
cmd.Parameters.AddWithValue("@codigo", TextBox1.Text)
Else
cmd.CommandText = "select * from empleado"
End If

da.SelectCommand = cmd
da.Fill(info, "empleado")
End Using
End Using

ReportViewer1.ProcessingMode = ProcessingMode.Local         'Tipo de procesamiento del visor
ReportViewer1.Visible = True
ReportViewer1.SetDisplayMode(DisplayMode.Normal)
ReportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report1.rdlc"
Dim rds As New ReportDataSource("Datos", info.Tables(0))   'Dataset utilizado para poblar el reporte y la tabla que se utilizara
ReportViewer1.LocalReport.DataSources.Clear()              'limpio la fuente de datos
ReportViewer1.LocalReport.DataSources.Add(rds)             'Agrego el ReportDatasource
ReportViewer1.RefreshReport()
End Sub
End Class


Codigo C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
using Microsoft.Reporting.WinForms;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form  {
SqlConnection sql = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString);
SqlDataAdapter da;
SqlCommand cmd;
Datos info;

public Form1()       {
InitializeComponent();
da=new SqlDataAdapter();
info=new Datos();    }

private void Form1_Load(object sender, EventArgs e){ }

private void BBuscar_Click(object sender, EventArgs e){
using (sql){
sql.Open();
using (cmd = new SqlCommand()){
cmd.Connection = sql;
if (string.IsNullOrEmpty(textBox1.Text)){
cmd.CommandText = "select * from empleado";
}else{
cmd.CommandText = "select * from empleado where codigo=@codigo";
cmd.Parameters.AddWithValue("@codigo", textBox1.Text);}
da.SelectCommand = cmd;
da.Fill(info, "empleado");}}
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
this.reportViewer1.LocalReport.ReportEmbeddedResource = @"WindowsFormsApplication1.Report1.rdlc";
ReportDataSource rds = new ReportDataSource("Datos", info.Tables[0]);
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(rds);
this.reportViewer1.RefreshReport();}}}


 y eso es todo ;)

12 de diciembre de 2012

Ejemplo con Clases en VS2010

Un ejemplo de lo mas sencillo, lo haremos para una clase Bicicleta y crearemos instancias(objetos) de esta clase, primero creamos un nuevo proyecto lo cual nos creara un formulario al que le agregamos Labels, Textbox y dos botones tal como se muestra


El siguiente paso sera agregar una clase al proyecto y llamarla Bicicleta, el código se muestra a continuación  y dependiendo si el atributo es declarado como privado, se agrega una propiedad con métodos Get y Set para este, la clase en VB queda así:

VB

Public Class Bicicleta
    Public Modelo As String
    Public Precio As String
    Private NumeroDeVelocidades As String
    Private Belocidad_ As Integer = 0   'valor inicial

    Public Property Velocidades() As String  'para valores de NumeroDeVelocidades
        Get
            Return NumeroDeVelocidades
        End Get
        Set(ByVal value As String)
            NumeroDeVelocidades = value
        End Set
    End Property

    Public Property Belocidad() As Integer  'para valores de Belocidad_
        Get
            Return Belocidad_
        End Get
        Set(ByVal value As Integer)
            Belocidad_ = value
        End Set
    End Property


    Public Sub acelerar(km As Integer)
        Belocidad_ = Belocidad_ + km
    End Sub

    Public Sub frenar()
        If Belocidad_ > 0 Then
            Belocidad_ = Belocidad_ - 1
        End If
    End Sub

    Public Function ConsultarVelocidad() As Integer
        Return Belocidad_
    End Function
End Class


 y el código en el formulario queda así, este ejemplo muestra en forma sencilla como utilizar clases, ustedes deberán implementar las validaciones necesarias:

Public Class Form1
    Dim objBicicleta = New Bicicleta()

    Private Sub BAgregar_Click(sender As System.Object, e As System.EventArgs) Handles BAgregar.Click
        objBicicleta.Modelo = Trim(TModelo.Text)
        objBicicleta.Precio = Trim(TPrecio.Text)
        objBicicleta.Belocidad = Trim(CInt(TBelocidad.Text))
        objBicicleta.Velocidades = Trim(TVelocidades.Text)
    End Sub

    Private Sub BMostrar_Click(sender As System.Object, e As System.EventArgs) Handles BMostrar.Click
        objBicicleta.acelerar(15)
        objBicicleta.frenar()
        TResultado.Text = CStr(objBicicleta.ConsultarVelocidad)
    End Sub

End Class



C# 
el código de la clase Bicicleta es:

class Bicicleta
    {
        public string Modelo;
        public string Precio;
        private string NumeroDeVelocidades_;
        private int Velocidad_;

        public string  NumeroDeVelocidades
        {
            get { return  NumeroDeVelocidades_; }
            set {  NumeroDeVelocidades_ = value; }
        }

        public int Velocidad
        {
            get { return Velocidad_; }
            set { Velocidad_ = value; }
        }
       
        public void Acelerar(int km)
        {
            Velocidad_ = Velocidad_ + km;
        }

        public void Frenar()
        {
            if (Velocidad_ > 0)
            {
                Velocidad_ = Velocidad_ - 1;
            }
        }

        public int ConsultarVelocidad()
        {
            return Velocidad_;
        }
    }

y el código del formulario es

public partial class Form1 : Form
    {
        Bicicleta objbicicleta = new Bicicleta();
        public Form1()
        {
            InitializeComponent();
        }

        private void BAgregar_Click(object sender, EventArgs e)
        {
            objbicicleta.Modelo = (TModelo.Text).Trim();
            objbicicleta.Precio = (TPrecio.Text).Trim();
            objbicicleta.NumeroDeVelocidades = (TVelocidades.Text).Trim();
            objbicicleta.Velocidad = (Convert.ToInt32((TBelocidad.Text).Trim()));
        }

        private void BMostrar_Click(object sender, EventArgs e)
        {
            objbicicleta.Acelerar(1);
            objbicicleta.Frenar();
            TResultado.Text = Convert.ToString(objbicicleta.ConsultarVelocidad());
        }
    }





miércoles, diciembre 12, 2012