Newsgroup: it.comp.appl.access
Titolo: Maschera disattivata da DoCmd.RunCommand acCmdRemoveFilterSort

Salve,
ho la necessità di salvare il nome della maschera attivata e di quella
appena disattivata in due campi testo di una maschera invisibile e
sempre aperta. Utilità che mi occorre per impostare svariati criteri
sia in alcune query che nel codice delle maschere.
Per quella attivata non ho problemi perché mi basta scrivere
sull’evento “attivazione”: Forms!MascheraInvisibile!MascheraAttivata =
Me.name
Per quella disattivata allo stesso modo basterebbe scrivere
sull’evento “disattivazione”:
Forms!MascheraInvisibile!MascheraDisattivata = Me.name
Il problema nasce sull’evento disattivazione quando capita che
disattivo una maschera per attivarne un’altra che ha come evento su
caricamento la funzione “DoCmd.RunCommand acCmdRemoveFilterSort”.
Infatti succede che il dato salvato sul campo MascheraDisattivata è
uguale a quello sul campo MascheraAttivata. Pare che tale funzione
abbia l’effetto di disattivare prima e riattivare dopo la maschera in
una frazione di secondo, provocando l’indesiderato effetto di
restituirmi per l’appunto il nome della stessa maschera e non di
quella che avevo disattivato in precedenza. Tutto ciò non accade se
inibisco la suddetta funzione.
Ho provato a scrivere anche tutto sull’evento attivazione la seguente
sequenza:
Forms!MascheraInvisibile!MascheraDisattivata = Forms!
MascheraInvisibile!MascheraAttivata
Forms! MascheraInvisibile!MascheraAttivata = Me.name, ma l’effetto non
cambia.
Il comportamento di “DoCmd.RunCommand acCmdRemoveFilterSort” per
quanto sembri bizzarro credo sia necessario e non un bug. Stà di fatto
però che mi impedisce di salvare il nome della maschera disattivata in
precedenza.
L’alternativa sarebbe quella di scrivere “Forms!MascheraInvisibile!
MascheraDisattivata = Me.name” sull’evento click di ogni pulsante che
mi apre un’altra maschera, ma vorrei evitare di farlo perché per
quanto sia breve il codice, sono tanti i pulsanti e tante le maschere.
Sono graditi suggerimenti.
Grazie, cranze

 Me.name
Così protrebbe andare?
Private Sub Form_Activate()
     Forms!MascheraInvisibile!MascheraDisattivata = _
          Nz(Forms!MascheraInvisibile!MascheraAttivata,"")
     Forms!MascheraInvisibile!MascheraAttivata = _
          Me.name
End Sub
Ciao
-- 
Alberto S

 Alberto S
Ti ringrazio per l'interessamento ma il problema sussiste.
Anche così non si evita l'effetto che "DoCmd.RunCommand
acCmdRemoveFilterSort"
causa al caricamento della maschera che lo contiene, che come ripeto
prima la disattiva e poi la riattiva,
sostituendo quindi, nel campo MascheraDisattivata, il nome della
maschera appena aperta a quello della
maschera sulla quale ho premuto il pulsante che la apre.
Altri suggerimenti?
Ciao e grazie, cranze.

 Grazie, cranze 

 Altri suggerimenti?
Hai ragione. ï¿œ che ho dato una letta veloce e mi sembrava di avere 
un'idea che ti poteva aiutare ...
Non riesco a riprodurre la tua situazione (forse perchï¿œ 
acCmdRemoveFilterSort ï¿œ attivo solo su database condivisi?).
Io farei un'altra prova:
se la casella di testo "maschera attivata" ï¿œ giï¿œ uguale a Me.Name forzo 
l'uscita dalla sub
Ciao
-- 
Alberto S


Per riprodurlo, prova a fare così:
1) crei una tabella "Tabella1" con 2 campi: campo1 tipo contatore e
campo2 tipo testo;
- inseriscici 2 valori a piacere, tanto per riempirla;
2) crea 3 maschere
- Maschera1 con due campi testo che chiamerai MascheraAttivata e
MascheraDisattivata;
- Maschera2 con due pulsasnti: un pulsante per aprire Maschera3 e
l'altro per chiudere Maschera3 tramite macro o codice;
- Maschera3 avente origine dati Tabella1 e con un pulsante per aprire
Maschera2;
3) sull'evento caricamento della Maschera3 scrivi:
DoCmd.RunCommand acCmdRemoveFilterSort
4) sullevento attivazione delle maschere Maschera2 e Maschera3 scrivi:
Private Sub Form_Activate()
Forms!Maschera1!MascheraDisattivata = Forms!Maschera1!MascheraAttivata
Forms!Maschera1!MascheraAttivata = Me.Name
End Sub
In questo modo, saltellando da una maschera all'altra si alterneranno
i valori dei campi MascheraAttivata e MascheraDisattivata.
Ora prova a passare da Maschera3 a Maschera2 col relativo pulsante,
così che il campo MascheraAttivata mostri il valore Maschera2 mentre
il campo MascheraDisattivata mostri il valore Maschera3;
poi clicchi sul pulsante della Maschera2 che chiude la Maschera3 (i
campi saranno sempre MascheraAttivata = Maschera2 e
MascheraDisattivata =Maschera3);
poi clicchi sul pulsante della Maschera2 che riapre la Maschera3 e
noterai che in entrambe i campi sarà mostrato il valore Maschera3
quando invece nel campo MasscheraDisattivata dovrebbe esserci il
valore Maschera2.
Se poi riesegui gli stessi passaggi dopo avere eliminato o inibito
"DoCmd.RunCommand acCmdRemoveFilterSort" nell'vento caricamento della
Maschera3, tutto procede normalmente.
Ancora grazie e ciao da cranze.


Ciao Geppo,
appunto. Dato che il caricamento avviene prma dell'attivazione, e
visto che al caricamento mi salva il valore della maschera che lo
contiene nel campo MascheraDisattivata, si suppone che provveda a
disattivarla prima di attivarla.
Strano ma vero.
Ciao, cranze.

 Per riprodurlo, prova a fare cosï¿œ:
[cut]
Avevo giï¿œ provato con tre maschere (nascosta, maschera1 e maschera2). 
Su maschera1 e maschera2 un pulstante che sposta il focus sull'altra, 
su caricamento di entrambe DoCmd.RunCommand acCmdRemoveFilterSort).
Perï¿œ al momento dell'apertura delle maschere o al cambio di focus mi 
ritorna l'errore run-time 2046 (comando o azione 'RimuoviFiltroOrdina' 
non disponibile).
Proverï¿œ a ricostruire la tua situazione e/o a dare un'origine record 
alle due maschere. Perï¿œ penso che prima di fine settimana sarï¿œ 
difficile ...
Nel frattempo, hai provato il mio suggerimento di ieri? (cioï¿œ 
sull'evento 'attivato' testare se la testbox MascheraAttivata ï¿œ giï¿œ 
uguale a Me.Name e, se sï¿œ, ad uscire dalla sub)
Ciao
-- 
Alberto S


hai ragione, ho scritto così:
Private Sub Form_Activate()
If Forms!maschera1!MascheraAttivata = Me.Name Then
Exit Sub
Else
Forms!maschera1!MascheraDisattivata = Forms!maschera1!MascheraAttivata
Forms!maschera1!MascheraAttivata = Me.Name
End If
End Sub
... ed effettivamente sembra funzionare!
Comunque se la cosa ti incuriosisce mi piacerebbe sapere se riscontri
lo stesso problema.
Mi piacerebbe capire perchè si comporta così (solo curiosità).
L'importante è che funzioni.
Questo metodo vorrei utilizzarlo per impostare dei parametri in una
sola query che è origine dati di un report.
Mi occorre cioè sapere se una determinata maschera è attiva o no,
perchè a seconda della maschera, il criterio di un campo della query
dovrà avere parametri diversi.
Mi spiego meglio:
in una query chè è origine dati di un report, ho un campo ID, e questo
campo non dovrà essere filtrato oppure essere Like " * " se il report
è lanciato da una determinata maschera mentre sarà Like Forms!
Maschera2!id se lo lancio dalla Maschera2. E così via per altri
criteri simili.
Il problema è che per poter dire alla query che un campo deve essere
Like il campo di una maschera, quest'ultima deve essere aperta.
Non essendo riuscito ad utilizzare il metodo iif
(
Screen.ActiveForm.name
 = "Maschera2"; Like Forms!Maschera2!id; "*")
e nemmeno il metodo iif(CurrentProject.AllForms("Maschera2").IsLoaded
= True; Like Forms!Maschera2!id; "*")
allora ho pensato di leggere il nome della maschera dai campi
MascheraAttivata e MascheraDisattivata e creare una funzione pubblica
in un modulo ed asegnare ai campi della query i criteri fctCriterio1()
ecc:
Function fctCriterio1() As Long
Select Case fctCriterio1
    Case Is = Forms!Maschera1!MascheraAttivata = "Maschera2"
    fctCriterio1 = [Forms]![Immissione Dati]![ID]
    Case Is = Forms!Maschera1!MascheraAttivata <> "Maschera2"
    fctCriterio1 = "*"   'qui però non va perchè il campo della query
è numerico
End Select
End Function
Function fctCriterio2() As Long
Select Case fctCriterio2
    Case Is = Forms!Maschera1!MascheraAttivata = "Maschera3"
    fctCriterio2 = [Forms]![Maschera3]![Testo500]
    Case Is = Forms!Maschera1!MascheraAttivata <> "Maschera3"
    fctCriterio2 = "*"    'anche qui però il campo della query è
numerico
End Select
End Function
Potrei impostare String invece di Long ma non ottengo comunque nulla
perchè i campi essendo numerici considerano il campo "*" come dato da
ricercare e non come valore jolly.
Quindi vorrei capire cosa devo scrivere nella funzione al posto di
fctCriterio1 = "*". Mi basterebbe dirgli che nel secondo Case
fctCriterio1 e 2 non devono essere considerati. Cioè come se in quei
casi nella query non ci fossero parametri per quei campi.
Spero di essere stato chiaro.
Ciao, cranze

 Ciao, cranze.
-- 
Ciao
Geppo 

 Geppo
Grazie, cranze.

 Grazie, cranze.
-- 
Ciao
Geppo 


Scusa se ti rispondo solo adesso...
Anche così non rimuove il filtro, se invece uso Me.OrderByOn = False,
rimuovo il filtro ordinamento ma si ripresenta lo stesso problema che
ho con DoCmd.RunCommand acCmdRemoveFilterSort.
Per il problema dei criteri variabili della quey, ho risolto così:
- in un modulo imposto i criteri
Function fctCriterio1()
If CurrentProject.AllForms("Maschera2").IsLoaded = True And Forms!
Maschera1!MascheraAttivata = "Maschera2" Then
fctCriterio1 = [Forms]![Maschera2]![ID]
End If
End Function
--------------------------------------------------------
Function fctCriterio2()
If CurrentProject.AllForms("Maschera3").IsLoaded = True And Forms!
Maschera1!MascheraAttivata = "Maschera3" Then
fctCriterio2 = [Forms]![Maschera3]![Testo500]
End If
End Function
- poi nella query metto questi criteri
nel campo ID: Like Nz(fctCriterio1();"*")
nel campo Testo500: Like Nz(fctCriterio2();"*")
Ciao, cranze

 Ciao, cranze
-- 
Ciao
Geppo