lunes, 21 de julio de 2008

Como usar JSCalendar con .NET

Para poder usar correcta y efectivamente el JSCalendar con .NET lo mejor es crear una función que inserte el código al cargar la página. A continuación mi ejemplo:

protected void cargarJS()
{
String jsCalconfig;

ClientScript.RegisterClientScriptInclude("js1", "../js/jscalendar/calendar.js");
ClientScript.RegisterClientScriptInclude("js2", "../js/jscalendar/lang/calendar-es.js");
ClientScript.RegisterClientScriptInclude("js3", "../js/jscalendar/calendar-setup.js");

jsCalconfig = "Calendar.setup \n";
jsCalconfig += "( \n";
jsCalconfig += " { \n";
jsCalconfig += " inputField: '" + txtCumple.ClientID + "', \n";
jsCalconfig += " ifFormat: '%Y%m%d', \n";
jsCalconfig += " firstDay: 1, \n";
jsCalconfig += " weekNumbers: false, \n";
jsCalconfig += " showOthers: false \n";
jsCalconfig += " } \n";
jsCalconfig += "); \n\n";

ClientScript.RegisterStartupScript(this.GetType(), "CalendarioJS2", jsCalconfig, true);
}
Nótese que utilizo ClientScript.RegisterStartupScript y no ClientScript.RegisterClientScriptBlock porque el primero inserta el script al final del form y el segundo al comienzo (antes del input).

Para definir el control con el que se relacionará el calendario usamos la propiedad .ClientID, de este modo nos aseguramos de que mantenda el nombre en todo momento; ya que cuando se utilizan Master Pages los IDs de los controles se cambian al compilar el formulario.

Como el JSCalendar utiliza una hoja de estilos aparte debemos agregarla al header de nuestra página web, pero que pasa si utilizamos Master Pages ? Bien, acá esta la solución:

HtmlLink link1 = new HtmlLink();
link1.Href = "js/jscalendar/calendar-blue.css";
link1.Attributes["rel"] = "stylesheet";
link1.Attributes["text"] = "text/css";
this.Header.Controls.Add (link1);

Ejecutando esto en el Page_Load lo que hacemos es agregar el enlace a la hoja de estilos en nuestro encabezado. Dinámicamente, y sólo en las páginas que así lo requieran.

sábado, 19 de julio de 2008

La importancia de los índices en MySQL

Los índices en una base de datos se usan para encontrar filas con valores específicos en ciertas columnas rápidamente. Si no tenemos un índice, el servidor tiene que buscar desde el primer registro hasta el último, recorriendo toda la tabla para encontrar las filas que necesitamos.

Cuanto más grande la tabla, más tarda. Si tenemos un índice para la columna que estamos consultando (en where columna=algo) el MySQL puede encontrar el registro rápidamente sin tener que recorrer toda la tabla.

Veamos un ejemplo:

Tengo esta tabla de Ventas, con la sgte. estructura:

+----------+----------------------+
| sucursal | smallint(5) unsigned |
| fecha    | date                 |
| producto | int(10) unsigned     |
| precio   | decimal(10,3)        |
| vtadia   | decimal(10,3)        |
+----------+----------------------+

La tabla tiene unos 350.000 registros, y quiero sacar unas estadísticas de ventas de un cierto período para una sucursal en particular. El proceso que debo utilizar requiere que ejecute unas 200 consultas, dependiendo del período y de la sucursal.

Este fue el resultado antes de crear el índice:

Sucursal 1 - Enero 2008

Inicio: 2008-07-19 11:22:38
Fin: 2008-07-19 11:25:15
218 consultas enviadas a MySQL Server.

Ahora vamos a crear un indice para la columna producto (que es la base de mis estadísticas):

mysql> create index idx_vtadia_prod on vta_del_dia (producto);

Y este es el nuevo resultado:

Sucursal 1 - Enero 2008

Inicio: 2008-07-19 11:44:48
Fin: 2008-07-19 11:44:51
218 consultas enviadas a MySQL Server.

Interesante no ?