Programar para Pocket PC 2003

Estoy realizando un programa para un Pocket PC 2003, utilizando el .NET Compact Framework 2.0 en Visual Basic 2005, los puntos importantes a tomar en cuenta:

  1. En el Compact Framework se distingue entre mayúsculas y minúsculas.
  2. Con Visual Studio 2005, el desarrollo se simplifica hasta parecerse a un desarrollo para escritorio.
  3. Hay algunas funciones del .NET Framework que no existen (por eso es Compact), y que hay que simular, por ejemplo no hay objeto My.
  4. La memoria y el espacio es un elemento muy importante, hay que desarrollar pensando en límites muy pequeños.
Eso es todo por ahora, luego voy a ir agregando mas conclusiones. Cualquier consejo o recomendación, porque estoy aprendiendo, será bienvenida.

Entradas Relacionadas:

Management Studio o Administrador Corporativo

Si has instalado Sql Server 2005, y buscas desesperadamente el Administrador Corporativo, te doy una mala noticia, no lo vas a encontrar, fue reemplazado por el Management Studio, ¿más malas noticias? Se tiene que bajar e instalar aparte.

Descargalo desde aquí.

Sql Server : Optimizacion del rendimiento del CPU

En un artículo de Technet, Zach Nichter explica como optimizar el rendimiento del CPU para un servidor Sql Server. Se tocan los siguientes puntos.

  • Solución de problemas de rendimiento de bases de datos
  • Revisión de causas relacionadas con el hardware
  • Uso de PerfMon para hacer un seguimiento de los cuellos de botella en las bases de datos
  • Evaluación del rendimiento de las consultas
Para leer el artículo, haz clic aquí.

Como hacer una consulta por fecha

A veces es complicado hacer consultas por fechas, la siguiente es una forma rápida e realizar una consulta por fecha. En la consulta se pretende listar la columna DocumentoId de la tabla Documentos, filtrada por Fecha (en este caso 15/08/2005), si se fijan se ve la fecha a filtrar y el rango se extiende hasta antes del día siguiente.

SELECT DocumentoId
FROM Documentos
WHERE
Fecha >= '15/08/2005' AND
Fecha < '16/08/2005'

Sql Server : Sentencia WHERE con condicionales

Se puede incluir sentencias condicionales en la clausula WHERE, de modo que según los parámetros se forma una condición en la consulta.

Escenario:

Usaremos la tabla Customers de la base de datos de ejemplo Northwind que viene con el Sql Server. La consulta se hará con lo siguiente:

  1. Todos los registros que contengan la palabra "the" en el nombre de la compañía.
  2. Todos los registros para compañías localizadas en Alemania, excluyendo las que empiecen con la letra "A".
Normalmente, se podría crear una sentencia dinamica consistente en multiples IF y cadenas a ser concatenadas a una variable final, la cual sería ejecutada por EXEC. Pero a veces es preferible otra opción mas dinamica, pero también posiblemente mas lenta.

El código


-- Declarar algunas variables locales.
-- Actualmente se crean dos por cada variable incluida en el WHERE.
-- La primera variable representa el valor que estamos filtrando
-- y la segunda el operador para el filtro.

declare @companyName varchar(255)
declare @companyNameOp varchar(2)
declare @country varchar(255)
declare @countryOp varchar(2)

-- Valores de ejemplo. Los valores son para el segundo escenario descrito
-- anteriormente, todos los registros para las compañías localizadas
-- en Alemania, excluyendo cuyos nombres comiencen con "A"

-- Definicion de los operadores
-- para el ejemplo, utilizamos un par de letras:

-- ne = no igual
-- eq = igual
-- bg = empieza con
-- ed = termina con
-- ct = contiene

-- Para este ejemplo se utiliza campos de tipo varchar
-- pero es sencillo adaptarlo para otros tipos de datos


set @companyname = 'A%'
set @companynameOp = 'ne'
set @country = 'Germany'
set @countryOp = 'eq'

-- Armemos la consulta.

select
customerid, companyname, country
from
customers
where
case @companyNameOp
when '' then 1 -- Operador no definido, lista todo
when 'eq' then -- Operador es "igual"
case when companyname like @companyName then 1 else 0 end
when 'bg' then -- Operador es "comienza con"
case when companyname like @companyName +'%' then 1 else 0 end
when 'ed' then -- Operador es "termina con"
case when companyname like '%' + @companyName then 1 else 0 end
when 'ct' then -- Operador es "contiene"
case when companyname like '%' + @companyName +'%' then
1 else 0 end
when 'ne' then -- Operador es "no igual"
case when companyname not like @companyName then 1 else 0 end end =1

AND

-- lo mismo es para el otro campo

case @countryOp
when '' then 1
when 'eq' then
case when country like @country then 1 else 0 end
when 'bg' then
case when country like @country +'%' then 1 else 0 end
when 'ed' then
case when country like '%' + @country then 1 else 0 end
when 'ct' then
case when country like '%' + @country +'%' then 1 else 0 end
when 'ne' then
case when country not like @country then 1 else 0 end
end =1


Con esta consulta, se pueden crear procedimientos almacenados, mas flexibles, que permitiran unas consultas personalizadas más dinamicas.


Fuente:

Sql Server Central - Sotiris Filippidis

Backups con Winrar de Bases de Datos

Utilizar Winrar para los Backups

Tengo un script que escribí hace tiempo con el cual hago una copia de seguridad completo o full backup de una base de datos y automaticamente lo comprimo con el Winrar, para luego hacer una copia en una ubicación de respaldo. De ese modo tenemos dos copias de seguridad en lugares diferentes, en caso haya algún desastre. El nombre se genera según la fecha y hora del sistema.

Previos: Hay que tener iniciado el Agente Sql Server e instalado Winrar.

El script lo tienen que ejecutar en el analizador de consultas, ahora también pueden crear un trabajo en el Agente Sql Server para programarlo y que se ejecute según lo crean conveniente.

Lo que tienen que cambiar para su entorno especifico, es la ruta del Winrar, y la carpeta donde se realiza el backup o copia de seguridad y donde se copia.


/*INICIO DEL SCRIPT*/
/*CARLOS MAYANGA

16-10-2004
ESTE TRABAJO REALIZA LA COPIA DE SEGURIDAD COMPLETA,
COLOCANDO COMO NOMBRE LA BASE DE DATOS
LA FECHA Y LA HORA
LUEGO COMPRIME EL BACKUP EN UN ARCHIVO RAR
PARA TERMINAR COPIA EL ARCHIVO HACIA OTRA UBICACION
SIRVE PARA BASE DE DATOS PEQUEÑAS
*/

/*HACER LA COPIA DE SEGURIDAD*/
DECLARE @NombreRAR varchar(8000)
DECLARE @NombreCompleto varchar(8000)
DECLARE @Ruta varchar(8000)
/*NombreBackup SE REFIERE AL NOMBRE DE LA COPIA DE SEGURIDAD, PODRIA SER EL MISMO DE LA BASE DE DATOS PARA QUE LA PUEDAN IDENTIFICAR, NO ES NECESARIO CREAR EL DISPOSITIVO DE BACKUP ANTES.*/
SET @NombreRAR='D:\Backup\NombreBackup' + + RTRIM(CONVERT(CHAR(16),GETDATE(),112)) + REPLACE(RTRIM(CONVERT(CHAR(16),GETDATE(),114)),':','') + '.rar'
SET @NombreCompleto='D:\Backup\NombreBackup' + RTRIM(CONVERT(CHAR(16),GETDATE(),112)) + REPLACE(RTRIM(CONVERT(CHAR(16),GETDATE(),114)),':','') + '.bak'
SET @Ruta='D:\Backup\'
/*AQUI SE REALIZA LA COPIA DE SEGURIDAD*/
BACKUP DATABASE [SHIOL_DATOS] TO DISK=@NombreCompleto
WITH INIT, NOUNLOAD, NAME = N'Admin - Nombre Backup backup', SKIP, STATS = 10, FORMAT

/*COMPRIMIR LA COPIA DE SEGURIDAD*/

DECLARE @Orden varchar(8000)
/*CON ESTA ORDEN SE COMPRIME LA COPIA DE SEGURIDAD Y LUEGO SE ELIMINA EL ARCHIVO ORIGINAL*/
SET @Orden ='c:\archiv~1\winrar\rar.exe a -m5 -df ' + @NombreRAR + ' ' + @NombreCompleto

EXEC master.dbo.xp_cmdshell @Orden

/*ESTA ES LA RUTA DE OTRA MAQUINA PARA HACER UNA COPIA DE ESE MODO TENEMOS DOS COPIAS DEL MISMO BACKUP*/
SET @Ruta = '\\maquina2\backup\'

/*COPIAR EL ARCHIVO COMPRIMIDO*/

SET @Orden ='copy ' + @NombreRar + ' ' + @Ruta
EXEC master.dbo.xp_cmdshell @Orden

Eso seria todo, no olviden de adaptar el script según su entorno.

Autor: Carlos Mayanga
Sitio: Programación Visual Basic con Sql Server


Actualización: Con la liberación de Google Knol, he creado un knol (una unidad de conocimiento), extendiendo un poco la explicación acá proporcionada. Visita mi Knol aquí.

Auditando tablas y bases de datos en Sql Server


En Sql Server Central, publicaron un artículo donde se daban consejos para realizar una auditoría de base de da tos y realizar un seguimiento de los cambios realizados en una tabla.

La primera recomendación es agregar unos campos adicionales a la estructura de la tabla sometida a auditoría, algo como:

ModificadoPor varchar(40)
Modificado datetime
Accion char(1)

Con estos campos, que almacenan el valor de quién modificó la fila, la fecha y la acción realizada. De ese modo, se tenía un registro de los cambios en la tabla.

La segunda era crear una tabla espejo, es decir no modificar la tabla original, pero crear una tabla con la misma estructura. Digamos que si la tabla es Facturas, la tabla espejo sera Facturas_Auditoria, a la que hay que añadir los campos mencionados anteriormente. Para cada acción en la tabla original se graba una fila en la tabla de auditoría.

El creador del artículo, Steve Jones, menciona luego las ventajas y desventajas. La ventaja principal es que se puede llevar un historial fila por fila, de ese modo, se podrá saber los cambios hechos. La desventaja es una sobrecarga de transacciones, y un aumento del tamaño de la base de datos. Este tipo de auditoría también conlleva un estricto control en las aplicaciones para no obviar el paso, Jones lo recomienda para aplicaciones financieras, y no en todas las tablas, solo algunas, las más importantes.

Haz clic aquí para leer el artículo completo en inglés.

Visual Studio 2005: Acceso directos por teclado

Aquí adjunto un pdf con los atajos o acceso directos por teclado para Visual Studio 2005. A los que usamos más el teclado que el mouse, nos ayuda un montón.

Descarga el PDF haciendo clic aquí.

La mayoría de estos acceso directos por teclados funcionan también para la versión 2008.

Encontrar donde se usa una determinada columna

Cuando trabajamos con bases de datos Sql Server y necesitamos realizar un cambio en una columna, es necesario saber donde más la estamos usando. Con este script de Karen Gayda nos puede ayudar en eso, este script crea un procedimiento almacenado, llamado usp_FindColumnUsage, que se puede utilizar con la siguiente sintaxis:

usp_FindColumnUsage NombreTabla,NombreColumna

El script a continuación (he traducido el texto necesario a español como lo uso):

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[usp_FindColumnUsage]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[usp_FindColumnUsage]
GO


CREATE PROCEDURE [dbo].[usp_FindColumnUsage]
@vcTableName varchar(100),
@vcColumnName varchar(100)
AS
/************************************************************************************************
DESCRIPTION: Creates prinatable report of all stored procedures, views, triggers
and user-defined functions that reference the
table/column passed into the proc.

PARAMETERS:
@vcTableName - table containing searched column
@vcColumnName - column being searched for
REMARKS:
To print the output of this report in Query Analyzer/Management
Studio select the execute mode to be file and you will
be prompted for a file name to save as. Alternately
you can select the execute mode to be text, run the query, set
the focus on the results pane and then select File/Save from
the menu.

This procedure must be installed in the database where it will
be run due to it's use of database system tables.

USAGE:

usp_FindColumnUsage 'jct_contract_element_card_sigs', 'contract_element_id'

AUTHOR: Karen Gayda
TRADUCTOR: Carlos Mayanga
WEB:http://ikanus3000.blogspot.com

DATE: 07/19/2007

MODIFICATION HISTORY:
WHO DATE DESCRIPTION
--- ---------- -------------------------------------------
*************************************************************************************************/
SET NOCOUNT ON



PRINT ''
PRINT 'REPORTE PARA DEPENDENCIAS PARA TABLA/COLUMNA:'
PRINT '----------------------------------------------'
PRINT @vcTableName + '.' +@vcColumnName


PRINT ''
PRINT ''
PRINT 'PROCEDIMIENTOS ALMACENADOS:'
PRINT ''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre del Procedimiento]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'P'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre del Procedimiento]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' procedimientos almacenados dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'



PRINT''
PRINT''
PRINT 'VISTAS:'
PRINT''
SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre de la Vista]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'V'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre de la Vista]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' vistas dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'


PRINT ''
PRINT ''
PRINT 'FUNCIONES:'
PRINT ''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre de la Función],
CASE WHEN o.XTYPE = 'FN' THEN 'Escalar'
WHEN o.XTYPE = 'IF' THEN 'En linea'
WHEN o.XTYPE = 'TF' THEN 'Tabla'
ELSE '?'
END
as [Tipo de Función]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE IN ('FN','IF','TF')
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre de la Función]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' funciones dependientes de la columna "' + @vcTableName + '.' +@vcColumnName + '".'

PRINT''
PRINT''
PRINT 'TRIGGERS:'
PRINT''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre del Trigger]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'TR'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre del Trigger]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' triggers dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'


GO

El script muestra el resultado como un reporte imprimible en el analizador de consultas, escogiendo la opción Resultados como Texto, del menú Consulta.

Fuente: Sql Server Central (en inglés).

PatIndex Versus CharIndex

Normalmente para encontrar un caracter dentro de una cadena utilizamos CharIndex. El 99% de las veces que usamos CharIndex podemos sustituirlo por PatIndex. El 1% restante le da la ventaja a PatIndex, ya que PatIndex es un CharIndex fusionado con Like. Podemos usar patrones para buscar un caracter. Algo mejor, no lo creen?.