Newsgroup: it.comp.appl.access
Titolo: combobox e evento di maschera

vorrei rilevare l'evento AfterUpdate di una ComboBox tramite un evento 
di maschera, ma non riesco a trovare l'evento giusto, qualcuno può darmi 
una dritta?


A proposito dello stesso problema (irrisolto) ne aggiungo un altro: 
vorrei passare il riferimento a una maschera a una funzione di modulo di 
classe, ma VBA mi dà l'errore "tipo non corrispondente".
esempio:
dim obj as new search 'search modulo di classe, "filter" metodo pubblico
obj.filter(Me)  'errore!!!


Penso che tu ti debba spiegare meglio.
perché con:
    Private Sub Me.combo_AfterUpdate
        MsgBox "L'evento si è verificato"
    End Sub
avresti risolto (ma credo non sia quello che ti serve...)
Se invece intendi 'provocare l'evento AferUpdate' dai un'occhiata al thread
'VBA: eseguire il codice legato ad una casella combinata' iniziato il
22/5/2002 ore 14.46.
Ciao
--
Alberto

 avresti risolto (ma credo non sia quello che ti serve...)
[CUT]
infatti, il fatto è che dovrei richiamare la medesima funzione ogni 
volta che il valore selezionato in una delle combo box appartenenti a 
una determinata maschera  viene cambiato, e visto che sono un poltrone, 
e vorrei poter modificare il codice molto velocemente, avrei bisogno di 
scatenare la chiamata alla funzione senza dover settare l'evento 
AfterUpdate per ogni combo.

   Guardati nell'help la 'Property Set'
non ti seguo... potresti spiegarti meglio?
nella fattispecie il metodo filter del modulo di classe è strutturato 
come segue (è un'esperimento, ci sono ancora cose di VBA che non mi sono 
molto chiare...)
Public Sub Filter(Maschera As Form)
     Maschera.FilterOn = False
     Maschera.Filter = ""
     For Each ComboBox In Form
         Call check_string(Maschera.Filter, ComboBox)
     Next
     Maschera.FilterOn = True
End Sub

 non ti seguo... potresti spiegarti meglio?
Esempio:
Classe1
^^^^^^^
Option Explicit
Private m_Oggetto As Object
Property Get Larghezza() As Integer
    Larghezza = m_Oggetto.Width
End Property
Property Set Oggetto(ByVal obj As Object)
    Set m_Oggetto = obj
End Property
Private Sub Class_Terminate()
    Set m_Oggetto = Nothing
End Sub
Maschera1
^^^^^^^^^
Private Sub Command1_Click()
Dim cObj As New Class1
    Set cObj.Oggetto = Command1
    Debug.Print cObj.Larghezza
    Set cObj = Nothing
End Sub
' Maschera1 contiene un solo CommandButton
' chiamato Command1
Ciao.
-- 
-------------------------------------
http://digilander.iol.it/SimonenomiS/
-------------------------------------

[CUT]
così ci riuscivo già, io volevo far passare il riferimento alla maschera,
perchè ho bisogno di ciclare tutte le combo della maschera dal modulo di
classe... cioè mi prendo nel modulo di classe il riferimento alla maschera e
poi da lì leggo le proprièta di una combo che mi serviranno ad aggiornare la
maschera e il rowsource di tutte le altre combo, un altro problema nel fare
questo (oltre al passaggio del riferimento) e il fatto che non riesco a
trovare un evento di maschera che possa essere utilizzato equivalentemente e
in sostituzione di un "afterupdate" di combo, di modo da dover scrivere una
sola provedura d'evento per tutte le combo... così non ho problemi
nell'aggiungerne di nuove; le dovrei poter aggiungere alla maschera, e in
virtù di una sola procedura d'evento in maschera che richiama un opportuno
modulo di classe il tutto dovrebbe aggiuornarsi automaticamente... non sò se
mi sono spiegato...
più semplicemente... immagina di avere una maschera in formato tabulare con
due combo non collegate con rowsource identico a due dei campi della
maschera... come seleziono un valore in una delle combo la maschera *e il
rowsource dell'altera combo* sono filtrate di conseguenza... questo l'ho già
realizzato nel modulo sottostante alla maschera, ma volevo costruire un
oggetto facilmente riutilizzabile.
scusa se sono prolisso    ;)


Per quello che ne so io non si può. Però (forse) si può risolvere in un
altro modo.
Cosa deve fare quel codice che vuoi eseguire dopo ogni aggiornamento?
Ciao
--
Alberto


il codice dovrebbe passare il riferimento alla maschera a un modulo di
classe che deve fare la "scansione" dei valori contenuti in tutte le
combobox e filtrare i record della maschera e il rowsource di ogni combo
coerentemente ai valori selezionati, esempio semplice: se ho una lista di
record con fornitore e articolo , e due combo non associate con rowsource a
ognuno di questi campi, il selezionare un fornitore con la prima combo deve
far sì che la combo articoli visualizzi solo gli articoli conferiti da quel
fornitore, e la maschera deve essere filtrata di conseguenza, ho già fatto
una cosa del genere con 5 combo che si filtrano vicendevolmente e tutte
assieme la maschera, ma il codice deve essere scritto nel modulo associato
alla maschera, magari con pezzi in un modulo indipendente, vorrei portare la
maggior parte del codice in un modulo di classe in modo da poter
riutilizzare le stesse funzionalità ogni volta che mi servono senza dover
riscrivere tutto.

 ...
  <:-/
  Scherzo ;-)  
ho capito quello che che dici (leggendo xrò la risposta che hai 
dato ad Alberto S. ;) ) e credo mi sia venuta in mente una 
possibile soluzione che fa uso della classe e delle propp. name 
e tag delle combo... Provero' a scrivere 2 righe di codice e... 
ti faro' sapere.


 ha scritto nel messaggio
news:aco3c1$181$1...@newsreader.mailgate.org...

No, mi dispiace.
La situazione in cui io sono riuscito a bypassare gli eventi 'dopo
aggiornamento' era molto diversa (e forse anche un po' più semplice).
Beh, starò a vedere anch'io se salta fuori qualcosa di interessante.
Ciao
--
Alberto

bisogna impostare il campo "Tag" delle combobox (non associate) di 
ricerca identico al nome del campo contenuto nel rowsource, la sub può 
essere inserita sia in un modulo di classe che in un modulo normale
Option Compare Database
Option Explicit
Public Sub filtra(FormName As String)
     Dim Mask As Form
     Dim Cmb As Control
     Dim SubVirg As String
     Dim filtro As String
     filtro = ""
     Set Mask = Forms(FormName)
         Debug.Print "maschera: " & FormName
         For Each Cmb In Mask
             If Cmb.ControlType = acComboBox Then
                 'Debug.Print "combo:" & Cmb.Name
                 If IsNull(Cmb) = False And Cmb <> "" Then
                     SubVirg = Cmb
                     If InStr(SubVirg, Chr(34)) = 0 Then
                         filtro = filtro & " and " & Cmb.Tag & "=" & 
Chr(34) & SubVirg & Chr(34)
                     Else
                         SubVirg = Replace(SubVirg, Chr(34), "*")
                         filtro = filtro & " and " & Cmb.Tag & " like " 
& Chr(34) & SubVirg & Chr(34)
                     End If
                 End If
             End If
         Next
         If Len(filtro) > 5 Then
             filtro = Right(filtro, Len(filtro) - 5)
         End If
         'Debug.Print "filtro: " & filtro
         For Each Cmb In Mask
             If Cmb.ControlType = acComboBox Then
                 If filtro = "" Then
                     Cmb.RowSource = "select distinct " & Cmb.Tag & " 
from " & Mask.RecordSource & ";"
                     Debug.Print Cmb.RowSource
                 Else
                     Cmb.RowSource = "select distinct " & Cmb.Tag & " 
from " & Mask.RecordSource & " where " & filtro & ";"
                     Debug.Print Cmb.RowSource
                 End If
             End If
         Next
         Mask.FilterOn = False
         Mask.Filter = filtro
         Mask.FilterOn = True
End Sub

 essere inserita sia in un modulo di classe che in un modulo normale
alla subroutine và passato il nome della maschera:
call filtra(
me.name
)
oppure
dim obj as new search
	obj.filtra(
me.name
)
set obj=nothing

vedi sopra

nella maschera (in forma tabulare/continua) si posizionano le combo non
associate ma con row source a ciascuno dei campi che si vogliono filtrare,
*si imposta la proprietą "tag" di ognuna delle suddette combo identica al
nome del campo che filtrano*, poi nel modulo della maschera si scrive
qualcosa del genere per ogni combo:
Private Sub Resp_Divisione_AfterUpdate()
    filtra(Me.name)
End Sub
che vanno a richiamare la sub "filtra" nel modulo:


 bisogna impostare il campo "Tag" delle combobox (non associate) di
cut
Da un punto di vista semantico, un programmatore e' un artigiano, di fatto
quindi qui siamo tutti artigiani.
Se intendevi in senso "dispregiativo" pure gli esempi MS usano e consigliano
di usare la proprieta' Tag per finalita' simili alle tue.
Quindi la tua e' una soluzione "artigianale" nel senso "pregiativo" del
termine.
Sib

 termine.
grazie per l'apprezzamento, io la chiamo così perchè non conosco bene VBA e
suppongo esistano altri modi molto più eleganti e funzionali per fare la
stessa cosa, ad esempio non riesco a passare il riferimento alla maschera
come oggetto ma mi devo accontentare di passare il nome della stessa, poi
non riesco a rilevare dall'interno della funzione il tipo di dato del campo
rowsource della combo, così che non riesco a generalizzare la funzione in
modo che possa gestire automaticamente e indifferentemente anche filtri su
campi data o numerici, invece che solo di tipo testo.
vediamo se riesco ad arrangiarla  meglio...