+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

calcoli in un form

  1. #1
    gnappi non è in linea Scolaretto
    Ho ancora un problema per il quale ho bisogno di chiedere il vostro aiuto, anche a rischio di sembrare (non inesperto,perchè lo sono) ... rimbambito.
    Comunque sia, mi spiego :
    ho un form semplicissimo ,che contiene una serie di textbox (provenienti da un db Access) che contengono semplici valori (1000,23456,500,ecc.).
    A fianco di ciascuna textbox ho un'altra textbox,che calcola solo una divisione della prima tb per un valore X(poniamo 1000/200).
    Queste divisione vengono effettuate da una sub ed il calcolo è legato all'evente textchanged della matricola del dipendente.
    Qui sorge il problema.Il primo record (legato ad form_load) viene letto e calcolato correttamente, mentre i successivi effettuano il calcolo sulla base dei dati del record precedente e NON del corrente.

    Pensavo di aver risolto il problema utilizzato il seguente codice (che in effetti legge i valori ed effettua correttamente i calcoli del record corrente),ma mi sono accorto che l'ultima parte di codice (For each ... color.green) continua a fare riferimento al record precedente!

    Aiutooo!

        Sub Calcola()
    
            For Each s As Control In Me.Controls
                If s.GetType Is GetType(TextBox) Then
                    s.BackColor = Color.White
                End If
            Next
    
            minuti.Text = orario(Val(ORE_LAVTextBox.Text))
    
            G_FE_AP.Text = Math.Floor(DipendentiBindingSource.Current("FE_AP") / Val(minuti.Text))
            G_FS_AP.Text = Math.Floor(DipendentiBindingSource.Current("FS_AP") / Val(minuti.Text))
            G_FD_AP.Text = Math.Floor(DipendentiBindingSource.Current("FD_AP") / Val(minuti.Text))
            G_FE_AC.Text = Math.Floor(DipendentiBindingSource.Current("FE_AC") / Val(minuti.Text))
            G_FS_AC.Text = Math.Floor(DipendentiBindingSource.Current("FS_AC") / Val(minuti.Text))
            G_FD_AC.Text = Math.Floor(DipendentiBindingSource.Current("FD_AC") / Val(minuti.Text))
            G_PR.Text = Math.Floor(DipendentiBindingSource.Current("PR") / Val(minuti.Text))
            G_PN.Text = Math.Floor(DipendentiBindingSource.Current("PN") / Val(minuti.Text))
            G_SP.Text = Math.Floor(DipendentiBindingSource.Current("SP") / Val(minuti.Text))
    
            For Each s As Control In Me.Controls
                If s.GetType Is GetType(TextBox) Then
                    If Val(s.Text) < 0 Then s.BackColor = Color.Green
                End If
            Next
    
        End Sub
    
        Function orario(ByVal m_ore_lav As Double)
            Dim m_durata As Integer
            Dim a As Double = Fix(m_ore_lav * 60)
            Dim b As Double = (m_ore_lav - Fix(m_ore_lav)) * 100
            m_durata = (a + b) / 6
            Return m_durata
        End Function
    

  2. #2
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da gnappi Visualizza il messaggio
    ma mi sono accorto che l'ultima parte di codice (For each ... color.green) continua a fare riferimento al record precedente!
    Non ha molto senso, dal momento che nel ciclo fai riferimento a [s.Text] e questo viene aggiornato subito prima...

    1) I valori nelle TextBox sono coerenti?
    2) Eventuali errori/eccezioni come le gestisci?
    3) La funzione non ritorna sempre Integer. Perché [m_durata] è Integer e non Double?
    4) Io il primo ciclo lo eliminerei ed il secondo lo riscriverei così:
    For Each s As Control In Me.Controls
        If s.GetType Is GetType(TextBox) Then
            s.BackColor = Iif(Val(s.Text) < 0, Color.Green, Color.White)
        End If
    Next
    

  3. #3
    gnappi non è in linea Scolaretto
    Grazie,Sgrubak.
    Ho sostituito il tuo ciclo for each e funziona benissimo!
    Per quanto concerne il resto, ho trovato la soluzione, che comunque non mi spiego.
    L'evento ChangeText era legato alla matricola del dipendente, che è un valore unico e cambia quindi da record a record.Esso produceva un effetto però anomalo nel momento in cui calcolava le textbox,nel senso che prendeva a base il record precedente.Sul primo record infatti non calcolava nulla!
    Ho spostato l'evento su un'altra textbox (FE_APTextbox) e ... funziona tutto!
    La domanda a cui vorrei dare una risposta è questa : perchè l'evento non funzionava sulla matricola? non è lo stesso richiamare una funzione da uno anzichè da altro controllo?

    Questo è il codice funzionante :
    Public Class ManutenzioneAssenze
        Dim DB As New ClassDB
    
        Private Sub gestioneAssenze_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.DipendentiTableAdapter.chiusura_anno(Me.TabelleENASDataSet.Dipendenti)
        End Sub
    
        Private Sub FE_APTextBox_TextChanged(sender As Object, e As EventArgs) Handles FE_APTextBox.TextChanged
            Calcola()
        End Sub
    
        Sub Calcola()
            minuti.Text = DB.orario(Val(ORE_LAVTextBox.Text))
            G_FE_APTextBox.Text = Int(Val(FE_APTextBox.Text) / Val(minuti.Text))
            G_FS_APTextBox.Text = Int(Val(FS_APTextBox.Text) / Val(minuti.Text))
            G_FD_APTextBox.Text = Int(Val(FD_APTextBox.Text) / Val(minuti.Text))
            G_FE_ACTextBox.Text = Int(Val(FE_ACTextBox.Text) / Val(minuti.Text))
            G_FS_ACTextBox.Text = Int(Val(FS_ACTextBox.Text) / Val(minuti.Text))
            G_FD_ACTextBox.Text = Int(Val(FD_ACTextBox.Text) / Val(minuti.Text))
            G_PRTextBox.Text = Int(Val(PRTextBox.Text) / Val(minuti.Text))
            G_PNTextBox.Text = Int(Val(PNTextBox.Text) / Val(minuti.Text))
            G_SPTextBox.Text = Int(Val(SPTextBox.Text) / Val(minuti.Text))
            For Each s As Control In Me.Controls
                If s.GetType Is GetType(TextBox) Then
                    s.BackColor = IIf(Val(s.Text) < 0, Color.Green, Color.White)
                End If
            Next
        End Sub
    End Class
    
    Ultima modifica di gnappi; 01-09-2021 16:53 

  4. #4
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da gnappi Visualizza il messaggio
    Perchè l'evento non funzionava sulla matricola?
    E chi lo sa? Magari hai altro codice che interviene sulla prima TextBox e non su quella che usi adesso. Vedo anche che hai BindingSource e TableAdapter quindi sento odore di Wizard. Ho imparato, ricevendo un sacco di consigli in merito proprio qui sul forum, a guardarmi dall'usare il wizard. Meglio leggersi un bel libro su ADO.NET. Un po' più laborioso come approccio, ma decisamente più controllabile.

    In situazioni tipo la tua io mi connetto al DB, istanzio una lista di oggetti che mappi i record della tabella, e poi tengo il riferimento ad un "Oggetto corrente" che uso per valorizzare i controlli dell'UI. Creato l'automatismo, per scorrere i record della tabella è sufficiente pescare dalla lista l'oggetto con indice corretto e aggiornare il "corrente".

    Quote Originariamente inviato da gnappi Visualizza il messaggio
    L'evento ChangeText era legato alla matricola del dipendente
    In ogni caso, non userei il TextChanged quanto più il Validated...

  5. #5
    gnappi non è in linea Scolaretto
    E chi lo sa? Magari hai altro codice che interviene sulla prima TextBox
    Il codice legato al form in causa è solo quello pubblicato.

    Per il resto, accetto il tuo suggerimento, ma sono ancora lontano da una vera programmazione ad oggetti!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. calcoli con ore
    Da annaelle nel forum Microsoft Excel
    Risposte: 11
    Ultimo Post: 08-04-2013, 14:48
  2. calcoli con iva
    Da papy2 nel forum Visual Basic 6
    Risposte: 11
    Ultimo Post: 26-11-2005, 14:45
  3. calcoli con ore
    Da altair nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 06-10-2004, 18:13
  4. calcoli con ore
    Da altair nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 05-08-2004, 20:17
  5. Calcoli textbox
    Da andromeda nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 30-07-2004, 21:06