Newsgroup: it.comp.appl.access
Titolo: Interrogazione db via odbc con problema date giorno/mese invertite

Ambiente: Win10pro + runtime Access 2013 + driver odbc + Firebird
Tutte le tabelle collegate
Una di esse, la DOCTESTATE, dispone tra gli altri dei campi NUM_DOC 
(intero) e DATA_DOC (data/ora)
Se desidero trovare il numero documento massimo entro il 24 gennaio 2017 
eseguo una roba del tipo
 
set MyRS=CurrentDb.OpenRecordset("select max(NUM_DOC) from DOCTESTATE 
where DATA_DOC <= #01/24/2017# ",dbOpenDynaset, dbSQLPassThrough)
 
giorno e mese sono invertiti perche' il db li vorrebbe cosi
Bene, anzi male, perche' da postazione sviluppo fila tutto lissio
Porto il file mde su postazione test, e mi restituisce l'errore 3146 che 
e' un errore generico driver odbc
Provo a dargli DATA_DOC <= #24/01/2017# mi restituisce sempre l'errore 3146
Allora provo a dargli DATA_DOC <= '01/24/2017' (come vorrebbe il db da 
manager specifico IbExpress) mi restituisce un bel 3464  Data Type Mismatch
Provo ad attivare il log attivita' sul driver odbc e vedo che, comunque 
io inserisca la data 24/01/2017 oppure 01/24/2017, al db gli arriva un 
bel 24/01/2017 che non gli va bene perche' vorrebbe mese/giorno/anno
 
Le domande sono:
-1 come mai funziona su ambiente di sviluppo e non su mde?
-2 avendo impostato il flag  dbSQLPassThrough perche' Access non fa come 
gli si dice e spara fuori sempre giorno/mese/anno (quando a me 
servirebbe mese/giorno/anno sul db)
-3 come mai la query col DATA_DOC <= '01/24/2017' non viene trattata 
come una stringa ma giorno/mese vengono sistemate come fa comodo ad Access?
 
Per ultimo, se sul pc test modifico le impostazioni internazionali di 
Windows e setto mese/giorno/anno, allora la query originale funziona 
come atteso, e questo confermerebbe che Access sbircia le impostazioni 
di Windows per formattare i campi data/ora
 

 DATA_DOC <= #01/24/2017# ",dbOpenDynaset, dbSQLPassThrough)
 
Prova:
DataIni=#24/1/2017#
Set MyRS = ...
DATA_DOC <= #" & Format(DataIni, "mm/dd/yyyy") & # ",dbOpenDynaset, 
dbSQLPassThrough)
 
Bruno

 dbSQLPassThrough)
 
Errata
DATA_DOC <= #" & Format(DataIni, "mm/dd/yyyy") & # ",dbOpenDynaset,
 
Corrige
DATA_DOC <= #" & Format(DataIni, "mm/dd/yyyy") & "#,dbOpenDynaset,
 
Bruno


Ringrazio per la risposta
Ho provato, non conoscevo la scrittura DataIni = #24/1/2017#
Ma mi ritorna sempre l'errore 3146
Da notare che sul pc ambiente sviluppo, funziona pure questa
E' solo sul pc di test con Windows vergine appena installato, runtime 
Access 2013, db server, driver odbc, che non funziona
Il pc di test e' un Win10pro, ora metto su un altro sistema operativo e 
vediamo se mi fa lo stesso


Pure col Windows 8.1 stessa solfa
Si insinua sempre piu' il dubbio che sia un qualche problema importante
C'e' qualcuno qua dentro che usa mde fatti con Access2013 che si 
collegano a db Firebird?

RobertoA formulated the question :

Potrebbe essere che il driver odbc è duro d'orecchi.
Prova con:
 
Dim DataIni As Date
DataIni = #24/1/2017#
DataIni = Format(DataIni, "mm/dd/yyyy")
DATA_DOC = #" & DataIni & "#...
 
Bruno


Ho provato anche la proposta sopra
Stesso errore, 3146
Ma in che senso il driver "duro d'orecchi" ?
E' lo stesso che uso su postazione sviluppo
Lo stesso driver che se usato da mde fatto con Access2003, su pc con 
runtime Access2003, funziona correttamente
In questo senso tenderei ad escludere il driver
Inoltre, guardando il log analisi del driver odbc, si vede chiaramente 
che la data arriva sempre come giorno/mese/anno, comunque la formatti 
dentro al programma
Quindi, quando Access 'riconosce' un campo data/ora, formatta sempre 
come da impostazioni Windows correnti, fregandosene di cosa gli scrivi 
nella query, fin qua il ragionamento potrebbe anche essere logico
Se fosse cosi non si spiegherebbe pero' il fatto che da postazione 
sviluppo (Win8) funzioni tutto correttamente
 

 sviluppo (Win8) funzioni tutto correttamente
 
Ciao,
premetto non uso Firebird ma mi pare di aver intravisto un problema.
Se usi CurrentDb.Connection significa che passi attraverso le tabelle collegate del progetto corrente e quindi l'opzione dbSQLPassThrough non ha gran senso (anche se la tabella che tu tenti di leggere è su un db server).
Per usare dbSQLPassThrough dovresti aprire una connessione diretta al db.
 
Potresti fare una prova con "Short date" anziché "mm/dd/yyyy" come stringa di formattazione in modo che il formato si adatti alle impostazioni internazionali della macchina.
 
Ciao
Mat.

 (Win8) funzioni tutto correttamente
Già, infatti così proprio non è, posto che col Format mm/dd/yyyy
variamente utilizzato nell'ambito della stringa SQL le cose di
solito funzionano.
 
Potrebbe aver ragione Potone, io non sono in grado di verificarlo.
 
Bruno


Eh si era proprio cosi'
Grazie mille
Usando la classica apertura db:
------------------------------------------
Dim MyRS As DAO.Recordset, MyDB As DAO.Database
 
Set MyDB = OpenDatabase(nome_db, False, False, 
"ODBC;DSN=NOME_DB;UID=utente;PWD=password")
 
Set MyRS = MyDB.OpenRecordset("select MAX(NUM_DOC) as MAX_DOC from 
DOCTESTATE where DATA_DOC >= '" & dataSQL("01/01/" & Format$(Now, 
"yyyy")) & "' and DATA_DOCUMENTO <= '" & dataSQL("31/12/" & Format$(Now, 
"yyyy")) & "'  ", dbOpenDynaset, dbSQLPassThrough)
------------------------------------------
fila tutto liscio
Quello che non mi spiego ancora e' come mai lo stesso mdb (versione 
Access 2k) compilato in mde col 2003 funzionasse correttamente
E pure come mai da ambiente sviluppo Access2013 funziona ancor ora 
correttamente
 
 
Segnalo un pezzo di codice per chi, come me in questo frangente, ha 
necessita' di avere informazioni aggiuntive oltre al generico errore 
3146 che non specifica una mazza
------------------------------------------
Dim MyError As error
 
If Errors.count > 0 Then
     For Each MyError In DBEngine.Errors
        MsgBox MyError.number & " " & MyError.Description, , "ERRORE DSN 
ODBC"
        End With
     Next MyError
     endif
------------------------------------------
 
 
 


Si, ciaveva ragione illo

Bene così allora. 
Il fatto che funzionasse è una combinazione di fattori probabilmente: l'opzione sqlpassthrough veniva semplicemente ignorata e il comando non falliva perché la tabella era nei collegamenti di access e quindi veniva raggiunta comunque. 
La questione del formato della data è più un mistero, forse (dico forse) nelle versioni più recenti access il formato con cui specificare costanti di tipo data è meno rigido che in precedenza quando l'unico mododo per andare sul sicuro era usare mm/dd/yyyy.
Ciao
Mat.

Il 08/06/2017 14:25, Potone ha scritto:

Premesso che, andando a colpi di sql col dbSQLPassThrough su db aperto 
al volo e non su tabele collegate funziona tutto correttamente,
vorresti dire che, su form che mostrano dati da tabelle
collegate, non riusciro' mai a fare una query corretta con delle date?
 

Un modo ci sarà pure.
Hai provato con "Short date" come stringa di formattazione? 
Mat.


Quello che realmente mi preoccupa e' la differenza tra ambiente sviluppo 
e postazione utilizzo con su solo il run-time
Io mi aspetterei, se fosse che Access e Firebird 'non si prendono' di 
vederlo anche dall'ambiente di sviluppo
Ma quando si sviluppa funziona tutto bene
Fai l'mde, lo metti nel pc test, baaam non funziona piu'

Sull'incongruenza tra ambiente di sviluppo e ambiente runtime sono con te che sembra senza senso ed è anche un po' preoccupante. 
Posso chiederti come fai la riconnessione delle tabelle collegate quando trasporti l'mde sulla macchina di test?
Sarebbe interessante "ispezionare" la stringa di connessione che ne risulta e confrontarla con quella dell'ambiente di sviluppo.
Il db di test e di sviluppo sono identici?
Ciao
Mat.


Per il ricollegamento tabelle, faccio allo stesso modo sia da codice su 
postazione sviluppo (Win8+Acess2013sp1) sia da postazione test 
(Win10+Access2013runtime)
-----------------------------------------------------
Dim MyDB As DAO.Database, tdf As DAO.TableDef
Set MyDB = OpenDatabase("pippo_DSN", False, False, 
"ODBC;pippo_DSN;UID=utente;PWD=password")
 
For count = 0 To MyDB.TableDefs.count - 1
    If Esiste_Oggetto(MyDB.TableDefs(count).Name, fTabella) Then
        CurrentDb.TableDefs.Delete MyDB.TableDefs(count).Name
        endif
 
    Set tdf = CurrentDb.CreateTableDef(MyDB.TableDefs(count).Name)
    tdf.Connect = "ODBC;DSN=pippo_DSN;UID=utente;PWD=password"
    tdf.Attributes = dbAttachSavePWD
    tdf.SourceTableName = MyDB.TableDefs(count).Name
    CurrentDb.TableDefs.Append tdf
    Next count
-----------------------------------------------------
 
La postazione test e' un Win10pro appena installato che gira come 
macchina virtuale dentro la macchina sviluppo (usando HyperV quello di 
serie su Win8), ed il db server sul quale si collegano e' lo stesso nel 
senso che da postazione sviluppo il percorso sara' in locale 
(C:\dati\db.fdb) mentre da macchina test sara' un percorso di rete 
(\\192.168.1.100\c:\dati\db.fdb) che punta allo stesso db fisico
Il server db e' Firebird 2.5.4, i driver odbc sono l'ultima versione la 
2.0.5.156 sia su macchina sviluppo che su Win10 di test
Mi sembra davvero strana questa cosa
 
 
 
 

 Mi sembra davvero strana questa cosa
 
Apparentemente non c'è proprio nulla che non vada.
Hai provato ad aprire il recordset tramite ado anziché dao?
Io da quando uso sql server come back-end utilizzo sempre ado, anche nei casi in cui devo accedere a dati residenti su mdb e non ho mai trovato problemi.
 
Ciao
Mat.


Stiamo parlando di tabelle collegate via odbc driver
E' li' che ho il problema, non riesco ad impostare la proprieta' 
'filter' della form per alcune date
Come faccio ad 'aprirlo usando ado' ?
 

 DATA_DOC <= #01/24/2017#", Currentproject.Connection, adOpenForwardOnly, adLockReadOnly, adCmdText
 
non avevi mai parlato della proprietà filter.
 
Ciao
Mat.


Si hai ragione
Inizialmente usavo l'apertura recordset usando  CurrentDB.Openrecordset
Giustamente mi hai fatto notare che il dbSQLPassThrough col CurrentDB, 
se stiamo usando tabelle collegate, ha poco senso
E difatti ti ho risposto che usando l'apertura recordset classica (set 
MyDB=OpenDatabase(...) + set MyRS=MyDB.openRecordset("....")  ) 
funzionava tutto
Restava il funzionamento della proprieta' filter di una classica form 
che visualizza dati da tabelle collegate, che soffre dello stesso 
problema se si cerca di filtrare per alcune date (quando il mese e' 
maggiore di 12 sembra che Access 'sistemi' le cose e inverte mese/giorno)
Non l'ho esplicitato perche' lo davo per scontato (nella mia capoccia)

 Non l'ho esplicitato perche' lo davo per scontato (nella mia capoccia)
 
:) nessun problema.
 
Non so cosa pensare di questo, c'è qualche combinazione di access (Runtime) + driver + s/o + non so cosa che si incastra.
 
Ultima domanda, è la prima volta che lavori con questo tipo di db (firebird) o lo usi da tempo ed è sempre andato tutto liscio?
 
Ciao
Mat.
 


E' 10 anni che lo uso in accoppiata ad Access 20003
Da pochi mesi sono passato alla 2013 e sono iniziati i casini