none
Calcular Total para un valor dado, en Columnas de un Datagrid RRS feed

  • Pregunta

  •  

    Muy buenos dias, me uno a la comunidad pidiendo Auxilio para un problema.

    Les explico, tengo un datagrid que tendra como funcion cargar, la rota horario de un personal, ya cargo los empleados y los valores (de tenerlos) del turno especifico. Pero mi problema surge, al tratar de contabilizar en el mismo datagrid (al final del mismo) cuantas personas van a trabajar en un turno dado. Intengo agregar el codigo al evento: CurrentCellChanged y me da un error el siguiente:

    Excepción no controlada del tipo 'System.StackOverflowException' en System.Data.dll

     

    El código que tengo es el siguiente:

     

    Public Sub ContarPersonalTurno()

    Try

    Dim cel As DataGridCell 'Celda Especifica

    Dim columnaE As Integer 'Columna de la celda Especifica

    Dim cadena1 As String 'Cadena 1 para evaluar el count

    Dim cadena2 As String ' cadena 2 para evaluar un valor dado del count para la fila

    Dim table As DataTable 'Tabla del Dataset

    Dim totalfilasturnos As Integer 'Cantidad de Turnos

    Dim totalfilas As Integer 'cantidad de Filas

    Dim pi As Integer 'saber cual es la posicion del primer Turno en el datagrid

    Dim pf As Integer 'Saber cual es la ultima posicion del ultimo turno en el datagrid

    Dim c As Integer 'contador para incrementar la posicion

    Dim a As Integer ' Posicion del dato en el datagrid siempre sera 0 ya que es la fila donde cargo el Turno

    cel = DGRota.CurrentCell 'Celda en la que me encuentro

    columnaE = DGRota.CurrentCell.ColumnNumber 'Columna a la que pertenece la celda

    table =Rota.Tables("TblRotaEmpleado")

     totalfilasturnos = TurnosDep.Length

     totalfilas = (DGRota.VisibleRowCount - totalfilasturnos) - 3

    pi = totalfilas + 2

    pf = (pi + totalfilasturnos) - 1 

    Dim valor As String

    Do While pi <= pf

    If columnaE <> 0 Then

    valor =CStr(DGRota.Item(pi, a))

    cadena1 = "Count(" & "D" & columnaE & ")"

    cadena2 = "D" & columnaE & "=" & "'" & (valor) & "'" 

    Select Case Trim(valor)

                            Case "A"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                            Case "B"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                            Case "C"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                            Case "D"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                            Case "E"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                            Case "F"

                                DGRota.Item(pi, columnaE) = CStr(table.Compute(cadena1, cadena2))

     

                        End Select

                        pi = pi + 1

                    End If

        Loop

            Catch MiError As SqlException

                MsgBox(MiError.Message, MsgBoxStyle.Critical, "Error")

            End Try

        End Sub 

    Ese código lo invoco en el evento de cambio de celda:

    Private Sub DGRota_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGRota.CurrentCellChanged

      If f = True Then

    ContarPersonalTurno()

    End Sub

     Pero me da error el que les comente al inicio.

    Yo cargo los turnos que posee un determinado departamento en un arreglo, despues agrego tantas filas como turnos al final del datagrid y debo sumar para cada dia el total de personas para un turno dado (a,b c, etc).

     

      Try

                Dim cadena1 As String

                Dim cadena2 As String

                Dim table As DataTable

                Dim totalfilasturnos As Integer 'Cantidad de Turnos

                Dim totalfilas As Integer 'cantidad de Filas

                Dim pi As Integer

                Dim pf As Integer

                Dim c As Integer

                Dim a As Integer

                Dim p As Integer

                table = Rota.Tables("TblRotaEmpleado")

                totalfilasturnos = TurnosDep.Length 'Cantidad de Espacios (Turnos) que posee el Arreglo

                totalfilas = (DGRota.VisibleRowCount - totalfilasturnos) - 3 'Cantidad de Registros que Tiene el Datagrid que Conforman sus Filas

                pi = totalfilas + 2

                pf = (pi + totalfilasturnos) - 1

                a = 0

                For p = 1 To DiasdelMes

                    For c = pi To pf

                        cadena1 = "Count(" & "D" & p & ")"

                        cadena2 = "D" & p & "=" & "'" & CStr(DGRota.Item(c, a)) & "'"

                        DGRota.Item(c, p) = CStr(table.Compute(cadena1, cadena2))

                    Next

                Next

            Catch MiError As SqlException

                MsgBox(MiError.Message, MsgBoxStyle.Critical, "Error")

            End Try

            f = True

        End Sub

     

    Esto funciona perfecto me muestra los valores, pero no logro hacer que si por ejemplo en la columna 1 (primer dia del mes) hay dos personas que van a turno A, y una a turno C, y modifico una A por otra C, me actualice los valores en la celda del datagrid especifica para ese día...... Probe el código en un botón y funciona, pero lo necesito automático, por cada modificación que haga en una celda dada.

    Espero que me puedan ayudar y haber sido clara, sino me dicen y me explico mejor.

    estoy trabajando en visual estudio 2008 con sql server 2008 uso un datagrid porque parte del sistema esta en visual 2003 y si uso otro componente no podre verlo en la otra version.

    De antemano muchas gracias, estoy desesperada tengo que entregar el sistema y no logro que funcione. graccias

     

    • Editado Roxseni miércoles, 1 de septiembre de 2010 15:57
    • Cambiado Enrique M. Montejo sábado, 30 de junio de 2012 16:31 Controles de Windows Forms (De:Lenguaje VB.NET)
    miércoles, 1 de septiembre de 2010 15:32

Todas las respuestas

  • hola

    podrias editar el post y poner el codigo con algo ams de formato, de ser posible con identacion correcta, es preferible tener identacion a color, por ahi no uses el bloque de codigo que provee el foro

    [DataGridView] – Parte 5 - Cálculos Totales en filas y columnas

    analzia tambien este link, veras alli como ahcer el calculo cuando cambia el valor de una celda, por ahi te resulta util

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 1 de septiembre de 2010 15:39
  • hola

    podrias editar el post y poner el codigo con algo ams de formato, de ser posible con identacion correcta, es preferible tener identacion a color, por ahi no uses el bloque de codigo que provee el foro

    [DataGridView] – Parte 5 - Cálculos Totales en filas y columnas

    analzia tambien este link, veras alli como ahcer el calculo cuando cambia el valor de una celda, por ahi te resulta util

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    gracias leandro pero yo utilizo es un datagrid asociado a un datased no un datagridwiev por lo que no es igual
    miércoles, 1 de septiembre de 2010 15:41
  • hola,

    Al parecer esta utilizando La version 2003 ?

     

    enmanuel grullard

    republica dominicana

     

     

    miércoles, 1 de septiembre de 2010 19:07
  • hola,

    Al parecer esta utilizando La version 2003 ?

     

    enmanuel grullard

    republica dominicana

     

     

    no, uso visual studio 2008.. Pero hay modulod de un sistema que estan en 2003 y no se han migrado, por eso use el control datagrid y no el datawiev....

    y ya todo funciona en el datagrid menos eso de sumar el personal por turno

    jueves, 2 de septiembre de 2010 12:50