none
Contar columnas y buscar fecha maxima RRS feed

  • Pregunta

  • Necesito un metodo o una function que busque en la table y me cuente ciertas columnas y me busque la fecha maxima

    Estructura de la table

         Lunes              Martes             Miercoles           Jueves          Viernes         Ausencias     Ultimo_Dia

    02/11/2015       03/11/2015      04/11/2015     05/11/2015    06/11/2015

    02/11/2015          Null             04/11/2015           Null                Null

    Null                   03/11/2015      04/11/2015     05/11/2015     Null

    la primera fila no tuvo ausencias, la segunda fila tuvo 3 ausencias y la tercera fila tuvo 2 ausencias, las ausencias son los campos null

    La Primera fila su ultimo dia de clase fue el dia 06/11/2015, la segunda fila su ultimo dia de clase fue 04/11/2015 y la tercera fila de clases su ultimo dia fue 05/11/2015 y esos valores son los que quiero que se pongan en la table en las columnas Ausencias y Ultimo dia, va a haber un filtro por numero de estudiante aunque el numero de estudiante no aparezca en el ejemplo...gracias

    viernes, 20 de noviembre de 2015 18:37

Respuestas

  • "Efrain Diaz" preguntó:

    > tengo una matriz que acumula en su interior varios fechas, necesito
    > capturer el valor mayor de esas fechas

    Lo puedes hacer fácilmente ejecutando la siguiente consulta LINQ:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Matriz de valores DateTime.
            '
            Dim valores As DateTime() =
                {New DateTime(1969, 1, 25), New DateTime(1955, 3, 4), New DateTime(2015, 11, 22),
                 New DateTime(2015, 11, 1), New DateTime(2015, 11, 21), New DateTime(2015, 11, 12)}
    
            ' Ejecutamos una consulta LINQ para ordenar los valores de mayor a menor
            ' quedándonos con el primer elemento, que se supone es el mayor.
            '
            Dim fechaMayor As DateTime = (From item As DateTime In valores
                                          Order By item Descending
                                          Select item).ToList(0)
    
            MessageBox.Show(fechaMayor.ToShortDateString())  ' --> 22/11/2015
    
        End Sub
    

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    domingo, 22 de noviembre de 2015 7:37
    Moderador
  • "Efrain Diaz" preguntó:

    > Necesito un metodo o una function que busque en la table y me cuente ciertas
    > columnas y me busque la fecha maxima
    >
    > Estructura de la table
    >
    >  Lunes              Martes             Miercoles           Jueves          Viernes         Ausencias     Ultimo_Dia

    A mi manera de ver ésta cuestión, la estructura de esa tabla no es correcta, porque los valores de todos esos campos se pueden obtener a través de la fecha en la que el alumno asistió a clase. Por ejemplo, imagina que tienes una tabla llamada FechasAsistenciaClase con la siguiente estructura:

    Como podrás observar, en ella necesariamente hay que especificar el código de la clase, el número de estudiante y la fecha en la que éste asistió a clase. En principio no se necesitan más campos.

    Ahora, vamos a implementar una función que nos devuelva un objeto DataTable con los alumnos que asistieron a una clase particular durante una determinada semana:

        Private Function CreateDataTable() As DataTable
    
            Dim dtTemp As DataTable = Nothing
    
            Using cmd As New SqlCommand()
                ' Obtenemos el número de alumnos que asistieron a una determinada
                ' clase durante el intervalo de fechas indicado.
                '
                cmd.CommandText =
                    "SELECT DISTINCT Num_Estudiante FROM FechasAsistenciaClase " &
                    "WHERE (Codigo_Clase=@codigoClase) AND (Fecha_Asistencia BETWEEN @fechaInicio AND @fechaFinal)"
    
                cmd.Parameters.AddWithValue("@codigoClase", txtCodigoClase.Text)
                cmd.Parameters.AddWithValue("@fechaInicio", dtDesde.Value.Date)
                cmd.Parameters.AddWithValue("@fechaFinal", dtHasta.Value.Date)
                dtTemp = GetData(cmd)
            End Using
    
            ' Obtenemos una matriz con los identificadores de los estudiantes recuperados.
            '
            Dim estudiantes As Integer() = (From item As DataRow In dtTemp.Rows.OfType(Of DataRow)
                                            Select Convert.ToInt32(item(0))).ToArray()
    
            ' Creamos un nuevo objeto DataTable.
            Dim dt As New DataTable()
    
            ' Añadimos las columnas.
            Dim dc As New DataColumn("CodigoClase", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("NumeroAlumno", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Lunes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Martes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Miercoles", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Jueves", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Viernes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Ausencias", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Ultimo_Dia", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            ' Conforme recorremos el objeto DataTable temporal, vamos añadiendo
            ' las nuevas filas al nuevo objeto DataTable.
            '
            For Each estudiante As Integer In estudiantes
    
                Using cmd As New SqlCommand()
                    ' Obtenemos los registros correspondientes a las fechas de asistencia que
                    ' ha tenido un alumno en una determinada clase e intervalo de fechas no
                    ' superior a una semana, ordenados ascendentemente por el valor del campo
                    ' Fecha_Asistencia.
                    '
                    cmd.CommandText =
                    "SELECT Fecha_Asistencia FROM FechasAsistenciaClase " &
                    "WHERE (Codigo_Clase=@codigoClase) AND (Num_Estudiante = @numEstudiante) AND (Fecha_Asistencia BETWEEN @fechaInicio AND @fechaFinal)" &
                    "ORDER BY Fecha_Asistencia"
    
                    cmd.Parameters.AddWithValue("@codigoClase", txtCodigoClase.Text)
                    cmd.Parameters.AddWithValue("@numEstudiante", estudiante)
                    cmd.Parameters.AddWithValue("@fechaInicio", dtDesde.Value.Date)
                    cmd.Parameters.AddWithValue("@fechaFinal", dtHasta.Value.Date)
    
                    dtTemp = GetData(cmd)
    
                End Using
    
                Dim newRow As DataRow = dt.NewRow()
    
                newRow.Item("CodigoClase") = txtCodigoClase.Text
                newRow.Item("NumeroAlumno") = estudiante
    
                ' El número de ausencias se calculará restando a 5 días de la semana
                ' (de lunes a viernes) el número de registros recuperados.
                '
                newRow.Item("Ausencias") = 5 - dtTemp.Rows.Count
    
                Dim fechaAsistencia As DateTime
    
                For Each row As DataRow In dtTemp.Rows
                    fechaAsistencia = Convert.ToDateTime(row("Fecha_Asistencia"))
                    Dim dayOfWeek As DayOfWeek = fechaAsistencia.DayOfWeek
                    Select Case dayOfWeek
                        Case DayOfWeek.Monday
                            newRow.Item("Lunes") = fechaAsistencia
                        Case DayOfWeek.Tuesday
                            newRow.Item("Martes") = fechaAsistencia
                        Case DayOfWeek.Wednesday
                            newRow.Item("Miercoles") = fechaAsistencia
                        Case DayOfWeek.Thursday
                            newRow.Item("Jueves") = fechaAsistencia
                        Case DayOfWeek.Friday
                            newRow.Item("Viernes") = fechaAsistencia
                    End Select
    
                Next
    
                ' Como la consulta SQL de selección está ordenada ascendetemente
                ' por el campo Fecha_Asistencia, el valor del último día de 
                ' asistencia será el del último registro recuperado, ya que la
                ' consulta SQL no devuelve aquellos registros donde el valor del
                ' campo sea NULL.
                '
                newRow.Item("Ultimo_Dia") = fechaAsistencia
    
                ' Añadimos la fila al nuevo objeto DatTable.
                '
                dt.Rows.Add(newRow)
    
            Next ' Siguiente registro.
    
            ' Devolvemos el objeto DataTable.
            '
            Return dt
    
        End Function
    
        Friend Shared Function GetData(cmd As SqlCommand) As DataTable
    
            If (cmd Is Nothing) Then
                Throw New ArgumentException()
            End If
    
            Dim dt As New DataTable()
    
            Using cnn As New SqlConnection(Escribe aquí la cadena de conexión)
                cmd.Connection = cnn
                Dim da As New SqlDataAdapter(cmd)
                da.Fill(dt)
            End Using
    
            Return dt
    
        End Function

    Insisto en que el valor del intervalo de fechas NO PUEDE SER SUPERIOR A UNA SEMANA, porque de serlo, habría entonces DOS LUNES, o DOS VIERNES, por lo que en éste caso necesitarías crear más columnas al objeto DataTable que se va a mostrar en el control DataGridView. ¿Me explico?

    Cuando en el control TextBox correspondiente al código de la clase hayas escrito el número de clase cuyos alumnos deseas recuperar, tan solo tienes que llamar a la función CreateDataTable para rellenar el control DataGridView:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Try
                DataGridView1.DataSource = CreateDataTable()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Según los datos que has indicado en tu mensaje, el resultado sería el siguiente:


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 22 de noviembre de 2015 11:03
    Moderador
  • Hola

    Podria ser 

       Private Function Fechamayor() As Date
            Dim fechatestigo As Date = CDate("1/1/1900") 'SUPONIENDO QUE NO HAY ANTERIOR
            For n As Integer = 1 To TOPEDEMATRIZ
                If mifecha(n) > fechatestigo Then fechatestigo = mifecha(n)
            Next
            Return fechatestigo
        End Function



    Pedro López



    domingo, 22 de noviembre de 2015 2:41

Todas las respuestas

  • tengo una matriz que acumula en su interior varios fechas, necesito capturer el valor mayor de esas fechas
    sábado, 21 de noviembre de 2015 23:33
  • Hola

    Podria ser 

       Private Function Fechamayor() As Date
            Dim fechatestigo As Date = CDate("1/1/1900") 'SUPONIENDO QUE NO HAY ANTERIOR
            For n As Integer = 1 To TOPEDEMATRIZ
                If mifecha(n) > fechatestigo Then fechatestigo = mifecha(n)
            Next
            Return fechatestigo
        End Function



    Pedro López



    domingo, 22 de noviembre de 2015 2:41
  • "Efrain Diaz" preguntó:

    > tengo una matriz que acumula en su interior varios fechas, necesito
    > capturer el valor mayor de esas fechas

    Lo puedes hacer fácilmente ejecutando la siguiente consulta LINQ:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Matriz de valores DateTime.
            '
            Dim valores As DateTime() =
                {New DateTime(1969, 1, 25), New DateTime(1955, 3, 4), New DateTime(2015, 11, 22),
                 New DateTime(2015, 11, 1), New DateTime(2015, 11, 21), New DateTime(2015, 11, 12)}
    
            ' Ejecutamos una consulta LINQ para ordenar los valores de mayor a menor
            ' quedándonos con el primer elemento, que se supone es el mayor.
            '
            Dim fechaMayor As DateTime = (From item As DateTime In valores
                                          Order By item Descending
                                          Select item).ToList(0)
    
            MessageBox.Show(fechaMayor.ToShortDateString())  ' --> 22/11/2015
    
        End Sub
    

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    domingo, 22 de noviembre de 2015 7:37
    Moderador
  • "Efrain Diaz" preguntó:

    > Necesito un metodo o una function que busque en la table y me cuente ciertas
    > columnas y me busque la fecha maxima
    >
    > Estructura de la table
    >
    >  Lunes              Martes             Miercoles           Jueves          Viernes         Ausencias     Ultimo_Dia

    A mi manera de ver ésta cuestión, la estructura de esa tabla no es correcta, porque los valores de todos esos campos se pueden obtener a través de la fecha en la que el alumno asistió a clase. Por ejemplo, imagina que tienes una tabla llamada FechasAsistenciaClase con la siguiente estructura:

    Como podrás observar, en ella necesariamente hay que especificar el código de la clase, el número de estudiante y la fecha en la que éste asistió a clase. En principio no se necesitan más campos.

    Ahora, vamos a implementar una función que nos devuelva un objeto DataTable con los alumnos que asistieron a una clase particular durante una determinada semana:

        Private Function CreateDataTable() As DataTable
    
            Dim dtTemp As DataTable = Nothing
    
            Using cmd As New SqlCommand()
                ' Obtenemos el número de alumnos que asistieron a una determinada
                ' clase durante el intervalo de fechas indicado.
                '
                cmd.CommandText =
                    "SELECT DISTINCT Num_Estudiante FROM FechasAsistenciaClase " &
                    "WHERE (Codigo_Clase=@codigoClase) AND (Fecha_Asistencia BETWEEN @fechaInicio AND @fechaFinal)"
    
                cmd.Parameters.AddWithValue("@codigoClase", txtCodigoClase.Text)
                cmd.Parameters.AddWithValue("@fechaInicio", dtDesde.Value.Date)
                cmd.Parameters.AddWithValue("@fechaFinal", dtHasta.Value.Date)
                dtTemp = GetData(cmd)
            End Using
    
            ' Obtenemos una matriz con los identificadores de los estudiantes recuperados.
            '
            Dim estudiantes As Integer() = (From item As DataRow In dtTemp.Rows.OfType(Of DataRow)
                                            Select Convert.ToInt32(item(0))).ToArray()
    
            ' Creamos un nuevo objeto DataTable.
            Dim dt As New DataTable()
    
            ' Añadimos las columnas.
            Dim dc As New DataColumn("CodigoClase", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("NumeroAlumno", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Lunes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Martes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Miercoles", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Jueves", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Viernes", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Ausencias", Type.GetType("System.Int32"))
            dt.Columns.Add(dc)
    
            dc = New DataColumn("Ultimo_Dia", Type.GetType("System.DateTime"))
            dt.Columns.Add(dc)
    
            ' Conforme recorremos el objeto DataTable temporal, vamos añadiendo
            ' las nuevas filas al nuevo objeto DataTable.
            '
            For Each estudiante As Integer In estudiantes
    
                Using cmd As New SqlCommand()
                    ' Obtenemos los registros correspondientes a las fechas de asistencia que
                    ' ha tenido un alumno en una determinada clase e intervalo de fechas no
                    ' superior a una semana, ordenados ascendentemente por el valor del campo
                    ' Fecha_Asistencia.
                    '
                    cmd.CommandText =
                    "SELECT Fecha_Asistencia FROM FechasAsistenciaClase " &
                    "WHERE (Codigo_Clase=@codigoClase) AND (Num_Estudiante = @numEstudiante) AND (Fecha_Asistencia BETWEEN @fechaInicio AND @fechaFinal)" &
                    "ORDER BY Fecha_Asistencia"
    
                    cmd.Parameters.AddWithValue("@codigoClase", txtCodigoClase.Text)
                    cmd.Parameters.AddWithValue("@numEstudiante", estudiante)
                    cmd.Parameters.AddWithValue("@fechaInicio", dtDesde.Value.Date)
                    cmd.Parameters.AddWithValue("@fechaFinal", dtHasta.Value.Date)
    
                    dtTemp = GetData(cmd)
    
                End Using
    
                Dim newRow As DataRow = dt.NewRow()
    
                newRow.Item("CodigoClase") = txtCodigoClase.Text
                newRow.Item("NumeroAlumno") = estudiante
    
                ' El número de ausencias se calculará restando a 5 días de la semana
                ' (de lunes a viernes) el número de registros recuperados.
                '
                newRow.Item("Ausencias") = 5 - dtTemp.Rows.Count
    
                Dim fechaAsistencia As DateTime
    
                For Each row As DataRow In dtTemp.Rows
                    fechaAsistencia = Convert.ToDateTime(row("Fecha_Asistencia"))
                    Dim dayOfWeek As DayOfWeek = fechaAsistencia.DayOfWeek
                    Select Case dayOfWeek
                        Case DayOfWeek.Monday
                            newRow.Item("Lunes") = fechaAsistencia
                        Case DayOfWeek.Tuesday
                            newRow.Item("Martes") = fechaAsistencia
                        Case DayOfWeek.Wednesday
                            newRow.Item("Miercoles") = fechaAsistencia
                        Case DayOfWeek.Thursday
                            newRow.Item("Jueves") = fechaAsistencia
                        Case DayOfWeek.Friday
                            newRow.Item("Viernes") = fechaAsistencia
                    End Select
    
                Next
    
                ' Como la consulta SQL de selección está ordenada ascendetemente
                ' por el campo Fecha_Asistencia, el valor del último día de 
                ' asistencia será el del último registro recuperado, ya que la
                ' consulta SQL no devuelve aquellos registros donde el valor del
                ' campo sea NULL.
                '
                newRow.Item("Ultimo_Dia") = fechaAsistencia
    
                ' Añadimos la fila al nuevo objeto DatTable.
                '
                dt.Rows.Add(newRow)
    
            Next ' Siguiente registro.
    
            ' Devolvemos el objeto DataTable.
            '
            Return dt
    
        End Function
    
        Friend Shared Function GetData(cmd As SqlCommand) As DataTable
    
            If (cmd Is Nothing) Then
                Throw New ArgumentException()
            End If
    
            Dim dt As New DataTable()
    
            Using cnn As New SqlConnection(Escribe aquí la cadena de conexión)
                cmd.Connection = cnn
                Dim da As New SqlDataAdapter(cmd)
                da.Fill(dt)
            End Using
    
            Return dt
    
        End Function

    Insisto en que el valor del intervalo de fechas NO PUEDE SER SUPERIOR A UNA SEMANA, porque de serlo, habría entonces DOS LUNES, o DOS VIERNES, por lo que en éste caso necesitarías crear más columnas al objeto DataTable que se va a mostrar en el control DataGridView. ¿Me explico?

    Cuando en el control TextBox correspondiente al código de la clase hayas escrito el número de clase cuyos alumnos deseas recuperar, tan solo tienes que llamar a la función CreateDataTable para rellenar el control DataGridView:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Try
                DataGridView1.DataSource = CreateDataTable()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Según los datos que has indicado en tu mensaje, el resultado sería el siguiente:


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 22 de noviembre de 2015 11:03
    Moderador