Newsgroup: it.comp.appl.access
Titolo: elenco variabili globali e funzione ricorsiva

Ciao ciao a tutti ho creato una fuzione in cui inserisco alcuni 
paramentri del batabase.. il tipico file.ini
Es.
NOME_VARIABILE		VALORE_VARIABILE
indirizzo	=	192.168.....
porta		=	3306
login		=	pippo
password	=	pluto
colore_sfondo	=	1231
ultimo_avvio	=	ieri
ecc ecc ecc
la corretta lettura del file ini funziona mi manca l'assegnazione alla 
corrispettiva variabile globale con lo stesso nome.
durante l'avvio del DB faccio caricare in una tabella tutti i valori, 
quindi mi trovo con una tabella con 2 colonne
nome_variabile,valore_variabile
qui viene il problema vorrei creare una funzione ricorsiva per assegnar 
i valori a tutte le variavili di sistema diciamo una cosa del genere
Dim db as ????????????????????
Dim cnt as ??????global o cosa????
Dim rs ad DAO.recordset
Do Until rs.EOF
     For Each cnt In db.???????????
         If cnt.Name = rs_avvio.Fields("name") Then
             nome(variabile_globale)=valore(variabile_glovale)
      End If
Next
Dentro il DB ho precedentemente dichiatato tutti i nomi delle variabili.
Global indirizzo As String
Global porta 	As String
Global login	 As String
Global password As String
rs è un recordset con memorizzato nome_variabile e valore_variabile.
Ovviamente questo codice non è nulla serve solo per far capire la mia 
richiesta..
Qualche suggerimento?

Galvani C. ha scritto:

Usare un insieme con chiave associativa. E puoi aggiungerci tutti i 
valori che vuoi
i.e.
Public Items as collection
Do Until rs.EOF
    items.add rs(1),rs(0) [o rs("valore"),rs("chiave"), come preferisci)]
    rs.movenext
Next
myvalue=items(pkey)
;<) mi fa sorridere perche', non proprio trattata nello stesso modo, io 
uso normalmente un file/tabella di configurazione in coppia chiave=valore.
--
ac

Alessandro Cara ha scritto:
[cut]
P.S. *non* e' una funzione ricorsiva e una funzione *iterativa*
--
ac

Alessandro Cara ha scritto:

Grazie della super veloce risposta (meglio di un centro assistenza) ma 
ho avuto tempo solo ora di seguire i tuoi consigli...
Non funzionano ricevo un messaggio
Errore runtime '3265'
Elemento non trovato in questo insieme.
Domanda.. ma i nomi delle variabili devo dichiarale da qualche parte o 
no?se si come?
Qualche suggerimento?
In un modulo avevo creato questo...
Global SessioneIdUsr As Integer
Global SessioneIdUtente As Integer
Global SessioneNominativo As String
Global SessioneAnnoRicerca As Integer
ho provato sia lasciandole che commentandole ricevo lo stesso errore.
Sono alcune delle variabili che vorrei avere dal file ini
Mille grazie

Galvani C. ha scritto:

Non mi sono spiegato. Le global *non* ti servono.
L'unica che ti serve e' la collezione.
Proprio ora che scrivo mi sono reso conto che avevo dimenticato una 
cosina pero' importante.
Dim Items as *new* collection
io ho una tabella "Config" che contiene le seguenti entrate
Campi: "Chiave"    "Valore"
-----------------------------
      ImageDim        16
      MenuType        Pannello Tree
      ArkBase         ArkTitoli
      CopyExt         .mp3;.wma;.avi;.mpg;.
A seguito di lettura della tabella vengono inserite le seguenti
Items.add "16","ImageDim"
Items.add "Pannello Tree","MenuType"
Items.add "ArkTitoli","ArkBase"
Items.add ".mp3;.wma;.avi;.mpg;.","CopyExt"
quando mi serve la variabile faccio 
ad.es
.
if instr(Items("CopyExt"),myCopyExt) <> 0 then ....etc
Il tuo elemento non trovato deriva dal fatto che stai richiedendo 
all'insieme una chiave che non c'e'
i.e.
x= Items("CapyExt")
--
ac

Grazieeeeeeeeeeeeeeeeeeeeeeeeeeeee che bello ho un file ini che funziona 
con acces :D:D:D:D:D
P.S: ho un piccolo problema però... quando chiudo la form quella 
collction sparisce.. :) qualche consiglio????
P.S.2 se molto gentile mille grazie!

 collction sparisce.. :) qualche consiglio????
Perche' la hai definita nel form.
Dovresti definirla in un modulo.
--
ac

Alessandro Cara ha scritto:

Ok grazie ma non capisco ti spiego: in un modulo ho creato
Public Function AvvioVariabili(var As String)
Dim items As New Collection
Dim rs_avvio As DAO.Recordset
Set rs_avvio = CurrentDb.OpenRecordset("SELECT qryINI.* FROM qryINI ;")
If var = "carica" Then
     Do Until rs_avvio.EOF
         items.Add rs_avvio(3), rs_avvio(1)
         rs_avvio.MoveNext
     Loop
End If
rs_avvio.Close
Set rs_avvio = Nothing
End Function
Poi su evento load della maschera login inserisco AvvioVariabili("carica")
così dovrebbe andare ma ciononostante quando la form login viene chiusa 
perdo le variabili.... help me.... :D

Galvani C. ha scritto:

La variabile deve essere dichiarata pubblica e messa fuori della funzione.
Probabilmente nel modulo hai queste due clausole
Option Compare Database
Option Explicit
subito dopo
  Public *ilnomechevuoi* as new collection
--
ac


Sempre più grazie stavolta almeno ho un errore diverso...
Set rs_avvio = CurrentDb.OpenRecordset("SELECT qryINI.* FROM qryINI ;") 
' su questa comando ricevo un bel error "non valido all'esterno di una 
routeni"
Grazie ancora non sono molto pratico di access ora intanto mi documento 
sulle due opzioni che mi hai consigliato dirimuovere :D


grazie ho creato un nuovo modulo esenti dai parametri precedenti ed ora 
l'errore è diverso :D
Set rs_avvio = CurrentDb.OpenRecordset("SELECT qryINI.* FROM qryINI ;") 
'su questa riga ricevo "non valido al esterno di una runtime"
Qualche altro suggerimento.TI ringrazio non sono molto bravo in access 
sto iniziando a scoprirlo bene adesso....


No ho compreso dove hai messo la open del recordset
Il tuo modulo dovrebbe essere cosi'
Option Compare Database
Option Explicit
Public ---->qui tutte le variabili pubbliche/globali, solo le 
definizioni (e' consentita la *new*)
Di seguito tutte le funzioni
i.e.
Function nomefunzione(parameters)
    Definizione variabili di funzione
    Codice di funzione (tra cui gli openrecordset)
    nomefunzione= valore di ritorno (se serve)
End Function
.......
Tutte le altre funzioni che vuoi assocare allo stesso modulo
In genere io ho piu' moduli con all'interno piu' funzioni. Accorpo le 
funzioni a seconda del loro scopo e della loro parentela.
Fermo restando che ora uso solo e quasi esclusivamente *classi* (i.e. 
strutture di tipo oggetto)
N.B. Evita di chiamare le funzioni con lo stesso nome del modulo perche' 
rischi di incartarti.
--
ac


ehehehe scusami l'orario ha giocato brutti scherzi... cercavo di aprire 
un rs in public :D:D:D:D:D
è possibile sapere se questa collection è già popolata opure no? mi 
spiego ho inserito su caricamento frmLogin  il load del file ini.. solo 
che quando cambio utente e ricarico la form Login mi da errore perchè 
cerca di creare la seconda volta le stesse variabili...

 cerca di creare la seconda volta le stesse variabili...
La collezione ha tre metodi
.add
.remove
.item (predefinito in genere non si indica, cfr l'esempi che ti ho fatto 
i.e coll(x))
ed una proprieta'
.count
Forse uno di questi puo' essere utile ;<)
Comunque dai un'occhata all'help  c'e' scritto tutto e' c'e' anche un 
esempio.
--
ac

Scusami per la domanda stupida...count è molto utile
sto pisolando molto in questi giorni :D

 
Scusami ancora ma mi correggo non funziona...
Sino ad ora avevo scordato in un modulo delle variabili public definite 
con lo stesso nome e quindi funzionava tutto; ma in realtà  il sistema 
non funzione ora se hai tempo prova a dirmi dove non ho capito
in un modulo ho:
Option Compare Database
Option Explicit
Public items As New Collection
'di seguito la funzione per popolare la collection
Public Function AvvioVariabili()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT qryINI.* FROM qryINI ;")
If items.Count = 0 Then
         Do Until rs.EOF
             items.Add rs(3), rs(1)
             MsgBox rs(3) & vbCrLf & rs(1)
             rs.MoveNext
         Loop
End If
rs.Close
Set rs = Nothing
End Function
############################################
su evento caricamento ho messo
AvvioVariabili
come debug ho inserito un msgbox rs(3) & vbCrLf & rs(1) nella funziona 
carica ed ottengo sia il nome che il valore come tu mi hai stritto :D
ma nella stessa form ho inserito un pulsante e sul click un msgbox(login)
ovviamente login è il nome corretto della variabile ma ottengo un msgbox 
vuoto.. dove sto sbaglianto o cosa non ho capito?
help me ;(

 help me ;(
dicevano i beatles (leggere come e' scritto) un po' di "h"anni fa.
--
ac

Alessandro Cara ha scritto:

Rigrazie ancora ma subito dopo mi ero accorto di quello che avevo 
scritto.... ops ho bisogno di ferie do i numeri mi ero già risposto prima :d