Sunday, December 09, 2007

Convertir cadenas a texto capital

Muchas veces queremos formatear una cadena en caracteres con la primera letra de cada palabra en mayúsculas. Esto puede hacerse muy fácilmente con un poco de código, pero no siempre querremos que todas la letras sean convertidas, por ejemplo un artículo (el, la , los, etc) u otra palabra que no deba ser convertida. Por ejemplo, podemos tener el siguiente título:
"Declaración Jurada De Liquidación De Sueldos Para La Planilla Anual De La Empresa"

Puede ser que se vea mejor de la siguiente manera:
"Declaración Jurada de Liquidación de Sueldos para la Planilla Anual de la Empresa".

Para ello explicaré el siguiente código desarrollado en C#:

Primero que nada se tiene la enumeración CaracterNoCapital, la misma que define el conjunto de palabras que no serán convertidas a caracter capital.



public enum CaracterNoCapital
{
a = 1,
al,
con,
de,
del,
el,
ello,
en,
es,
la,
le,
las,
lo,
los,
mi,
no,
por,
para,
que,
te,
se,
si,
su,
un,
una,
y,
}


luego se tiene la clase Capital, la que expone un sólo método público estático, que requiere un texto a ser transformado y devuelve la cadena formateada. El código a continuación ha sido documentado en sus líneas para ser comprendido.


public class Capital
{
public static string ConvierteACapital(string pTexto)
{
// Se obtiene la coleccion de strings formateada
string[] partesCadena = FormatearCadena(pTexto);

//letraCapital = "";
string primeraLetra = "";
bool esCaracterNoCapital = false;

CaracterNoCapital miEnum = new CaracterNoCapital();
// Se obtienen los elementos de la enumeracion EnumCaracteresNoCapital
string[] enumArray = Enum.GetNames(miEnum.GetType());

for (int i = 0; i < escaracternocapital =" false;" a ="="" escaracternocapital =" true;" i ="="" primeraletra =" (partesCadena[i][0].ToString()).ToUpper();" aux =" 0;" letracapital =" new">= partesCadena.Length-2 )
letraCapital.Append(parte);
else
{
letraCapital.Append(parte);
letraCapital.Append(" ");
}
aux++;
}

return letraCapital.ToString();
}

private static string[] FormatearCadena(string pCadena)
{
// Se eliminan los espacios de los extremos de la cadena
pCadena = pCadena.ToLower().Trim();
// Se separa por el caracter ' '
string[] split = pCadena.Split(' ');

string textoParaSeparar = "";

foreach (string parteCadena in split)
{ // Se omiten espacios extra innecesarios
if (parteCadena != ""){
// Se añade cada parte de la cadena que no sea vacio
textoParaSeparar += parteCadena + "^";
}
}
// finalmente se separa el texto por el caracter "^"
string[] partesCadena = textoParaSeparar.Split('^');
return partesCadena;
}
}



Puntos clave
El algoritmo tiene por objetivo general aceptar una cadena, convertir a minúsculas toda la cadena, eliminar espacios en blanco, separar la cadena en palabras, identificar las palabras no capitales(definidos en la enumeración CaracterNoCapital) y finalmente formatear la cadena.

Sunday, July 29, 2007

Reportes en PDF con Report.net

Después de un buen tiempo lejos del mundo blog, vuelvo para hablar de una herramienta que me ha servido para hacer los reportes PDF en ya 3 sistemas de información, me refiero al open-source Report.net, una librería gratuita hosteada en sourceforge (report.net).

Se trata de una librería .net diseñada en lenguaje c# para generar reportes en PDF mediante asp.net y código puro y duro. Aunque a primera vista report.net puede parecer la vuelta al infierno de la generación de reportes, con una adecuada organización de código, llega a ser una herramienta excepcional para la generación de reportes con resultados que igualan y algunas veces superan a los acostumbrados reporteadores "visuales" tales como clásico Crystal Reports o XtraReports de DevExperience.


¿Ventajas?

Pues uno tiene el control total del reporte, es decir, puede manajar todos los aspectos del reporte, no sólo del cargado de datos, sino la creación dinámica de elementos según la programación lo requiera y defina. La libertad otorgada se resume en la customización completa del resultado del reporte. La librería funciona para las versiones 1.1, 2.0 y 3.0 de .net framework.

¿Desventajas?

Al no contar con una interfaz visual, es necesario definir todos y cada uno de los elementos del reporte, desde una tabla, línea de texto o caja de dibujo hasta una constante para definir los bordes. Se debe tener instalado Adobe Acrobat Reader, sugiero que esté instalada a partir de la versión 5.

¿Que tipo de contenido puedo generar?

Pues casi de todo: tablas, cuadros, adición de imágenes, párrafos, listas, formas, etc. Basta con descargar los ejemplos y ver los resultados que pueden realizarse.


Bueno, creo que es hora de un "Hola mundo". Para ello:

  1. Descargar la librería de aqui...

  2. Adicionar la librería Reports.dll a la carpeta bin de nuestra solución web.

  3. Crear una página asp.net llamada PaginaReporte.aspx y en el code-behind pegar el siguiente código

  4. Correr la página y listo.




using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Root.Reports;
using System.Drawing;

public partial class PaginaReporte : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ReporteEjemplo reporte = new ReporteEjemplo();
RT.ResponsePDF(reporte, this);
}
}

public class ReporteEjemplo:Report
{
FontDef _definicionFuente;
FontProp _propiedadFuente;

protected override void Create()
{
NuevaPagina();
InicializarPropiedadesReporte();
ImprimirHolaMundo();
}

private void InicializarPropiedadesReporte()
{
// Este estilo de fuente debe ser definido sólo una vez
_definicionFuente = new FontDef(this, FontDef.StandardFont.TimesRoman);
_propiedadFuente = new FontProp(_definicionFuente, 10, Color.Navy);
}

private void ImprimirHolaMundo()
{
page_Cur.AddCT_MM(100, 50, new RepString(_propiedadFuente, "Hola mundo... ¿que esperabas?"));
}
internal void NuevaPagina()
{
new Root.Reports.Page(this);
}
}

Espero publicar mas ejemplos de reportes para esta librería los siguientes días para ayudar a aquellos que como yo se han visto en la necesidad de crear reportes de manera gratuita.