Query access per intervallo date con parametri

di il
27 risposte

27 Risposte - Pagina 2

  • Re: Query access per intervallo date con parametri

    Si Alex ma tu utilizzeresti il metodo con queries Parametriche in un tuo programma? o preferiresti optare per altro?
    (intendo il primo tuo codice)
  • Re: Query access per intervallo date con parametri

    muttley005 ha scritto:


    Si Alex ma tu utilizzeresti il metodo con queries Parametriche in un tuo programma? o preferiresti optare per altro?
    (intendo il primo tuo codice)
    La risposta è DIPENDE, ovviamente va valutato il contesto.
    Se devo ottenere un RS parametrico, ovviamente la risposta è SI, i parametri sono comodi ed evitano una marea di problemi di conversione o altri ammennicoli...
    Se devo valorizzare una Maschera o una ListBox, valuto, perchè se dietro ho un Motore SQL di un RDBMS scarto a priori la risoluzione Implicita che prevede nel Predicato SQL il riferimento ad Oggetti di Maschera, renderebbe inutile il criterio al Motore per forzare l'applicazione in LOCALE, quindi serve valutare se fare in un modo o nell'altro...
    Diciamo che è il metodo più standard per rendere scalabile la Query su eventuali differenti DB.

    Purtroppo li usano in pochi dei programmatori di Access perchè è comodo usare la strada peggiore... i riferimenti diretti in SQL degli oggetti...
  • Re: Query access per intervallo date con parametri

    Io di solito vado di SQL costruito da VBA
    tengo però in considerazione le info che hai dato per usi futuri, quindi grazie per la "spiega"
  • Re: Query access per intervallo date con parametri

    muttley005 ha scritto:


    Era quello che temevo
    il modo giusto è quello di avere 2 controlli DAL AL in una form e passare quelli nell'SQL o meglio ancora creare "al volo" l'SQL inserendo i valori da vba
    proseguendo ...
    non ti accorgi che questa tua
    
    ...
    WHERE (("DataIN"<"DT_DAL" And "dataOUT"<"DT_AL"));
    
    ha qualcosa che non va? oltre al fatto che di nuovo hai preso il mio suggerimento e l'hai copiato sbagliato invertendo un < con un > e sbagliato anche il confronto con DAL AL

    detta tutta stai manifestando un mix di assenza di conoscenze di base, distrazione e sufficienza che diventa difficile aiutarti
    In realtà non l'ho copiato sbagliato. Sto solo provando a vedere cosa cambia. Nel tuo suggerimento, usi le funzioni al contrario rispetto alle mie, quindi sto semplicemente provando a vedere se ci capisco qualcosa. Nel riportare sul forum, ho sbagliato e chiedo scusa. HO fatto diverse prove e sto perdendo il filo. Con SQL mi viene meglio, in Access è la prima volta che ci provo e faccio fatica a capire dove devo inserire i parametri o come strutturare la query.
  • Re: Query access per intervallo date con parametri

    Quando si deve creare un filtro tra 2 date (Data_DAL - Data_AL) di record che hanno un periodo (DataIN - DataOUT) si dovrebbe provare a buttare giù uno schema
    ELENCO CASI POSSIBILI
    ELENCO CASI POSSIBILI

    tu in pratica devi escludere i casi A e F mentre devi considerare B, C ed E parzialmente mentre D tutto.
    Il filtro che ti ho scritto sembra forse a prima vista errato ma è il modo + semplice per considerare solo ciò che interessa
    La formula nella select parzializza dove necessario il/i periodo/i

    Gli errori che ottieni derivano dal non aver "tipizzato" i parametri e con le date "si incarta"
  • Re: Query access per intervallo date con parametri

    Si esatto. Il problema e la relativa soluzione grafica è quello che sto cercando di fare. Ora la soluzione di Alex, una volta aperto L'editor VBA mi da degli errori "Me!DataInizio" .
    La query SQL come da te suggerito, mi da risultati solo in D al momento.
  • Re: Query access per intervallo date con parametri

    jotric ha scritto:


    Si esatto. Il problema e la relativa soluzione grafica è quello che sto cercando di fare. Ora la soluzione di Alex, una volta aperto L'editor VBA mi da degli errori "Me!DataInizio" .
    La query SQL come da te suggerito, mi da risultati solo in D al momento.
    "me.qualcosa" indica il valore di un oggetto (controllo) su un form (/report) con quel nome
    sul mio SQL nn so che dirti se non che lo stai scrivendo male
    prova a ri-postarlo dopo quanto detto in questi infiniti scambi
  • Re: Query access per intervallo date con parametri

    "me.qualcosa" indica il valore di un oggetto (controllo) su un form (/report) con quel nome
    sul mio SQL nn so che dirti se non che lo stai scrivendo male
    prova a ri-postarlo dopo quanto detto in questi infiniti scambi
    Si, ma prima di cambiare, il "."mi torna, il "!"no. Fra le altre cose, il mio editor non digerisce nemmeno Me il che mi fa pensare che Alex usi Visual Studio e non l'IDE di Access.
    Ora il codice SQL da te suggerito e che sto cercando di usare è:
    
    SELECT TBL_Registrazioni.ID_Anagrafica,
     IIf([DataOUT]>[DT_AL],[DT_AL],[DataOUT])-IIf([DataIN]<[DT_DAL],[DT_DAL],[DataIN]) AS Giorni
    FROM TBL_Registrazioni
    WHERE DataIN<[DT_AL] and dataOUT<[DT_DAL];
    
    Considero come DT_AL : 31/01/2022 e come DT_DAL: 01/01/2022
  • Re: Query access per intervallo date con parametri

    Il motore SQL non supporta il ME, che è un riferimento tipico del vba usato all'interno dell'oggetto stesso(la form in questo xaso) infatti se leggi e guardi con attenzione il mio esempio ho messo il riferimento completo FORMS!NOMEFORM!Nomecontrollo
  • Re: Query access per intervallo date con parametri

    Per la soluzione proposta da Alex ho provato a seguire le indicazioni. Ho creato i due parametri e modificato la query. Aperto l'IDE e scritto il suo codice così:
    
    Sub QRY_Test()
        Dim rs As DAO.Recordset
        Dim qdf As DAO.QueryDef
        Set qdf = CurrentDb.QueryDefs("QRY_Test")
        Inizio = 1 / 1 / 2022
        Fine = 31 / 1 / 2022
        Set rs = qdf.OpenRecordset
        Set qdf = Nothing
        ' Ora con il RS si può fare quello che si vuole anche assegnarlo ad una Form o ListBox...
        
        Dim sSQL As String
    sSQL = "SELECT T1.* FROM T1"
    sSQL = sSQL & "WHERE (((T1.ID) Between " & CLng([Inizio]) & " And " & CLng([Fine])
    End Sub
    
    ->QRY_Test è il nome della query che to usando, ma facendo il debug, il codice genera errore di runtime al
    Set rs = qdf.OpenRecordset
  • Re: Query access per intervallo date con parametri

    @Alex ha scritto:


    Il motore SQL non supporta il ME, che è un riferimento tipico del vba usato all'interno dell'oggetto stesso(la form in questo xaso) infatti se leggi e guardi con attenzione il mio esempio ho messo il riferimento completo FORMS!NOMEFORM!Nomecontrollo
    Ok, il discorso mi torna. Ma non mi torna allora il discorso della Form. Mi spiego. In Excel, se uso VBA, posso creare una form. in Access no(o non so dove posso farlo). Forse intendi una maschera?...perdonami ma inizio a sentirmi stupido.
  • Re: Query access per intervallo date con parametri

    jotric ha scritto:


    Ora il codice SQL da te suggerito e che sto cercando di usare è:
    
    SELECT TBL_Registrazioni.ID_Anagrafica,
     IIf([DataOUT]>[DT_AL],[DT_AL],[DataOUT])-IIf([DataIN]<[DT_DAL],[DT_DAL],[DataIN]) AS Giorni
    FROM TBL_Registrazioni
    WHERE DataIN<[DT_AL] and dataOUT<[DT_DAL];
    
    Considero come DT_AL : 31/01/2022 e come DT_DAL: 01/01/2022
    Per quanto riguarda la differenza tra date in giorni direi che ti manca la funzione datediff :
    
    datediff("d", IIf(DataOUT>[DT_AL],[DT_AL],DataOUT)-IIf(DataIN<[DT_DAL],[DT_DAL],DataIN)) AS Giorni
    
    Mi pare anche che DataIn e DataOut siano campi della tabella e non parametri come [DT_DAL] e [DT_AL] quindi occhio alle parentesi quadre eventualmente non necessarie.
    Presta anche attenzione al fatto che la query scritta da VBA utilizza una sintassi differente rispetto alla query generata dalla griglia QBE, La sintassi che ti ho mostrato io è relativa al VBA per il QBE il separatore di parametri per le funzioni passa da ',' a ';' mentre il parametro per il calcolo della differenza in giorni passa da "d" (days) a "g" (giorni).
  • Re: Query access per intervallo date con parametri

    Alla fine questo è il codice SQL sistemao:
    
    SELECT TBL_Registrazioni.ID_Registrazioni, TBL_Registrazioni.ID_Anagrafica, TBL_Registrazioni.Id_Sede,
     DateDiff( 'd' ,IIf(datain<[DT_DAL],[DT_DAL],DataIn),IIf([DT_AL]<=DataIn,DataOut,IIf([DT_AL]<=DataIn,DataOut,iif(dataout >  [DT_AL] ,[DT_AL] ,DataOut)))) AS ['Days Result']
    FROM TBL_Registrazioni
    WHERE (((TBL_Registrazioni.DataIN)>=[DT_DAL])) OR (((TBL_Registrazioni.DataOUT)<=[DT_AL]));
    
    Adesso me la devo studiare un pò in tutte le condizioni perché mi restituisce dei dati non corretti.
    In TBL_Registrazioni ho i seguenti dati:
    • 1 1 1 03/01/2022 15/01/2022
      2 1 2 16/01/2022 20/08/2022
      3 1 1 21/08/2022
      4 3 1 01/07/2022
      5 3 1 03/01/2022 25/02/2022
      6 3 2 05/10/2022 12/10/2022
    Inserendo come criteri di ricerca 01/01/2022 e 31/01/2022 ho come risultato:
    12,15, , , 28,7
    I primi 4 risultati sono giusti, gli ultimi due no.
    Grazie a tutti.
Devi accedere o registrarti per scrivere nel forum
27 risposte