LINQ to datatable Group by Max,Min,Average,Sum

Un ejemplo de multiples agrupamientos (Group by Max,Min,Average,Sum) desde un DataTable.

        Dim query = From m In wDT.AsEnumerable
            Group m By IDZona = m.Field(Of Int32)("IDZona"),
            Zona = m.Field(Of String)("Zona")
            Into ValorCosto = Sum(m.Field(Of Decimal)("ValorCosto")),
            ValorProd = Sum(m.Field(Of Decimal)("ValorProd")),
            DMax = Max(m.Field(Of Decimal)("Porcentaje")),
            DMin = Min(m.Field(Of Decimal)("Porcentaje")),
            DAvg = Average(m.Field(Of Decimal)("Porcentaje")),
            UMax = Max(m.Field(Of Decimal)("Afectada")),
            UMin = Min(m.Field(Of Decimal)("Afectada")),
            UAvg = Average(m.Field(Of Decimal)("Afectada")),
            Costos = Sum(m.Field(Of Decimal)("Costos"))
            Select New With {IDZona, Zona, ValorCosto, ValorProd, DMax, DMin, DAvg, UMax, UMin, UAvg, Costos}
Entrada en LINQ, LINQ to dataset, vb.net, Visual Basic, Visual Studio 2010 | Comentar

IE9 modo compatibilidad, problema con el control asp:Menu

Cuando se utiliza un control asp:Menu y se visualiza la página en IE9 en modo de compatibilidad IE8 o IE7, los elementos del menu aparecen debajo de ReportViewer, la utilización de z-index no lo soluciona, la mejor forma encontrada es utilizar:

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
     Page.ClientTarget = "uplevel"
End Sub

en la página Default.aspx

Entrada en ASP.NET, vb.net, Visual Basic, Visual Studio 2010 | 5 Comments

linq-to-sql llamando una función (UDF) retorna string

Para efectuar una llamada a una función (UDF) de SQL Server que retorne valores escalares se utiliza la siguiente sintaxis:

Using DCSeguros As New DCSegurosDataContext
      Dim qUbic = DCSeguros.JerarquiaArea(IDUbicacion)
End Using

donde JerarquiaArea es la función y IDUbicacion es el parámetro de la función

Entrada en LINQ, LINQ to SQL, vb.net, Visual Basic | 11 Comments

Ejecutar una función de servidor desde javascript (cliente)

En un boton en el evento OnClientClick colocar “fCalc();”, al efectuar click se ejecutará la función fCalc detallada a continuación:

<script type="text/jscript">
        function fCalc() {
            var PH = document.getElementById("Datos");
            var chk = PH.getElementsByTagName('input');
            var len = chk.length;
            var valores = "";
            for (var i = 0; i < len; i++) {
                if (chk[i].type === 'text') {
                    valores += String(chk[i].id).substring(0,1) + ":" + chk[i].value + ":" + chk[i].alt + "|";
                }
            }
            PageMethods.Calcular(valores, OnSucceeded, OnFailed); //llamada a la función de servidor
        }
        function OnSucceeded(msg) {
            var PH = document.getElementById("Datos");
            var chk = PH.getElementsByTagName('input');

            var Linea = String(msg).split("|");
            for (var i = 0; i < Linea.length - 1; i++) {
                var Variable = String(Linea[i]).split(":");
                for (var j = 0; j < chk.length; j++) {
                    if (chk[j].type === 'text' &amp;amp;amp;amp;&amp;amp;amp;amp; String(chk[j].id).substring(0, 1) == Variable[0]) {
                        chk[j].value = parseFloat(Variable[1]).toFixed(2);
                    }
                }
            }
        }
        function OnFailed(error) {
            alert(error);
        }
</script>

en el lado del servidor (*.aspx.vb) crear la función siguiente que reciba la solicitud:

   <WebMethod()> _
    Public Shared Function Calcular(ByVal Valores As String) As String
        Dim VarLines() = Valores.Split("|")
        'codigo de procesamiento .......
        Return wValRet
    End Function

requiere habilitar los PageMethods:

<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"
        EnableScriptGlobalization="True" EnablePageMethods="True">
</asp:ToolkitScriptManager>
Entrada en ASP.NET, javascript, vb.net, Visual Basic | 9 Comments

Deshabilitar button onClientClick

Para cambiar el texto e inhabilitar un botón en el lado del cliente se puede utilizar el evento OnClientClick como sigue:

<asp:Button ID="BGrabar" runat="server"
           Text="Grabar"
           Font-Size="0.9em"
           OnClientClick="this.value='Grabando...';this.disabled=true;"
           UseSubmitBehavior="False" />
Entrada en ASP.NET, javascript | 10 Comments

ASP.NET GridView ReadOnly TextBox

No se puede utilizar, en forma directa, un GridView con una columna con TextBox con el atributo ReadOnly, para ello es necesario establecer este atributo en el evento RowDataBound del GridView, como sigue:

Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
   Dim TxtBx As TextBox = e.Row.FindControl("TextBox1")
   If TxtBx IsNot Nothing Then
      TxtBx.Attributes.Add("readonly", "readonly")
   End If
End Sub
Entrada en ASP.NET, vb.net, Visual Basic, Visual Studio 2008 | 16 Comments

LINQ función Include

En una consulta para incluir objetos relacionados se utiliza la función Include en caso de que se necesite utilizar un objeto relacionado al que se especifica en la función Include se puede utilizar la sintaxis del siguiente ejemplo:

    Dim wAlm = (From Inv In _db.Inventario.Include("Almacen.Sucursal") _
        Where Inv.NumInventario = (From Tran In _db.InventarioTransferencia _
        Where Tran.NumInventarioS = 1 _
        Select Tran.NumInventarioI).FirstOrDefault _
        Select Inv).FirstOrDefault

    If wAlm IsNot Nothing Then
        wNewFila("Obs") = wAlm.Almacen.Sucursal.DescSucursal & "/" & wAlm.Almacen.DescAlmacen
    End If

En caso de no utilizarse, en la función Include, “Almacen.Sucursal” y solo utilizar “Almacen” el objeto Sucursal no es visible a travéz de Almacen.

Entrada en LINQ, LINQ to Entities, Sin categoría, vb.net, Visual Basic, Visual Studio 2008 | 18 Comments

GridView busqueda y selección (row focus)

Para efectuar una busqueda y seleccionar una fila dentro de un GridView an ASP.NET, podemos utilizar el método SetFocus(objeto), para ello se adicionó a la página un control TextBox(TBBuscar) y un ImageButton(BBuscar) en el evento Click del botón se utiliza el siguiente fragmento de código:

 For Each wGVFila As GridViewRow In GridEmpleado.Rows
    If TBBuscar.Text.ToUpper = Mid(CType(wGVFila.FindControl("_Nombre"), Label).Text, 1, TBBuscar.Text.Length) Then
        SetFocus(wGVFila)
        Exit For
    End If
Next
UpdatePanel1.Update()

Este método funciona en páginas con AJAX (utilizando UpdatePanel, sincrona y asincrona) y páginas que efectuan PostBack.
 

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

Archivo Dataset.Designer.vb(cs) desvinculado

En ocasiones, al migrar o copiar proyectos en ASP.NET, no quedan enlazados los archivos “Dataset.Designer.vb(cs)“, no encontré el origen del problema pero una solución eficaz es borrar el archivo desvinculado “Dataset.Designer.vb(cs)” y colocar “MSDataSetGenerator” en la propiedad “Herramienta personalizada” del archivo “Dataset.xsd“, inmediatamente se generará el archivo borrado pero esta vez vinculado al Dataset (en este contexto Dataset es el nombre del conjunto de datos por ejemplo DSEmpleado)

Entrada en ASP.NET, Visual Studio 2008 | 18 Comments

LINQ error SqlClient Data Provider, “La conversión del tipo de datos char a datetime produjo un valor datetime fuera de intervalo”

Dentro de una consulta con datos tipo DateTime, se presentó el error “La conversión del tipo de datos char a datetime produjo un valor datetime fuera de intervalo“, “Source:.Net SqlClient Data Provider“; originalmente el código en VB .NET era:


Dim query = From pp In _db.ProductoPrecio Where pp.CodAlmacen = 4 _
And pp.Fecha = (From f In _db.ProductoPrecio _
Where f.Producto.CodProducto = pp.CodProducto _
And f.Almacen.CodAlmacen = 4 Select f.Fecha).Max
Select pp

Dim query1 = From prod In _db.Producto _
order by prod.CodProducto _
Select New With {.CodProducto = prod.CodProducto, _
.CodInterno = prod.CodInterno, _
.NomProducto = prod.NomProducto, _
.Fecha = (From prec In query.Where(function(s) s.CodProducto = prod.CodProducto) Select prec.Fecha).firstordefault, _
.PrecioVenta = (From prec In query Where prec.CodProducto = prod.CodProducto Select prec.PrecioVenta).FirstOrDefault}

la expresión causante del problema es “Select prec.Fecha“, para solucionarlo se la cambio por “CType(pp.Fecha, DateTime?)” quedando el código como sigue:


Dim query = From pp In _db.ProductoPrecio Where pp.CodAlmacen = 4 _
And pp.Fecha = (From f In _db.ProductoPrecio _
Where f.Producto.CodProducto = pp.CodProducto _
And f.Almacen.CodAlmacen = 4 Select f.Fecha).Max
Select pp

Dim query1 = From prod In _db.Producto _
order by prod.CodProducto _
Select New With {.CodProducto = prod.CodProducto, _
.CodInterno = prod.CodInterno, _
.NomProducto = prod.NomProducto, _
.Fecha = (From prec In query.Where(function(s) s.CodProducto = prod.CodProducto) CType(pp.Fecha, DateTime?)).firstordefault, _
.PrecioVenta = (From prec In query Where prec.CodProducto = prod.CodProducto Select prec.PrecioVenta).FirstOrDefault}
Entrada en LINQ, LINQ to Entities, vb.net, Visual Basic, Visual Studio 2008 | 62 Comments