Newsgroup: it.comp.appl.access
Titolo: .... cercare un BUCO !

:-) per non fraintendere.
Un saluto a tutti.
Ho una tabella in cui i records sono consecutivi
cioè oltre all'id c'è un campo numerico chiamato "Numero"
e questo campo contiene un valore crescente.
Se cancello un record, es. quello in cui il campo numero
contiene il valore 40, mi ritrovo un buco tra 39 e 41.
Ha provato varie soluzioni, senza naturalmente risolvere
il problema.
Qualche consiglio?
Grazie
Paolo

 Paolo
prego.
Ciao,
Max

 Paolo
prego.
Ciao,
Max
----------------
Grazie, addesso vado a vedere.
Paolo

Paolo Dal Bosco ha scritto:

Io farei un ciclo sul campo del RS (Numero), e per trovare il buco ti
basta
memorizzare il valore precedente e sottrarlo all'attuale, se la
differenza>1 c'è un buco.
Function CercaBuco() as Long
     Dim rs as DAO.Recordset
     Static prevN as variant
     prevN=null
     Set rs=Currentdb.Openrecordet("SELECT Numero FORM T1",dbreadOnly)
     If rs.eof then cercaBuco=0:exit function
     Do until rs.Eof
          If prevN<>Null then
               If (rs!numero-prevN)>1 then exit do
          end if
          prevN=rs!numero
          rs.movenext
     Loop
     CercaBuco=PrevN+1
     rs.close
Exit Function
@Alex

 Paolo
Io farei un ciclo sul campo del RS (Numero), e per trovare il buco ti
basta
memorizzare il valore precedente e sottrarlo all'attuale, se la
differenza>1 c'č un buco.
Function CercaBuco() as Long
     Dim rs as DAO.Recordset
     Static prevN as variant
     prevN=null
     Set rs=Currentdb.Openrecordet("SELECT Numero FORM T1",dbreadOnly)
     If rs.eof then cercaBuco=0:exit function
     Do until rs.Eof
          If prevN<>Null then
               If (rs!numero-prevN)>1 then exit do
          end if
          prevN=rs!numero
          rs.movenext
     Loop
     CercaBuco=PrevN+1
     rs.close
Exit Function
@Alex
--------------------
basta ed avanza, č che i record set mi sono antipatici
cerco sempre di evitarli, mi dovrň mettere d'impegno
e una buona volta imparmeli bene.
Grazie.
Paolo

 ha scritto nel messaggio
news:1157117475.2...@b28g2000cwb.googlegroups.com...
Paolo Dal Bosco ha scritto:



@Alex
----------------------------
scusami se rompo, non ne vuol saper di escire per >1.
ho aggiunto un debug.print
          -----
          End If
          Debug.Print rs!numero & "-" & prevN <----------
          prevN = rs!numero
          rs.MoveNext
     Loop
         ------
che mi dà:
1-
2-1
4-2   <------- dovrebbe uscire quì ma non ne vol sapere
5-4
6-5
7-6
Ciao
Paolo


ho provato a passare i valori  rs!numero e prevN
a due variabili a e b dim as integer
ed il
Debug.Print "-" & a & "-" & b & "-"
mi dà:
-0-0-
-0-0-
-0-0-
-0-0-
-0-0-
-0-0-
ho varie trasformazioni, ma senza risultato.
Ciao
Paolo

 > @Alex

Paolo Ciao.
C'era un errore nella determinazione del valore NULL, secondo me
dovresti
provare a fare un po di debug, seguendo passo passo la funzione, in
questo caso
l'avevo scritta senza provarla....., ma se invece di usare solo il
Debug.Print verifichi
passo passo con i BreakPoint e F8 ti accorgi meglio del perchè certe
cose non vanno..
Function CercaBuco() As Long
     Dim rs As DAO.Recordset
     Static prevN As Variant
     prevN = Null
     Set rs = CurrentDb.OpenRecordset("SELECT CampoNumerico FROM T1",
dbReadOnly)
     If rs.EOF Then CercaBuco = 0: Exit Function
     Do Until rs.EOF
          If IsNumeric(prevN) Then
               If (rs!CampoNumerico - prevN) > 1 Then Exit Do
          End If
          prevN = rs!CampoNumerico
          rs.MoveNext
     Loop
     CercaBuco = prevN + 1
     rs.Close
End Function
Ho creato una tabella con :
1
2
3
4
6
7
8
Mi restituisce:
5
Ciao
@Alex

[Cut]
Ciao
@Alex
-----------------
mille grazie, Alex
ora funziona.
Ciao, buona serata
Paolo

la funzione è estremamente interessante, perchè da quello che vedo
non dovrebbe dare possibilità ad un campo di tipo progressivo numerico
di rimanere con valori Null, una cosa mi chiedo e vi chiedo, ma dove la
posso richiamare questa funzione?
Cioe' se sull'evento click di un command faccio partire prima ancora di
alcune query di inserimento una funzione che mi restituisce il
progressivo attraverso il select1+max, prima ancora che questa funzione
mi restituisca il progressivo dovrebbe fare un controllo per verificare
che non ci siano "Buchi", se non c'e' ne sono mi assegna il progressivo
se invece c'e' ne mi assegna il Tappa Buco, e sino a qui ci siamo, ma
dove la piazzo la funzione cerca buco?
si potrebbe fare un qualcosa del tipo :
Privatre sub Commad1_Click()
CercaBuco
Progressivo
ecc.
ecc
ecc
end sub
considerando che progressivo e la funzione che mi restituisce il valore
numerico maggiorato di 1.
grazie
saluti
Diego

 ha scritto nel messaggio
news:1157361464....@b28g2000cwb.googlegroups.com...



ecc.
ecc
ecc
end sub

grazie
saluti
Diego
--------------------
io l'inserita per mia utilità in apertura maschera,
comunque la puoi inserire dove vuoi.
resituisce esattamente il valore mancate
(se il buco è fra 3 e 5 restituisce 4, cioè 3+1)
Ciao
Paolo

diego ha scritto:

Se lavori in monoutenza va bene su apertura, se lavori in Multiutenza
fose è rischioso
e sarebbe meglio il BeforeUpdate di Form...!
@Alex

 @Alex
In effetti Alex ha centrato il punto, il Db lavora in multiutenza, è
diviso in B.E ed F.E.
ed inoltre l'inserimento dati della form in questione si basa su query
di inserimento e aggiornamento essendo Forms non associate, per questo
chiedevo come potevo collocare la funzione sull'evento click del
command, dal momento che l'evento BeforeUpdate non funziona su una Form
non associata.
Grazie
Saluti
Diego

diego ha scritto:

Su form non associate generalo prima di eseguire la Query, ci sarà
bene un pulsante che
esegue il SALVA del Record....!!!!!!
@Alex

 @Alex
si che c'e'... :=))
Grazie
Saluti
Diego

 @Alex
e se volessi fare di questa function una public function come dovrei
modificarla?
cioe' devo pur passargli dei parametri, da cosi:
Function CercaBuco() As Long
     Dim rs As DAO.Recordset
     Static prevN As Variant
     prevN = Null
     Set rs = CurrentDb.OpenRecordset("SELECT Numero FROM Tabella",
dbReadOnly)
     If rs.EOF Then CercaBuco = 0: Exit Function
     Do Until rs.EOF
          If IsNumeric(prevN) Then
               If (rs!Numero - prevN) > 1 Then Exit Do
          End If
          prevN = rs!Numero
          rs.MoveNext
     Loop
     CercaBuco = prevN + 1
     rs.Close
End Function
dovrebbe diventare tipo così:
Function CercaBuco(Numero as Integer, Tabella as string)
     Dim rs As DAO.Recordset
     Static prevN As Variant
     prevN = Null
     Set rs = CurrentDb.OpenRecordset("SELECT Numero FROM Tabella",
dbReadOnly)
     If rs.EOF Then CercaBuco = 0: Exit Function
     Do Until rs.EOF
          If IsNumeric(prevN) Then
               If (rs!Numero - prevN) > 1 Then Exit Do
          End If
          prevN = rs!Numero
          rs.MoveNext
     Loop
     CercaBuco = prevN + 1
     rs.Close
End Function
solo che la query non va come cacchio gli do il parametro numerico alla
query?
"SELECT" & Numero & FROM" & Tabella ?
quando faccio eseguire la funzione tramite la finestra immediata mi
dice : ERRORE DI COMPILAZIONE: TIPO NON CORROSPONDENTE PER L'ARGOMENTO
BYREF
è evidente che il parametro numerico non lo passo nel giusto modo no??
Saluti
Diego

pero' se il valore lo passo come stringa mi funziona alla perfezione
questa e' la modifica:
Public Function CercaBuco(Numero As String, Tabella As String)
     Dim rs As DAO.Recordset
     Static prevN As Variant
     prevN = Null
     Set rs = CurrentDb.OpenRecordset("SELECT (" & Numero & ") AS New
FROM " & Tabella, dbReadOnly)
     If rs.EOF Then CercaBuco = 0: Exit Function
     Do Until rs.EOF
          If IsNumeric(prevN) Then
               If (rs!New - prevN) > 1 Then Exit Do
          End If
          prevN = rs!New
          rs.MoveNext
     Loop
     CercaBuco = prevN + 1
     rs.Close
End Function
ma per quale cavolo di motivo non mi funziona con il numerico?
Saluti
Diego

diego ha scritto:

Diego mi pare tu stia facendo molta confusione.....!!!
Supponiamo tu voglia generalizzare la funzione, che parametri devi
rendere disponibili
alla personalizzazione...?
A mio avviso(anche se mi pare poco utile questa cosa...) 2:
1° NomeTabella
2° NomeCampo
Entrambi sono Nomi e di conseguenza STRINGHE....! Con le quali devi
ricostruire
il predicato SQL in modo corretto e si usano le parentesi QUADRE e non
TONDE:
Function CercaBuco(NumeTabella as string, NomeCampo as String)
     Dim rs As DAO.Recordset
     Dim sSQL as string
     Static prevN As Variant
     prevN = Null
     sSQL="SELECT [" & NomeCampo & "] FROM " & NomeTabella & " ORDER BY
[" & NomeCampo & "]"
     Set rs = CurrentDb.OpenRecordset(sSQL,dbReadOnly)
     If rs.EOF Then CercaBuco = 0: Exit Function
     Do Until rs.EOF
          If IsNumeric(prevN) Then
               If (rs!Numero - prevN) > 1 Then Exit Do
          End If
          prevN = rs!Numero
          rs.MoveNext
     Loop
     CercaBuco = prevN + 1
     rs.Close
End Function
E' importante anche ORDER BY per avere la certezza di trovare il 1°
buco reale....!
@Alex

 Diego mi pare tu stia facendo molta confusione.....!!!
INFATTI...ERO PIU' CONFUSO CHE PERSUASO!!
ADESSO LA COSA E' CHIARA PERO'
COME SEMPRE NON HO PAROLE PER RINGRAZIARTI!!
Saluti
Diego