Newsgroup: it.comp.appl.access
Titolo: Elaborare 10.518.300 record = 2 GIGA ?

Vorrei elaborare tutte le combinazioni possibili del Totogol (10.518.300
considerando i numeri da 1 a 32 presi per classe 8 )
e ho copiato (adattandolo) questo codice di Roberto che aveva elaborato per
il Superenalotto.
Devo aver fatto un errore perchè mi sono ritrovato una tabella di 2 giga ,
in cui il Num1 è sempre 1 , inoltre il debug mi porta come errore la riga di
codice : "rst.Update" segnalandomi che è "impossibile aggiornare
l'espressione" .
Private Sub Comando5_Click()
Dim Num1 As Integer
Dim Num2 As Integer
Dim Num3 As Integer
Dim Num4 As Integer
Dim Num5 As Integer
Dim Num6 As Integer
Dim Num7 As Integer
Dim Num8 As Integer
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblCombinazioni;"
DoCmd.SetWarnings True
Dim rst As DAO.Recordset
Set rst = CurrentDb().OpenRecordset("tblCombinazioni")
For Num1 = 1 To 32
For Num2 = 1 To 32
If Num2 <> Num1 Then
For Num3 = 1 To 32
If Num3 <> Num1 And Num3 <> Num2 Then
For Num4 = 1 To 32
If Num4 <> Num1 And Num4 <> Num2 And _
Num4 <> Num3 Then
For Num5 = 1 To 32
If Num5 <> Num1 And Num5 <> Num2 And _
Num5 <> Num3 And Num5 <> Num4 Then
For Num6 = 1 To 32
If Num6 <> Num1 And Num6 <> Num2 And Num6 <> _
Num3 And Num6 <> Num4 And Num6 <> Num5 Then
For Num7 = 1 To 32
If Num7 <> Num1 And Num7 <> Num2 And Num7 <> _
Num3 And Num7 <> Num4 And Num7 <> Num6 Then
For Num8 = 1 To 32
If Num8 <> Num1 And Num8 <> Num2 And Num8 <> _
Num3 And Num8 <> Num4 And Num8 <> Num7 Then
rst.AddNew
rst!Num1 = Num1
rst!Num2 = Num2
rst!Num3 = Num3
rst!Num4 = Num4
rst!Num5 = Num5
rst!Num6 = Num6
rst!Num7 = Num7
rst!Num8 = Num8
rst.Update
End If
Next Num8
End If
Next Num7
End If
Next Num6
End If
Next Num5
End If
Next Num4
End If
Next Num3
End If
Next Num2
Next Num1
Set rst = Nothing
End Sub

 codice : "rst.Update" segnalandomi che č "impossibile aggiornare

2 Gb č il limite del file mdb.
Cambia il tipo di dati da integer a byte cosě dimezzi lo spazio occupato.
Questa procedura ti genera anche record duplicati, con i numeri cambiati
di posto:
  1-2-3-4-5-6-7-8
  2-1-3-4-5-6-7-8
se li vuoi eliminare devi apportare delle modifiche.
Basta modificare il limite inferiore dei cicli for facendoli iniziare dal
valore del contatore precedente, il che velocizza l'esecuzione dato che
elimina un sacco di combinazioni:
  For Num2 = Num1 To 32
  For Num3 = Num2 To 32
  ............
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


            ti ringrazio....aspetto per provare ......questa notte sarà un
altra lunga notte
ciao.

Vincenzo ha scritto:


Oh, se vinci con i nostri suggerimenti si organizza subito un raduno e
offri la cena a tutti!  ;-)



            certamente :)
        se vuoi posso postare delle colonne da giocare x tutti.........
        su 10 concorsi giocati ho fatto un sei = 104 euro
        e almeno una  sei o sette 5 = 0 euro...cmq è una soddisfazione
        ciao.

         ciao.
una domanda che mi sorge spontanea:
ma non è che la dimensione massima del file MDB di 2 GB dipende dalla
formattazione FAT32 di Windows? e se si formatta la partizione in NTFS non
si supera il limite dei 2 GB così come accade per l'acquisizione dei Video?
ciao!
-- 


Vincenzo ha scritto:


Puoi semplificare ancora il tutto perchè il primo numero potrà variare
solo da 1 a 25 in quanto non ha senso farlo arrivare fino a 32,
duplicherebbe i valori restituiti dagli altri 7 contatori, il secondo da 2
a 26, ecc...
Quindi puoi modificare così il codice, togliendo anche tutti gli If (e gli
End If) perchè la procedura non restituirà più numeri duplicati quindi non
ha senso andare a verificare ogni volta che siano tutti diversi, e ciò
velocizza ulteriormente il tutto:
  For Num1 = 1 To 25
  For Num2 = Num1 + 1 To 26
  For Num3 = Num2 + 1 To 27


 ciao!
No, è un limite di Access. Per superarlo si possono dividere le tabelle su
più mdb ed usare tabelle collegate.
In questo caso, per esempio, si potrebbero mettere su un mdb tutte le
combinazioni che hanno il primo numero che va da 1 a 12 e su un altro
quelle da 13 a 25.
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 


   For Num3 = Num2 + 1 To 27
    Infatti anche stanotte ha dato buca, sono arrivato a giga 1,68 con Num1
sempre uguale a 1 :)
    ho riadattato secondo le tue indicazioni, puoi darci un controllo :)
anche xchè domenica è vicina :)
grazie !
Private Sub Comando5_Click()
Dim Num1 As Byte
Dim Num2 As Byte
Dim Num3 As Byte
Dim Num4 As Byte
Dim Num5 As Byte
Dim Num6 As Byte
Dim Num7 As Byte
Dim Num8 As Byte
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblCombinazioni;"
DoCmd.SetWarnings True
Dim rst As DAO.Recordset
Set rst = CurrentDb().OpenRecordset("tblCombinazioni")
For Num1 = 1 To 25
For Num2 = Num1 + 1 To 26
For Num3 = Num2 + 1 To 27
For Num4 = Num3 + 1 To 28
For Num5 = Num4 + 1 To 29
For Num6 = Num5 + 1 To 30
For Num7 = Num6 + 1 To 31
For Num8 = Num7 + 1 To 32
rst.AddNew
rst!Num1 = Num1
rst!Num2 = Num2
rst!Num3 = Num3
rst!Num4 = Num4
rst!Num5 = Num5
rst!Num6 = Num6
rst!Num7 = Num7
rst!Num8 = Num8
rst.Update
Set rst = Nothing
    stDocName = "Estrae2"
    DoCmd.OpenQuery stDocName, acNormal, acEdit
End Sub

Vincenzo ha scritto:




Sembra tutto a posto, a parte il fatto che mancano gli 8 "Next". Rimettili.
Se Num1 è sempre 1 ma gli altri cambiano è giusto così. Vuol dire che
raggiungi il limite dei 2 Gb prima di esaurire le combinazioni con Num1=1.


 Namor
ciao ! e grazie ancora.

 Fatto !


E infatti dicevo che forse non hai generato tutte le possibili
combinazioni, ma non hai finito nemmeno quelle con Num1=1 perchè hai
raggiunto prima il limite dei 2Gb e il programma ti ha dato errore.
Com'è Num2? parte da 2 e poi ad un certo punto cambia in 3?
E Num3? parte da 3 e poi ad un certo punto cambia in 4?
ecc...
Quanti record ha generato? Dovresti compattare il database subito dopo
aver svuotato la tabella, prima di iniziare la generazione, sennò i 2Gb
saranno occupati da record cancellati ma non ancora fisicamente eliminati
dal mdb.
Se vuoi puoi sempre fare un'autocomposizione query ricerca duplicati per
vedere se hai record doppi. Questo però non ti evidenzia i casi in cui hai
numeri doppi invertiti, come
1-2-3-4-5-6-7-8
1-2-5-4-3-6-7-8
che però non dovrebbero esserci se li hai generati con quel programma.


 Namor
ciao

 problemi di questo genere.
No, lo devi compattare DOPO avere svuotato la tabella con il "DELETE *
FROM" ma PRIMA dei cicli for che la riempiono nuovamente, sennò non serve
perchè il DELETE non elimina fisicamente i record dall'mdb e non ti rimane
spazio per generare i nuovi. Se vuoi prova: ferma il codice subito dopo il
DELETE, chiudi il db e vai a vedere se ha ridotto la sua dimensione o no.


 Namor
        ok......cmq io  chiudo e riapro il file  almeno un paio di volte
prima di rielaborare
                        in verità riavvio anche il computer :)
        immaggino che sia + fresco :)
ciao e grazie mille !!!!!!

 ciao e grazie mille !!!!!!
Non hai capito bene il problema.
Il tuo codice fa questo:
  1. Elimina tutti i record dalla tabella
  2. Genera i nuovi record
Invece per essere efficiente dovrebbe fare questo:
  1. Eliminare tutti i record dalla tabella
  2. COMPATTARE IL DATABASE
  3. Generare i nuovi record
Visto che da codice non lo puoi fare facilmente, ti conviene separare le
cose:
  1. Svuoti la tabella
  2. Compatti A MANO il database
  3. Quando il db si riapre (dopo la compattazione) generi i nuovi record.
Chiudere e riaprire il file non serve a niente. Riavviare il PC forse ti
dà qualche minimo vantaggio se lo stavi usando da parecchie ore, perchè
appena riavviato ha la memoria meno frammentata.


   3. Quando il db si riapre (dopo la compattazione) generi i nuovi record.
Anzi, fai cosě: metti la tabella in un mdb a parte (BackEnd) e nel mdb
dove c'č il codice usi una tabella collegata, cosě puoi compattare da
codice il BE, invece che farlo a mano.
Sul 
www.sitocomune.com
 trovi un esempio che spiega come compattare da
codice un database BE.


 codice un database BE.
        ok.....mi appresto a farlo materialmente :)
tanto impegno va premiato :)
questa č un sistemino elaborato x domenica......
3          4          8          12        18        21        25        32
3          8          18        20        23        24        26        31
2          3          10        20        21        24        25        26
1          3          4          7          8          10        26
30
4          6          7          11        12        14        29        32
2          10        13        14        23        28        30        31
6          12        13        15        19        26        28        30
5          10        14        17        23        24        26        30
5          6          8          12        14        17        21        32
6          13        14        16        25        26        27        30
9          10        14        15        16        19        22        30
3          6          9          10        12        14        31        32
2          4          7          8          12        13        15        24
9          10        14        18        20        24        25        31
2          4          9          13        16        20        27        30
1          3          10        16        18        22        23        30
7          14        22        26        27        28        29        32
2          5          6          7          22        24        27        30
ciao.


Tutto ok !!!!!
        i record elaborati sono esattemente 10.518.300 !!!!
La dimensione della tabella compattata č di 368 mega !!!
grazie di tutto !
e a presto !
p.s.
mica puoi dirmi qualcosa anche sulle "riduzioni" ?

 mica puoi dirmi qualcosa anche sulle "riduzioni" ?
Non vorrai mica ridurre un sistema integrale completo da 10 milioni di
record?
Funziona così:
dai 32 numeri ne scegli un pò, diciamo un 12-15, con i quali elabori un
sistema integrale che comprende tutte le possibili combinazioni in base 8
di quei 12-15 numeri.
Questo ti garantisce che se gli 8 numeri estratti sono compresi nei 12-15
che avevi scelto tu, farai sicuramente 8.
La riduzione consiste nell'eliminare alcune delle combinazioni in modo che
se gli 8 numeri estratti sono compresi nei 12-15 che avevi scelto tu non
avrai più la certezza di fare 8, ma è garantito almeno un 7 o 6 (rimane
sempre la possibilità di un 8, ma la probabilità è più bassa).
Non chiedermi di scriverti i criteri per una query che faccia questa
eliminazione, non mi sono mai posto il problema e non ho nemmeno idea se
sia di semplice soluzione o meno.
Magari ti potrà aiutare qualche esperto di statistica.
Ciao.


 Namor

 ciao !
Anche se con i filtri arrivi ad un sistema da 100.000 record dovrai
comunque ridurlo, se non vuoi spendere 50.000 euro per giocarlo.
Però puoi sempre fare test gratuiti: elabori il sistema, non lo giochi e
poi controlli se avresti vinto. Quando vedi che ci azzecchi spesso, tenti
il colpaccio...
Facci sapere come va.


 Namor
            ok.grazie ancora.ciao !!!

 ha scritto nel messaggio
news:c5lnsu$330go$1...@ID-24065.news.uni-berlin.de...

Non č che sia andata proprio bene... Sigh!
Ciao.
P.S. Non č che per caso dovevo giocare tutti i numeri tranne quelli?
--
Sergio MAZZA


Daniele

 Daniele
Io invece ho fatto 2 "TRE" al superenalotto!
Ben 24,40 euro da dividere tra i 35 partecipanti al sistema!


 namor at inwind punto it
Il solito fortunello!
Ciao.
--
Sergio MAZZA