Buongiorno,
Risolto. Ho trovato una risposta funzionale alla mia domanda.
Prima di postare il codice volevo fare alcune precisazioni e dare delle risposte.
Senza stare troppo a dare spiegazioni del perché mi interessava recuperare la numerazione ID che annoierebbero, la domanda era sul come reimpostare il contatore del campo ID (AutoNumber), dopo che questo si sia spostato.
Nell'articolo https://learn.microsoft.com/it-IT/office/troubleshoot/access/error-inserting-table-record-autonumber#resolution viene descritto dettagliatamente l'errore sul campo AutoNumber, con le relative cause e risoluzioni.
In quest'altro articolo https://learn.microsoft.com/it-it/office/troubleshoot/access/reset-autonumber-value vengono forniti altri modi per ripristinare l'errore sul campo AutoNumber, e soprattutto viene indicato anche la metodologia da adottare per le tabelle relazionate.
Quindi partiamo con le risposte,
13/03/2024 - Antony73 ha scritto:
Cosa intendi per “reimpostare”?
Reimpostare un campo AutoNumber in una tabella, proprio come lo definisce Microsoft.
13/03/2024 - sihsandrea ha scritto:
L'indice di una tabella appartiene alla struttura del database non è un dato da archivio. I dati sono quelle informazioni che seve archiviare, consultare e manipolare. Per fare queste operazioni ci si avvale di indici e chiavi primarie e esterne.
Purtroppo, l'eredità degli arbori della programmazione hanno dato a questi campi un valore di dato. Così sentiamo dire “il cliente 107” "l'articolo 2357" e così via…
In realtà in nr 107 del cliente pippo serve per identificare il record di pippo franco piuttosto che di pippo baudo.
Andare a toccare le chiavi, come ti è stato suggerito, non ha senso. Se noti la rubrica del tuo cellulare hai un elenco di nomi non di id. Anche tu, in realtà dovresti nascondere all'utente il codice (chiave primaria o esterna).
In tutto questo, andare a recuperare un numero id che non è un dato immesso dall'utente (all'utente non frega niente se pippo va inserito come id 3 o id 39), ma su un numero elevato di record, oartire dal record 1 per inserire l'id 368993
13/03/2024 - SempreFresco ha scritto:
MsgBox "L'ID specificato esiste già nella tabella.", vbExclamation VerificaEInserisciID = False Exit Function
Ti sorbiresti 368993 messaggi fino all'id libero 368994?
Piuttosto torno a usare carta e penna.
Sul fatto di inserire gli ID con INSERT INTO è una possibilità che via fornita in SQL. L'utilizzo con le sue implicazioni credo che sia discrezionale. Non mi sorbisco affatto i messaggi fino all'ID libero, in quanto viene passato un unico numero alla Funzione “IDDaVerificare” .
13/03/2024 - max.riservo ha scritto:
ALTER TABLE [TableThatIncrements] ALTER COLUMN [Id] COUNTER (NewSeed,1)
Nel caso non funzionasse la query precedente prova con questa …
P.S. - Prima di fare danni fai il backup!
Avevo già provato con ALTER TABLE e non funziona per le tabelle relazionate, come specificato da Microsoft, occorrerebbe prima eliminare tutte le relazioni.
Dunque la domanda che avevo posto era la seguente:
13/03/2024 - SempreFresco ha scritto:
Nel suo insieme “arrangiato” funziona, ma volevo sapere se ci fosse un modo per “reimpostare” l'indice senza eseguire quanto nel paragrafo precedente.
La risposta che ho trovato funzionale è la seguente:
Function VerificaEInserisciID(ByVal IDDaVerificare As Integer, ByVal NomeTabella As String, ByVal NomeCampo As String) As Boolean
On Error GoTo ErrorHandler
Dim db As Database
Dim rs As Recordset
Dim UltimoID As Integer
Dim CampoID As Variant
CampoID = NomeCampo '"IDvalvole_in_attesa"
' Apri il database corrente
Set db = CurrentDb
' Seleziona l'ultimo ID dalla tabella
Set rs = db.OpenRecordset("SELECT MAX" & "(" & CampoID & ") AS UltimoID FROM " & NomeTabella)
If Not rs.EOF Then
UltimoID = rs("UltimoID").Value
Else
UltimoID = 0
End If
rs.Close
' Verifica se l'ID da verificare esiste già
Set rs = db.OpenRecordset("SELECT * FROM " & NomeTabella & " WHERE " & CampoID & " = " & IDDaVerificare, dbOpenSnapshot)
If rs.RecordCount > 0 Then
MsgBox "L'ID specificato esiste già nella tabella.", vbExclamation
VerificaEInserisciID = False
Exit Function
' Verifica se l'ID da verificare è maggiore a ID MAX
ElseIf IDDaVerificare > UltimoID Then
MsgBox "L'ID specificato è maggiore dell'ultimo ID presente nella tabella.", vbExclamation
VerificaEInserisciID = False
Exit Function
Else
' Inserisci l'ID nella tabella
db.Execute "INSERT INTO " & NomeTabella & " (" & CampoID & ") VALUES (" & IDDaVerificare & ")"
End If
rs.Close
Set rs = db.OpenRecordset("SELECT * FROM " & NomeTabella & " WHERE " & CampoID & " = " & IDDaVerificare, dbOpenSnapshot)
If rs.RecordCount > 0 Then
' Costruisci l'istruzione SQL per reimpostare il contatore dell'ID
db.Execute "INSERT INTO " & NomeTabella & " SELECT * FROM " & NomeTabella & " WHERE " & CampoID & " = " & UltimoID
MsgBox "L'ID è stato inserito correttamente nella tabella.", vbInformation
VerificaEInserisciID = True
Else
MsgBox "L'ID non è stato inserito.", vbCritical
VerificaEInserisciID = False
End If
rs.Close
Set rs = Nothing
Set db = Nothing
Exit Function
ErrorHandler:
MsgBox "Si è verificato un errore durante la verifica e l'inserimento dell'ID.", vbCritical
If Not rs Is Nothing Then rs.Close
Set rs = Nothing
Set db = Nothing
VerificaEInserisciID = False
End Function
Nel codice fornito all'apertura del post eseguivo un ‘db.Execute "INSERT INTO " calcolando l'ultimo ID +1, per poi cancellarlo.
Questo reimpostava sì l'indice AutoNumber all'ultimo ID, ma non volevo cancellare l'ID e non volevo lasciarlo vuoto, in quanto la tabella si popola con altre funzioni tramite rs.AddNew.
Quindi in alternativa alle soluzioni fornite da Microsoft, copio l'ultimo IDMax e lo incollo nella stessa posizione, e questo è sufficiente a reimpostare l'indice AutoNumber.
Ringrazio tutti che hanno dedicato del loro tempo alla mia discussione, avrò scoperto pure l'acqua calda, ma per me va bene così.