Oppure

Loading
22/02/10 13:55
DidyMond
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:
Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\db.mdb")
    Dim cmd As OleDbCommand
    Dim daOrdini As OleDbDataAdapter
    Dim dtOrdini As DataTable

e al caricamento del Form:

conn.Close()
        Try
            conn.Open()
            cmd = New OleDbCommand("SELECT ID, Nome, Ultima_consegna, Ripetizione, Prossima_consegna, Tel_1, Tel_2, Via, Paese, Note FROM clienti ORDER BY Nome", conn)
            daOrdini = New OleDbDataAdapter()
            daOrdini.SelectCommand = cmd
            dtOrdini = New DataTable()
            daOrdini.Fill(dtOrdini)
            Me.dgvOrdini.DataSource = Me.dtOrdini
            Me.dgvOrdini.Columns("Ripetizione").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            Me.dgvOrdini.Columns("Ultima_consegna").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            Me.dgvOrdini.Columns("Prossima_consegna").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            
        Catch ex As Exception
            MsgBox(ex.Message)
        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:

conn.Close()

        Try
            conn.Open()
            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)
            
[...]CUT

        Catch ex As Exception
            MsgBox(ex.Message)
        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...
aaa
22/02/10 16:17
Alfonso
Non so se Access 2007 ha mantenuto il formato dei precedenti.
Comunque prova la stringa "#MM/dd/yyyy#"
aaa
22/02/10 16:31
DidyMond
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 è:
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
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
Date.Today.AddDays(dgvOrdini.CurrentRow.Cells(3).Value)

Mi restituisce
"Cast non valido dal tipo 'Integer' al tipo 'Date'."
Ultima modifica effettuata da DidyMond 22/02/10 16:49
aaa
23/02/10 20:28
DidyMond
Ok, riesco anche ad incrementare le date tramite il campo Ripetizione...però accade una cosa alquanto strana, esempio:

     
prossima_consegna_tabella = Me.dgvOrdini.CurrentRow.Cells(4).Value
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 23/02/10 20:49
aaa
28/02/10 22:08
DidyMond
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??
aaa
01/03/10 18:15
Il Totem
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.
aaa