Query di accodamento e condizione exists

di il
7 risposte

Query di accodamento e condizione exists

Ciao a tutti,
ho dei problemi con la funzione exists in query di accodamento e spero che qualcuno possa aiutarmi.
Ho una query di accodamento che mi fornisce delle date di scadenza di alcune attività (manutenzioni impianti) cicliche da eseguire e che attraverso il DATEADD mi trasforma la data sempre in fine mese.
La funzione toglie il numero di giorni della data meno 1 in modo da ottenere sempre il primo giorno del mese, poi aggiunge 1 al mese e infine toglie ancora 1 giorno in modo da ottenere sempre la fine del mese. La data effettiva su cui lavora il DATEADD è la somma di una data (datacontratto) e di una frequenza di ripetizione dell'attività espressa in giorni (frequenzaGG). Ecco il codice:
DateAdd('d';-1;DateAdd('m';1;DateAdd('d';1-Day([datacontratto]+[frequenzaGG]);[datacontratto]+[frequenzaGG])))
Dal momento che la query non deve creare doppioni di scadenze ho pensato (rovistando su internet) di utilizzare la condizione 'Exists' per evitarlo, ma qui cominciano i problemi. Gli argomenti della funzione exists sono l'ID dell'attività manutentiva e la data di scadenza: in pratica se la tabella contiene un'attività con ID dell'attività manutentivo (IDImpiantoManutenzione) e data di scadenza (ScadenzaOperazione) uguali a quelle calcolate dalla query, non le inserisce in tabella. Ecco il codice:
Exists (SELECT null FROM RegOperazioni where RegOperazioni.IDImpMan=ImpiantiManutenzioni.IDImpiantoManutenzione and RegOperazioni.ScadenzaOperazione=(DateAdd('d';-1;DateAdd('m';1;DateAdd('d';1-Day([datacontratto]+[frequenzaGG]);[datacontratto]+[frequenzaGG]))))=False)
Continua a darmi "Syntax error" e non riesco a capire perchè!
Se invece di mettere tutta la funzione con il dateadd metto solo la data ([datacontratto]+[frequenzaGG]) funziona perfettamente e mi evita la creazione di doppioni.
Exists (SELECT null FROM RegOperazioni where RegOperazioni.IDImpMan=ImpiantiManutenzioni.IDImpiantoManutenzione and RegOperazioni.ScadenzaOperazione=([DataContratto]+[FrequenzaGG]))
Qualcuno sa darmi una spiegazione?
In alternativa, avete altre idee per evitare la creazione di doppioni dalla query di accodamento?

Grazie a tutti!

7 Risposte

  • Re: Query di accodamento e condizione exists

    Non ho capito nulla di come è fatta la tua query. Forse non è rilevante. A te interessa che la query non presenti doppioni sul campo Data (non ho capito qual'è). Prova la procedura guidata per "Query di ricerca duplicati".
  • Re: Query di accodamento e condizione exists

    OsvaldoLaviosa ha scritto:


    Non ho capito nulla di come è fatta la tua query. Forse non è rilevante. A te interessa che la query non presenti doppioni sul campo Data (non ho capito qual'è). Prova la procedura guidata per "Query di ricerca duplicati".
    La conosco ma non mi soddisfa.
    Vorrei evitare il problema all'origine e vorrei bloccare proprio la creazione di duplicati..
  • Re: Query di accodamento e condizione exists

    Sperando che un utente più esperto di me abbia compreso l'intero problema, qualcosa mi dice che tu vuoi automatizzare una operazione. Temo che la sola query di accodamento sia solo una frazione di un discorso più ampio che credo vada affrontato con un apposito e coerente codice VBA. Io però avrei bisogno di una descrizione PASSO PASSO per capirla per bene. Se non ho il quadro completo delle tabelle con le relazioni e i nomi propri di campi (anche di maschere), non sono in grado di venire a capo di nulla.
  • Re: Query di accodamento e condizione exists

    Ma nella subquery, quel:

    = false

    cosa c'entra?

    il campo ScadenzaOperazione cos'è?
    Una data, oppure ...?
  • Re: Query di accodamento e condizione exists

    cridema ha scritto:


    ...
    Ho una query di accodamento che mi fornisce delle date di scadenza di alcune attività (manutenzioni impianti) cicliche da eseguire e che attraverso il DATEADD mi trasforma la data sempre in fine mese.
    ...
    Dal momento che la query non deve creare doppioni di scadenze ho pensato (rovistando su internet) di utilizzare la condizione 'Exists' per evitarlo, ma qui cominciano i problemi. Gli argomenti della funzione exists sono l'ID dell'attività manutentiva e la data di scadenza: in pratica se la tabella contiene un'attività con ID dell'attività manutentivo (IDImpiantoManutenzione) e data di scadenza (ScadenzaOperazione) uguali a quelle calcolate dalla query, non le inserisce in tabella.
    ...
    In alternativa, avete altre idee per evitare la creazione di doppioni dalla query di accodamento?
    Per la spiegazione dell'errore di sintassi ci devo pensare ben bene (perché è ingarbugliata ben bene) (il =false ha insospettito qualcun altro, la cosa mi conforta)
    L'idea per evitare la creazione di doppioni è impostare una chiave primaria o indice con "Duplicati ammessi = No" (se hai già una chiave primaria) basati sui due campi ed ignorare gli errori di tentativo di duplicazione.
  • Re: Query di accodamento e condizione exists

    Tra l'altro, oltre alla questione poco chiara (per noi) di

    ScadenzaOperazione = False

    dovresti mostrare l'intera query, perché non mi è chiaro come stai procedendo.

    Per inserire dati che non esistono si usa WHERE NOT EXISTS (subquery)
    ma si potrebbe usare anche WHERE campo NOT IN (subquery)

    http://www.techonthenet.com/sql/exists.ph
    http://www.techonthenet.com/sql/in.ph

  • Re: Query di accodamento e condizione exists

    gibra ha scritto:


    Tra l'altro, oltre alla questione poco chiara (per noi) di

    ScadenzaOperazione = False

    dovresti mostrare l'intera query, perché non mi è chiaro come stai procedendo.

    Per inserire dati che non esistono si usa WHERE NOT EXISTS (subquery)
    ma si potrebbe usare anche WHERE campo NOT IN (subquery)

    http://www.techonthenet.com/sql/exists.ph
    http://www.techonthenet.com/sql/in.ph

    Avete ragione tutti!
    Quella condizione "false" si è generata in automatico quando da visualizzazione SQL sono passato a visualizzazion struttura nella query. Riscritto tutto in SQL e funziona!
    WHERE Immobili.gestito=Yes
    AND
    NOT EXISTS
    (SELECT * FROM RegOperazioni WHERE RegOperazioni.IDImpMan=ImpiantiManutenzioni.IDImpiantoManutenzione AND RegOperazioni.ScadenzaOperazione=DateAdd('d',-1,DateAdd('m',1,DateAdd('d',1-Day([datacontratto]+[frequenzaGG]),[datacontratto]+[frequenzaGG]))));
Devi accedere o registrarti per scrivere nel forum
7 risposte