none
Como sumar columna de access desde vb? RRS feed

  • Pregunta

  • hola gente del foro. estoy intentando obtener el resultado de una suma desde una columna de access, con vb 2010.

    El problema es que en la columna que deseo sumar tiene celdas en blanco. y he estado usado diferentes opciones y me da diferentes resultado nefastos. por ej:

    ' Dim da As New OleDbDataAdapter("SELECT sum(isnull(subtotal3,0)) as Total FROM transregistro", cnn)

    subtotal es la columna que necesito sumar.

    aqui el error me dice que hay demasiados argumentos

    ' Dim da As New OleDbDataAdapter(("SELECT sum(subtotal3)is null as Total FROM transregistro ....

    esta otra suma pro me da valor cero... espero alguien me pueda ayudar con este simple y pequeño asuntito. gracias

    lunes, 2 de marzo de 2015 15:18

Respuestas

  • Veo dos problemas potenciales con el tema de las fechas. Tendrás que verificar si te está sucediendo alguno de los dos:

    1) Estás pasando la fecha como dia/mes/año. Comprueba si tu base de datos espera recibir mes/dia/año.

    2) Estás pasando el mismo valor en la fecha dede y en la fecha hasta. Por tanto, solo debería encontrar los registros que tengan ese valor exactamente. Si las fechas que hay grabadas en la base de datos contienen horas, minutos y segundos, quedarán fuera de ese intervalo y no te encntrará ninguna.

    • Marcado como respuesta marcelo863 viernes, 6 de marzo de 2015 15:58
    jueves, 5 de marzo de 2015 18:44

Todas las respuestas

  • Debería funcionarte poniendo simplemente "SELECT SUM(subtotal3) as Total ...". El operador SUM, al igual que todos los demás operadores de agregación excepto el count(*), desprecia automáticamente los registros que tienen NULL, devolviendo la suma de todos los demás.
    lunes, 2 de marzo de 2015 15:35
  • Hola,

    SUM omite los valores nulos, no deberías tener problemas. ¿Qué problemas tienes al ejecutar la consulta?

    "SELECT sum(subtotal3) as Total FROM transregistro"

    lunes, 2 de marzo de 2015 15:35
  • hola alberto, gracias por responder. si esta bien asi como tu dices. solo que yo no copie la sentencia completa y pense que el error lo tiraba la suma de la columna, ahora descubro que es en las fechas el problem donde m dice que "la conversion del tipo dbnull en el tipo string no es valida" ahora t paso el codigo:

     Dim fecha_desde As String
                Dim fecha_hasta As String
                fecha_desde = Format(Now, "dd/MM/yyyy")
                fecha_hasta = Format(Now, "dd/MM/yyyy")

                Dim da As New OleDbDataAdapter("SELECT sum(subtotal3) as Total FROM transregistro WHERE  [titular] = 'Cons Final' AND [fecha] BETWEEN # " + fecha_desde + " # AND # " + fecha_hasta + "# ", cnn)
                Dim ds As New DataSet
                da.Fill(ds)

                T_ctdo.Text = ds.Tables(0).Rows(0)("Total")
                ds.Dispose()

    es aqui donde me da el error, yo intento sumar la columna "subtotal3" de la tabla transregistro, donde el titular sea "Cons Final" entre las fechas desde y hasta.

    miércoles, 4 de marzo de 2015 16:04
  • hola willams, gracias por responder. si esta bien asi como tu dices. solo que yo no copie la sentencia completa y pense que el error lo tiraba la suma de la columna, ahora descubro que es en las fechas el problem donde m dice que "la conversion del tipo dbnull en el tipo string no es valida" ahora t paso el codigo:

     Dim fecha_desde As String
                Dim fecha_hasta As String
                fecha_desde = Format(Now, "dd/MM/yyyy")
                fecha_hasta = Format(Now, "dd/MM/yyyy")

                Dim da As New OleDbDataAdapter("SELECT sum(subtotal3) as Total FROM transregistro WHERE  [titular] = 'Cons Final' AND [fecha] BETWEEN # " + fecha_desde + " # AND # " + fecha_hasta + "# ", cnn)
                Dim ds As New DataSet
                da.Fill(ds)

                T_ctdo.Text = ds.Tables(0).Rows(0)("Total")
                ds.Dispose()

    es aqui donde me da el error, yo intento sumar la columna "subtotal3" de la tabla transregistro, donde el titular sea "Cons Final" entre las fechas desde y hasta.

    miércoles, 4 de marzo de 2015 16:05
  • [...] "la conversion del tipo dbnull en el tipo string no es valida" [...]
                T_ctdo.Text = ds.Tables(0).Rows(0)("Total")

    El único caso en el que se debería producir este error es si ningún registro cumple el "where" de la consulta. En ese caso, el SUM(...) devuelve NULL. Los drivers de ado.net convierten el NULL de base de datos en DBNull.Value al traer los resultados. Y al asignar el DBNull.Value al .Text se produce el error que estás viendo.

    Puedes arreglarlo en el lado de la consulta poniendo "select NZ(sum(subtotal3),0) as Total, ..." o bien arreglarlo en el lado de VB comprobando si te ha llegado un DBNull:

    Dim o as Object = ds.Tables(0).Rows(0)("Total")

    if o is DBNull.Value then T_ctdo.Text="0" else T_ctdo.Text = o.ToString()

    • Marcado como respuesta marcelo863 jueves, 5 de marzo de 2015 12:50
    • Desmarcado como respuesta marcelo863 jueves, 5 de marzo de 2015 12:50
    miércoles, 4 de marzo de 2015 16:47
  • Sr Alberto: Si el error lo produce en el t_ctdo.text, probe lo primero que me sugirio, "select NZ(sum(sub... y me da error en eso, pero luego lo cambie por la segunda opcion sugerida, no me da mas error solo que la suma me da cero(0) en el textbox, y hay valores para sumar en esa columna y estan con esas condiciones...y necesito que me sume esa columna y me lo muestre en ese textbox, me explico.
    jueves, 5 de marzo de 2015 13:41
  • Una cosa mas... si yo a la instruccion:

     Dim da As New OleDbDataAdapter("SELECT sum(subtotal3) as Total FROM transregistro WHERE  [titular] = 'Cons Final' AND [fecha] BETWEEN # " + fecha_desde + " # AND # " + fecha_hasta + "# ", cnn)

    le quito desde el  AND [fecha] BETWEEN # " + fecha_desde + " # AND # " + fecha_hasta + "# "

    si me suma toda la columna, ahora apenas intento ponerle fechas, me da como resultado cero(0). tal vez debo tener un error con eso tambien.

    para dar mas datos la columna de access [fecha] esta como tipo texto, no como fecha y hora.Le agradeceria su respuesta.

    jueves, 5 de marzo de 2015 13:54
  • Veo dos problemas potenciales con el tema de las fechas. Tendrás que verificar si te está sucediendo alguno de los dos:

    1) Estás pasando la fecha como dia/mes/año. Comprueba si tu base de datos espera recibir mes/dia/año.

    2) Estás pasando el mismo valor en la fecha dede y en la fecha hasta. Por tanto, solo debería encontrar los registros que tengan ese valor exactamente. Si las fechas que hay grabadas en la base de datos contienen horas, minutos y segundos, quedarán fuera de ese intervalo y no te encntrará ninguna.

    • Marcado como respuesta marcelo863 viernes, 6 de marzo de 2015 15:58
    jueves, 5 de marzo de 2015 18:44