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