Aggiungere record vba su maschera con aggiunte disabilitate

di il
7 risposte

Aggiungere record vba su maschera con aggiunte disabilitate

Scusate per il titolo un po contorto,
il mio problema è questo, ho una sottomaschera che utilizzo come marcatempo con i campi ID, INIZIO, FINE, ID_LAVORO
nella maschera ho impostato no su consenti aggiunte, in modo da evitare che qualcuno posso inserire un orario sbagliato o non veritiero ed per aggiungere i timbri, utilizzo un bottone che aggiunge il timbro automaticamente tramite questo codice.

Private Sub timbro_inizio()
    dataora = Now()
    Dim recordset As DAO.recordset
    Set recordset = Me.recordset
    Me.AllowAdditions = True
    recordset.AddNew
    [INIZIO] = dataora
    recordset.Update
    Me.AllowAdditions = False
    cmd_Timbro.Caption = "Fine"
    Me.Requery
End Sub
il codice funziona ed il record viene aggiunto, solo se apro la tabella con i timbri, ho una riga con il timbro ed una riga vuota, ossia ogni volta che eseguo
Me.AllowAdditions = True
nella tabella mi viene automaticamente aggiunta una riga vuota...
come posso risolvere questo problema?
non vorrei usare un
CurrentDb.Execute sql
con query di aggiunta perche così facendo dovrei specificare manualmente la chiave esterna, ma vorrei evitarlo visto che questa sottomaschera viene utilizzata in piu maschere e dorvrei aggiungere ulteriori controlli per reperire la chiave esterna in ogni maschera.

7 Risposte

  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Salve,
    a me servono alcuni chiarimenti :

    Calida ha scritto:


    Scusate per il titolo un po contorto,
    il titolo diciamo che, per me, è l'unica cosa chiarissima
    il mio problema è questo, ho una sottomaschera che utilizzo come marcatempo con i campi ID, INIZIO, FINE, ID_LAVORO
    quell' "ID" a quale Tab si riferisce?..."Id_Lavoro" stessa domanda
    ...nella maschera ho impostato no su consenti aggiunte...
    quale maschera? dovresti chiarire meglio i nomi di Maschera e SottoMaschera, i nomi delle tab e se queste sono collegate Master/Secondari.
    in modo da evitare che qualcuno posso inserire un orario sbagliato o non veritiero ed per aggiungere i timbri, utilizzo un bottone che aggiunge il timbro automaticamente tramite questo codice.
    "I timbri"... "un bottone" e automaticamente non regalano niente all'argomento
    
    Private Sub timbro_inizio()
        dataora = Now()
        Dim recordset As DAO.recordset
        Set recordset = Me.recordset
        Me.AllowAdditions = True
        recordset.AddNew
        [INIZIO] = dataora
        recordset.Update
        Me.AllowAdditions = False
        cmd_Timbro.Caption = "Fine"
        Me.Requery
    End Sub
    C'è un motivo tecnico per cui utilizzi il recordset, per aggiungere un record, presumo, alla sottomaschera?
    ...il codice funziona ed il record viene aggiunto,

    bene!
    ...solo se apro la tabella con i timbri, ho una riga con il timbro ed una riga vuota, ossia ogni volta che eseguo...
    e allora non funziona!
    nella tabella mi viene automaticamente aggiunta una riga vuota...
    Non si comprende se la riga aggiunta la vedi solo aprendo la Tab e cosa vuol dire "una riga vuota"
    come posso risolvere questo problema?
    quale problema?
    con query di aggiunta perche così facendo dovrei specificare manualmente la chiave esterna, ma vorrei evitarlo visto che questa sottomaschera viene utilizzata in piu maschere e dorvrei aggiungere ulteriori controlli per reperire la chiave esterna in ogni maschera.
    questo è buio pesto.
    Vedi di chiarire meglio a mio parere, se ho capito bene, bastano due righe di codice ma se lo scrivo potrei generare confusione, quindi attendo notizie.
    Saluti
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Buongiorno,
    allora, diverse maschere che al loro interno contengono la sottomaschera "Marcatempo".
    Mettiamo che ora mi trovo nelle maschera "Scheda" che include la sottomaschera "Marcatempo"
    I campi della maschera Marcatempo sono(che sono gli stessi della tabella TBL_MARCATEMPO a cui la maschera fa riferimento)
    
    ID   ---- Numerico chiave primaria
    INIZIO 
    FINE
    ID_LAVORO  ----Chiave esterna 
    
    nella sottomaschera "Marcatempo" c'è un solo pulsante che permette di compilare la maschera. Ad ogni pressione il tasto cambia la sua Caption da Inizio a Fine e viceversa. Quando si preme il tasto si controlla la caption e in base ad essa viene chiamata una funzione specifica che o aggiunge un nuovo record compilando solo il campo INIZIO oppure si posiziona sull'ultimo record e aggiunge solo il campo FINE (ovviamente i campi ID chiave primaria e ID_LAVORO chiave esterna vengono compilati in automatico essendo correlati con la tabella della maschera Schede ossia TBL_SCHEDE)

    Ho scritto che il codice funziona perche nella sottomaschera i record vengono aggiunti regolarmente, quando premo il pulsante e la caption è inizio si aggiunge una riga con l'ora corrente nel campo INIZIO e quando premo il pulsante e la caption è fine viene compilato il campo FINE dell'ultimo record.

    se pero apro direttamente la tabella TBL_MARCATEMPO senza alcuna maschera noto che per ogni nuovo record aggiunto, viene creato un nuovo record compilato solo nel campo ID tutti gli altri sono vuoti. Questi record ovviamente non vengono mostrati nella maschera perche avendo il campo della chiave esterna vuoto non posso essere relazionati e quindi mostrati.

    Il problema quindi è che quando uso
     ME.AllowAdditions = false
    si crea automaticamente un nuovo record compilato solo nel campi ID

    spero di essermi spiegato meglio
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Trovo assai inutile passare dall'interfaccia per inserire un Record...!
    Da evitare una variabile chiamata Recordset che è parola riservata dal codice..!!!

    Farei cosi:
    
    Private Sub timbro_inizio()
        Dim rs As DAO.recordset
        Set rs = DbEngine(0)(0).OpenRecordset("NomeTabella")
        rs .AddNew
        rs!INIZIO = Now()
        rs.Update
        rs.Close
        set rs=Nothing
        cmd_Timbro.Caption = "Fine"
        Me.Requery
    End Sub
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    @Alex ha scritto:


    Trovo assai inutile passare dall'interfaccia per inserire un Record...!
    Da evitare una variabile chiamata Recordset che è parola riservata dal codice..!!!

    Farei cosi:
    
    Private Sub timbro_inizio()
        Dim rs As DAO.recordset
        Set rs = DbEngine(0)(0).OpenRecordset("NomeTabella")
        rs .AddNew
        rs!INIZIO = Now()
        rs.Update
        rs.Close
        set rs=Nothing
        cmd_Timbro.Caption = "Fine"
        Me.Requery
    End Sub
    Passo dall'interfaccia perche così facendo non devo preoccuparmi di dover correlare inserendo manualmente la chiave esterna ai nuovi record inseriti.
    non ho provato il tuo codice ma a leggerlo fa riferimento solo alla tabella quindi nessuna correlazione ed immagino che inserirà si il nuovo record senza sbloccare la maschera, ma il record non sara correlato.

    so che basta inserire il
    rs!ID_LAVORO = id del record padre
    ma come ho scritto questa sottomaschera verra usata in più di una maschera e quindi dovrei aggiungere altri controlli a caricamento per conoscere la maschera madre e il suo id.
    passando dall'interfaccia posso aggiungere questa sottomaschera a qualsiasi maschera e funzionera sempre senza dovermi preoccupare di quale sia la maschera padre...
    c'è solo il problemino delle righe vuote...
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Basta recuperare il valore, e valorizzarlo nella FK del Rs, peraltro deve essere valorizzato ed accessibile proprio da dove lo esegui...!
    
    Private Sub timbro_inizio()
        Dim rs As DAO.recordset
        Set rs = DbEngine(0)(0).OpenRecordset("NomeTabella")
        rs .AddNew
        rs!TuaFk=Me.Parent.NomePK  '(se si tratta di SubForm)
        rs!INIZIO = Now()
        rs.Update
        rs.Close
        set rs=Nothing
        cmd_Timbro.Caption = "Fine"
        Me.Requery
    End Sub
    Concettualmente se la maschera è ReadOnly, non è il massimo, quello che fai, ma pur sempre fattibile.
    Non so se, nel caso di utilizzo in MultiUtenza possa nascondere qualche insidia, andrebbe verificata la gestione di accesso concorrente nel mentre modifichi il tipo di accesso...
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Si l'applicazione è multiutenza, 3 max 4 utenti .
    mi sono mi sono dovuto orientare verso il readonly per evitare in primis che gli orari dei timbri vengano modificati, e poi l'applicazione calcola anche la somma di tutto il tempo lavorato che puo anche essere fatto a piu intervalli, quindi ho bisogno che i dati siano inseriti in modo preciso senza magari che ci sia un timbro di fine lavoro senza uno di inizio oaltre problematiche legate al non corretto inserimento dei dati.

    che problemi puo causare per la multiutenza?
  • Re: Aggiungere record vba su maschera con aggiunte disabilitate

    Dipende da come gestisci la multiutenza... ed il relativo Blocco Records...
    Normalmente sono aspetti che possono mettere in crisi, per la generazione delle PK soprattutto se non sono Counter, e se sono Counter in inserimenti gerarchici transazionali, serve fare attenzione e recuperare la PK con @@IDENTITY, per non avere brutte sorprese...
    Le modifiche dei Records ad accesso concorrente..., dal momento che non c'è modo di sapere se un Record sia in Modifica da altro CLIENT, ci sono considerazioni da fare in modo da evitare che l'ultimo che esce "Annulla quanto fatto" dal primo che salva... ecc...
    Vanno ragionate e studiate prima, perchè determinano poi i VINCOLI o i PROBLEMI.
Devi accedere o registrarti per scrivere nel forum
7 risposte