Query Complessa per filtrare in base a range Date

di il
6 risposte

Query Complessa per filtrare in base a range Date

Buonasera,
se possibile vorrei un vostro parere in merito alla soluzione che ho adottato alla problematica che sto per descrivere.

Ho 3 Tabelle:
tbl_Utenti: ID(Pk-Counter), più altri CampiUtente (non necessitano di essere specificati);
tbl_Servizi: ID(Pk-Counter), IDUtente, Data, più altri Campi riguardanti la tipologia del servizio effettuato dall'utente nella data (non necessitano di essere specificati);
tbl_VariazioniUtente: ID(Pk-Counter), IDUtente, Decorrenza, IndiceVariazione (è un coefficente numerico che, a decorrere dalla data indicata in 'decorrenza', deve essere attribuito all'utente quando svolge il servizio... nel corso del mese l'utente ha almeno 2 o 3 variazioni):

tbl_Utenti è collegata con relazione uno a molti con le altre due tabelle;

La mia necessità era visualizzare in una query l'IDUtente , la data del servizio e l'indicevariazione posseduto in quella data.

la query "qry_StatusUtente" che ho realizzato ha il seguente predicato SQL
SELECT DCount("[ID]","tbl_VariazioniUtente","[ID]<=" & [tbl_VariazioniUtente]![ID] & " and [IDUtente]=" & [tbl_VariazioniUtente]![IDUtente]) AS Progressivo, IIf(IsNull(DLookUp("[Decorrenza]","qry_StatusUtente","[Progressivo]=" & [Progressivo]+1 & " and [IDUtente]=" & [IDUtente])),Date(),DLookUp("[Decorrenza]","qry_StatusUtente","[Progressivo]=" & [Progressivo]+1 & " and [IDUtente]=" & [IDUtente])-1) AS DecorrSupp, tbl_VariazioniUtente.IDUtente, tbl_VariazioniUtente.Decorrenza, tbl_VariazioniUtente.IndiceVariazione
FROM tbl_VariazioniUtente;
La Query serve a determinare per ogni utente la decorrenza e la scadenza temporale in cui possiede un determinato coefficente

esempio:
l'utente 1 dal 1 al 10 ha il coeff 1
l'utente 1 dal 11 a "oggi" ha il coeff 2
l'utente 2 dal 1 al 5 ha il coeff 3
l'utente 2 dal 6 a "oggi" ha il coeff 3
ecc.

Poi in un'altra query basata su tbl_Servizi e Qry_StatusUtente determino il coefficente filtrando il campo data con 'between [Decorrenza] and [DecorrSupp]
esempio:
l'utente 1 in data 5 ha il coeff 1
l'utente 2 in data 12 ha il coeff 3

C'è modo di migliorarla? esistono altre vie? ... lo scrivo perché a causa del numero di utenti e delle variazioni mensili che deve elaborare ci mette un po di tempo...

Grazie.

ps:
Se avete suggerimenti per il titolo lo cambio... non mi è venuto in mente niente di meglio

6 Risposte

  • Re: Query Complessa per filtrare in base a range Date

    Intanto eviterei l'uso di funzioni di aggregazione sui domini in una Query... tu ne usi addirittura 3 mi pare...
    Perché non usi tabelle direttamente o queries raggruppate in join..?
    Al più creati una funzione esterna alla quale passi l'id e restituisce quello che ti serve...
    Ovviamente or sto banalizzando ma non avendo dati e solamente l'enunciato ragiono per concetti di base.
  • Re: Query Complessa per filtrare in base a range Date

    Angelo_Tbp ha scritto:


    ...
    C'è modo di migliorarla? esistono altre vie? ... lo scrivo perché a causa del numero di utenti e delle variazioni mensili che deve elaborare ci mette un po di tempo...
    @Alex ha già scritto dove bisogna agire. Aggiungo solo un link ad un thread dove sono intervenuto e che mi ricorda un po' questa situazione
    https://www.iprogrammatori.it/forum-programmazione/access/query-ricorsiva-t21945.html
    (ero giovane ed inesperto. Ora non più così giovane e ancora abbastanza inesperto)
  • Re: Query Complessa per filtrare in base a range Date

    Grazie a tutti per i consigli.
    Il problema non è tanto trovare una soluzione al problema ma è il trovare la soluzione più giusta al problema...
    una sola query complessa con funzioni di aggregazione?
    Query che elaborano altre query più semplici così da ottenere il medesimo risultato della query complessa?
    Sostituire le funzioni di aggregazione con il predicato SQL corrispondente.. quindi altre query?
    Fare tutto in VBa magari....
    Ero curioso di sapere se esiste una via da seguire più conveniente rispetto alle altre perché magari più performante oppure sono tutte equivalenti... potrei di volta in volta testare i tempi di risposta ma non mi sembra un modo tecnico di affrontare il problema...

    Tante strade diverse per raggiungere il medesimo obiettivo...
  • Re: Query Complessa per filtrare in base a range Date

    Fare le cose bene significa prima di tutto evitare di farle male...
    Poi si perfezionano.
    Quindi tu hai esposto una cosa fatta male... ti ho già dato alcuni elementi per migliorarla... perché intanto non percorri quelli..?
    Fare UNA Query che richiama altre queries secondo te è più performante che scrivere un unico predicato ..?
    Se SI perché..?
    Se NO perché..?

    Quali elementi o strumenti tecnici hai o conosci per discriminare le 2 opzioni..?

    Spesso si usa scrivere tante queries quando i predicati SQL sono complicati... e l'esperienza è poca... ma la sostanza è diversa.

    Se tuttavia non hai in mano strumenti di Analisi delle queries l'unica cosa che si può dirti è di evitare soluzioni palesemente errate... quello che ti ho detto.

    Access non ha un gran strumento di analisi performance delle Query... ma c'è... se non lo conosci... devi studiarlo ed usarlo... e vedrai che qualche cosa ti aiuta.

    Ad esempio:
    http://www.techrepublic.com/article/use-microsoft-jets-showplan-to-write-more-efficient-queries/
  • Re: Query Complessa per filtrare in base a range Date

    @Alex ha scritto:


    Fare le cose bene significa prima di tutto evitare di farle male...
    Poi si perfezionano.
    Quindi tu hai esposto una cosa fatta male... ti ho già dato alcuni elementi per migliorarla... perché intanto non percorri quelli..?
    in effetti le soluzioni da te proposte erano "più o meno" ricomprese tra quelle da me prospettate nell'ultimo mio post:

    @Alex ha scritto:


    Perché non usi tabelle direttamente o queries raggruppate in join..?

    Angelo_tbp ha scritto:


    Query che elaborano altre query più semplici ...

    @Alex ha scritto:


    Al più creati una funzione esterna alla quale passi l'id e restituisce quello che ti serve..

    Angelo_tbp ha scritto:


    Fare tutto in VBa magari....
    è che volevo comprendere il perché una strada è più performante di un'altra...

    @Alex ha scritto:


    Fare UNA Query che richiama altre queries secondo te è più performante che scrivere un unico predicato ..?
    Se SI perché..?
    Se NO perché..?
    Onestamente non so fornire una risposta precisa ma immagino che più compatto sia il codice meglio è quindi preferirei usare una sola Query... la mia è un'esperienza da autodidatta non da professionista e approfitto di ogni utile spunto per migliorare... quindi accetto le critiche.

    @Alex ha scritto:


    Quali elementi o strumenti tecnici hai o conosci per discriminare le 2 opzioni..?
    Conoscevo solo quello nativo di Access o alle volte vedo a occhio i tempi di risposta...

    @Alex ha scritto:


    Spesso si usa scrivere tante queries quando i predicati SQL sono complicati... e l'esperienza è poca... ma la sostanza è diversa.

    Se tuttavia non hai in mano strumenti di Analisi delle queries l'unica cosa che si può dirti è di evitare soluzioni palesemente errate... quello che ti ho detto.

    Access non ha un gran strumento di analisi performance delle Query... ma c'è... se non lo conosci... devi studiarlo ed usarlo... e vedrai che qualche cosa ti aiuta.

    Ad esempio:
    http://www.techrepublic.com/article/use-microsoft-jets-showplan-to-write-more-efficient-queries/
    Lo farò grazie!
    E' per chiedere un consiglio che ho scritto ammettendo quindi il fatto che tutti hanno qualcosa da imparare... vado a studiare.
    Buona serata.
  • Re: Query Complessa per filtrare in base a range Date

    Ho trovato delle differenze nell'implementazione del debug (vedi link di Alex) ma sostanzialmente facendo una ricerca su google esistono le procedure da usare in base alle versioni di access sia 32 bit che 64 bit... inoltre ho trovato molto interessante questo link
    http://allenbrowne.com/QueryPerfIssue.htm

    E anche questo




    Ignoravo completamente cosa succedeva dietro le quinte

    Grazie ancore per avermi indicato la via @Alex
Devi accedere o registrarti per scrivere nel forum
6 risposte