Relación entre las propiedades MinDate, MaxDate y Value del control DateTimePicker

Hoy mientras corregía detalles de una pequeña aplicación, me topé con un error que involucraba a las propiedades mencionadas en el título de la entrada. El código a grandes rasgos era el siguiente:

[csharp num=11 start=1]using System; using System.Windows.Forms; class App { public static void Main (string[] args) { DateTimePicker dtp = new DateTimePicker(); dtp.MinDate = new DateTime(2007, 10, 01); dtp.MaxDate = DateTime.Now; // Simular la acción del usuario dtp.Value = DateTime.Now.AddSeconds(10); } }[/csharp]

Bien, las propiedades MinDate y MaxDate sirven para hacer que el valor de la propiedad Value esté en ese rango de fechas, lo interesante de ésto es visualmente también se aplica la restricción, es decir fechas fueras de ese rango están deshabilitdadas.

Retomando el punto, el problema en el código mostrado es que en la línea 11 se asigna la fecha y hora del momento en que se ejecuta esa línea, por lo que si un usuario intenta seleccionar la fecha actual segundos o minutos más tarde, se producirá una excepción del tipo ArgumentOutOfRangeException..

La solución para este problema es asignar un valor para MaxDate que esté lo más cercano posible al día siguiente:

csharp:
using System;
using System.Windows.Forms;

class App
{
        public static void Main (string[] args)
        {              
                DateTimePicker dtp = new DateTimePicker();
               
                dtp.MinDate = new DateTime(2007, 10, 01);
                dtp.MaxDate = DateTime.Today.AddDays(1).AddTicks(-1);

                // Simular la acción del usuario
                dtp.Value = DateTime.Now.AddSeconds(10);
        }
}

Como anécdota de esta entrada, mientras hacía pruebas con los ejemplos en Ubuntu*, extrañamente no pasaba lo mismo que con el .NET Framework de Microsoft. Luego de darle una mirada al código, me percaté que Mono no implementa correctamente esta parte, así que tuve que hacer el reporte correspondiente que pasado unas horas ya lo solucionaron. 😉

*: Mi disco duro pasó a mejor vida 🙁 e instalé ubuntu en otro disco que tenía por ahí, supongo que toda esta semana usaré Ubuntu al 100% -- hace tiempo que no usaba un entorno gráfico en Linux. 🙂

NHibernate y PostgreSQL

Esta es la primera de dos entradas donde mostraré -de manera básica, como realizar reportes usando NHibernate , PostgreSQL y los controles para Reportes (ReportViewer) que trae cualquier instalación de Visual Studio 2005 -corríjanme si me equivoco 🙂 .

NHibernate es un framework que hace el mapeo de un modelo orientado a objetos a uno relacional.

Al usar NHibernate para el acceso a datos el desarrollador se asegura de que su aplicación es agnóstica en cuanto al motor de base de datos a utilizar en producción, pues NHibernate soporta los más habituales en el mercado: MySQL, PostgreSQL, Oracle, MS SQL Server, etc.

NHibernate tiene demasiadas características como para hablar sobre alguna en especial en este par de entradas, además que ya se ha escrito bastante sobre estos temas. En este apartado, sólo quiero hacer notar un pequeño detalle al momento de trabajar con PostgreSQL como base de datos.

xml:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <nhibernate>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="hibernate.dialect" value="NHibernate.Dialect.PostgreSQLDialect" />
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.NpgsqlDriver" />
    <add key="hibernate.connection.connection_string"
         value="Server=192.168.1.20;Database=test;User Id=alex;Encoding=LATIN1;" />

  </nhibernate>
</configuration>

Como se puede apreciar en el código mostrado, la cadena de conexión incluye un parámetro Encoding -sólo sirve para PostgreSQL, donde se especifica la codificación de caracteres que usará nuestra aplicación en la comunicación con el servidor de Base de Datos, si bien es cierto que PostgreSQL intentará hacer automáticamente una conversión entre la codificación definida en el servidor y la del cliente, es recomendable utilizar explícitamente la misma codificación en ambos extremos.

En la siguiente entrada, se tocará específicamente el diseño de reportes usando un ensamblado que contiene nuestro modelo.

Class Diagram for NHibernate Sample

Mono Migration Analyzer

Mono Migration Analyzer analiza los ensamblados .NET para determinar si éstos son compatibles o no con Mono.

Por ejemplo, estos son los resultados del pequeño exploit que publiqué hace tiempo:

Mono Migration Analyzer results

MoMA Scan Results

Scan time: 28/11/2006 02:33:03 p.m.

For descriptions of issues and what to do, see http://www.mono-project.com/MoMA_-_Issue_Descriptions.

xploit.exe
Methods missing from Mono
Calling Method Method not yet in Mono
Class BuayaCorp.Main:
void InitializeComponent() void Form.add_FormClosing(FormClosingEventHandler)

Miguel de Icaza comenta algunos resultados enviados a través de esta aplicación.

Actualización

Más datos sobre el feedback que se envió a través de Mono Migration Analyzer