lunes, 16 de enero de 2012

Internet Explorer 9 y su "Modo de compatibilidad"


Otro Poltergeist cazado, esta vez relacionado con Internet Explorer 9 y su “modo de compatibilidad”.

Estaba haciendo una web con Visual Studio 2010 en un entorno de desarrollo local.

Todo salía como estaba previsto, pero cuando lo publicaba a un servidor web de la intranet, el diseño cambiaba bastante. EL MISMO CÓDIGO.

Mirando la herramienta de desarrollo que acompaña al Internet Explorer 9 (tecla F12), el modo documento en mi entorno local rezaba “Estándares de IE9”, y cuando veía la página en el servidor web de la intranet, figuraba “Estándares de IE7”

Después de mucho pelearnos y mucho prueba-error, nos dimos cuenta que INTERNET EXPLORER tiene activado el modo de compatibilidad para las intranets por defecto.

O sea, que todas las páginas que navegas en la intranet las obtienes en formato IE7.

¿Cómo se cambia esto?

Herramientas -> Configuración de la vista de compatibilidad -> deshabilitar “Mostrar sitios de la intranet en Vista de compatibilidad”





Saludos.

ACTUALIZACIÓN 9/5/2012

Poniendo
<meta http-equiv="X-UA-Compatible" content="IE=8" />
en el head de la página, forzamos al navegador a que use el modo de Internet Explorer 8
Fuente:  http://msdn.microsoft.com/es-es/library/cc288325(v=vs.85).aspx






 

viernes, 13 de enero de 2012

Pasando parámetros mutivalor de Reporting Services en procedimientos almacenados de MySQL

Configurar los parámetros con mútiples valores en SSRS no tiene mayor dificultad.
Se trata de elegir el parámetro que queremos pasar a multi valor, e indicarlo en un checkbox.

Lo que hace es pasar una lista de valores con los valores elegidos.
Si el acceso a datos lo hacemos a través de una consulta SQL, cambiaremos la consulta
“select * from usuarios where user_id=@PARAMETRO”
Por
“select * from usuarios where user_id in (@PARAMETRO)”


Hasta ahí, sencillo.
La complicación viene cuando lo que llamamos no es una consulta, sino un Procedimiento Almacenado. Y si el procedimiento Almacenado está en MySQL, las cosas se ponen más negras.


Parte 1: Modificaciones en el informe
Si tenemos un Procedimiento Almacenado con 3 parámetros (“A”,”B”,”C”), si el parámetro B viene con multiples valores, le pasará al procedimiento (“A”,”B1”,” B2”, “B3”, “C”), y dará error ya que el procedimiento espera 3 parámetros, no 5.

Lo que hay que hacer es al parámetro multivalor B es traducirlo a un único string separado por comas, es decir, pasar de “B1”,”B2”,”B3” a “B1,B2,B3”, con lo que los parámetros del procedimiento serían 3 (“A”,”B1,B2,B3”,C”)

Esto lo conseguimos configurando los parámetros de los conjuntos de datos,  y escribiendo una función personalizada




=JOIN(Parameters!Usuarios.Value,",")

Parte 2: Modificación en la base de datos


Sql Server nos habría facilitado la vida un montón ya que tenemos más recursos disponibles(funciones con retornos de tabla, funciones de cadena mucho más ricas, splits, etc...).

Con MySQL hay que dar bastante rodeo.


La única manera con la que he conseguido hacer funcionar esto ha sido a través de una tabla temporal, y con muchas pegas, ya que las tablas temporales no se pueden leer más de una vez. (Increible....)

Nos creamos un procedimiento almacenado en MySQL que nos meta en una tabla temporal los valores B1, B2, B3
CREATE DEFINER = 'root'@'%'
PROCEDURE _fn_StringCSVToTmpTable(texto VARCHAR(65535))
BEGIN
  declare pos int;
  declare elemento varchar(100);
  declare texto2 varchar(65535);

  DROP TEMPORARY TABLE IF EXISTS tmp_datos;
  CREATE TEMPORARY TABLE tmp_datos (campo1 INT NOT NULL) ENGINE = MEMORY;

  set pos=INSTR(texto,',');
  WHILE pos<>0 DO
    set elemento=substring(texto,1, pos-1);
    set texto2=substring(texto,pos+1);
    set texto=texto2; 
    insert into tmp_datos values (cast(trim(elemento) as unisgned));
    set pos=INSTR(texto,',');
  END WHILE;

  if texto<>"" then
    insert into tmp_datos values (cast(trim(elemento) as unisgned));
  end if;
END

Luego, este procedimiento almacenado es llamado desde el procedimiento principal.

CREATE DEFINER = 'root'@'%'
PROCEDURE PA2(IN p1 INT, IN texto varchar(200), IN p2 INT)
BEGIN
  call _fn_StringCSVToTmpTable(texto);
  select * from users where login in (select * from tmp_datos);
END

Cargamos la tabla temporal y hacemos la búsqueda.
Espero que os sea de utilidad.

martes, 10 de enero de 2012

Driver ODBC 32 y 64 bits


Estoy preparándome un entorno de desarrollo para modificar un antiguo proyecto de Reporting Services que usa el conector de ODBC de MySQL.

Como estoy usando un Windows de 64 bits, me instalo el odbc de MySQL de 64 bits, hago la prueba y conecta bien a la base de datos.

El problema cuando intento usar el ODBC con el entorno de desarrollo BIDS (o Business Intelligence Development Studio), el plug-in de Visual Studio para Reporting Services.

Al intentar usarlo, me aparece el siguiente error:

“La arquitectura del DSN especificado no coincide entre el controlador y la aplicación”


El problema es que hemos instalado un ODBC de 64 bits  que usaremos en una aplicación de 32 bits.

Hay una forma de “bypassear” el problema.

La ubicación del Administrador de ODBC de 64 bits está en C:\Windows\System32\odbcad32.exe

Por compatibilidades, Windows 64 bits crea una carpeta SysWOW64 (Windows on Windows64) que contiene gran parte de aplicaciones de 32 bits para poder tener compatibilidad.

Por lo tanto, existe un Administrador de ODBC de 32 bits en C:\Windows\SysWOW64\odbcad32.exe

Cuando lo ejecutamos, en la carpeta controladores, vemos que el driver que tenemos de MySQL 64 bits no existe, y que tenemos los controladores de Access, Excel, TXT, etc.

Como solución final, ya os lo imagináis:

·         Borrar el ODBC

·         Borrar el driver de 64 bits de MySQL

·         Instalar el driver de 32 bits

·         Arrancar el administrador de ODBC de la carpeta C:\Windows\SysWOW64\odbcad32.exe

·         Crear un nuevo ODBC

Saludos.