Pulsante per Eliminare record da casella di riepilogo

di il
14 risposte

Pulsante per Eliminare record da casella di riepilogo

E' possibile creare un pulsante per eliminare un record selezionando una voce da una casella di riepilogo?

In pratica vorrei fare un pulsante Elimina. Selezionare dalla casella di riepilogo un autista, e cliccare su Elimina per eliminare dalla tabella t_Autista, l'autista selezinato...

Ho provato con la macro riferita al pulsante ma non ci riesco, non so come indicare al pulsante di cancellare quello che ho selezionato dalla casella di riepiologo.

Ringrazio chi saprà aiutarmi!!
Allegati:
32347_3adde6df4b788a6ca65f71dcd15d3dc9.png
32347_3adde6df4b788a6ca65f71dcd15d3dc9.png

32347_85482fe34d7b117d5684b4d1dcc37c3a.png
32347_85482fe34d7b117d5684b4d1dcc37c3a.png

32347_7cf0d47f14d6c9dcbc1e65aed939fefa.png
32347_7cf0d47f14d6c9dcbc1e65aed939fefa.png

14 Risposte

  • Re: Pulsante per Eliminare record da casella di riepilogo

    manuclele ha scritto:


    ...
    Ho provato con la macro riferita al pulsante ma non ci riesco...
    Riprendo con il mio tormentone: "Macro è male, VBA è bene".
    Immagino che esista un tabella degli autisti, quindi una volta selezionato l'autista da eliminare devi cancellare il record da quella tabella tramite la relativa chiave primaria e fare una requery della casella di riepilogo, così recepisce l'eliminazione (immaginando la sua origine dati sia la tabella degli autisti, come sembrerebbe logico)
    Verifica che le relazioni tra le tabelle permettano questo: se ci sono record "legati" a quell'autista ed è impostata l'integrità referenziale non potrai cancellare l'autista senza eliminare i record ad esso correlati, a meno che tu non abbia la spunta attiva su "Elimina record correlati a catena", opzione da attivare sempre con grande cautela (un paio di clic sbagliati e il database è vuoto!)
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Philcattivocarattere ha scritto:


    Riprendo con il mio tormentone: "Macro è male, VBA è bene".
    Immagino che esista un tabella degli autisti, quindi una volta selezionato l'autista da eliminare devi cancellare il record da quella tabella tramite la relativa chiave primaria e fare una requery della casella di riepilogo, così recepisce l'eliminazione (immaginando la sua origine dati sia la tabella degli autisti, come sembrerebbe logico)
    Verifica che le relazioni tra le tabelle permettano questo: se ci sono record "legati" a quell'autista ed è impostata l'integrità referenziale non potrai cancellare l'autista senza eliminare i record ad esso correlati, a meno che tu non abbia la spunta attiva su "Elimina record correlati a catena", opzione da attivare sempre con grande cautela (un paio di clic sbagliati e il database è vuoto!)
    Sono d'accordo con te che Macro è male, e VBA è bene... ma purtroppo con il VBA non so da dove iniziare, per cui cerco di utilizzare quello che bene o male riesco un po a fare...

    Si esiste una tabella degli autisti. sapresti magari indicarmi dove trovare un codice VBA che posso adattare al mio db?
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Prova questo codice
    Private Sub Cancella_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("autisti", dbOpenDynaset)
    rs.FindFirst "[IDAutista] = " & Me.Autista
    rs.Delete
    Me.Autista.Requery
    rs.Close
    db.Close
    End Sub
  • Re: Pulsante per Eliminare record da casella di riepilogo

    harry61 ha scritto:


    Prova questo codice
    Private Sub Cancella_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("autisti", dbOpenDynaset)
    rs.FindFirst "[IDAutista] = " & Me.Autista
    rs.Delete
    Me.Autista.Requery
    rs.Close
    db.Close
    End Sub
    Ti sembra un codice funzionalmente valido...?
    A me pare proprio di no.

    Cosa importante non si fornisce codice "PAPPA PRONTA" ma si ragiona per arrivare... e magari ragionando avresti scritto un codice migliore con 1 sola riga di codice si fa tutto.
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Alex, le mie conoscenze mi portano qui, non ho intenzione di dimostrare nulla e so bene che tu sei molto preparato, sicuramente un professionista. Devo dire che da te ho imparato molto e se pubblico dei codici e sì per il piacere di aiutare qualcuno, ma anche per avere suggerimenti su come meglio si può fare.
    Ti sarei grato se mi mostrassi come imposteresti tu il problema. Sarebbe un'altra occasione per imparare qualcosa.
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Harry61,
    vedi istruzione DELETE
    https://support.microsoft.com/it-it/office/istruzione-delete-8a636aa6-e941-424d-b604-3963a6b5391b
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Grazie del suggerimento willy55, che interpreto come segue.
    Private Sub Cancella_Click()
    Dim SQL As String
    SQL = "Delete autisti.* FROM autisti WHERE (( (autisti.IDAutista)=" & Me.Autista & "));"
    DoCmd.SetWarnings False
    DoCmd.RunSQL (SQL)
    DoCmd.SetWarnings True
    Me.Autista.Requery
    End Sub
    Naturalmente, critiche e suggerimenti ulteriori sono sempre graditi.

    un saluto
  • Re: Pulsante per Eliminare record da casella di riepilogo

    harry61 ha scritto:


    Grazie del suggerimento willy55, che interpreto come segue.
    ...
    da integrare con un'altra nozione: non chiedermi perché esiste DoCmd.RunSql ma non ha senso usarlo per una query d'azione quando esiste il metodo Execute (dell'oggetto Database o QueryDef), che non necessita della disabilitazione dei Warnings, da inserire sempre in una transazione.
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Grazie Phil. Il codice allora diventerebbe come segue.
    Private Sub Cancella_Click()
    Dim db As DAO.Database
    Set db = CurrentDb
    Dim SQL As String
    SQL = "Delete autisti.* FROM autisti WHERE (( (autisti.IDAutista)=" & Me.Autista & "));"
    db.Execute SQL
    Me.Autista.Requery
    db.Close
    End Sub
    Decisamente meglio di come sono partito.
    Ringrazio tutti quelli che hanno partecipato a questa discussione, che mi ha permesso di imparare nuovi approcci.

    un saluto
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Ovviamente questa è la soluzione, togli tutte quelle parentesi che non servono...
    Hai però capito il motivo per cui la tua soluzione non era tecnicamente adatta...?
  • Re: Pulsante per Eliminare record da casella di riepilogo

    harry61 ha scritto:


    Grazie Phil. Il codice allora diventerebbe come segue.
    Private Sub Cancella_Click()
    Dim db As DAO.Database
    Set db = CurrentDb
    Dim SQL As String
    SQL = "Delete autisti.* FROM autisti WHERE (( (autisti.IDAutista)=" & Me.Autista & "));"
    db.Execute SQL
    Me.Autista.Requery
    db.Close
    End Sub
    Decisamente meglio di come sono partito.
    Ringrazio tutti quelli che hanno partecipato a questa discussione, che mi ha permesso di imparare nuovi approcci.

    un saluto
    Intanto vi ringrazio per l'aiuto... e ora cerco di capire il codice...
    Private Sub Cancella_Click() - si da il nome Cancella_Click a questa funzione che deve essere eseguita in automatico quando succede qualcosa
    Dim db As DAO.Database - qui crea una variabile chiamata db che deve essere di tipo DAO.Database
    Set db = CurrentDb - viene settata la variabile db che lavora in questo database
    Dim SQL As String - crea una variabile chiamata SQL che è di tipo stringa
    SQL = "Delete autisti.* FROM autisti WHERE (( (autisti.IDAutista)=" & Me.Autista & "));" - questa non riesco a capirla a pieno... solo alcuni pezzi... la variabile SQL che era una stringa quindi è uguale a Elimina autisti.*

    autisti.* sarebbe, l'asterisco va a determinare il record riferito all'autista da eliminare. E lo prende da autisti che è la tabella autisti? o la casella di riepilogo autisti?
    WHERE
    quando l'ID autista della tabella autisti è uguale a Me.autista, cioè l'autista che ho selezionato?

    db.Execute SQL - si chiede di eseguire quanto scritto in SQL

    Me.Autista.Requery - questo aggiorna la maschera in cui sono

    db.Close
    End Sub - e chiudiamo il tutto...

    Ho cercato di capire e interpretare il codice anche cercando in internet...

    Non chiedo mai la PAPPAPRONTA, è che se uno non sa e vuole imparare chiede... poi magari se sapete consigliarmi una buona guida o corso per principianti in VBA sarei ben contento di imparare... ma quelle che ho trovato sono sempre per chi già sa fare...

    Ho iniziato da zero con access da neanche un mese... sfruttando qualche pausa dal lavoro... ma quando mi sono imbattuto a dover utilizzare il VBA mi sono bloccato...

    Comunque grazie ancora
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Certo @Alex,
    le parentesi non servono e l'enunciato SQL concentra in una riga di codice tre funzioni. Molto più elegante. Niente da obiettare.

    manuclele,
    la Private Sub Cancella_Click() è una routine evento che viene attivata da un pulsante di comando sulla maschera, mentre alla variabile SQL viene assegnato come valore un enunciato appunto in linguaggio SQL.
    Per chiarirti di cosa si tratta ti consiglio di leggere il link che ha suggerito willy55.
    Ti consiglio altresì di studiare un manuale di VBA, come già ti sei proposto. Procedere da autodidatta è difficile e richiede molto tempo a mio parere.
    D'altronde Access può essere utilizzato anche senza ricorrere al VBA, ma con esso è molto più potente.
  • Re: Pulsante per Eliminare record da casella di riepilogo

    harry61 ha scritto:


    Certo @Alex,
    le parentesi non servono e l'enunciato SQL concentra in una riga di codice tre funzioni. Molto più elegante. Niente da obiettare.
    ...
    Il motivo non erano le parentesi... tecnicamente hai commesso 2 errori di sostanza nel tuo codice.
    Hai aperto un Recordset con tutti i dati per poi usare il FINDFIRST, cosa estremamente inutile quanto inefficiente rispetto ad usare eventualmente la WHERE CONDITION della Query.
    Secondo come ti è stato fatto notare, la smeplice ACTION QUERY di tipo DELETE condizionata dalla WHERE è estremamente più funzionale, manca un'altra cosa che pochi usano, la gestione delle transazioni, ma questo è tema diverso.
  • Re: Pulsante per Eliminare record da casella di riepilogo

    Molto interessante la tua dissertazione tecnica @Alex. Per l’uso che faccio di VBA e per il mio livello di conoscenza non avrei mai potuto arrivarci da solo e difficilmente potrò apprezzarne i vantaggi pratici. Proverò comunque ad applicarne i principi.
    Delle transazioni ho letto qualcosa, ma non le ho mai applicate. Sarebbe interessante se proponessi un esempio magari applicato proprio al caso in discussione.
Devi accedere o registrarti per scrivere nel forum
14 risposte