Newsgroup: it.comp.appl.access
Titolo: Impedire modifiche involontarie

Ciao di nuovo, questa volta il problema è:
ho una maschera associata ad una tabella, e contenente una casella di
riepilogo che elenca tutti i record della tabella: quando se ne seleziona
uno, la maschera si sposta su quello.
Ora, voglio impedire modifiche accidentali, permettendo di farle solo dopo
la pressione di un'apposito pulsante: per evitare di dover "bloccare" e
"sbloccare" tutti i singoli controlli alla pressione del pulsante, ho
pensato di impostare all'apertura della maschera la proprietà Consenti
modifiche su NO, e cambiarla alla pressione del pulsante per la modifica. La
cosa sembrava funzionare, ma poi mi sono accorto che blocca anche la
selezione della casella di riepilogo, benchè questo non comporti una
modifica ai records...
Avete suggerimenti? C'è un modo per escludere la casella di riepilogo dal
blocco? Oppure l'unico modo è quello di bloccare i singoli controlli e
sbloccarli alla pressione del pulsante per la modifica?
Grazie ancora a tutti.

Giacomo Ciani ha scritto nel messaggio


Se i controlli sono molti e ti secca sbloccarli uno ad uno, puoi "marcarli" con un Tag e  poi
ciclare per sbloccarli/ribloccarli.
Ciao, warp

 ha scritto nel messaggio
news:9ogbhh$17j$1...@fe1.cs.interbusiness.it...


In particolare come si scrive il codice relativo?
Crea una funzione in un modulo globale come la seguente:
Public Function AttivaControlli(Frm As Form)
  Dim Ctr As Control
   For Each Ctr In Frm.controls
            If Ctr.Tag = "OnOff" Then           'Tag che identifica il campo
                     Ctr.enabled = true              'oppure locked
            End If
   Next Ctr
End Function
Poi la chiami su click del bottone.
Se non vuoi passare il parametro "form" puoi usare Screen.ActiveForm
Ciao, warp

 ha scritto nel messaggio
news:9ohvgt$r2r$1...@fe2.cs.interbusiness.it...


 ha scritto nel messaggio
news:9og7e4$ued$1...@nreadb.inwind.it...

Io credo che i suggerimenti siano buoni, ma personalmente ritengo che il
sistema migliore
sia di lavorare con maschere non associate.
Vale a dire Crei una Form non associata con controlli non associati, un bel
pulsante Salva
e con DAO o ADO scrivi i dati nelle Tabella dopo aver chiesto la
conferma.....
OPPURE se sei  più esperto inserisci nel TAG l'origine controllo dati e crei
una Routine che al "SALVA" riassocia
i controlli alla Tabella con il NomeCampo relativo.
Il vantaggio della prima soluzione è la possibilità di gestire Tranzazioni
con tutti i vantaggi del RollBack.....
Tutto questo è più complicato di quanto voi avete detto fino ad ora, ma
personalmente lo ritengo più funzionale.
Sarebbe possibile realizzare un Modulo di classe per gestire la Proprietà
TAG di tutti i Controlli in un Form e
realizzare la Riassociazione alla Tabella.
Bye @Alex.

con tutti i vantaggi del RollBack.....
IMHO per maschere di data entry è una soluzione un tantino macchinosa.
Il vantaggio reale delle transazioni lo apprezzi con elaborazioni batch ... questo se le transazioni
con ms-jet fossero affidabili  :-)
Ma quando i clients aumentano il rollback lascia a desiderare.
A parte questo è così comodo l'autosave record per record...
Ciao, warp

 ha scritto nel messaggio
news:9oi45t$p52$1...@nreadb.inwind.it...
soluzione a mio avviso buona e modulabile su tutte le maschere....
fai un modulo cosě
--------------
Public Function sbloccamask(mask As String)
Dim risposta
risposta = MsgBox("Attenzione si stanno per sbloccare i dati del cliente per
eventuale modifica", vbYesNo, "Sblocco i dati?")
If risposta = vbYes Then
Forms(mask).AllowEdits = True
ElseIf risposta = vbNo Then
Forms(mask).AllowEdits = False
End If
End Function
---------------------
Public Function bloccaon(mask As String)
    If DLookup("block_mask", "setup") = True Then
       Forms(mask)!pls_modifica.Visible = True
       Forms(mask).AllowEdits = False
    Else
       Forms(mask)!pls_modifica.Visible = False
    End If
End Function
----------------
e sulla maschera/maschere su cui vuoi un controllo antimodifica inserisci:
-----------
Private Sub Form_Current()
Call bloccaon(Form.Name)
End Sub
-----------------
poi sulla maschera vera e propria fai un pulsante chiamato pls_modifica
(sblocca maschera) con evento su click cosě....
--------
Private Sub pls_modifica_Click()
Call sbloccamask(Form.Name)
End Sub
----------------
io ti consiglio poi di fare una tabella nel database chiamata SETUP, con la
sua eventuale maschera...dove inserirai un campo SI/NO chiamato block_mask
che serve per abilitare la funzione di bloccaggio delle maschere o
disabilitarla.
Se la l'abiliti compare il pulsante Sblocca maschera se no non appare e la
maschera non č bloccata.
Non solo nella maschera SETUP puoi poi inserire una serie di controlli di
programma come le directory di lavoro, valori predefiniti ecc. che tu
attraverso la funzione Dlookup vai a prelevare di volta in volta nella
tabella...
ciao e spero di esserti stato utile

 Ok, buon consiglio... ma come si fa?
Basta imparare a rispondere dopo il testo dei messaggi precedenti.
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com

 End If
[CUT]


 wrote in message
news:9okjtl$e69$1...@fe2.cs.interbusiness.it...

Mi permetto di Replicare, ma non per imporre nulla, io spesso ricorro
a questa Funzione che posto giusto per non fraintendere l'utilizzo
della proprietà TAG, raramente utilizzata, e che, secondo me, non è
alquanto macchinosa, basta richiamarla nel caso di Nuovo Record, e al 
salvataggio dello stesso, ovviamente con le dovute modalità.
*******************************************************
Public Function Associa(Frm As Form, Bl As Boolean)
   Dim ctl As Control
   For Each ctl In Frm.Controls
      If Len(ctl.Tag) > 0 Then
         If Bl Then
            ctl.ControlSource = ctl.Tag
         Else
            ctl.ControlSource = ""
         End If
      End If
   Next
End Function
*******************************************************
Se la richiami associa me,false dopo il comando Docmd...AcNewRecords
, i controlli sono non Associati, sul Comando Salva la richiami associa me,true
ovviamente chiedendo conferma del salvataggio ecc..., e il Nuovo Record è
salvato
Se vuoi utilizzarla anche per le modifiche dei Record esistenti basta
implementare
la copia del Valore del Controllo prima di Disassociare....
Mi pare veloce e funzionale....!
@Alex.
non associati, poi se 
-- 
Posted from  [62.98.12.118] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Chiedo scusa e Retifico parte del Codice precedente per chiarezza, 
mi rendo conto che quello postato non è sufficiente per dimostrare
il Funzionamento: Maschera con 2 Pulsanti
1)Nuovo
2)Salva
Manca il Modifica, saprete sicuramente come supplire la carenza...!
************************************************
Private Sub CmdNuovo_Click()
   DoCmd.GoToRecord , , acNewRec
   Associa Me, False
End Sub
Public Function Associa(Frm As Form, Bl As Boolean)
   Dim ctl As Control
   Dim strName As String
   For Each ctl In Frm.Controls
      strName = ctl.Name
      If Len(ctl.Tag) > 0 Then
         If Bl Then
            ctl.ControlSource = ctl.Tag
            ctl.SetFocus
         Else
            ctl.ControlSource = ""
         End If
      End If
   Next
End Function
Private Sub cmdSave_Click()
   Associa Me, True
   Me.Dirty = True
End Sub
******************************************
Spero di aver chiarito ciò che intendevo....
@Alex.
-- 
Posted from  [62.98.10.142] 


 Basta imparare a rispondere dopo il testo dei messaggi precedenti.
Eheheh hehehe
M'hai copiato lo stile eh?
Antonio

 ha scritto nel messaggio
news:0eNr7.3244$jT5.1...@news.infostrada.it...

A forza di leggerti, sono rimasto influenzato...
