Featured Posts

domingo 4 de diciembre de 2011

Campos de Entrada Autocompletados

Seguramente en muchos de vuestros Formularios habréis sentido la necesidad que vuestros usuarios puedan seleccionar algún valor de texto de entre los contenidos en algún campo String en una Base de Datos (la situación es idéntica para encontrar campos numéricos o de cualquier otro tipo). A dichos campos le debemos habilitar las propiedades de Autocompletar, tal y como véis aquí:


Podemos seleccionar los valores desde algún DataSet o hacerlo directamente desde código. Algo parecido a ésto:

        'Cargo los Nombres de los Clientes en el Autocompletar del TextBox de Búsqueda
        Dim lista_buscar_clientes As New List(Of String)
        Dim comando As New SqlCommand("select nombre from cliente nolock order by nombre", cnn)
        Dim lectorDatos = comando.ExecuteReader()
        While lectorDatos.Read()
            lista_buscar_clientes.Add(lectorDatos("nombre"))
        End While
        ' Cierra el objeto DataReader
        lectorDatos.Close()
        txt_cliente.AutoCompleteCustomSource.AddRange(lista_buscar_clientes.ToArray)

jueves 1 de diciembre de 2011

Cambiar de Fila (no de columna) al editar un DataGridView

Hoy os traigo un truco realmente simple que os facilitará muy mucho la edición a la hora de introducir datos en un control DataGridView en tus proyectos .NET, si eres como yo, que prefieren introducir datos y validarlos pulsando la tecla "Enter", y no "Tabulador", para avanzar entre las distintas columnas de una fila. Técnicamente consiste en ejecutar el código que "sustituye" la pulsación del Enter por el Tabulador, desde el evento KeyDown directamente (o como ves en mi ejemplo, en una función llamada ValidarEnter, ya que la utilizo en muchos otros controles, y recuerda una de las leyes del buen desarrollador: ¡el código se escribe una sóla vez, no dupliques el mismo código en clases o módulos distintos!). Nos vemos.
  
Private Sub DataGridView_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView.KeyDown
      ValidarEnter(e)
End Sub

Private Sub ValidarEnter(e As System.Windows.Forms.KeyEventArgs)
  If e.KeyCode = Keys.Enter Then
     e.SuppressKeyPress = Tue
     SendKeys.Send("{TAB}"
  End IF
End Sub

sábado 5 de noviembre de 2011

Procedimientos Almacenados lentos en SQL Server

Si trabajas con SQL Server es muy posible que te haya ocurrido que un Procedimiento Almacenado te tarda muchísimo, pero si ejecutas la misma consulta, y en las mismas condiciones de estado en el servidor de base de datos, en el Analizador tarda sólo segundos. ¿Por qué?. La respuesta es el Parameter Sniffing, que ocurre con los Procedimientos Almacenados que tienen Parámetros y que utilizan dichos Parámetros en sus consultas. El motor de base de datos recoge los valores de los parámetros y los entrega al Optimizador de Consultas, y ya éste genera el Plan de Ejecución más apropiado, siempre que usemos los parámetros en sentencias 'where' por ejemplo. El Plan de Ejecución no se genera con la creación del Procedimiento Almacenado, sino que por el contrario, se crea y se cachea en la primera ejecución del Procedimiento Almacenado.

¿Hay alguna solución?. Sí, por supuesto, y como casi siempre suele ser de lo más simple: crear variables locales al Procedimiento Almacenado que recojan los valores de los parámetros, y usar dichas variables locales en las sentencias where. Un ejemplo:
CREATE PROCEDURE dbo.miprocedimiento @Id AS VARCHAR(5) AS
DECLARE @pId VARCHAR(5)
SET @pId = @Id
.......
SELECT ... FROM ... WHERE ... (campo=@pId)

Hace pocos días conocí un caso de un procedimiento almacenado que tardaba más de 30 minutos en completarse y con este "truco" los resultados se obtuvieron en 3 segundos. ¿Interesante, verdad?. Pues mañana más, jejejeje. Nos vemos.