Newsgroup: it.comp.appl.access
Titolo: Query random!! (casuale)

Salve a tutti,
ovviamente ho un problema che non riesco a risolvere!! Vi spiego brevemente:
Supponendo di avere una tabella contenente 100 record, è possibile fare una
query che estrapoli solo 50 records e soprattutto in modalità random
(casuale)!!, cioè ogni volta che la query viene lanciata dovrebbe restituire
i 50 record ogni volta in ordine diverso e casuale!!
Spero che esista un modo per farlo, aspetto come sempre vostri suggerimenti
Grazie in Anticipo
Peppe


Con una query direi proprio di no (attendo smentite).
Puoi sempre farlo da codice, aprendo un recordset e leggendo in modo casuale
50 record, memorizzandoli in un'altra tabella, se ti servono x lavorarci
sopra.
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com

Silvio Berruti <s...@LEVAlibero.it> wrote in message
Zaui7.18649$%a4.7...@news.infostrada.it...

Grazie per aver risposto
avevo intuito che con una query non è possibile farlo
ma come si fa via codice a leggere record in modalità random?
Io proprio non ci sono riuscito
Grazie
Peppe

 Io proprio non ci sono riuscito
Studiati questa routine di esempio (da inserire in un modulo) e modificala
come ti serve:
Public Sub CopiaRecordRND()
  Dim db As Database
  Dim rsl As Recordset, rss As Recordset
  Dim fld As Long, cnt As Long, casuale As Long
  Set db = CurrentDb
   'definisco il 1° recordset
  Set rsl = db.OpenRecordset("Tabella1", dbOpenDynaset)
   'definisco il 2° recordset
  Set rss = db.OpenRecordset("Tabella2", dbOpenDynaset)
   'operazioni necessarie x AbsolutePosition
  rsl.MoveLast
  rsl.MoveFirst
   ' x 50 volte
  For cnt = 1 To 50
    'genero un numero casuale tra 0 e 99
    casuale = Int(100 * Rnd)
    'mi posiziono sul record casuale di Tabella1
    rsl.AbsolutePosition = casuale
    With rss    'cioè in Tabella2
      .AddNew    'aggiungo un nuovo record
      'e copio tutti i campi ma il 1° lo salto xché contatore
      For fld = 1 To rsl.Fields.Count - 1
         'copio i campi
        rss(fld) = rsl(fld)
      Next
      .Update    'quindi memorizzo in Tabella2
    End With
  Next
  'chiudo i recordset
  rsl.Close: rss.Close
  Set rsl = Nothing
  Set rss = Nothing
  Set db = Nothing
End Sub
NB.
- Tabella1 è la tabella di origine dei dati e Tabella2 quella di
destinazione dei 50 record casuali;
- Tabella2 deve essere già creata, con la stessa struttura di Tabella1,
possibilmente vuota, se non desideri accodare i 50 record a degli altri già
esistenti;
- se utilizzi A2000/2002 dovrai inserire il riferimento al DAO prima di
quello di ADO;
- ho supposto che il 1° campo fosse un contatore in entrambe le tabelle. Se
volessi avere riportato lo stesso valore del contatore, dovresti definire il
corrispondente campo di Tabella2 come numerico Long;
- se qualcosa non ti è chiaro, fammelo sapere.

Silvio Berruti <s...@LEVAlibero.it> wrote in message
I2Si7.27091$%a4.10...@news.infostrada.it...

Grazie Silvio, sei stato gentilissimo! ora studio quello che mi hai scritto.
Ti farò sapere cosa ho combinato e se ci sono riuscito!
Ciao
Grazie ancora!
Peppe

 >
CUT---

CUT____
Ok Silvio, questo pezzo di codice è così lineare che pure essendo io uno che
non ne capisce affatto di VB, ho esclamato: come ho fatto a non pensarci!
I problemi sono arrivati alla "messa impiega" di questo codice!
Avrai intuito che sono un neofita e per questo ti chiedo scusa e ti
ringrazio per la pazienza (mi permetto di darti del tu!).
In prima istanza ho copiato e incollato brutalmente il codice cambiando
esclusivamente il nome delle tabelle 1 e 2, questo l'ho inserito in un
evento onClick() di un pulsante!!
Ecco cosa succede quando lo premo:
mi segnala un errore di questo tipo:
Errore di run-time '13' Tipo non corrispondente e mi evidenzia questa riga
Set rsl = db.OpenRecordset("Tabella1", dbOpenDynaset)
Premetto che prima di arrivare a questo ci sono state altre vicissitudini
(non sapevo che dovevo importare altre dll) ma dopo un po ci sono arrivato!!
A questo punto seguendo il tuo codice me ne sono creato uno più snello:
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tabella1")
rs.AddNew
rs("campo1") = "prova"
rs.Update
rs.Close
Set db = Nothing
Nella mia mente questo codice doveva:
Aprire un recordset su tabella1,
prepararlo ad aggiungere un record 'prova' al campo 'campo1'
aggiornarlo
rilasciare le risorse.
Ma questo funziona solo nella mia mente!!!
l'errore restituito e sempre lo stesso:
Errore di run-time '13' Tipo non corrispondente e mi evidenzia questa riga:
Set rs = db.OpenRecordset("tabella1")
Sinceramente non so da cosa possa dipendere
P.s Uso Access 2000 (spero che non dipenda dai riferimenti DAO e ADO perchè
ho capito poco)
Aspetto una tua risposta, sperando di sincerarmi sulle mie capacità mentali
Grazie
Peppe

 I problemi sono arrivati alla "messa impiega" di questo codice!
Mah, credo volessi scrivere "messa in piega"

Sì, credo che dipenda dal fatto che usi A2000, mentre io uso A97.
Come potrai evincere da alcune centinaia di messaggi del NG su A2000 e
ADO/DAO, si parla di posporre nei riferimenti quelli di ADO a quelli di DAO.
Cioè
Apri un modulo, menu Strumenti, Riferimenti, e lì dovresti trovare checkato
Microsoft DAO 3.x ... che si trova sotto al corrispondente in ADO:
semplicemente inverti la loro posizione, prima DAO, poi ADO.
Oppure, guarda sull'help voci come ADO.Database, se ricordo bene, e converti
opportunamente il mio codice.
In realtà, il codice postato era da inserire, tale quale, in un modulo (hai
presente nella finestra database quella strana voce con su scritto Moduli?),
e potevi richiamarlo da qualsiasi parte del tuo DB come se fosse un comando
aggiunto di Access.
Infatti, su click del pulsante, bastava scrivessi
CopiaRecordRND
e il gioco era fatto, ma forse è lo stesso.
