17/06/08

Reportes Multi-idiomas usando Crystal Reports for VS 2005

Hola a todos , despues de mucho googlear , preguntar e investigar pude lograr
un reporte Multi-idioma , usando Crystal Reports para VS2005 , sobre .NET 2.0
Ahora recuerdan el post donde Listo Objetos de NHibernate con Crystal Reports.
Bueno , continuando, ese mismo reporte lo hare multi-idioma
1.- Para Cualquier Tipo de Aplicación Multi-idioma , ya se una pagina web o un Reporte en nuestro caso , es buena practica , tener un archivo de recursos.
Insertar un Archivo de Recursos:
image
Una vez insertado el Archivo de Recursos. agregamos claves , sabemos que para cada clave tiene un valor:
image
Cuando diseñamos un reporte , en Crystal Reports , automaticamente se agrega una Etiqueta en la Parte Superior de cada columna que vamos a Reportar , borramos estas etiquetas.
Insertamos "Campos de Formula", es muy importa que el Nombre de los Campos de Formula tengan el mismo nombre del Valor en nuestro Archivo de Recursos.
image
image
Despues usar Asistente, "NO AGREGAR NADA MAS" , Guardar y Cerrar.image
Los Campos de Formula se identifican por la "@" Por delante.
Vamos a usar un "Combo" (DropDownList) para cambiar de Idioma dinamicamente en tiempo de ejecución.
image
En el Evento del ComboBox:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.DropDownList1.SelectedValue == "Ingles")
{
CargarReporte("Ingles");
}
else
{
CargarReporte("Español");
}
}

En el Metodo CargarReporte:

public void CargarReporte(string idioma)
{
Comun<Entidades.Ordenes> listaOrden = new Comun<Entidades.Ordenes>();
Ordenes.DS.OrdenDS ordenDS = new Ordenes.DS.OrdenDS();
foreach (Entidades.Ordenes ord in listaOrden.ListarObjeto())
{
DataRow filaOrden = ordenDS.Tables["Ordenes"].NewRow();
filaOrden["IdOrden"] = ord.IDOrden;
filaOrden["NumeroOrden"] = ord.NumeroOrden;
filaOrden["Fecha"] = ord.Fecha;
filaOrden["Total"] = ord.Total;
filaOrden["Cliente"] = ord.Cliente;
filaOrden["Descuento"] = ord.Descuento;
ordenDS.Tables["Ordenes"].Rows.Add(filaOrden);
}
ordenDS.Tables["Ordenes"].AcceptChanges();
CrystalReport1 reporte = new CrystalReport1();
reporte.SetDataSource(ordenDS);
CrystalReportViewer1.ReportSource = reporte;
CambiarIdioma(reporte,idioma);
CrystalReportViewer1.RefreshReport();
}

En el Metodo CambiarIdioma()

private void CambiarIdioma(CrystalDecisions.CrystalReports.Engine.ReportClass crReport,string idioma)
{
FormulaFieldDefinitions crReportFields = crReport.DataDefinition.FormulaFields;
GetFormula(crReportFields,idioma);
}

En el Metodo GetFormula()

void GetFormula(FormulaFieldDefinitions crFormulaFields,string idioma)
{
if (idioma == "Ingles")
{
for (int intFieldCount = 0; intFieldCount < crFormulaFields.Count; intFieldCount++)
{
FormulaFieldDefinition crFormulaField = crFormulaFields[intFieldCount];
ResourceManager srcMan = Ordenes.Ingles.ResourceManager;
if (crFormulaField.Name != srcMan.GetString(crFormulaField.Name))
{
crFormulaField.Text = "'"+srcMan.GetString(crFormulaField.Name).ToString()+"'";
}
}
}
else
{
for (int intFieldCount = 0; intFieldCount < crFormulaFields.Count; intFieldCount++)
{
FormulaFieldDefinition crFormulaField = crFormulaFields[intFieldCount];
//crFormulaField.Text = "'" + srcMan.GetString("Cantidad").ToString() + "'";
ResourceManager srcMan = Ordenes.Espaniol.ResourceManager;
if (crFormulaField.Name == srcMan.GetString(crFormulaField.Name))
{
crFormulaField.Text = "'" + srcMan.GetString(crFormulaField.Name).ToString() + "'";
}

}
}
}

Observemos que las Etiquetas Aqui: estan en Español:

image

Despues de Cambiar el Indice del Combo:
Las Etiquetas estan en Ingles:

image

Es Importante Mencionar que hay que importar los espacios de Nombre:

using CrystalDecisions.CrystalReports.Engine;
using System.Resources;
Bueno espero les haya ayudado,
Muchas Gracias.
Jose Fabricio Rojas