jueves, 31 de marzo de 2016

[Android] ButterKnife: Enlazar componentes de vista al codigo rapidamente





Logo de la librería que se muestra en github https://github.com/JakeWharton/butterknife


ButterKnife es una librería desarrollada por Jake Wharton que permite enlazar rápidamente los componentes de la vista de android, mediante inyecciones de código permite  la interacción de los elementos con el código, es fácil de usar e implementar, aquí dejo un video sobre un pequeño ejercicio que realice. 




Referencias: 
Codigo de la aplicación ButterKnifeTest 
Pagina de ButterKnife 
GitHub de ButterKnife 

lunes, 21 de marzo de 2016

[C#] Una pequeña clase para conectar con MYSQL


Vamos a explicar el proceso de conexión a una base de datos Mysql con ayuda de una pequeña clase ya diseñada, que nos ayuda a gestionar las conexiones. Esta compuesta por 7 métodos que mas o menos cumplen las funciones basicas. 



Explicare una manera sencilla de implementarla. 

Lo primero que tenemos que hacer es para trabajar con Mysql tenemos que tener instalado el conector .Net el cual lo podemos descargar desde la siguiente dirección: 


Una vez instalado, podemos crear un proyecto como Windows Form, abrimos Visual Studio y añadimos las referencias que necesitaremos para trabajar con MYSQL, en este caso usaremos unicamente el conector Mysql.data. Para poder agregarlo le damos clic derecho en el proyecto y escogemos la opción de agregar referencia  


 Una vez que agregamos la referencia, agregamos la clase la cual puedes descargar desde el repositorio de GitHub que pongo en la parte de abajo del Post, la clase esta compuesta por el siguiente código: 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.Configuration;


namespace BackEndMysql.Controller
{


    /// 
    /// Clase para el manejo de las conexiones con Mysql
    /// Author: Cobymotion
    /// 
    public class ManageConnection
    {
        //variables de para la conexion 
        protected string ConnectionStringLocal;
        protected MySqlConnection SQLConexion;

        /// 
        /// Permite inicializar de las configuraciones la cadena de conexion y genera una conexion nueva 
        ///          
        public ManageConnection()
        {
            try
            {
                ConnectionStringLocal = ConfigurationManager.ConnectionStrings["ServerDb"].ConnectionString;
                //MySqlConnection SQLConexion = default(MySqlConnection);                
            }
            catch (Exception e)
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                ConnectionStringLocal = config.ConnectionStrings.ConnectionStrings["ServerDb"].ConnectionString.ToString();
                Console.WriteLine(e.ToString());
            }
            SQLConexion = new MySqlConnection(ConnectionStringLocal);
        }

        /// 
        /// Valida que se abra la conexion y la mantiene abierta
        /// 
        private void openConexion()
        {
            try
            {
                if (SQLConexion.State == ConnectionState.Closed)
                    SQLConexion.Open();
            }
            catch (MySqlException ex)
            {
                Console.WriteLine("Ocurrio un error  " + ex);
                closeConexion();
            }
        }

        /// 
        /// Cierra la conexion que se vaya a generar. 
        /// 
        protected void closeConexion()
        {
            if (SQLConexion.State == ConnectionState.Open)
            {
                SQLConexion.Close();
                SQLConexion.Dispose();
            }
        }

        /// 
        /// Metodo utilizado para ejecutar sentencias de SQL que tienen que ver con ingresar, 
        /// modificar o borrar
        /// 
        /// Sentencia de SQL completa que se quiere ejecutar
        /// Numero de parametros que se necesitan para utilizar
        /// Regresa verdadero si no ocurre ninguna exception 
        protected bool executeQueryUpdate(string sentencia, List parametros)
        {
            bool accept = true;
            openConexion();
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.CommandText = sentencia;
                comando.CommandType = CommandType.Text;
                comando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    comando.Parameters.Add(parametro);
                comando.ExecuteNonQuery();
                accept = true; 
            }
            catch (MySqlException e)
            {
                accept = false;
                Console.WriteLine("Error al tratar de ingresar al archivo");
                Console.WriteLine("Codigo error: " + e.ToString());
            }
            finally
            {
                closeConexion();
            }
            return accept; 
        }

        /// 
        /// Metodo utilizado para ejecutar procedimientos almacenados de SQL que tienen que ver con ingresar, 
        /// modificar o borrar
        /// 
        /// Sentencia de SQL completa que se quiere ejecutar
        /// Numero de parametros que se necesitan para utilizar
        /// Regresa verdadero si no ocurre ninguna exception 
        protected bool executeStoredProcedureUpdate(string nombreProcedimiento, List parametros)
        {
            bool accept = true;
            openConexion();
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.CommandText = nombreProcedimiento;
                comando.CommandType = CommandType.StoredProcedure;
                comando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    comando.Parameters.Add(parametro);
                comando.ExecuteNonQuery();
                accept = true;
            }
            catch (MySqlException e)
            {
                accept = false;
                Console.WriteLine("Error al tratar de ingresar al archivo");
                Console.WriteLine("Codigo error: " + e.ToString());
            }
            finally
            {
                closeConexion();
            }
            return accept;
        }

        /// 
        /// Metodo principal para acceso a la base de datos retorna un reader mediante un procedimiento almacenado
        /// 
        /// 
        /// 
        /// MysqlDataReader
        protected MySqlDataReader buscaRegistroStoredProcedure(string nombreProcedimiento, List parametros)
        {
            MySqlDataReader reader;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = nombreProcedimiento;
                sqlComando.CommandType = CommandType.StoredProcedure;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                reader = sqlComando.ExecuteReader();
            }
            catch (MySqlException ex)
            {
                Console.Write("ocurrio un error al leer " + ex);
                reader = null;
                closeConexion();
            }
            return reader;
        }

        /// 
        /// Permite tener acceso a la base de datos mediante una sentencia SLQ y regresa un Reader con los datos
        /// 
        /// 
        /// 
        /// MysqlDataReader

        protected MySqlDataReader buscaRegistroSQL(string sentencia, List parametros)
        {
            MySqlDataReader reader;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = sentencia;
                sqlComando.CommandType = CommandType.Text;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                reader = sqlComando.ExecuteReader();
            }
            catch (MySqlException ex)
            {
                Console.Write("ocurrio un error al leer " + ex);
                reader = null;
                closeConexion();
            }
          
            return reader;
        }

        /// 
        /// metodo que toma una sentencia SQL y la ejecuta para que pueda traer una tabla del dataset 
        /// Lo utilizo para meterlo en los grid o en los combos       
        /// 
        /// 
        /// 
        /// 
        protected DataTable getListSentenciaSQL(String sentencia, List parametros)
        {
            DataSet miDataSet = new DataSet();
            bool ban = false;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = sentencia;
                sqlComando.CommandType = CommandType.Text;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                MySqlDataAdapter myAdap = new MySqlDataAdapter(sqlComando);
                myAdap.Fill(miDataSet, "permitidos");
                sqlComando.Dispose();
                ban = true;
            }
            catch (MySqlException ex)
            { Console.Write(ex); }
            finally
            { closeConexion(); }
            if (ban)
                return miDataSet.Tables[0];
            else
                return null;
        }

    }
}


Una vez generada buscara en tu App.config de tu proyecto la variable ServerDb ques es la información que tiene que ver con la conexión y los datos de tu servidor. Esto lo puedes hacer directamente en el asistente, dando clic derecho en el proyecto, ir a la opción de propiedades y por ultimo dirigirnos a la opcion de settings, estando ahí puedes agregar una cadena de conexión que gracias al conector el asistente te guiara.


Una  vez que tengan la configuración púedes checar en el archivo app.config que tengas algo como esto, si es que te antecede el nombre de tu proyecto solo quitalo. Tendras algo como esto: 

     


Una vez que tengas esa configuración ya solo tienes que utilizar la clase en este caso supongamos que guardar los registros del cliente crearemos una clase como esta, y crearemos el metodo para utilizar dicha clase y simplemente vemos que es muy simple el trabajo con la clase . Note que heredamos al controlador del cliente la clase que maneja la conexión con esto solo tendremos que armar la sentencia o nombre del procedimiento que queramos ejecutar, agregar a una lista de parametros que necesitara la sentencia y solo mandarla a llamar


   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;

namespace BackEndMysql.Controller
{
    /// Heradamos para tener las conexión activa
    public class CtrlClientes:ManageConnection
    {
        /// 
        /// Metodo para buscar los registros de los articulos
        /// 
        /// retorna una tabla variable
        public DataTable FindAllResumen()
        {
            //sentencia que se ejecutara 
            String sentencia = "SELECT * FROM resumencliente";
            //Lista de parametros, si no se necesitan solo mandamos el elemento sin datos
            List parametros = new List();
           // mandamos llamar el evento de obtener lista a partir de sentencia y ya tendremos un DataTable con los datos
            DataTable tabla = getListSentenciaSQL(sentencia, parametros);
            return tabla;
        }


        /// 
        /// Metodo para agregar los clientes 
        /// 
        /// 
        /// 
        /// 
        /// 
        public bool addCliente(Cliente clienteDatos, int idusuario, string descripcion)
        {
            //El nombre del procedimiento 
            String procedimiento = "addcliente";
            //La lista de los parametros y el agregado de cada uno de ellos 
            List parametros = new List();
            parametros.Add(new MySqlParameter("@pnombre", clienteDatos.Cliente1.Nombre));
            parametros.Add(new MySqlParameter("@pdireccion", clienteDatos.Cliente1.Direccion));
            parametros.Add(new MySqlParameter("@ppoblacion", clienteDatos.Cliente1.Poblacion));
            parametros.Add(new MySqlParameter("@ptelefono", clienteDatos.Cliente1.Telefono));
            parametros.Add(new MySqlParameter("@pife", clienteDatos.Cliente1.Noife));
            parametros.Add(new MySqlParameter("@pidaval", clienteDatos.Aval.Idpersona));
            parametros.Add(new MySqlParameter("@plimite", clienteDatos.LimiteCredito));
            parametros.Add(new MySqlParameter("@pidusuario", idusuario));
            parametros.Add(new MySqlParameter("@pdescripcionmov", descripcion));
            Ejecución de la sentencia. 
            bool res = executeStoredProcedureUpdate(procedimiento, parametros);
            return res;
        }


       
    }
}


https://github.com/cobymotion/MysqlCSharp/


domingo, 20 de marzo de 2016

[Mysql] Como retornar el ID despues de una instrucción Insert







Mysql es un motor de base de datos que regularmente lo vamos a encontrar mas frecuentemente con la gran cantidad de servicios que utilizan este gestor, por lo que se nos presentan tareas que pensaria uno que es muy común sin embargo generan problemas. Muchas veces es necesario dentro de un procedimiento obtener el ultimo Id numérico para usarlo en la siguiente consulta en este caso te van algunas sugerencias. 

Tienes que la llave es numérica e incremental 

Cuando se tiene este caso, automaticamente sabemos que el Id es el numero mas grande podemos utilizar el método MAX para obtener el último registro

   Select MAX(idPruebas) from pruebas;


Tienes que la llave es autonumérica

Cuando tiene estas características puedes usar el Identity o la función Last_Insert_ID cualquiera de las dos te puede ayudar. 

   -- Aqui va el insert (necesario ejecutar identity despues del mismo) 
   SELECT @@identity AS id;


   -- Aqui va el insert (necesario ejecutar last_insert_id despues del mismo) 
   SELECT LAST_INSERT_ID();

En este caso, si ejecutas la siguiente operación que permite ingresar mas de un registro en una sola linea, regresara el del primer registro, ademas recordemos que last_insert_id maneja la sesión por lo que si estas en otra sesión no podrás recuperar el Id porque no esta guardado en la cache. 
   INSERT INTO pruebas(id, nombre) VALUES (1,"Uno"), (2,"Dos"), (3,"Tres");

Tienes un campo de Fecha/Hora que te permita ordenar 

En el caso de que tengas este campo y no tengas posibilidad de comparar numéricamente puedes usar un ordenamiento en inverso que permitirá traer el id. 
   Select idPruebas from pruebas order by hora desc limit 1;

Ninguna de las anteriores 

   Set @idVirtual:=0;
   Select @idVirtual:=@idVirtual+1, idPruebas from pruebas order by @idVirtual desc limit 1;

How to Get the Unique ID for the Last Inserted Row 

 

 

miércoles, 16 de marzo de 2016

[Web] CodeShare.io, publica tus fragmentos de código de manera sencilla


CodeShared es una aplicación web que permite pegar fragmentos de código de una manera muy sencilla y sin necesidad de crear una cuenta , podrás publicarlo y compartir los cambios en tiempo real. 


Entre las características mas llamativas que tiene, es que desde que entras a la pagina ya tienes un editor ya listo para empezar a escribir, en este caso tiene varias opciones en cuanto a la apariencia principalmente si estas acostumbrados a editores como lo son sublime, emacs y vim. Otra de las características especiales es que según lo que hagas en el editor se van viendo los cambios en tiempo real en las estaciones de los amigos con los cuales estas compartiendo el código, también importante es que puedes activar desde el sitio la vídeo llamada por lo que los usuarios pueden interactuar directamente con el código y su creador, que puede ya estar generado o se va generando, cosa que se en lo particular se me hace muy bien para la practica que me dedico que es la docencia. 

Ventajas 
   - No ocupas necesariamente tener una cuenta con las funciones básicas
   - Puedes cambiar la apariencia del área de trabajo
   - Las actualizaciones, selecciones y marcas son vistas en tiempo real 
   - Permite hacer notas referentes al código el cual se presentan como tip 
   - Maneja colores y separaciones basados en los principales lenguajes de programación 
   - Permite interactuar con los usuarios a través de las llamadas 

Enlace: 

Otra opción es : 


   



sábado, 5 de marzo de 2016

[MacOsX] Acentos en teclado ingles

Es una realidad que la las computadoras de apple no son necesariamente baratas aunque son una buena inversión, muchas veces cuidando la economía nos encontramos equipos que son importados por lo que la mayoría vienen con teclados incorporados en inglés (es decir sin ñ o acentos). Bueno aquí hay dos atajos que pueden ayudar.

Acentos

Para la letra acentuada sólo tendrás que poner esta combinación :

Option + e, letra a acentuar

En caso de la á sería así

Option + e, a

En el caso de las ñ la combinación será la siguiente

Option + n, minúscula/mayúscula de la n

En el caso de la ñ tendrá que ser así

Option + e, n

Nota: también en algunas aplicaciones NO TODAS en el caso de las letras acentuadas puedes dejar presionado la letra hasta que te aparezca un menú como el de ios que escoges el tipo de acento.

Si conoces alguna combinación te invitó a que agregues.