Criterio query con operatore IIf

di il
13 risposte

Criterio query con operatore IIf

Ciao a tutti, ho un problema nell'esecuzione di una query applicando una condizione, mi spiego:

Ho due campi:
- frequenzaCanone(Mensile, trimestrale,...)
- dataScadenza

Devo selezionare i record con i valori "dataScadenza" superiori a 60 giorni dalla data attuale nel caso in cui il campo "frequenzaCanone" abbia cadenza "mensile". Mentre, se la cadenza è "trimestrale" (ad esempio), dovranno essere visualizzate soltanto i record con dataScadenza superiore a 120 giorni.
In entrambi i casi devono essere visualizzati anche i record vuoti.

Il criterio che ho applicato sul campo dataScadenza è il seguente:

IIf([frequenzaCanone]="Mensile", <date()-60 or is Null, <date()-120 or is Null)

Putroppo non viene visualizzato alcun dato.

Dove sbaglio, secondo voi?

Grazie

13 Risposte

  • Re: Criterio query con operatore IIf

    Non sono convinto che la sintassi che hai adottato funzioni (mi riferisco al <date()-60 o -120), sebbene mi sembri comunque corretta.
    Io preferisco usare la funzione DateAdd, ma è un mio gusto personale.
    Ti consiglio ti trovare il modo corretto prima senza la iif e senza il is Null.

    Quindi io proverei banalmente ad impostare nella where '<Date() -60', se funziona allora aggiungerei 'or is Null' e solo per ultimo la iif.

    Se vuoi mostra come viene effettivamente scritta la query.
  • Re: Criterio query con operatore IIf

    Ti confermo che già, senza la iif, funziona, è da un po' che utilizzo la query ma devo perfezionarla con le condizioni
  • Re: Criterio query con operatore IIf

    Facci vedere la query funzionante (senza iif) e quela che non funziona (con iif) ...
  • Re: Criterio query con operatore IIf

    Non riesco a ricostruire tutta la logica. Ma i miei dubbi sono:
    1. Se sei in visualizzazione struttura query, il separatore argomenti della IIf deve essere il punto-virgola.
    2. Il secondo e terzo argomento della IIf espongono un "risultato" (per me) poco chiaro. Io so che devono restituire UN valore "chiaro e forte".
  • Re: Criterio query con operatore IIf

    OsvaldoLaviosa ha scritto:


    1. Se sei in visualizzazione struttura query, il separatore argomenti della IIf deve essere il punto-virgola.
    Giusta osservazione : però lui dice che la query non restituisce record. Se fosse vera la tua ipotesi lui avrebbe un errore di sintassi ...
  • Re: Criterio query con operatore IIf

    Con la virgola funziona, col punto e virgola avevo provato ma mi veniva restituito un errore. Mi viene un dubbio, io lavoro con access come front, ma il db è mysql, non credo c'entri nulla, tutto funziona, però meglio precisare
  • Re: Criterio query con operatore IIf

    Complimenti ... vedo che anche tu appartieni a quel genere di persone che hanno paura di esprimersi.
    Come ti colleghi a MySQL ?
    Usi ODBC?
    E' una query Pass-thru?
  • Re: Criterio query con operatore IIf

    Scusate ma ancora ho tanta strada da fare, mi spiace non aver precisato. Comunque nel criterio uso il punto e virgola, non ricordavo.
    Sì, utilizzo ODBC ma non so cosa intendi per query pass-thru, immagino sia un modo per inoltrare direttamente i comandi senza l'intervento di Access. Come verifico?
  • Re: Criterio query con operatore IIf

    Non sono un dentista che deve estrarti a forza le informazioni

    Mostraci la query COMPLETA.
    Dicci se la esegui tramite QBE oppure da codice VBA.
    Se la esegui da codice VBA mostraci anche il codice annesso e connesso (quindi la connessione, il command, il recordset, etc..)

    Insomma spendi un poco di tempo a scrivere il contesto invece di farci fare ipotesi !
  • Re: Criterio query con operatore IIf

    Lavoro con QBE (grazie wikipedia ), vi mostro la query originale:
    qui il relativo codice SQL:


    SELECT pratica.NumRGE, contratti.DtAggiudicazione, contratti.Note, immobili.NumeroLotto, conduttori.CognomeRagSoc, contratti.NumeroContratto, frequenzacanoni.FrequenzaCanone, Max(pagamenti.DataPagamento) AS MaxDiDataPagamento, contratti.DtInvioAvviso, tipouso.descrizioneUso, procedimenti.DtAffido, contratti.ImportoCanone, contratti.Cessato, pratica.Estinzione, Imm_Pratiche.Stato2, contratti.idtipouso
    FROM ((((((contratti LEFT JOIN pagamenti ON contratti.IdContratto = pagamenti.IdContratto) LEFT JOIN procedimenti ON contratti.IdContratto = procedimenti.IdContratto) LEFT JOIN immobili ON contratti.IdImmobile = immobili.IdImmobile) LEFT JOIN (pratica LEFT JOIN Imm_Pratiche ON pratica.NumRGE = Imm_Pratiche.NumeroRge) ON contratti.IdPratica = pratica.PraticaID) LEFT JOIN frequenzacanoni ON contratti.IdFrequenza = frequenzacanoni.FrequenzaID) LEFT JOIN conduttori ON contratti.IdConduttore = conduttori.ConduttoreID) LEFT JOIN tipouso ON contratti.idtipouso = tipouso.idtipouso
    GROUP BY pratica.NumRGE, contratti.DtAggiudicazione, contratti.Note, immobili.NumeroLotto, conduttori.CognomeRagSoc, contratti.NumeroContratto, frequenzacanoni.FrequenzaCanone, contratti.DtInvioAvviso, tipouso.descrizioneUso, procedimenti.DtAffido, contratti.ImportoCanone, contratti.Cessato, pratica.Estinzione, Imm_Pratiche.Stato2, contratti.idtipouso
    HAVING (((Max(pagamenti.DataPagamento))<Date()-60 Or (Max(pagamenti.DataPagamento)) Is Null) AND ((contratti.DtInvioAvviso)<Date()-60 Or (contratti.DtInvioAvviso) Is Null) AND ((procedimenti.DtAffido) Is Null) AND ((contratti.Cessato)=False) AND ((pratica.Estinzione) Is Null) AND ((Imm_Pratiche.Stato2)<>4));[/code]

    Non ho idea di come risolvere.
  • Re: Criterio query con operatore IIf

    cataland ha scritto:



    SELECT
    pratica.NumRGE, contratti.DtAggiudicazione, contratti.Note, immobili.NumeroLotto,
    conduttori.CognomeRagSoc, contratti.NumeroContratto, frequenzacanoni.FrequenzaCanone,
    Max(pagamenti.DataPagamento) AS MaxDiDataPagamento,
    contratti.DtInvioAvviso, tipouso.descrizioneUso, procedimenti.DtAffido,
    contratti.ImportoCanone, contratti.Cessato, pratica.Estinzione,
    Imm_Pratiche.Stato2, contratti.idtipouso
    FROM
    ((((((contratti LEFT JOIN pagamenti ON contratti.IdContratto = pagamenti.IdContratto)
    LEFT JOIN procedimenti ON contratti.IdContratto = procedimenti.IdContratto)
    LEFT JOIN immobili ON contratti.IdImmobile = immobili.IdImmobile)
    LEFT JOIN (pratica LEFT JOIN Imm_Pratiche ON pratica.NumRGE = Imm_Pratiche.NumeroRge) ON contratti.IdPratica = pratica.PraticaID)
    LEFT JOIN frequenzacanoni ON contratti.IdFrequenza = frequenzacanoni.FrequenzaID)
    LEFT JOIN conduttori ON contratti.IdConduttore = conduttori.ConduttoreID)
    LEFT JOIN tipouso ON contratti.idtipouso = tipouso.idtipouso
    GROUP BY
    pratica.NumRGE, contratti.DtAggiudicazione, contratti.Note, immobili.NumeroLotto,
    conduttori.CognomeRagSoc, contratti.NumeroContratto, frequenzacanoni.FrequenzaCanone,
    contratti.DtInvioAvviso, tipouso.descrizioneUso, procedimenti.DtAffido,
    contratti.ImportoCanone, contratti.Cessato, pratica.Estinzione,
    Imm_Pratiche.Stato2, contratti.idtipouso
    HAVING
    (
    ((Max(pagamenti.DataPagamento))<Date()-60 Or (Max(pagamenti.DataPagamento)) Is Null)
    AND ((contratti.DtInvioAvviso)<Date()-60 Or (contratti.DtInvioAvviso) Is Null)
    AND ((procedimenti.DtAffido) Is Null)
    AND ((contratti.Cessato)=False)
    AND ((pratica.Estinzione) Is Null)
    AND ((Imm_Pratiche.Stato2)<>4)
    );
    Quindi questa query funziona ? E' la tua query solo tabulata in maniera umana.
    E' decisamente complicata, anche se mi sembra corretta.
    Probabilmente le ultime 4 condizioni dell'Having possono essere imposte come Where (non sono il tuo problema, eventualmente comportano un degrado delle prestazioni).
    Nutro qualche dubbio su tutti i Left Join che forse potrebbe essere fugato vedendo come hai disegnato la query, io farei una query usando la tabella contratti con i tutti i suoi Left Join (se non sbaglio sono 5) e poi la utilizzerei nella query principale in modo da renderla più comprensibile.
  • Re: Criterio query con operatore IIf

    Di seguito trovi il disegno della query con QBE:
  • Re: Criterio query con operatore IIf

    Comunque nella query che hai postato non è presente la famosa iif sul campo DataScadenza che tra () non è nemmeno presente (nella select, nella where che non c'è, nel having) ...
Devi accedere o registrarti per scrivere nel forum
13 risposte