Cerca in db access tra date

di il
26 risposte

Cerca in db access tra date

Ciao a tutti,
vorrei capire, se possibile, come poter ottenere dei dati inseriti in un database access compresi tra due date.
Premetto che le textbox verranno riempite solo con la pressione nel DataTimePicker quindi avranno sempre la stessa formattazione.

Ho trovato online solo vecchie discussioni ma nulla di risolutivo.
Saprete indicarmi che approccio di ragionamento intraprendere?

ho trovato questo codice ma boh.... anche se dovesse funzionare non mi è molto chiaro, anzi, sono piu i dubbi che gli indizi, perchè usa ID, perchè anagrafica ID usa 75... insomma.... boh...
SELECT Cognome, Nome, DataInizio, DataFine, OraInizio, OraFine, TotOre, Ore.ID 
 
 FROM Anagrafica,Ore   
 
WHERE Anagrafica.ID=Ore.IDanagrafica   
 
AND Ore.IDanagrafica=75 
 
AND   ( Day(DataInizio) >= 6 And Month(DataInizio) >= 7   And Year(DataInizio) >= 2010 ) 
 
And  ( Day(DataInizio) <= 25 And Month(DataInizio) <= 7  And Year(DataInizio) <= 2010 )
 
 ORDER BY DataInizio

26 Risposte

  • Re: Cerca in db access tra date

    Stavo pensando ad una cosa simile...
    myConnection.ConnectionString = connString
            myConnection.Open()
            Dim trova As String
            trova = "SELECT * FROM Clienti WHERE ID BETWEEN @Data1 and @Data2 "
                    Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
                    cmd.Parameters.AddWithValue("@Data1", DataPicker1)
                    cmd.Parameters.AddWithValue("@Data2", DataPicker2)
                    ' readuser è gichiarato come oledb.datareader
            readuser = cmd.ExecuteReader()
            DGVtrova.Rows.Clear()
    
            While readuser.Read
                DGVtrova.Rows.Add(readuser("ID"), readuser("Categoria"), readuser("Cognome"), readuser("Nome"))
            End While
    che dite?
  • Re: Cerca in db access tra date

    Quindi in caso funzionasse in qualche modo poi sostituirei il campo ID con una parola di mio interesse per cercare quella parola specifica tra due date.... vediamo che esce fuori?
  • Re: Cerca in db access tra date

    Ciao a tutti, riprendo questa discussione per un ulteriore problema, a prescindere dal fatto che ho risolto quello che chiedevo in questo modo:
     Dim ds As New DataSet
            Dim Bsource As New BindingSource
            DGVdate.Rows.Clear()
            Try
                myConnection.ConnectionString = connString
                myConnection.Open()
                Dim trova As New OleDbDataAdapter("SELECT * FROM Pagamenti WHERE DataPagamento BETWEEN @Data1 and @Data2", myConnection)
                trova.SelectCommand.Parameters.AddWithValue("@Data1", Label1.Text)
                trova.SelectCommand.Parameters.AddWithValue("@Data2", Label2.Text)
                trova.Fill(ds)
                Bsource.DataSource = ds.Tables(0)
                If ds.Tables(0).Rows.Count > 0 Then
                    DGVdate.DataSource = ds.Tables(0)
                Else
                End If
                myConnection.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            myConnection.Close()
    ecco... lasciando da parte tutte le eccezioni del caso perchè è un form dove sto facendo un test e quindi le gestirò dopo...
    se volessi implementare questo filtro, ovvero, filtrare tra date in base ad un campo come PAGATO o NON PAGATO o ACCONTO cosa potrei fare? ho provato aggiungendo il riferimento con AND dopo data2 scrivendo AND StatoPagamento=@StatoPagamento e aggiungendo la SelectComando sotto ma da sempre campo vuoto.
    Qualche idea per cortesia?
  • Re: Cerca in db access tra date

    orione1976 ha scritto:


    ...ho provato aggiungendo il riferimento con AND dopo data2 scrivendo AND StatoPagamento=@StatoPagamento e aggiungendo la SelectComando sotto ma da sempre campo vuoto...
    Cioè? Come risulta la nuova query?
  • Re: Cerca in db access tra date

    Ciao di nuovo avevo provato
    Dim trova As New OleDbDataAdapter("SELECT * FROM Pagamenti WHERE DataPagamento BETWEEN @Data1 and @Data2 AND Stato Pagamento=@StatoPagamento", myConnection)
    trova.SelectCommand.Parameters.AddWithValue("@Data1", Label1.Text)
    trova.SelectCommand.Parameters.AddWithValue("@StatoPagamento, CBStatoPagamento.Text)
    avevo provato a cambiare in questo modo ma ovviamente è errato
  • Re: Cerca in db access tra date

    Non vedo dove imposti il parametro [@Data2]. Ricorda che la guida dice esplicitamente di usare il placeholder "?" e che l'ordine in cui i parametri vengono aggiunti alla raccolta è importante.
    Che funzioni anche con i parametri denominati temo sia un caso...
    Prova con: [CODE]Dim trova As New OleDbDataAdapter("SELECT * FROM Pagamenti WHERE DataPagamento BETWEEN ? and ? AND Stato Pagamento=?", myConnection) trova.SelectCommand.Parameters.AddWithValue("@Data1", Label1.Text) trova.SelectCommand.Parameters.AddWithValue("@Data2", Label2.Text) trova.SelectCommand.Parameters.AddWithValue("@StatoPagamento, CBStatoPagamento.Text)
  • Re: Cerca in db access tra date

    Si scusa avevo riscritto senza fare copia e incolla quindi ho omesso il data 2
    Proverò come suggerito perchè la sintassi del comando era leggermente diversa.
    Testo e aggiorno... grazie per ora

    P.s. per i ? Hai ragione l'ho letto, ho anche letto che usando i ? Devo per forza rispettare l'ordine ma non so perchè allora con @ funziona anche se l'ordine non è sequenziale... comunque testo... grazie
  • Re: Cerca in db access tra date

    Io con il BETWEEN ci ho sempre litigato, ti consiglio quindi di provare con
    SELECT * FROM Pagamenti WHERE DataPagamento >= ? AND DataPagamento <= ? AND Stato Pagamento = ?
    oppure prova a metterci delle parentesi, ad esempio
    SELECT * FROM Pagamenti WHERE (DataPagamento BETWEEN ? and ?) AND Stato Pagamento=?
  • Re: Cerca in db access tra date

    Niente da fare, mi sono accorto che riesco si, a filtrare lo stato, ma che effettivamente invece, mi carica tutti i dati e non filtra ste benedette date... quindi uno step indietro... ho provato in questi 2 modi:
    Try
                    myConnection.ConnectionString = connString
                    myConnection.Open()
                    Dim trova As New OleDbDataAdapter("SELECT * FROM Pagamenti WHERE DataPagamento BETWEEN (?) AND (?) ", myConnection)
                    trova.SelectCommand.Parameters.AddWithValue("?", DateTimePicker1.Value.ToString)
                    trova.SelectCommand.Parameters.AddWithValue("?", DateTimePicker2.Value.ToString)
                    trova.Fill(ds)
                    Bsource.DataSource = ds.Tables(0)
                    If ds.Tables(0).Rows.Count > 0 Then
                        DGVdate.DataSource = ds.Tables(0)
                    Else
                    End If
                    myConnection.Close()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
    e
    Try
                    myConnection.ConnectionString = connString
                    myConnection.Open()
                    Dim trova As String
                    trova = "SELECT * FROM Pagamenti WHERE (DataPagamento >=? AND DataPagamento <=?) ORDER BY DataPagamento"
                    Dim cmd As New OleDbCommand(trova, myConnection)
                    cmd.Parameters.AddWithValue("?", DateTimePicker1.Value.ToString)
                    cmd.Parameters.AddWithValue("?", DateTimePicker2.Value.ToString)
                    cmd.ExecuteNonQuery()
                    Leggi = cmd.ExecuteReader
                    DGV2.Rows.Clear()
                    While Leggi.Read = True
                        DGV2.Rows.Add(Leggi("ID"), Leggi("IDcliente"), Leggi("File"), Leggi("Fattura"), Leggi("DataFattura"), Leggi("ImportoFattura"), Leggi("ScadenzaPagamento"), Leggi("DataPagamento"), Leggi("TipoPagamento"), Leggi("StatoPagamento"), Leggi("Note"))
                    End While
                    myConnection.Close()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
    niente da fare, carica tutti i dati che trova ma non nell'intervallo specificato e non da alcun errore
  • Re: Cerca in db access tra date

    Mmmm...
    1) La query, eseguita su Access, restituisce i risultati?
    2) Prova l'overload del metodo Add che prevede anche di specificare il tipo: [CODE]... cmd.Parameters.Add("@Data1", OleDbType.Date).Value = DateTimePicker1.Value cmd.Parameters.Add("@Data2", OleDbType.Date).Value = DateTimePicker2.Value Leggi = cmd.ExecuteReader() DGV2.Rows.Clear() While Leggi.Read() DGV2.Rows.Add(Leggi("ID"), Leggi("IDcliente"), Leggi("File"), Leggi("Fattura"), Leggi("DataFattura"), Leggi("ImportoFattura"), Leggi("ScadenzaPagamento"), Leggi("DataPagamento"), Leggi("TipoPagamento"), Leggi("StatoPagamento"), Leggi("Note")) End While Leggi.Close() myConnection.Close() ... L'istruzione [cmd.ExecuteNonQuery()] non serve a nulla. Il metodo OleDbDataReader.Read(), restituisce già Boolean. Il confronto con True è inutile.

    PS: La variabile [Leggi] dove la dichiari? Sei sicuro di entrare nel ciclo? Magari è già stato usato prima e all'inizio del While è già alla fine e Read restituisce False da subito... E il reader bisogna chiuderlo PRIMA di chiudere la connessione. Leggi i "Remarks" del metodo sulla guida.
  • Re: Cerca in db access tra date

     BETWEEN #" & dData1.ToString("MM/dd/yyyy HH:mm") & "# AND #" & dData2.ToString("MM/dd/yyyy HH:mm") & "#"
    Questa sarebbe la forma senza l'uso di parametri.
    E' facile parametrizzarla.
  • Re: Cerca in db access tra date

    trova = "SELECT * FROM Pagamenti WHERE (DataPagamento >=? AND DataPagamento <=?) ORDER BY DataPagamento"
    Dim cmd As New OleDbCommand(trova, myConnection)
    cmd.Parameters.AddWithValue("?", DateTimePicker1.Value.ToString)
    cmd.Parameters.AddWithValue("?", DateTimePicker2.Value.ToString)
    
    questa parte di codice è normale che non funzioni, le date sono date e tu invece le passi come stringhe
    Segui il consiglio di Sgrubak e specifica anche il tipo di dato che stai passando.
    Io però fossi in te farei un passo indietro e andrei prima di tutto a fare le prove senza parametri e senza prendere le variabili dal DateTimePicker.
    Cioè scrivi la riga così (ad esempio dal 15/01 al 27/01):
    trova = "SELECT * FROM Pagamenti WHERE DataPagamento >= #01/15/2022# AND DataPagamento <= #01/27/2022# ORDER BY DataPagamento"
    e vedi cosa ti ritorna.
    Se funziona passi allo step successivo, se no vuol dire che hai problemi sui dati nel database o sulla formattazione della data.
    Poi da lì fai il passo successivo e così capisci cosa non funziona
  • Re: Cerca in db access tra date

    Niente da fare, ho seguito o almeno provato a fare quanto mi avete indicato, ho anche impostato come dice Serjo la data manualmente ma non fa la selezione nel range, ho controllato nel database e il campo viene impostato da un DataTimePicker ed è scritta come 27/01/2022 nella cella. non riesco a capire come mai.

    Il datareader è dichiarato a inizio form ma non c'è altro sto facendo delle prove quindi non è usato in altri momenti.

    Stavo pensando in alternativa, visto che i dati vanno in un Datagdidview, non sarebbe possibile passare il dato intero ed eliminare le righe che non mi interessano
    tipo se nella cella 8 la data è superiore a quella impostata elimina le righe e
    se nella cella 8 la data è inferiore a quella impostata elimina le righe

    sarebbe fattibile? capisco che è uno spreco di risorse, sarebbe opportuno filtrarle all'inizio ma non so come fare
  • Re: Cerca in db access tra date

    Molto strano... Il campo [DataPagamento] nella tabella [Pagamenti] è di tipo "Data e ora", giusto?
    Toglimi una curiosità e prova a copiaincollare questo: [CODE] Using cn As New OleDb.OleDbConnection(connString) Using cmd As New OleDb.OleDbCommand("SELECT * FROM Pagamenti WHERE DataPagamento BETWEEN ? AND ? ", cn) cmd.Parameters.Add("@Data", OleDb.OleDbType.DBDate).Value = DateTimePicker1.Value cmd.Parameters.Add("@Data2", OleDb.OleDbType.DBDate).Value = DateTimePicker2.Value cn.Open() Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader If dr.HasRows Then DataGridView1.Rows.Clear() While dr.Read() DataGridView1.Rows.Add(dr("ID"), dr("IDcliente"), dr("File"), dr("Fattura"), dr("DataFattura"), dr("ImportoFattura"), dr("ScadenzaPagamento"), dr("DataPagamento"), dr("TipoPagamento"), dr("StatoPagamento"), dr("Note")) End While Else MsgBox("Non ho trovato righe nelle date selezionate") End If dr.Close() End Using End Using L'ho appena testa su un DB di prova e funziona... Access 365 64 bit, provider in connection string Microsoft.ACE.OLEDB.12.0

    Con il metodo AddWithValue invece no funziona... Solleva eccezione
Devi accedere o registrarti per scrivere nel forum
26 risposte