Newsgroup: it.comp.lang.visual-basic
Titolo: aiuto

Scusate ma non sapevo che oggetto mettere...
il problema che volevo porvi è il seguente:
io prendo da un database una serie di record che possono avere valori 0,
1, 2, 3. 
Dato un certo numero di punti, per esempio 1000, devo togliere valori dai
record fino ad esaurire i 1000 punti.
tutto questo va fatto però togliendo in primo luogo più valori dai recrd
che ne hanno 3, poi da quelli che ne hanno due ed infine qualcuno da
quelli che ne hanno 1.
Posso tranquillamente togliere 3 punti in un sol botto ad un record,
oppure toglierne solo 1 o 2...
ovviamente non ne posso togliere 3 a chi ha solo 2 punti...
Spero di esser stato chiaro.
Il problema è, come posso privilegiare quelli che hanno 3 e 2 punti
rispetto a quelli con 1 durante la sottrazione punti??
grazie
-- 
Claudio
http://www.sullacollina.altervista.org
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 rispetto a quelli con 1 durante la sottrazione punti??
Crea il recordset con "SELECT * FROM TuaTabella ORDER BY Punti DESC", ne 
prendi uno alla volta e sommi i punti ottenuti fino a 1000, con un controllo 
che se superi il 1000 dall'ultimo record togli solo la quantita necessaria 
ad arrivare a 1000.

Iuza Delle Nuvole ha scritto:


Mi ero dimenticato di dire che devo seguire un andamento pressapoco
casuale...favorendo ovviamente quelli che ho specificato sopra, ma non
togliendoli definitivamente a tutti, cioč un po' di quelli che hanno 3
punti dovranno essere diminuiti, un po' meno per quelli con 2, un po' meno
ancora per quelli con 1...
non devo semplicemnte prenderli e sottrarre ma devo fare il tutto in
maniera casuale ma guidata...


per una diminuizione "mirata" (cioe' togli (ma non tutto) a chi ne ha di +) 
devi scorrere il recordset + volte fino a che hai raggiunto il 1000.
- trova il valore max
- togli la quantita desiderata ai record con valore max e la stessa qta' la 
aggiungi al totale dei punti tolti
- ricominci fino che hai raggiunto i punti tolti desiderati
Se vuoi che i punti vengano tolti "casualmente" sottrai al record un rnd sui 
punti disponibili - 1
Okkio che se i punti ed i record sono tanti potrebbe essere lento scorrere 
il recordset un numero imprecisato di volte
-- 
.o0-- I.d.N. alias JYD --0o.
Please Cut "-some trees-" for reply

 maniera casuale ma guidata...
Estrai dal database quanti record bastano, ovvero
(1+punti_Da_togliere\punteggio_minimo) record.
1+1.000\1=1.001
crea un array con (1+punteggio_minimo - punteggio_massimo) elementi
(ovvero 1+3-1=3)
popola l'array con la frequenza in cui appaiono i relativi punteggi, ovvero
arr(1)=quante volte appare il punteggio 1
arr(2)=quante volte appare il punteggio 2
arr(3)=quante volte appare il punteggio 3
fatti una copia di tale array
arrCopia=arr
associa ad ogni punteggio un probabilità:
p(1)=0.1
p(2)=0.4
p(3)=0.5
calcola la probabilità cumulativa
pc(1)=p(1)
pc(2)=p(1)+p(2) oppure=  pc(1)+p(2)
pc(3)=p(1)+p(2)+p(3) oppure = pc(2)+p(3)
cicla
 estrai un numero casuale tra 0 e 1
 trova l'indice di pc() in cade il numero casuale e chiamalo prescelto
 se prescelto=1 togli uno a arr(1) e sottrai 1 a punti_Da_togliere
 se prescelto=2 togli uno a arr(2) e sottrai 2 a punti_Da_togliere
 se prescelto=3 togli uno a arr(3) e sottrai 3 a punti_Da_togliere
 in tutti casi devi avere l'accortezza di evitare che arr(x) divenga < 0:
se accade non sottrarre uno a arr(x) nè x a punti_Da_togliere
quando punti_Da_togliere=0 (oppure tutti arr(x)=0) finisce il ciclo
Adesso devi marcare/eliminare i record relativi:
arrcopia(1)-arr(1) rappresenta il numero di record con punteggio 1 da
annulare
arrcopia(2)-arr(2) rappresenta il numero di record con punteggio 2 da
annulare
arrcopia(3)-arr(3) rappresenta il numero di record con punteggio 3 da
annulare
semplice, no?
termoPilucco
-- 


 Estrai dal database quanti record bastano
[cut]
E se il db ti restituisce solo record con punteggio minimo?
Ciao
Alberto

 E se il db ti restituisce solo record con punteggio minimo?
Sě, avevo sbagliato un'ipotesi.
Tutta la prima parte si risolve estraendo il count(punti) group by punti e
piazzandolo nell'array arr().
arr(1)=count(punteggio=1)
arr(2)=count(punteggio=2)
arr(3)=count(punteggio=3)
Cosě non č nemmneo necessario estrarre 1000 record.
