marzo 04, 2009
Query Triggers asociados a que Tabla SQL Server
SELECT po.name as Tabla, tr.name as [Trigger Name]
FROM sysobjects po
JOIN sysobjects tr ON tr.parent_obj = po.id
WHERE tr.xtype = 'TR'AND po.xtype = 'U'
septiembre 12, 2008
Hotkeys en un DataGridView
En un formulario Windows agregar un DataGridView cargarlo con datos para implementar la funcionalidad de teclas calientes, por ejemplo al Ctrl+F aplica un calculo al Ctrl+R refresca la rejilla, etc.
1. Agregar métodos que responden a la combinación de teclas
Private Sub ctrl_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
Dim ctrl As Control = DirectCast(sender, Control)
End Sub
Private Sub InitializeEvents()
'AddHandler Me.DataGridView1.KeyPress, AddressOf txt_KeyPress
'AddHandler Me.DataGridView1.KeyDown, AddressOf txt_KeyDown
AddHandler Me.DataGridView1.KeyUp, AddressOf ctrl_KeyUp
End Sub
2. Funcionalidad a ejecutar al detectar la combinación de teclas sobre un renglon de la rejilla al evento KeyUp
Private Sub DataGridView1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyUp
Select Case e.KeyData
Case e.KeyCode.Control + e.KeyCode.F 'Aplica Calcluo
MessageBox.Show("Ejecutar AplicaCaluloX())
Case e.KeyCode.Control + e.KeyCode.R 'Refrescar contenido-Databinding-
MessageBox.Show("Ejecutar RefrescarRejilla()")
End Select
End Sub
1. Agregar métodos que responden a la combinación de teclas
Private Sub ctrl_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
Dim ctrl As Control = DirectCast(sender, Control)
End Sub
Private Sub InitializeEvents()
'AddHandler Me.DataGridView1.KeyPress, AddressOf txt_KeyPress
'AddHandler Me.DataGridView1.KeyDown, AddressOf txt_KeyDown
AddHandler Me.DataGridView1.KeyUp, AddressOf ctrl_KeyUp
End Sub
2. Funcionalidad a ejecutar al detectar la combinación de teclas sobre un renglon de la rejilla al evento KeyUp
Private Sub DataGridView1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyUp
Select Case e.KeyData
Case e.KeyCode.Control + e.KeyCode.F 'Aplica Calcluo
MessageBox.Show("Ejecutar AplicaCaluloX())
Case e.KeyCode.Control + e.KeyCode.R 'Refrescar contenido-Databinding-
MessageBox.Show("Ejecutar RefrescarRejilla()")
End Select
End Sub
Leer entrada de app.config VS.NET 2005
1. Agregar archivo app.config

2--Leer de app.config
Configuration.ConfigurationManager.AppSettings.Item("AplicarFactorDiseñoPaq").ToString.Length

2--Leer de app.config
Configuration.ConfigurationManager.AppSettings.Item("AplicarFactorDiseñoPaq").ToString.Length
septiembre 11, 2008
Referencia de Uso de la herramienta: JetBrains DotTrace con ADO.NET
Esta herramienta ayuda a medir es el tiempo que se toma cada una estas operaciones para mostrar los datos. Esta herramienta te permite mediante la técnica de "code profiling" conocer el tiempo y cantidad de veces de cada una de las llamadas a los métodos de tu aplicación, incluido el código de .NET.
En este pagina se describe el uso de esta interesante herramienta, yo la utilice porque al poblar un GridView de asp.net con un sqldatareader se tardaba muchisimo al solicitar unos 20,000 registros y con esta herramienta encntré en donde se hacia el cuello de botella.
http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx
La referencia es parte de un conjunto de articulos muy interesantes relacionados con la utilización de la herramienta con uso de objetos ADO.NET
Performance: Lectura de Datos con ADO.NET
Performance: Lectura de Datos con ADO.NET II
Performance: Lectura de Datos con ADO.NET III
Performance: Datos en Memoria con ADO.NET IV
En este pagina se describe el uso de esta interesante herramienta, yo la utilice porque al poblar un GridView de asp.net con un sqldatareader se tardaba muchisimo al solicitar unos 20,000 registros y con esta herramienta encntré en donde se hacia el cuello de botella.
http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx
La referencia es parte de un conjunto de articulos muy interesantes relacionados con la utilización de la herramienta con uso de objetos ADO.NET
Performance: Lectura de Datos con ADO.NET
Performance: Lectura de Datos con ADO.NET II
Performance: Lectura de Datos con ADO.NET III
Performance: Datos en Memoria con ADO.NET IV
Store Procedure devuelve Información de Tablas de BD en SQL Server
create procedure dbo.p_sizetablesas
Begin transaction
/***Procedimiento creado por KM para ver el tamaño de las tablas de una base de datos*/
SET NOCOUNT ON
declare @nombre_tabla varchar(100)
declare @propietario varchar(40)
declare @uid int
declare @nombre_completo varchar(150)
declare @nombre_db varchar(256)
create table #resultados
(nombre varchar(50), filas decimal(12,0), reservado varchar(40),
data varchar(40), tamaño_indice varchar(20),
no_usado varchar(20))
declare tablas cursor
for select a.uid , propietario = left( b.name,40), tabla = a.name
from sysobjects a, sysusers b
where type = 'U' and a.uid = b.uid order by tabla
select @nombre_db = db_name()
OPEN tablas
FETCH NEXT FROM tablas
into @uid, @propietario, @nombre_tabla
WHILE @@FETCH_STATUS = 0
BEGIN
if @uid = 1
begin
insert #resultados
exec sp_spaceused @nombre_tabla
end
else
begin
SET @nombre_completo = rtrim(ltrim(@nombre_db))+'.' + ltrim(rtrim(@propietario)) +'.'+ @nombre_tabla
insert #resultados
exec sp_spaceused @nombre_completo
end
FETCH NEXT FROM tablas INTO @uid, @propietario, @nombre_tabla
END
CLOSE tablas
DEALLOCATE tablas
select * from #resultadosorder by filas desc
Commit Transaction
go
--ejecutarlo en query analizer
exec p_sizetables
Referencia
http://www.lawebdelprogramador.com/codigo/codigo.php?idp=794&id=89&texto=SQL
Begin transaction
/***Procedimiento creado por KM para ver el tamaño de las tablas de una base de datos*/
SET NOCOUNT ON
declare @nombre_tabla varchar(100)
declare @propietario varchar(40)
declare @uid int
declare @nombre_completo varchar(150)
declare @nombre_db varchar(256)
create table #resultados
(nombre varchar(50), filas decimal(12,0), reservado varchar(40),
data varchar(40), tamaño_indice varchar(20),
no_usado varchar(20))
declare tablas cursor
for select a.uid , propietario = left( b.name,40), tabla = a.name
from sysobjects a, sysusers b
where type = 'U' and a.uid = b.uid order by tabla
select @nombre_db = db_name()
OPEN tablas
FETCH NEXT FROM tablas
into @uid, @propietario, @nombre_tabla
WHILE @@FETCH_STATUS = 0
BEGIN
if @uid = 1
begin
insert #resultados
exec sp_spaceused @nombre_tabla
end
else
begin
SET @nombre_completo = rtrim(ltrim(@nombre_db))+'.' + ltrim(rtrim(@propietario)) +'.'+ @nombre_tabla
insert #resultados
exec sp_spaceused @nombre_completo
end
FETCH NEXT FROM tablas INTO @uid, @propietario, @nombre_tabla
END
CLOSE tablas
DEALLOCATE tablas
select * from #resultadosorder by filas desc
Commit Transaction
go
--ejecutarlo en query analizer
exec p_sizetables
Referencia
http://www.lawebdelprogramador.com/codigo/codigo.php?idp=794&id=89&texto=SQL
Query a cadena XML
Crear:
1. El esqueleto de la tabla para poder hacer el select
2. El store procedure que hace el query de la cadeana XML basado en el esqueleto de la tabla
3. Ejecutar el Store Procedure con la cadena XML (probar en el query analizer)
1--La Tabla -Esqueleto
CREATE TABLE [dbo].[SKUsCARGA] ( [CveProducto] [varchar] (20) NOT NULL , [DescProductoTerrSub] [varchar] (150) NOT NULL , [Territorio] [varchar] (20) NOT NULL , [SubTerritorio] [varchar] (20) NOT NULL , [Tecnica] [varchar] (50) NOT NULL , [Precio] [varchar] (10) NOT NULL , [Tamanio] [varchar] (50) NOT NULL , [Pocision] [varchar] (50) NOT NULL , [Apoyo] [varchar] (50) NOT NULL , [FechaAlta] [datetime] NOT NULL , [UsrAlta] [varchar] (20) NOT NULL )
--2. El Store Procedure
CREATE PROCEDURE dbo.PruebaXML
@xmlCargaSKUs text
as
Declare @idoc int
--Ejecutar el sp que carga en memoria el docuemnto XML.
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlCargaSKUs
--El Query al docto XML
SELECT CveProducto, Territorio, SubTerritorio, Tecnica, Precio, Tamanio, Pocision, Apoyo
FROM OPENXML (@idoc, '/SKUsCARGA/SKU')
WITH SKUsCARGA
--Descargar documento XML de la memoria.
EXEC sp_xml_removedocument @idoc
GO
--3. La ejecucion del store procedure con el paso de la cadena XML
1. El esqueleto de la tabla para poder hacer el select
2. El store procedure que hace el query de la cadeana XML basado en el esqueleto de la tabla
3. Ejecutar el Store Procedure con la cadena XML (probar en el query analizer)
1--La Tabla -Esqueleto
CREATE TABLE [dbo].[SKUsCARGA] ( [CveProducto] [varchar] (20) NOT NULL , [DescProductoTerrSub] [varchar] (150) NOT NULL , [Territorio] [varchar] (20) NOT NULL , [SubTerritorio] [varchar] (20) NOT NULL , [Tecnica] [varchar] (50) NOT NULL , [Precio] [varchar] (10) NOT NULL , [Tamanio] [varchar] (50) NOT NULL , [Pocision] [varchar] (50) NOT NULL , [Apoyo] [varchar] (50) NOT NULL , [FechaAlta] [datetime] NOT NULL , [UsrAlta] [varchar] (20) NOT NULL )
--2. El Store Procedure
CREATE PROCEDURE dbo.PruebaXML
@xmlCargaSKUs text
as
Declare @idoc int
--Ejecutar el sp que carga en memoria el docuemnto XML.
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlCargaSKUs
--El Query al docto XML
SELECT CveProducto, Territorio, SubTerritorio, Tecnica, Precio, Tamanio, Pocision, Apoyo
FROM OPENXML (@idoc, '/SKUsCARGA/SKU')
WITH SKUsCARGA
--Descargar documento XML de la memoria.
EXEC sp_xml_removedocument @idoc
GO
--3. La ejecucion del store procedure con el paso de la cadena XML

agosto 10, 2008
Requerimiento implementacion Gestión de Facturas
Implantación de la Base de Datos (Back-End)
-Deberá ser con el manejador de base de datos Access o SQL Server 2000
-Deberá diseñar una base de datos bajo los conceptos de normalización y su respectiva integración referencial de la información.
-Deberá modelar la entidad Cliente, Empleado, Producto y Factura. Para cada entidad definirás los atributos básicos para poder operar la factura.
-Si decide utilizar SQL Server 2K puedes usar Store Procedures o Vistas en la implantación o cadenas SQL en el Front-End
Implementación de la GUI (Front-End)
-Deberá ser utilizando Visual Basic NET 2005 o 2008 con el lenguaje Visual Basic .NET
-El tipo de aplicación puede ser ASP.NET -Web- o aplicación de escritorio
-Puedes hacerlo en capas, con objetos, etc. como tú desees.
-Sólo deberá implementar la interfaz GUI para la factura.
¿Qué debe permitir la aplicación para trabajar con las facturas?
- El sistema deberá permitir al usuario gestionar facturas: dar de alta, eliminar y hacer modificaciones a facturas existentes.
- El sistema deberá permitir seleccionar de una fuente de datos los productos -su descripción- que la empresa tiene a disposición para su venta y que se exponen en la factura (la factura deberá permitir contener de 1 a N productos sin repetir).
- El sistema deberá permitir seleccionar de una fuente de datos los clientes -su nombre o denominación social- registrados a los que se expide una factura.
- El sistema deberá permitir modificar los productos incluidos en la factura; es decir cambiar la cantidad o el producto.
- El sistema deberá calcular automáticamente el importe de cada producto de acuerdo a la cantidad solicitada, el subtotal, importe de IVA -manejarlo al 15%- y gran total.
Entrega de Fuentes :
- El archivo de la base de datos de Access o el archivo de respaldo de la Base de datos si decidiste implementar con SQL Server 2K.
- El proyecto de Visual Basic NET 2005 con el código fuente de la operación de la factura.
Aspectos principales a evaluar:
- Con respecto a la base datos el modelo Entidad-Relación implementado
- Con respecto a la GUI de la gestión de la factura, facilidad de uso al usuario, forma de interactuar con la base de datos.
-Deberá ser con el manejador de base de datos Access o SQL Server 2000
-Deberá diseñar una base de datos bajo los conceptos de normalización y su respectiva integración referencial de la información.
-Deberá modelar la entidad Cliente, Empleado, Producto y Factura. Para cada entidad definirás los atributos básicos para poder operar la factura.
-Si decide utilizar SQL Server 2K puedes usar Store Procedures o Vistas en la implantación o cadenas SQL en el Front-End
Implementación de la GUI (Front-End)
-Deberá ser utilizando Visual Basic NET 2005 o 2008 con el lenguaje Visual Basic .NET
-El tipo de aplicación puede ser ASP.NET -Web- o aplicación de escritorio
-Puedes hacerlo en capas, con objetos, etc. como tú desees.
-Sólo deberá implementar la interfaz GUI para la factura.
¿Qué debe permitir la aplicación para trabajar con las facturas?
- El sistema deberá permitir al usuario gestionar facturas: dar de alta, eliminar y hacer modificaciones a facturas existentes.
- El sistema deberá permitir seleccionar de una fuente de datos los productos -su descripción- que la empresa tiene a disposición para su venta y que se exponen en la factura (la factura deberá permitir contener de 1 a N productos sin repetir).
- El sistema deberá permitir seleccionar de una fuente de datos los clientes -su nombre o denominación social- registrados a los que se expide una factura.
- El sistema deberá permitir modificar los productos incluidos en la factura; es decir cambiar la cantidad o el producto.
- El sistema deberá calcular automáticamente el importe de cada producto de acuerdo a la cantidad solicitada, el subtotal, importe de IVA -manejarlo al 15%- y gran total.
Entrega de Fuentes :
- El archivo de la base de datos de Access o el archivo de respaldo de la Base de datos si decidiste implementar con SQL Server 2K.
- El proyecto de Visual Basic NET 2005 con el código fuente de la operación de la factura.
Aspectos principales a evaluar:
- Con respecto a la base datos el modelo Entidad-Relación implementado
- Con respecto a la GUI de la gestión de la factura, facilidad de uso al usuario, forma de interactuar con la base de datos.
Formato separador miles a número en SQL Server
DECLARE @val float
SET @val = '12456.00'
SELECT CONVERT(varchar(50), CONVERT(money, @val), 1)
--Salida
12,456.00
SET @val = '12456.00'
SELECT CONVERT(varchar(50), CONVERT(money, @val), 1)
--Salida
12,456.00
febrero 14, 2008
Uso de pwdencrypt y pwdcompare en SQL Server 2K
Estás dos funciones en SQL Server permiten cifrar y descifrar valores y que son muy últiles para guardar información no legible en la base de datos.
Ejemplo de uso:
--Devuelve la cadena cifrada.
select pwdencrypt('abcde')
--el resultado es: 0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737
--Este valor es el que almacenamos en nuestra tabla, por ejemplo un numero de cuenta o una contraseña, de esta manera si alguien ingresa a esta tabla no sabrá a que valor pertenece.
--Ahora comparamos el texto en claro con lo que se almacena en la BD, regresa 1 si son iguales, sino cero.
select pwdcompare('abcde',0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737)
Ahora veremos un store procedure en donde recibe el texto en claro -un password- y lo compara
con el que esta en la BD cifrado.
CREATE PROCEDURE dbo.spu_SelectUsr
@Usuario varchar(15),
@Passwd varchar(15)
AS
Set nocount on;
Declare @ExisteCta bit
set @ExisteCta = 0
SELECT @ExisteCta = 1
FROM USUARIO
WHERE (Usuario = @Usuario) AND (pwdcompare(@Passwd, PasswdCifrado)=1)
if @ExisteCta = 0
begin
Raiserror 13000 'No existe la cuenta de acceso proporcionada.'
Return
end
Go
Link otros ejemplos
http://msmvps.com/blogs/gladchenko/archive/2005/04/06/41083.aspx
Ejemplo de uso:
--Devuelve la cadena cifrada.
select pwdencrypt('abcde')
--el resultado es: 0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737
--Este valor es el que almacenamos en nuestra tabla, por ejemplo un numero de cuenta o una contraseña, de esta manera si alguien ingresa a esta tabla no sabrá a que valor pertenece.
--Ahora comparamos el texto en claro con lo que se almacena en la BD, regresa 1 si son iguales, sino cero.
select pwdcompare('abcde',0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737)
Ahora veremos un store procedure en donde recibe el texto en claro -un password- y lo compara
con el que esta en la BD cifrado.
CREATE PROCEDURE dbo.spu_SelectUsr
@Usuario varchar(15),
@Passwd varchar(15)
AS
Set nocount on;
Declare @ExisteCta bit
set @ExisteCta = 0
SELECT @ExisteCta = 1
FROM USUARIO
WHERE (Usuario = @Usuario) AND (pwdcompare(@Passwd, PasswdCifrado)=1)
if @ExisteCta = 0
begin
Raiserror 13000 'No existe la cuenta de acceso proporcionada.'
Return
end
Go
Link otros ejemplos
http://msmvps.com/blogs/gladchenko/archive/2005/04/06/41083.aspx
Control para graficar en asp.net
Recientemente tuve la necesidad de graficar unos datos en el web, y mi sorpresa fue que visual studio net 2005 no incluye un control para ello, mi otra opción era sacarlo con Crystal Reports o un control y encontré este gratuito que me parecio muy bueno y además free.
http://www.carlosag.net/Tools/WebChart/Default.aspx
La guía de uso rápido o tutorial:
http://www.carlosag.net/Articles/WebChartTutorial.aspx
http://www.carlosag.net/Tools/WebChart/Default.aspx
La guía de uso rápido o tutorial:
http://www.carlosag.net/Articles/WebChartTutorial.aspx
Herramientas gratis para SQL Server
Excelente link en donde podrán encontrar útiles herramientas para SQL Server 2k-2005
http://weblogs.sqlteam.com/mladenp/archive/2007/11/20/Free-SQL-Server-tools-that-might-make-your-life-a.aspx
http://weblogs.sqlteam.com/mladenp/archive/2007/11/20/Free-SQL-Server-tools-that-might-make-your-life-a.aspx
septiembre 27, 2007
row-locks en operaciones SQL-Insert/Update/Delete
Este es un tip que me paso un cuate llamado Christian que es DBA en SQL Server. Para no pongan de rodillas a su servidor de base de datos SQL Server
Un link de referencia adicional es:
http://support.microsoft.com/kb/323630
"A veces por cuestiones de performance o necesidad de trabajar con un conjunto de registros grandes, es conveniente hacerlo parcialmente, es decir, en "pedazos". Esto puede suceder porque al trabajar con millones de registros se generen demasiados row-locks y consuman toda la memoria y el query falle en su ejecución."
Aquí un query de ejemplo:
SET NOCOUNT ON --QUITAMOS LOS MENSAJES DE CONTEO DE REGISTROS AFECTADOS YA QUE LO PERSONALIZAMOS
DECLARE @Afectados bigint --DECLARAMOS UNA VARIABLE PARA ACUMULAR LOS REGISTROS AFECTADOS
DECLARE @Afec bigint --DECLARAMOS UNA VARIABLE PARA SABER CUANTOS ACUMULO EN CADA PASO
SET @Afectados = 0 --INICIALIZAMOS EL ACUMULADO
Borra: --ETIQUETA PARA SALTO
SET Rowcount 1000 --ESTA SENTENCIA ES LA MAS IMPORTANTE: LE DECIMOS AL SQL QUE LA SIGUIENTE SENTENCIA SOLO AFECTARÁ A 1000 REGISTROS (AUNQUE EXISTAN MÁS)!!!!!!.
DELETE Facturas
WHERE Fecha_factura < '2007/01/01' --EJECUTAMOS NUESTRA SENTENCIA, ESTA ES SOLO UN EJEMPLO Y SUPONDREMOS QUE LA SENTENCIA POR SÍ SOLA AFECTARÍA MILLONES DE REGISTROS.
SET @Afec = @@Rowcount --OBTENEMOS CUANTOS REGISTROS AFECTO (SOLAMENTE AL FINAL QUE YA NO HAYA REGISTROS POR AFECTAR DEVOLVERÁ CERO, DE LO CONTRARIO DEVOLVERÁ LOS 1000 QUE CONFIGURAMOS)
SET @Afectados = @Afectados + @Afec
print 'Afectados: ' + CONVERT(varchar,@Afectados) --AQUÍ VAMOS IMPRIMIENDO EL ACUMULADO DE LOS REGISTROS QUE VA AFECTANDO PARA DARNOS UNA IDEA DE CUANTO LEVA. (Ver pantalla resultado al final)
if @Afec > 0 goto borra --SI EL NUMERO DE REGISTROS QUE AFECTO EL DELETE ES MAYOR A CERO (ES DECIR QUE AUN HAY MÁS REGISTROS POR BORRAR) REGRESA A EJECUTAR EL DELETE.
set rowcount 0 --RESETEAMOS EL ROWNCOUNT PARA QUE YA AFECTE NORMAL
El resultado se vería como la siguiente imágen:

Un link de referencia adicional es:
http://support.microsoft.com/kb/323630
"A veces por cuestiones de performance o necesidad de trabajar con un conjunto de registros grandes, es conveniente hacerlo parcialmente, es decir, en "pedazos". Esto puede suceder porque al trabajar con millones de registros se generen demasiados row-locks y consuman toda la memoria y el query falle en su ejecución."
Aquí un query de ejemplo:
SET NOCOUNT ON --QUITAMOS LOS MENSAJES DE CONTEO DE REGISTROS AFECTADOS YA QUE LO PERSONALIZAMOS
DECLARE @Afectados bigint --DECLARAMOS UNA VARIABLE PARA ACUMULAR LOS REGISTROS AFECTADOS
DECLARE @Afec bigint --DECLARAMOS UNA VARIABLE PARA SABER CUANTOS ACUMULO EN CADA PASO
SET @Afectados = 0 --INICIALIZAMOS EL ACUMULADO
Borra: --ETIQUETA PARA SALTO
SET Rowcount 1000 --ESTA SENTENCIA ES LA MAS IMPORTANTE: LE DECIMOS AL SQL QUE LA SIGUIENTE SENTENCIA SOLO AFECTARÁ A 1000 REGISTROS (AUNQUE EXISTAN MÁS)!!!!!!.
DELETE Facturas
WHERE Fecha_factura < '2007/01/01' --EJECUTAMOS NUESTRA SENTENCIA, ESTA ES SOLO UN EJEMPLO Y SUPONDREMOS QUE LA SENTENCIA POR SÍ SOLA AFECTARÍA MILLONES DE REGISTROS.
SET @Afec = @@Rowcount --OBTENEMOS CUANTOS REGISTROS AFECTO (SOLAMENTE AL FINAL QUE YA NO HAYA REGISTROS POR AFECTAR DEVOLVERÁ CERO, DE LO CONTRARIO DEVOLVERÁ LOS 1000 QUE CONFIGURAMOS)
SET @Afectados = @Afectados + @Afec
print 'Afectados: ' + CONVERT(varchar,@Afectados) --AQUÍ VAMOS IMPRIMIENDO EL ACUMULADO DE LOS REGISTROS QUE VA AFECTANDO PARA DARNOS UNA IDEA DE CUANTO LEVA. (Ver pantalla resultado al final)
if @Afec > 0 goto borra --SI EL NUMERO DE REGISTROS QUE AFECTO EL DELETE ES MAYOR A CERO (ES DECIR QUE AUN HAY MÁS REGISTROS POR BORRAR) REGRESA A EJECUTAR EL DELETE.
set rowcount 0 --RESETEAMOS EL ROWNCOUNT PARA QUE YA AFECTE NORMAL
El resultado se vería como la siguiente imágen:
Tipos Nulables para valores NULL en Bases de Datos
Hace unos días hice una clase de tipo Entity que la poblabla con registros de una tabla de una Base de Datos y la mayoría de sus valores eran opcionales, es decir nulos así que utilice el concepto de tipos nulables del framework 2.0. Con esta clasecilla insertaba regsitros con valores nulos.
Public Class Cuestionario
'Los miembros privados nulables
Private _otroIdiomaHabla As Nullable(Of Byte)
Private bolv1 As Nullable(Of Boolean)
--los métodos públicos de acceso a los miembros privados.
Public Property OtroIdiomaHabla() As Nullable(Of Byte)
Get
Return Me._otroIdiomaHabla
End Get
Set(ByVal value As Nullable(Of Byte))
Me._otroIdiomaHabla = value
End Set
End Property
End Class
'El uso de la clase
Dim objCuestionario as new Cuestionario
'Asigno nada a su miembro
objCuestionario.OtroIdiomaHabla = Nothing
'Verifico el valor
If objCuestionario.OtroIdiomaHabla.HasValue then
'Existe valor
Else
'Sin valor
End if
'Cuando asigno valor a un comando como parametro a la ejecución de un store procedure 'pasamos el valor o un nothing implicito por el tipo nulable y que equivale a un null en la columna de la tabla de la BD.
cmd.Parameters.Add("@OtroIdiomaHabla", Data.SqlDbType.Bit, 1).Value = objCuestionario.OtroIdiomaHabla
'En el store procedure asignamos un default al parametro y cuando pasamos el valor a través del parametro a nuestro objeto esteremos pasando un nothing que va equivaler al Null.
CREATE PROCEDURE spuInserta
@OtroIdiomaHabla tinyint=NULL
As
Insert Into Tabla (OtroIdiomaHabla, ValorX)
Values(@OtroIdiomaHabla, Default)
Go
Public Class Cuestionario
'Los miembros privados nulables
Private _otroIdiomaHabla As Nullable(Of Byte)
Private bolv1 As Nullable(Of Boolean)
--los métodos públicos de acceso a los miembros privados.
Public Property OtroIdiomaHabla() As Nullable(Of Byte)
Get
Return Me._otroIdiomaHabla
End Get
Set(ByVal value As Nullable(Of Byte))
Me._otroIdiomaHabla = value
End Set
End Property
End Class
'El uso de la clase
Dim objCuestionario as new Cuestionario
'Asigno nada a su miembro
objCuestionario.OtroIdiomaHabla = Nothing
'Verifico el valor
If objCuestionario.OtroIdiomaHabla.HasValue then
'Existe valor
Else
'Sin valor
End if
'Cuando asigno valor a un comando como parametro a la ejecución de un store procedure 'pasamos el valor o un nothing implicito por el tipo nulable y que equivale a un null en la columna de la tabla de la BD.
cmd.Parameters.Add("@OtroIdiomaHabla", Data.SqlDbType.Bit, 1).Value = objCuestionario.OtroIdiomaHabla
'En el store procedure asignamos un default al parametro y cuando pasamos el valor a través del parametro a nuestro objeto esteremos pasando un nothing que va equivaler al Null.
CREATE PROCEDURE spuInserta
@OtroIdiomaHabla tinyint=NULL
As
Insert Into Tabla (OtroIdiomaHabla, ValorX)
Values(@OtroIdiomaHabla, Default)
Go
Links a páginas de iconos
Como desarrolladores de aplicaciones WEB y de escritorio siempre necesitamos de iconos de todo tipo recientemente consulté dos páginas de iconos simpre utiles para que las agreguen a susu favoritos.
http://www.iconfinder.net/
El siguiente link me lo paso mi cuate Gerardo Hdz.
http://www.iconarchive.com/
http://www.iconfinder.net/
El siguiente link me lo paso mi cuate Gerardo Hdz.
http://www.iconarchive.com/
Los 7 pecados mortales de Ajax
mayo 02, 2007
Serialización con .NET 2.0
Hace unos días tuve la necesidad de serializar un objeto y esto es lo que encontré para el Framework 2.0
Imports System.Xml.Serialization
Imports System.IO
Private Sub SerilizarObj()
Dim serializar As XmlSerializer = New XmlSerializer(GetType(AreaBLL))
'Creamos el objeto a serializar
Dim objArea As New AreaBLL()
objArea.IdArea = 1
objArea.NombreArea = "MKT"
objArea.AreaPadre = "Presidencia"
'Archivo en donde vamos a colocar el objeto deshidratado.
Dim stream1 As New FileStream("C:\area.xml", FileMode.Create)
'Serilizar
serializar.Serialize(stream1, objArea)
stream1.Close()
End Sub
Private Sub DesSerializarObj()
'Obtener a memoria el archivo XML
Dim FileXML As FileStream = New FileStream("C:\area.xml", FileMode.Open)
'Crear un XMLSerializer para manejar la deserialización
Dim serialize As XmlSerializer = New XmlSerializer(GetType(AreaBLL))
'Crear el objeto que se va a rehidratar.
Dim objArea As New AreaBLL
'Deserializar el obj.
objArea = serialize.Deserialize(FileXML)
FileXML.Close()
End Sub
Imports System.Xml.Serialization
Imports System.IO
Private Sub SerilizarObj()
Dim serializar As XmlSerializer = New XmlSerializer(GetType(AreaBLL))
'Creamos el objeto a serializar
Dim objArea As New AreaBLL()
objArea.IdArea = 1
objArea.NombreArea = "MKT"
objArea.AreaPadre = "Presidencia"
'Archivo en donde vamos a colocar el objeto deshidratado.
Dim stream1 As New FileStream("C:\area.xml", FileMode.Create)
'Serilizar
serializar.Serialize(stream1, objArea)
stream1.Close()
End Sub
Private Sub DesSerializarObj()
'Obtener a memoria el archivo XML
Dim FileXML As FileStream = New FileStream("C:\area.xml", FileMode.Open)
'Crear un XMLSerializer para manejar la deserialización
Dim serialize As XmlSerializer = New XmlSerializer(GetType(AreaBLL))
'Crear el objeto que se va a rehidratar.
Dim objArea As New AreaBLL
'Deserializar el obj.
objArea = serialize.Deserialize(FileXML)
FileXML.Close()
End Sub