viernes, diciembre 21, 2007

Descarga directa en PDF de un reporte de CrystalReports en ASP.NET 2.0

Cuando en una pagina quieres que el usuario al dar click en un boton descargue directamente un archivo PDF que sea el producto de la exportación de un reporte de CrystalReports este es el codigo que debes de usar

Dim Reporte As New MiReporte
'Se llena con información el reporte

Dim oStream As New System.IO.MemoryStream
oStream = Reporte.ExportToStream _
(Reporte.ExportOptions.ExportFormatType.PortableDocFormat)


Response.Clear()
Response.Buffer = True
Response.ContentType = "application/pdf"
Response.AddHeader("Content-Disposition", "attachment;filename=" + "Archivo.pdf")
Response.BinaryWrite(oStream.ToArray())
Response.End()

lunes, mayo 07, 2007

Debbug de Javascript en Visual Studio

Visual Studio .NET 2005 por si es capaz de hacer debbug a codigo javascript, solo que por default Internet Explorer tiene bloqueda esta opcion, pero lo bueno es que es facil volver a admitirla.
Para hacer esto solo hay que seguir los siguientes pasos:

  • En opciones de internet entrar a la pestaña de avanzados.
  • Aqui debe haber una opcion con algo parecido a deshabilitar debbuging del cliente, quitas esa selección y listo.
Ahora ya puedes colocar breakpoints en tu proyecto web, y podras hacer debbug como si fuera un codigo VB o C# normal

viernes, abril 20, 2007

Triggers DML con eventos multiples en SQL Server 2005

En este articulo se describe una forma en que se puede tomar en cuenta para manejar más de un solo evento en los triggers DML

La sintaxis para crear triggers DML es la siguiente

CREATE TRIGGER nombre_trigger
ON { tabla | vista }
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sentencia_sql [ ; ] [ ,...n ] | EXTERNAL NAME
}

Pero...que pasa si no quieres hacer un trigger para cada evento, y en vez deseas hacer un solo que responda a cualuqier evento, en ese caso esta es una buena opcion

Primero que nada hay que saber que en los triggers se generan tablas temporales, una llama INSERTED y otra DELETED

Cuando se inserta un registro y un trigger responde a ese evento entonces se llena la tabla INSERTED, en caso de eliminar un registro se llena la tabla DELETED, mas sin embargo no hay una tabla UPDATED en vez se llenan las dos tablas son la información de lo que se inserta y lo que se borra

Esto ultimo es la base para lo que a continuación se va a realizar, la parte importe es hacer condiciones las cuales distingan cual fue la o las tablas que se llenaron, lo cual con un SELECT COUNT(*) se puede realizar, esto resulta algo asi:


CREATE TRIGGER nombreTrigger ON nombreTabla
FOR INSERT, UPDATE, DELETE
AS
IF (SELECT COUNT(*) FROM INSERTED) > 0 AND (SELECT COUNT(*) FROM DELETED) > 0
BEGIN
'Sentencia SQL
REURN
END
IF (SELECT COUNT(*) FROM INSERTED) > 0
BEGIN
'Sentencia SQL
END

IF (SELECT COUNT(*) FROM DELETED) > 0
BEGIN
'Sentencia SQL
END


En la primera parte se hace una condicion para saber si ambas tablas estan llenas lo cual indica un UPDATE, si es cierto sale del triger de lo contrario continua la seleccion.En la segunda y tercera parte se distingue que tabla por individual esta llena. En este punto ya podemos saber que evento disparo el trigger y podemos actuar debidamente

Gracias a el Rola por su colaboración en este articulo