jueves, 20 de diciembre de 2007
Visual Studio 2005 y Delphi 2005. Efectos colaterales.
Si se te ocurre instalarte el VS2005 teniendo el Delphi 2005 instalado, la próxima vez que arranques tu Delphi te dará un bonito error diciendo que no puede cargar htmlhelp290.bpl. Pues bueno, que se quede sin cargar. Luego comprobarás que la consecuencia de este mensajito es que te deja de funcionar la ayuda. Vaya, pues había que cargarla.
La solución está en meterse en el registro de windows y:
En HKEY_CLASSES_ROOT\AppID\DExplore.exe, machacar el valor de la clave "AppId" poniendo
{4A79114D-19E4-11d3-B86B-00C04F79F802}
Si en el arranque de Delphi, cuando te da el error en la carga de htmlhelp290.bpl, le has dicho que no te la vuelva a cargar también tienes que tocar
HKEY_CURRENT_USER\Software\Borland\BDS\3.0\Disabled IDE Packages y borrar la clave del htmlhelp290
Solución extraída de aquí, también documentada por los chicos de Borland.
martes, 18 de diciembre de 2007
Dar formato a los datos usando una clase
Lo que se pretende es poder llegar a dar formato a información usando una clase, que no instanciaremos.
Para ello se necesita que nos creemos en la carpeta App_Code de nuestro proyecto un archivo de clase que llamaremos Funciones.vb o lo que nos parezca.
El código de dicha clase:
Imports Microsoft.VisualBasic
Public Class Funciones
Public Shared Function FormatoCadena(ByVal Valor
As String, ByVal Formato As String) As String
Dim ValorFormato As
Double
Dim Cadena As String
ValorFormato = Valor
Cadena =
ValorFormato.ToString(Formato)
Return Cadena
End Function
End
Class
Esta clase podrá ser llamada sin ser instanciada desde cualquier parte del proyecto. Así si deseamos que se puede llamar desde un FormView, cómo fue el caso que a mí me ocupó, accederemos a través de la etiqueta inteligente a la plantilla donde esté el campo al que aplicaremos formato, y accederemos a través de su etiqueta inteligente a "Editar DataBinding ...".
Activaremos "Personalizar enlace" y en la expresión de código pondremos:
Funciones.FormatoCadena(Eval("Telefono1"), "### ## ## ##")
También se podría evitar poner Funciones haciendo un Imports o agregandolo convenientemente en web.config.
Páginas de ayuda con información de formatos:
http://authors.aspalliance.com/aspxtreme/sys/globalization/demos/DateTimeFormatInfoGetAllDateTimePatterns.aspx
http://msdn2.microsoft.com/es-es/library/az4se3k1(VS.80).aspx
http://msdn2.microsoft.com/es-es/library/dwhawy9k(VS.80).aspx
http://msdn2.microsoft.com/es-es/library/0c899ak8(VS.80).aspx
Nada más.
lunes, 17 de diciembre de 2007
LLamar a un procedimiento almacenado que devuelve valor a través de RETURN
Como sabemos una de las maneras de que un procedimiento almacenado de SqlServer nos devuelva un valor (entero) es usando el RETURN:
CREATE PROCEDURE nombreProc
@Parametro nvarchar(50)
AS
BEGIN
IF EXISTS (SELECT Id from Tabla where campo=@Parametro)
begin
RETURN 1
end
else begin
RETURN 0
end
END
Para llamar a este procedimiento desde el .net y obtener el valor devuelto hay que crearle un parámetro específico del tipo ReturnValue, aparte de los definidos en el procedimiento:
cmd.CommandType = Data.CommandType.StoredProcedure
cmd.CommandText = "nombreProc"
cmd.Parameters.Clear()
cmd.Parameters.Add(New SqlParameter("@Parametro", "valor"))
Dim retValue As New SqlParameter("@RETURN_VALUE", Data.SqlDbType.Int)
retValue.Direction = Data.ParameterDirection.ReturnValue
cmd.Parameters.Add(retValue)
cmd.ExecuteScalar()
Dim resultado As Integer = Convert.ToInt32(retValue.Value)
If resultado = 1 Then
...
...
Else
...
...
End If
jueves, 13 de diciembre de 2007
Control FreeTextBox y Formview
Gridview: recuperar el índice de la fila desde un template field
Caso práctico: para cada fila de un GridView quieres poner un enlace/botón que realice cierta operación (llamémosle "pitufar") con el registro de esa fila. Sin problemas: editas las columnas del GridView y le metes un ButtonField con:
text="Pitufar"
CommandName="Pitufar"
Luego en el evento RowCommand del GridView te marcas un bonito:
If e.CommandName = "Pitufar" Then
GridView1.SelectedIndex = Convert.ToInt32(e.CommandArgument)
pitufeame(GridView1.SelectedValue)
GridView1.DataBind()
End If
Y ya lo tienes.
Pero... ¿Y si necesitas convertir ese ButtonField a TemplateField? Mala cosa, porque entonces el código del RowCommand dejará de funcionar por la sencilla razón de que en e.CommandArgument ya no tendrás el índice de la fila que han clickeado.
Solución: En la propiedad CommandArgument del TemplateField hay que poner:

Y todo vuelve a funcionar.
miércoles, 12 de diciembre de 2007
SQLServer. Transacciones en procedimientos almacenados
Ejemplillo de cómo implementar un procedimiento almacenado con operaciones dentro de una transacción y controlar la excepción para tirar un rollback:
CREATE PROCEDURE nombreProcedimiento
@parametro1 bla, bla...
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
INSERT ...
UPDATE ...
(etc...)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
END
Campo de GridView con enlace a valor del campo
Lo que se pretende es poder tener un GridView pero que uno de los campos se comporte como un enlace, con la peculiaridad de que el valor que se mostrará será de un campo, y el valor al que enlazará será de otro.
Esto que en ASP 3.0 parecía sencillo en ASP.NET no es complejo, sólo es necesario conocer las propiedades que se han de tocar para esta acción. Aunque a mí me he llevado mi tiempo.
Primeramente se deberá disponer de un sqlDataSource u otro origen de datos similar y que esté correctamente configurado.
A continuación agregaremos un GridView y lo enlazaremos con el control sqlDataSource a través de la propiedad DataSourceId o usando la etiqueta inteligente del control GridView.
Una vez lo tengamos, deben de aparecer los campos en el GridView, y es momento de acceder a "Editar columnas ..." a través de la etiqueta inteligente del control GridView.
En la caja campos disponibles, agregaremos uno denominado "Campo HyperLink", y los valores que tocaremos serán:
-DataNavigateUrlFields: Será el campo que contiene el valor con el que pretendemos enlazar.
-DataTextField: Será el campo que contiene el valor que deseamos sea visto en el GridView.
-DataNavigateUrlFormatString: Será la que contenga el formato de cómo deberá se referenciará al campo contenido en DataNavigateUrlFields. Sería el caso de establecer la ruta relativa, o componer una dirección. Ejemplo: ../../Repositorio/{0}
{0}, sustituirá al valor del campo por cada registro de DataNavigateUrlFields.
Otros valores opcionales:
-SortExpresion: Se establecerá el campo por el que se ordenará la columna.
-Target: El modo en que se abrirá la ventana, en la misma ventana, una nueva, etc.
Nada más.
martes, 11 de diciembre de 2007
Limitando el tamaño de los ficheros (UploadFile)
El control UploadFile nos permite subir ficheros del cliente al servidor de una manera pasmosamente fácil. Tan pasmosamente que si no se limita dicha subida las consecuencias, en forma de consumo de ancho de banda y de posibles problemas de seguridad, no tardarán en llegar.
En el artículo del FileUpload del MSDN se citan estrategias para asegurar tu subida de ficheros: de parte del cliente poner validadores sobre la extensión del fichero, y de parte del servidor comprobar el tamaño del archivo subido y su ContentType. El problema, como ellos mismos dicen, es que lo primero es demasiado vulnerable y lo segundo no te evita que el archivo viaje al servidor, en donde será rechazado si no cumple tu validación pero nadie te devolverá el ancho de banda consumido. Para evitar esta última situación, podemos limitar el tamaño máximo de transferencia de las páginas estableciendo el maxRequestLength en el web.config.
httpRuntime maxRequestLength="512"
Así nos aseguramos de que no podrán viajar más de 512kbs al servidor. El problema: que si el tamaño del request supera el límite, lo que obtendremos es un error de servidor diciendo que "Se ha reiniciado la conexión"... Poco descriptivo. Pues bien, aquí se explica cómo capturar el error desde .net, para poder decirle al usuario de una manera elegante que se meta ese divx de 2 gigas por donde le quepa.
lunes, 10 de diciembre de 2007
Generar favicon.ico
Una bonita utilidad online que te genera y te permite descargar el favicon.ico partiendo de un gif, jpg, png, o bmp que pese menos de 150 kb.
viernes, 7 de diciembre de 2007
Generación de gráficas
Se puede use la Google Chart API para generar gráficas.
Más informacion en ...
http://www.tufuncion.com/graficas-php
jueves, 6 de diciembre de 2007
Encriptar secciones del web.config
Encriptar sección indicando la ruta física del web.config:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
aspnet_regiis -pef "Seccion" "RutaFisica"
Si queremos hacerlo indicando directorio virtual:
aspnet_regiis -pe "Seccion" -app "RutaVirtual"
Para desencriptar, cambiar "pe" por "pd".
Más info, como siempre, en el MSDN.
miércoles, 5 de diciembre de 2007
Vincular servidores remotos en SQLServer
Al grano:
Ver los servidores que tienes vinculados:
exec sp_linkedservers
Añadir un nuevo servidor remoto a tus vínculos:
EXEC sp_addlinkedserver
@server='nombreVinculo',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='IPRemotaServidor'
Añadirle credenciales para poder acceder a un servidor remoto:
EXEC sp_addlinkedsrvlogin 'nombreVinculo', 'false', NULL, 'usuarioBDRemota', 'claveBDRemota'
Y hale, a tirarle al servidor vinculado.
Más info en el MSDN, aquí y aquí.
Enlace a un blog que lo explica bastante bien, acá.