Newsgroup: it.comp.appl.access
Titolo: Record che si ordinano per conto loro?

Questa è la storia di un lungo dramma con finale semilieto.
Ho una tabella che si chiama "parole", contenente al momento 250
record, e con i seguenti campi fra altri:
id = codice identificativo
parziale = valore incrementale di numeri in precisione doppia (la
ragione è che ho una progressione logaritmica).
In un modulo di una maschera ho un ciclo di scelte, avviato per
verificare la bontà del mio codice, ed ecco cominciare i guai.
Dopo il comando Randomize, una funzione Rnd mi dà un numero casuale,
definito così:
   Dim caso as Double
e l'istruzione
   num = DLookup("[id]", "parole", "[parziale] >= " caso)
dovrebbe mettermi nella variabile "num" che è un Integer il codice id
(Integer anche lui) del record scelto casualmente. Però mi esce un
errore di sintassi perché ad Access97 pare non piaccia la virgola
contenuta in "caso".
Quindi ho spezzato "caso":
    Dim intero As String
    Dim resto As String
    Dim strca As String
    strca = Str(caso)
    intero = Str(Int(caso))
    resto = Right(strca, Len(strca) - Len(intero) - 1)
e modificato così:
    num = DLookup("[id]", "parole", "[parziale] >= " & intero & "." &
resto)
Per verificare le estrazioni ho aggiunto la seguente istruzione:
    DoCmd.RunSQL "UPDATE parole SET volte = volte + 1 WHERE id = " &
num & ";", False
che incrementa il campo "volte" di tipo Integer della tabella.
Sorpresa: mentre la maggior parte dei record è estratta in accordo con
le previsioni, su diecimila cicli il record n. 86 è estratto anche
1400 volte, mentre i 42 record precedenti non sono estratti mai.
Tralascio la cronaca dei tentativi dovuti al sospetto che ci fosse un
errore nel programma, e giungo al dunque: quando ho provato a togliere
alcuni record, o rinumerarli, o con l'aggiunta di un campo contatore o
eliminando il campo "id", è risultato che l'ordine veniva:
record 1-43, 86-166, 44-85, 167-250
alla faccia dell'indicizzazione sul campo "id" che è un Long (perché
sono allergico ai contatori).
Per risolvere il problema non è bastato fare una copia della struttura
tabella e poi riscriverci i record, se non specificavo l'ordinamento
crescente sul campo "id" (ripeto: indicizzato).
A questo punto preciso:
- i record sono stati inseriti nell'ordine dell'id.
- avevo messo un'altra indicizzazione, poi eliminata, su un campo che
comunque non poteva essere nell'ordine balordo.
- non ricordo quanti record ho inserito ogni volta, ma certo l'ho
fatto in più di quattro fasi.
Sembra però che ci fosse un ordinamento che supera quello dei campi
indicizzati, e sia quello ad essere usato dalla funzione DLookUp per
cercare la prima ricorrenza di un criterio.
Questi fatti hanno prodotto un diradamento capillare, esplosioni di
coprolalìa e folli spese in libri (non di informatica) da acquirente
compulsivo qual sono. Vorrei evitare che Access conducesse nella fossa
anche il mio secondo piede (il primo c'è finito quando acquistai lo ZX
Spectrum, che pure ho amato).
Siccome la cosa non si ferma qui, perché dovrò aggiungere altri
record, non ho voglia di fare periodiche verifiche per controllare
l'ordine di ogni registrazione, e poi potrebbe usarlo anche qualcun
altro, vorrei sapere cosa caspiteronzola è successo, perché, e
soprattutto come evitarlo.
Un saluto a tutti e ringraziamenti anticipati.
Riccardo Baldinotti

 e modificato così:










La situazione non mi è proprio chiarissima ma mi pare di capire che i
problemi siano due, l'ordinamento e la selezione casuale.
L'ordinamento di una tabella non dipende dagli indici, viene salvato ogni
volta che lo modifichi a mano e rispondi Sì quando ti chiede se salvare le
modifiche al layout per cui per quanti indici usi i dati appariranno
sempre nell'ordine che hai stabilito l'ultima volta.
10.000 test mi sembra un numero sufficiente a produrre risultati
significativi, e il fatto che uno dei record venga selezionato molte più
volte degli altri può dipendere dalla non lineare distribuzione dei valori
nel campo [parziale] e dal criterio che usi nella dlookup, "[parziale] >=
" numero, che non è un criterio ben preciso. Dato che il criterio non
individua un solo record costringi la dlookup a scegliere uno tra i tanti
record che soddisfano il criterio. Prova ad usare dfirst o dlast che, come
specificato nell'help, pescano record a caso nella tabella.
Io però userei un altro sistema: un campo progressivo senza vuoti che ti
consenta di scegliere ogni volta uno solo dei record senza doverti basare
per forza sul campo [parziale], e che dovrebbe distribuire più
uniformemente i risultati:
numrecord=dcount("*","tabella")
for i=1 to 10000
  randomize timer
  num=int(numrecord*rnd())+1
  .....
next
Fantastico lo ZX Spectrum, io ho imparato a programmare lì!
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Namor
Io CREDEVO di aver imparato a programmare lě...
Saluti e grazie
Riccardo