Access non risponde durante l'elaborazione

di il
4 risposte

Access non risponde durante l'elaborazione

Salve,

ho ripreso in mano access dopo un bel pò di anni, quindi sono un pò arrugginito. In questo momento sto usando access365 su un portatile con windows10. Ho creato una piccola applicazione che uso ogni giorno per elaborare un file csv, la dimensione varia da 1000 record a 70000. Lo importo in una tabella ed eseguo un'elaborazione sequenziale di quest'ultima. Per ogni record devo eseguire 2-3 query su una tabella di circa 2 milioni di record.
Funziona tutto, ma ho un problema 'antipatico'. Dopo pochi secondi che lancio l'elaborazione, access non risponde più, si freeza, anche se continua a lavorare. In questo modo, non ho mai certezza che stia lavorando veramente e in un paio di occasioni, sono stato costretto a killarlo, perchè i tempi di elaborazione non erano coerenti con la quantità di record da elaborare (altro problema simpatico, di cui però parlerò più avanti).
Ho provato a creare una casella di testo sul form e a visualizzare il contatore. Funziona fino a che non tocco nulla, ma basta un click qualsiasi per riportare access nella situazione prima descritta.
C'è modo di risolvere il problema.

Grazie in anticipo per qualsiasi dritta

4 Risposte

  • Re: Access non risponde durante l'elaborazione

    Prima di pensare a risolvere serve capire cosa sia il problema... e purtroppo a parte una sommaria descrizione non ci dici nulla di tecnicamente rilevante...
    Mostra il codice perché il problema è sicuramente da ricercare in qualche errore tecnico concettuale dimcui non sei consapevole e che non crea problemi con pochi dati ma si evidenzia quando la mole incrementa...
  • Re: Access non risponde durante l'elaborazione

    Il codice è stato scritto in fretta e furia e sicuramente migliorabile, la cosa che mi lascia perplesso è che se non tocco nulla, visualizzo correttamente il contatore, ma appena clicco con il mouse, qualsiasi cosa, access perde il controllo e sembra andare in hang. Cmq, di seguito il codice associato al pulsante. Ho dovuto nascondere qualcosa perchè elaboro dati sensibili.


    Private Sub Comando31_Click()

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rsCOMANDI As DAO.Recordset
    Dim strSQL As String
    Dim strLastID As Long
    Dim strOrigineID As Long
    Dim strPadreID As Long
    Dim strOldProfilo As Long
    Dim strCont As Long

    Set db = CurrentDb

    ' Recupero solo i record in stato 0 - Da Elaborare
    strSQL = "SELECT * FROM TMP_CARICAMENTO WHERE TMP_STATO=0"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)


    If rs.EOF Then
    str_TotRec = 0
    Else
    rs.MoveLast
    str_TotRec = rs.RecordCount
    End If

    Me.Txt_Contatore.Value = 0

    rs.MoveFirst

    strCont = 0

    Do While Not rs.EOF

    strXxxx = rs.Fields("TMP_Xxxx").Value
    strYyyy = rs.Fields("TMP_Yyyy").Value
    strProfilo = rs.Fields("TMP_PROFILO").Value
    strTAB_COMANDO_ID = rs.Fields("TMP_TAB_COMANDO_ID").Value
    strANA_CARICAMENTO_ID = rs.Fields("TMP_ANA_CARICAMENTO_ID").Value
    strStato = 0
    strErr = ""

    Select Case strTAB_COMANDO_ID
    Case 1

    strStato = 0

    ' Controllo per Xxxx e Stato=0 (Attivo)
    strSQL = "SELECT * FROM ZZZ_COMANDI WHERE ZZZ_Xxxx='" & strXxxx & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If Not rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Xxxx già esistente : " & strSQL
    End If
    rsCOMANDI.Close

    ' Controllo per Yyyy e Stato=0 (Attivo)
    strSQL = "SELECT * FROM ZZZ_COMANDI WHERE ZZZ_Yyyy='" & strYyyy & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If Not rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Yyyy già esistente : " & strSQL
    End If
    rsCOMANDI.Close

    ' Controllo per Yyyy, Xxxx e Stato=0 (Attivo)
    strSQL = "SELECT * FROM ZZZ_COMANDI WHERE ZZZ_Yyyy='" & strYyyy & "' AND ZZZ_Xxxx='" & strYyyy & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If Not rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Yyyy e Xxxx già esistente : " & strSQL
    End If
    rsCOMANDI.Close


    If strStato = 0 Then
    ' Inserisco e update elaborato

    strSQL = " INSERT INTO ZZZ_COMANDI ( ZZZ_Xxxx, ZZZ_Yyyy, ZZZ_Profilo, ZZZ_TAB_COMANDO_ID, ZZZ_ANA_CARICAMENTO_ID, ZZZ_STATO )" _
    & "VALUES ('" & strXxxx & "','" & strYyyy & "'," & strProfilo & "," & strTAB_COMANDO_ID & "," & strANA_CARICAMENTO_ID & ", 0 )"

    db.Execute strSQL

    strSQL = "SELECT @@IDENTITY"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    strLastID = rsCOMANDI.Fields(0)

    strSQL = " UPDATE ZZZ_COMANDI SET " & _
    " ZZZ_ORIGINE_ID = " & strLastID & _
    " WHERE ZZZ_ID = " & strLastID

    db.Execute strSQL

    rs.Edit
    rs.Fields("TMP_STATO") = 1
    rs.Update

    Else

    rs.Edit
    rs.Fields("TMP_STATO") = 2
    rs.Fields("TMP_ERRORE") = strErr
    rs.Update

    End If

    Case 2

    strStato = 0
    strPadreID = 0
    strOrigineID = 0

    ' Controllo per Xxxx e Stato=0 (Attivo)
    strSQL = "SELECT ZZZ_ID,ZZZ_ORIGINE_ID,ZZZ_Yyyy,ZZZ_PROFILO FROM ZZZ_COMANDI WHERE ZZZ_Xxxx='" & strXxxx & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Xxxx inesistente : " & strSQL
    Else
    rsCOMANDI.MoveLast
    If rsCOMANDI.RecordCount > 1 Then
    strStato = 2
    strErr = "Xxxx duplicato : " & strSQL
    Else
    If rsCOMANDI.Fields("ZZZ_Yyyy") = strYyyy Then
    strStato = 2
    strErr = "New Yyyy incongruente : " & rsCOMANDI.Fields("ZZZ_Yyyy") & " = " & strYyyy
    Else
    strPadreID = rsCOMANDI.Fields("ZZZ_ID")
    strOrigineID = rsCOMANDI.Fields("ZZZ_ORIGINE_ID")
    strProfilo = rsCOMANDI.Fields("ZZZ_PROFILO")
    End If
    End If
    End If
    rsCOMANDI.Close

    If strStato = 0 Then
    ' Inserisco il comando

    strSQL = " INSERT INTO ZZZ_COMANDI ( ZZZ_Xxxx, ZZZ_Yyyy, ZZZ_Profilo, ZZZ_TAB_COMANDO_ID, ZZZ_ANA_CARICAMENTO_ID, ZZZ_STATO, ZZZ_ORIGINE_ID, ZZZ_PADRE_ID )" _
    & "VALUES ('" & strXxxx & "','" & strYyyy & "'," & strProfilo & "," & strTAB_COMANDO_ID & "," & strANA_CARICAMENTO_ID & ", 0," & strOrigineID & ", " & strPadreID & " ) "

    db.Execute strSQL

    ' Termino il comando padre
    strSQL = " UPDATE ZZZ_COMANDI SET " & _
    " ZZZ_STATO = 1 " & _
    " WHERE ZZZ_ID = " & strPadreID

    db.Execute strSQL

    ' Aggiorno il record come Lavorato
    rs.Edit
    rs.Fields("TMP_STATO") = 1
    rs.Update


    Else
    rs.Edit
    rs.Fields("TMP_STATO") = 2
    rs.Fields("TMP_ERRORE") = strErr
    rs.Update

    End If

    Case 3

    strStato = 0
    strPadreID = 0
    strOrigineID = 0

    ' Controllo per Yyyy e Stato=0 (Attivo)
    strSQL = "SELECT ZZZ_ID,ZZZ_ORIGINE_ID,ZZZ_Xxxx,ZZZ_PROFILO FROM ZZZ_COMANDI WHERE ZZZ_Yyyy='" & strYyyy & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Yyyy inesistente : " & strSQL
    Else
    rsCOMANDI.MoveLast
    If rsCOMANDI.RecordCount > 1 Then
    strStato = 2
    strErr = "Yyyy duplicato : " & strSQL
    Else
    If rsCOMANDI.Fields("ZZZ_Xxxx") = strXxxx Then
    strStato = 2
    strErr = "New Xxxx incongruente : " & rsCOMANDI.Fields("ZZZ_Xxxx") & " = " & strXxxx
    Else
    strPadreID = rsCOMANDI.Fields("ZZZ_ID")
    strOrigineID = rsCOMANDI.Fields("ZZZ_ORIGINE_ID")
    strProfilo = rsCOMANDI.Fields("ZZZ_PROFILO")
    End If
    End If
    End If
    rsCOMANDI.Close

    If strStato = 0 Then
    ' Inserisco il comando

    strSQL = " INSERT INTO ZZZ_COMANDI ( ZZZ_Xxxx, ZZZ_Yyyy, ZZZ_Profilo, ZZZ_TAB_COMANDO_ID, ZZZ_ANA_CARICAMENTO_ID, ZZZ_STATO, ZZZ_ORIGINE_ID, ZZZ_PADRE_ID )" _
    & "VALUES ('" & strXxxx & "','" & strYyyy & "'," & strProfilo & "," & strTAB_COMANDO_ID & "," & strANA_CARICAMENTO_ID & ", 0," & strOrigineID & ", " & strPadreID & " ) "

    db.Execute strSQL

    ' Termino il comando padre
    strSQL = " UPDATE ZZZ_COMANDI SET " & _
    " ZZZ_STATO = 1 " & _
    " WHERE ZZZ_ID = " & strPadreID

    db.Execute strSQL

    ' Aggiorno il record come Lavorato
    rs.Edit
    rs.Fields("TMP_STATO") = 1
    rs.Update


    Else
    rs.Edit
    rs.Fields("TMP_STATO") = 2
    rs.Fields("TMP_ERRORE") = strErr
    rs.Update

    End If

    Case 5

    strStato = 0

    ' Controllo per Yyyy, Xxxx e Stato=0 (Attivo)
    strSQL = "SELECT * FROM ZZZ_COMANDI WHERE ZZZ_Yyyy='" & strYyyy & "' AND ZZZ_Xxxx='" & strXxxx & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Yyyy e Xxxx inesistente : " & strSQL
    Else
    rsCOMANDI.MoveLast
    If rsCOMANDI.RecordCount > 1 Then
    strStato = 2
    strErr = "Yyyy e Xxxx duplicato : " & strSQL
    Else
    strPadreID = rsCOMANDI.Fields("ZZZ_ID")
    strOrigineID = rsCOMANDI.Fields("ZZZ_ORIGINE_ID")
    strOldProfilo = rsCOMANDI.Fields("ZZZ_PROFILO")
    End If
    End If
    rsCOMANDI.Close

    If strStato = 0 Then
    ' Inserisco e update elaborato

    strSQL = " INSERT INTO ZZZ_COMANDI ( ZZZ_Xxxx, ZZZ_Yyyy, ZZZ_Profilo, ZZZ_TAB_COMANDO_ID, ZZZ_ANA_CARICAMENTO_ID, ZZZ_STATO, ZZZ_ORIGINE_ID, ZZZ_PADRE_ID, ZZZ_OLD_PROFILO )" _
    & "VALUES ('" & strXxxx & "','" & strYyyy & "'," & strProfilo & "," & strTAB_COMANDO_ID & "," & strANA_CARICAMENTO_ID & ", 0," & strOrigineID & ", " & strPadreID & ", " & strOldProfilo & " ) "

    db.Execute strSQL

    ' Cesso tutta la catena
    strSQL = " UPDATE ZZZ_COMANDI SET " & _
    " ZZZ_STATO = 3 " & _
    " WHERE ZZZ_ORIGINE_ID = " & strOrigineID

    db.Execute strSQL

    ' Aggiorno il record come Lavorato
    rs.Edit
    rs.Fields("TMP_STATO") = 1
    rs.Update

    Else

    rs.Edit
    rs.Fields("TMP_STATO") = 2
    rs.Fields("TMP_ERRORE") = strErr
    rs.Update

    End If

    Case 4

    strStato = 0
    strPadreID = 0
    strOrigineID = 0

    ' Controllo per Yyyy+Xxxx e Stato=0 (Attivo)
    strSQL = "SELECT ZZZ_ID,ZZZ_ORIGINE_ID,ZZZ_Xxxx,ZZZ_PROFILO FROM ZZZ_COMANDI WHERE ZZZ_Yyyy='" & strYyyy & "' AND ZZZ_Xxxx='" & strXxxx & "' AND ZZZ_STATO=0"
    Set rsCOMANDI = db.OpenRecordset(strSQL, dbOpenSnapshot)
    If rsCOMANDI.EOF Then
    strStato = 2
    strErr = "Yyyy+Xxxx inesistente : " & strSQL
    Else
    rsCOMANDI.MoveLast
    If rsCOMANDI.RecordCount > 1 Then
    strStato = 2
    strErr = "Yyyy+Xxxx duplicato : " & strSQL
    Else
    strPadreID = rsCOMANDI.Fields("ZZZ_ID")
    strOrigineID = rsCOMANDI.Fields("ZZZ_ORIGINE_ID")
    strOldProfilo = rsCOMANDI.Fields("ZZZ_PROFILO")

    End If
    End If
    rsCOMANDI.Close

    If strStato = 0 Then
    ' Inserisco il comando

    strSQL = " INSERT INTO ZZZ_COMANDI ( ZZZ_Xxxx, ZZZ_Yyyy, ZZZ_Profilo, ZZZ_TAB_COMANDO_ID, ZZZ_ANA_CARICAMENTO_ID, ZZZ_STATO, ZZZ_ORIGINE_ID, ZZZ_PADRE_ID, ZZZ_OLD_PROFILO )" _
    & "VALUES ('" & strXxxx & "','" & strYyyy & "'," & strProfilo & "," & strTAB_COMANDO_ID & "," & strANA_CARICAMENTO_ID & ", 0," & strOrigineID & ", " & strPadreID & ", " & strOldProfilo & " ) "

    db.Execute strSQL

    ' Termino il comando padre
    strSQL = " UPDATE ZZZ_COMANDI SET " & _
    " ZZZ_STATO = 1 " & _
    " WHERE ZZZ_ID = " & strPadreID

    db.Execute strSQL

    ' Aggiorno il record come Lavorato
    rs.Edit
    rs.Fields("TMP_STATO") = 1
    rs.Update


    Else
    rs.Edit
    rs.Fields("TMP_STATO") = 2
    rs.Fields("TMP_ERRORE") = strErr
    rs.Update

    End If


    Case Else

    End Select

    rs.MoveNext

    strCont = strCont + 1
    Me.Txt_Contatore.Value = Me.Txt_Contatore.Value + 1
    Me.Repaint

    Loop

    rs.Close

    Set rs = Nothing


    End Sub
  • Re: Access non risponde durante l'elaborazione

    Mi pare ovvio... non hai dato modo al sistema operativo di fare il suo mestiere... non vedo un DOEVENTS... sbaglio...?
  • Re: Access non risponde durante l'elaborazione

    Cavolo...l'avevo detto che ero arrugginito. Appena ho letto DoEvents mi si è accesa la lampadina, appena ho letto chi mi ha risposto, sono sprofondato nei ricordi. Grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte