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.

sábado, 27 de febrero de 2016

[Linux] Reiniciar equipo cuando esta trabado

Muchas veces los sistemas operativos no están libres de errores y más si hay tantos cambios en diferentes distribuciones que manejan software no siempre compiladas en ellas. Esto provoca que aunque el kernel de linux sea estable no lo deja al margen de algún error provocando por ejemplo un kernel panic que puede hacer que perdamos el control del equipo. Para hacer un reinició completo utilizaremos la siguiente combinación de teclas

Alt + petsis(imprpant) + R, S, E, I, U y B

R -> pone el equipo en modo raw
S -> sincroniza medios de almacenamiento
E -> prepara y termina los procesos
I -> mata los procesos
U -> desmonta los archivos
B -> reinicia el equipo

domingo, 22 de noviembre de 2015

[Mysql] Configurar acceso remoto a root





Mysql se ha convertido en uno de los servidores que regularmente tendemos a utilizar por primera vez en el ambito estudiantil y porque no en el ambito profesional tambien, por su flexibilidad, por su facilidad de implementación y por las diversas opciones que tenemos en el mercado para la parte web regularmente te ofrecen, en este caso muchas veces necesitamos acceder de forma remota o simplemente con un gestor que sea mas comodo en mi caso con Workbench que para mi uso es perfecto, muchas veces mi servidor no esta en la misma maquina que estoy utilizando por lo que requiero conectar remotamente, por configuración predeterminada Mysql no tiene un usuario para ingresar de modo remoto por lo que tenemos que nosotros darle el permiso.

  1. Primero accedemos a nuestro servidor en mi caso de esta manera (en este caso se ejecutaran los comandos directamente en donde esta instalado el servidor) 

  2. Nos pedira la contraseña y accederemos a la consola de Mysql


  3. Una vez estando ahí daremos los siguientes comandos para dar permisos tomando en cuenta que el "%", es un wildcard de los nodos que permitira la conexión remota por lo que si ponemos 192.168.1.% significa que todos los nodos que pertenecen a la red 192.168.1.0 podran acceder.  
    
    mysql> GRANT ALL ON *.* to root@'%' IDENTIFIED BY ‘contraseña_de_acceso_remoto‘;
    mysql> FLUSH PRIVILEGES;
    
    


Con esto ya se podra acceder desde cualquier otra maquina utilizando el usuario root, si quieres proveer de dicho servicios a otros usuarios tendrías que repetir procedimiento en el workbench en la opción de usuarios

domingo, 8 de noviembre de 2015

[MySQL] Recorrer el resultado de un select dentro de un procedmiento almacenado o función





Muchas veces hay tareas en las que necesitas hacer consultas cruzadas, que muchas veces complican demasiado el codigo y pueden generar problemas a la hora de la ejecución, ademas que la depuración es mas complicada dentro tus funciones o procedimientos, por lo que en lo particular me gusta que muchas de las tareas las haga el motor de base de datos, asi generando una sola transacción remota, les comento un ejemplo: 

1) Tengo un procedimiento almacenado que libera los productos de un proceso en tienda, y estoy generando, este procedimiento recibe un texto, el cual el procedimiento parte y realiza las actividades. Lo llamaremos: stp_devuelve_producto(idusuario, productos)

2) Ahora quiero devolver todos los productos en un dia particular, por lo que necesitaria hacer una consulta del día, luego posteriormente de los datos recibidos, ejecutar las sentencias para devolver el producto, por lo que lo hare en el mismo procedimiento almacenado que llamaremos stp_cancel_day(dia, idusuario), usaremos CURSOR de mysql 


CREATE DEFINER=`root`@`localhost` PROCEDURE `stp_cancel_day`(pday datetime, pidusuario int)
BEGIN  
   -- Declaramos las variables necesarias 
   -- La primera para saber cuando se detendra la consulta
   DECLARE done INT DEFAULT FALSE;
   -- Esta variable son las que recibiran los elementos necesarios 
   DECLARE piddetalle int DEFAULT 0;
   -- La variable que declararemos para concatenar los resultados
   DECLARE cad text; 
   
   -- Recorre se llma la variable CURSOR que recorre en base a la consulta
   DECLARE recorre CURSOR FOR 
      SELECT idproducto FROM detalle_pedido WHERE day=pday AND estado='ABIERTO';     
   -- Se declara un manejador para saber cuando se tiene que detener 
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
   -- Se abre el cursor
   OPEN recorre; 
   SET cad = "";
   loop_recorre: LOOP   
       FETCH recorre INTO piddetalle,pidproducto;        
       -- Fetch lo utilizamos para leer cada uno de los registros
       -- If que permite salir del ciclo
       IF done THEN 
   LEAVE loop_recorre;
    END IF;
       -- Concatemos los datos 
       SET cad = CONCAT(cad,CAST(pidproducto AS CHAR),',',CAST(piddetalle AS CHAR),',');       
   END LOOP;
   -- cerramos el cursor 
   CLOSE recorre;    
   -- Devuelve productos
   call stp_devuelve_producto(pidusuario,cad);
  
END



Con esto podremos recorrer cualquier tabla y utilizar sus datos  espero sirva


viernes, 6 de noviembre de 2015

[JAVA] Cuenta vocales utilizando Map


Un pequeño ejercicio para contar vocales a través de una cadena


import java.util.HashMap;
import java.util.Scanner;


public class Cadena {
    
    public static void main(String[] args) {
          Scanner sc = new Scanner(System.in); 
          String cad = sc.nextLine(); 
          char[] car = {'a','e','i','o','u'};
          cad = cad.toLowerCase(); 
          HashMap< Character, Integer> cuenta = new HashMap <>();
          for(char c: car)
             cuenta.put(c, 0);
          for(int i=0;i< cad.length();i++)         
              if(cuenta.containsKey(cad.charAt(i)))
              {
                  int ii = cuenta.get(cad.charAt(i));
                  ii++; 
                  cuenta.replace(cad.charAt(i), ii);
              }
          for(char c: car)
          {
              int cantdad = cuenta.get(c); 
              if(cantdad>0)
                  System.out.println(c+"->"+cantdad);
          }
          
    }  
}