Newsgroup: it.comp.appl.access
Titolo: Contatore

Buondï¿œ a tutti.
Ho il seguente problema: devo assegnare una numerazione progressiva ai 
record di una tabella con numerazione differente in base ad un gruppo di 
opzioni:
optionA --> count a partire da 1 a 500
optionB --> count a partire da 501 a 1000
optionC --> count a partire da 1001 a 1500
Ho pensato di creare tre variabili pubbliche (NumA,NumB,NumC) e 
assegnare ad esse il valore iniziale, poi attribuire
[count] = NumA + 1
in uscita dalla maschera.
Evidentemente sbaglio perchï¿œ Access (2000) si premura di indicarmi "non 
valido all'esterno della routine".
Hint e suggerimenti?
Sono pochissimo avezzo alla programmazione ad oggetti, portate pazienza...
Questo il frammento del codice:
Option Compare Database
	Public NumA As Integer
	Public NumB As Integer
	Public NumC As Integer
	NumA = 1
	NumB = 501
	NumC = 1001
Private Sub Codice_GotFocus()
	If option15 = 1 Then
	[CODICE] = (UltimoNumeroB + 1)
	Else
	[CODICE] = (UltimoNumeroA + 1)
	End If
End Sub
Ciao
Filippo B.
--
http://www.danzainsieme.it
http://www.boschetti.info

 
http://www.boschetti.info
Ciao Filippo,
non so se hai omesso qualcosa, ma cos� non pu� funzionare.
Hai valorizzato all'inizio NumA, NumB e NumC ma poi non li vedo 
utilizzati...inoltre testi Option=15 mentre all'inizio parlavi di OptionA.
Abituati a fare cos�:
Innanzitutto, subito dopo option compare database ti consiglio fortemente di 
mettere
"Option Explicit", cos� dici ad Access che nella routine userai solo nomi di 
variabili che avrai avuto premura di definire tu, senza che Access si prenda 
la briga di crearle per te al primo utilizzo. Sembra una sciocchezza, ma 
quanti errori si evitano facendo cos�!!!
Poi... beh, faccio prima a scrivere come potresti fare e poi magari a 
spiegarti il significato:
Option Compare Database
Option Explicit
dim NumA as integer, NumB as Integer, NumC as Integer
Private Sub Codice_GotFocus()
    if optionA Then
        NumA = NumA + 1
        me.Codice = NumA
    end if
    if optionB Then
        if NumB = 0 then NumB = 500
        NumB = NumB + 1
        me.Codice = NumB
    end if
    if optionC Then
        if NumC = 0 then NumC = 1000
        NumC = NumC + 1
        me.Codice = NumC
    end if
Ecco, non c'� molto da dire, solo che l'errore che ti veniva fuori era 
perch� tu utilizzavi le tre variabili NumX prima dell'inizio della routine e 
questo � un errore.
La routine come l'ho posta io dovrebbe funzionare e si basa sul fatto che i 
tre NumX saranno inizializzati a zero appena vengono dichiarati in Access. 
Se non vuoi fidarti di questa inizializzazione che fa Access, allora 
potresti creare un'altra routine che puoi collocare anche in coda alla 
precedente, tanto con la programmazione ad eventi di Access verr� eseguita 
prima di quella appena scritta:
Private Sub Form_Load()
    NumA = 0
    NumB = 500
    NumC = 1000
end sub
se scegli questa soluzione, puoi togliere le "If NumB = 0... " e "If NumC = 
0..." inserite nella routine precedente.
Non demoralizzarti e continua a programmare, che sono sicuro sar� anche per 
te fonte di soddisfazione come lo � per me.
Ciao
Antonio

 Antonio
Innanzi tutto ti ringrazio Antonio per la spiegazione chiara ed 
esauriente, che adesso tenterï¿œ subito di mettere in pratica.
Per quanto riguarda la programmazione... beh, in passato ci ho lavorato 
molto, poi la vita mi ha portato soprattutto a diventare sistemista e 
quindi adesso mi trovo un po' spiazzato (ho sempre usato linguaggi 
procedurali e/o di basso livello), tuttavia mi rendo conto che oggi si 
possono fare cose molto interessanti con 2 righe di codice, laddove io 
ne dovevo scrivere una paginata.
Ancora grazie buona domenica


 te fonte di soddisfazione come lo ï¿œ per me.
Ciao Antonio,
nel ringraziarti ancora per gli spunti offerti, volevo resocontare su 
come ho poi risolto il problema.
Il metodo da te indicato funzionava ma, non mi permetteva il 
mantenimento della numerazione alla chiusura e riapertura della 
maschera. In pratica, ogni volta venendo reinizializzata la variabile, 
ricominciava a contare dal primo numero (ovviamente).
Con le mie conoscenze non sono riuscito a fare di meglio, quindi ho 
cambiato approccio: ho creato una nuova tabella, dove ho assegnato ai 12 
record i dodici valori di contatore che mi servivano:
Matrice
ID	valore
1	0
2	500
3	1000
4	1500
  ecc
Ho poi creato un pulsante nella maschera che mi serviva cui ho assegnato 
il seguente codice "su clic":
Private Sub AssegnaCodice_Click()
' Riga per individuazione errori ed invio a routine di gestione
On Error GoTo Err_AssegnaCodice_Click
     Dim stDocName As String
     stDocName = "Macro1"
     DoCmd.RunMacro stDocName
     Dim NumA As Integer, Contr As Integer
    Contr = Me.Controllo1
    MsgBox "Contr vale " & Contr
    'Questa procedura stabilisce una connessione con il database corrente
     Dim conn As ADODB.Connection
     Dim rst As ADODB.Recordset
     'Crea l'oggetto di connessione
     Set conn = CurrentProject.Connection
     'Crea un nuovo Recordset
     Set rst = New ADODB.Recordset
     rst.LockType = adLockOptimistic 'Valore enum 4
     ' Apre la tabella
     rst.Open "Matrice", conn
     'vado al primo record
     rst.MoveFirst
     rst.Find ("ID Like '" & Contr & "'")
     ' attribuisco il valore del campo "Valore" alla variabile NumA, poi
     ' la incremento di uno, visualizzo un msg di verifica
     ' quindi riattribuisco al campo "Valore" il valore incrementato
     NumA = rst("Valore")
     NumA = NumA + 1
     MsgBox "il valore ï¿œ" & NumA
    rst("Valore") = NumA
    rst.Update
' Chiusure
rst.Close
Set rst = Nothing
Exit_AssegnaCodice_Click:
     Exit Sub
Err_AssegnaCodice_Click:
     MsgBox Err.Description
     Resume Exit_AssegnaCodice_Click
End Sub
Il campo "Controllo1" ï¿œ il campo in cui viene trovato in seguito ai 
checkbox il valore che identifica quale contatore deve essere usato.
Dopo un paio di gg di test pare che il sistema regga, speriamo bene!
ciao e grazie


 
http://www.boschetti.info
Ciao Filippo,
hai risolto e quindi va bene cos�. Ma poich� dicevi che eri un programmatore 
in Assembler o altro poi passato alla sistemistica (anch'io amavo 
l'Assembler), ti do qualche suggerimento.
- Quando sul tuo Access � attiva l'autocomposizione dei pulsanti, il 
pulsante che vai a generare si autogenera facendoti alcune domande... quindi 
ti ritrovi una routine che fa qualcosa, ma che non serve al caso tuo. Ti 
conviene cancellarne tutto il suo contenuto e riscroverlo da capo.
- Guardando velocemente la routine vedo che hai generato una macro e poi la 
esegui... lascia stare le macro. Sono una vecchia maniera di fare le cose: 
forse nelle prime versione di Access non esisteva la possibilit� di scrivere 
il codice.
- Poi vedo ADODB... io non conosco l'ado, ma mi pare di aver letto che anche 
la Microsoft lo stia abbandonando. Il modo naturale di accedere ad una 
tabella o query del database � il DAO. Pi� o meno puoi fare cos�:
dim Dbs as database
dim Tdfs as tabledefs 'ovvero tutte le tabelle
dim Qdfs as querydefs ' tutte le query
dim Tdf1 as tabledef , Tdf2 as tabledef, Tdf3 as tabledef ' per lavorare con 
la singola tabella
dim Qdf1 as querydef, Qdf2 as querydef, Qdf3 as querydef ' commento come 
sopra
dim Rst1 as recordset, Rst2 as recordset, Rst3 as recordset ' per i 
recordsets
fin qui le dichiarative, poi le assegnazioni:
set dbs = currentdb ' il database corrente
set tdfs = dbs.tabledefs ' tutte le tabelle
set qdfs = dbs.querydefs ' tutte le query
set tdf1 = tdfs ("nome della tabella che vuoi assegnare a tdf1")
set qdf1 = qdfs ("nome della query che vuoi assegnare a qdf1")
set rst1 = tdf1.openrecordset (dbopendynaset)
set rst2 = qdf1.openrecordset (dbopendynaset)
a questo punto rst1 e rst2 hanno l'elenco dei records della tabella e della 
query ed hai la possibilit� di scorrerli o sequenzialmente (rst1.movefirst, 
rst1.movenext, etc.) ma anche in modo random (rst1.findfirst "ID = 12345").
Questo � l'iter pi� classico, esistono metodi molto pi� concisi, ma meno 
esplicativi.
Tieni presente che quando ti posizioni su una particolare istruzione e pigi 
F1 ti appare l'help di quella istruzione e da l� puoi navigare nell'enorme 
help di Access... tanto grande che a volte non trovi facilmente quello che 
ti serve.
Buono studio...
Antonio

 ti serve.
Come ho scritto sopra, purtroppo l'help non mi funziona.
A questo punto vorrei farti 2 domande:
- puï¿œ essere interessante migrare ad una versione recente di Access 
(2003 - 2007)? Tieni presente che mi capita sporadicamente di aver a che 
fare con db non server-side
- volendo studiare sulla carta (sono moolto old-style, lo so), e 
interessandomi il lato programmazione, conosci o sai indicarmi dove 
trovare un buon manuale?
ciao e buon lavoro,


 
http://www.boschetti.info
Visto che la versione che hai tu non funziona a dovere, prenderei una 
versione aggiornata. Sto usando poco Access in questo periodo e quindi non 
ho fatto in tempo ad innamorarmi della versione 2007, troppo diversa dalle 
precedenti. Quella che mi piace di pi� � la 2003.
Non conosco libri da consigliarti... per me le fonti migliori sono l'help ed 
Internet.
Ciao
Antonio

 Internet.
Ok, grazie ancora.
