[Risolto] query di eliminazione

di il
11 risposte

[Risolto] query di eliminazione

Salve a tutti, sto realizzando un database per uno studio legale, e mi sono bloccato davanti ad un ostacolo che non riesco a sorpassare con le mie sole forze.
Premetto che ho una conoscenza di base di access, che a poco a poco sto approfondendo, ma sono bianco in materia di VBA (anche se, sto incominciando a leggere qualcosa).
Il database(vedasi allegato per una maggior chiarezza):
per una maggior chiarezza ho nominato tutte le tabelle Tbl[sigla tabella] e le maschere saranno nominate Frm[sigla tabella].
per questioni di spazio, ho preferito realizzare una serie di database singoli, al cui interno ci sono una o più tabelle, infine, tutte queste tabelle sono state inserite come collegamenti in un database vuoto, in cui creerò, al suo interno, le maschere, query, macro etc.
questo metodo mi ha impedito di relazionare le varie tabelle attraverso la spuntatura dell’integrità referenziale e dell’eliminazione a catena (non lo sapevo, ma al momento di realizzare il collegamento, poiché le tabelle appartengono a database differenti, evidentemente mi è preclusa tale opzione).
Ed è qui che ha origine il problema, ho la necessità di inserire un tasto nella FrmPrt (la maschera della TblPrt) che al suo click mi elimini non solo il record visualizzato nella FrmPrt, ma anche i record che sono legati a tale maschera attraverso i vari legami che ho creato: FrmEvolRprtStorCausa; FrmNot.
Queste maschere sono legate fra di loro tutte dall’IDPrt (l’identificativo della tabella pratiche), quello che vorrei creare è un pulsante che al click trovi nelle maschere da me indicate [FrmEvolRprtStorCausa; FrmNot], i record che abbiano identici campi IDPrt e li elimini dopo una conferma.
Data la mia scarsa conoscenza del vba, mi sono limitato a fare varie prove con le macro di access.
Dati gli scarsi risultati, ho pensato di fare una query di eliminazione, dove ho riportato tutti i campi delle tabelle di cui voglio eliminare i record, impostando alcuni criteri:
primo criterio: “[Frm]![IDPrt]” nel campo “IDPrt” della “TblPrt”
secondo criterio:“[TblPrt]![IDPrt]” nei campi:
- “IDEvolRprtStorCausa” della “TblEvolRprtStorCausa”
- “IDPrt” della “TblNot”
così che il campo si identico a quello dell’ ”IDPrt” della “TblPrt”.
In seguito ho inserito nella “FrmPrt” una macro per aprire la query di eliminazione, ma quando la cerco di aprire, mi chiede di specificare la tabella da cui voglio eliminare i record
Qualcuno saprebbe dirmi dove sbaglio? Il mio dubbio è sul primo criterio visto sopra (l’intento di questo criterio dovrebbe essere quello di eliminare il record della TblPrt che ha lo stesso campo IDPrt della FrmPrt di cui clicco il pulsante per eseguire la macro che apre la query di eliminazione).
Ho fatto svariate prove, ma non riesco a venirne a capo. Cosa mi consigliate?
Allegati:
17677_0bc3a5ed05cde75e1c0fc124d75ac963.png
17677_0bc3a5ed05cde75e1c0fc124d75ac963.png

17677_a5d918cc86e18e412cbaf99c19c8ffe1.png
17677_a5d918cc86e18e412cbaf99c19c8ffe1.png

11 Risposte

  • Re: [Risolto] query di eliminazione

    marcios ha scritto:


    ...
    per questioni di spazio, ho preferito realizzare una serie di database singoli, al cui interno ci sono una o più tabelle, infine, tutte queste tabelle sono state inserite come collegamenti in un database vuoto, in cui creerò, al suo interno, le maschere, query, macro etc.
    questo metodo mi ha impedito di relazionare le varie tabelle attraverso la spuntatura dell’integrità referenziale e dell’eliminazione a catena (non lo sapevo, ma al momento di realizzare il collegamento, poiché le tabelle appartengono a database differenti, evidentemente mi è preclusa tale opzione).
    e se anche ne avessi la possibilità l'eleminazione a catena è sempre un rischio, molto comoda ma ancor più rischiosa.

    marcios ha scritto:


    Ed è qui che ha origine il problema, ho la necessità di inserire un tasto nella FrmPrt (la maschera della TblPrt) che al suo click mi elimini non solo il record visualizzato nella FrmPrt, ma anche i record che sono legati a tale maschera attraverso i vari legami che ho creato: FrmEvolRprtStorCausa; FrmNot.
    ....
    Cosa mi consigliate?
    Finché rileggo tutto ben bene così posso darti suggerimenti per il caso concreto, informazione generale: quando ci sono tabelle con dati relazionati in questo modo devi sempre "partire dalla fine", cioè cancellare prima i record che stanno sul "lato MOLTI" della relazione fino a risalire al record che era all'origine di tutto.
    Per ora pubblico questo, con riserva di completare (in questo post o in un altro)
    Proseguo: in pratica le query di eliminazione devono essere 3
    - le prime due che sono "gerarchicamente" sullo stesso piano (nel senso che l'ordine con cui si effettua la cancellazione è indifferente, agendo su due tabelle tra loro indipendenti) per eliminare i record che hanno quell'IDPrt in TblEvolRprtStorCausa e TblNot
    - la terza ED ULTIMA (in ordine di esecuzione) che cancella da TblPrt
    Potresti creare 3 query che prendono IDPrt da FrmPrt, del tipo
    DELETE * FROM TblEvolRprtStorCausa WHERE IDEvolRprtStorCausa = [Forms]![FrmPrt]![IDPrt]
    DELETE * FROM TblNot WHERE IDPrt = [Forms]![FrmPrt]![IDPrt]
    DELETE * FROM TblPrt WHERE IDPrt = [Forms]![FrmPrt]![IDPrt]
    ed avviarle tramite le... macro, combattendo contro i warnings che ti avvisano della cancellazione.
    Personalmente farei tutto tramite vba, costruendo le stesse query come stringhe SQL ed avviandole con CurrentDB.Execute.
  • Re: [Risolto] query di eliminazione

    Grazie per il consiglio, io cercavo di fare tutto con un'unica query, cercheró di seguire il tuo consiglio, provando a farlo con il vba.
  • Re: [Risolto] query di eliminazione

    Philcattivocarattere ha scritto:


    ed avviarle tramite le... macro, combattendo contro i warnings che ti avvisano della cancellazione.
    Personalmente farei tutto tramite vba, costruendo le stesse query come stringhe SQL ed avviandole con CurrentDB.Execute.
    ho fatto una prova tramite macro (prima di imbarcarmi nel VBA) e funziona perfettamente!, l'unico problema è che ogni volta che deve eliminare i record di ogni tabella mi chiede di immettere il valore del parametro "Maschere!FrmPrt!IDPrt". dovrei fare in modo che il valore di tale parametro corrisponda a quello del record che ho aperto in quel momento, ma non riesco a capire come poter operare sulla macro (ho fatto qualche prova con l'impostazione variabile temporanea...ma senza alcun miglioramento!).
  • Re: [Risolto] query di eliminazione

    marcios ha scritto:


    ho fatto una prova tramite macro (prima di imbarcarmi nel VBA) e funziona perfettamente!, l'unico problema è che ogni volta che deve eliminare i record di ogni tabella mi chiede di immettere il valore del parametro "Maschere!FrmPrt!IDPrt". dovrei fare in modo che il valore di tale parametro corrisponda a quello del record che ho aperto in quel momento, ma non riesco a capire come poter operare sulla macro.
    E' una situazione abbastanza frequente. Hai costruito il critero nella query con la procedura guidata che ti fa navigare tra le maschere aperte, fino alla scelta del controllo da cui prendere il valore?
    Per il resto non ti so aiutare perché non vado d'accordo con le macro e con le query parametriche. Finché posso i valori li prendo tramite vba.
  • Re: [Risolto] query di eliminazione

    Philcattivocarattere ha scritto:


    E' una situazione abbastanza frequente. Hai costruito il critero nella query con la procedura guidata che ti fa navigare tra le maschere aperte, fino alla scelta del controllo da cui prendere il valore?
    Sì, ho usato il generatore di espressioni

    Philcattivocarattere ha scritto:


    Per il resto non ti so aiutare perché non vado d'accordo con le macro e con le query parametriche. Finché posso i valori li prendo tramite vba.
    Purtroppo sono agli inizi con il VBA, ma in quel caso, come si sarebbe potuto gestire questo intoppo?
    nel senso, e scusa il mio linguaggio da profano, come si fa a dire ad access di considerare che il parametro di "Maschere!FrmPrt!IDPrt" deve corrispondere al parametro del campo del report corrente che ho aperto e da cui ho attivato la routine?
  • Re: [Risolto] query di eliminazione

    marcios ha scritto:


    ...Purtroppo sono agli inizi con il VBA, ma in quel caso, come si sarebbe potuto gestire questo intoppo?
    nel senso, e scusa il mio linguaggio da profano, come si fa a dire ad access di considerare che il parametro di "Maschere!FrmPrt!IDPrt" deve corrispondere al parametro del campo del report corrente che ho aperto e da cui ho attivato la routine?
    Report? non eri in una maschera?
    A grandi linee così: fai in modo che nella maschera sia selezionato il record con l'IDPrt che intendi cancellare. Invece di associare all'evento Click del pulsante una macro che esegue le query di eliminazione, crei le query in SQL direttamente nell'evento Click del pulsante.
    Private Sub cmdCancIDPrt_Click()
    Dim strSQLTblEvol as String
    Dim strSQLTblNot as String
    Dim strSQLTblPrt as String
    Dim lngIDPrt as long
    
    lngIDPrt = Me![IDPrt].Value
    
    strSQLTblEvol = "DELETE * FROM TblEvolRprtStorCausa WHERE IDEvolRprtStorCausa = " & lngIDPrt
    strSQLTblNot = "DELETE * FROM TblNot WHERE IDPrt = " & lngIDPrt
    strSQLTblPrt = "DELETE * FROM TblPrt WHERE IDPrt = " & lngIDPrt
    
    CurrentDb.Execute strSQLTblEvol
    CurrentDb.Execute strSQLTblNot
    CurrentDb.Execute strSQLTblPrt
    
    Me.Requery
    End Sub
    L'ho scritto a memoria, magari la sintassi non è perfetta e non l'ho provato ma più o meno la struttura è questa.
  • Re: [Risolto] query di eliminazione

    Philcattivocarattere ha scritto:


    Report? non eri in una maschera?
    mi sono confuso! volevo scrivere maschera.

    Ti ringrazio per il tuo prezioso aiuto, mi metterò subito all'opera per approfondire lo studio del VBA così da poter capire appieno il codice che hai postato e così da poterlo utilizzare al meglio!
    grazie.
  • Re: [Risolto] query di eliminazione

    marcios ha scritto:


    ...
    Ti ringrazio per il tuo prezioso aiuto, mi metterò subito all'opera per approfondire lo studio del VBA così da poter capire appieno il codice che hai postato e così da poterlo utilizzare al meglio!
    Occhio che si tratta di query di eliminazione... se qualcosa va storto durante le prove ti ritrovi un db vuoto o quasi, quindi fai sempre qualche salvataggio per ripristinare le tabelle (seppur di prova) come erano prima.
  • Re: [Risolto] query di eliminazione

    Philcattivocarattere ha scritto:


    Occhio che si tratta di query di eliminazione... se qualcosa va storto durante le prove ti ritrovi un db vuoto o quasi, quindi fai sempre qualche salvataggio per ripristinare le tabelle (seppur di prova) come erano prima.
    io sono un fissato con i "backup" ogni modifica ne faccio uno!

    comunque volevo dirti che ho fatto una prova ad inserire il codice, così da capire se posso modificare il post come [Risolto] e devo dirti che funziona benissimo, addirittura non mi chiede neanche il messaggio di conferma dell'eliminazione, magari studierò un modo di inserire solo un messaggio, così da evitare eliminazioni non desiderate!
    ora mi resta solo da prendere il tuo codice come base di partenza per lo studio delle varie sintassi ivi contenute.
    grazie ancora!
  • Re: [Risolto] query di eliminazione

    marcios ha scritto:


    ...
    addirittura non mi chiede neanche il messaggio di conferma dell'eliminazione,...
    Ecco perché avevo scritto

    philcattivocarattere ha scritto:


    Potresti creare 3 query che prendono IDPrt da FrmPrt, del tipo
    ...
    ed avviarle tramite le... macro, combattendo contro i warnings che ti avvisano della cancellazione.
    Personalmente farei tutto tramite vba, costruendo le stesse query come stringhe SQL ed avviandole con CurrentDB.Execute.
    proprio perché Execute è il modo con cui si eseguono le action query in VBA, senza messaggi di avviso.

    marcios ha scritto:


    ... magari studierò un modo di inserire solo un messaggio, così da evitare eliminazioni non desiderate!
    Magari un MsgBox
    If MsgBox ("Sicuro di voler cancellare?", vbYesNo + vbDefaultButton2, "Titolo finestra") = vbYes Then
       CurrentDb.Execute ...
       CurrentDb.Execute ...
       CurrentDb.Execute ...
       Msgbox "Operazione completata"
    End If
    Il vbDefaultButton2 serve per indicare che il pulsante di default è il secondo, quindi "No", così sì è costretti a spostarsi intenzionalmente su "Sì" per avviare la cancellazione. Poi vedi tu se è "eccesso di zelo".
  • Re: [Risolto] query di eliminazione

    Io, con risultato positivo, ho inserito questo codice
    If MsgBox("Confermi cancellazione record ?", vbYesNo) = vbYes Then
    Me.AllowDeletions = True
    End If
    
    ma credo che il tuo sia più interessante, quindi lo proverò sicuramente.
    Ti ringrazio per la tua disponibilità.
Devi accedere o registrarti per scrivere nel forum
11 risposte