Convertir Integer a Byte() y Byte() a Integer

Cuando se requiera almacenar información como byte, una forma es utilizar la clase BitConverter como se muestra en el siguiente ejemplo:

Dim arByte() As Byte = BitConverter.GetBytes(123456)
Dim Entero As Integer = BitConverter.ToInt32(arByte, 0)

el resultado arByte() es una matriz de 4 elementos de tipo byte con valores {64,226,1,0}, la variable Entero contiene el valor de partida ’123456′

Entrada en .NET WinForms, ASP.NET, vb.net, Visual Basic, Visual Studio 2008 | 43 Comments

LINQ-to-entities, InvalidOperationException: La secuencia no contiene elementos

En una consulta LINQ que no devuelve ningún resultado y utilizamos la función First() se presenta la excepcion, “InvalidOperationException: La secuencia no contiene elementos”. Para resolver esto podemos utilizar la función FirstOrDefault().

Entrada en .NET WinForms, LINQ, Visual Studio 2008 | 22 Comments

LINQ-to-Entities agregar a una asociación muchos-a-muchos

En muchos de los diseños de entidad-relación se tienen relaciones entre entidades del tipo muchos-a-muchos (many-to-many) . Por ejemplo, si consideramos dos entidades ‘servicio’ y ‘cliente’ que tienen una relacion (Association) llamada ‘ServicioCliente’ en la cual se tiene solo las columnas CodServicio y CodCliente, un método muy aconsejable es utilizar:

Using _db As New BDEntities
    Dim ItemServicio As New Servicio With {.CodServicio = 2, _
                                               .TipoServicio = _TipoServicio)}
    _db.AddObject("Servicio", ItemServicio)
    Dim ItemCliente = (From c In _db.Cliente Where c.CodCliente = 1).First
    ItemServicio.Cliente.Add(ItemCliente)
    _db.SaveChanges()
End Using

lo que crea una relación entre el ‘servicio’ 1 y el ‘cliente’ 2 en la tabla de relación ‘ServicioCliente’.

Entrada en .NET WinForms, LINQ, LINQ to Entities, vb.net, Visual Basic, Visual Studio 2008 | 17 Comments

LINQ-to-entities ‘Contains’ en VS 2008

En Visual Studio 2008 el Método “Contains” no esta admitido como en EF4, una forma de seleccionar los elementos contenidos en una lista es utilizar el Método “Any“, como en el siguiente fragmento de código:

Dim lista = From cd In _db.CotizacionDetalle Where cd.Pedido Is Nothing _
    Group cd By NumCotizacion = cd.Cotizacion.NumCotizacion Into g = Group _
    Select NumCotizacion

Dim query = From sp In _db.Cotizacion Where lista.Any(Function(s) s = sp.NumCotizacion) _
    Select New With {.NumCotizacion = sp.NumCotizacion, _
        .CodProveedor = sp.CodProveedor, _
        .Fecha = sp.Fecha, _
        .FechaVigencia = sp.FechaVigencia, _
        .Obs = sp.Obs}
Entrada en LINQ, vb.net, Visual Basic, Visual Studio 2008 | 37 Comments

LINQ group by

Agrupación por multiples columnas de un DataTable:

    Dim query = From m In DSMoneda.Tables("TipoCambio").AsEnumerable _
    Group m By CodMoneda = m.Field(Of String)("CodMoneda"), _
                      Fecha = m.Field(Of Date)("Fecha") _
                      Into Group _
          Select New With {CodMoneda, Fecha, .cant = Group.Count}
Entrada en LINQ to dataset, vb.net, Visual Studio 2008 | 18 Comments

Ejecutar navegador de internet desde Winforms

Para poder ejecutar una aplicación desde Winforms podemos utilizar el Namespace System.Diagnostics, que permite interactuar con procesos del sistema, logs y otros. En este caso especifico para ejecutar el navegador de internet por defecto e ir a una dirección de internet desde una aplicación Winforms se puede efectuar los siguiente:

System.Diagnostics.Process.Start("http://www.midominio.com")

en caso de requerir que se ejecute especificamente Internet Explorer podemos utilizar el siguiente fragmento de código:

System.Diagnostics.Process.Start("IExplore.exe", "www.midominio.com")

este método tambien funciona para otras aplicaciones como Notepad.exe.

Entrada en .NET WinForms, vb.net, Visual Basic | 58 Comments

Crear archivo RAR en VB.NET usando ICSharpCode.SharpZipLib

En ocasiones hay la necesidad de grabar el contenido de una serie de datos dentro de un archivo comprimido tipo .ZIP o .RAR, la mejor y más simple forma de relizarlo la encontre con la librería ICSharpCode.SharpZipLib que esta bajo licencia GPL y es gratuita.

Para crear un archivo de texto dentro de un archivo .RAR debemos descargar la librería (ICSharpCode.SharpZipLib.dll) y referenciarlo en el proyecto. El fragmento de código mostrado a continuación crea el archivo “Archivo.TXT” dentro del archivo comprimido “Achivo.RAR”, con el texto contenido en TextBox1, este ejemplo puede adaptarse a todo tipo de datos y formatos.

Using stream = New FileStream("e:\Archivo.RAR", FileMode.Create)
        Dim stream1 = New TarOutputStream(stream)
        Dim wCadena As String = TextBox1.Text
        Dim bytes As Byte() = New UTF8Encoding().GetBytes(wCadena)
        Dim entry = TarEntry.CreateTarEntry("Archivo.TXT")
        entry.Size = bytes.Length
        stream1.PutNextEntry(entry)
        stream1.Write(bytes, 0, bytes.Length)
        stream1.CloseEntry()
        stream1.Close()
        stream.Close()
End Using
Entrada en .NET WinForms, Librerías, vb.net, Visual Basic | 25 Comments

Convertir List (Of <tipo anónimo >) a List (Of T)

A veces es necesario obtener como resultado de una consulta LINQ una lista del tipo List(Of Clase1). LINQ genera listas de tipo anónimo, lo que en ocasiones no es util, investigando un poco pude resolver el problema de la siguiente manera.

Definir la función de conversión:

Private Shared Function CreateTypedList(Of T)(ByVal lista As List(Of T)) As List(Of Clase1)
    Dim wLista As New List(Of Clase1)
    If lista.Count > 0 Then
        Dim _itemProperties() As PropertyInfo
        For Each item As T In lista
            _itemProperties = item.GetType().GetProperties()
            Dim wField As New Clase1
            For Each p As PropertyInfo In _itemProperties
                wField(p.Name) = p.GetValue(item, Nothing)
            Next
            wLista.Add(wField)
        Next
    End If
    Return wLista
End Function

esta recibe una lista de tipo anónimo y la convierte a una lista de objetos del tipo “Clase1″.
En este caso para poder realizar esta operación debemos indizar la clase ‘Clase1′, como sigue:

Public Class Clase1
    Public Property Column1 As Int32
    Public Property Column2 As Int32?
    Public Property Column3 As Int32?
    Public Property Saldo As Decimal?
    Public Property Cantidad As Decimal
    Public Property Obs As String

    Default Public Property Item(ByVal name As String) As Object
        Get
            Select Case name
                Case "Column1"
                    Return Column1
                Case "Column2"
                    Return Column2
                Case "Column3"
                    Return Column3
                Case "Saldo"
                    Return Saldo
                Case "Cantidad"
                    Return Cantidad
                Case "Obs"
                    Return Obs
                Case Else
                    Return Nothing
            End Select
        End Get
        Set(ByVal Value As Object)
            Select Case name
                Case "Column1"
                    Column1= Convert.ToInt32(Value)
               Case "Column2"
                   Column2 = Convert.ToInt32(Value)
               Case "Column3"
                   Column3 = Convert.ToInt32(Value)
               Case "Saldo"
                   Saldo = Convert.ToDecimal(Value)
               Case "Cantidad"
                   Cantidad = Convert.ToDecimal(Value)
               Case "Obs"
                   Obs = Convert.ToString(Value)
            End Select
        End Set
    End Property
End Class

Su utilización en el siguiente ejemplo:

Private Shared Function [Select]() As List(Of Clase1)
    Using _db As New SisEntities
        Dim query = From t In _db.Tabla1
              Join s In _db.Tabla2 On t.Cod1 Equals s.Cod1
              Join i In _db.Tabla3 On t.Cod2 Equals i.Cod2
              Where t.CodA = 1
              Select New With {.Colum1 = t.Colum1,
                     .Colum2 = t.Colum2,
                     .Colum3 = s.Colum3,
                     .Saldo = 0,
                     .Cantidad = s.Cantidad,
                     .Obs = t.Obs}
       For Each witem In query
           witem.Saldo = Calcula_Saldo(witem.Colum1, witem.Colum2)
       Next
       Return CreateTypedList(query.ToList)
       End Using
End Sub

la condición principal es que la lista generada sea equivalente a la “Clase1″.
No se si esta será la mejor forma o la más optima para realizar la conversión, pero funciona.

Entrada en .NET WinForms, ASP.NET, Entity Framework 4, LINQ, LINQ to Entities, vb.net, Visual Basic | 77 Comments

Left Join LINQ to Entities con filtro

Otra forma de recuperar elementos en la forma equivalente a SQL de ‘LEFT OUTER JOIN’, pero esta vez aplicando un filtro a la parte independiente de la selección (ProductoControl):

Using _db As New SisCV.SisCVEntities
Dim query = From n In _db.Producto
     From p In n.ProductoControl.Where(Function(c) c.CodSucursal = _CodSucursal).DefaultIfEmpty
    Select New With {.CodProducto = n.CodProducto,
           .NomProducto = n.NomProducto,
           .ExistMin = If(p Is Nothing, 0, p.ExistMin),
           .ExistMax = If(p Is Nothing, 0, p.ExistMax)}
Return query.ToList
End Using
Entrada en ASP.NET, Entity Framework 4, LINQ, LINQ to Entities | 34 Comments

LINQ to Entities, seleccionar Max cuando el resultado es NULL

Muchas veces es necesario recuperar el valor máximo de un campo, para asegurarnos que la consulta devuelva un valor aun cuando no se encuentren valores en la tabla se puede utilizar DefaultIfEmpty con el operador Max.
Por ejemplo:

Dim Max = (From n In _db.Inventario
            Select n.NumInventario).DefaultIfEmpty.Max
Entrada en .NET WinForms, ASP.NET, Entity Framework 4, LINQ to Entities | 23 Comments