domingo, 14 de octubre de 2007

Cálculos erróneos en Excel 2007

Aquí os dejo el enlace (http://download.microsoft.com/download/6/1/3/61343075-aa12-4152-a761-fccc16d6cef4/office-kb943075-fullfile-x86-glb.exe), para descargaros el parche que soluciona un bug de Excel 2007, el problema es el siguiente:
-Si el resultado del cálculo es un número entre 65534.99999999995 entre 65.535. Se realiza el cálculo correctamente. Sin embargo, el resultado se muestra incorrectamente como 100.000.
-Si el resultado del cálculo es un número entre 65535.99999999995 entre 65.536. Se realiza el cálculo correctamente. Sin embargo, el resultado se muestra incorrectamente como 100.001.

Después de aplicar el parche hay que recalcular las hojas de cálculo que estén en modo manual para corregir los posibles errores.

sábado, 15 de septiembre de 2007

Versiones de SQL Server

Para conocer la versión de SQL Server que usa un servidor, usaremos la sentencia SELECT @@Version, en negrita he resaltado los resultados que nos puede devolver la consulta. A continuación os detallo las distintas versiones de SQL Server que existen: (he omitido las actualizaciones acumulativas excepto las de SQL Server 2008)

SQL SERVER 2008
---------------
SQL Server code name "Katmai" (CTP) - 10.0.1075.23 (no podía resistirme)
SQL Server 2008 RTM 10.00.1600
SQL Server 2008 RTM CU1 10.00.1763
SQL Server 2008 RTM CU2 10.00.1779
SQL Server 2008 RTM CU3 10.00.1787
SQL Server 2008 RTM CU4 10.00.1798
SQL Server 2008 RTM CU5 10.00.1806
SQL Server 2008 SP1 10.00.2531
SQL Server 2008 SP1 CU1 10.00.2710
SQL Server 2008 SP1 CU2 10.00.2714

SQL SERVER 2005
---------------
SQL Server 2005 RTM 9.00.1399
SQL Server 2005 Service Pack 1 9.00.2047
SQL Server 2005 Service Pack 2 9.00.3042
SQL Server 2005 Service Pack 3 9.00.4035

SQL SERVER 2000
---------------
RTM 2000.80.194.0
SQL Server 2000 SP1 2000.80.384.0
SQL Server 2000 SP2 2000.80.534.0
SQL Server 2000 SP3 2000.80.760.0
SQL Server 2000 SP3a 2000.80.760.0
SQL Server 2000 SP4 2000.8.00.2039

SQL SERVER 7.0
--------------
7.00.1063 SQL Server 7.0 Service Pack 4 (SP4)
7.00.961 SQL Server 7.0 Service Pack 3 (SP3)
7.00.842 SQL Server 7.0 Service Pack 2 (SP2)
7.00.699 SQL Server 7.0 Service Pack 1 (SP1)
7.00.623 SQL Server 7.0 RTM (Release To Manufacturing)

SQL SERVER 6.5
--------------
6.50.479 SQL Server 6.5 Service Pack 5a (SP5a) Update
6.50.416 SQL Server 6.5 Service Pack 5a (SP5a)
6.50.415 SQL Server 6.5 Service Pack 5 (SP5)
6.50.281 SQL Server 6.5 Service Pack 4 (SP4)
6.50.258 SQL Server 6.5 Service Pack 3 (SP3)
6.50.240 SQL Server 6.5 Service Pack 2 (SP2)
6.50.213 SQL Server 6.5 Service Pack 1 (SP1)
6.50.201 SQL Server 6.5 RTM

viernes, 14 de septiembre de 2007

Shift + Botón derecho para Windows Vista

Navegando por el ciberspacio he encontrado una combinación de teclas y ratón que nos puede ayudar en el día a día de nuestro trabajo.
Si sobre un fichero pulsamos SHIFT + Botón derecho del ratón veremos como se despliegan nuevas opciones, una de ellas que nos puede resultar bastante útil es la de Copiar como ruta de acceso, lo que hace es, copia la ruta dónde se halla este fichero al portapapeles, ya os podéis imaginar para que lo podemos usar, se acabó el ir abriendo la ruta y seleccionándola para luego copiar y pegar.

Espero que os sea de utilidad.

viernes, 24 de agosto de 2007

Existe un campo en una tabla

Bueno visitando las news de microsoft.public.es.sqlserver he visto que alguien preguntaba cómo saber si en una tabla existe un determinado campo, para en caso de no existir, añadirlo. Así que me he decidido a responderle y de paso postearlo aquí por si le sirve a alguien más.

IF NOT Exists(SELECT * FROM syscolumns AS sc INNER JOIN sysobjects AS so ON
sc.id=so.id AND
sc.name='NombreCampoNuevo' AND
so.name='NombreTabla')

Aquí pondríais la instrucción ALTER TABLE

GO

domingo, 19 de agosto de 2007

Integración CLR

Para poder usar esta nueva característica de SQL Server 2005 primero debemos habilitarla, para ello tenemos 2 opciones:
1.- Desde la Configuración del área de superficie para características. Desplegamos el nodo Motor de Base de datos, seleccionamos la opción Integración CLR marcando o desmarcando la casilla para habilitar o deshabilitar la característica.
2.- O bien mediante una sentencia T-SQL. Para poder ejecutar con éxito esta sentencia debemos tener permisos de sysadmin y serveradmin. La consulta es esta:
sp_configure ‘clr enabled’, 1
GO
RECONFIGURE
GO
Para deshabilitar la opción sustituiremos el 1 por un 0 (‘clr enabled’, 0)

Una vez ya tenemos activada esta opción pasamos a ver las posibilidades que nos brinda.

1.- Crearemos un nuevo proyecto de tipo Base de datos


2.- Una vez creado añadiremos un elemento nuevo, en este caso vamos a añadir una función definida por el usuario y la llamaremos clrDiaSemana



3.- Agregamos funcionalidad a nuestra función:



La función es muy sencilla y en SQL Server ya existe una función para devolver el día de la semana según una fecha dada (DATEPART, ver los BOL para su uso).

Una vez hecho esto tenemos que compilar el proyecto y una vez compilado lo implementamos (deploy), en SQL Server 2005 que es el servidor que acogerá el código .Net (en forma de ensamblado, en este caso de dll) y lo ejecutará en su interior.
Para comprobar que tenemos el ensamblado .Net que acabamos de implementar en SQL Server 2005, abriremos Sql Management Studio y desplegaremos la subcarpeta Ensamblados de la carpeta Programación de la base de datos que especificamos como conexión.


En la imagen podéis ver la manera de invocar a la función pasándole un parámetro, siempre que queramos hacer uso de la función debemos especificar a que esquema pertenece la función.

Enviar mails desde nuestra aplicación

Esta es una manera sencilla de implementar el envío de correo electrónico desde nuestra aplicación (la aplicación de ejemplo consta sólo de un formulario con un botón).
También podríamos crear un sistema de mailing masivo, implementando un bucle que recorra los destinatarios, de esta manera podríamos enviar noticias a nuestros clientes acerca de nuevos productos en nuestra empresa, sin tener que depender de productos de terceras personas.

Imports System.Net
Imports System.Net.Mail
Public Class Inicio
Private Sub Enviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Enviar.Click
Try
Dim mensaje As New MailMessage()
Dim cliente As SmtpClient = New SmtpClient("smtp.loquesea.com")
Dim cuerpo As String = "Esto es una prueba de mailing usando Visual Studio 2008, desde un formulario sencillo"

'TODO: Podemos implementar un bucle que procese los registros con emails (podemos obtenerlos de una BD por ejemplo)
With mensaje
.From = New System.Net.Mail.MailAddress("francisco@nospam.com")
'Iremos añadiendo los distintos destinatarios de los mensajes
.To.Add("irma@nospam.com")
.Subject = "Pruebas"
.Body = cuerpo
End With

cliente.Credentials = New System.Net.NetworkCredential("francisco@nospam.com", "1234")
'Añadimos las credenciales
cliente.Credentials = CredentialCache.DefaultNetworkCredentials
cliente.Send(mensaje)
MsgBox("Mensaje enviado con éxito")

'TODO: En esta parte podríamos controlar los distintos tipos de excepciones que se pueden presentar, fallo al enviar,
'correo lleno, ... para ello usaríamos en lugar de exception SmtpFailedRecipientsException y con una variable de tipo
'SmtpStatusCode podríamos recuperar el estado y asignar un mensaje más entendible para el usuario.
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
End Class

martes, 19 de junio de 2007

Checkbox con 3 estados

El código que os pongo es la manera más sencilla de implementar un checkbox con 3 posibles estados en WPF:

CheckBox Name="checkbox1" IsThreeState="True" IsChecked="{x:Null}"
CheckBox en estado indeterminado
CheckBox

No se porqué no puedo añadir las marcas de apertura y cierre, el caso es que si las pongo el blog quita todo el código contenido dentro de las marcas.

Ahora sólo falta adornarlo con una plantilla y a usarlo en nuestras aplicaciones, pero eso ya será otro día porque ya es tarde y mañana hay que currar.

En respuesta a tu petición voy a poner unas capturas que espero te sirvan de ayuda



Ejecutando el programa y revisando los distintos estados del checkbox