Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Salto di numerazione

218 views
Skip to first unread message

Old-Jack

unread,
Sep 20, 2001, 5:36:03 AM9/20/01
to
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.


Roberto da casa

unread,
Sep 20, 2001, 7:23:33 AM9/20/01
to

"Old-Jack" <f_co...@libero.it> 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
---------------------------------------------


Old-Jack

unread,
Sep 20, 2001, 8:26:50 AM9/20/01
to
Roberto da casa <r.ma...@libero.it> wrote in message
Vkkq7.5411$Lp6.2...@news.infostrada.it...

>
> "Old-Jack" <f_co...@libero.it> ha scritto nel messaggio
> news:7Miq7.4877$Lp6.2...@news.infostrada.it...
> > 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.
> >
>
> 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:

[CUT]

> --
> 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.


Silvio Berruti

unread,
Sep 20, 2001, 9:16:39 AM9/20/01
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:Vkkq7.5411$Lp6.2...@news.infostrada.it...

>
> "Old-Jack" <f_co...@libero.it> ha scritto nel messaggio
> news:7Miq7.4877$Lp6.2...@news.infostrada.it...
> > 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.
> >
>
> 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));
>

Machiavellico! ;-))

--

Silvio


il sito comune di it.comp.appl.access:
http://www.sitocomune.com

Old-Jack

unread,
Sep 25, 2001, 3:40:01 AM9/25/01
to
Roberto da casa <r.ma...@libero.it> wrote in message
Vkkq7.5411$Lp6.2...@news.infostrada.it...
>
> "Old-Jack" <f_co...@libero.it> ha scritto nel messaggio
> news:7Miq7.4877$Lp6.2...@news.infostrada.it...
> > 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.

[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!


Roberto dal portatile

unread,
Sep 25, 2001, 2:18:15 PM9/25/01
to

"Old-Jack" <f_co...@libero.it> 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.

Old-Jack

unread,
Sep 26, 2001, 9:27:22 AM9/26/01
to
Roberto dal portatile <r.ma...@repubblica.it> 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.


Giuseppe

unread,
Apr 28, 2017, 4:21:36 AM4/28/17
to
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

GiorgioDaPrato

unread,
Apr 28, 2017, 8:11:31 AM4/28/17
to
con una delle funzioni di conversione:
ad es, se necessita un tipo dato long
clng(First(Mancanti.NumMancante))

Giuseppe

unread,
May 2, 2017, 6:37:17 AM5/2/17
to
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

GiorgioDaPrato

unread,
May 2, 2017, 2:11:58 PM5/2/17
to
è 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 ?

Giuseppe

unread,
May 3, 2017, 12:07:11 PM5/3/17
to
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
0 new messages