Lock di record/s

di il
6 risposte

Lock di record/s

Ho un DB di movimenti entrate/uscite che hanno una data di inserimento.
Dopo la stampa del bilancio annuale, ho necessità di congelare/lockare/disabilitare tutti i record che sono antecedenti all'anno in corso allo scopo di proteggerli da ogni azione accidentale di editing.
Sta di fatto però che questi record non posso escluderli dal DB in quanto sono sempre coinvolti nella gestione del DB.
Tutto ciò lo vorrei fare in automatico in una routine o macro ad ogni inizio di un nuovo anno.
In VBA mi muovo "non c'è male", ma non so da dove cominciare.
E' probabile che dovrei cambiare una proprietà al record, ma non sono riuscito a trovarla.
Esiste?
Posso avere un aiuto o un'altra idea migliore?
Grazie
antonio.

6 Risposte

  • Re: Lock di record/s

    Potresti aggiungere una flag nel record della tua tabella per indicare lo stato del record (congelato/attivo); naturalmente poi le varie procedure (inserimento/modifica/cancellazione) dovranno testare tale flag.
  • Re: Lock di record/s

    Questa cosa potrebbe essere da differenziare a seconda che tu stia operando con Form Continue o Singole... ma poi vedrai tu.

    In sostanza in entrambi i casi, il RECORD soggetto ad EDITING è sempre e solo 1 per volta, e diventa il Record ATTIVO o CORRENTE.

    Ne consegue che su EVENTO CURRENT di Maschera, puoi testare la Data come Year(ControlloData)<Year(Now()) ed in base a questa Condizione Forzare la proprietà ALLOWEDITS/ALLOWDELETIONS a FALSE...
    
    Private Sub Form_Current()
       If Me.NewRecord Then Exit Sub
       Me.AllowEdits=Year(Me!ControlloData.Value)<Year(Now())
       Me.AllowDeletions=Year(Me!ControlloData.Value)<Year(Now())
    End Sub
  • Re: Lock di record/s

    Se l’accesso ai campi da proteggere avviene mediante “input utente” in uno o più textbox presenti su una maschera e tra i campi è presente una data , nell’evento “Current” della maschera inserire il codice:
    
    Dim CampoAnno As String
    CampoAnno = "2013"
    
    If CDate(ID) < CDate("31/12/" & CStr(CampoAnno)) Then
        Campo1.Locked = True
    Else
        Campo1.Locked = False
    End If
    
    Dove ID è il campo della “data” ;

    CStr(CampoAnno) rappresenta l’anno fino a cui i record sono bloccati;

    consiglierei di creare anche una query di creazione tabella che “frizza” i dati degli anni passati … non si sa mai…
  • Re: Lock di record/s

    Angelo qualche osservazione...!

    Il Dato dell'Anno deve essere FLESSIBILE non può essere un dato FISSO "2013" alterimenti tutti gli anni che fai metti mano al codice...?
    Seconda cosa, a cosa serve confrontare la Data, passato il 31/12 cambia anno, quindi basta controllare quello... come ho suggerito sopra.
    Sulla questione della Query di CREAZIONE TABELLA, è una PESSIMA idea, i casi sono 2:
    1) Fai un BackUp dei dati, ma l'idea deve essere ai fini di Sicurezza di Integrità non di MANIPOLAZIONE
    2) Gestisci il tuo prodotto attuando quelle sicurezze che evitano l'accesso ai dati.
    Se metti in atto questo punto non devi poi aver dubbi che funzioni... altrimenti cosa lo hai fatto a fare..?

    Saluti
  • Re: Lock di record/s

    Hai ragione Alex,
    riposto di seguito il codice da inserire nel evento current della maschera:
    
    If CDate(ID) <= CDate("31/12/" & CStr(Year(Date) - 1)) Then
        Campo1.Locked = True
        'altrotextbox.Locked = True
        '...
    Else
        Campo1.Locked = False
        'altrotextbox.Locked = False
        '...
    End If
    
    Per quanto riguarda la query di creazione tabella l'idea era legata , come hai detto tu, all'integrità dei dati (come copia di backup).
  • Re: Lock di record/s

    Eccezionale, portentoso.
    Colpito proprio al cuore.
    Grazie milioni. Leggendovi ho appreso ancor di più.
    (c'era solo da scambiare il "<" con "=" e va che è una scheggia.

Devi accedere o registrarti per scrivere nel forum
6 risposte