miércoles, 21 de octubre de 2015

Presentación y Requerimientos para seguir los tutoriales

Hola me presento me llamo Enzo González y llevo un buen tiempo en programación, en distintas situaciones laborales me vi obligado a a usar distintos lenguajes de programación como así también motores de bases de datos que cual es mejor o cual es peor no es un tema que vaya a contestar ni debatir en este blog puesto que no es la finalidad ni tengo la autoridad necesaria para arribar a semejante conclusión por todo esto solo voy a decir que en mi experiencia desarrollando aplicaciones de escritorio y web con la ropa que me siento mas cómodo es con el lenguaje C SHARP o C# y SQLEXPRESS reitero no quiere esto decir que es lo mejor del mundo porque se trata solamente de aportar como en su momento una inmensa cantidad de personas lo hicieron conmigo, ademas la idea original era ayudar a unos amigos a desarrollar sus propias aplicaciones, como también se sumaron pasantes y estudiantes de la facultad que en algún momento me pidieron echara un poco de luz a sus cuestiones es que me decidí a realizar este tutorial que es un simple abm de datos abm alta, baja y modificación y que lo haré de forma completa y finalizado el curso o tutorial también expondré ejemplos y técnicas para para aplicaciones como leer y escribir un archivo excel y otras consultas que seguramente se va a ir dando a través del tutorial muy bien hecha la presentación vamos a ver los requisitos para seguir este tutorial primero visual studio 2013 update 4 versión express que lo pueden descargar del siguiente link http://www.microsoft.com/es-ar/download/details.aspx?id=44914 cabe aclarar que a la hora de redactar este tutorial ya se encuentra el visual studio 2015 cosa que no vamos a ver en este curso o por lo menos por el momento lo segundo es el microsoft sql server express en su versión 2012 y este es el link http://www.microsoft.com/es-ar/download/details.aspx?id=43351 y por ultimo el management studio 2012 que es un administrador visual de bases de datos sql server y este es el link https://www.microsoft.com/es-ES/download/details.aspx?id=29062 las versiones 64 y 32 bits dependen de sus sistemas operativos no voy a detallar la instalación de los programas porque supongo que la mayoría que sigue este curso ya sabe como hacer esto de no ser asi me avisan y hare un tutorial para la instalación de los requisitos bueno esto como presentación se paso asi que vamos al primer capitulo del tutorial

Capitulo 1 Creacion base de datos y Proyecto Vs 2013

Bueno muy bien comenzamos una vez instalados el vs 2013, sqlexpress y el SQL Server Management Studio como vemos aquí


Abrimos el SQL Server Management Studio y si pusieron acceso con clave lo escriben si no dejan autenticación windows y sin clave acto seguido creamos la base de datos y le ponemos "Tutorial" pueden elegir donde guardarlo o simplemente dejarla en la ubicación que sugiere le damos aceptar y listo vemos como se creo la base de datos Tutorial si no les aparece a la primera presionen F5 asi actualiza



Siempre que trabajemos con bases de datos es importante analizar bien los datos que vamos a usar, como y donde lo vamos a guardar este es el paso previo y necesario para realizar nuestras aplicaciones. Este sera el esquema de la tabla que se llamara usuarios y servirá para acceder a nuestra aplicacion mediante una pantalla login
Nombre Tabla = Usuarios
Campos
Id tipo de datos integer clave principal o primary key (puede ser autoincremental depende de como cada uno va a controlar puede hacerse con código o dejar que lo maneje en este caso sqlexpress)
NombreU tipo de datos nvchar(70)
Password tipo de datos nvchar(70)
en el caso de de datos string de tipo texto uso el nvchar(la cantidad de caracteres que supongo serán necesarios en este caso puse 70 aunque es mucho me deja mas cómodo ante cualquier caso)
Ahora veamos como hacerlo


Aqui muestro como harían que el campo Id sea incremental a través de especificación de identidad le damos si en incremento de de identidad por defecto lo dejamos en 1 pero si quisiéramos cambiar pondremos el numero que necesitamos usar por ejemplo 10 y el incremento seria 10,20,30 etc o 2 y el incremento seria 2,4,6,8 etc. Luego en inicialización de identidad ponemos el numero que queremos que empiece a contar


Luego de esto nos queda ver si nuestro campos admitirán valores nulos que como se trata de una tabla usuarios y password o claves no es recomendables por eso destildamos las opciones permitir valores nulos y ya esta guardamos con el nombre Usuarios y tenemos nuestra primera tabla


Vamos a ingresar un dato a nuestra tabla como se ve una vez agregado el dato no hace falta grabarlo ya graba solo cerramos y abrimos y vemos que el registro esta ahí


Extra si estamos usando datos de prueba para probar nuestra aplicación y si borramos el registro el numero incremental no se reinicia sigue el numero consecutivo veamos de que estamos hablando


Como vemos al borrar y agregar no vuelve a uno si no que sigue el numero 2 esto es porque asignamos un campo autoincremental pero tranquilos  una vez probado todo y cuando estemos en condiciones de usar ya definitivamente la tabla podemos hacer esto para volver a 1 el registro

Y así volvemos el contador a 1 o al numero que ustedes eligieron voy a dejar aparte de la imagenes los codigos asi puedan copiarlos

Consulta sql para reiniciar el contador autoincremental

DBCC CHECKIDENT ('dbo.Usuarios', RESEED,0) 

donde dbo.Usuarios es la tabla pueden usar esta consulta sql con cualquier tabla que contenga campo autoincremental

Nota: Existe otra opción de crear la base, tablas, campos y agregar registros con un script sql que es una consulta donde escribimos lo que queremos crear, modificar o eliminar. Por ahora no voy a profundizar en esto ya que trato de que sea practico el tutorial

Nota 2: Recomiendo seguir el tutorial con lo nombres como estan se puede modificar pero lo ideal es que terminen el tutorial como esta y luego si quieren practicar usar sus nombre de base de tablas de campos, de proyectos formularios a su antojo esto es solo una sugerencia.


Bueno esto es todo por este tutorial aprendimos a usar el SQL Server Management Studio, crear una base de datos, una tabla con sus campos y añadir un registro que por ahora sera suficiente para continuar con el curso en el  próximo ya entraremos en vs 2013 y nuestra aplicacion donde haremos la pantalla login para acceso al sistema.

 Quiero poner énfasis en que esta enfocado a la practica y muy poco a teoría puesto que no quiero que sea tedioso explicar tema por tema y luego hacer la practica porque es muy posible que antes que lleguemos a la practica ya se hayan cansado de leer y no sigan el tutorial y creo que a cada tema especifico que veamos pueden consultar y leer información mucho mas completa de la que yo pueda explicar en internet eso queda a criterio de cada uno de todas formas dejare sugerencias de que leer para mejorar los conocimientos de este tutorial.

Sugerencias: (SQL) Tipos de datos y un link https://msdn.microsoft.com/es-es/library/ms187752(v=sql.110).aspx


martes, 20 de octubre de 2015

Capitulo 2 Proyecto ingreso al sistema (Login)

Hola continuamos con el tutorial vamos a crear nuestro proyecto que sera la pantalla de ingreso al sistema o login vamos a conectar con la base de datos y vamos a verificar que el usuario exista.

Ejecutamos el visual studio 2013 y esperamos que se abra

Esta es la pantalla de inicio de visual studio 2013 no se preocupen por la apariencia o si es version ultimate profesional o de prueba para el tutorial sirve cualquier versión y si desean cambiar el skin o tema visual que en mi caso es oscuro arriba en el meu buscan herramientas->Opciones->General a la derecha van a ver que dice experiencia visual y tema de color con la opciones oscuro, claro y azul elijen las que mas le guste aceptan y continuamos.

Ahora para crear un proyecto nuevo podemos seleccionar de 3 maneras distintas 1- en la pantalla principal como se puede ver un menú que dice Iniciar y abajo Nuevo proyecto 2- En la barra de menú arriba Archivo->Nuevo->Proyecto 3- Presionando las teclas de atajo que serian CTRL+MAYÚSCULAS+N.


En esta pantalla podemos elegir el tipo de proyectos que queremos realizar a la izquierda en plantillas elegimos el lenguaje y a la derecha de ese lenguaje el tipo de proyecto en este caso usamos el lenguaje c# y el tipo aplicacion de windows form, luego en nombre ponemos el nombre que vamos a darle a nuestro proyecto-aplicacion en este caso sera "Tutorial",en ubicacion es donde queremos guardar nuestro proyecto aquí es recomendable organizar bien las carpetas para luego poder ubicarlas mejor yo en mi caso usare una carpeta "proyectosTutorial" y en el check que dice crear directorio para la solución marcarlo.
Esperamos a que vs (visual studio) cree el proyecto y listo.


Una vez dentro del vs y del proyecto-aplicacion vemos ademas de crear el proyecto agrego un item del tipo formulario windows (winform) que en este caso le puso como nombre Form1.cs como figura arriba a la derecha en el cuadro de herramientas proyectos en este cuadro veremos todos los archivos que usemos en nuestro proyecto carpetas, imágenes referencia etc. Si seleccionamos el Form1 y presionamos F7 nos abrirá una ventana que dice Form1.cs en esta ventana es donde escribiremos el código para que funcione nuestra aplicacion y la otra pestaña que dice Form1.cs(Diseño) es donde incluiremos controles del formulario como botones, caja de texto, etc. También la usaremos para darle tamaño colores en fin para ver como se mostrara el formulario cuando se ejecute la aplicacion.
Veamos un ejemplo

Aquí cambiamos el tamaño del formulario y arriba en la flecha verde que dice iniciar es para ejecutar la aplicación e ir probando como nos va quedando, en el cuadro de herramientas propiedades a la derecha abajo están las propiedades de cada control no voy a detallar cada uno pero si elegimos un control y nos movemos por sus propiedades y seleccionamos alguna  mas abajo podrán ver un detalle de lo que hace esa propiedad eso les dejo como tarea si quieren profundizar en las propiedades de cada control.
Como se ve a un costado de las propiedades hay rayito que si pasan el mouse por encima de ese rayo veran que dice eventos este tema lo dejaremos para mas adelante porque la idea es ir practicando para que no sea tedioso el tutorial, dicho esto y aclarado algunos aspecto del entorno de desarrollo vamos a comenzar con el login.



En la barra lateral izquierda vemos el cuadro de herramientas si hacemos click se despliega y donde dice controles comunes seleccionamos 2 controles label 2 controles textbox y dos controles button lo arrastramos hacia el form y lo ubicamos a nuestro antojo cada cual puede elegir colores y ubicación distinta siempre que quede prolijo y aqui le dejo un consejo personal cuando diseñen o escriban el código fuente siempre imaginen que el usuario final de nuestra aplicación serán personas con poca o nada de experiencia en informática y cuanto mas intuitivo y amigable sea la aplicación menos rechazo obtendrán de ellos. Yo soy de la idea de llevar el control de donde quiero que vayan luego de...así me aseguro no tener que pasar hora explicando como funciona la aplicacion.Bueno continuemos

Seleccionamos el label1 y nos vamos a su propiedad text ojo no confundir con el nombre del control que dice (name) ya veremos eso la propiedad Text es la que nos mostrara lo que escribamos en ese label en este caso escribimos Usuario, seleccionamos el label2 vamos a su propiedad Text y escribimos Password o Contraseña como quieran ustedes. También se pueden establecer las propiedades por código pero lo veremos mas adelante por ahora lo hagamos de la forma mas practica.
Voy a achicar la pantalla para poder cubrir todo el entorno de desarrollo y que se vea todo.


Bueno a los controles textbox1 y textbox2 le cambiamos su propiedad (name) por txtUsuario y txtPassword y a los button le cambiamos su propiedad (name) por btnAceptar y btnCancelar y ademas su propiedad Text por Aceptar y Cancelar esto porque ?. Porque a medida que vayamos agregando controles los agregara por ejemplo button1, button2, button3 y no es una buena practica si llenamos el formulario de controles vamos a tener un lío y nos va a obligar a volver al diseño a ver que queríamos hacer con ese control o por ejemplo si debemos asignar algo a un control y ya vamos a ver enseguida cuando escribamos el nombre del control nos aparecerá la lista text1,text2,text3 y vamos a preguntarnos cual es en cambio si escribimos el control y en la lista nos aparece txtUsuario, txtPassword, btnAceptar y btnCancelar vamos a tener una buena referencia de que tipo de control es y cual es su nombre, Como practica común y esto también me lo enseñaron a mi los nombres de controles van una abreviatura del tipo de control ejemplo txt por TextBox o btn por Button seguida esta abreviatura de su identificación txt <-- TextBox Usuario txtUsuario los que no indica que es un control caja de texto o textbox donde se escribirá el nombre de usuario


Bueno acomodamos un poco los controles y también cambiamos una propiedad que se llama StarPosition que la uso para centrar los formularios para que cada vez que ejecutemos la aplicacion no aparezca arriba a la izquierda o en cualquier posición aleatoria.


Una demostración de como podrían hacer su login cada cual a su gusto eso les dejo para que cada uno pruebe propiedades eso a criterio de cada uno.


Paso siguiente seleccionamos nuestro proyecto que se llama "Tutorial" hacemos click con el botón derecho del mouse y seleccionamos agregar-> nuevo elemento se nos abre la opcion para que elijamos que tipo de elemento vamos a agregar buscamos a la izquierda y buscamos del tipo Datos luego a la derecha buscamos y seleccionamos ADO.NET Entity Data Model en el nombre lo dejamos como esta Model1 y presionamos agregar.


Nos muestra opciones del contenido del modelo por ahora seleccionamos la primera opción "EF Designer desde base de datos" y damos siguiente.

Lo siguiente que nos mostrara es la pantalla de conexión a la base de datos, presionamos el botón nueva conexión nos aparecerá primero la opción de que tipo de base de datos vamos a usar elegimos "Microsoft SQL Server" una vez elegido el tipo de motor de datos nos aparece una pantalla donde especificaremos algunas cosas Nombre de servidor aqui ponen el nombre de su pc, también pueden poner la IP de su pc o el nombre LocalHost en caso de que usemos una red se puede poner el nombre o la dirección IP del servidor esto es siempre que el motor de base de datos este en ese servidor, luego nombre de usuario y contraseña de sql si cuando instalaron no pusieron nada solo dejan Autenticación de windows, mas abajo donde dice establecer conexion con base de datos marcamos la primera opción hacemos click en el menú desplegable y esperamos a que cargue en esta lista nos saldrán todas las bases de datos que tengamos en sql server elegimos Tutorial presionamos el botón probar conexión para verificar que no tenemos ningún problema y presionamos el botón aceptar.

Nos aparece esta pantalla especificando la conexión la cadena de conexión y el nombre de la entidad incluimos datos confidenciales en la cadena de conexión dejamos todo como en la imagen lógicamente lo único que va a variar es el nombre de pc de ustedes lo demas todo igual y hacemos click en siguiente.


En esta pantalla elegimos que versión de entity framework vamos a usar puede que no les aparezca la versión 6x no se preocupen porque vamos a usar la versión 5 seleccionamos Entity Framework 5.0 y hacemos click en siguiente.


Esta pantalla elegiremos que objetos de la base de datos deseamos usar en nuestro modelo y como recordaran del primer capítulo solo creamos una tabla usuarios por lo tanto la marcamos luego desmarcamos las opciones de mas abajo y el espacio de nombres del modelo dejamos "TutorialModel" y click en finalizar.


Esperamos un poco dependiendo de la velocidad de cada computadora y nos salio esta pantalla como vemos en nuestro model tenemos la tabla que habiamos creado en sql server en el primer capitulo asi de sencillo si asi de sencillo a traves de este model ya tenemos capacidad para consultar, modificar o borrar registros de la tabla mas abajo voy a dejar referencia para el que quiera profundizar mas en Entity Framework.Muy bien continuemos.

Vamos a hacer 2 cosas antes de seguir primero vamos a seleccionar el form1 y buscamos su propiedad FormBorderStyle y la cambiamos a none esto es para que no tenga bordes el formulario ya que se trata de un formulario login a mi me gusta que se vea así, pero al quitarle los bordes también se perdieron los botones de minimizar, maximizar y cerrar del formulario por eso incluimos el botón cancelar, hacemos doble click en el botón cancelar y nos mandara a la pestaña de código aparte de haber creado un evento click del botón cancelar y en ese evento escribimos Application.Exit(); que es para salir de la aplicacion. Voy de dejar el código completo para que se entienda.

private void btnCancelar_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
Presionen iniciar la flecha verde o F5 para probar como quedo presionan el botón cancelar para volver a salir de la aplicacion.


En la pestaña Form1.cs o en la pestaña de código del formulario debajo de public partial class escribimos Tutorial y veremos como el intellisense nos abre una lista desplegable el intellisense sirve para ahorrarnos escritura de código a medida que ingresamos letras nos ira filtrando hasta encontrar lo que queremos escribir como se ve la imagen escribi solo tu y se desplegaron la opciones como yo quería escribir TutorialEntities lo seleccione y lo escribió por mi en resumen es una opción de autocompletar. Dejo el codigo para que vayan comparando si lo tienen igual.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tutorial
{
    public partial class Form1 : Form
    {
        TutorialEntities mibase = new TutorialEntities();
        public Form1()
        {
            InitializeComponent();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}


Bueno muy bien vamos a agregar un segundo formulario que se llamara Form2 este formulario por ahora sera el que nos recibira luego de ingresar a través del Login(Form1) seria bueno que agreguemos un control label y escribamos en la propiedad text del label "Bienvenidos al Sistema"


Creamos un método que es donde escribiremos el código para verificar que el usuario exista y la contraseña sean iguales, en este ejemplo podríamos escribir el codigo de verificacion directamente en el evento del botón aceptar cosa que no me gusta yo suelo tener organizado y bien descrito el código puesto que cuando escribamos grandes cantidades de lineas de código se nos va complicar así que los estoy obligando a ser ordenados jeje, pero si prueban el código en el evento del botón veran que tambien funciona.


Escribimos los siguiente dentro del método verificarUsuarios dejo el codigo del metodo completo

private void verificaUsuarios()
        {
            var existe = mibase.Usuarios.Any(x => x.NombreU == txtUsuario.Text && x.Password == txtPassword.Text);

            if (existe)
            {

                Form2 frm = new Form2();
                frm.Show();
                this.Hide();

            }
            else
            {
                MessageBox.Show("Usuario y/o Contraseña incorrectos");
            }
        }

y por ultimo llamamos al metodo desde el evento click del mouse


En el botón cancelar hacemos doble click sobre el botón y nos mando directo al código la otra forma de asignar eventos es seleccionar el control presionar el rayito de eventos buscar el evento que necesitamos y cuando hacemos doble click nos manda también directo al evento.
Luego en el evento click del boton llamamos al metodo verificaUsuarios(); que ejecutara todo lo que hay dentro del método y listo solo resta probar la aplicacion con iniciar o F5

Como vemos y recordando que el usuario admin y la contraseña 123 la habíamos agregado nosotros a la tabla usuarios de la base de datos tutorial una vez que verifica autoriza continuar y abrir el formulario numero 2 que decia bienvenidos al sistema. Voy a dejar el codigo completo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tutorial
{
    public partial class Form1 : Form
    {
        TutorialEntities mibase = new TutorialEntities();
        public Form1()
        {
            InitializeComponent();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void verificaUsuarios()
        {
            var existe = mibase.Usuarios.Any(x => x.NombreU == txtUsuario.Text && x.Password == txtPassword.Text);

            if (existe)
            {

                Form2 frm = new Form2();
                frm.Show();
                this.Hide();

            }
            else
            {
                MessageBox.Show("Usuario y/o Contraseña incorrectos");
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            verificaUsuarios();
        }
    }
}

Bueno eso es todo había muchas cosas mas para ampliar pero como dije vamos a los bifes directo y no quiero cansarlos con tanta lectura prefiero que hagan practica agreguen usuarios a la base de datos prueben modificar el formulario vean propiedades de controles y eventos y al que quiera ampliar mas el tema lean sobre Linq y Entity Framework. Me despido hasta el próximo capitulo.

lunes, 19 de octubre de 2015

Capitulo 3 Formulario Principal

Hola después de un tiempo continuamos con el tutorial en este caso vamos a acceder a un formulario principal donde disponemos de menús para acceder a los distintos formularios de nuestra aplicación. En el capitulo anterior después de hacer login accedemos a un formulario que decía bienvenidos, pues ahora vamos a cambiar a donde nos dirige


Agregamos un nuevo formulario y de nombre le ponemos FrmPrincipal



Como habíamos dicho para cambiar donde nos dirige y una vez agregado el formulario principal vamos a la pestaña de código del formulario Form1 que era el formulario login y cambiamos un poco el código como se ve en la imagen y deberia quedar asi:

private void verificaUsuarios()
        {
            var existe = mibase.Usuarios.Any(x => x.NombreU == txtUsuario.Text && x.Password == txtPassword.Text);

            if (existe)
            {
                FrmPrincipal frm = new FrmPrincipal();
                frm.Show();
                this.Hide();

            }
            else
            {
                MessageBox.Show("Usuario y/o Contraseña incorrectos");
            }
        }



Y como vemos nos dirige al formulario principal de nuestra aplicacion. A continuación vamos a hacer unos retoques para que nos vaya quedando prolijo


Primero vamos al Form1 en la pestaña diseño seleccionamos el textbox password y nos vamos a su propiedad passwordchar aquí pondremos un asterisco para que cuando se escriba la contraseña se vean solo asteriscos veamos


Ahora vamos a retocar un poco el formulario principal, primero vamos a aumentar el tamaño le cambiamos el texto del formulario "Menú principal" y cambiamos la propiedad StartPosition a CenterScreen para centrar el formulario.


Seguimos como este sera el formulario principal debe tener el menú de acceso al resto de nuestros formularios para eso nos vamos a cuadro de herramientas --> menú y barra de herramientas, desplegamos  y buscamos MenuStrip lo seleccionamos y lo arrastramos a nuestro formulario.


Bien como se ve en la imagen se creo una barra de herramientas para que escribamos como se estructurara nuestro menú vamos a crear por ahora dos menús uno sera Venta y el otro Stock en el menú Ventas a su ves crearemos un submenú abm Clientes y en Stock un submenú abm Artículos


Vamos a Probar como nos quedo.


Y si queremos agregar atajos de teclas a nuestro menú debemos poner el signo "ampersand" (&) antes de la letra que queremos que sea la de acceso rápido, veamos como hacerlo.


Debemos tener cuidado cuando editemos el texto de menú con hacer doble click puesto que eso nos llevara al evento del menú que por ahora no haremos para hacerlo seleccionan el menu o submenu y le hacen un solo click y veamos como queda.


Bueno con esto terminamos el capitulo para el próximo tutorial vamos a crear las tablas para hacer alta, baja y modificación de Clientes y Artículos. Y como siempre les digo prueben de hacer mas cosas sus menús en este caso cuanto mas practica mejor sera para ustedes saludos!!.

domingo, 18 de octubre de 2015

Capitulo 4 Menú Administrador

Hola vamos a continuar con el tutorial porque como prometí lo haríamos completo. Había dicho que continuaremos con abm de datos pero me estaba olvidando algo importante que es la administración de usuarios de nuestra aplicacion en caso de que necesiten dar permisos específicos a los distintos menús del sistema. Porque hasta ahora lo unico que haciamos era verificar un usuarios y contraseña y con eso ya ingresaba al sistema, el que voy a hacer no es la única forma de controlar usuarios ni la mas segura pero es el mas practico para resolver esta cuestión , se puede usar la seguridad de windows, el active directory o el membership de asp.net para usar en windows form pero tomaria mas de un capitulo y habia dicho que no queria que sea tan tedioso y mas bien de practica, en cuanto a lo de no ser seguro es porque si alguien usa un "disassembler" podria cambiar en memoria intrucciones de nuestra aplicacion, pero tranquilos tambien hay fomas de proteger nuestro codigo. Bueno aclarado algunos aspectos continuemos.


Vamos a agregar el menú administrador y el menú salir como en la imagen anterior.


Agregamos 2 labels al label 1 cambiamos su propiedad text y ponemos "Usuario:" y al label 2 cambiamos su propiedad name y ponemos lblUsuario esto servirá para mostrar el usuario activo de nuestra aplicacion, como dije en un capitulo anterior el tamaño los colores y el tipo de letra les dejo para que cada uno lo haga a su gusto yo en lo particular voy a cambiar tamaños de formularios para poder mostrar en las imágenes.

22
Hacemos doble click en el menú salir para generar su evento y escribimos "Application.Exit();" como esta es la pantalla principal de nuestra aplicacion el menu salir nos debe sacar y cerrar por completo nuestra aplicacion. El codigo deberia quedar asi:

private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


Aquí nos vamos a detener un poco para explicar mas en detalle que estamos haciendo, lo primero en la parte de código del formulario FrmPrincipal declaramos una variable publica del tipo string( que es contenedora de caracteres) para identificar una variable publica de una variable local yo uso el guion bajo antes de la descripción esto no es obligatorio solo como buena costumbre para luego cuando las lineas de código sean muy grandes es útil para identificarlas. Cual es la diferencia entre variables publicas y variable locales es el alcance de estas hay otros tipos de variables les recomiendo leer alcances de variable, como decía el alcance de una variable, esto quiere decir desde donde se la va a llamar para usarla pueden ir por ejemplo solo dentro de un método, de una clase o como en el caso que muestro en la imagen se la va a usar desde otra clase por eso la declare publica, prestemos atención a la imagen que hacemos primero la declaramos publica, definimos el tipo string y le asignamos un nombre _Usuario en el FrmPrincipal porque aquí la vamos a usar luego en el formulario login cuando comprueba el usuario y antes de cargar el formulario menu le damos un valor en este caso le decimos que se le asigne lo que contenga el txtUsuario, entonces la variable cuando cargue el formulario ya tendra un valor que sera el nombre de usuario que se escribió en la caja de texto usuario.


Y ahora solo nos resta llevar el valor de esa variable a la propiedad text del lblUsuario para mostrar que usuario es el que esta activo bueno eso es una parte ya veremos mas adelante para que mas vamos a usar esa variable publica.


Y como podemos observar luego de ingresar en el login establecemos que usuario esta activo en nuestra aplicacion.
Muy bien ahora Vamos a crear una tabla llamada "Permisos" esta tabla contendrá los menús de nuestra aplicacion y definirá el estado de permisos a nuestros usuarios


Le definimos un campo Id del tipo int (integer) un campo usuario del tipo nvchar(50) y el menú administrar que sera de tipo bit (verdadero y falso) como vamos a agregar los menús de la opción administrar lo pueden hacer como lo hago yo pero tengan en cuenta mas adelante cuando se agreguen mas menus es importante definirlos bien para que no nos confundamos.
Agregamos los submenús crearusuario, cambioclave y permisos todos del tipo bit y como vemos definimos que son submenús y pertenecen al menú administrar como vemos si lo mantenemos bien definidos y ordenados nos va a evitar muchos dolores de cabezas cuando sean muchos mas.


Establecemos el campo id como clave principal y le decimos que sea auto_increment, esto lo explique en capítulos anteriores así que no voy a detallar. Grabamos y le ponemos como nombre "Permisos" listo ya tenemos la tabla que necesitamos.

Y por ultimo vamos a establecer los permisos del usuario "Admin" ustedes pueden usar administrador root o lo que quieran, pero como este usuario es el mandamás de la aplicacion los permisos lo vamos a establecer en la base de datos ya que no se podrá modificar desde nuestra aplicacion para evitar que se modifiquen los accesos ya veremos mas adelante de que hablamos y todos los menús deben estar en verdadero. Bueno una vez creada la tabla en la base volvemos al visual studio.


Si estamos siguiendo los capítulos del tutorial ya había explicado el modelo de base de datos de entity framework, entonces hacemos doble click en model1.edmx click con el botón derecho del mouse y elegimos actualizar desde la base de datos, nos aparecerá la nueva tabla creada que es la tabla permisos la seleccionamos y hacemos click en finalizar como vemos en nuestro entity data model ahora también nos aparece la tabla recién creada en sql y ya estamos listos para usarla.


Bien vamos a agregar un formulario nuevo que sera el encargado de crear los usuarios lo llamaremos FrmCrearUsuarios.


Agregamos 2 label, 2 textbox, y 2 botones como en la imagen detallo a continuación las propiedades de cada control como ya vimos como hacer esto de ahora en mas solo voy a dejar como definir las propiedades de cada control, entonces al label1 en su propiedad text ponemos "Usuario:", al label2 también en su propiedad text ponemos "Contraseña:" , al textbox1 en su propiedad name ponemos "txtUsuario", al textbox2 en su propiedad name ponemos txtContraseña, al button1 su propiedad name "btnGrabar" y su propiedad text "Grabar", y al button2 su propiedad name "btnCancelar" y su propiedad text "Cancelar" y al FrmCrearUsuario a la propiedad text ponemos "Crear Usuario" y a su propiedad startposition elegimos centerscreen.


Muy bien volvemos al formulario principal hacemos doble click en el menú crear usuario y nos dirige al evento click del menú, como no me gusta mucho escribir directamente en el evento creo un método que le llamo FormCrearUsuario y dentro de ese método escribo el codigo para abrir el formulario, luego desde el evento llamo al metodo, esto es una practica mia si no la quieren seguir igual sirve el codigo directo, otra cosa como se ve en la imagen utilizo showDialog en lugar de show esto es para abrir formularios y cuadros de diálogos modales y no modales, breve explicación cuando un formulario o cuadro de dialogo es modal mantiene el foco en si mismo, esto quiere decir que no se puede cambiar a otro formulario de nuestra aplicacion sin antes cerrar el formulario modal o el cuadro de dialogo, lo que a mi particularmente me gusta para llevar control y obligar al usuario a usar y cerrar detesto ver mil ventanas abiertas de una aplicacion, pero como dije es gusto particular, veamos un ejemplo.

Nos vamos a la pestaña código de FrmCreaUsuario ya vimos esto pero por las dudas hacen doble click en FrmCrearUsuario y le abre la pestaña diseño que es la parte gráfica del formulario aprietan F7 y los pasa a la parte del código.


Creamos la entidad mibase como hicimos en el formulario login esto lo vamos a hacer cada vez que usemos la base de datos ya sea para ver, grabar, actualizar o borrar en cada formulario que lo requiera. (Nota: me gustaria hacer las imágenes mas extensas pero como estoy trabajando en una netbook cuando mas tiempo dura la grabación mas pesada se me pone la maquina asi que perdon por tantas images).


Creamos un Método que llamamos GrabarUsuario, declaramos la variable usu que es de la clase tutorial usuario y que contiene la tabla usuarios.


Ahora le decimos que usu.NombreU que es el campo NombreU de la tabla usuarios sea igual al contenido del txtUsuario.text, lo mismo para usu.Password=txtContraseña.text.


Acto seguido decimos que la entidad mibase.usuarios.add(usu); lo que hace es agregar con add a mibase usuario los valores de usu que cargamos recién con los valores de los textbox y después solo nos queda grabar con mibase.savechanges();.Listo por ahora dejamos este método que ya lo vamos a llamar pero tenemos que hacer algunos pasos antes.


Vamos a crear otro método igual al anterior pero para grabar sobre la tabla permisos.


establecemos perm.usuario=txtUsuario.text y perm.MenuAdministrar=false


perm.SubMenuCrearUsuario=false, perm.SubMenuCambioClave=false y perm.SubMenuPermisos=false


Bueno en este método se darán cuenta lo que hacemos en la tabla permisos agregamos un usuario nuevo luego establecemos que los campos menu estén en false todos, también vamos a dejar este metodo ya lo vamos a usar enseguida,


Creamos otro método llamado VerificarUsuarioRepetido dejo el codigo aqui

private void VerificaUsuarioRepetido()
        {
            var existe = mibase.Usuarios.Any(x => x.NombreU == txtUsuario.Text);

            if (existe)
            {
                MessageBox.Show("El nombre de usuario ya esta en uso");
            }
            else
            {
                GrabarUsuario();
                GrabarPermisos();
                MessageBox.Show("El Usuario se creo exitosamente");
                this.Close();
            }
        }

Este método buscara que no exista otro usuario con el mismo nombre caso contrario grabara normalmente un usuario nuevo.


Volvemos a la pestaña diseño seleccionamos el botón grabar le hacemos doble click para que nos cree el evento y copiamos esta rutina como ven y ya voy a dejar el codigo, esta rutina verifica que los textbox no estén vacíos, si todo esta bien continua y llama al método VerificarUsuarioRepetido que hicimos recién, como ven es secuencial en el formulario creamos 2 métodos el método de usuario graba en la tabla usuarios nombre de usuario y su contraseña y el segundo método graba en la tabla permisos un usuario nuevo y establece los menús en false a estos 2 método los pusimos dentro del método que verifica que no este repetido luego desde el evento click del boton que también es un método primero verificamos que las caja de texto no esten vacias y comienza la secuencia.
Código -->
private void btnGrabar_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtUsuario.Text) || (string.IsNullOrEmpty(txtContraseña.Text)))
            {

                MessageBox.Show("Los datos no pueden estar vacíos");

                return;

            }
            VerificaUsuarioRepetido();
        }


Y por ultimo creamos el evento del boton cancelar para que salga de la pantalla, este capitulo va a ser extenso porque para que se entienda y se pruebe bien todo tiene que estar completo así que paciencia y continuemos por ahora el formulario crear usuario esta terminado pero no lo vamos a probar todavía.


Agregamos un nuevo formulario llamado FrmPermisos.


Vamos a dejar el formulario como se muestra en la imagen agregando un label, un combobox, un button, un groupbox que se encuentra en la barra de herramientas en la parte contenedores y cuatro checkbox y establecemos las propiedades
FrmPermisos ---text=Permisos del Sistema
frmPermisos ---StarPosition=CenterScreen
label1 --- text= Usuarios:
combobox --- name=cmbUsuarios
combobox --- dropdownstyle=DropDownList
button --- name=btnCargar
button ---text=Cargar
GroupBox---name=groupAdministrar
GroupBox---text=Menu Administrar
dentro del groupbox vamos a poner los checkbox
checkbox1 --- name=chkAdministrar
checkbox1 ---text=Administrar
checkbox2 ---name=chkCambioClave
checkbox2---text=Cambio Clave
checkbox3 ---name=chkCrearUsuario
checkbox3 ---text=Crear Usuario
checkbox4 ---name=chkPermisos
checkbox4 ---text=Permisos
una vez establecidas las propiedades de cada control presionamos F7 y pasamos a la pestaña código del formulario.


Como ya dijimos antes declaramos la entidad del modelo

Creamos un Método CargarUsuarios.

Creamos una variable usu y la cargamos con la lista de la tabla usuarios.

Establecemos el datasource del combo Usuarios con la variable usu.

Y le decimos al cmbUsuarios.DisplayMember="NombreU" o sea que muestre el valor del campo NombreU, pero como la tabla tiene un campo Id que es la clave principal entonces decimos que cmbUsuarios.ValueMember="Id" o sea que busque el Id de la tabla pero que muestre el nombre.


Vamos a la pestaña diseño hacemos doble click en el formulario y nos creara el evento load del formulario este evento es cuando carga el formulario, y llamamos el metodo cargausuarios lo que hará es llenar el combo con el listado de usuarios que estén cargados en la tabla.


Creamos un método llamado CompruebaPermisos.


Declaramos una nueva entidad para ser usada en el método y luego declaramos un variable query puede ser cualquier nombre por costumbre yo uso query y vemos la ventaja de usar LINQ ya que hacemos la consulta sql de forma integrada al lenguaje diciendo que query sea igual a una variable que le puse p puede ser también cualquier nombre que contenga mibase.permisos o sea por el momento query es igual a p y p es igual al contenido de la tabla permisos que esta dentro del modelo por eso mibase.permisos


Completando la consulta decimos where(donde) p.usuario sea igual a el contenido del combobox que quedaría where p.usuario == cmbUsuario.Tex , para no crear confusión en c# el == es de comparación y el = de asignación, entonces si A=1 estamos asignando el valor 1 a la variable A y si decimos A == 1 entonces estamos comparando que la variable A valgo 1, por ultimo decimos select p y cerramos con el punto y coma la consulta, como resultado final la variable query seria el resultado de buscar en la tabla permisos en el campo usuario lo que contenga el texto del combobox


Muy bien ahora hacemos un foreach (La estructura repetitiva foreach es utilizada para recorrer colecciones de datos).  En nuestro caso ya seleccionamos el usuario en la tabla permisos (Permisos p in query) entonces ahora vamos a recorrer los campos menús de la tabla de ese usuario seleccionado.


Y dentro del bucle foreach usamos la propiedad checked de los checkbox esta propiedad admite verdadero o falso, entonces le decimos que asigne el valor que contenga el campo que en nuestro caso seria chkAdministrar.checked=p.MenuAdministar, si el campo MenuAdministar de la tabla permisos esta en true(verdadero) el chkAministrar aparecerá marcado, hacemos lo mismo para cada checkbox.Ya saben ustedes pueden agregar mas campos menús y el procedimiento es igual para todos.


Y terminamos de asignar los checkbox a los valores que contiene la tabla. Aclaración en la imagen anterior a esta pueden observar que esta subrayado con rojo esto indica errores en el código, visual studio analiza la codificación y verifica sin necesidad de depurar si algo no esta bien. Aqui lo que paso es que me olvide en la tabla permisos cuando la creamos es destildar en modo diseño la opción aceptar valores nulos, entonces abren sql buscan la base de datos tutorial y dentro de esta la tabla Permisos la abren en modo diseño "esto ya la vimos así que solo les voy a decir que hacer" y destildan la opcion "Permitir valores NULL" a todos los campos de esta tabla, una vez hecho esto hacemos en visual studio doble click en Model1.edmx para abrir el modelo de base de datos actualizamos y listo se corrige el error. (Nota cada vez que cambiemos algo en nuestra base de datos es obligatorio actualizar el model para reflejar esos cambios).


Ahora vamos a crear un método CompruebaUsuario esta rutina la usaremos para controlar que no se pueda modificar los menús del usuario Admin.


Hacemos un if preguntando si el texto del combobox usuario es igual a "Admin" que en nuestro caso es el usuario administrador, ya saben si cambia el nombre de usuario admin también lo hacen aquí.


La estructura condicional if como su nombre lo indica comprueba una condición en este caso la condición es SI, entonces seria si cmbUsuarios.text == "Admin", si el texto del combobox es igual a "Admin" entonces entre las primeras llaves las instrucciones que escribimos si es verdadera la condición, en este caso mandamos un mensaje al usuario de la aplicacion lo hacemos con "MessageBox.Show("Aquí escribimos el mensaje que queremos mostrar");


Pero que pasa si la condición no es verdadera o sea el texto del combobox no es igual a "Admin" y necesitamos seguir escribiendo instrucciones entonces usamos "else". En resumen hacemos una comprobación si es igual mandamos un mensaje y si no es igual llamamos al método para que compruebe los permisos.


Creamos otro método llamado GrabaPermisos porque esta pantalla ademas de mostrar el estado de los menús también debe tener opción de modificar los mismos.


Este método es similar a CompruebaPermisos así que como en la imagen hacemos todo igual al anterior ya voy a mostrar las diferencias.


Notaran que el cambio radica en que se invirtió en el primer método asignamos el valor del campo de la tabla al checkbox , ahora asignamos el valor del checkbox al campo de la tabla permisos. Esto es porque el primer método debe mostrarnos en pantalla los estados de los menús y este método grabara en la tabla lo que asignemos por medio de los checkbox. Tranquilos ya vamos a probar todo y las cosas empezaran a tomar sentido.


Entonces después de establecer los permisos debemos grabar y usamos mibase.savechanges(); Importante que saquemos el savechanges del foreach puesto que como es un bucle repetitivo si lo dejamos dentro intentara grabar mientras el bucle esta en ejecución y no dará error. Posterior seleccionamos la linea "mibase.savechanges(); hacemos click con el botón derecho del mouse y buscamos delimitar con:, del menú desplegable seleccionamos "try" veremos como nos agrega unas lineas de código. El try catch sirve para interceptar errores de nuestra aplicacion en este caso vamos a comprobar que cuando grabemos no se produzca ningún error, aparte de interceptar los errores nos permitirá continuar con la aplicacion, puesto que se hubiere algún error nos mostrara una excepción y nos sacara de nuestra aplicacion con el try catch evitamos eso.


Una vez declarado el try catch si todo anda bien mostramos un mensaje diciendo que todo se grabo sin problemas,  caso contrario en el catch declaramos una variable "e" que valdra las excepciones del error y mostramos en un mensaje cual es el error llamando a la variable e y a su propiedad  mesage.(NOTA: como es un tutorial no siempre uso el try pero la verdad es muy importante interceptar los errores que puedan sacarnos de nuestra aplicacion, asi que como consejo siempre que graben en una base de datos deben usarlo o cualquier otra rutina que pueda generarnos problemas).


Volvemos a la pestaña diseño agregamos dos button con estas propiedades
button1 ---Name=btnGrabar
button1 ---Text=Grabar
button2 ---Name=btnSalir
button ---Text=Salir


Ahora desde la pestaña diseño seleccionamos uno por uno los button le hacemos doble click y creamos los respectivos eventos.


Y en cada evento llamamos a un método y al botón salir simplemente le decimos que cierre la pantalla.


Volvemos a la pantalla principal creamos el evento del menú permisos, creamos el metodo para abrir el formulario.


Y agregamos el método al evento para poder abrir la pantalla permisos. Bueno terminamos con esta pantalla continuemos.


Agregamos otro formulario que llamaremos FrmCambioClave (Dije que haríamos el menú administrador completo así al final probamos todo, tengamos un poco de paciencia. A estas altura ya deben saber cambiar propiedades asi que pongan como titulo del formulario "Cambio de Clave" y como siempre la posición de inicio sera centrada.


Agregamos 3 labels, 3 textbox y 2 button, como en la imagen las propiedades "Text" ya a esta altura la deben saber hacer por ustedes mismos, solo deben dejar los controles como en la imagen y a las propiedades name de los 3 textbox ponemos: txtusuario, txtContraseñaAnterior y txtContraseñaNueva y a los button escribimos: btnAceptar y btnCancelar. Bien una vez terminado seleccionamos el txtUsuario y buscamos su propiedad "Enabled" veran que esta en true (verdadero) y lo cambiamos por false (falso) y listo.


En el formulario cambio clave creamos la entidad y una variable publica (Nota: a medida que avanza el tutorial voy a ahorrar escritura explicando ya que muchas cosas la vimos y las explique)


Y en el formulario principal creamos el evento del menú creamos un método para abrirlo y en ese mismo método cargamos la variable publica.


En el load del formulario asignamos la variable _Usuario al txtUsuario


Creamos el método ActualizaClave tal como esta en la imagen.


Creamos otro metodo llamado VerificaUsuario como en la imagen.


Creamos el evento del botón aceptar.


Dentro del evento click del botón aceptar escribimos esto.



Y en el evento del botón cancelar solo damos la instrucciones para cerrar el formulario.


En el formulario principal creamos el evento cambio de usuario, lo hacemos tal como esta la imagen.


En el formulario principal creamos un método PermisosMenu este método se encargara de leer los permisos de los distintos menús.


Copiamos tal como esta en la imagen y como ven la rutina lo que hace es verificar en la base de datos el estado (Verdadero o falso) y en las propiedades "Enabled y Visible" de cada menú lo activa o desactiva según sea el caso.


Solo nos resta llamar el método PermisosMenu desde el load del formulario principal que se ejecuta justo después de la pantalla login verifica el usuario y sus permisos.

Bueno con esto terminamos ahora probamos todo, se hizo extenso pero como dije este menús involucra varios formularios y si hacia uno por uno no se entendería bien el concepto.


Ejecutamos la aplicacion después de la pantalla login ingresamos al sistema como estamos con el usuario admin este no tiene rectricciones, seleccionamos crear usuario.


Creamos el usuario nuevo llamado prueba y la contraseña igual aquí nos olvidamos de poner asteriscos en el textbox contraseña y como ya lo vimos a eso se los dejo como tarea grabamos y salimos.


Una vez creado el usuario prueba vamos a la pantalla permisos vemos que no tiene ningun menu habilitado como habíamos hecho cada vez que se creaba un usuario todo los menús deshabilitados.


Le asignamos permisos par el menú administrar y cambio de clave.


Cambiamos el usuario por prueba y vemos como no tiene acceso a permisos ni crea usuarios.


Por ultimo la pantalla cambio de clave que deja cambiar solo al usuario activo. Bueno quedaron caja de textos para poner asteriscos y probar que hace con el usuario admin o cuando están vacías las caja de texto todo eso se los dejo para que ustedes prueben y muchas rutinas de aquí se las puede aplicar o moldear según la necesidades de cada uno aunque este capitulo fue extenso pudieron ver que con LINQ se reduce mucho la codificación espero que les sea de utilidad y hasta el próximo capitulo.