none
Posibilidad de crear unas columnas calculadas a través de una función RRS feed

  • Pregunta

  • Hola a todos:

    Precisaría saber si es posible rellenar 3 columnas de una tabla a través de los resultados de una función, es decir, pretendo ahorrarme hacer un update de registro por registro, con ello tengo que crear un procedimiento por cada registro y es una labor lenta.

    las tres funciones calculan lops siguiente: La primera función calcula la medía de un valor

    la segund el porcentaje de dicho valor sobre un total

    la tercera calcula la desviación que ha tenido esa media respecto al valor del primer ejercicio ("Ejer_01). Los tres campos se llaman respectivamente: MediaAnual, PorcMedAnual y PorcDesvMedEjer0.

    Las 3 funciones que he creado son loas siguientes:

    Para el cálculo de la medias he utilizado las siguientes funciones:

     Public Shared Function CalculoMediasAnuales(ValorMedia() As Double, Media As Double) As Double
            Dim valor As Integer = AccesoLogica.ObtenerPeriodos()
    
            Dim Wconvalor As Double
            Dim WSuma As Double
    
    
            WSuma = ValorMedia(0) + ValorMedia(1) + ValorMedia(2) + ValorMedia(3) + ValorMedia(4) + ValorMedia(5) _
                  + ValorMedia(6) + ValorMedia(7) + ValorMedia(8) + ValorMedia(9) + ValorMedia(10) + ValorMedia(11)
    
            For i = 0 To valor
                If ValorMedia(i) <> 0 Then
                    Wconvalor = Wconvalor + 1
                End If
            Next i
    
            'Calculamos la media de los ejercicios
            If Wconvalor <> 0 Then
                Media = WSuma / Wconvalor
            End If
    
            Return Media
    
        End Function
    
        Public Shared Function CalculoMediasPorcAnuales(MediValorVariable As Double, MediaValorBase As Double) As Double
            Dim ValorMediaPorc As Double
    
            'Calculamos la media de los ejercicios
            If MediaValorBase <> 0 Then
                ValorMediaPorc = MediValorVariable / MediaValorBase
            End If
    
            Return ValorMediaPorc
    
        End Function
    
    
        Public Shared Function CalculoMediasPorcDesviacAnuales(Media As Double, ValorEjer0 As Double) As Double
            Dim DesvPorcejerc0 As Double
    
            'Calculamos la media de los ejercicios
            If ValorEjer0 <> 0 Then
                DesvPorcejerc0 = (Media - ValorEjer0) / ValorEjer0
            End If
    
            Return DesvPorcejerc0
    
        End Function

    Bueno, al final es saber si hay alguna posibilidad de que mediante una instrucción sql pudiera hacer lo mismo pero de forma automática, con lo que podría ahorrar mucho código. La base de datos es Access aunque después lo aplique a Compact y Sql ya que se trabaja con factoría de proveedores.

    Muchas gracias a todos como siempre.

    Gemma

    domingo, 14 de agosto de 2016 6:38

Respuestas

  • "gemma_campillo" preguntó:

    > Precisaría saber si es posible rellenar 3 columnas de una tabla a través de los
    > resultados de una función, es decir, pretendo ahorrarme hacer un update de registro
    > por registro, con ello tengo que crear un procedimiento por cada registro y es una
    > labor lenta.
    >
    > Los tres campos se llaman respectivamente: MediaAnual, PorcMedAnual y PorcDesvMedEjer0.

    Vamos a ver si yo me he enterado de lo que deseas hacer.

    ¿Te refieres a que deseas ejecutar una consulta UPDATE para actualizar el valor de 3 campos de TODOS LOS REGISTROS que existan en la tabla con los valores devueltos por las 3 funciones?

    Si es así, entiendo que sí se puede:

        ' Configuramos el comando
        Dim cmd As New OleDbCommand()
        cmd.CommandText = "UPDATE NombreTabla SET = MediaAnual=@p1, PorcMedAnual=@p2, PorcDesvMedEjer0=@p3"
    
        ' Añadimos los parámetros con los valores devueltos por cada función
        cmd.Parameters.AddWithValue("@p1", CalculoMediasAnuales(param1, param2))
        cmd.Parameters.AddWithValue("@p2", CalculoMediasPorcAnuales(param1, param2))
        cmd.Parameters.AddWithValue("@p3", CalculoMediasPorcDesviacAnuales(param1, param2))
    
        ' Ejecutar el comando
        Dim n As Integer = cmd.ExecuteNonQuery()

    MessageBox.Show("Nº de registros actualizados: " & n.ToString())

    Ni que decir tiene que a ese comando le tienes que asignar un objeto Connection válido y abrir la conexión para ejecutarlo.

    Al no especificarle una cláusula WHERE a la consulta SQL de acción, se actualizarán los valores de los 3 campos especificados de TODOS LOS REGISTROS DE LA TABLA.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    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, 14 de agosto de 2016 7:57
    Moderador

Todas las respuestas

  • "gemma_campillo" preguntó:

    > Precisaría saber si es posible rellenar 3 columnas de una tabla a través de los
    > resultados de una función, es decir, pretendo ahorrarme hacer un update de registro
    > por registro, con ello tengo que crear un procedimiento por cada registro y es una
    > labor lenta.
    >
    > Los tres campos se llaman respectivamente: MediaAnual, PorcMedAnual y PorcDesvMedEjer0.

    Vamos a ver si yo me he enterado de lo que deseas hacer.

    ¿Te refieres a que deseas ejecutar una consulta UPDATE para actualizar el valor de 3 campos de TODOS LOS REGISTROS que existan en la tabla con los valores devueltos por las 3 funciones?

    Si es así, entiendo que sí se puede:

        ' Configuramos el comando
        Dim cmd As New OleDbCommand()
        cmd.CommandText = "UPDATE NombreTabla SET = MediaAnual=@p1, PorcMedAnual=@p2, PorcDesvMedEjer0=@p3"
    
        ' Añadimos los parámetros con los valores devueltos por cada función
        cmd.Parameters.AddWithValue("@p1", CalculoMediasAnuales(param1, param2))
        cmd.Parameters.AddWithValue("@p2", CalculoMediasPorcAnuales(param1, param2))
        cmd.Parameters.AddWithValue("@p3", CalculoMediasPorcDesviacAnuales(param1, param2))
    
        ' Ejecutar el comando
        Dim n As Integer = cmd.ExecuteNonQuery()

    MessageBox.Show("Nº de registros actualizados: " & n.ToString())

    Ni que decir tiene que a ese comando le tienes que asignar un objeto Connection válido y abrir la conexión para ejecutarlo.

    Al no especificarle una cláusula WHERE a la consulta SQL de acción, se actualizarán los valores de los 3 campos especificados de TODOS LOS REGISTROS DE LA TABLA.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    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, 14 de agosto de 2016 7:57
    Moderador
  • Hola maestro:

    Efectivamente esa es la idea, voy a probarlo pero ya me han enseñado el camino como siempre.

    Enrique, muchas gracias otra vez.

    Me pongo con ello.

    Un fuerte abrazo querido amigo.

    Gemma

    domingo, 14 de agosto de 2016 8:12