Newsgroup: it.lavoro.professioni.webmaster
Titolo: [OT] asp e vbcripting mmmm errore estrazione record casuale....

ho adattato uno script di 
aspitalia.com
 per estare n record casuali da un
db.
La cosa funziona benissimo se non fosse che se la stringa di id comprende un
id inesistente... beh... lo script va in errore....
quindi avevo pensato di verificare lo script all'aggiunta di ogni id casuale
generato, e se execute mi da errore, mi cancella l'ultimo id casuale  e
riparte... ma qualcosa non va.....
posto il codice e mi scuso per la complessità, vediamos ewqualcuno di voi mi
riesca a risolver eil problema....:
<%
' numero massimo di record casuali
n = 15
' query SQL
strSQLMax = "SELECT Max(IDquestion) as MaxVal FROM questiongeneral"
strSQL = "SELECT * FROM questiongeneral Where IDquestion IN ("
' apertura conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open MM_QuestionConnect_STRING
' estrai valore massimo
Set rs = conn.Execute(strSQLMax)
intMax = rs("maxVal")
rs.Close
set rs = Nothing
' genera valora casuale
Randomize()
for i = 1 to n
   intRandom = CInt ((Rnd() * intMax) + 1)
   strRandom = intRandom & "," & strRandom
next
' tolgo l'ultimo carattere
strRandom = Left(strRandom, Len(StrRandom)-1)
' estrai record
Set rs = conn.Execute(strSQL & strRandom & ")")
response.Write(strRandom)
for i = 1 to n
response.Write(i&") "&rs.Fields.Item("title").Value & "<br>")
   rs.MoveNext
next
rs.Close
set rs = Nothing
' chiusura conn
conn.Close
set conn = Nothing
%>
io avevo inserito ma non va.,.. va in timeout!
<%
for i = 1 to n
   intRandom = CInt ((Rnd() * intMax) + 1)
   strRandom = intRandom & "," & strRandom
Set rs = conn.Execute(strSQL & strRandom & ")")
if not rs.eof OR not rs.bof then
  strRandom = Left(strRandom, Len(StrRandom)-1)
  i= i - 1
end if
next
%>

 %>
Premetto che non ho testato lo script ma l'ho solo letto quindi non so se il
resto è corretto
Secondo me va in errore perchè hai sbagliato l'if, perchè se tutto va bene e
l'ID esiste tu decrementi i e lo togli da strRandom, mentre penso che tu
volevi fare il contrario quindi dovresti incrementarla se non ci sono
record.
la condizione giusta credo debba essere
if rs.eof then
    strRandom = Left(strRandom, Len(StrRandom)-1)
    i= i - 1
end if
Spero di non aver visto male, cosa possibilissima :)
ciao
-- 
Fabio Angela (aka Red Angel) ICQ: 95966807
http://www.redangel.it
 : il portale sulla programmazione

aggiungo anche che per estrarre 15 record casuali fai troppe chiamate al DB,
a questo punto fai prima a prenderti 30 record casuali con il metodo vecchio
e tra questi considerarne 15, funziona a patto che non ti becchi + di 15
buchi di ID, ma se la tabella non subisce molte cancellazioni e di
conseguenza è abbastanza contigua come ID non dovresti avere problemi.
In alternativa se la tabella è molto frammentata cambia metodo


next
mi sembra di capire che devi mettere insieme delle domande per qualche
test, cioè vuoi creare un test con 15 domande casuali pescate da un
calderone di domande.
con il ciclo lì sopra volendo essere pignoli non puoi essere sicuro
che i numeri generati nella quindicina siano tutti diversi, ossia
potresti - caso improbabile ma possibile - avere due o più numeri
uguali.
dovresti quindi controllare ogni volta che i numeri siano diversi.
un'altra cosa che dovresti fare per evitare di fare riferimento ad id
inesistenti (per buchi di numerazione o altro) è controllarne la
presenza nel db, cosa che dovresti per forza fare con una query.
per sveltire questo controllo ed evitare il problema di cui parlava
red, cioè troppe chiamate al db, se il set di domande da cui pescare
la quindicina non è proprio smisurato potresti usare degli array. 
diciamo che riversi *tutti* gli id delle domane in un array arrDomande
con l'apposito metodo che ora non ricordo qual è, e che carichi gli id
in un array arr15.
dim flagGiaInElenco
do until ubound(arr15) = 14 ' la numerazione parte da 0
   intRandom = clng(rnd() * ubound(arrDomande)) + 1
   flagGiaInElenco = false
   for i = 0 to ubound(arr15)
      if intRandom = clng(arr15(i)) then
         flagGiaInElenco = true
         exit for
      end if
   next 
   if not flagGiaInElenco then
      redim preserve arr15(ubound(arr15 + 1))
      arr15(ubound(arr15)) = intRandom
   end if
loop
un'altra cosa che potresti fare è settare un recordset ado di quelli
in cui il move può andare avanti e indietro e poi fai una cosa tipo:
dim numrec
numrec = rst.recordcount
' rst è il recordset di tutte le domande
for i = 1 to 15
   rst.movefirst
   rst.move 
   intRandom = clng(rnd() * numrec)
   ' anche qui ci va il controllo che il valore non ci
   ' sia già.  vedi sopra
next
-- 
dipende.

 ha scritto nel messaggio
news:bbb2pu$iio$1...@lacerta.tiscalinet.it...

mmm credo che tu abbia ragione....  ora provo.... in effetti devo estrarre
15 domande da un db di 10.000 record... che non può avere il limite che non
deve subire cancellazioni... ergo devo trovar eun metodo sicuro e veloce...
strRandom mantiene gli id delle domande selezionate, in modo che poi lo
passo alla second apagina per verificare le risposte... ho una stringa cche
posso spliattare e poi controllare....


attualmente non lo č... ma poi otrebbe diventarlo!

 next
quesato è un metodo che non mi convince...  cmq ora me lo studio per benino!

 attualmente non lo è... ma poi otrebbe diventarlo!
allora lascia perdere quel che ti ho detto e pensa ad un'altra soluzione.
ad esempio, se usi SQL potresti fare che crearti una tabella (chiamiamola
TBL per semplicità) composta da 2 campi
ID_TABELLA e ID_DOMANDA
ID_TABELLA è un numero progressivo che non avrà buchi di ID mentre
ID_DOMANDA è l'ID della tabella contenente le tue domande.
A questo punto ti crei poi 1 Trigger nella tabella delle domande, uno che
scatta nell'INSERT e uno che scatta nel DELETE
il trigger dell'insert deve inserire nella tabella TBL, un record avente
ID_TABELLA = al MAX() dell'ID_TABELLA della tabella TBL e come campo
ID_DOMANDA l'ID della domanda appena inserita
il trigger del DELETE invece inserisce, al posto dell'ID_DOMANDA che è stato
cancellato nella tabella delle domande, l'ID_DOMANDA avente l' ID_TABELLA
con il valore più alto, e poi cancella quel record (quello con ID_TABELLA
più alto) dalla tabella TBL
In questo modo riempi il buco che altrimenti si sarebbe venuto a creare, e
così hai una tabella con ID contigui che non ti danno mai problemi con il
metodo che volevi utilizzare prima
In alternativa ai trigger potresti fare quel che ti ho detto direttamente da
ASP
anche se ti pare troppo incasinato a leggerlo, a farlo è semplice (non ho il
coraggio però di rileggere ora, vado a dormire che già ieri era tardissimo
:P)
ciao


 [cut] se usi SQL potresti [cut]
come lbo giustamente mi farebbe notare, per SQL intendevo MS SQL Server :P
(o derivati, MSDE, etc...)



no... sono suaccess....
io smanetto un altro pò'... vorrei finire sto scriptino!

quesato è un metodo che non mi convince...  cmq ora me lo studio per benino!
be', diciamo che il discorso è uguale, zompare in posizioni casuali,
solo che invece di usare l'array usi un recordset.
-- 
dipende.

 io smanetto un altro pò'... vorrei finire sto scriptino!
potresti fare quel che ti ho detto lo stesso anche su access solo che al
posto di affidarti ai trigger fai tutto da codice
boh vedi tu :)
-- 



Risolto!  GRazie Rigo ed LBO!
Ho seguito la strategia proposta da rigo....

 Ho seguito la strategia proposta da rigo....
e quale sarebbe? :)


 e quale sarebbe? :)
quella di selezionare 2 o 3n record....
in effetti suun db molto grande le probabilità di errori non sono molte...
anche pechè più che cancellare, aumenteranno...
facendo un bilancio credo che sia la soluzione ottimale!

 facendo un bilancio credo che sia la soluzione ottimale!
ah ok allora è la mia :)
è che non avendo visto nessun post di rigo mi domandavo cosa avesse proposto
:P


 :P
ops.... hai ragione... scusa!