Newsgroup: it.comp.appl.access
Titolo: Salto di numerazione

Ciao a tutti,
ho un problemino dal quale non riesco proprio a venirne fuori:
Ho una tabella con un campo ID (contatore),
mi servirebbe creare una query che mi tira fuori solo gli eventuali salti di
numerazione.....
ovvero se il campo id contiene i valori 1,2,3,5
la query mi dovrebbe tirar fuori il valore 4.
Spero di essere stato chiaro.
Grazie.

 ha scritto nel messaggio
news:7Miq7.4877$Lp6.2...@news.infostrada.it...

Se la tabella si chiama Tabella1 e i buchi contengono solo un record come
nel tuo esempio (ovvero non possono mancare due record consecutivi), il
codice SQL della query potrebbe essere questo:
SELECT IIf([ID]<>1,IIf(IsNull(DLookUp("ID","Tabella1","ID=" &
[ID]-1)),[ID]-1,Null),Null) AS Pippo
FROM Tabella1
WHERE ((Not (IIf([ID]<>1,IIf(IsNull(DLookUp("ID","Tabella1","ID=" &
[ID]-1)),[ID]-1,Null),Null)) Is Null));
Se invece è prevista la mancanza di più record consecutivi, ad esempio 1 2 e
5, la query restituirebbe solo il valoro dell'ultimo, ovvero 4, ma non ti
segnalerebbe come mancante anche il 3.
Potresti però risolvere il problema avendo il risultato che ti serve in una
tabella di appoggio chiamata Mancanti, costituita da un solo campo di tipo
numerico chiamato NumMancante (che ne sarebbe anche la chiave primaria); la
tabella verrebbe popolata con questo codice VBA:
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM Mancanti;"
DoCmd.SetWarnings True
Dim rst As Recordset
Dim rstManca As Recordset
Dim Manca As Long
Dim Pippo As Long
Manca = 1
Set rstManca = CurrentDb.OpenRecordset("Mancanti")
Set rst = CurrentDb.OpenRecordset("Tabella1")
rst.MoveFirst
Do Until rst.EOF
If Manca = rst!ID Then
    Manca = Manca + 1
    rst.MoveNext
Else
    For Pippo = Manca To rst!ID - 1
        rstManca.AddNew
        rstManca!NumMancante = Pippo
        rstManca.Update
    Next Pippo
    Manca = Pippo + 1
    rst.MoveNext
End If
Loop
Set rst = Nothing
Set rstManca = Nothing
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ---------------------------------------------
Grazie Roberto,
visto le mie esigente ho scelto la seconda strada...
Ciao.


Machiavellico!  ;-))
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com

 > la query mi dovrebbe tirar fuori il valore 4.
[CUT]
Scusa se riprendo un un vecchio quesito, ma mi sorto un dubbio, il tutto
funziona se il campo è un ID, e se invece vorrei controllare un salto di
numerazione di un campo numerico, come dovrei fare?
Grazie.
   Old-Jack!

 ha scritto nel messaggio
news:lxWr7.5208$jT5.2...@news.infostrada.it...

Forse vuoi dire nel caso in cui il Tipo dati del campo ID anziché essere di
tipo Contatore è di tipo Numerico?
Se le cose stanno così, occorre che, per tranquillità, tu apra il recordset
rst, anziché direttamente su Tabella1, su una query basata su Tabella1 che
ordini le sue righe per il campo che contiene il valore progressivo "con i
buchi".
Questo è comunque indispensabile per come è architettata la routine VBA che
ti ho postato.
Il problema cambia sostenzialmente nel caso in cui il campo che contiene il
numero progressivo da controllare abbia un tipo dato di tipo Testo.


 wrote in message
9oqhiu$4gig$1...@stargate1.inet.it...

Il mio caso è quello da te descritto,
ho già provato e tutto funziona.
Grazie Roberto sei un grande.
Old-Jack.


Buongiorno.
Sto utilizzando questa soluzione per attribuire ad un nuovo articolo il primo codice (numerico) tra quelli mancanti nella tabella tblArticoli.
Su click del pulsante Nuovo ho messo il codice che mi genera/aggiorna la tabella "mancanti". Ho creato una query che mi restituisca solo il primo codice mancante e continuando nel codice vba su click del pulsante "Nuovo" ho messo:
Me.IdArticolo = "SELECT First(Mancanti.NumMancante) AS PrimodiNumMancante FROM Mancanti;"
Il numero restituito evidententemente non è di tipo numerico e ho il seguente errore:
Errore di run-time '-
2147352567
 (80020009)':
E' stato immesso un valore non valido per il campo
Come posso risolvere?
Grazie.
Giuseppe


con una delle funzioni di conversione: 
ad es, se necessita un tipo dato long
clng(First(Mancanti.NumMancante))


Ciao Giorgio, grazie della risposta.
Ho inserito clng(First(Mancanti.NumMancante)) nel codice del pulsante "Nuovo" ma mi esce sempre quel messaggio di errore.
Ho provato anche a inserirlo nella query e ad assegnare il valore al controllo IdArticolo con 
Me.IdArticolo = "SELECT (PrimodiNumMancante) FROM qryNumMancanteArticoli;"
Il campo nella tabella è di tipo numerico, dimensione campo intero lungo, posizioni decimali automatiche.
Giuseppe


è strano
per restare a livello di "forzatura" dell'inserimento (pensando che ci sia un errore nella query) proverei ad utilizzare la funzione DMin sulla tabella che riporta i mancanti (in teoria si potrebbe ottenere solo il primo valore, e uscire dal ciclo proposto da Roberto)
Me.IdArticolo = DMin("NumMancante";"Mancanti")
 
e anche ad utilizzare il nome del controllo che contiene IdArticolo (anche se nascosto: es txtIdArticolo se è una textbox):
Me.txtIdArticolo = DMin("NumMancante";"Mancanti")
 
se la cosa non va penso ci sia un errore di logica: 
SE non ci fossero numeri mancanti come valorizzi IdArticolo ?


Giorgio grazie tante. Con 
Me.IdArticolo = DMin("NumMancante";"Mancanti")
adesso funziona.
Ora dovrò gestire il caso in cui non ci sono numeri mancanti e attribuire il primo numero successivo rispetto all'ultimo con
Me.IdArticolo = Nz(DMax("[idarticolo]", "[tblarticoli]"), 0) + 1
Giuseppe