miércoles, 24 de octubre de 2007

Diversos ejemplos del uso del parámetro "e" en eventos de actualización

En el evento ItemInserted de un FormView, para acceder al valor de un campo del registro recién insertado:

e.Values.Item("NombreCampo").ToString()


En el evento RowUpdating de un GridView, o en el ItemUpdating de un FormView, para hacer comprobaciones de validez de datos:

'no permitir dejar vacío el primer campo
If e.NewValues().Item(0) Is Nothing Then
   darAviso("No puede dejar vacío el campo X")
   e.Cancel = True
   Exit Sub
End If
'obligar a que el nuevo valor sea diferente al viejo
If (e.NewValues().Item(0).ToString = e.OldValues().Item(0).ToString) Then
   darAviso("Debe cambiar el valor del campo X")
   e.Cancel = True
   Exit Sub
End If


También a través de "e" se puede acceder a la colección Keys definida en el control para establecer los campos que conforman la clave de nuestro conjunto de datos. Por ejemplo en un RowDeleting de un GridView podemos hacer comprobaciones de integridad antes de cargarnos la fila:

If hayRegistrosDependientes(e.Keys.Item("Id").ToString()) Then
   e.Cancel = True
   darAviso("Imposible borrar. Dejas la BD hecha un solar")
End If


Los ejemplos son un poco simples, pero que cada uno los complique tanto como quiera, o como necesite.

Hale!

viernes, 19 de octubre de 2007

Generación dinámica de películas .swf en .NET

SwfDotNet es una librería gratuita que permite la generación dinámica de películas .swf desde cualquier tecnología y lenguaje compatible con la plataforma .NET

http://www.swfdotnet.com/

Subida de archivos con FTP usando .NET

Está claro que el componete FileUpload, que se puede encontrar en la barra Estándar de Visual Studio 2005, permite subir ficheros a la web remoto, pero no cubre todas las expectativas deseadas o al menos no las mías.

Por eso es interesante conocer cómo se puede atacar a un servidor en concreto y hacer un ftp que copie el fichero deseado a la ubicación remota que quedamos.

Para ello:

/1/ En declaraciones generales establecer la clase que usaremos.

Imports System.Net


/2/ Crear un botón y en el evento Click escribir el código siguiente:

Dim Servidor As Uri
Dim ClienteFtp As WebClient

Servidor = New Uri("ftp://miservidor/LosNarejos.jpg")
ClienteFtp = New WebClient()

ClienteFtp.Credentials = New NetworkCredential("diego", "xxx")

ClienteFtp.UploadFile(Servidor, c:\Inetpub\wwwroot\marmenor\Repositorio\LosNarejos.jpg")

Response.Write("¡¡ Correcto !!")

No necesita mucho comentario. Sólo una mejora, claro que esto no será hoy, la subida de archivos es síncrona, lo que cual hace que tengamos que esperar mientras sube el archivo al servidor establecido. Lo suyo sería asíncrono, pero eso será otro día.

Nos vemos.

jueves, 18 de octubre de 2007

Referencia visual del diseño con DIVS

Un ejemplo visual que clarifica bastante las cosas básicas, sobre todo si le haces click y ves la versión ampliada:


La consiguió Diego, por cierto.

miércoles, 17 de octubre de 2007

Establecer color dependiendo de una condición en un GridView

Habitualmente mostramos los datos en un gridview más o menos "tuneados" que dirían, usando las propiedades de dicho control.

Hasta aquí todo bien. El problema, cuando en función a un determinado valor se debía cambiar cierta propiedad.

En el caso que me ocupaba, si obtenía del registro de la tabla o vista que mostraba en el gridview, una E, debía escribir una E y establecer la propiedad BackColor de tal modo que fuese Amarillo. Y si obtenía una P, pues escribiría el valor P y el color Rojo.

Para ello:

/1/ "Editar Columnas" de las opciones de la etiqueta inteligente del GridView.
/2/ Seleccionar el campo sobre el que deseamos proceder y convertirlo en template, para ello nos posicionamos y "Convertir este informe en TemplateField". Y Aceptar.
/3/ "Editar Plantillas" de las opciones de la etiqueta inteligente del GridView. Debemos estar en la plantilla ItemTemplate.
/4/ Seleccionar el Label de la plantilla, y "Editar DataBinding ..." de las opciones de la etiqueta inteligente del Labek.
/5/ En la propiedad Text, establecer "Con enlace a" y seleccionamos nuestro campo, es este caso el mío era Estado.
/6/ Activamos "Mostrar todas las propiedades"
/7/ Nos desplazamos a la propiedad BackColor.
/8/ Activamos "Personalizar enlace", y escribimos:

IIf(Eval("Estado")="E",System.Drawing.Color.Yellow,
    System.Drawing.Color.Red)


O dicho de otro modo, si el valor del campo de Estado es E entonces, fondo amarillo y si no fondo rojo.

También se puede establecer el color en modo hexadecimal, debiendo sustituir lo que proceda por:

System.Drawing.Color.FromName("#FFFF80")


Al final, el entorno Visual Studio genera esta línea por si puede ser más claro todo (click para ampliar):



Nada más.

Escapar comodines en Oracle

Para buscar cadenas que contengan el comodin '%':

SELECT *
FROM tabla
WHERE campo LIKE '%\%%' ESCAPE '\';


Idem para '_'

El carácter que se define como de escape puede ser cualquiera que no nos interfiera con la construcción de nuestro like, con algunas excepciones. Por ejemplo, no deja utilizar el '&'.

martes, 16 de octubre de 2007

Inicializar campos al insertar nuevo registro en FormView

Se puede hacer en otros eventos, pero yo lo tengo en el evento ItemCreated del Formview, comprobando que se está en modo insercción.

Por ejemplo, para inicializar a "0" un textbox llamado "TBAntiguedad" en el templated de inserción del FormView1:

Protected Sub FormView1_ItemCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.ItemCreated

If (FormView1.CurrentMode = FormViewMode.Insert) Then
 Dim txtBox As TextBox = CType( FormView1.Row.FindControl("TBAntiguedad"), TextBox)
 If Not (txtBox Is Nothing) Then
  txtBox.Text = "0"
 End If
End If
End Sub


lunes, 15 de octubre de 2007

¿Dónde estoy en mi web remota?

Uno de los problemas que nos topamos cuando subimos nuestra web a un servidor que encima de todo no es nuestro, vaya que no lo administramos, es que no conocemos la estructura de directorios.

Por tanto no conocemos donde está nuestra ruta local c:\inetpub\wwwroot\miweb\imagenes, así al menos la tengo yo (e imagino que tú también).

Para ello, Bill creó una clase que viene de otra, bueno al final el método es MapPath, y el chorizo si no se hace un imports ahí va:

System.Web.HttpContext.Current.Server.MapPath()


Muy útil para hacer referencia a base de datos Access, o a ubicaciones de archivos de imágenes en servidor remoto, etc.

Posicionar dinámicamente un panel o un div

Para establecer de manera dinámica las dimensiones o la posición de un panel:

panelNombre.Attributes("style") = "POSITION: absolute; TOP: " & posArriba & "px; LEFT: " & posDerecha & "px; WIDTH: " & ancho & "px; HEIGHT: " & alto & "px"


También se puede hacer lo mismo con un div, convirtiéndolo previamente en un control de servidor (agregándole runat="server" a su definición)

jueves, 11 de octubre de 2007

Manipulación de archivos y más

La manipulación de archivos, por decirlo de alguna forma, me permite obtener lista de archivos que hay en una carpeta, así como realizar operaciones con ellos, tales como renombrar, comprobar si existen, borrarlos, etc.

Para ello se usa la clase System.IO. Claro, verdad.

Un ejemplo por pasos, que luego dicen por ahí que copio y pego.

En una página aspx en blanco poner los siguientes controles:
-ListBox, que se llamará ListBox1 y con la propiedad AutoPostBack = True.
-Button, que se llamará Button1, y con Text="Subir Fichero"
-Otro Button, que se llamará Button2, y con Text="Borrar"
-FileUpload, que se llamará FileUpload1.
-Image, que se llamará Image1.

Ni que decir tiene que los controles son los que hay en la barra de herramientas estándar y no los HTML.

A escribir o copiar y pegar (mi opción), depende de lo perro que seas.
/1/ En declaraciones generales.

Imports System
Imports System.IO

si no sirve de nada lo que escribamos a continuación.

/2/ Evento Load de la página.

If Not Page.IsPostBack Then
Dim DirAct As New DirectoryInfo("c:\Inetpub\wwwroot\intranet\Repositorio")

' Crear un array que contenga los archivos del directorio establecido
Dim Arc As FileInfo() = DirAct.GetFiles()
Dim ArcTmp As FileInfo

For Each ArcTmp In Arc
ListBox1.Items.Add(ArcTmp.Name)
Next ArcTmp

End If

/3/ Evento Click de Buttton1.

Dim NombreArchivo As String
Dim RutaRepositorio As String
RutaRepositorio = "c:\Inetpub\wwwroot\intranet\Repositorio\"
If (FileUpload1.HasFile) Then
NombreArchivo = FileUpload1.FileName
RutaRepositorio += NombreArchivo
FileUpload1.SaveAs(RutaRepositorio)
ListBox1.Items.Add(NombreArchivo)
End If

/4/ Evento Click de Buttton2.

Dim Arc As FileInfo
If ListBox1.SelectedIndex <> -1 Then
Arc = New FileInfo("c:\Inetpub\wwwroot\intranet\Repositorio\" & ListBox1.SelectedItem.ToString)
Arc.Delete()
ListBox1.Items.Remove(ListBox1.SelectedValue)
End If
Para que esto funcione correctamente hay que agregar y asignar permiso de Modificación al usuario ASPNET de Windows.

/5/ Evento SelectedIndexChanged de ListBox1

Image1.ImageUrl = "~/Repositorio/" & ListBox1.SelectedItem.ToString
Image1.Width = 300

Ahora, F5 (Ejecutar) y haces click en examinar y coges archivos. Y luego click en subir, deberán aparecer en el listbox y subidos en el servidor donde se esté ejecutando la página. Puede que haya que dar algún permiso más que se me haya pasado, pero mañana es festivo. Así que el lunes lo releo.
Que no te gusta lo que has subido, click en Borrar. ¡¡ Impresionante !!
Si has subido imágenes y las selecciones deben aparecer por ahí en tu página,ya depende como me hayas puesto los controles.

Algunos detalles últimos. Por lo que veo no sobreescribe al subir los ficheros, aunque yo lo pinto en el listbox.

De entrada esto funciona, y nos aproxima a esta clase. Se puede depurar más y mejorar, pero ya no sería tan claro.

Nos vemos.

SQL Inyection

Interesante artículo sobre el SQL Inyection, tan de moda últimamente por estos lares.

Compilar ASP.NET desde consola

Útil si se desarrolla con la versión Express del Visual Studio, que no cuenta con el compilador integrado en el entorno de desarrollo.

Abrir ventana ms-dos y ejecutar las siguientes dos instrucciones:

cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

Aspnet_compiler -u -f -v /nombreSitioWeb -p rutaFuentesAsp rutaGeneracionBinarios

Así obtendremos nuestro código compilado y no tendremos que subir los .vb al servidor.

ORA-01036: número/nombre de variable no válido

Aunque sea un problema específico de Oracle, es perfectamente extrapolable a SqlServer. Creo.

El problema es el siguiente: cuando lanzas una operación de actualización de datos desde un FormView te lanza el error ORA-01036: número/nombre de variable no válido.

Lo obvio es que el problema esté en el SQLDataSet, por una incongruencia en la definición de los parámetros del UpdateQuery o el InsertQuery (diferencias de número o nombre entre los parámetros definidos y los incrustados en la sentencia SQL). También hay que recordar que en Oracle los parámetros incrustados en la sentencia SQL deben empezar por ":"

Pero el error también puede aparecer debido a algo menos obvio: introducir en el template de edición del formView un control enlazado a un campo que NO figura en la sentencia del UpdateQuery, (por ejemplo, un textbox donde se muestra decodificada una clave ajena) y dejar marcado al hacer el databinding de ese campo la opción "enlace de datos birideccional" . Al lanzar el Update intentará enlazar ese campo con un parámetro de la UpdateQuery, y como no existe lanzará la excepción.

Una gilipollez que me ha hecho perder mucho tiempo, reinstalación del cliente Oracle incluida.

Hale!

miércoles, 10 de octubre de 2007

Accesibilidad en ASP.NET

Ver esta página del MSDN. Ignoro si existe versión en castellano.

Primer post

Inaugurando esto. Vamos a tomarnos unas cañas