viernes, marzo 30, 2007

CLR Triggers


Todos en algun momento hemos tenido que hacer algun trigger en alguna tabla, pero que pasa si este trigger requiere de mucho procesamiento, SQL no esta diseñado para hacer mucho procesamiento, entonces la opcion es crear un Trigger CLR, este aparta de que se escribe con lenguaje .NET puede optimizar el uso de recursos

Cuando se vaya a tomar la decision de hacer un Trigger T-Sql o CLR se debe pensar primero en la complejidad del mismo

Una vez que tomamos la decision de que nuestro trigger empezemos a checar la sintaxis para crear un Trigger T-Sql

CREATE TRIGGER nombre ON tabla FOR evento AS sentencia_sql

Para poder crear nuestro Trigger CLR es necesario tener una sintaxis parecida pero solo con una pequela diferencia donde se deberia especificar la sentancia sql vamos a usar EXTERNAL NAME y la direcion de nuestro metodo; con lo cual nuestra sintaxis quedarioa así:

CREATE TRIGGER nombre ON tabla FOR evento AS EXTERNAL NAME ensamblado.[namespace.clase].metodo

donde en el apartado entre corchetes puede agregarse una cantidad n de namespaces

El punto que hay que ver a continuacion es el como crear el metodo que sera el Trigger, el cual puede quedar asi

Primero, la importacion de namespaces que vamos a utilizar

Imports System
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Transactions

Despues hay que crear una clase donde poner el Trigger; hecho esto hay que declarar que el metodo que estamos a punto de hacer es un Trigger

Public Class Triggers
_

Public Shared Sub trig ()

Despues vamos a utilizar un sqlConnection el cual va a utilizar una conexion contextual

Using connection As New SqlConnection("context connection=true")

Hacemos la logica de negocios que tengamos que hacer y compilamos; el metodo debera de quedar algo asi

Imports System
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Transactions

Partial Public Class Triggers
_
Public Shared Sub trig()
Using connection As New SqlConnection("context connection=true")

Dim command As SqlCommand
Dim reader As SqlDataReader
Dim value As Integer

connection.Open()

command = New SqlCommand("SELECT * FROM INSERTED", connection)
reader = command.ExecuteReader()
reader.Read()
value = CType(reader(0), Integer)
reader.Close()

If value = 1 Then

Try

Dim trans As Transaction
trans = Transaction.Current
trans.Rollback()

Catch ex As SqlException

' Catch the exception.
End Try
Else

End If

connection.Close()
End Using
End Sub
End Class
Ya que tenemos nuestro propio ensamblado solo es cuestion se subirlo a SQL, hay que recordar que esta es una función nueva de SQL Server 2005, es cuestion de elegir del browser la base de datos deseada, abrir la seccion de programabilidad y ahi a la seccion de ensamblados; una vez ya localizada esta seccion es cuestion de dar boton derecho con el mouse y elegir nuevo ensamblado

Una vez abierta abierta la ventana para agregar un nuevo ensamblado elegimos el nuestro y damos click en aceptar, una vez hecho esto creamos un nuevo query, con la sintaxis que mencione al principio

CREATE TRIGGER nombre ON tabla FOR evento AS EXTERNAL NAME ensamblado.[namespace.clase].metodo

Ejecutamos y ya tenemos nuestro Trigger CLR.
Por ultimo vale la pena mencionar que aqui tambein aplican las reglas de las diferencias entre Triggers DDL y DML

Information Schema SQL

Las vistas de esquema de información de SQL son muy utiles en caso de que quieren tener algun registro o control sobre una base de datos. Estas son vistas "ocultas" de las cuales puedes sacar informacion

En estas vistas hay dos tablas que por lo pronto voy a mencionar: COLUMNS y TABLES, de estas igual como su nombre lo sugiere puedes sacr informacion de las columnas y de las tablas de una base de datos

El acceso a estas vista es algo mas o menos asi:

Select * FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Product';

Este es un pequeño ejemplo de como podria quedar un query para sacar un reporte de una base de datos a partir de estas vistas

SELECT INFORMATION_SCHEMA.COLUMNS.TABLE_NAME,
INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME,
INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE,
INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH,
INFORMATION_SCHEMA.COLUMNS.NUMERIC_PRECISION,
INFORMATION_SCHEMA.COLUMNS.NUMERIC_SCALE,
INFORMATION_SCHEMA.COLUMNS.DATA_TYPE

FROM INFORMATION_SCHEMA.COLUMNS

WHERE (NOT (INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = 'db_owner')) AND
(NOT (INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = N'sysdiagrams')) AND
(NOT (INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = N'dtproperties'))

ORDER BY INFORMATION_SCHEMA.COLUMNS.TABLE_NAME

En el siguiente vinculo hay mas información http://msdn2.microsoft.com/es-es/library/ms186778.aspx

Interoperabilidad Office

Para poder tener un efecto de interoperabilidad de Microsoft Office 2003 desde un lenguaje .NET es necesario contar con los ensamblados necesarios para logarlo, estos se puden descargar desde el siguiente link

http://support.microsoft.com/kb/897646


En los cuales se encuentan entre otros los siguientes namespaces:
  • Microsoft.Office.Interop.Outlook
  • Microsoft.Office.Interop.PowerPoint
  • Microsoft.Office.Interop.Word
Estos son muy faciles de utilizar, solo hay que recordar que por mas parecidos que sean entre si no quiere deci que sean exactamente iguales; y que hay que hacer las referencias correspondientes

viernes, marzo 23, 2007

PopUp ASP.NET

Has querido usar un InputBox en ASP.NET, o simplemente quieres abrir una ventana extra del navegador y quieres que te regrese un resultado? esta es la solución

Primero que nada necesitas tener dos paginas una principal y la quieres que se abra

En la primera necesitas tener una funcion que abra la segunda la cual puede ser algo asi:

window.open("../../Pagina.aspx","MiPagina","width=370,height=450")

Para poder insertar en tu pagina esta funcion javascript se introduce dentro de una etiqueta
recuerda que el lenguaje es javascript y el tipo: texto/javascript

Donde los parametos son 3: la direccion de la pagina, el nombre y las caracteristicas que quieras darle a
la venta, separados por comas

La sintaxis de esto hasta ahora quedaria asi:

function Abrir(){
window.open("../../Pagina.aspx","MiPagina","width=370,height=450")
}

Hasta este punto tu pagina principal ya puede abrir la otra solo necesitas asociarla con algun control: esto se hace del lado del server con la Propiedad Attributes, la sintaxis quedaria algo asi

Boton.Attributes.Add("onClick","javascript:Abrir()")

Esto puedo hacerlo en cualquier momento, pero en este caso convendria hacerlo en el evento Load de la pagina (mas adelante se vera porque se podria realizar en algun otro momento)

Ahora ya tenemos un boton en nuestra pagina principal que puede abrir la segunda, solo falta que la segunda nos arroje un resultado, hay varias maneras de hacer esto pero por lo pronto les mencionare algunas opciones

El usuario puede interarctuar con la segunda pagina y darle valor a variables accesibles a la primera pagina como pueden ser variables de sesion

Se tiene que realizar un proceso como el anterior para la segunda ventana pero copn unas diferencias, tambien hay que crear una funcion


function Cerrar(){
window.opener.Resultado();
window.close();
}

Esta funcion ejecuta el metodo resultado de la pagina principal desde la segunda, ya que el objeto "opener" es la ventana que abrio la pagina actual.Ademas esta funcion cierra la ventana actual con el metodo Close()

Otra cosa que puede hacer es hacer lo que el metodo Resultado() haria en la pagina principal directamente desde la segunda utilizando el objeto "opener".Hay que recordar que se debe asignar esta funcion con algun evento del lado del cliente como seria el click de un boton, agregando desde el lado del server con sus respectivos atributos

'Tambien se pueden controlar otros eventos para ejecutar la funcion solo hay que comprobar que sean javascript

Una ves hecho esto ya tenemos una pagina principal que abre una segunda pagina estilo PopUp

Otra cosa que se puede hacer es el uso de funciones javascript con parametros, esto podria servir para por ejemplo que la segunda pagina varie segun la principal, digamos que escribe algo en la pagina principal y desea que esto aparesca en la segunda pagina, entonces los parametros pueden ser bastante utiles, la sintaxis es la misma que si fuera codigo del lado del server, solo recuerda que lso valores string van entre comillas simples. En este caso nos convendria agregar el atributo al control en algun otro momento como por ejemplo cuando ya tengamos el texto en la pagina principal que queremos mostrar en la segunda

Podria ocuparse asi:

function Abrir(Texto){
window.open("../../Pagina.aspx?Nombre='" + Texto + "'","MiPagina","width=370,height=450")
}

Asi agregamos un parametro al abrir la segunda pagina el cual puede recuperarse de la siguiente forma:

variable = Request.QueryStrings("Nombre")

Y con esto podriamos tomar las acciones necesarias para usar ese texto

Crear un PostBack en ASP.NET con JavaScript

La funcion javascript que se utiliza es el __doPostBack cuya sintaxis es mas o menos asi:

Para que se pueda utilizar no se necesita que la metas junto con tu pagina ya que ASP autogenera esta
fucion con cualquier sitio que estes realizando, en realidad solo existen 2 controles ASP que por si solos
pueden realizar un postback: el button y el imagebutton todos los demas controles necesitan esta funcion
para generar un post back

A continuacion muestro un ejemplo de esto


Ahora; ya que sabemos esto podemos utilizar esta funcion para generar un postback, con la sigueinte sintaxis

__doPostBack(' NombreControl ', ' Atributos del evento ' )

Donde el nombre del control es el nombre del control el cual queremos que genere el postback y los
atributos del evento por lo general se dejan vacios

En articulos proximos se podra observar el uso de esta funcion