May 2007 - Artículos

Deshabilitas el atributo debug=false cuando pasas tu aplicación Web a producción? (III)

En mi anterior artículo hice referencia al primer artículo de Patrick donde explicaba la importancia de este atributo en lo que se refiere al performance de las aplicaciones Web ASP.NET, y hoy visitando su blog me he encontrado con la II publicación:

¿Por qué debo definir "debug=false" en web.config?, Parte II

Lectura recomendada.

Salu2

Llenar un combo con países utilizando System.Globalization

No siempre es necesario tener una tabla con países en una aplicación, por ejemplo, imaginate que te piden diseñar un formulario (Nombre, apellidos, pais...) para enviar una solicitud por correo electrónico y en los requerimientos del cliente entra el no utilizar DB pero no quiere que el formulario este abierto a errores de introducción de datos por parte del usuario en datos como el país..., y puedes pensar:

¿Y voy a tener que llenar el combo manualmente con todos los paises?

La respuesta es: NO

En NET disponemos de un espacio de nombres System.Globalization que nos ayuda a resolver este tipo de tareas y para este ejemplo 2 clases:

CultureInfo Class

RegionInfo Class

En el ejemplo que os presento, (Si lo probáis) os daréis cuenta que se repiten paises y no es que este mal. Eso se debe a que para un mismo país existen regiones diferentes por hablar diferente idioma, aunque el nombre de la región que se muestra es el del país, por ejemplo España (ES y ES-ES) tiene a parte del Español otros 3 idiomas reconocidos (Euskera EU-ES, Gallego GL-ES y Catalán CA-ES) , por eso he puesto al lado del nombre del país la cultura neutra y específica, eso sí, se puede mostrar sólo el país de cultura neutra y listo pero en el ejemplo he querido mostrarlo así.

   1:  public partial class _Default : System.Web.UI.Page 
   2:  {
   3:      protected void Page_Load(object sender, EventArgs e)
   4:      {
   5:          List<RegionInfo> regiones = new List<RegionInfo>();
   6:   
   7:          foreach (CultureInfo cultura in 
   8:                   CultureInfo.GetCultures(CultureTypes.FrameworkCultures))
   9:          {
  10:              try
  11:              {
  12:                  RegionInfo region = new RegionInfo(cultura.Name);
  13:                  regiones.Add(region);
  14:              }
  15:              catch { }
  16:          }
  17:          regiones.Sort(new OrdenacionCulturas());
  18:   
  19:          foreach (RegionInfo region in regiones)
  20:          {
  21:              ddlCulturas.Items.Add(new ListItem(region.DisplayName + 
  22:                  String.Format("({0})",region.Name) , region.Name));
  23:          }
  24:          ddlCulturas.DataBind();
  25:      }
  26:  }
  27:   
  28:  public class OrdenacionCulturas : IComparer<RegionInfo>
  29:  {   
  30:      CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer();
  31:   
  32:      public int Compare(RegionInfo x, RegionInfo y)
  33:      {
  34:          return _comparer.Compare(x.DisplayName, y.DisplayName);
  35:      }
  36:  }

 A parte he creado un comparador específico para ordenar el combo alfabeticamente.

Salu2

Publicado por Luis Ruiz Pavón | 7 comment(s)
Archivado en: ,,

Gambadas: Mis amigos me llaman Error...

Hoy dando una vuelta por http://worsethanfailure.com me he encontrado con esto:

Habrá que revisar la rutina que confecciona el correo o quizá se llame así el chaval... ya se sabe que en eso de los nombres los padres a veces son un poco raros...

Fuente: http://worsethanfailure.com/Articles/My-Friends-Just-Call-Me-Error.aspx

Salu2

Publicado por Luis Ruiz Pavón | 2 comment(s)
Archivado en:

Deshabilitas el atributo debug=false cuando pasas tu aplicación Web a producción? (II)

En mi anterior artículo hablaba sobre la importancia de este atributo de configuración en las aplicaciones web y el otro día encontré este otro artículo:

¿Por qué debo definir "debug=false" en web.config?, Parte I

La verdad es que os recomiendo leerlo es buenísimo, bien explicado, con imagenes que detallan la pruebas y el proceso, en fin...

Salu2 y a disfrutarlo.

Publicado por Luis Ruiz Pavón | 1 comment(s)

ASP.NET 2.0: Creando un Theme Global para todas nuestras aplicaciones web

Si necesitamos tener un Theme global en todas nuestras aplicaciones web y no queremos estar añadiendolo a manubrio en cada aplicación que desarrollamos, con estos pasos podemos conseguirlo:

  1. Crear la carpeta Themes en iisdefaultroot\aspnet_client\system_web\version\Themes, por ejemplo: C:\Inetpub\wwwroot\aspnet_client\system_web\2_0_50727\Themes
  2. Dentro de la carpeta Themes copiamos un Theme que nos hayamos creado en Visual Studio y que queremos que sea nuestro Theme Global:


  3. Aplicamos el Theme a nuestro sitio web entero a través del elemento del Web.Config <pages Theme="BlueTheme"> o <pages StyleSheetTheme="BlueTheme">

Nota: Visual Web Developer no reconoce el nombre global de nuestro Theme:

Pero ASP.NET si lo interpreta cuando ejecutamos nuestra aplicación:

Salu2

Publicado por Luis Ruiz Pavón | 2 comment(s)
Archivado en: ,,

Gambadas: El Redondeo

Leyendo hoy en el boletín de CAMPUS MVP la gambada del mes de Mayo, he recordado que tengo en mi HD portátil una que tenía vuelto el juicio a un cliente en el que estuve trabajando, ya que al cerrar la caja del mes, no cuadraba la facturación de las cuentas de ventas al contado (Unos eurillos) en las delegaciones donde estaba implantada la nueva aplicación y que a final de mes se envía a Central y se comprueba con una rutina de Oracle.

Me pidieron ayuda para solventar el problema y depurando la rutina de facturación me encontré esto:

   1:  /// <summary>
   2:  /// Trunca el número de decimales de un número al
   3:  /// indicado en el parámetro iNumDecimales
   4:  /// </summary>
   5:  /// <param name="dNumero">Numero a truncar</param>
   6:  /// <param name="iNumDecimales">Nº de decimales</param>
   7:  /// <returns></returns>
   8:  public double Redondear(double dNumero, int iNumDecimales)
   9:  {
  10:      try
  11:      {
  12:          string sTodo, sParteEntera, sParteDecimal;
  13:          string[] sNumero;
  14:          sTodo = dNumero.ToString();
  15:   
  16:          /* Si el número tiene parte decimal.*/
  17:          if (sTodo.IndexOf(".") != -1)
  18:          {
  19:              sNumero = sTodo.Split('.');
  20:   
  21:              sParteEntera = sNumero[0];
  22:              sParteDecimal = sNumero[1];
  23:   
  24:              if (sParteDecimal.Length > iNumDecimales)
  25:                  sParteDecimal = sParteDecimal.Remove(iNumDecimales, 
  26:                      sParteDecimal.Length - iNumDecimales);
  27:   
  28:              sTodo = sParteEntera + "." + sParteDecimal;
  29:          }
  30:          dNumero = double.Parse(sTodo);
  31:          return dNumero;
  32:      }
  33:      catch(Exception _ex)
  34:      {
  35:          throw new ...(_ex,"Factura","Redondear");
  36:      }
  37:  }

La solución fue sencilla:

   1:  /// <summary>
   2:  /// Trunca el número de decimales de un número al
   3:  /// indicado en el parámetro iNumDecimales
   4:  /// </summary>
   5:  /// <param name="dNumero">Numero a truncar</param>
   6:  /// <param name="iNumDecimales">Nº de decimales</param>
   7:  /// <returns></returns>
   8:  public decimal Redondear(decimal dNumero, int iNumDecimales)
   9:  {
  10:      return Math.Round(dNumero, iNumDecimales);
  11:  }

Salu2

Publicado por Luis Ruiz Pavón | 13 comment(s)
Archivado en:

Use XML Query Definitions in .NET Applications

No he querido cambiar el título original del artículo y es que hoy visitando una de mis sitios favoritos SitePoint y dado que me ha surgido la duda en mi proyecto actual en una aplicación Web (Supongo que a muchos de los que leáis este post os habrá pasado) que es parametrizar las sentencias sql en un fichero de configuración xml junto con los parámetros para no tener que estar tocando código cada vez que haces una modificación en la sentencia que no implica un cambio en el código c#/vb.net y también para poder hacer un copy/paste de la sentencia del fichero en el Analizador de consultas, SQL Plus... o viceversa, para todos los que tengais esta inquietud y necesitais una ayuda para enfocarlo he encontrado este artículo:

Use XML Query Definitions in .NET Applications by David Clark

Salu2 y a disfrutarlo.

Publicado por Luis Ruiz Pavón | con no comments

EL evento OnInit y Page_Load se ejecutan 2 veces

Estoy desarrollando un control ASP.NET que hereda del control Image y probandolo en nuestra aplicación, me he dado cuenta que los eventos OnInit y Page_Load se estaban ejecutando 2 veces y antes no pasaba, con lo cual he pensado que el problema estaba en mi control, así que me he puesto como loco a modificar/comentar código sin obtener un resultado satisfactorio, y todo esto sin asignarle una ruta de una imagen a su propiedad ImageUrl y ahora es donde viene lo bueno, le asigno una imagen a su propiedad ImageUrl para probar y se soluciona, con lo cual esto tiene que ser un bug de ASP.NET.

Lo que si se aprecia es que al no ponerle una imagen ASP.NET renderiza el control con el src vacío:

   1:  <img id="ctl00_mainContent_ImageButtonMatchCodeClientes"
   2:  OnClick="ShowMatchCodeImageButtonMatchCodeClientes();return false;"
   3:  OnMouseOver="this.style.cursor = 'hand';" 
   4:  src="" style="border-width:0px;" />

¿Alguien sabe porqué se ejecutan esos 2 eventos 2 veces cuando no se le asigna una imagen al control?

Salu2