Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    [VB6] Mancato aggiornamento Tabella

    [VB6] Nel codice di seguito ho dovuto inserire un "Do ... Loop" apparentemente inutile per fare si che una Tabella venga aggiornata.
    Senza questo frammento di procedura non ottengo l'aggiornamento.
    Aggiungo che il DB è Access 2000.
    Qualcuno sa dirmi dove sbaglio?

    codice:
    Sub SelezionaDaAgenti()
    On Error GoTo error_SelezionaDaAgenti
    
        Dim i As Integer, k As Integer, Vuoto As Integer
        Dim rcrdstAgenti As ADODB.Recordset, rcrdstMix As ADODB.Recordset, rcrdstProvince As ADODB.Recordset
        Dim sSQL As String
        
        Set rcrdstAgenti = New ADODB.Recordset
        Set rcrdstMix = New ADODB.Recordset
        Set rcrdstProvince = New ADODB.Recordset
                        
        sSQL = "SELECT CodAg, Selezionato From Agenti WHERE (((CodAg)='1'))"
        rcrdstAgenti.Open sSQL, ConnettiDBlocale, adOpenStatic, adLockOptimistic
    
        sSQL = "SELECT DISTINCT Prov From Clienti WHERE (((Escluso_1)<>-1) AND ((CodAg)='1'))"
        rcrdstMix.Open sSQL, ConnettiDBlocale, adOpenStatic, adLockOptimistic
    
        sSQL = "SELECT CodZn, OrdProv, Prov, Selezionato From DatiTerritoriali WHERE (((DescrProv)<>'Estero')) ORDER BY CodZn, OrdProv, Prov"
        rcrdstProvince.Open sSQL_Prov, ConnettiDBlocale, adOpenStatic, adLockOptimistic
    
        If rcrdstAgenti(1) = -1 Then
            rcrdstMix.MoveFirst
            Do Until rcrdstMix.EOF
                rcrdstProvince.MoveFirst
                Do Until rcrdstProvince.EOF
                    If rcrdstMix("Prov") = rcrdstProvince("Prov") Then
                        rcrdstProvince("Selezionato") = -1
                        rcrdstProvince.Update
                    End If
                    rcrdstProvince.MoveNext
                Loop
                rcrdstMix.MoveNext
            Loop
        End If
    
    '    **********************************************************************************************************
    '    Ho dovuto inserire il frammento di procedura qui sotto altrimenti non esegue correttamente la Sub "SelezionaDaProvince".
    
         rcrdstProvince.Close
         rcrdstProvince.Open sSQL_Prov, ConnettiDBlocale, adOpenStatic, adLockOptimistic
    
         Do Until rcrdstProvince.EOF
              rcrdstProvince.MoveNext
         Loop
                            
    '    Invece dopo avere eseguito questa procedura, la tabella "rcrdstRegioni" della Sub "SelezionaDaProvince" è aggiornata. Senza questo "Do ... Loop" la Tabella non si aggiorna
    '    '**********************************************************************************************************
            
        k = 0
        rcrdstProvince.MoveLast
        rcrdstProvince.MoveFirst
        For i = 0 To rcrdstProvince.RecordCount - 1
            If rcrdstProvince("Selezionato") = True Then
                If k = 0 Then
                    k = i
                End If
                ListaProvince.Selected(i) = True                    'ListaProvince è una ListBox
            ElseIf rcrdstProvince("Selezionato") = False Then
                ListaProvince.Selected(i) = False
            End If
            rcrdstProvince.MoveNext
        Next i
            
        ListaProvince.TopIndex = k
        
        SelezionaDaProvince_1
        
        rcrdstAgenti.Close
        rcrdstMix.Close
        rcrdstProvince.Close
        
        Set rcrdstAgenti = Nothing
        Set rcrdstMix = Nothing
        Set rcrdstProvince = Nothing
    
        Exit Sub
    error_SelezionaDaAgenti:
        MsgBox "Errore nella Sub ''SelezionaDaAgenti''": " & Err.Number & " - " & Err.Description
    End Sub
    
    
    
    Private Sub SelezionaDaProvince()
    On Error GoTo error_SelezionaDaProvince
    
        Dim i As Integer, k As Integer
        Dim rcrdstRegione As ADODB.Recordset, rcrdstMix As ADODB.Recordset
        Dim sSQL As String
            
        Set rcrdstRegione = New ADODB.Recordset
        Set rcrdstMix = New ADODB.Recordset
        
        sSQL = "SELECT Reg, Selezionato From ElencoRegioni ORDER BY CodZn"
        rcrdstRegione.Open sSQL, ConnettiDBlocale, adOpenStatic, adLockOptimistic
        
        sSQL = "SELECT Reg, Sum(IIf([Selezionato]=True,1,0)) AS Vero, Count(DescrProv) AS SommaProv, IIf([SommaProv]-[Vero]<[SommaProv],-1,0) AS SeleRegione From DatiTerritoriali GROUP BY Reg, CodZn ORDER BY CodZn"
        rcrdstMix.Open sSQL, ConnettiDBlocale, adOpenStatic, adLockOptimistic
        
        rcrdstRegione.MoveLast
        rcrdstRegione.MoveFirst
        For i = 0 To rcrdstRegione.RecordCount - 1
            rcrdstMix.MoveLast
            rcrdstMix.MoveFirst
            For k = 0 To rcrdstMix.RecordCount - 1
                If rcrdstMix(0) = rcrdstRegione(0) Then
                    If rcrdstMix("SeleRegione") = -1 Then
                        rcrdstRegione(1) = -1
                        rcrdstRegione.Update
                    Else
                        rcrdstRegione(1) = 0
                        rcrdstRegione.Update
                    End If
                    DoEvents
                End If
            rcrdstMix.MoveNext
            Next k
        rcrdstRegione.MoveNext
        Next i
        
        rcrdstRegione.Close
        Set rcrdstRegione = Nothing
        rcrdstMix.Close
        Set rcrdstMix = Nothing
    
        Exit Sub
    error_SelezionaDaProvince:
        MsgBox "Errore nella Sub ''SelezionaDaProvince''": " & Err.Number & " - " & Err.Description
    End Sub
    È evidente che, visto che funziona, posso anche lasciarlo così, ma mi piacerebbe sapere perchè.

    Grazie per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    E' completamente inutile postare un fiume di codice senza spiegare il senso logico di questo codice.

  3. #3
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Nel DB Access, (che risiede in C:\) ho tre Tabelle, ognuna con un Campo "Sì/No".
    Ogni tabella è l'origine di un "ListBox".
    Quando nella Form nella quale sono i ListBox, si fa Click su un Record di un ListBox, questo cambia stato, ma contemporaneamente faccio in modo che anche nella tabella origine cambi lo stato del campo Sì/No.
    Le tre Tabelle (una tabella contiene gli Agenti, una le Province in cui questi operano, la terza le Regioni nelle quali sono comprese le province) sono legate da campi comuni. Nello specifico, la tabella che contiene le Province ha anche un Campo Regioni ed un campo Agenti.
    Lo scopo della procedura è di ottenere che se si fa Click su un Agente, si evidenzino (e di conseguenza cambi lo stato Sì/No della relativa tabella origine) anche le Province e le Regioni di competenza di quell'Agente.
    Il problema nasce quando, dopo aver fatto Click su un Agente, la procedura dovrebbe aggiornare anche le Tabelle Provincia e Regione.
    La Tabella Provincia si aggiorna regolarmente, mentre la Tabella Regione non si aggiorna SE NON aggiungendo quello specifico frammento di codice, che a me pare dovrebbe essere inutile, ma senza il quale l'evento non si genera.
    Aggiungo che ci sono arrivato per caso dopo aver copiato inavvertitamente due volte lo stesso codice: improvvisamente tutto ha funzionato.
    Ho eliminato via via alcune parti fino ad arrivare a quelle indicate che qui riporto, che sono lo stretto indispensabile per il funzionamento:

    codice:
        
        rcrdstProvince.Close
        rcrdstProvince.Open sSQL_Prov, ConnettiDBlocale, adOpenStatic, adLockOptimistic
    
        Do Until rcrdstProvince.EOF
            rcrdstProvince.MoveNext
        Loop
    Se necessario posso postare tutto il lavoro.

    Ancora grazie.

  4. #4
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Aggiungo che, poco fa, ho integrato le due Sub "SelezionaDaAgenti" e "SelezionaDaProvince" in una sola e la procedura funziona anche SENZA il frammento di Codice di cui sopra.
    Se torno a separarle, nuovamente funziona solo se c'è quel frammento.

  5. #5
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Rettifico nuovamente:
    dopo aver testato tutti i Records della ListBox "ListaAgenti", senza il Frammento di codice ci sono casi in cui NON FUNZIONA. Se riattivo il Frammento funziona sempre.

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Se per 'aggiornare' intendi fare l'update dei dati nelle tabelle del DB,
    è normale che i dati non siano aggiornati se 'riletti' immediatamente dopo l'aggiornamento.

    Tale comportamento è noto, per un database Access.
    Ciò avviene perchè il motore del JET aggiorna la 'cache' ogni 5 secondi, quindi per ottenere i dati aggiornati 'immediatamente' occorre forzare il refresh della cache con il metodo

    RefreshCache CN

    dove CN è la connessione ADODB.

    Con questo metodo, l'aggiornamento a video è istantaneo e va fatto sia dopo un INSERT che un UPDATE della tabella.

    Ne ho parlato moltre altre volte, fai una ricerca sul forum.
    Oppure puoi guardare uno dei miei progetti che trovi sul mio sito (vedi firma)


  7. #7
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Molte grazie.

    Ho letto quanto hai suggerito a matt_vb6 nel gennaio 2010 ed ho operato in quel modo ma purtroppo l'aggiornamento non avviene comunque.
    Ho invece risolto con un semplice

    codice:
    recordset.Requery
    dopo le variazioni apportate al recordset.

    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.