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

 

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

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

 

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

 

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







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.

 

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

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

 

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

 

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

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:





 

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

 

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/

 

Los 7 pecados mortales de Ajax

un buen link teórico de lo bueno y malo de usar Ajax!
http://www.tufuncion.com/errores-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

This page is powered by Blogger. Isn't yours?