Newsgroup: it.comp.appl.access
Titolo: Associare una casella combinata ad un'altra...?

Ho la necessità di fare si chè una casella combinata (B) venga influenzata
dal contenuto di un'altra casella combinata (A).
Come fare? Io ho aggirato l'ostacolo mettendo nell'origine riga (della
seconda casella combinata (B)) il comando in cui dico alla query di
mostrarmi tutti i record che hanno il contenuto della prima casella
combinata(A). Tutto bene, funziona, ma solo al 50%!!
Già, perchè se mi accorgo di aver fatto una scelta sbagliata e riselezione
un'altra voce dalla prima casella (A), la seconda (B) non rilegge più la
nuova informazione (ma sembra che memorizzi solo la prima scelta, ammeno che
non chiudo e riapro la maschera).
Come risolvere questo problema?

 ha scritto nel messaggio
news:KLUZ8.521$zL4....@news.edisontel.com...

tempo fà ho fatto un modulo che risolve e generalizza il problema e l'ho
postato per intero... ma pareva non interessasse a nessuno!    :)
peraltro ci stò lavorando per migliorarlo con degli eventi personalizzati ma
non fungono...    :-(    comunque eccoti di seguito la versione precedente,
grezza ma funzionante:
____________________________________________________________________________
_____________________________
'modulo (non di classe)
Private Sub filtra(FormName As String)
'questa funzione serve per implementare funzioni di filtro associativo
'per mezzo di combo box non associate su una maschera, la funzione và
chiamata
'all'evento Load della maschera e a ogni evento AfterUpdate delle combo
'
'Private Sub <nomecombo>_AfterUpdate()
'
'    filtra (Me.Name)
'
'End Sub
'
'limiti: non è importante settare il RowSource delle combo, ci pensa la
funzione
'richiamata all'avvio della maschera, l'importante è settare la proprietà
Tag delle
'combo CON IL NOME DEL CAMPO CHE SI DEVE FILTRARE.
'ATTENZIONE: il RecordSource della maschera contenente le combo può
contenere solo
'il nome di una query o tabella, se è impostato a una istruzione SQL
esplicità
'la funzione darà errori, INOLTRE IL NOME DEL CAMPO DEVE ESSERE UNIVOCO
'IN TUTTO IL DATABASE
'SI CONSIGLIA: nell'evento DblClick delle combo scrivere il seguente codice:
'
'Private Sub <nomecombo>_DblClick(Cancel As Integer)
'
'   Me.<nomecombo>.Text = ""
'   strDivisione = ""
'   Call filtra(Me.Name)
'
'End Sub
'
'
'____________________________________________________________
    Dim Mask As Form
    Dim cmb As Control
    Dim filtro As String
    Dim Tipo As String
    Dim Valore As String
    filtro = ""
    Set Mask = Forms(FormName)
        For Each cmb In Mask
            If cmb.ControlType = acComboBox And IsNull(cmb.Tag) = False And
cmb.Tag <> "" Then
                If IsNull(cmb) = False Then
                    Tipo = FindField(cmb.Tag)
                    Valore = cmb
                    If Tipo = "testo" Then
                        If InStr(Valore, Chr(34)) = 0 Then
                            filtro = filtro & " and " & cmb.Tag & "=" &
Chr(34) & Valore & Chr(34)
                        Else
                            Valore = Replace(Valore, Chr(34), "*")
                            filtro = filtro & " and " & cmb.Tag & " like " &
Chr(34) & Valore & Chr(34)
                        End If
                    End If
                    If Tipo = "data" Then
                        filtro = filtro & " and " & cmb.Tag & "=#" &
Mid(Valore, 4, 3) & Left(Valore, 3) & Mid(Valore, 7, 4) & "#"
                    End If
                    If Tipo = "numerico" Then
                        filtro = filtro & " and " & cmb.Tag & "=" & Valore
                    End If
                    If Tipo = "errore" Then
                        MsgBox "questa applicazione ha provocato un errore
inaudito e verrà inesorabilmente terminata", vbCritical + vbOKOnly, "SEI
NELLA MERDA"
                        DoCmd.Quit
                    End If
                End If
            End If
        Next
        If Len(filtro) > 5 Then
            filtro = Right(filtro, Len(filtro) - 5)
        End If
        For Each cmb In Mask
            If cmb.ControlType = acComboBox And IsNull(cmb.Tag) = False And
cmb.Tag <> "" Then
                If filtro = "" Then
                    cmb.RowSource = "select distinct " & cmb.Tag & " from "
& Mask.RecordSource & ";"
                Else
                    cmb.RowSource = "select distinct " & cmb.Tag & " from "
& Mask.RecordSource & " where " & filtro & ";"
                End If
            End If
        Next
        Mask.FilterOn = False
        Mask.Filter = filtro
        Mask.FilterOn = True
End Sub
Private Function FindField(Lui As String) As String
        Dim tbl As TableDef
        Dim fld As dao.field
        Dim prp As Variant
        For Each tbl In CurrentDb.TableDefs
            For Each fld In tbl.Fields
                If fld.Name = Lui Then
                    Select Case fld.Type
                        Case dbDate
                            MsgBox "data"
                            FindField = "data"
                        Case dbText
                            MsgBox "testo"
                            FindField = "testo"
                        Case dbInteger, dbLong, dbByte, dbFloat, dbSingle,
dbDouble, dbBigInt, dbBinary, dbBoolean, dbCurrency, dbDecimal, dbNumeric
                            MsgBox "numerico"
                            FindField = "numerico"
                        Case Else
                            MsgBox "errore"
                            FindField = "errore"
                    End Select
                End If
            Next
        Next
End Function



Prova a forzare una requery della casella combinata B sull'evento
AfterUpdate della casella A.
Ciao
Marco.

 ha scritto nel messaggio
news:KLUZ8.521$zL4....@news.edisontel.com...

Oltre a quello che hai già fatto e ti funziona al 50%, a fronte dell'evento
"Dopo aggiornamento" della casella combinata (A) esegui un Requery della
casella combinata (B).
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

--> per Marco Tognon e Roberto da Casa:
Ehmm... dimenticavo di darvi una un piccolissimo dettaglio. Sono alle prime
armi, e alcune di queste "parolacce" non le conosco. Mi vergogno un po a
confessarvelo, ma se non lo faccio continuo a rimanere un ignorante.
Ho cercato di trovare in giro la "parolaccia" REQUERY, ma nulla!
Vuoi forse dire di R(E)iproporre la QUERY ? o è un comando che non conosco
ancora?
--> per Bradipo: Grazie, ma per ora credo sia troppo per me, utilizzare i
tuoi suggerimenti, ma ne farò sicuramente tesoro conservandoli ed
esaminandoli non appena sarò in grado di capirli.




Inserisci il codice seguente nell'evento "Dopo aggiornamento" della
casella combinata A:
	me![Nome della tua casella combinata B].requery
Avrai ottenuto un comando che viene eseguito dopo che la tua casella A
viene modificata (non è precisamente così ma è per capirci) e che dice
ad Access di eseguire il ricalcolo dell'origine dalla quale arrivano i
dati nella casella B.
Ciao
Marco.

 viene modificata (non č precisamente cosě ma č per capirci) e che dice


___________________
No, l'errore non è determinato dal trovare il valore identico.
Le tue caselle combinate hanno sicuramente un'origine controllo (il
nome del campo dove andranno memorizzati i dati) e un'origine riga
(l'insieme dal quale prelevare i valori da memorizzare). Probabilmente
la frase SQL che hai inserito nell'origine riga di una o dell'altra
casella non è corretta.
Ti faccio un esempio con una tabella come la immagino io. Ho una
tabella ARTICOLI contenente tra gli altri il campo CATEGORIA ed il
campo TIPO_ARTICOLO (che sono quelli che ci interessano)
Nella maschera tu hai creato due caselle combinate, una con origine
controllo = CATEGORIA e l'altra con origine controllo = TIPO_ARTICOLO;
questi sono i campi dove verranno registrati i dati.
Per evitare confusione, chiama le caselle CASELLA_CATEGORIA e
CASELLA_TIPO_ARTICOLO. Chiamare i tuoi controlli in modo diverso dal
nome del campo di origine è una buona cosa in Access, per evitare
riferimenti scorretti. 
Nella casella combinata CASELLA_CATEGORIA l'origine riga la pongo a:
SELECT Articoli.Categoria FROM Articoli GROUP BY Articoli.Categoria;
mentre la CASELLA_TIPO_ARTICOLO avrà come origine riga:
SELECT Articoli.Articolo FROM Articoli WHERE
(((Articoli.Categoria)=[Casella_Categoria]));
Se poi inserisci il codice che ti dicevo, cioè:
me.Casella_Tipo_Articolo.requery
nel codice corrispondente all'evento dopo aggiornamento della
CASELLA_CATEGORIA, hai completato il quadro.
A me funziona.
Se per caso non sai come inserire del codice in risposta al
verificarsi di un evento, fai così: 
- In modalità struttura della maschera, seleziona la CASELLA_CATEGORIA
e visualizza le proprietà
- Clicca sulla linguetta EVENTO
- Clicca sulla riga "Dopo aggiornamento"
- Clicca sui tre puntini che appaiono a destra della riga.
- Quello che ti appare è il posto dove scrivere il famoso
me.Casella_Tipo_Articolo.requery
Chiudi tutto salvando e vedrai che va.
Buon Lavoro!
Marco

___________________
No, l'errore non è determinato dal trovare il valore identico.



______________________________________________________
Ok! ma se io ho la necessità di aggiornare periodicamente la tabella
"ARTICOLI" da distribuire ad altri db, e debbo memorizzare solo
"TIPO_ARTICOLO" in una tabella diversa (riassunto: tARTICOLI in solo lettura
e tTIPO_ARTICOLO in scrittura), come modifico la tua "istruzione"?
Ora ti dico come avevo strutturato io le istruzioni (legenda: cr=casella di
riepilogo; t=tabella; q=query -questi sono i prefissi che uso davanti ai
nomi-):
Ho creato 3 tabelle:
tCATEGORIE con solo il campo "CATEGORIA"
tELENCO con i campi "ARTICOLO" ed il campo "CATEGORIA"
tVUOTO con i campi da riempire "ARTICOLO" "PREZZO" ed eventuali altri campi
creo una crCATEGORIA che non ha nessun origine di controllo ma che ha solo
un origine riga così composta:
SELECT tCategorie.Categoria FROM tCategorie;
creo una crARTICOLI con origine di controllo "ARTICOLO" della tabella vuoto,
ed origine riga così composto:
SELECT Elenco.Categoria FROM Elenco WHERE
(((Elenco.Categoria)=Forms!maschera![crCategoria]));

 ancora?
Mi sembra che stai risolvendi il tuo problema dialogando con Marco.



Ciao Roby,
se mi dai una mano anche tu ad imparare qualcosa non mi offendo!  ;-))
Sai com'č... a volte, un pensiero, un idea espressa in modo diverso puň
illuminare qualcuno... e tra tante persone che si esprimono c'č sempre
quella che ci illumina... Ciao!!

 quella che ci illumina... Ciao!!
Allora prova ad andare sul Sito Comune (link qui sotto);  fai il download
del database di esempi allegato alla FAQ che si trova nella Sezione Forms e
che è intitolata "Esempi di utilizzo delle forms".
Apri tale database e seleziona il Topic intitolato "Synchronizing Two Combo
Boxes on a Form".
Ti verrà mostrato un esempio di ciò che vuoi realizzare: le spiegazioni
dettagliate di come realizzare l'esempio le trovi al sguente link:
http://support.microsoft.com/support/kb/articles/Q97/6/24.asp?PR=ACC
Con gli omaggi di mamma Mocrosoft. ;-)
