+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Filtro su date (dal xxx al xxx)

  1. #1
    Paolo1968 non è in linea Novello
    Post
    26

    Filtro su date (dal xxx al xxx)

    Buon giorno a tutto il gruppo,
    dopo aver trovato la soluzione sono costretto ad apportare modifiche e.... sono al punto di partenza.
    Devo filtrare i dati per gli operatori disponibili in certa data.
    Avevo creato questo filtro all'apertura della form che funziona benissimo:

    codice:
    Me.Filter = "IDOperatore Not In (SELECT IDOperatore_Inc FROM Incarico WHERE data = Forms![evento scheda]!data_evento)"
    Purtroppo alcuni eventi durano più giorni, quindi ho inserito un nuovo campo [data_al]

    Come faccio, quindi, a filtrare gli operatori impegnati in un determinato giorno o più giorni??? Non trovo una soluzione.

    PS: Spero di non aver sbagliato i TAG CODE stavolta.

  2. #2
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,685
    Quote Originariamente inviato da Paolo1968 Visualizza il messaggio
    Come faccio, quindi, a filtrare gli operatori impegnati in un determinato giorno o più giorni??? Non trovo una soluzione.
    https://support.office.com/en-us/art...9-5fc961f21762 e cerca "Contain values within a date range (between two dates)"
    oppure
    https://docs.microsoft.com/en-us/pre...enand-operator

  3. #3
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    308
    Dovrebbe essere sufficiente prendere, sulla falsa riga di quel che hai già scritto tu, tutti gli operatori che non hanno incarichi nemmeno rispetto alla data di fine.
    codice:
    Me.Filter = "IDOperatore Not In (SELECT IDOperatore_Inc FROM Incarico WHERE data >= Forms![evento scheda]!data_evento) And data_al <= Forms![evento scheda]!data_evento) "
    Ma se gli eventi hanno una finestra temporale compresa tra 2 date, dovrai escludere tutti gli operatori che hanno incarichi con data_inizio e/o data_fine comprese tra le due date dell'incarico.
    codice:
    Me.Filter = "IDOperatore Not In (SELECT IDOperatore_Inc FROM Incarico WHERE (data Between Forms![evento scheda]!data_inizio_evento And Forms![evento scheda]!data_fine_evento) And (data_al Between Forms![evento scheda]!data_inizio_evento And Forms![evento scheda]!data_fine_evento)) "

  4. #4
    Paolo1968 non è in linea Novello
    Post
    26
    Grazie, interessante ma c'è qualcosa che non va, sto provando a tentoni di capire ma non ci arrivo.
    Faccio una considerazione, senza fare il controllo sui campi Data_Dal e Data_Al, credo che basti inserire un controllo sul campo Data_Al, pertanto ho inserito questo codice su un pulsante (volutamente senza il comando NOT e con le date inserite manualmente per vedere i risultati):
    codice:
    Me.Filter = "IDOperatore In (SELECT IDOperatore_Inc FROM Incarico WHERE (data_al Between #30/09/2019# And #05/10/2019#))"
    Questo mi restituisce erroneamente 16 record.

    Se invece creo una query e nel campo Data_Al inserisco il criterio
    codice:
    Between #30/09/2019# And #05/10/2019#
    I record restituiti sono, giustamente, 8.

    Dove sbaglio???
    Questo mi restituisce

  5. #5
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    688
    L'uso dell'operatore In (nel linguaggio SQL) trova applicazione quando si debbano indicare condizioni multiple (come se si applicasse la condizione OR fra diversi valori).
    https://docs.microsoft.com/en-us/off...oft-access-sql
    https://accessexperts.com/blog/2013/...ou-out-not-in/
    Lo stesso concetto è applicare la sua negazione (NOT IN) quale criterio di esclusione di una serie di valori
    https://www.fmsinc.com/MicrosoftAcce...oin/index.html
    https://www.techonthenet.com/sql/in.php
    https://stackoverflow.com/questions/...ndition-in-sql

    Quindi è discutibile impiegare operatore In

    sia per la ricerca di un singolo valore;
    infatti è sufficiente
    (per la corrispondenza la uguaglianza):
    codice:
    WHERE (((TuaTabella.DataOpr)=#09/30/2019#))
    oppure per la diversità (minore e maggiore)
    codice:
    WHERE (((TuaTabella.DataOpr)<>#09/30/2019#))
    così come per un intervallo fra due date:
    nel caso si ricerchi al suo interno
    codice:
    WHERE (((TuaTabella.DataOpr) Between #09/30/2019# And #10/05/2019#))
    oppure all'esterno dell'intervallo
    codice:
    WHERE (((TuaTabella.DataOpr) Not Between #09/30/2019# And #10/05/2019#))
    Willy

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,120
    La costruzione dei criteri richiede un po di attenzione ma anche avendo conoscenze discrete, suggerisco sempre di usare gli strumenti NATIVI che già considerano i regionalsettings.
    Nella fattispecie le date hanno la necessità della formattazione in accezione anglosassone... le stringhe gli apicetti ecc...
    Tutto questo in realtà non serve saperlo in quanto Access ha una funzione che nessuno usa e che fa tutto da sola... anche con criteri complessi.

    Prova a seguire questi esempi e testali nella finestra immediata:
    https://www.experts-exchange.com/art...dCriteria.html
    Ho avuto modo di studiare a fondo i limiti di questa funzione e dal Between all'uso di IN(...) si può usare con pochissimi e semplici accorgimenti per avere i criteri scritti correttamente a prescindere da altre impostazioni.

    Ovviamente funziona sia per la WHERE CONDITION che per la FILTER PROPERTY, che per la.costruzione di predicato SQL.
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,120
    Giusto per fare un esempio concreto:
    codice:
    BuildCriteria("DataOpr",dbDate, "Between " & CDate(Data1) & " AND " & CDate(Data2))
    BuildCriteria("DataOpr",dbDate, "Not Between " & CDate(Data1) & " AND " & CDate(Data2))
    Vuoi usare la Clausola IN... bene, basta sapere il FieldType:
    Per le DATE
    codice:
    BuildCriteria("DataOpr", dbDate, "IN (#" & Replace(Value, ";", "#;#") & "#)")
    Dove Value è l'elenco delle Date in STRINGA separate da [;]
    codice:
    "01/03/2019;04/05/2019;...."
    Per il Testo:
    codice:
    BuildCriteria(FieldName, fldType, "IN ('" & Replace(Value, ";", "';'") & "')")
    Dove Value è l'elenco dei Testi separati da [;]
    codice:
    "Pippo;Paolo;Pluto;..."
    Per i Numeri:
    codice:
    BuildCriteria(FieldName, fldType, "IN (" & Value & ")")
    Dove Value è l'elenco dei Numeri separati da [;]
    codice:
    "1;4;6;..."
    Ora, se hai un minimo di dimestichezza con il VBA scrivere una Funzione che costruisca il Criterio in modo automatico passando i parametri corretti è abbastanza semplice... se vuoi la trovi già fatta in questo Demo si chaima BuildCriteriaEX(....):
    [MsAccess] Gestione Filtri Ordinamento
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi