Help con maschera continua

di il
28 risposte

Help con maschera continua

Ciao a tutti, sono nuovo di qui. Programmo con Access da un po' ma non sono certo un genio.

Ho bisogno d'aiuto con una maschera continua sulla quale, in ogni record, sono presenti diverse checkbox; quando alcune di esse vengono attivate ne disattivano altre e viceversa. Ora, il mio codice funziona e fa quello che deve fare, sebbene non sia ottimizzato.

Il problema è che quando faccio click sulle checkbox di un record, la modifica (almeno sulla maschera) incide su tutte le altre checkbox dei record presenti.

È possibile fare in modo che le modifiche (che sono tante in effetti) per ogni casistica si applichino SOLO al record corrente sulla maschera in modo da lasciare inalterati gli altri record?

Esempio del codice che devo modificare (di routine come questa ce ne sono tante quante sono le checkbox):

Private Sub gradingunico0_Click()
If Me.GradingUnico0 = -1 Then
    Me.GradingUnico1 = 0
    Me.GradingUnico2 = 0
    Me.GradingUnico3 = 0
    Me.GradingUnico4 = 0
    Me.GradingUnico5 = 0
    Me.ValoreGradingUnico = 0
    Me.TestoGradingUnico = "Non Applicabile"
End If
End Sub

Nota: questa parte del codice, viceversa (prima di End If)

    Me.ValoreGradingUnico = 0
    Me.TestoGradingUnico = "Non Applicabile"

influenza SOLO il record corrente. Come è possibile? Dipende dal fatto che si tratta di campi testo e numerico e non checkbox? Come ovviare?

Grazie!

Sergio

28 Risposte

  • Re: Help con maschera continua

    Le maschere continue sono un trauma anche per chi ha più esperienza, ma un disastro per chi non ne ha…

    Nelle maschere sia Singole che Continue, tu lavori sempre e solo sul Record Corrente, ma nelle maschere continue visualizzi anche gli altri e quì nasce l'inghippo…

    Quello che fai ovviamente non può funzionare se le CheckBox non sono Bound(associate) ad un campo reale in tabella.

    Quindi tutti i controlli NON BOUND quando li modifichi su un Record, verranno modificati su tutti i Records visualizzati proprio perchè non essendo associati di fatto quelli che vedi sugli altri Records sono come CLONI di quelli del Record attivo.

    Ora per ottenere quello che chiedi serve analizzare bene l'esigenza e capire come ottenerla… ma in particolare capire perchè non sono associati a Campi… se c'è un motivo dobbiamo capire bene per orientare la soluzione, che è fattibile ma magari con metodi che pochi usano, o meglio poco usuali… ma ti assicuro si può fare tutto.

  • Re: Help con maschera continua

    05/12/2023 - @Alex ha scritto:


    Quindi tutti i controlli NON BOUND quando li modifichi su un Record, verranno modificati su tutti i Records visualizzati proprio perchè non essendo associati di fatto quelli che vedi sugli altri Records sono come CLONI di quelli del Record attivo.

    Ciao Alex e grazie per la risposta.

    Sì, infatti pensavo di usare anche la funzione recordsetclone() ma ho fatto un casino e non funzionava (qui l'inesperienza).

    Il bello sta proprio qui: TUTTE le checkbox sono associate a un campo sottostante. Ho anche provato a cambiare l'evento associato, ma non cambia nulla (vedi codice seguente).

    Private Sub gradingunico0_AfterUpdate()
    If Me.GradingUnico0 = -1 Then
        Me.GradingUnico1 = 0
        Me.GradingUnico2 = 0
        Me.GradingUnico3 = 0
        Me.GradingUnico4 = 0
        Me.GradingUnico5 = 0
        Me.ValoreGradingUnico = 0
        Me.TestoGradingUnico = "Non Applicabile"
    End If
    End Sub

    Ora per ottenere quello che chiedi serve analizzare bene l'esigenza e capire come ottenerla… ma in particolare capire perchè non sono associati a Campi… se c'è un motivo dobbiamo capire bene per orientare la soluzione, che è fattibile ma magari con metodi che pochi usano, o meglio poco usuali… ma ti assicuro si può fare tutto.

    La necessità è semplice: Poiché le checkbox identificano un grading, questo deve essere univoco. Per evitare il problema ho anche provato a usare una checkbox unica ma peggio che andar di notte.

    Peraltro, il grading è su tre livelli diversi e quindi il codice si ripete tre volte (una per ogni livello). Allego screenshot della maschera per far capire meglio.

  • Re: Help con maschera continua

    Potresti fornire una descrizione del contesto più ampia? Per esempio nome maschera, di cosa parla il database, cosa vuoi fare. Magari conviene risolvere il tutto diversamente.

  • Re: Help con maschera continua

    05/12/2023 - OsvaldoLaviosa ha scritto:


    Potresti fornire una descrizione del contesto più ampia? Per esempio nome maschera, di cosa parla il database, cosa vuoi fare. Magari conviene risolvere il tutto diversamente.

    Certamente.

    Il programma è un sistemino HR che mi serve per associare determinate competenze ad alcuni ruoli aziendali.

    Per ogni ruolo è previsto che ci siano:

    • Un solo livello (es. i manager), che devono avere un grading unico (da “non applicabile” = 0 ad “alto” = 5) su una determinata competenza;
    • Un livello Junior, un livello Specialist e un livello Senior, che devono avere un grading diverso per ogni competenza a seconda del livello (es. una figura Junior può avere un grading “medio” (3) su una determinata competenza, una figura Specialist può avere un grading  “medio-alto” (4) sulla stessa competenza e una figura Expert può avere, sempre sulla stessa competenza, un grading “alto”.

    Nella maschera in oggetto, quando clicco sulla checkbox “Grading Unico”, deve succedere questo (e succede):

    • Tutte le altre checkbox sul record corrente eccetto quelle di grading unico sono azzerate e vanno in stato
    .enabled=false
    • Se deseleziono la checkbox “Grading Unico”, tutte le checkbox tornano in stato
    .enabled=true
    • Se seleziono una checkbox qualsiasi tra “Grading Junior”, “Grading Specialist” o “Grading Expert”, le corrispondenti checkbox vanno in stato
    .enabled=true

    Mentre quelle di “Grading Unico” si azzerano e vanno in stato

    .enabled=false

    Ora, tutto questo succede e funziona. Il problema è che le caselle vanno in stato “enabled=true" o “enabled=false” su tutti i record di tutta la maschera, rendendo confusionario l'input dei dati. Vorrei che le modifiche influenzassero il solo record corrente.

    Spero sia più chiaro :)

  • Re: Help con maschera continua

    Tutto più chiaro. Ma a che ti serve gestire tutte quelle checkbox? Usa solo la casella combinata e risolvi nella maniera più semplice.

  • Re: Help con maschera continua

    Qualche cosa in quello che dici non quadra, perchè se i controlli sono associati a Campi, vai a modificare il campo stesso in tabella e questo non può  accade di certo… 

    Ti chiederei se possibile di allegare un mini Esempio senza dati sensibili, ho bisogno di vedere realmente i controlli e come operano… 

  • Re: Help con maschera continua

    05/12/2023 - OsvaldoLaviosa ha scritto:


    Tutto più chiaro. Ma a che ti serve gestire tutte quelle checkbox? Usa solo la casella combinata e risolvi nella maniera più semplice.

    Sì, già provato, ma rallenta di molto l'input dell'utente. Non sarebbe un problema, se non fosse che comunque ho le checkbox della prima colonna che devono abilitare o disabilitare l'input e questo mi ripropone il problema che se clicco su uno mi si abilitano o disabilitano tutti quelli della maschera e non solo quelli del record corrente.

  • Re: Help con maschera continua

    05/12/2023 - @Alex ha scritto:


    Qualche cosa in quello che dici non quadra, perchè se i controlli sono associati a Campi, vai a modificare il campo stesso in tabella e questo non può  accade di certo… 

    Ti chiederei se possibile di allegare un mini Esempio senza dati sensibili, ho bisogno di vedere realmente i controlli e come operano… 

    Guarda, non ci sono dati sensibili dentro, la schermata che ho allegato sopra è esemplificativa. Qui invece (prima immagine) ti allego la struttura, così puoi vedere che la checkbox è associata a un campo che viene modificato.

    Ora, ripeto, non so se il problema è l'evento (click o afterupdate), ma quando clicco su una checkbox, mi si attivano o disattivano di conseguenza non solo quelle del record corrente ma quelle di tutti i record della maschera (seconda e terza immagine).

    Il codice che c'è sotto la checkbox “Grading Unico”, che è forse la più importante, è il seguente, evito di inserirlo tutto perché sono 624 righe. Il resto del codice è sulla falsariga.

    'Modifica e verifica i controlli Unico
    Private Sub GradingUnico_click()
    If Me.GradingUnico = -1 Then
       For i = 0 To 5
           CtlUni = "GradingUnico" & i
           Me.controls(CtlUni).Enabled = True
           Me.controls(CtlUni).value = 0
       Next i
       Me.GradingJunior.Enabled = False
       Me.GradingJunior.value = 0
       For i = 0 To 5
           CtlJnr = "GradingJunior" & i
           Me.controls(CtlJnr).Enabled = False
           Me.controls(CtlJnr).value = 0
           Me.ValoreGradingJunior = ""
           Me.TestoGradingJunior = ""
       Next i
       Me.GradingSpecialist.Enabled = False
       Me.GradingSpecialist.value = 0
       For i = 0 To 5
           CtlSpc = "GradingSpecialist" & i
           Me.controls(CtlSpc).Enabled = False
           Me.controls(CtlSpc).value = 0
           Me.ValoreGradingSpecialist = ""
           Me.TestoGradingSpecialist = ""
       Next i
       Me.GradingExpert.Enabled = False
       Me.GradingExpert.value = 0
       For i = 0 To 5
           CtlExp = "GradingExpert" & i
           Me.controls(CtlExp).Enabled = False
           Me.controls(CtlExp).value = 0
           Me.ValoreGradingExpert = ""
           Me.TestoGradingExpert = ""
       Next i
    ElseIf Me.GradingUnico = 0 Then
       Me.TestoGradingUnico = Null
       Me.ValoreGradingUnico = Null
       Me.GradingJunior.Enabled = True
       For i = 0 To 5
           CtlJnr = "GradingJunior" & i
           Me.controls(CtlJnr).Enabled = True
       Next i
       Me.GradingSpecialist.Enabled = True
       For i = 0 To 5
           CtlSpc = "GradingSpecialist" & i
           Me.controls(CtlSpc).Enabled = True
       Next i
       Me.GradingExpert.Enabled = True
       For i = 0 To 5
           CtlExp = "GradingExpert" & i
           Me.controls(CtlExp).Enabled = True
       Next i
    End If
    If Me.GradingUnico = 0 And Me.GradingJunior = 0 And Me.GradingSpecialist = 0 And Me.GradingExpert = 0 Then
       For i = 0 To 5
           CtlUni = "GradingUnico" & i
           CtlJnr = "GradingJunior" & i
           CtlSpc = "GradingSpecialist" & i
           CtlExp = "GradingExpert" & i
           Me.controls(CtlUni).Enabled = False
           Me.controls(CtlJnr).Enabled = False
           Me.controls(CtlSpc).Enabled = False
           Me.controls(CtlExp).Enabled = False
           Me.controls(CtlUni).value = 0
           Me.controls(CtlJnr).value = 0
           Me.controls(CtlSpc).value = 0
           Me.controls(CtlExp).value = 0
           Me.TestoGradingUnico = ""
           Me.ValoreGradingUnico = ""
           Me.TestoGradingJunior = ""
           Me.ValoreGradingJunior = ""
           Me.TestoGradingSpecialist = ""
           Me.ValoreGradingSpecialist = ""
           Me.TestoGradingExpert = ""
           Me.ValoreGradingExpert = ""
       Next i
    End If
    End Sub
  • Re: Help con maschera continua

    06/12/2023 - KKSergio ha scritto:


    05/12/2023 - OsvaldoLaviosa ha scritto:


    Tutto più chiaro. Ma a che ti serve gestire tutte quelle checkbox? Usa solo la casella combinata e risolvi nella maniera più semplice.

    Sì, già provato, ma rallenta di molto l'input dell'utente. Non sarebbe un problema, se non fosse che comunque ho le checkbox della prima colonna che devono abilitare o disabilitare l'input e questo mi ripropone il problema che se clicco su uno mi si abilitano o disabilitano tutti quelli della maschera e non solo quelli del record corrente.

    Per me si tratta di eliminare tutte le checkbox sia in tabella, sia in maschera. La maschera si alleggerisce sia da controlli che occupano spazio, sia da codici VBA inutili. Fai un compatta e ripristina. L'input su casella combinata non è affatto rallentato.
    Se temi di rovinare tutto il tuo giocattolo, fai una copia del database, apporta le modifiche che ti ho suggerito, fai un compatta e ripristina, poi verifica se ci sono rallentamenti sulla casella combinata.

    Altrimenti fai come meglio credi. Non dico altro.

  • Re: Help con maschera continua

    06/12/2023 - OsvaldoLaviosa ha scritto:


    06/12/2023 - KKSergio ha scritto:


    05/12/2023 - OsvaldoLaviosa ha scritto:


    Tutto più chiaro. Ma a che ti serve gestire tutte quelle checkbox? Usa solo la casella combinata e risolvi nella maniera più semplice.

    Sì, già provato, ma rallenta di molto l'input dell'utente. Non sarebbe un problema, se non fosse che comunque ho le checkbox della prima colonna che devono abilitare o disabilitare l'input e questo mi ripropone il problema che se clicco su uno mi si abilitano o disabilitano tutti quelli della maschera e non solo quelli del record corrente.

    Per me si tratta di eliminare tutte le checkbox sia in tabella, sia in maschera. La maschera si alleggerisce sia da controlli che occupano spazio, sia da codici VBA inutili. Fai un compatta e ripristina. L'input su casella combinata non è affatto rallentato.
    Se temi di rovinare tutto il tuo giocattolo, fai una copia del database, apporta le modifiche che ti ho suggerito, fai un compatta e ripristina, poi verifica se ci sono rallentamenti sulla casella combinata.

    Altrimenti fai come meglio credi. Non dico altro.

    Sì, mi è chiarissimo il tuo suggerimento e lo sposo in pieno. Il problema è chi sono gli utenti che mettono mano alla base dati (che hanno richiesto “non ci sarebbe un bottoncino?” perché la combo li affaticava troppo.

    Con ogni probabilità tornerò a questa soluzione (ho il backup della vecchia versione), ma mi resta il problema del flag principale: di quello ho bisogno perché il dato sottostante dovrà poi essere importato in un altro sistema di misurazione dei gap di competenze (Successfactors o Workday per capirci) che discrimina il tipo di valutazione che sarà fatto in base alla presenza o meno di quel dato.

    Mi riferisco alle checkbox di sinistra, che si comportano come detto: se “flaggate”, agiscono sui campi di tutta la maschera; a me serve che agiscano soltanto sui controlli del record corrente.

    Tieni anche conto che (provo una transcodifica): 

    Se Grading Unico è vero, allora
    	Grading Junior è falso e nel campo viene memorizzato zero
    	Grading Specialist è falso e nel campo viene memorizzato zero
    	Grading Expert è falso e nel campo viene memorizzato zero
    End If
    
    Se Grading Junior O Grading Specialist O Grading Expert è vero, allora
    	Grading Junior è falso e nel campo viene memorizzato zero
    End If
    
    Se poi uno tra Grading Junior, Grading Specialist e Grading Expert è vero e gli altri sono falsi, allora
    	Deve essere permesso l'input solo a quello vero
    	Grading Unico resta falso
    End If  
  • Re: Help con maschera continua

    Secondo me le 5 checkbox sono sbagliate tecnicamente perché ipotizzano la possibilità di selezionarne anche più di una, mentre tu vuoi la selezione esclusiva su una. Siccome il problema è puramente “estetico”, io ti consiglio di usare il “gruppo opzioni” con 5 opzioni. Quando l'utente sceglie una opzione, automaticamente esclude le altre. Siccome poi il gruppo opzioni è un oggetto solo di maschera (non contiene dati da dare in pasto alla tabella) puoi vincolare il suo valore di scelta che ricade sulla casella combinata che vedo a destra.

  • Re: Help con maschera continua

    06/12/2023 - OsvaldoLaviosa ha scritto:


    Secondo me le 5 checkbox sono sbagliate tecnicamente perché ipotizzano la possibilità di selezionarne anche più di una, mentre tu vuoi la selezione esclusiva su una. Siccome il problema è puramente “estetico”, io ti consiglio di usare il “gruppo opzioni” con 5 opzioni. Quando l'utente sceglie una opzione, automaticamente esclude le altre. Siccome poi il gruppo opzioni è un oggetto solo di maschera (non contiene dati da dare in pasto alla tabella) puoi vincolare il suo valore di scelta che ricade sulla casella combinata che vedo a destra.

    Guarda, ho rimesso il codice com'era prima: checkbox a sinistra e combo a destra.

    La checkbox resta indispensabile - non posso mettere un gruppo di opzioni perché non sono mutuamente esclusive (ossia solo “Grading Unico” esclude le altre, mentre le altre possono essere presenti contemporaneamente). Vedi immagine.

    Resta il fatto che le modifiche devo poterle fare solo sul record corrente, mentre a me la maschera abilita o disabilita  i campi anche negli altri record.

    Nota: la stessa cosa succede anche se uso SOLO le combobox ed elimino le checkbox: le modifiche influenzano tutti i record.

  • Re: Help con maschera continua

    Se posti un file di esempio forse un aiuto è più semplice in quanto si può vedere direttamente che cosa hai fatto.

  • Re: Help con maschera continua

    06/12/2023 - Stifone ha scritto:


    Se posti un file di esempio forse un aiuto è più semplice in quanto si può vedere direttamente che cosa hai fatto.

    Credo di aver postato tutto il postabile, onestamente.

    Facciamo così, provo a semplificare:

    • Ho una maschera continua;
    • La maschera continua non permette aggiunta di record (estrae e visualizza);
    • Su ogni record devo aggiungere un dato attraverso una checkbox e una combobox;
    • La checkbox mi serve per abilitare o disabilitare la combobox;
    • Quando tocco la check sul primo record, questa modifica agisce su TUTTI i record della maschera;
    • Io voglio che questo avvenga SOLO sul record corrente.
Devi accedere o registrarti per scrivere nel forum
28 risposte