Noviembre 2008


Tarde o temprano, quienes hemos desarrollado soluciones con paquetes de DTS, sobre versiones de SQL Server 2000 o anteriores, debemos considerar la conveniencia de “convertir” los paquetes DTS a los servicios de integración de datos (ETL) que vienen incluidos en las nuevas versiones de SQL Server.

Las opciones son las siguientes:
- Seguir trabajando con paquetes DTS, para esto se debe instalar el DTS runtime para SQL Server 2008 que sólo funciona en la versión de 32 bits.
- Convertir los paquetes DTS a Integration Services, obteniendo mejoras de performance considerables.

Para ver más detalle de cómo implementar estas opciones en SQL Server 2008 les recomiendo ingresar a Migrating DTS Packages to Integration Services.

Para emitir reportes de Crystal Reports con XML primero hay que poder llevar la info que necesitamos a un archivo XML preferentemente con su esquema incluído en el mismo XML.
Eso lo hacemos del siguiente modo:

StringWriter sw = new StringWriter();
DataTable dt = SQLHelper.getDataTableFromInformix(“execute procedure sp_cons_imppag_cta(“ + nro_cuenta + “,” + cantidad + “)”, “Informix”);
dt.TableName =
“DetallePagos”;
dt.WriteXml(sw,
XmlWriteMode.WriteSchema);
//dt.WriteXml(@”C:\xml\detallepagos.xml”, XmlWriteMode.WriteSchema);
return sw.ToString();

La línea comentada sirve para grabar el XML en disco y poder usarlo para diseñar el reporte con Crystal.

Ahora que tenemos el XML y la forma de crearlo dinámicamente, faltaría ver cómo consumir ese XML, es decir, cómo pasárselo a Crystal para que procese la salida impresa:

CrystalReportSource1.Report.FileName = ConfigurationManager.AppSettings["PathCommons"] + “\\Reportes\\Socios\\ResumenCtaDetalle.rpt”;    
ReportDocument
CR = CrystalReportSource1.ReportDocument;
DataSet ds = new DataSet();
string resultado = AppResumenCuenta.getXMLByNroDoc(nroCuenta, vencimiento);
StringReader sr = new StringReader (resultado);
ds.ReadXml(sr);

CR.Database.Tables[0].SetDataSource(ds);

Para completar este ejemplo, mostramos cómo hacer para que la salida de Crystal Report se muestre del lado del cliente directamente en formato pdf:

 

MemoryStream oStream; // using System.IO
oStream = (MemoryStream)CrystalReportSource1.ReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);
Response.Clear();
Response.Buffer =
true;
Response.ContentType =
“application/pdf”;
Response.BinaryWrite(oStream.ToArray());
Response.End();

 

Si bien parece fácil y hay mucha info sobre el tema, para encriptar secciones del web.config se deben tener en cuenta unas cuantas cosas como ser: tiene que existir un repositorio de certificados en el servidor, el usuario que encripta tiene que ser el mismo que luego ejecuta la aplicación. Para no agregar más teoría e ir directametne al grano aquí va una secuencia de pasos que está probado que funciona, con algunos comentarios intercalados.

IMPERSONAR!
———–
runas /user:WSComercios cmd
REPARAR INSTALACION!
——————–
Para reparar el IIS:

aspnet_regiis.exe /i

 

PERMITIR AL USUARIO ACCESO A LA BASE DE DATOS DEL IIS!
——————————————————
Garantizo el acceso a cada usuario (definido en el AppPool de cada web)

aspnet_regiis.exe -ga WSSocios
aspnet_regiis.exe -ga WSComercios
aspnet_regiis.exe -ga WSEstudios
CREAR UN CONTENEDOR DE CLAVES
—————————–
El nombre “NetFrameworkConfigurationKey” se define en el machine.config. Es el nombre por default.
Se recomienda cambiar el nombre del contenedor de claves para poner en producción.
Si ya existe el contenedor no pasa nada.

aspnet_regiis -pc “NetFrameworkConfigurationKey” -exp

CONFIGURAR EL web.config DE CADA APLICACIÓN
——————————————-
En el web.config de cada aplicación debe tener la siguiente sección (copiar y pegar).
Ojo que el NAME lo voy a usar más abajo para encriptar.

 <configProtectedData>
  <providers>
   <add name=”WSSociosRSAProtectedConfigurationprovider” keyContainerName=”NetFrameworkConfigurationKey” useMachineContainer=”false” description=”Uses RsaCryptoServiceProvider to encrypt and decrypt” type=”System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”/>
  </providers>
 </configProtectedData>
DAR ACCESO AL CONTENEDOR DE CLAVES (Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
———————————-
OJO: hay que ejecutar cada comando impersonando al usuario al que quiero otorgar acceso.

runas /user:WSSocios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSSocios”

runas /user:WSComercios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSComercios”

runas /user:WSEstudios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSEstudios”
Los pasos de arriba se hacen solo una vez.
Luego se procede a solamente encriptar o desencriptar. :)

ENCRIPTAR!(Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
———-
OJO: hay que ejecutar cada comando impersonando al usuario del  App Pool de cada web.

runas /user:WSSocios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSSocios” -prov “WSSociosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSSocios” -prov “WSSociosRSAProtectedConfigurationprovider”

runas /user:WSComercios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSComercios” -prov “WSComerciosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSComercios” -prov “WSComerciosRSAProtectedConfigurationprovider”

runas /user:WSEstudios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSEstudios” -prov “WSEstudiosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSEstudios ” -prov “WSEstudiosRSAProtectedConfigurationprovider”
DESENCRIPTAR!(Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
————-
runas /user:WSSocios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSSocios”
aspnet_regiis.exe -pd “appSettings” -app “/WSSocios”
runas /user:WSComercios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSComercios”
aspnet_regiis.exe -pd “appSettings” -app “/WSComercios”
runas /user:WSEstudios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSEstudios”
aspnet_regiis.exe -pd “appSettings” -app “/WSEstudios”

Hay ocasiones en donde conviene enviar la salida de un reporte directamente a PDF, del lado del cliente en una aplicación web. De esta manera nos evitamos tener que instalar componentes del lado del cliente, por ejemplo, el CrystalViewer o fonts para la impresión de códigos de barras.

Aquí transcribo como ejemplo un fragmento de programa escrito en C#:

using  CrystalDecisions.CrystalReports.Engine;
using  CrystalDecisions.Shared;
using System.Configuration;
using  System.IO;

int nroCuenta = Convert.ToInt32(Request.QueryString["cuenta"]);
string vencimiento = Request.QueryString["vencimiento"];

CrystalReportSource1.Report.FileName = ConfigurationManager.AppSettings["PathCommons"] + “\\Reportes\\Socios\\ResumenCtaDetalle.rpt”; 
ReportDocument
CR = CrystalReportSource1.ReportDocument;
DataSet ds = new DataSet();
string resultado = AppResumenCuenta.getXMLByNroDoc(nroCuenta, vencimiento);
StringReader sr = new StringReader(resultado);
ds.ReadXml(sr);

CR.Database.Tables[0].SetDataSource(ds);

MemoryStream oStream; // using System.IO
oStream = (MemoryStream)CrystalReportSource1.ReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);
Response.Clear();
Response.Buffer =
true;
Response.ContentType =
“application/pdf”;