Newsgroup: it.comp.appl.access
Titolo: Formattazione condizionale tra due sottomaschere

ciao a tutti
 
Non riesco a realizzare la
formattazione condizionale tra due sottomaschere con piu' di un id.
Se ho p.e. un solo id:
 
Forms!MiaForm!MiaSubForm!Id=id
 
funziona, ma se ho in "MiaForm" piu' id, non funziona piu'.
Come faccio a far trovare l'id?
 
 
grazie


Visualizza la maschera in struttura, seleziona la sottomaschera che devi aggiornare e, nel menu contestuale del pulsante destro, seleziona proprietà. In proprietà vai al tab Dati: sulla riga Collega Campi master inserisci i nomi degli id presenti nella maschera principale separati da un punto e virgola e sulla riga Collega Campi Secondari fai la stessa cosa.


grazie leblanc
 
la mia sottomaschera e' a maschere continue, se faccio come mi hai suggerito
la colorazione del controllo riguarda solo l'id corrente, mentre
io lo vorrei per tutti gli id.
Credo sia necessario qualcosa tipo "find" nell'espressione della FC


in pratica....
 
ho due sottomaschere a maschere continue e vorrei
colorare i controlli che hanno il medesimo id in
entrambe le sottomaschere.


Onestamente non ho capito bene la struttura di MiaForm e delle sottomaschere nè qual'è il riaultato che vuoi ottenere. Nelle mie applicazioni uso poco la formattazione condizionale e quando mi serve evidenziare qualcosa di particolare utilizzo direttamente codice VBA. 
Hai dato un occhiata a quest'articolo: 
https://support.office.com/it-it/article/Modificare-l-aspetto-di-un-controllo-utilizzando-la-formattazione-condizionale-6ba9e9fa-4347-4183-b335-44e43b05e22f
 
Grazie


ciao leblanc e grazie
provo a spiegarmi meglio, visto che con FC non
riesco ad avere il risultato sperato.
 
Ho maschera con 2 sottomaschere entrambi da query
p.e.:
sottomaschera1
id
10
20
 
sottomaschera2
id
1
5
8
10 (da colorare)
11
20 (da colorare)
ecc.
 
ora io vorrei colorare i controlli della sottomaschera2
che ho segnalato con (da colorare)
e poco importa se è con VBA anziche' FC
 
 
 
 


Scusa il ritardo nel rispondere ma, dove sono adesso, ho accesso limitato ad internet. Nel tuo caso la formattazione condizionale non funziona per più di un ID perché, facendo riferimento al campo di un'altra sottomaschera a maschere continue, avrai sempre e solo i valori del record che ha il focus e quindi la condizione sarà applicata solo per i valori uguali al primo rigo della sottomaschera1. Per poter quindi aggiungere tutti i valori di sottomaschera1 alla formattazione condizionale devi, prima che Sottomaschera2 visualizzi i dati, cercarti da codice quali sono i valori di ID di Sottomaschera1, crearti  le condizioni di formattazione e aggiungerli a Sottomaschera2. Qui di seguito ti passo il codice da aggiungere all'evento "Su Caricamento" di Sottomaschera2. Nel codice ho previsto fino a 5 colori diversi corrispondenti a 5 diversi ID di Sottomaschera1:
 
Option Compare Database
 
Dim i, x As Long
Dim frm As Form
Dim rs As DAO.Recordset
Dim fld As Field
Dim ctl As Control
Dim MyId(5) As Long         'Campo dove conservare i valori di ID (numerici??) di sottomaschera1
Dim objFrc As FormatCondition
 
 
 
Private Sub Form_Load()
    Const orange As Long = 62207
    Const yellow As Long = 65535
    Const blue As Long = 16769482
    Const green As Long = 10156544
    Const grey As Long = 12568013
 
' Con le istruzioni sottostante ricavi gli ID di Sottomaschera1
    Set frm = Forms!MiaForm!Sottomaschera1.Form
    x = 1
    Set rs = frm.RecordsetClone
    i = rs.RecordCount              ' Conti quanti record hai in Sottomaschera1
    rs.MoveFirst
    Do Until rs.EOF
        'In MyID inserisci i differenti valori ID di Sottomaschera1
        MyId(x) = rs!ID
        x = x + 1
        If x > 5 Then GoTo Fine
        rs.MoveNext
    Loop
Fine:
    rs.Close
    Set rs = Nothing
        For Each ctl In Me.Controls       ' Qui controlli il Nome del campo di Sottomaschera2 da sottoporre a formattazione condizionale
        If ctl.Name = "ID" Then
            With ctl
                'Elimini precedenti formattazioni
                .FormatConditions.Delete
 
                'Crei le regole di formattazione per ogni valore di MyID
 
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(1))
 
                If i = 1 Then 'Specifichi come deve essere formattato il campo ID (quale colore)
                .FormatConditions(0).BackColor = green
                .FormatConditions(0).Enabled = True
                GoTo Fine1
                End If
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(2))
                If i = 2 Then 'Specifichi come deve essere formattato il campo ID (quale colore)
                .FormatConditions(0).BackColor = green
                .FormatConditions(0).Enabled = True
 
                .FormatConditions(1).BackColor = yellow
                .FormatConditions(1).Enabled = True
                GoTo Fine1
                End If
 
                If i = 3 Then
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(3))
                'Specifichi come deve essere formattato il campo ID (quale colore)
                 .FormatConditions(0).BackColor = green
                .FormatConditions(0).Enabled = True
 
                .FormatConditions(1).BackColor = yellow
                .FormatConditions(1).Enabled = True
 
                .FormatConditions(2).BackColor = blue
                .FormatConditions(2).Enabled = True
                GoTo Fine1
                End If
                If i = 4 Then
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(4))
                'Specifichi come deve essere formattato il campo ID (quale colore)
                .FormatConditions(0).BackColor = green
                .FormatConditions(0).Enabled = True
 
                .FormatConditions(1).BackColor = yellow
                .FormatConditions(1).Enabled = True
 
                .FormatConditions(2).BackColor = blue
                .FormatConditions(2).Enabled = True
                .FormatConditions(3).BackColor = orange
                .FormatConditions(3).Enabled = True
                GoTo Fine1
                End If
                If i = 5 Then
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(5))
                'Specify the formating conditions
                .FormatConditions(0).BackColor = green
                .FormatConditions(0).Enabled = True
 
                .FormatConditions(1).BackColor = yellow
                .FormatConditions(1).Enabled = True
 
                .FormatConditions(2).BackColor = blue
                .FormatConditions(2).Enabled = True
                .FormatConditions(3).BackColor = orange
                .FormatConditions(3).Enabled = True
                .FormatConditions(4).BackColor = grey
                .FormatConditions(4).Enabled = True
 
                GoTo Fine1
                End If
 
Fine1:
            End With
        End If
    Next ctl
    Set objFrc = Nothing
 
 
 
End Sub
 
 
Fammi sapere se funziona secondo le tue aspettative.
Saluti


Scusa, volevo aggiungere una precisazione. Mi rendo conto che il codice sopra riportato potrebbe essere considerato ridondante dai professori del forum ma è stato scritto di getto giusto per vedere se funzionava in quanto, come già detto, non uso la formattazione condizionale. In effetti per applicare le condizioni basterebbe un loop da 0 al numero di record rilevato -1 dalla sottomaschera1 e un'altro per applicare il format colore desiderato aggiungendo una matrice dove inserire i valori numerici dei colori.
Saluti


grazie leblanc
 
pero' questo codice non colora dinamicamente
i controlli?


Cosa intendi per colorare dinamicamente i controlli? Quali? di quale sottomaschera? Quando? 
Hai scritto che hai due sottomaschere e vuoi che venga colorato il campo ID di sottomaschera2 per i valori di ID uguali a sottomaschera1 e il codice fa questo. Se la struttura di MiaForm è diversa e il recordsource di sottomaschera1 e stabilito, per esempio, da un dropdownbox di MiaForm bisogna aggiungere altro codice ma questo non è stato detto. Ti rifaccio quindi la domanda già fatta nel mio post del 17 u.s.: qual'è la struttura di MiaForm e delle due sottomaschere?
Saluti


ciao leblanc e grazie
 
scusami, ma per semplificare, ho tralasciato di dire che ho nella maschera un
ulteriore sottomaschera, dove in base ai dati che inserisco la sottomaschera1
aggiunge o toglie l'ID dinamicamente.
Dinamicamente=nello stesso istante
 
quindi anche il controllo id della sottomaschera2 si dovrebbe colorare 
immediatamente.


Ciao, scusa il ritardo, sono all'estero e ho una connessione ad internet saltuaria.
il codice postato in precedenza non cambia molto ma devi spostarlo nell'evento AfterUpdate(Dopo Aggiornamento) del controllo di sottomaschera1 i cui valori, cambiando, cambiano la stringa SQL utilizzata come sorgente di sottomaschera2.
Il codice quindi dovrebbe cambiare come segue:
 
Option Compare Database 
Option Explicit
Dim i, x As Long 
Dim frm As Form 
Dim rs As DAO.Recordset 
Dim fld As Field 
Dim ctl As Control 
Dim MyId(5) As Long         'Campo dove conservare i valori di ID (numerici??) di sottomaschera1 
Dim objFrc As FormatCondition
Dim Mycolor(5) As Long       ' qui carichi i numeri dei colori
Private Sub Controllo_AfterUpdate()
 
    Mycolor(0) = RGB(255, 165, 0)
    Mycolor(1) = RGB(255, 255, 224)
    Mycolor(2) = RGB(240, 255, 255)
    Mycolor(3) = RGB(127, 255, 212)
    Mycolor(4) = RGB(220, 220, 220)
    x = 0
    Set rs = Me.RecordsetClone 
    i = rs.RecordCount              ' Conti quanti record hai in Sottomaschera1 
    rs.MoveFirst 
    Do Until rs.EOF 
        'In MyID inserisci i differenti valori ID di Sottomaschera1 
        MyId(x) = rs!ID 
        x = x + 1 
        If x > 4 Then GoTo Fine 
        rs.MoveNext 
 
Fine:
        rs.close
        set rs=nothing
     For Each ctl In Forms!MiaForm!Sottomaschera2.Form       ' Qui controlli il Nome del campo di Sottomaschera2 da sottoporre a formattazione condizionale 
        If ctl.Name = "ID" Then 
            With ctl 
                'Elimini precedenti formattazioni 
                .FormatConditions.Delete 
 
                'Crei le regole di formattazione per ogni valore di MyID 
                 For x = 0 To i - 1
                Set objFrc = .FormatConditions.Add(acFieldValue, acEqual, MyId(x))
                .FormatConditions(x).BackColor = Mycolor(x)
                Next x
            End With
        End If
        Next
        Set objFrc = Nothing
 
Prova se così funziona. In ogni caso i promotori di questo gruppo tra cui @Alex, Karl, Rancati hanno pubblicato, sia sul Sito Comune sia sui loro siti, istruzioni sulla formattazione condizionale di maschere: sarebbe bene che dessi una occhiata anche li.