Query Aggiornabile con LeftJoin

di il
12 risposte

Query Aggiornabile con LeftJoin

Ho questo scenario :

- maschere principali (record singolo) con sottomaschera (continua) in quello che è il classico scenario master-details

- ho implementato la gestione della selezione dei records nelle sottomaschere (tramite una classe e una collection)

- i records della sottomaschera posso essere selezionati/deselezionati singolarmente (tramite checkbox+pulsante)
oppure tutti tramite apposito pulsante

- ho diverse sezioni dell'applicativo che utilizzano la struttura master-details appoggiandosi ad una una classe
che concentra le varie azioni dei vari buttons (compreso quello che seleziona/deseleziona tutti i records)
presenti nelle maschere Master e Details.
La classe intercetta gli eventi e gestisce tutte le operazioni che possono essere uguali tra le varie maschere

- nelle maschere details è presente un pulsante 'Delete' che apre un maschera di scelta con 3 pulsanti
(Delete record corrente, Delete Records Selezionati, Delete Tutti i Record - questa maschera
è unica per tutte le sezioni dell'applicativo).

Sostanzialmente la cancellazione avviene scorrendo il recordset della sottomaschera e se il record è selezionato lo cancella.
Quanto descritto sopra funziona in modo soddisfacente.

Ora mi è nata una esigenza particolare per alcune sezioni dell'applicativo, nelle quali
la cancellazione dei record è subordinata all'assenza di un legame del singolo record
con un record di un'altra tabella.
Se imposto nella query su cui si basa la sottomaschera un leftjoin con una terza tabella
la query stessa diventa ovviamente non aggiornabile e quindi non posso usufruire
delle normali operazioni di edit dei records nella sottomaschera.

Giusto per specificare meglio : la tabella details contiene dei codici con delle quantità previste,
la terza ulteriore tabella contiene un riferimento alla detail con la quantità utilizzata
(va da se che se non contiene il riferimento la quantità utilizzata è NULL
e questo è il motivo per il quale mi serve il leftjoin).
I records eliminabili sono SOLO quelli con quantità utilizzata = null

Di fatto avrei bisogno di rendere aggiornabile la query in presenza del leftjoin anche se dubito che si riesca fare ...

Ovviamente altre soluzioni/punti di vista alternativi sono ben accetti.

12 Risposte

  • Re: Query Aggiornabile con LeftJoin

    Nota aggiuntiva :
    avendo una collection dei record salvati (con relativa chiave) è semplice fare l'accesso alla terza tabella per verificare la presenza del legame, però mi piacerebbe poter anche visualizza nella sottomaschera la quantità utilizzata ...
  • Re: Query Aggiornabile con LeftJoin

    Ho avuto un problema simile, anche se non così complesso con classi e tutto il resto.
    Praticamente ho messo una controllo a schede per evitare un accozzaglia di sottomaschere in un unica form.
    Con la query globale gestisco i dati in comune.
    Nella prima scheda visualizzo una parte della query con il left, dove al massimo posso modificare solo l'ultimo dato della query, nella seconda scheda, invece, con una sottomaschera, ed un'altra query vado a modificare i dati che devo modificare.
    Non so se è quello che cerchi e sopratutto se il progetto e l'esigenza di visualizzazione dei dati ti permette di fare una cosa del genere, senza togliere logica alla visualizzazione o alla struttura.
  • Re: Query Aggiornabile con LeftJoin

    Premetto di avere qualche perplessità sulla piena convenzione del problema, ma dalla mia risposta lo capirai sicuramente nel caso.

    Uso stesso metodo per selezioni multiple estese implementando anche la F.C. sulla Detail per i SELECTED... non ho però l'esigenza di verificare la correlazione.

    Io tuttavia cancello con una query evito di scorrere i records.
    La mia classe genera la stringa serualizzata delle PK dei SELECTED.
    DELETE * FROM T1
    WHERE ID IN(1,4,7....)
    Nel tuo caso puoi provare ad implementare il WHERE EXIST...

    https://stackoverflow.com/questions/6179346/ms-access-exists-query-to-remove-rows

    https://stackoverflow.com/questions/19941159/delete-query-using-where-exists-matches-more-rows-than-the-subquery-returns
  • Re: Query Aggiornabile con LeftJoin

    @Alex ha scritto:


    Premetto di avere qualche perplessità sulla piena convenzione del problema, ma dalla mia risposta lo capirai sicuramente nel caso.
    Mi sarebbe piaciuto avere visivamente disponibile l'informazione di quantità utilizzata a fianco di quantità prevista ma alla fine mi sono reso conto che la query che mi restituisce l'informazione di quantità utilizzata necessariamente deve fare un group by oltre alla somma ... ergo mi scordo di riuscire a fare una query complessiva aggiornabile.
    Alla fine ho inserito nel loop della collection dei records selezionati la ricerca per ogni record di un eventuale legame, in fondo per scelta progettuale avrò al massimo un recordset di 50 records.
  • Re: Query Aggiornabile con LeftJoin

    fratac ha scritto:


    Ho avuto un problema simile, anche se non così complesso con classi e tutto il resto.
    Praticamente ho messo una controllo a schede per evitare un accozzaglia di sottomaschere in un unica form.
    Con la query globale gestisco i dati in comune.
    Nella prima scheda visualizzo una parte della query con il left, dove al massimo posso modificare solo l'ultimo dato della query, nella seconda scheda, invece, con una sottomaschera, ed un'altra query vado a modificare i dati che devo modificare.
    Non so se è quello che cerchi e sopratutto se il progetto e l'esigenza di visualizzazione dei dati ti permette di fare una cosa del genere, senza togliere logica alla visualizzazione o alla struttura.
    Si l'idea di avere un'ulteriore sottomaschera (non editabile) con visualizzati anche i legami con la terza tabella è un compromesso accettabile.
  • Re: Query Aggiornabile con LeftJoin

    @Alex ha scritto:


    Io tuttavia cancello con una query evito di scorrere i records.
    La mia classe genera la stringa serualizzata delle PK dei SELECTED.
    DELETE * FROM T1
    WHERE ID IN(1,4,7....)
    Nel tuo caso puoi provare ad implementare il WHERE EXIST...
    Anche questa è una strada percorribile ... anche se dovrei comprendere come costruire il predicato SQL (a me serve più un Where Not Exist).
  • Re: Query Aggiornabile con LeftJoin

    max.riservo ha scritto:


    @Alex ha scritto:


    Premetto di avere qualche perplessità sulla piena convenzione del problema, ma dalla mia risposta lo capirai sicuramente nel caso.
    Mi sarebbe piaciuto avere visivamente disponibile l'informazione di quantità utilizzata a fianco di quantità prevista ma alla fine mi sono reso conto che la query che mi restituisce l'informazione di quantità utilizzata necessariamente deve fare un group by oltre alla somma ... ergo mi scordo di riuscire a fare una query complessiva aggiornabile.
    Alla fine ho inserito nel loop della collection dei records selezionati la ricerca per ogni record di un eventuale legame, in fondo per scelta progettuale avrò al massimo un recordset di 50 records.
    In realtà potresti valutare un DCOUNT se hai pochi records... manterresti l'editabilità.
  • Re: Query Aggiornabile con LeftJoin

    max.riservo ha scritto:


    @Alex ha scritto:


    Io tuttavia cancello con una query evito di scorrere i records.
    La mia classe genera la stringa serualizzata delle PK dei SELECTED.
    DELETE * FROM T1
    WHERE ID IN(1,4,7....)
    Nel tuo caso puoi provare ad implementare il WHERE EXIST...
    Anche questa è una strada percorribile ... anche se dovrei comprendere come costruire il predicato SQL (a me serve più un Where Not Exist).
    Non l'ho provata... ma...
    
    DELETE FROM T1
    WHERE NOT EXISTS
          ( SELECT * FROM T2
            WHERE T1.ID=T2.ID) AND T1.ID IN (1,5,6,8)
    oppure...
    
    DELETE FROM T1
    WHERE T1.ID NOT EXISTS IN
        (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
  • Re: Query Aggiornabile con LeftJoin

    Mi sa che è la volta che correggo Alex
    DELETE FROM T1
    WHERE T1.ID NOT EXISTS IN
    (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
    dovrebbe essere senza EXIST
    
    DELETE FROM T1
    WHERE T1.ID NOT IN
        (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
    ma probabilmente mi sto sbagliando
  • Re: Query Aggiornabile con LeftJoin

    muttley005 ha scritto:


    Mi sa che è la volta che correggo Alex
    DELETE FROM T1
    WHERE T1.ID NOT EXISTS IN
    (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
    dovrebbe essere senza EXIST
    
    DELETE FROM T1
    WHERE T1.ID NOT IN
        (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
    ma probabilmente mi sto sbagliando
    Intanto è EXISTS e non EXIST.
    L'uso di EXISTS è una possiblità... quindi forse ho messo un IN di troppo, non proprio quello che hai indicato tu quindi:
    
    DELETE FROM T1
    WHERE T1.ID NOT EXISTS 
        (SELECT ID FROM T2) AND T1.ID IN (1,5,6,8)
    


    https://www.w3schools.com/sql/sql_exists.as
  • Re: Query Aggiornabile con LeftJoin

    Si... ok... ho "mancato" una S
    rimane che IN e EXISTS insieme non ci stanno
  • Re: Query Aggiornabile con LeftJoin

    muttley005 ha scritto:


    Si... ok... ho "mancato" una S
    rimane che IN e EXISTS insieme non ci stanno
    Tu hai mancato la S io aggiunto un IN di troppo... dici siamo pari...?
    L'ho rimosso grazie.
Devi accedere o registrarti per scrivere nel forum
12 risposte