March 2009 - Artículos
Este articulo se desprende de uno anterior.
y por el pedido de CARLOS A. RESÉNDIZ MARTÍNEZ (que tiene su blog Raptor-NET) y sus recordatorios :)…
Nota: me estoy dando cuenta que tiene un enlace a mi blog así que voy a tener que hacer buena letra y lo invito a que siga posteando en su blog Raptor-NET
En el articulo anterior quise mostrar como exportar, aquí vamos a exportar mediante ExportToHTTPResponse y directamente en el objeto Response con un MemoryStream
Este articulo viene con ejemplo para la descarga al final.
Exportando dentro de un UpdatePanel
Cuando queremos exportar dentro de un UpdatePanel nos envía el siguiente mensaje por tratar de escribir en el Response, que escribe o intenta escribir fuera del contenedor del UpdatePanel
Mensaje:
Line: 4723
Error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near '%PDF-1.2 %�� 1 0 ob'.
La imagen en mi IE8 de Windows 7:

Exportando
Aquí obtenemos el reporte y lo exportamos a la salida HTTP, sin necesidad de armar el content-type… damos el tipo de formato de exportación y listo. Como segundo parámetro recibe el objeto Response
protected void btnExportarPDF_Click(object sender, EventArgs e)
{
ReportDocument reporteDoc = ReporteCrear();
reporteDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "EjemploExportacion");
}
Ejemplo 2: armando la salida HTTP, utilizando ExportToStream
Aqui hacemos al viejo estilo de exportación, tomando el control del Reponse mediante un MemoryStream donde se encuentra el reporte
Con este MemoryStream también lo podemos enviar por email: String to Stream: para enviarlo como Attachment (tal vez otro post sobre un ejemplo de esto exclusivamente con Crystal Report)
El codigo para armar:
protected void btnExportarPDFv2_Click(object sender, EventArgs e)
{
//Cargar reporte. Enlazando a la fuente de datos.
ReportDocument reporteDoc = ReporteCrear();
System.IO.Stream streamPDF;
streamPDF = reporteDoc.ExportToStream(ExportFormatType.PortableDocFormat);
System.IO.MemoryStream stream = (System.IO.MemoryStream)reporteDoc.ExportToStream(ExportFormatType.PortableDocFormat);
Response.Buffer = false;
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=EjemploExportacion.pdf");
Response.ContentType = "application/pdf";
Response.BinaryWrite(stream.ToArray());
Response.End();
}
Pero en el UpdatePanel? No funciona. Hay que agregarlo a la coleccion de Triggers
Debemos agregar el botón en la colección de Triggers.
Esto lo debe hacer automáticamente el Update Panel lo de registrar cada control “interno” pero parece que hay un problema.
from MSDN:
“…Cuando la propiedad ChildrenAsTriggers de un control UpdatePanel se establece en true (valor predeterminado), los controles de devolución de datos que se encuentran dentro del control UpdatePanel se registran automáticamente como controles de devolución de datos asincrónica….”
Pero en este caso parecía que no :(, asi que hay que agregarlo a la colección de Triggers.
Así se puede exportar
Registrando el botón por código para actualizar asíncronamente? Tampoco me funciono
Tampoco me funciono registrar el control por codigo con el metodo ScriptManager.RegisterAsyncPostBackControl
En el ejemplo anterior para el botón btnExportarPDFv2 que esta dentro del UP
ScriptManager1.RegisterAsyncPostBackControl(btnExportarPDFv2);
NOTA: Si alguien me puede decir que pasa voy a agradecerlo!
Así que la única solución dentro de un Update Panel
Registrar el botón explícitamente (o sea mediante declaración) como Trigger.
Ejemplo para descargar
Si no puedes ver click aquí para la descarga
Enlaces
Esto es mas bien una protección que me gusto encontrarla, pero que no me permitía hacer justamente eso :), desde un diagrama modificar tablas.
En mi reciente instalación de Windows 7 en mi notebook, instalo el SQL 2008 para tenerlo + cerca e ir utilizándolo en mis pruebas, me arrojo el mensaje de protección
Mensaje:
No se se permite guardar los cambios Los cambios que se ha realizado requieren que se quiten y vuelvan a crear las siguientes tablas. Quizá ha realizado cambios en una tabla que no se puede volver a crear o ha habilitado la opción de Impedir guardar cambios que requieran volver a crear tablas
Me gusto este tipo de protecciones, pero me hubiera gustado que me dijese donde esta la opción. Pero de puro quisquilloso…
Donde esta la opción?
Herramientas >> Opciones
Luego en la opción de Designers >> "Impedir guardar cambios que requieran volver a crear tablas"
(from MSDN)
Evita que un usuario realice modificaciones que requieran volver a crear la tabla. Las acciones siguientes pueden requerir que se vuelva a crear una tabla:
- Agregar una nueva columna en la mitad de la tabla
- Quitar una columna
- Cambiar la nulabilidad de columnas
- Cambiar el orden de las columnas
- Cambiar el tipo de datos de una columna
Enlaces
A veces queremos que una de nuestras componentes de un proyecto en particular se instale en la GAC (Global Assembly Cache), por lo menos lo necesitaba en un proyecto ASP.NET
Pero… donde esta la carpeta en el listado que nos brinda el agregar archivos en el setup project?
En el proyecto de setup:
Vamos agregar una carpeta (que es el apuntador al GAC)
(se pueden agregar “carpetas especiales” incluso carpetas personalizadas)
Allí podremos insertar nuestros assemblys
Enlaces
Enviar un email con una presentación .ppt para salvar al mundo, U$S 0… (1min de tu vida para reenviarlo de otro amigo/a armarlo)
…recibir un SPAM de Viagra o del Bank of America U$S 0 (con 1 segundo de tu vida para eliminarlo)
…Sincronizar nuestras carpetas no tiene precio ni desperdicio :)
Por aquí en la empresa utilizamos desde que salió a la luz Google Apps desde el primer día que salió a la luz hace unos años (nos costo el cambio porque Francisco no quería dar el brazo a torcer el servidor de correo).
Como esta utilidad les ayuda a mis amigos Fabián y Federico (que todavía son fan del POP3)… que hace un par de días me hicieron recordar de este tema y por eso reflote este post (ya tengo menos en borrador)
Versión by Microsoft…
Aclaremos… en ese momento Live no existía, pero ahora Microsoft también tiene su plataforma Centro de administración de Windows Live (antes llamado Windows Live Custom Domains)
https://domains.live.com/
En Geeks.ms ofrece este servicio con dominio @geeks.ms … desde este enlace)
(que me dio oportunidad de probar el Outlook Connector, que será tema de otro post)
Seguimos con el tema del post… IMAP y Outlook
Aquí no vamos a ver como configurar IMAP de nuestra cuenta de Google Apps ya que eso lo tenemos por aquí, solo la configuración para forzar la descarga
Primeramente vamos a configurar las cuentas…
Allí en la configuración de correo, vamos a la configuración de Enviar y Recibir
Podemos hacer grupos de envió y recepción (pero en este caso utilizamos el que nos asocia por defecto)
Y en nuestra cuenta (del lado derecho) la seleccionamos y configuramos RECIBIR ELEMENTOS DE CORREO
La opcion predeterminada de IMAP es “Descargar encabezados…” yo la cambie en la carpeta Bandeja de Entrada que me descarga el elemento completo, me pareció bueno el comportamiento por carpeta.
Enlaces
Un amigo, Seba “Orchi”… me pregunta porque en su notebook los enlaces/hipervínculos dentro de mensajes que lee en su Outlook 2007 arrojaban el siguiente mensaje
Mensaje:
Operación cancelada debido a restricciones en este equipo. Póngase en contacto con el administrador del sistema
La pantalla:
Solución
Solamente restableciendo al Internet Explorer como el navegador predeterminado se soluciono (por suerte)
Luego se puede volver a utilizar su navegador preferido, que en este caso era Firefox