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?.

Diferencia entre Truncate y Delete

¿Qué diferencia hay entre TRUNCATE y DELETE? Aparentemente son iguales, se usan para eliminar datos de una tabla, solo datos, la estructura se mantiene.

TRUNCATE

Este comando remueve todas las filas de una tabla sin registrar las eliminaciones individuales en el log de transacciones. Prácticamente hace lo mismo que DELETE sin modificar o borrar la estructura de la tabla, sin embargo no se puede utilizar la clausula WHERE. TRUNCATE no permite filtrar por filas, elimina todos los registros de una tabla.

Por ejemplo:

TRUNCATE TABLE Autores

Esto eliminará todos los registros de la tabla Autores.

DELETE

DELETE también remueve las filas de una tabla, pero registra las eliminaciones individuales en el log de transacciones. Podemos utilizar la clausula WHERE para filtrar las filas que necesitemos eliminar.

Ejemplo:

DELETE FROM Autores (elimina todas las filas de la tabla autores)

DELETE FROM Autores WHERE IdCiudad = 30 (elimina las filas de la tabla autores que coincide con la condición indicada)

DIFERENCIAS ENTRE TRUNCATE Y DELETE

Ahora que sabemos en que consiste cada sentencia, veamos las semejanzas y diferencias:

- Ambas eliminan los datos, no la estructura.
- Solo DELETE permite la eliminación condicional de los registros.
- DELETE es una operación registrada en el log de transacciones, basada en registrar cada eliminación individual.
- TRUNCATE es una operación registrada en el log de transacciones, pero como un todo, en conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las páginas de datos en las cuales existen los datos.
- TRUNCATE es más rápida que DELETE.
- Ambas se pueden deshacer con un ROLLBACK.
- TRUNCATE reiniciará el contador para una tabla que contenga una columna IDENTITY.
- DELETE mantendrá el contador de la tabla para una columna IDENTITY.
- TRUNCATE es un comando DDL(lenguaje de definición de datos) mientras que DELETE es un DML(lenguaje de manipulación de datos).
- TRUNCATE no desencadena un TRIGGER, DELETE sí.

Restaurar una base de datos en un punto especifico del tiempo

En mi otro blog PCT (Peleandome con todos), he publicado un post sobre como recuperar una base de datos en un punto especifico del tiempo. Cabe señalar que para poder realizar ese proceso y seguir los pasos indicados el modo de recuperación debe ser Completo o FULL, si no es así, debe seguirse otros pasos que no se han contemplado.

Aquí el enlace al post.

Mostrar un texto según el valor ingresado.

Una compañera de trabajo tenia un problema y me pidió ayuda para resolverlo.

Ella haría una evaluación, y según los resultados, mostraría un texto en una hoja de Excel.

  • De 0 a 10 BAJO
  • De 11 a 21 PROMEDIO BAJO
  • De 22 a 32 PROMEDIO
  • De 33 a 43 PROMEDIO ALTO
  • De 44 a 52 ALTO

Era una aplicación de la función SI(lógica,valor positivo, valor negativo), pero anidada 5 veces lo que le llevaba a errores y en caso quisiera aumentar el número de rangos, se complicaría más.

Así que cree un modulo Visual Basic, en el libro de Excel y escribí esta función:

Public Function cmCategoria(ByVal Valor As Integer) As String

ARESULTADO = ""




Select Case Valor
Case 0 To 10
ARESULTADO = "BAJO"
Case 11 To 21
ARESULTADO = "PROMEDIO BAJO"
Case 22 To 32
ARESULTADO = "PROMEDIO"
Case 33 To 43
ARESULTADO = "PROMEDIO ALTO"
Case 44 To 52
ARESULTADO = "ALTO"
End Select

cmCategoria = ARESULTADO


End Function


Mi amiga, pudo utilizar esta función como si fuera una de las que viene integrada con el Excel y su mantenimiento le es mas facil.

Funcion de relleno

La siguiente función la uso bastante.

SELECT REPLACE(STR(25, 11, 0), ' ', '0')

Resultado:

00000000025

Lo que hace es recibir un numero (25) y rellenarla con ceros (0) a la izquierda de acuerdo a la longitud indicada (11).



Technorait no quiere a Peleandome con todos

No creo que alguien lo sepa, pero tengo un blog llamandose Peleandome con todos, no es politica, ahi posteo temas de tecnología y relacionados a la computación.

Según Technorati, no actualizo hace 46 días, cuando hace dos días fue mi ultimi post.

Ustedes saben porque?

La direccion de mi blog es http:\\peleandomecontodos.blogspot.com

Entrada sin nombre

Technorati Profile

Usar teclas de Función

Dentro de un formulario o un objeto para utilizar las teclas de función es la sentencia siguiente, por ejemplo que al presionar F2 se ejecute el botón Nuevo, hay que utilizar el evento KeyUp.

Private Sub frmCliente_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp

If e.KeyCode = Keys.F2 Then
btnNuevo_Click(sender, e)
End If

End Sub

Eso es lo necesario.


Previamente hay que configurar el formulario con su propiedad KeyPreview a True (correción gracias a Hitman).

Como hacer cambios en la estructura de la base de datos.

De la página Data Dude, un interesante artículo, donde indican como realizar, cambios en la base de datos, y minimizar los errores y cambios en la aplicación.

El artículo esta en inglés..voy a ver si lo traduzco.

Hola Mundo!!

A pesar de ser Visual Basic, un lenguaje utilizado por millones de personas, en ocasiones es dificil encontrar ayuda sobre un tema especifico, en este blog no voy a colocar temas demasiado complicados, son pedazos de código que te pueden ayudar a resolver un problema, a veces la solución es tan simple, solo que tanto que hemos visto el problema, que no vemos la solución.

Sql Server es uno de los mejores motores de base de datos, bien programado y sabiendo como diseñar tu base de datos, tu aplicación puede ser tan efectiva como veloz.

Soy un ingeniero de Sistemas, que utilizo Visual Basic y Sql Server para mis desarrollos, me he enfocado a aplicaciones de escritorio y automatización con Office.

He usado Visual Basic 5.0, 6.0, Net, Net 2003 y ahora Net 2005. En Sql Server me mantengo con la versión 2000, la 7 también la he conocido, anteriormente solo usaba Access. En la mayoría de posts me referiré a Net y a Sql Server 2000, en pocos a la versión 6, y no creo que trate de otras versiones anteriores, pero si se da el caso, lo haré.