Newsgroup: it.comp.appl.access
Titolo: Assegnare valori di un campo tabella a VBA

In modulo VBa , con questo codice :
Num1 = Int(Rnd(1) * 32) + 1
genero un valore casuale da 1 a 32 , se volessi che il numero casuale fosse
scelto all'interno del campo
 "NR" della tabella "Pronostico" , come dovrei fare ??
ho provato con
Set Vin = CurrentDb().OpenRecordset("Pronostico")
Num1 = Int(Rnd(1) * vin) + 1
mi da errore tipo non corrispondente.
grazie
p.s.
tutti i campi interessati hanno dimensione campo byte

 ha scritto nel messaggio
news:2gpdf3F...@uni-berlin.de...

Prova con:
Num1 = Int(Rnd(1) * Vin!NR) + 1
Ciao.
-- 
Sergio MAZZA


grazie per l'aiuto ma mi sono spiegato male :
il campo NR della tabella pronostico e ad esempio così formato :
NR
6
7
8
9
10
14
15
16
17
18
19
20
21
22
23
25
26
27
28
29
31
io vorrei che il codice mi restituisse un valore casuale all'interno di
questi.
grazie.ciao.

 ha scritto nel messaggio
news:2gphgiF...@uni-berlin.de...

Veramente il codice che hai sottoposto tu nell'NG è sintatticamente errato.
Tu scrivi:
Set Vin = CurrentDb().OpenRecordset("Pronostico")
poi:
Num1 = Int(Rnd(1) * vin) + 1
e ti presenta l'errore: tipo non corrispondente.
E' chiaro, perché hai dichiarato un recordset (Vin) e nella riga successiva
non indichi il nome del campo da utilizzare nel recorset.
Le istruzioni corrette sono:
Set Vin = CurrentDb.OpenRecordset("Pronostico")
Num1 = Int(Rnd(1) * vin!NR) + 1
Poi, stai utilizzando rifierimenti DAO e se utilizzi acc'200x (che utilizza
ADO) devi inserire i riferimenti a quella libreria...
Ciao.
-- 
Sergio MAZZA


    sul fatto che io combini pasticci col vba non ho dubbi :(
    debbo impararlo !
    cmq ho adattato come mi hai detto , questo è il codice completo :
Public Sub test()
Dim Num1 As Byte
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM Colonne;"
DoCmd.SetWarnings True
Set rst = CurrentDb.OpenRecordset("Colonne")
Set vin = CurrentDb.OpenRecordset("Pronostico")
For x = 1 To 10
Num1 = Int(Rnd(1) * vin!Nr) + 1
rst.AddNew
rst!Num1 = Num1
rst.Update
Next x
End Sub
ma il risultato è il seguente :
Num1
1
1
1
2
2
2
2
2
2
2
i valori presenti nel campo "Nr" della  tabella "Pronostico", da cui vorrei
restituirmi dei valori random per la tabella "Colonne" sono :
NR
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
dove sbaglio ???
grazie mille !!!
ciao.

 ciao.
Intanto non hai più l'errore precedente; ora pensiamo al secondo problema.
Non ho mai affrontato il problema della generazione di numeri casuali e sono
sicuro che esistono altre tecniche; affidiamoci all'help dell'istruzione
Randomize e Rnd.
Il tuo codice diventerebbe:
Dim MyValue
Randomize ' Inizializza il generatore di numeri casuali.
For x = 1 To 10
    Num1 = Int((99 - (1 + 1)) * (Rnd) + 1)  '<-- dovrebbe genera numeri
casuali da 1 a 99
    rst.AddNew
    rst!Num1 = Num1
    rst.Update
Next x
Ciao.
-- 
Sergio MAZZA


wrote:
[cut]

Ti spiego, colloquialmente, come farei io:
ipotizziamo che intNr sia il numero di record nella tabella da cui
vuoi effettuare la scelta
La formula sarà
Num1 = Int(Rnd(1) * intNr ) + 1
Il tuo valore sarà quello del record che occupa la posizione
corrispondente al risultato ottenuto (esempio: se il risultato sarà 3
il tuo valore sarà 8).
Non voglio - ovviamente - privarti del piacere di scrivere da solo il
codice :-)
Ciao
--
Alberto
No alle guerre

 Next x
    carissimo il mio problema è che voglio generare numeri casuali
all'interno di quelli
    contenuti nel campo Nr della tabella pronostico !
    Esempio il campo Nr contiene questi valori :
6
7
8
9
10
14
15
16
17
18
19
20
21
22
23
25
26
27
28
29
31
come faccio a far generare numeri casuali all'interno di questi ?????
grazie !!!!

 codice :-)
    ho fatto un test....ma mi restituisce sempre gli stessi valori....
grazie.ciao

 grazie !!!!
Leggendo l'help della funzione Rnd:
Per generare interi casuali in un dato intervallo, utilizzare la seguente
formula:
Int((limitesup - limiteinf + 1) * Rnd + limiteinf)
In questo contesto, limitesup indica il numero maggiore presente
nell'intervallo, mentre limiteinf indica il numero minore.
Quindi applicandola diventa:
Dim MyValue
Randomize ' Inizializza il generatore di numeri casuali.
For x = 1 To 10
    Num1 = Int((Vin!nr - (1 + 1)) * (Rnd) + 1)  '<-- dovrebbe genera numeri
casuali da 1 a Nr
    rst.AddNew
    rst!Num1 = Num1
    rst.Update
Next x
Ciao.
-- 
Sergio MAZZA

 casuali da 1 a Nr
    e se volessi generarli scegliendo SOLO fra :
2
4
5
6
ecc
tieni conto però che la prossima elaborazioni i valori potrebbero diventare
:
1
3
4
6
8
ecc
scusa se insisto, ma mi sembra che giro intorno allo stesso problema senza
centrarlo MAI !
grazie mille !!!

 ha scritto nel messaggio
news:2grpreF...@uni-berlin.de...

Stai esagerando... Sarebbe gradita anche una tua collaborazione visto che io
sto seguendo l'help in linea e non documentazione introvabile; oltre al
fatto che l'interesse è tuo.
Comunque; questo vuol dire che vuoi generare non solo numeri casuali ma
anche diversi da quelli precedenti. Quindi ogni volta che fai girare la
routine devi controllare se il numero che hai generato già è stato inserito
in tabella; se lo trovi devi rigenerarlo non aggiornando il contatore del
ciclo For.
Es. (a braccio)
For x = 1 To 10
    Num1 = Int((Vin!nr - (1 + 1)) * (Rnd) + 1)  '<-- dovrebbe genera numeri
casuali da 1 a Nr
    if not isnull(Dlookup("Num1","Pronostico","Num1=" & Num1)) then
        x = x - 1 '<-- reimposto il valore del contatore x
    else
        rst.AddNew
        rst!Num1 = Num1
        rst.Update
    end if


 Next x
    ok......grazie ! sinceramente pensavo fosse una cosa facile da fare !
    possibile che non è implementata una funzione Randbetween() classica di
excel ?
scusa x il tempo che hai perso...ripeto pensavo fosse facile !
ciao !

 ciao !
Ciao.
-- 
Sergio MAZZA

 Sergio MAZZA
ciao !


wrote:

Tu vuoi ottenere un numero, scelto a caso, tra qelli contenuti nel
campo NR?
Nel tuo esempio tra: 6 7 8 9 10 14 15 16 17 18 19 20 21 22 23 25 26 27
28 29 31?
Ho capito bene?
Se sì allora spiega come hai fatto il test ...


 No alle guerre
Concordo che cosa orribile !!!! Che tristezza mi viene ! purtroppo come
disse qlq :
"l'uomo č un animale con dentro un anima " !!

Ok !
mi ero rimbambito !
sia  Alberto S.  che Sergio Mazza avevano perfettamente ragione !
quando si cerca qualcosa alla cieca si diventa ciechi !
grazie !

2
[cut]
Direi che il problema è stato centrato.
Alcune osservazioni veloci: purtroppo non ho più tempo per stasera.
- Nr deve essere valorizzato con il conteggio del numero totale di
record della tabella pronostico (nel tuo esempio 21), così otterrai un
numero compreso tra 1 e 21.
- Il valore che immetterai in rst!Num1 sarà quello del record che
occupa la relativa posizione (cioè se dal calcolo otterrai 7, il
valore da memorizzare sarà 15)
- Ad ogni successivo ciclo dovrai anche accertarti di non ottenere
duplicati, altrimenti ripeterai il calcolo ad oltranza.
Se pensi di aver bisogno di una mano per il codice fammelo sapere.
Ciao.


 Se pensi di aver bisogno di una mano per il codice fammelo sapere.
ti ringrazio per i suggerimenti..........ma ho scoperto che debbo cambiare i
miei piani !
Ho realizzato che la cosa + semplice è in effetti  generare tutte le
possibili combinazioni che
possono scaturire dai numeri presenti nella tabella Pronostico del campo NR
presi
per classe 8 !
Ho provato a buttare giù questo codice :
1) dove vedi ???? = non so che pesci pigliare e stavolta non voglio dire
cavolate !
2) bisognerebbe tener conto che i numeri presenti nella tabella Pronostico
potrebbero essere talvolta
        20, talvolta 21 , insomma >16 < 23 :)
3) forse bisognerebbe usare array o cose del genere....ma faccio una
promessa è l'ultima volta che vado alla
    cieca da domani imparo il VBA : PROMESSO
M dai (date) una mano ?????
Public Sub test20()
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 Colonne;"
DoCmd.SetWarnings True
Set rst = CurrentDb.OpenRecordset("Colonne")
Set vin = CurrentDb.OpenRecordset("Pronostico")
For Num1 = ???
For Num2 = ???
If Num2 <> Num1 Then
For Num3 = ???
If Num3 <> Num1 And Num3 <> Num2 Then
For Num4 = ???
If Num4 <> Num1 And Num4 <> Num2 And _
Num4 <> Num3 Then
For Num5 = ????
If Num5 <> Num1 And Num5 <> Num2 And _
Num5 <> Num3 And Num5 <> Num4 Then
For Num6 =  ????
If Num6 <> Num1 And Num6 <> Num2 And Num6 <> _
Num3 And Num6 <> Num4 And Num6 <> Num5 Then
For Num7 = ????
If Num7 <> Num1 And Num7 <> Num2 And Num7 <> _
Num3 And Num7 <> Num4 And Num7 <> Num5 And Num7 <> Num6 Then
For Num8 = ????
If Num8 <> Num1 And Num8 <> Num2 And Num8 <> _
Num3 And Num8 <> Num4 And Num8 <> Num5 And Num8 <> Num6 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!Num6 = Num7
rst!Num6 = 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
ciao !

Il seguente (non funziona) ma mi sembra + corretto :)
Option Compare Database
Dim P(20) As Byte
Public Sub test200()
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 Colonne;"
DoCmd.SetWarnings True
Set rst = CurrentDb.OpenRecordset("Colonne")
Set vin = CurrentDb.OpenRecordset("Pronostico")
P(20) = vin!Nr
For Num1 = 1 To 20
For Num2 = 1 To 20
If Num2 <> Num1 Then
For Num3 = 1 To 20
If Num3 <> Num1 And Num3 <> Num2 Then
For Num4 = 1 To 20
If Num4 <> Num1 And Num4 <> Num2 And _
Num4 <> Num3 Then
For Num5 = 1 To 20
If Num5 <> Num1 And Num5 <> Num2 And _
Num5 <> Num3 And Num5 <> Num4 Then
For Num6 = 1 To 20
If Num6 <> Num1 And Num6 <> Num2 And Num6 <> _
Num3 And Num6 <> Num4 And Num6 <> Num5 Then
For Num7 = 1 To 20
If Num7 <> Num1 And Num7 <> Num2 And Num7 <> _
Num3 And Num7 <> Num4 And Num7 <> Num5 And Num7 <> Num6 Then
For Num8 = 1 To 20
If Num8 <> Num1 And Num8 <> Num2 And Num8 <> _
Num3 And Num8 <> Num4 And Num8 <> Num5 And Num8 <> Num6 And Num8 <> Num7
Then
rst.AddNew
rst!Num1 = P(Num1)
rst!Num2 = P(Num2)
rst!Num3 = P(Num3)
rst!Num4 = P(Num4)
rst!Num5 = P(Num5)
rst!Num6 = P(Num6)
rst!Num7 = P(Num7)
rst!Num8 = P(Num8)



[cut]
(lascia un po' di quoting, altrimenti non si capisce più il senso)
Quando avevo più tempo (e anche un po' di buontempo) ho scritto una
routine che generava dei numeri casuali - tipo superenalotto. Deve
essere un poco riadattata ma poi lavorerà grosso modo come ti ho
descritto qualche post fa.
Se nel fine settimana avrò un po' di tempo (e se tu nel frattempo non
avrai risolto) vedrò di sistemarla e passartela.
Ciao



    Ho risolto alla grande con  una query !!!!!!!
Ho postato il msg anche su un newsgroup americano e un certo  Peter ,
con una sintesi straordinaria ha detto   :
Did you try using a query instead of code?
INSERT INTO tN ( 1, 2, 3, 4, 5, 6, 7, 8 )
SELECT [1].ID, [2].ID, [3].ID, [4].ID, [5].ID, [6].ID, [7].ID, [8].ID
FROM tblTmpKey AS 1, tblTmpKey AS 2, tblTmpKey AS 3, tblTmpKey AS 4,
tblTmpKey AS 5, tblTmpKey AS 6, tblTmpKey AS 7, tblTmpKey AS 8
WHERE ((([2].ID)>[1].[id]) AND (([3].ID)>[2].[id]) AND (([4].ID)>[3].[id])
AND (([5].ID)>[4].[id]) AND (([6].ID)>[5].[id]) AND (([7].ID)>[6].[id]) AND
(([8].ID)>[7].[id]));
Here, tblTmpKey has one field (ID), table tN has 8 fields (1,2,3...8) all
type byte with primary key on all eight fields.  Run the query for the
numbers in your example and there are 145 combinations (with elimination).
Because the query forces the numbers in a certain order you won't get
duplication ie the combinations will be unique.   - peter.
Sinceramente debbo ammettere che sono ancora stupito per  la semplicità con
la quale ha risolto !
ciao
p.s.
ti ringrazio molto l'aiuto !
Il "buontempo" ho scoperto che dobbiamo crearcelo anche quando non c'è !!!
anche x me non è un gran periodo.......ma dobbiamo tenere duro !

anche x me non è un gran periodo.......ma dobbiamo tenere duro !
Giustissimo, ciao.
