viernes, 1 de marzo de 2013

Enredo 'Mix Collations"

Error:  2013-03-01 11:01:45,192 [http-8080-2] ERROR fm.ApiController  - GET: /convenio/buscar: org.hibernate.exception.GenericJDBCException: could not execute query
2013-03-01 11:01:45,196 [http-8080-4] ERROR util.JDBCExceptionReporter  - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_spanish_ci,IMPLICIT) for operation '='

 
Situación: Un día agregé un nuevo dominio en mi aplicación Grails con MySQL,  como es lógico se creó una tabla en mi base de datos, realicé mi desarollo el cual incluyó hacer un cruce entre tablas anteriores y la nueva, hasta ahí todo ok,  pero como siempre el error antes mencionado surgió cuando hice el despliege en producción !!  (el karma eterno de los desarrolladores).

Diagnóstico: La tablas anteriores y la nueva no tenian el mismo collation (parece tan obvio después que sabes que esto y como lo solucionas :D )
Para saber ver que collation tiene cada tabla se consulta la la tabla tables en la base de datos information_schema en MySQL



Solución: Ir a las tablas resultantes de la consulta anterior y hacer el cambio de collation a nivel de tabla y campos, puesto que estos pueden ser distintos.

El cambio se pude hacer mediante la siguiente sentencia SQL:

viernes, 27 de julio de 2012

Groovy web console

Todo desarrollador Grails debe conocer Groovy web console,  una consola online de groovy que te ayuda muchisimo para hacer rapidamente pruebas pequeñas.
La interfaz es agradable e intuitiva, solo escribes tu codigo y le das "Execute script" y en obtendras la salida en la pestaña "Output",
ademas puedes guardar el codigo escrito para referencias futuras y ver los script escritos por otros.

lunes, 15 de agosto de 2011

Llenar un combo o g:select utilizando un Enum (Groovy - Grails)

En la mayoría de lenguajes de programación existe un tipo de datos llamado enumerado (Enumerated) o como suelen conocerse  Enum type, estos son fantásticos para una pequeña lista de datos que puedes utilizar en distintos puntos de tu aplicacion y cuyo contenido no van a cambiar en el futuro, y por tanto no amerita crear una tabla en nuestra base de datos. Ejemplo: los meses del año o días de la semana.

Particularmente esta entrada es sobre de uso de los Enum en Groovy en aplicaciones desarrolladas con Grails.


Paso 1 : Crear el enum
Podemos utilizar la versión simple
package org.blog.ejemplos

enum Dias {
    LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
}

o una versión más avanzada que nos permita añadir más funcionalidad

package org.blog.ejemplos

enum Dias {
      
       // Datos del enum
       LUNES(1, "Lunes","LUN"),
       MARTES(2,"Martes","MAR"),
       MIERCOLES(3,"Miércoles","MIE"),
       JUEVES(4,"Jueves","JUE"),
       VIERNES(5,"Viernes","VIE"),
       SABADO(7,"Sábado","SAB"),
       DOMINGO(8,"Domingo","DOM");

       private final int numero
       private final String nombre
       private final String abreviatura

       Dias(int numero,String nombre,String abreviatura){
             this.numero = numero
             this.nombre = nombre
             this.abreviatura = abreviatura
       }
            
       // Metodos Getters para acceder a las propiedades del enum
       private int numero() { return numero }
       private String nombre() { return nombre }
       private String abreviatura() { return abreviatura }

}
  
Paso 2 : Importar enum
Al inicio de nuestra página .gsp agregamos el tag necesario para importar nuestro enum

<%! import org.blog.ejemplos.Dias %>

<html>
    <head> … </head>
    <body> … </body>
</html>


Paso 3 : Obtener datos del enum

Creamos el g:select, en la propiedad optionKey escribrimos el valor que deseamos recuperar y en optionValue lo que queremos mostrar.
 
   <div class="dialog">
      <h2>Escoge tu d&iacute;a favorito:</h2> 
      <g:select id="dias" name="dias"
                noSelection="['': '']"
                from="${Dias.values()}"
                optionKey="abreviatura"
                optionValue="nombre"
                onchange="escribirDia(this)"/>
  </div>

 Adicionalmente y según sea nuestra necesidad, podemos definir una función javascript para recuperar el valor seleccionado.

<script type="text/javascript">
   function escribirDia(itemSeleccionado){

         // Devuelve el index de la opcion seleccionada, ej: 0,1,2... 
         var index = itemSeleccionado.selectedIndex        

         // Devuelve el valor de la opcion seleccionada
         var abreviatura = itemSeleccionado.value        

         // Devuelve el texto una opcion, segun el index dado         
         var nombre = itemSeleccionado.options[index].text 
        
      document.getElementById("tuDia").innerHTML = abreviatura  + " - " + nombre;
   }
 </script>
  

Resultado