Valutazione valore controllo in una query nella formattazione condizionale

di il
12 risposte

Valutazione valore controllo in una query nella formattazione condizionale

Buongiorno a tutti,

sono 2 giorni che cercando info sul web provo inutilmente a risolvere questo problema:

vorrei utilizzare la formattazione condizionale in una maschera per colorare lo sfondo dei controlli (non associati) che hanno come valore un valore presente in un campo di una query (che restituisce più valori).

questo è il funzionamento:
ho una tabella con [campo1] e [campo2]
nella maschera ho una serie di controlli non associati che contengono un "valoreCtl"
sempre nella stessa maschera ho una casella combinata dalla quale seleziono un "valoreCombo"
ho una query che restituisce i valori di [campo2] dove [campo1]="valoreCombo"
vorrei applicare la formattazione condizionale ai controlli non associati in modo che se "valoreCtl" è contenuto nel risultato della query (valori in [campo2]) mi cambi il colore dello sfondo del controllo stesso.

è possibile fare ciò con la formattazione condizionale oppure devo scomodare VBA?

grazie in anticipo

12 Risposte

  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Io (me medesimo Osvaldo Laviosa) faccio fatica a seguirti con nomi di oggetti e controlli troppo generici. Credo di sì, ma non ho capito cosa vuol dire per te "è contenuto".
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    OsvaldoLaviosa ha scritto:


    Io (me medesimo Osvaldo Laviosa) faccio fatica a seguirti con nomi di oggetti e controlli troppo generici. Credo di sì, ma non ho capito cosa vuol dire per te "è contenuto".
    Ciao Osvaldo, grazie per la risposta..

    forse più che "è contenuto" sarebbe stato più corretto dire "è presente tra i valori di"....

    in pratica nell'espressione della formattazione condizionale vorrei riuscire a valutare se il valore contenuto nei controlli non associati (sui quali è applicata la formattazione) è presente nel risultato di una query (che restituisce più valori) e quindi applicare la formattazione.

    volevo utilizzare la formattazione condizionale perchè ho anche altre formattazioni condizionali sugli stessi controlli e se utilizzavo VBA solo per il problema esposto "vincevano" le altre formattazioni condizionali.

    Alla fine ho fatto tutto con VBA ma per la prossima volta mi piacerebbe capire se è possibile utilizzare la comoda formattazione condizionale per questo tipo di problema.

    tieni conto che i controlli da formattare sono circa 350, quindi mi serve un'espressione che vada bene per tutti..
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Usa DCOUNT(...)>0 come Espressione nella F.C. puntando alla Query come Dominio e passando il Valore del controllo come criterio.
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    @Alex ha scritto:


    Usa DCOUNT(...)>0 come Espressione nella F.C. puntando alla Query come Dominio e passando il Valore del controllo come criterio.
    grazie Alex,

    come faccio a passare il valore del controllo in un'espressione di F.C. considerando che l'espressione deve essere compatibile con tutti i controlli?
    in VBA ho utilizzato un ciclo che fa il giro di tutti i controlli (circa 350) formattandoli, ma in un'espressione non saprei come fare...
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Ci sarebbe da capire meglio lo scenario... perchè così non è chiaro... ipotizzo un Calendario di 365gg in cui ogni gg ha una FC dipendente da eventuali Attività presenti nel gg...
    In questo caso ad esempio coviene scrivere una funzione, ma serve sempre passare un parametro che diversifica poi il risultato della funzione...!
    Esempio
    
    Public Function AttivitaGG(mioGiorno as integer) as Boolean
    
    End Function
    IN Espressione poi scrivo
    
    =AttivitaGG(1)
    =AttivitaGG(2)
    ....
    =AttivitaGG(365)
    Io in questi casi, che poi parliamo di 1 Volta sola ovviamente, scrivo un codice che apre in struttura la Maschera e va a modificare il parametro nella Funzione quindi vado ad editare direttamente la Proprietà della F.C. in modo che poi sia scritta correttamente.

    Lancio il Codice da Finestra Immediata, si apre la Form... edito chiudo salvando.
    Una cosa simile, solo a titolo di ESEMPIO:
    
    Function SetFC()
        Dim iDx     As Byte
        Dim mF      As Access.Form
        Dim mFC     As Access.FormatCondition
        Dim mExpr   As String
        DoCmd.OpenForm "NomeForm", acDesign, , , , acHidden
        Set mF = Forms("NomeForm")
        
        For iDx = 1 To 365
            
            With mF.Controls(Source)
                mExpr = "=AttivitaGG(" & iDx & ")"
                Set mFC = .FormatConditions.Add(Tipo, Oper, mExpr)
                With mFC
                    .ForeColor = FColor
                    .BackColor = BColor
                    .FontBold = FBold
                    .FontItalic = FItalic
                    .FontUnderline = FUnderline
                End With
                Set mFC = Nothing
        
            End With
        Next
        
        DoCmd.Close acForm, mF.Name, acSaveYes
    
    End Function
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Ok Alex, i suggerimenti che mi hai dato torneranno molto utili in altre circostanze ma in questo caso forse mi complicherei un po' le cose...è stato più semplice (e forse più efficiente??) usare un ciclo for

    grazie a tutti e buone feste
    
    
    Dim ctl As Control
    For Each ctl In Me.Controls
    If IsNull(ctl) = True Then
    ctl.BackColor = VBA.RGB(166, 166, 166)
        ElseIf DLookup("[prodotto]", "[tabella_piazzale]", "[tabella_piazzale].[posizione] = '" & [ctl].[Name] & "'") = [ricercaProdotto] Then
        ctl.BackColor = VBA.ColorConstants.vbGreen
            ElseIf IsNull(ctl) = False Then
                ctl.BackColor = VBA.RGB(252, 230, 212)
    End If
    
    
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Fai attenzione... a 2 cose...
    1) Di solito la soluzione F.C. si valuta in esclusiva su Maschere Continue dove la gestione delle Properties del Controllo NON SI FA.
    2) Anche in Maschere continue, tuttavia, quando i Controlli sono molti, la F.C. anche se a me non piace, è molto più veloce... che un ciclo su 350 Controlli...

    Farai le tue valutazioni...

    P.S. questo codice NON SERVE, come non serve l'ultimo che usi con il risultato False, perchè è SEMPRE FALSE
    
    If IsNull(ctl) = True Then
    la collection controls NON HA controlli NULLI.
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    @Alex ha scritto:


    1) Di solito la soluzione F.C. si valuta in esclusiva su Maschere Continue dove la gestione delle Properties del Controllo NON SI FA.
    ok, da tenere a mente

    @Alex ha scritto:


    P.S. questo codice NON SERVE, come non serve l'ultimo che usi con il risultato False, perchè è SEMPRE FALSE
    
    If IsNull(ctl) = True Then
    la collection controls NON HA controlli NULLI.
    scendo dal melo...
    da semplice smanettone mi sfugge quindi come ho fatto a farlo funzionare..
    il ciclo for effettua le valutazioni correttamente e sui vari controlli ho la formattazione che desideravo, forse non ho capito bene cosa avrei potuto non inserire nel codice
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Metti un BreackPoint e vedi che non entra MAI nella Parte NULL=True, quindi il tuo codice andrebbe pulito così:
    
    Dim ctl As Control
    For Each ctl In Me.Controls
       If ctl.BackColor <> VBA.RGB(252, 230, 212) then ctl.BackColor = VBA.RGB(252, 230, 212)
       If DLookup("[prodotto]", "[tabella_piazzale]", "[tabella_piazzale].[posizione] = '" & [ctl].[Name] & "'") = [ricercaProdotto] Then
            If ctl.BackColor <> VBA.ColorConstants.vbGreen then ctl.BackColor = VBA.ColorConstants.vbGreen
       End If
    Next
    Nella sostanza applicare una formattazione Grafica impatta sul Repaint, se non serve perchè il colore è già quello giusto non vale la pensa forzarlo...
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Ho detto una grande cavolata, ero concentrato su Is Nothing, quindi sull'esistenza dell'oggetto mentre IsNull è sul Valore dell'Oggetto puntato...!
    Quindi il codice è corretto...
    
    Dim ctl As Control
    For Each ctl In Me.Controls
       If IsNull(ctl) = True Then
            If ctl.BackColor <> VBA.RGB(166, 166, 166) then ctl.BackColor = VBA.RGB(166, 166, 166)
       ElseIfDLookup("[prodotto]", "[tabella_piazzale]", "[tabella_piazzale].[posizione] = '" & [ctl].[Name] & "'") = [ricercaProdotto] Then
            If ctl.BackColor <> VBA.ColorConstants.vbGreen then ctl.BackColor = VBA.ColorConstants.vbGreen
       Else
            If ctl.BackColor <> VBA.RGB(252, 230, 212) then ctl.BackColor = VBA.RGB(252, 230, 212)
       End If
    Next
    
    Porta pazienza...
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Ottimo, perfezionerò il codice come mi hai suggerito, visto che l'applicazione girerà anche su PC belli "piantati"

    O.T. sono nuovo e non so se su questo forum si mette il "grazie" o "risolto" o se in qualche modo si danno i crediti
  • Re: Valutazione valore controllo in una query nella formattazione condizionale

    Nessun credito, ma puoi mettere Risolto credo...
Devi accedere o registrarti per scrivere nel forum
12 risposte