[V6] problema con ADODB.Recordset, proprietà Filter e SQL server 2005

martedì 12 maggio 2009 - 09.21

a.bombardini Profilo | Newbie

Ciao a tutti,

Ho una applicazione in VB6 che si appoggia ad un DB sqlserver 2005.
Per realizzare delle ricerce, dato un recordset (ADODB.Recordset) utilizzo il metodo filter.
A seconda del tipo di dati, ovviamente, definisco l'operatore della filter come "LIKE" o "=".
Il problema si pone quando il tipo di dati del campo è adDBDate, adDate, adDBTimeStamp:

il filtro si comporta in maniera anomala, mostrandomi tutti i record oppure nessuno, senza alcun criterio apparente.
Queste sono le sintassi che ho provato, tutte con lo stesso risultato

RecSet.Filter = “DataInizio >= ‘01/01/2001 18.19.15'” RecSet.Filter = "DataInizio >= #01/01/2001 18.19.15#" RecSet.Filter = “DataInizio >= ‘01/01/2001’” RecSet.Filter = "DataInizio >= #01/01/2001#" RecSet.Filter = “DataInizio >= ‘2001/01/01’” RecSet.Filter = "DataInizio >= #2001/01/01#"

Cosa sto sbagliando?
Ringrazio in anticipo per la risposta!

Dainesi Profilo | Senior Member

>il filtro si comporta in maniera anomala, mostrandomi tutti i
>record oppure nessuno, senza alcun criterio apparente.
>Queste sono le sintassi che ho provato, tutte con lo stesso risultato
>
>RecSet.Filter = “DataInizio >= ‘01/01/2001 18.19.15'”
>RecSet.Filter = "DataInizio >= #01/01/2001 18.19.15#"
>RecSet.Filter = “DataInizio >= ‘01/01/2001’”
>RecSet.Filter = "DataInizio >= #01/01/2001#"
>RecSet.Filter = “DataInizio >= ‘2001/01/01’”
>RecSet.Filter = "DataInizio >= #2001/01/01#"
>
>
>Cosa sto sbagliando?
>Ringrazio in anticipo per la risposta!

Prova così

RecSet.Filter = "DataInizio >= CONVERT(DATETIME, '" & Year(dData) & "/" & Month(dData) & "/" & Day(dData) & "', 102)"
SQL Server tratta le date in maniera differente rispetto a VB e quindi richiede una conversione esplicita.

.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

a.bombardini Profilo | Newbie

Che velocità, gentilissimo!
purtroppo la filter accetta solamente gli operatori di confronto "=", "LIKE", ">", "<", ">=", "<=" e non ammette funzioni SQL al suo interno.
Ho comunque provato a passargli una stringa formattata come avrebbe fatto la tua CONVERT

RecSet.Filter = "DataInizio >= '2009-01-01 00:00:00'"

e il risultato non è cambiato.

Dainesi Profilo | Senior Member

>Che velocità, gentilissimo!
>purtroppo la filter accetta solamente gli operatori di confronto
>"=", "LIKE", ">", "<", ">=", "<=" e non ammette funzioni
>SQL al suo interno.
>Ho comunque provato a passargli una stringa formattata come avrebbe
>fatto la tua CONVERT
>
>RecSet.Filter = "DataInizio >= '2009-01-01 00:00:00'"
>
>e il risultato non è cambiato.

Devi per forza esser obbligato ad utilizzare Filter ? Perché non ottieni un recordset da un oggetto Command ?
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

a.bombardini Profilo | Newbie

Purtroppo variare il recordset ogni volta temo sia troppo pesante, visto che la procedura viene chiamata ad ogni evento change del filtro, su ciascun campo.
La procedura utilizzata è più o meno questa (tutorial 29 delle TDBGrid8 di ComponentOne per OCX)

Private Function getFilter() As String 'Creates the SQL statement in adodc1.recordset.filter 'and only filters text currently. It must be modified to filter other data types. Dim tmp As String Dim n As Integer For Each col In cols If Trim(col.FilterText) <> "" Then n = n + 1 If n > 1 Then tmp = tmp & " AND " End If tmp = tmp & col.DataField & " LIKE '" & col.FilterText & "*'" End If Next col getFilter = tmp End Function

Ovviamente con le modifiche relative alla gestione dei tipi di campo diversi.
La cosa assurda è che la filter sulel date, con Access, non mi da alcun problema.

Grazie ancora per l'interessamento!

Dainesi Profilo | Senior Member

Uhm.... hai provato ad usare recordset disconnessi ? Il vantaggio in questo caso è che l'applicazione del filtro avviene in locale e non in remoto sul server dove ci siattende il rispetto dell'SQL nativo.

.
Autore del libro sul FOREX, MetaTrader e creazione dei trading system http://ilmiolibro.kataweb.it/schedalibro.asp?id=115872

Jeremy Profilo | Guru

Scusate l'intromissione, ma non ho capito se puoi o meno sostituire l'operatore LIKE con l'operatore BETWEEN, molto più performante per criteri in funzione delle date.
Se NO ... chiedo scusa per l'intromissione.

Ciao.

a.bombardini Profilo | Newbie

Anche il discorso recordset disconnessi preferirei evitarlo, vista l'ingente quantità di modifiche del codice che andrebbe a richiedere.
Dovrò rimanere fedele alla filter...

La proprietà filter ammette solamente gli operatori "=", ">", "<", ">=", "<=" e "LIKE", quindi niente "BETWEEN", "IN" e altri operatori tanto comodi!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5