none
Ayuda con una consulta, obtener el registro más reciente de cada persona RRS feed

  • Pregunta

  • Hola ,

    Soy nuevo con linq y os pido ayuda porque  no sé cómo hacer lo siguiente:

    Tengo en sql una tabla con miles de registros que contiene:

    NumeroDePersonal

    FechaHora

    Tarea

    Y me gustaría saber cómo puede obtener la última tarea que ha iniciado cada persona y que a ser posible la estructura fuese similar para usar el mismo dataGridView que estoy usando para mostrar todos los registros. Sería algo así como

    'obtenemos los fichajes de cada persona
            Dim query = From f In contexto.Fichajes
                                  Group f By f.NumeroPersonal Into g = Group _
                                  Select NumeroPersonal, tarea, Fecha = g.Max(Function(f) f.Fecha)

    Pero debo de tener un error de concepto porque no funciona.

    Muchas gracias por vuestra ayuda.

    Saludos


    viernes, 1 de febrero de 2013 13:30

Todas las respuestas

  • podria ser

     Dim query = From f In contexto.Fichajes
                        Group f By f.NumeroPersonal Into g = Group _
                        Select With { _
                                 .NroPersona = g.NumeroPersonal, _
                                 .Fecha = g.OrderByDescending(Function(x) x.FechaHora).FirstOrDefault() _
                           }

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 1 de febrero de 2013 13:37
  • Gracias Leandro, 

    Tus repuestas me ayudan muchísimo, te estoy muy agradecido. Concretamente he puesto:

            Dim query = From f In contexto.OrdenesTrabajoFichajesV2
                       Group f By f.NumeroPersonal Into g = Group _
                       Select New With {.NumeroPersonal = NumeroPersonal, .Fecha = g.OrderByDescending(Function(x) x.Fecha).FirstOrDefault()}


            For Each grp In query
                Debug.Print(grp.NumeroPersonal, grp.Fecha)

            Next

    El "New" es de mi cosecha, porque entiendo que creas un tipo anónimo con los datos resultantes de la agurpación, pero entiendo que también se puede acceder al conjunto de datos iniciales ¿No es así?

    Y cuando lo depuro, sólo obtengo el numeroPersonal pero no la última fecha que sale en blanco. Además de la fecha, también está la horaInicio, HoraFinal del días más reciente y no consigo obtenerlos . ¿Podrías ayudarme?  Y para no hacer las cosas a ciegas. ¿Sabes algún webcast o lugar donde se explique la agrupación?.

    De nuevo gracias,

    Juan

    lunes, 4 de febrero de 2013 15:29
  • Gracias funciona:


            Dim query = From f In contexto.OrdenesTrabajoFichajesTRV2
                       Group By f.NumeroPersonal Into g = Group _
                       Select New With { _
                                .NroPersona = NumeroPersonal, _
                                .FechUlt = g.OrderByDescending(Function(x) x.Fecha).FirstOrDefault() _
                  }


            For Each NumeroPers In query
                Debug.Print(NumeroPers.NroPersona & " " & NumeroPers.FechUlt.Fecha)
            Next

    Otra pregunta, ¿Cómo podría obtener todos los campos de los registros que cumplen la condición de ser el fichaje más reciente? En realidad lo que busco es que el usuario que está viendo todos los registros en un datagridView pueda ver el más reciente de cada persona con lo cual debería de obtener en la agrupación la misma información que en el detalle para poder asignar la agrupación como dataSource de mi DataGridView 

    Gracias, un saludo

    martes, 5 de febrero de 2013 12:20
  • Me respondo a mi mismo por si le sirve a alguien:

    'Consulta que obtiene el más reciente fichaje de cada persona

            Dim query = From f In contexto.OrdenesTrabajoFichajesTRV2 _
                        Order By f.NumeroPersonal, f.Fecha Descending _
                        Group By f.NumeroPersonal Into g = Group _
                        Select New With { _
                                .NroPersona = NumeroPersonal, _
                                .FechUlt = g.OrderByDescending(Function(x) x.Fecha).FirstOrDefault() _
                  }
    'Creo una lista para guardar el más reciente de cada persona

            Dim ultimos = New List(Of OrdenesTrabajoFichajesTRV2)()

    'ejecuto la consulta y paso a la lista creada los datos de cada uno de los registros de fichajes más recientes

            For Each NumeroPers In query
                Dim ultimo = New OrdenesTrabajoFichajesTRV2
                ultimo.idFichajeOT = NumeroPers.FechUlt.idFichajeOT
                ultimo.NumeroPersonal = NumeroPers.FechUlt.NumeroPersonal
                ultimo.NombreApellidos = NumeroPers.FechUlt.NombreApellidos
                ultimo.Fecha = NumeroPers.FechUlt.Fecha
                ultimo.CodigoOrdenTrabajo = NumeroPers.FechUlt.CodigoOrdenTrabajo
                ultimo.Concepto = NumeroPers.FechUlt.Concepto
                ultimo.CodigoTarea = NumeroPers.FechUlt.CodigoTarea
                ultimo.DenominacionTarea = NumeroPers.FechUlt.DenominacionTarea
                ultimo.t = NumeroPers.FechUlt.t
                ultimos.Add(ultimo)
            Next

    'ordenado la lista creada

            Dim ultimosOrdenados = From f In ultimos
                                   Order By f.NumeroPersonal
                                   Select f

    'la paso como fuente de datos 

            OrdenesTrabajoFichajesTRV2BindingSource.DataSource = ultimosOrdenados.ToList

    Saludos.

    miércoles, 6 de febrero de 2013 8:12