viernes, 20 de marzo de 2015

IN con varibles Sql Server

En un procedimiento almacenado queremos hacer una consulta del tipo

Select * from mitabla where id in (@misValores)

Donde @misValores es dinámico. Hacer un concat en @misValores no funciona

Pero tienes dos soluciones :
  • Solución 1 , con una sentencia dinámica


    DECLARE @misValores2 VARCHAR(MAX)
    SET  @misValores2  = '3,4,22,6014'
    DECLARE @sql NVARCHAR(MAX)
    SET    @sql= 'Select * from mitabla where id in (@ ('+@misValores2 +')'
    EXEC sp_executesql @sql


  • Solución 2 , una variable de tipo tabla

    DECLARE @misValores TABLE (ID INT )
    INSERT INTO @misValores VALUES (3) ,(4),(22),(60),(14)
    SELECT * FROM miTabla  WHERE  id  in ( SELECT ID FROM @misValores )

jueves, 19 de marzo de 2015

Magic String

Hace poco escribí un post, para evitar comparar por un “algo” en código. Sinceramente el código que compara un string con el contenido de una cadena, es una chapuza. Todos lo hemos hecho, normalmente por prisas. Y cuando te toca cambiar el valor de esa cadena, te das cuenta del error que cometiste.

Pues resulta que comprar con un “algo” es un practica que tiene nombre Magic String. Con ese nombre parece hasta genial usarlo.

Pero si lo vas a usar, porque lo necesitas si o si, piensa que hay opciones .

http://geeks.ms/blogs/lruiz/archive/2015/02/05/clean-code-evitando-magic-strings.aspx

http://blog.goyello.com/2014/12/30/magic-strings-no-more/

http://www.variablenotfound.com/2009/12/t4-el-talisman-contra-las-cadenas.html

viernes, 13 de marzo de 2015

Google avisa

Necesitas que la web se vea bien en moviles

Para usuario de blogger esto no sea un problema: las propias plantillas ya realizan los cambios necesarios.
De he hecho lo he con el mio y sin problemas

Pero si tu web es comercial será mejor que te pongas la pilas. Posiblemente no sea fácil, o por lo menos no tan fácil como cambiar unos css

Info
http://communityanalisis.com/google-avisa-sin-version-responsive-desapareces-el-21-de-abril/

Google

http://googlewebmastercentral.blogspot.co.nz/2015/02/finding-more-mobile-friendly-search.html

Utils
https://www.google.com/webmasters/tools/mobile-friendly/

Pero hay más avisos 

Algunas aplicaciones y sitios web utilizan OpenID 2.0 para la autenticación al iniciar sesión y para acceder a los datos a los que hayas concedido permiso de acceso. OpenID 2.0 se ha sustituido por OpenID Connect. A partir 20 de abril de 2015, OpenID 2.0 dejará de estar disponible para Cuentas de Google.

viernes, 6 de marzo de 2015

Nombre de una propiedad


Vale odio ver en el código: dependencias con el contenido de un string. Me desespera.
Siempre que puedo uso enumerados  constantes.. y esta vez no sería diferente.

Quería conocer en cadena el nombre de una propiedad
Es decir miobj.DNI Obtener "DNI"


Imports System.Linq.Expressions

Private Sub Prueba(sender As System.Object, e As System.EventArgs)
        Dim miobj As miClase = New miClase() With {.DNI = "numero pasaporte", .Nombre = "mi nombre completo"}
        Dim nombrePropiedad As String = GetPropertyName(Function() miobj.DNI)
        Console.Write(nombrePropiedad) 'DNI
        Dim nombrePropiedad2 As String = GetPropertyNameB(Function(myObj As miClase) myObj.Nombre)
        Console.Write(nombrePropiedad2) 'Nombre
    End Sub

    Public Shared Function GetPropertyName(Of T)(ByVal expression As Expressions.Expression(Of Func(Of T))) As String
        Dim memberExpression As Expressions.MemberExpression = DirectCast(expression.Body, Expressions.MemberExpression)
        Return memberExpression.Member.Name
    End Function

    Public Function GetPropertyNameB(Of TModel, TProperty)(ByVal [property] As Expression(Of Func(Of TModel, TProperty))) As String
        Dim memberExpression As MemberExpression = DirectCast([property].Body, MemberExpression)
        Return memberExpression.Member.Name
    End Function

End Class

Public Class miClase
    Private _dni As String
    Private _nombre As String

    Public Property DNI() As String
        Get
            Return _dni
        End Get
        Set(ByVal value As String)
            _dni = value
        End Set
    End Property

    Public Property Nombre() As String
        Get
            Return _nombre
        End Get
        Set(ByVal value As String)
            _nombre = value
        End Set
    End Property

End Class

El ejemplo es mío,  pero la solución no.

http://stackoverflow.com/questions/10606841/how-can-i-get-a-property-name-for-a-type-without-the-need-to-instantiate-an-obje

http://www.codeproject.com/Questions/253756/Linq-Get-Property-Name-using-VB-Net

Vale en próxima versiones lo tendremos más fácil por lo menos en C# 6.0
https://roslyn.codeplex.com/discussions/552376

jueves, 26 de febrero de 2015

Atributos personalizados

Situación:

Tengo una dll con sus clases, métodos y acceso a base de datos (insertar, modificar y muestra por pantalla una determinada clase).
Tengo que cambiar el acceso de base de datos por un acceso a un servicio web (que no hacemos nosotros)
El servicio web proporciona unos objetos que no se ajustan nuestras clases originales

Requisitos:

Que fuera una dll es significativo porque quiere decir que se usa por varias aplicaciones y por lo tanto la modificación de las clases debe tener el menor impacto posible .

Solución:

  • Para empezar duplique la dll existente cambiando el nombre al ensamblado
  • Identifique los valores de nuestras tablas y propiedades con su correspondencia en el servicio web
  • Quite el acceso a datos por las llamadas al servicio web
  • Mi "problema" se complicó cuando comprobé que no sería todo tan sencillo:
    • tendría aplicaciones que posiblemente hiciera consultas SQL a esas tablas (usando evidentemente el nombre de las columnas)
    • El servicio web, me proporciona métodos para hacer la consultas, pero no pasando como parámetros un objeto sino lista de clave-valor , donde la calve era del tipo campo1,campo2.. (no me preguntéis porque esa codificación)
  • A mis clases de entidad les añadí un atributo personalizado. Esto me permitía relacionar las tablas SQL con los parámetros del servicio web con un mínimo impacto.
Adjunto un ejemplo sencillo, para que veas que es bastante sencillo de usar.


Module miEjemplo

    Public Sub Ejemplo()
        Dim miSqlViejo = "select dni, nombre from personas "
        For Each attribute As MiEntityAttribute In MiEntityAttribute.GetMiEntityAttribute(GetType(miClaseDecorada)).Values
            If Not attribute Is Nothing Then
                miSqlViejo = miSqlViejo.Replace(attribute.ColumnaOLD, attribute.ColumnaNew)
            End If
        Next
        Console.Write(miSqlViejo) 'select dni_cif, nombreCompleto from personas
    End Sub
    Public Class miClaseDecorada
        Private _dni As String
        Private _nombre As String

        <MiEntity("dni", "dni_cif")>
        Public Property DNI() As String
            Get
                Return _dni
            End Get
            Set(ByVal value As String)
                _dni = value
            End Set
        End Property

        <MiEntity("nombre", "nombreCompleto")>
        Public Property Nombre() As String
            Get
                Return _nombre
            End Get
            Set(ByVal value As String)
                _nombre = value
            End Set
        End Property

    End Class

    ''' <summary>
    ''' Atributos personales
    ''' </summary>
    ''' <remarks></remarks>
    <AttributeUsage(AttributeTargets.Property, AllowMultiple:=False)>
    Friend Class MiEntityAttribute
        Inherits Attribute

        Private _columnaBDOLD As String
        Private _columnaBDnew As String

        Public Sub New()
        End Sub

        Public Sub New(columnaBDOLD As String, columnaBDnew As String)
            Me._columnaBDOLD = columnaBDOLD
            _columnaBDnew = columnaBDnew
        End Sub
        ''' <summary>
        ''' Nombre de la propiedad dentro de la base de datos vieja
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overridable ReadOnly Property ColumnaOLD() As String
            Get
                Return _columnaBDOLD
            End Get
        End Property
        ''' <summary>
        ''' Nombre de la propiedad dentro de la base de datos nueva
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overridable ReadOnly Property ColumnaNew() As String
            Get
                Return _columnaBDnew
            End Get
        End Property
        Friend Shared Function GetMiEntityAttribute(ByVal ot As Type) As Dictionary(Of String, MiEntityAttribute)
            Dim oret As Dictionary(Of String, MiEntityAttribute) = New Dictionary(Of String, MiEntityAttribute)
            For Each propiedad As PropertyInfo In ot.GetProperties()
                If propiedad.GetCustomAttributes(GetType(MiEntityAttribute), False).Any() Then
                    oret.Add(propiedad.Name, CType(propiedad.GetCustomAttributes(GetType(MiEntityAttribute), False)(0), MiEntityAttribute))
                Else
                    oret.Add(propiedad.Name, Nothing)
                End If
            Next
            Return oret

        End Function
    End Class
End Module
Documentación al respecto: MSDN
Por supuesto pensé en un método "tradicional" : funciones para convertir objetos, enumerados que mantengan la relaciones entre las distintas propiedades…Pero el uso de los atributos me parece que da una solución sencilla y fácil de mantener.
Supongo que los trabajan con MVC el tema de los atributos lo tienen más que superado. Pero si eres de asp o de aplicaciones de escritorio, esto te facilita la vida con poco esfuerzo.

Otra solución con interfaces :http://blog.koalite.com/2015/03/interfaces-marcadoras-atributos-y-convenciones/

viernes, 13 de febrero de 2015

Formación

¿Estudias o trabajas? Bueno yo siempre contesto que la dos cosas, te dediques a lo que te dediques siempre hay que estar formándose. La informática no es una excepción.
Podríamos hablar de formación de en la empresa, pero si están en una consultora para un cliente, lo tendrás bastante mal.
Aquí un par de sugerencias , se hacen on-line, son gratis, en castellano.. el interés lo pones tú

http://www.microsoftvirtualacademy.com/

https://www.miriadax.net/

Y

http://www.openeducationeuropa.eu/es/find/moocs

viernes, 23 de enero de 2015

JavaScript en el lado del servidor !!!


Para un aproximación
http://www.nodebeginner.org/index-es.html

http://blog.koalite.com/2011/11/tutorial-node-js-express-jquery-i-creando-la-aplicacion/
Paso a paso ..
1. Para instarlo en un IIS
http://searchwindowsserver.techtarget.com/tip/How-to-successfully-install-Nodejs-applications-on-IIS

http://strongloop.com/strongblog/node-js-net-getting-started-part-two/

Con visual studio

http://blogs.msdn.com/b/esmsdn/archive/2014/09/11/c-243-mo-desarrollar-aplicaciones-de-node-js-en-visual-studio.aspx
Por que?

http://www.wintellect.com/blogs/jlane/five-reasons-asp.net-developers-shouldn%E2%80%99t-worry-about-node