Función Row_number con un valor de inicio

En SQL Server existe una función denominada ROW_NUMBER() que es muy sencilla de utilizar y nos devuelve de manera secuencial el número de la fila que toda la Query, comenzando por 1.

El ejemplo mas sencillo es (yo siempre utilizo mis tablas con la columna ID):

SELECT	 ROW_NUMBER() OVER(ORDER BY ID DESC) ID
from [TU_TABLA]

Acá podemos ver el resultado que nos devolvería esta queryimg1

Entonces si queremos hacer una secuencialidad de registros entre 2 queries, solamente tenemos que hacer lo siguiente:

declare @val int

select @val=MAX(t.id) 
from ( 
SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) ID 
 from [TU_TABLA_1]) t

select @val+ROW_NUMBER() OVER(ORDER BY ID DESC) ID2 
from [TU_TABLA_2]

La segunda query comienza a contar sumando la variable que le ingreso. Muy simple y rápido.
Saludos.

junio 4, 2013     admin     SQL     , , , , ,      Comentarios desactivados

Año nuevo, Jquery Nueva (?)

Las grandes cosas están construidas por pequeños elementos que hacen nuestra vida feliz y placentera. En este pequeño post voy a ir enumerando pequeños detalles de JQUERY que nos van a permitir solucionar problemas en nuestra interface ASP.NET con transparencia y sencillez.

Ejemplo 1: Cambio de valores de un input/textbox/label

En la cabecera tomamos siempre el archivo JS del site de JQUERY y lo insertamos en el <head>

<head runat="server">
<script> src="http://code.jquery.com/jquery-latest.js"></script>
</head>

… »

marzo 7, 2013     Fernando Sanchez     Javascript, Jquery     , , , , , , ,      Comentarios desactivados

Atributos en .NET y la punta del Iceberg de Reflection

Hace un tiempo, con un desarrollo ya avanzado, me tuve que enfrentar a una disyuntiva. Generada todas mis clases de negocios con sus correspondientes propiedades necesitaba realizar un algoritmo que me permita encriptar determinados valores de esas propiedades al momento de persistirlas en la base y desencriptarlas al momento de ser consultadas.

Buscando una solución llegue a la clase System.Attribute que me ofrecía .NET, que me permitía agregarle un poco de información a las clases sin tener que rescribirlas todas soportando la nueva funcionalidad. De esta manera, y con la ayuda del TodoPoderoso Señor Reflection, obtuve una manera rápida, y que no me generó una baja en la performance de mi sistema, para poder recorrer las clases y saber cual atributo debía encriptar/desencriptar.

Vamos al ejemplo para explicar un poco como funciona:

1- Paso, crear nuestro Atributo personalizado:

<AttributeUsage(AttributeTargets.Property)> _
Public Class AtributoEspecial
Inherits System.Attribute
End Class

Se puede notar que que el tag AttributeUsage me permite usar mi atributo solamente sobre lo que yo deseo, en mi caso propiedades pero pueden ser lo que uno quiera: delegados, enum`s, eventos, interfaces, etc

image

2-Tagear a las propiedades de las clases que queremos a attributear (?) de esta manera: _

Public Class ClaseConcretaConAtributos
Inherits ClaseBase

Private _cuit As String

<Librerias.AtributoEspecial()> _
Public Property cuit() As String
Get
Return _cuit
End Get
Set(ByVal value As String)
_cuit = value
End Set
End Property

End Class

y ahora resta recorrer la clase con Reflection de esta manera:

For Each propiedad As Reflection.PropertyInfo In Me.GetType.GetProperties
For Each objAtributos As Object In propiedad.GetCustomAttributes(True)
Dim typeAtributo As Librerias.AtributoEspecial = TryCast(objAtributos, Librerias.AtributoEspecial)
If typeAtributo IsNot Nothing Then
'REALIZO EL CODIGO QUE NECESITO PARA LAS PROPIEDAS QUE TIENEN ESE ATRIBUTO
end If
Next
Next

Ahi es donde está la punta del iceberg de Reflection. No vamos en ese post a adentrarnos sobre este tema.

Espero que les sirva, saludos.

-código fuente en SkyDrive:

agosto 7, 2012     Fernando Sanchez     .NET, C#, General, VB.NET     , , , , ,      Comentarios desactivados

Tips: Manejo de Div desde el servidor y del HTML

Existen varias formas de ocultar y mostrar etiquetas <div> en nuestra Web, en general son maneras para mostrar información útil al usuario en el momento en que él la necesita y ocultarla cuando no la necesite. De esta manera le damos el control al usuario de que vea lo que él desee, en el momento en que lo deseé.

Ya anteriormente comente un pequeño tips para manejar los TRs

La primera manera es la mas simple y permite hacerlo desde el servidor, en un postback:

<div id="myDIV" runat="server">
<asp:Label ID="lbl1" runat="server" Text="No hay datos." visible="true"></asp:Label>
</div>

Lo importante en este caso es el runat= server que insertamos en el DIV, de esta manera lo tendremos como un objeto en el servidor.
Simplemente manejamos el estado visible true/false del div como un objeto mas.

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 'si esta invisible (visible=true, lo oculta. Sino lo muestra
 If myDIV.visible Then
   myDIV.visible = False
 Else
   myDIV.visible = True
 End If
End Sub

Saludos.

mayo 9, 2012     Fernando Sanchez     HTML     , , , , ,      Comentarios desactivados

Recorrer todos los controles de una página ASP.NET

Buscando la manera de encontrar una serie de Gridview en una página es que llegué a crear esta función. Que es básicamente recorrer los controles de manera recursiva porque un control puede contener a otros controles en su interior. En mi caso era solamente ocultar el FooterRow de las Grillas (Gridview) y tengo en cuenta que cuando la grilla no tiene rows la oculto directamente.

El código en VB:

[sourcecode language="vb"]
For Each ctrl As Control In Page.Controls
Dim gv As GridView = TryCast(ctrl, GridView)
If gv Is Nothing Then
RecorrerColeccion(ctrl)
Else
If gv.Rows.Count > 0 Then
gv.FooterRow.Visible = False
Else
gv.Visible = False
End If
End If
Next
[/sourcecode]

Acá esta la función recursiva RecorrerColeccion:

[sourcecode language="vb"]
Sub RecorrerColeccion(ByVal parentCtrl As Control)
For Each pctrl As Control In parentCtrl.Controls
Dim gv As GridView = TryCast(pctrl, GridView)
If gv Is Nothing Then
RecorrerColeccion(pctrl)
Else
If gv.Rows.Count > 0 Then
gv.FooterRow.Visible = False
Else
gv.Visible = False
End If
End If
Next
End Sub
[/sourcecode]

Y acá esta el mismo ejemplo en C#:

[sourcecode language="csharp"]
foreach (Control ctrl in Page.Controls) {
GridView gv = ctrl as GridView;
if (gv == null) {
RecorrerColeccion(ctrl);
} else {
if (gv.Rows.Count > 0) {
gv.FooterRow.Visible = false;
} else {
gv.Visible = false;
}
}
}

public void RecorrerColeccion(Control parentCtrl)
{
foreach (Control pctrl in parentCtrl.Controls) {
GridView gv = pctrl as GridView;
if (gv == null) {
RecorrerColeccion(pctrl);
} else {
if (gv.Rows.Count > 0) {
gv.FooterRow.Visible = false;
} else {
gv.Visible = false;
}
}
}
}
[/sourcecode]

Espero que les resuelva el problema como a mi.

Saludos.

abril 17, 2012     Fernando Sanchez     asp.net, GridView     , , , , ,      1 comment

Deshabilitar el botón de Login en el postback

Voy a mostrar un ejemplo muy sencillo y practico de como deshabilitar el botón de login cuando el usuario le da click para evitar el doble post-back.

El ejemplo esta testeado en IE 7, Firefox 3.0.11 y Chrone 2.0

Voy a mostrar todo el HTML de la pagina de una pagina de login y luego voy a explicar los 2 puntos que hacen que funcione.

El HTML es este:

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Mi pagina de Login</title>

</head>

<body>

    <form id="form1" runat="server" submitdisabledcontrols =true >

    <div>

        <table>

            <tr>

                <td style="width: 100px">

                    <asp:Label ID="Label1" runat="server" Text="Password"></asp:Label></td>

                <td style="width: 100px">

                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>

                <td style="width: 100px">

                </td>

            </tr>

            <tr>

                <td style="width: 100px; height: 21px">

                    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></td>

                <td style="width: 100px; height: 21px">

                    <asp:TextBox ID="TextBox2" runat="server" TextMode="Password" Width="149px"></asp:TextBox></td>

                <td style="width: 100px; height: 21px">

                </td>

            </tr>

            <tr>

                <td style="width: 100px">

                </td>

                <td style="width: 100px; text-align: center">

                    <asp:Button ID="Button1" runat="server" Text="Ingresar"  OnClientClick ="this.value='Validando...'; this.disabled=true; __doPostBack('Button1','')" OnClick="Button1_Click" /></td>

                <td style="width: 100px">

                </td>

            </tr>

        </table>

    </div>

    </form>

</body>

</html>

Del HTML observamos 2 puntos importantes el primero es la propiedad submitdisabledcontrols en true. Gracias a este propiedad podemos forzar el postback del botón cuando éste está bloqueado.

   1: <form id="form1" runat="server" submitdisabledcontrols =true >

Y el 2do punto es el código javascript del botón de login:

   1: <asp:Button ID="Button1" runat="server" Text="Ingresar" OnClientClick ="this.value='Validando...'; this.disabled=true; __doPostBack('Button1','')" OnClick="Button1_Click" />

Aquí, en la propiedad OnClientClick, es donde ingresamos todo el código javascript, que consta del cambio del Label, el bloqueo del botón y el postback de la pagina. Cabe destacar que el __doPostback tiene que ir ultimo para que realice el postback después de hacer los cambios visibles en el cliente.

Bueno realmente es muy sencillo, es simple y es claro (kuak)

Saludos.

junio 20, 2009     Fernando Sanchez     Javascript     , , , , ,      Comentarios desactivados

Un solo RowDataBound para varias GridView

Suele pasar que tengamos mas de una grilla (gridView en .NET 2.0) en una misma pagina Web y es incomodo, cuando se necesita que cada fila tenga un comportamiento, copiar y pegar código para cada grilla en el evento RowDataBound. Por ejemplo, si quiero a cada fila agregarle algo de Javascript para su validación o simplemente cambiar de color esa fila.

Este ejemplo muetra como enlazar un solo evento RowDataBound para las grillas que sean necesarias en un misma pagina. Esta hecho en  ASP.NET (VB.NET) 2.0

Una vez creado el proyecto y agregada las 2 GridView, simplemente en el Code Behind y nos paramos sobre una GridView.

foto0

Y luego en sus eventos vamos al RowDataBound:

foto01

Una vez que nos genero el código simplemente vamos hacia el handles (que esta al final) con comas vamos agregando todos los objetos que queremos que ese evento maneje:

foto1

Ahora bien, la pregunta es simple: ¿Como distingo una Grilla de Otra?, simple:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
                   Handles GridView1.RowDataBound, GridView2.RowDataBound

       If e.Row.RowType = DataControlRowType.DataRow Then 'DataRow Vale las row que tienen datos, de esta manera se saltea el header,el footer y el pager
           Dim idCelda As Integer
           Dim gvrow As GridViewRow = CType(e.Row.Cells(idCelda).NamingContainer, GridViewRow)
           Select Case CType(sender, GridView).ID
               Case GridView1.ID
                   gvrow.BackColor = Drawing.Color.Red
               Case GridView2.ID
                   gvrow.BackColor = Drawing.Color.LightGoldenrodYellow
           End Select
       End If

   End Sub

Bastante sencillo. Y así es como nos queda:

fotofinal

Adjunto el proyecto aqui

Saludos.

julio 28, 2008     Fernando Sanchez     GridView     , , , ,      1 comment

   


© Try To Catch - Wordpress Hosting by Dattatec