Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB2008] Funzione filtro su date
Forum - C# / VB.NET - [VB2008] Funzione filtro su date

Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 14:55
Lunedì, 22/02/2010
Ciao a tutti!!
Ormai è da diversi giorni che non riesco a venirne a capo per una funzione; cerco di descrivervi quello che ho:
1-Datagridview
2-Calendario
3-Bottone di filtro

Il datagridview è collegato tramite codice ad un database e questo è il codice per richiamarlo:
Codice sorgente - presumibilmente VB.NET

  1. Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\db.mdb")
  2.     Dim cmd As OleDbCommand
  3.     Dim daOrdini As OleDbDataAdapter
  4.     Dim dtOrdini As DataTable
  5.  
  6. e al caricamento del Form:
  7.  
  8. conn.Close()
  9.         Try
  10.             conn.Open()
  11.             cmd = New OleDbCommand("SELECT ID, Nome, Ultima_consegna, Ripetizione, Prossima_consegna, Tel_1, Tel_2, Via, Paese, Note FROM clienti ORDER BY Nome", conn)
  12.             daOrdini = New OleDbDataAdapter()
  13.             daOrdini.SelectCommand = cmd
  14.             dtOrdini = New DataTable()
  15.             daOrdini.Fill(dtOrdini)
  16.             Me.dgvOrdini.DataSource = Me.dtOrdini
  17.             Me.dgvOrdini.Columns("Ripetizione").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
  18.             Me.dgvOrdini.Columns("Ultima_consegna").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
  19.             Me.dgvOrdini.Columns("Prossima_consegna").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
  20.            
  21.         Catch ex As Exception
  22.             MsgBox(ex.Message)
  23.         End Try



Ok, premendo il pulsante Filtra ho bisogno che il datagridview mi visualizza i nomi (e altri campi) dove corrisponde la data selezionata sul calendario con la data presente nel campo Prossima_consegna; ecco il codice:

Codice sorgente - presumibilmente VB.NET

  1. conn.Close()
  2.  
  3.         Try
  4.             conn.Open()
  5.             cmd = New OleDbCommand("SELECT ID, Nome, Ultima_consegna, Ripetizione, Prossima_consegna, Tel_1, Tel_2, Via, Paese, Note FROM clienti WHERE Prossima_consegna = '" & Calendario.SelectionRange.Start.Date() & "' ORDER BY Nome", conn)
  6.            
  7. [...]CUT
  8.  
  9.         Catch ex As Exception
  10.             MsgBox(ex.Message)
  11.         End Try



Nel database (Access 2007) i campi "Prossima_consegna" e "Ultima_consegna" sono formattati come Data/Ora con visualizzazione dd/MM/yyyy. L'errore che mi segnala è il seguente:
"Tipo di dati non corrispondenti nell'espressione criterio"

Mi pare di capire che questo errore è dovuto al fatto che la data presa dal calendario presente sul form sia di tipo String e quindi non viene accettata quando si confronta con qualcosa di Data/Ora presente nel database, corretto?

Come posso risolvere?

Ps:spero di essere stato chiaro...

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 17:17
Lunedì, 22/02/2010
Non so se Access 2007 ha mantenuto il formato dei precedenti.
Comunque prova la stringa "#MM/dd/yyyy#"


che le risposte ti siano servite o meno un tuo riscontro è segno di cortesia.

http://www.alfonsonatale.altervista.org/
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 17:31
Lunedì, 22/02/2010
Testo quotato

Postato originariamente da Alfonso:

Non so se Access 2007 ha mantenuto il formato dei precedenti.
Comunque prova la stringa "#MM/dd/yyyy#"



Già, pensa che la risposta l'avevo trovata proprio adesso e stavo per scriverla!!
Comunque mi è bastato mettere i # senza modificare il format...Praticamente il comando è:
Codice sorgente - presumibilmente C# / VB.NET

  1. cmd = New OleDbCommand("SELECT ID, Nome, Ultima_consegna, Ripetizione, Prossima_consegna, Tel_1, Tel_2, Via, Paese, Note FROM clienti WHERE Prossima_consegna = #" & Calendario.SelectionRange.Start.Date() & "# ORDER BY Nome", conn)


e mi filtra correttamente!

Ora sto cercando il sistema di sommare il campo "Ripetizione" con la data filtrata...! Spero ci sia qualche funzione per farlo, in quanto nel campo Ripetizione è un valore Integer e non data!!
Quindi quello che mi dovrebbe restituire è ad esempio:
22/02/2010 + 3 (Campo in ripetizione) = 25/02/2010


EDIT:
Piano piano riesco a fare anche questo...Nel senso che ho visto che c'è la funzione
Codice sorgente - presumibilmente Plain Text

  1. Date.Today.AddDays(NUMERO GIORNI)



Però il problema rimane che nel campo "Ripetizioni" ho un valore integer (quindi non formattato come data) e quando provo a fare ad esempio
Codice sorgente - presumibilmente Plain Text

  1. Date.Today.AddDays(dgvOrdini.CurrentRow.Cells(3).Value)


Mi restituisce
"Cast non valido dal tipo 'Integer' al tipo 'Date'."

Ultima modifica effettuata da DidyMond il 22/02/2010 alle 17:49
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 21:28
Martedì, 23/02/2010
Ok, riesco anche ad incrementare le date tramite il campo Ripetizione...però accade una cosa alquanto strana, esempio:

Codice sorgente - presumibilmente Plain Text

  1. prossima_consegna_tabella = Me.dgvOrdini.CurrentRow.Cells(4).Value
  2. prossima_consegna_calcolata = (prossima_consegna_tabella.AddDays(1))



Quindi, se non sono stupido io se la data visualizzata nella cella 4 è 23/02/2010 aggiungendo un giorno esce 24/02/2010, ma se io riseleziono la stessa riga e quindi il valore è ora impostato alla data 24/02/2010 ma aggiungendo 1 mi aumenta il mese e non il giorno!!

Praticamente una volta mi aggiorna il giorno e l'altra il mese e cosi via...Prima uno e poi l'altro... :_doubt:

Sapete darmi una manina?? 8-|


EDIT:
Come non detto...scusate...Probabilmente avevo qualche chiamata di troppo che mi effettuava il calcolo dei valori da inserire...Ora dovrebbe funzionare!
Se ci sono altri problemi vi aggiorno! ;)


Ultima modifica effettuata da DidyMond il 23/02/2010 alle 21:49
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 23:08
Domenica, 28/02/2010
Niente...ho sempre il problema delle date, sembrava che avevo risolto e invece no, ma credo di sapere dove sta il problema.

A volte la data viene inserita giusta nel formato dd/mm/yyyy e a volte si inverte in questo modo mm/dd/yyyy infatti il problema non persiste fino a quando i giorni superano i mesi, cioè quando le date sono dal 13 in poi e Access non si confonde tra mese e giorno.
Ad esempio 5/11/2010 + 2 dovrebbe fare 7/11/2010 invece lui lo inserisce come 11/7/2010...

Non saprei come fare...Avete qualche idea??

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:15
Lunedì, 01/03/2010
Credo sia dovuto ad un errore di formattazione. Gli anglosassoni sono soliti mettere prima il mese e poi il giorno. Se certe parti dell'applicazione lavorano con la cultura del computer e altri con quella di default, si generano errori di questo tipo.
Forse è Access che non è impostato sulla cultura esatta.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote