Newsgroup: it.comp.appl.access
Titolo: Restituire l'ordine ESATTO

Ciao a tutti,
Ho una query tipo "SELECT * FROM Users". Devo estrarre *casualmente* 3
utenti dalla tabella, quindi prima mi calcolo 3 numeri casuali e poi
aggiungo un WHERE, tipo "SELECT * FROM Users WHERE ID=7 OR ID=2 OR ID=5".
Il problema è che mi vengono restituiti correttamente gli utenti 7, 2 e 5,
ma SEMPRE nell'ordine 2, 5, 7, in sostanza mi vengono sempre restituiti
ordinati. Io voglio riceverli nell'ordine che ho specificato e cioè 7,2,5.
C'è qualche modo per fare ciò?
Grazie,
poi

 ha scritto nel messaggio
news:gpSX9.69845$0v.21...@news1.tin.it...

Ciao, una soluzione potrebbe essere la queri di unione
SELECT * FROM Users WHERE ID=7
UNION ALL
SELECT * FROM Users WHERE ID=2
UNION ALL
SELECT * FROM Users WHERE ID=5
Ciao Giorgio



crea un campo numerico da chiamare ordinamento, valorizzato in senso
crescente secondo l'ordine che hai scelto e ordina la tabella secondo questo
campo.
puoi anche usare una seconda tabella collegata.
Sib

 SELECT * FROM Users WHERE ID=5
Grazie per la risposta, ma il numero di record da estrarre casualmente non è
fissato, può variare da 1 a 200 (lo sceglie a runtime dall'utente). Quindi
mi immagino una query composta da 200 sottoquery... come sarà lenta!
poi

 campo.
Vero, ma dovrei riempire un altro campo e quindi perderei qualcosa in fatto
di prestazioni... (ogni volta che chiedo n record casuali dovrei aprire la
connessione in scrittura, scrivere i valori del nuovo campo, e poi
recuperare i record ordinati correttamente)...
poi

 ha scritto nel messaggio
news:XFTX9.70313$0v.21...@news1.tin.it...

Per il motore č un batter di ciglia...piů difficile a dirsi che a farsi.
Un'altra soluzione č quella di accodare i risultati in una tabella di
appoggio.
Lo puoi fare con un ciclo...per ogni ID selezionato...accodi un record e poi
usi questa tabella per visualizzare il risultato.
Ciao, Carlo


1) bada che la risposta di giorgio era esemplificativa, nel senso che
id=[valore casuale].
2) Le union non sono sottoquery 
3) in riferimento alla velocita'
fare una cosa del genere 
select * from tab
   where campo = "a" or "b" or "c"
puo' in certi casi essere piu' lento delle union(s)
4) Si puo sempre aprire un recordset e pescare attraverso la
"absoluteposition"
 (che ti salva pure da eventuali buchi dell'id)
--
a.cara 
Togli qualcosa dall'email

 id=[valore casuale].
o riletto il post, i'm sorry, hai ragione puoi arrivare a 200 union,
mi do una bacchettata da solo, aahhhi!,
cassa il punto 1 (gli altri continuano a sembrarmi validi)
aggiungo visto che ci sono.
Il punto relativo al recordset puo' diventare percorribile solo se la
maschera che
mostra i dati della posizione non e' di tipo foglio dati 


 puo' in certi casi essere piu' lento delle union(s)
Grazie per la risposta. Riguardo a questo punto, sei sicuro che questa query
č piů lenta delle unions? Dove posso trovare qualche informazione in piů,
magari proprio sul confronto di prestazioni?
Grazie,
poi

 ha scritto nel messaggio
news:XFTX9.70313$0v.21...@news1.tin.it...

perche', quanto tempo pensi che ci voglia?
Sib

 perche', quanto tempo pensi che ci voglia?
Beh, premetto che č un'applicazione webbased in ASP, per cui dovrei aprire
una nuova connessione in scrittura (altrimenti andrebbe benissimo in sola
lettura, solo per recuperare i record), quindi se ho alcuni utenti in
contemporanea Access con le connessioni in scrittura inizia a tirare le
cuoia... Quindi se decido di estrarre 200 records, dovrei prima salvare 200
valori e poi fare la query SQL che mi recupera i record ordinati. Secondo me
č un carico di lavoro non indifferente per Access, soprattutto con piů
utenti in contemporanea...
Ciao,
poi

 utenti in contemporanea...
visto che e' ASP, una curiosita', cosa intendi per "utenti in
contemporanea"?
scusa sib se mi riintrometto
io la farei cosi'
open connection
open recordset table
get numero
do while numero
	rst find "ID=" & numero
	response write
	get next numero
loop
recordset nothing
connection nothing
se table e' contenuta
se ID e' indice e table non e' contenuta conviene fare 200 select
o una query con 200 union


 scusa sib se mi riintrometto
ci mancherebbe!
e poi non ho mai usato asp quindi non ho esperienza pratica.
Sib

 o una query con 200 union
Ho scoperto che con SQL esiste un'istruzione apposita che ritorna un numero
di record casuali e quindi risolverebbe il problema. Per Access, il tuo
codice è giusto, però essendo con ASP, tu tieni "impegnata" la connessione
per un po' di tempo (tutto il ciclo while) e le regole dicono di liberare le
connessioni sempre il prima possibile... Vabbé, mi sa che per il momento mi
tengo i record ordinati da Access! :-)
Grazie per la risposta!
poi

 di record casuali
la cosa mi ha incuriosito,
ti spiacerebbe dirmi quale
molti thankyou
g

 codice è giusto, però essendo con ASP, tu tieni "impegnata" 
oggi sono polemico.
Ma ti risulta che "response.write" e' access a me me pare  un oggetto
ASP. 
Per caso nello "pseudocodice" la connessione veniva utilizzata piu' del
tempo dovuto?
Non hai fatto accenno alla mia curiosita'
Che intendi per "utenti in contemporanea"?
mi capita di aver giocato con questo
http://orchidee.blunet.it/guccini/index.asp


 ti spiacerebbe dirmi quale
Se devi selezionare 3 record casuali:
SELECT TOP 3 *
FROM Users
ORDER BY NEWID()
Ciao,
poi

 
http://orchidee.blunet.it/guccini/index.asp
Nel senso che l'hai fatto tu?
Ciao,
poi

 poi


 ha scritto nel messaggio
news:gpSX9.69845$0v.21...@news1.tin.it...

Ciao poi,
Partendo dallo stesso concetto della funzione  NEWID() di Sql server  prova
questa query.
SELECT TOP 3 CLng(Rnd([Id])*10000) AS Ordinamento,*
FROM Users ORDER BY CLng(Rnd([Id])*10000);
Ciao Giorgio.

 news:gpSX9.69845$0v.21...@news1.tin.it...
o meglio
Sql Server
SELECT TOP 3 *
FROM Users
ORDER BY NEWID()
Access
SELECT TOP 3 *


 MEGACUT
Non discuto, è ovviamente giusto quello che scrivi. Ma io mi preoccupo
proprio della contemporaneità delle connessioni, esempio: ho realizzato
una'applicazione ASP che girava in una intranet, in un'aula con 30 PC. Non
appena il formatore dava l'ok, gli utenti dovevano premere un pulsante e
partiva l'applicazione; la prima cosa che doveva fare era interrogare un db
MDB per ricavare alcuni dati casuali; ebbene, gli utenti massimi erano 30,
nel tuo esempio dici ben 30.000 accessi, ma non ti dico quante volte il
sistema si impastava perché Access non reggeva... E sì che gli utenti erano
solo 30... Quindi ve bene il tuo discorso, ma non bisogna generalizzare. Se
prendiamo la tua applicazione 
http://orchidee.blunet.it/guccini/index.asp
 la
mettiamo in una intranet (riduciamo i tempi morti del browser, modem, etc) e
ci accediamo insieme con un po' di persone, scusami ma qualunque
applicazione basata su Access muore (a meno che non abbia controlli
specifici per questo).
Ciao,
poi

 ORDER BY CLng(Rnd([Id])*10000)
Hey, grazie! Adesso provo!
Ciao,
poi

 MDB per ricavare alcuni dati casuali; ebbene, gli utenti massimi erano 30,
quello che scrivi e' corretto e' evidente che in questo caso il sistema
si "impasta". Il sottoscritto in un caso del genere avrebbe fatto cosi'
(mi hai detto che sei in sola lettura)
su evento di start dell'oggetto application
    carico il recordset (1000/2000 una sciocchezza) su un array
multidimensionale o su array n array e lo associo all'oggetto
application. Chiudo il recordset e non lo uso piu'
sulla chiamata da client mi genero i numeri ed accedo all'array(s)  su
application via indice
quando sono pronto con il mio software fermo  un attimo l'iis e lo
faccio ripartire
(l'oggetto application viene generato allo startup di IIS)
(una cosa del genere l'ho fatta per l'archivio dei comuni d'italia per 
una applicazione su vpn con circa 10000 terminali)
In quel caso nella rara ipotesi dell'aggiornamento della tabella 
comuni riaggiornavo l'oggetto application mandando segnalazioni, 
laddove arrivavano richieste, di sistema non disponibile 
(questo per eccesso di zelo)
Ho visto che giorgio ti ha risolto il problema del newid() per access.
Badaben badaben badabene che anche quello apre l'intera tabella anche se
e' sicuramente un metodo "veloce", e non ti salva dal problema
dei 30 accessi "praticamente" contemporanei. Quello dell'oggetto
application si


 application si
Vero, ma per questo progetto non sono in una intranet, ma su un server
condiviso e non gli posso chiedere di stoppare e riavviare! :-) Del resto
non posso usare session perché i cookies sono disabilitati.
Ciao,
poi

 poi
uffi. E mandaglielo in crash. Prima o poi lo avvieranno no? Se glielo
vuoi mandare i crash basta che non chiudi i recordsets, dopo un po
succede un casino. Certo rischi la sodomizzazione. pero'.
Chi mai ha parlato di session? e di cookies? se non per questioni
esplicative.
I cookies sono disabilitati. Dove? In genere la disabilitazione dei
cookies e' lato client.
Mi dirai che presumibilmente non ti faranno mettere le mani nel
global.asa, perche' e li' che va inserito il caricamento dell'oggetto
application. Rispetto al TOP. La select prima fa i conti su "tutti" i
record e "poi" (ehehhehe)  ti restituisce i primi 3.
Ragiona, per restituirti i primi 3 "deve" prima capire quali sono i
primi tre e lo sa solo dopo averli letti ed ordinati. Qui solo uno ha la
palla di vetro e non ne il sottoscritto ne l'SQL


 Togli qualcosa dall'email
Ciao Alessandro scusa se mi intrometto.
La select giustamente prende in esame tutti i record della tabella in
oggetto e restituisce i primi tre, in altro caso il metodo di estrazione
casuale non sarebbe corretto.
In Sql Server il lavoro lo esegue il server e restituisce i tre record al
client.
In Asp non dovrebbe essere la stessa cosa (anche se meno performante)  ?  il
Server Asp dovrebbe eseguire la query e restituire i tre record al client.
I questo caso se ci sono problemi di interruzione del sistema a causa del
motore di access che non supporta molti utenti l'unica soluzione è cambiare
database e passare a MSSql Server o altro Server Sql.
Ciao Giorgio.

 database e passare a MSSql Server o altro Server Sql.
giusto. Anche se ci sono metodi per serializzare le richieste. E poi,
magari,
uno si deve adattare con quello che ha ;<)


 uno si deve adattare con quello che ha ;<)
Eh, sì, io l'avrei fatto su SQL ma loro (il cliente) hanno scelto Access
(costa meno!).
poi

 Togli qualcosa dall'email
Ciao Giorgio.

 Forse mi faccio ingannare dal nome "Active Server Pages" ?
ma?!, ASP e' una tecnologia che mette a disposizione alcuni oggetti, il
linguaggio
helper e' o vbscript o jscript, rigorosamente "interpretati" 
(escludendo la nuova piattaforma .net, di cui so praticamente nulla ma
che, voci di corridoio mi dicono, o e' quello che ho capito, puo'
integrare anche c#), questo non 
dovrebbe incidere piu' di tanto sulle prestazioni. A sua volta ASP non
e' altro che 
l'helper di IIS il quale quando trova l'estensione .asp lo fa
intevenire.
Per estensione si potrebbe dire che ASP e' un application server tipo
Tomcat
o WebSphere o WebLogic (etc..)  anche se strettamente integrato in IIS e
quindi non e'
un servizio a se stante e rispetto ai citati offre cose diverse.
ohhh, attenzione 'sta cosa che scrivo deriva dalla mia conoscenza che
ritengo
sia lo 0,0000001% del'argomento e sul quale sono anche un po' arruginito
e non
aggiornato sulle ultime evoluzioni
