Tables

1.21 E' possibile riempire i "buchi" lasciati dalle eliminazioni di record nei campi contatore incrementali?
  Marco Pizzamiglio (namor)
(D)
E' possibile riempire i "buchi" lasciati dalle eliminazioni di record nei campi contatore incrementali?

(R)
Si, inserendo i nuovi record da VBA o tramite query di inserimento.


Se aggiungi un nuovo record in una tabella con un contatore, come è noto, Access prende il prossimo valore disponibile per il contatore, senza tenere conto di eventuali buchi dovuti a record eliminati, e non è possibile modificare il valore di un campo contatore.

Però supponi di avere una nuova tabella chiamata Test con i camp iID (tipo Contatore) e testomsg (tipo Testo).
Inserisci dieci record, che avranno il contatore da 1 a 10, e poi cancellane alcuni per creare dei buchi:

ID testomsg
----------------
1 record 1
2 record 2
7 record 7
9 record 9

Pur essendo 9 l'ultimo valore, inserendo un nuovo record da maschera o direttamente nella tabella il contatore prenderà il valore 11 in quanto i valori 3..6, 8 e 10 erano già stati utilizzati, anche se poi cancellati.
Rimane tuttavia possibile inserire da query o da VBA dei nuovi record assegnando al contatore un valore arbitrario e quindi recuperare i valori eliminati.

Esempio inserimento da query:
DoCmd.RunSQL "INSERT INTO Test (ID, testomsg) VALUES (3, ""INSERT 3"");"

Esempio inserimento da VBA (DAO):
  Dim rst as DAO.Recordset
  Set rst = CurrentDb.OpenRecordset("Test")
  rst.AddNew
  rst!id = 5
  rst!testomsg = ".AddNew 5"
  rst.Update
  rst.Close: Set rst=Nothing

Eseguendo due volte i due codici sopra riportati ci troveremo in questa situazione:

ID testomsg
----------------
1 record 1
2 record 2
3 INSERT 3
3 INSERT 3
5 .AddNew 5
5 .AddNew 5
7 record 7
9 record 9

Si nota quindi che non solo è possibile recuperare i contatori perduti senza compattare il db, ma addirittura duplicarne il valore, se il campo contatore non è chiave primaria o indicizzato con duplicati non ammessi.
E' ininfluente il fatto che il db venga compattato o meno prima dell'inserimento dei record.

Nota
Il codice VBA dell'esmpio di cui sopra fa riferimento alla libreria Microsoft DAO quindi, se si usa una versione di Access successiva ad Access 97, verificare che il database abbia i riferimenti alla libreria Microsoft DAO 3.6 Object Library.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.