VBA: Commutare con DoppioClic

di il
7 risposte

VBA: Commutare con DoppioClic

Vorrei con DoppioClic sul controllo IDTitolo commutare la proprietà RowSource. Questo codice
Private Sub IDTitolo_DblClick(Cancel As Integer)
If Me![IDTitolo].RowSource = "TOrdinatiStandard" Then
Me![IDTitolo].RowSource = "TOrdinatiClassica"
End If
If Me![IDTitolo].RowSource = "TOrdinatiClassica" Then
Me![IDTitolo].RowSource = "TOrdinatiStandard"
End If
End Sub
fa (ovviamente) ritornare all'impostazione primordiale. Cosa devo correggere?
Se funziona come penso, vorrei riciclarla su un altro controllo in un'altra sottomaschera sfruttando Me! Sia in questo caso, sia nell'altra maschera, la commutazione avviene in un controllo di sottomaschera. Nell'altro caso è gestita con una macro condizionata. Nelle macro non è possibile mettere Me! ma occorre la sintassi completa. In VBA ci sono problemi a usare Me! come riferimento a sottomaschera ignorando la maschera principale?

7 Risposte

  • Re: VBA: Commutare con DoppioClic

    Prova così se ho capito bene
    
    Private Sub IDTitolo_DblClick(Cancel As Integer)
        If Me![IDTitolo].RowSource = "TOrdinatiStandard" Then
             Me![IDTitolo].RowSource = "TOrdinatiClassica"
        Else
             Me![IDTitolo].RowSource = "TOrdinatiStandard"
        End If
    End Sub
  • Re: VBA: Commutare con DoppioClic

    Funziona.
    Il cambio di RowSource avviene. Però (piccolissimo fastidio) subito dopo doppio-clic mi mostra un record astruso. Se solo sposto il mouse in un'altra zona di maschera principale e clicco da qualsiasi parte, il tutto si rimette a posto. Dovrei aggiungere un Requery? Dove?

    Volendo riciclare lo stesso codice per l'altra maschera/sottomaschera (Supporti/DettagliSupporti), mi conviene copiare/incollare così come è lo stesso codice? Oppure, se domani dovessi avere una terza incombenza simile, mettere una Public Sub e creare 2-3 Private Sub con DoppioClic e Call (NomePublicSub)? Mi insegni come procedere?
    Puoi confermarmi che la dichiarazione Me! è strettamente legata alla maschera da cui parte indipendentemente dove si trovi (se da sola o in una sottomaschera)?
  • Re: VBA: Commutare con DoppioClic

    OsvaldoLaviosa ha scritto:


    Il cambio di RowSource avviene. Però (piccolissimo fastidio) subito dopo doppio-clic mi mostra un record astruso. Se solo sposto il mouse in un'altra zona di maschera principale e clicco da qualsiasi parte, il tutto si rimette a posto. Dovrei aggiungere un Requery? Dove?
    Private Sub IDTitolo_DblClick(Cancel As Integer)
        If Me![IDTitolo].RowSource = "TOrdinatiStandard" Then
             Me![IDTitolo].RowSource = "TOrdinatiClassica"
        Else
             Me![IDTitolo].RowSource = "TOrdinatiStandard"
        End If
    DoCmd.Requery
    End Sub
    Così funziona alla grande!
  • Re: VBA: Commutare con DoppioClic

    Osvaldo, fai sempre attenzione e cerca di capire quando fai le cose, cosa stai facendo...!

    Il difetto che accennavi sembra più di grafica che di dati prima di tutto.
    La modifica del RowSource teoricamente genera già un Requery, tuttavia è presente qualche BUG che in alcuni casi richiede una cosa simile
    
    Private Sub IDTitolo_DblClick(Cancel As Integer)
        If Me![IDTitolo].RowSource = "TOrdinatiStandard" Then
             Me![IDTitolo].RowSource = "TOrdinatiClassica"
        Else
             Me![IDTitolo].RowSource = "TOrdinatiStandard"
        End If
        Me![IDTitolo].RowSource=Me![IDTitolo].RowSource
    End Sub
    
    Perchè quello che hai fatto tu non solo non ha senso ma è proprio sbagliato...?
    Perchè prima di tutto va ad agire su tutta la MASCHERA, quindi sul RecordSource di Maschera e di tutti gli Oggetti DataBound in essa contenuti, e solitamente è da evitare, secondo perchè eventualmente serva lo si fa solo ed esclusivamente sull'Oggetto della variazione... e nel tuo caso il controllo [IdTitolo].

    Prova come ti ho suggerito e dovrebbe funzionare.
  • Re: VBA: Commutare con DoppioClic

    Mmm!!! Non metto in dubbio che si tratti di un problema puramente grafico. La tua ultima soluzione risolve a metà strada fra il 1° tuo e il mio ultimo.
    Il tuo ultimo codice, nei casi di più record, può mostrare anche momentaneamente RowSource1 sui precedenti record e RowSource2 nel record doppio-cliccato. Non è malvagio, ma poi, a un clic da qualsiasi parte, tutti i record si allineano a un solo RowSource.
    Se devo essere sincero, preferisco il mio ultimo. Sortisce esattamente l'effetto che desideravo. Se non devo usare Requery (dal suo punto di vista strettamente filosofico-filologico), a me anche un Aggiorna mi torna utile.

    @Alex ha scritto:


    Perchè prima di tutto va ad agire su tutta la MASCHERA, quindi sul RecordSource di Maschera e di tutti gli Oggetti DataBound in essa contenuti, e solitamente è da evitare, secondo perchè eventualmente serva lo si fa solo ed esclusivamente sull'Oggetto della variazione... e nel tuo caso il controllo [IdTitolo].
    Vuoi dire che l'ho messo in un punto sbagliato? Dovrei mettere DoCmd.Requery subito dopo ogni cambio di RowSource? Dove andrebbe messo più correttamente?

    Puoi rispondere anche alle altre mie domande più generali? Oppure devo aprire un nuovo thread?
  • Re: VBA: Commutare con DoppioClic

    Provo a ripetere...
    Quello che hai fatto è SBAGLIATO a prescindere ti piaccia di più....!!!
    Se ottieni il risultato voluto non significa sia il metodo giusto...!
    Portrebbero esserci altri fattori che inficiano le considerazioni che stiamo facendo di cui tu non tieni conto... quì dovrei analizzare un'esempio...!

    Di fatto quello che ti ho suggerito ti garantisco che funziona da sempre... e da il risultato che deve dare... se il tutto, vale a dire il contorno, non interagisce in modo anomalo con il sistema ipotizzato...!!!!!

    Perchè è sbagliato...?
    Supponi di avere 100 ComboBox nella tua Form...!

    Usando il Requery come hai fatto tu... TUTTE le 100 ComboBox verranno ricaricate con un traffico dati inutile ed un decadimento prestazionale assurdo...!!
    Ti pare corretto ricaricarne 100 se ne hai modificata 1...?

    NO ovviamente è sbagliatissimo a prescindere.
    E' un concetto non solo di efficienza... ma di opportunità...!
    Quindi nell'eventualità sarà da scrivere
    
    Me!NomeCombo.Requery
    questa sintassi forza sempre il Requery, ma della SOLA combo oggetto di azione di modifica.
    Come ho già avuto modo di esporre, ma spesso non cogli le finezze dei suggerimenti, gli oggetti DataBound, tutti quindi Form/SubForm/Combo/ListBox, espongono metodi individuali per la RIESECUZIONE della query(Requery) che però si usa solo se il Recordset è stato oggetto di Aggiunte o Cancellazioni, oppure del Metodo REFRESH che invece si usa se il Recordset è stato oggetto di Editazione.
    Il tuo caso è anomalo in quanto ha avuto effetto proprio sull'intera origine del RowSource, quindi il controllo attua una serie di riverifiche di impostazione(Columns, Rows, FieldType ecc..) il che genera un comportamento anomalo nel sistema..., gestibile chiaramente...!

    In VBA il [Me] indica l'Oggetto nel quale si sta scrivendo il codice... se sei nella pagina VBA della Maschera il [Me] è riferito alla Maschera, se sei nella pagina della SubForm il [Me] è sempre l'oggetto contenitore quindi la SubForm, se sei in un Modulo di Classe il [Me] è l'istanza della Classe.
    In un Modulo Standard non si usa il [Me] in quanto questo non è visto come un'oggetto con interfaccia.

    Quindi se da una Form devi riferirti ad un'oggetto nella SubForm
    
    Me!NomeSubForm!NomeOggetto.NomeProprietà
  • Re: VBA: Commutare con DoppioClic

    Forse ho dato adito a qualche equivoco. Per la precisione io ho una maschera principale Ricerca (solo estetica). Dentro questa ho 3 sottomaschere in foglio dati (indipendenti fra loro e indipendenti da Ricerca): T, A, I. La casella combinata IDTitolo sta dentro la sottomaschera T. Il giochetto Me! inizia e si esaurisce sempre e dentro T. In T c'è soltanto una casella combinata IDTitolo. Da questo punto di vista non la vedrei così tragica. Secondo me, in quel momento l'attenzione è su IDTitolo e suppongo che il DoCmd.Requery faccia il suo dovere limitatamente lì...non saprei.
    OK, ho sostituito con:
    Me!IDTitolo.Requery
    ottengo un risultato ugualmente soddisfacente e tengo contento anche te.
Devi accedere o registrarti per scrivere nel forum
7 risposte