Newsgroup: it.comp.appl.access
Titolo: Campo DATETIME In Query PT SQL Server

Ciao a tutti,
utilizzo una query PT per scrivere delle righe in una tabella linkata ad 
un db SQL Server in Access 03.
Questa tabella he due campi DATETIME e quando cerco di scrivere la data 
utilizzando il formato iso (AAAAMMGG) formattando la data di oggi con 
format(date(),"YYYYMMDD") in sql mi ritrovo il campo a null.
utilizzando il debug mi fermo prima di scrivere e copio la stringa sql.
Se la incollo in Management studio invece mi scrive il campo correttamente.
Dove sbaglio?
Nicoletta


Prova con
CONVERT(DATETIME, '2003-12-31 00:00:00', 102) 

Pablitomf ha scritto:

ho provato ma mi dà
3085 Funzione 'CONVERT' non definita nell'espressione
nell'esecuzione.
Invece se copio e incollo in management studio funziona perfettamente 
(d'altra parte funzionava anche prima)
Nicky

Pablitomf ha scritto:

Non solo, ho provato a fare una semplice
delete from tabella where campodata='20090927' e nell'interattivo di sql 
funziona, da acces in passthrough mi dà errore
3464 Tipi di dati non corrispondenti nell'espressione criterio
Ma perché è diverso? sono disperata!!!
le query PT non sono come eseguire il comando nell'SQL nativo del dn in uso?

 uso?
questa invece credevo fosse così ma ho tanti dubbi.
ho provato a scrivere la data come stringa banalmente e la inserisce.
col CONVERT non c'è verso ed il mio problema è che domani in produzione 
avrò probabilmente un sql in inglese e la mia data in stringa va a farsi 
benedire!!!

 ha scritto nel messaggio 
news:4ace2c1a$0$831$4faf...@reader5.news.tin.it...

Ciao Nicoletta,
il miglior modo per passare la data a Sql server � quello che utilizzi 
ovvero il formato 'yyyymmdd' che il manuale definisce ISO.
L'unica cosa che mi viene in mente � che la query PT lavora su un database 
diverso da quello che vai a interrogare con Management studio.
Prova a controllare la propriet� di connessione della query PT.
Ciao
Giorgio Rancati.

 benedire!!!
esatto, non allontanarti dalla retta via!!
:-)
Giorgio Rancati

 ho provato a scrivere la data come stringa banalmente e la inserisce.
aspetta, questo passo mi � sfuggito...
Forse � meglio che posti il codice con cui prepari ed esegui la query PT.
Ciao
Giorgio Rancati 

 
Dim wrk As Workspace, dbswrk As Database
Dim qdf As QueryDef, dbs as database
Dim rst As Recordset
.
.
     On Error GoTo Export_Click_Err
.
     Set qdf = dbs.CreateQueryDef("")
     qdf.Connect = Connect_String
     qdf.ODBCTimeout = Odbc_Timeout
.
     Set wrk = DBEngine.Workspaces(0)
     Set dbswrk = OpenDatabase("", False, False, Connect_String)
.
     wrk.BeginTrans
.
     'elimino vecchia estrazione
     dbswrk.Execute StringaSql, dbSeeChanges
.
.
.
	'leggo dati da altre tabelle
         qdf.SQL = StringaSql
         qdf.ReturnsRecords = True
         Set rst = qdf.OpenRecordset(dbOpenSnapshot)
.
	do while not rst.EOF
		'scrivo nuova estrazione
	        dbswrk.Execute StringaInsert
		rst.movenext
	loop
     'conferma transazione
     wrk.CommitTrans
     rst.Close
     qdf.Close
     Set rst = Nothing
     Set qdf = Nothing
     Set dbs = Nothing
Export_Click_Wrk_Exit:
     DoCmd.Hourglass False
     On Error Resume Next
     dbswrk.Close
     Set dbswrk = Nothing
     wrk.Close
     Set wrk = Nothing
Export_Click_Exit:
     On Error Resume Next
     DoCmd.Hourglass False
     rst.Close
     Set qdf = Nothing
La stringa di inserimento l'ho provate in questi tre modi
StringaInsert = StringaInsert & "'" & Format(Now(), "yyyymmdd")
e mi inserisce NULL nel campo DATETIME di sql server
StringaInsert = StringaInsert & "',CONVERT(DATETIME,'" & Format(Now(), 
"yyyymmdd") & "', 112)
e mi restituisce errore 3085 Funzione 'CONVERT' non definita 
nell'espressione
StringaInsert = StringaInsert & "'2009-10-27'"
e mi scrive correttamente il campo DATETIME che riporta
2009-10-27 00:00:00.000
Prima di eseguire la scrittura mi copio la stringa costruita per 
l'insert e ti accodo al post il secondo esempio (quello che dovrei 
utilizzare)
INSERT INTO GWENXRIPPAG 
(IDESTRAZIONE,CODAZI,MATR,COGNOME,NOME,CODAGGR1,DESCAGGR1,CODAGGR2,DESCAGGR2,CODAGGR3,DESCAGGR3,CODAGGR4,DESCAGGR4,CODAGGR5,DESCAGGR5,CODAGGR6,DESCAGGR6,CODAGGR7,DESCAGGR7,CODAGGR8,DESCAGGR8,CODPAGA01,VALPAGA01,CODPAGA02,VALPAGA02,CODPAGA03,VALPAGA03,CODPAGA04,VALPAGA04,CODPAGA05,VALPAGA05,CODPAGA06,VALPAGA06,CODPAGA07,VALPAGA07,CODPAGA08,VALPAGA08,CODPAGA09,VALPAGA09,CODPAGA10,VALPAGA10,CODPAGA11,VALPAGA11,CODPAGA12,VALPAGA12,CODPAGA13,VALPAGA13,CODPAGA14,VALPAGA14,CODPAGA15,VALPAGA15,CODPAGA16,VALPAGA16,CODPAGA17,VALPAGA17,CODPAGA18,VALPAGA18,CODPAGA19,VALPAGA19,CODPAGA20,VALPAGA20,DATACONSOLIDAMENTO,DATAESTRAZIONE,DATADIAPCONSOLIDAMENTO,DATADIAPESTRAZIONE,TIPOESTRAZIONE) 
VALUES (1,'001','0000000001','AZZURRI DE ANDREI','ADRIANO LUIGI 
FRANCO','3','Descrizione 
modificata','Q','ssss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'MIOZ1', 
.6666,'MIOZ2', .3333,'P801', 22,'P802', 26,'P803', 
31,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'20090930',CONVERT(DATETIME,'20091008', 
102),1056497760,1056509280 ,'M');

 
Ciao Giorgio,
Il db ï¿œ uno soltanto quindi sono certa di non utilizzarne un altro.
Quando dici formato ISO intendi proprio passare la stringa papale papale?
INSERT INTO MIATAB (a,b,c,d,e,f,DATAESTRAZIONE) VALUES 
(1,2,3,4,5,6,'20090927') ?
devo cioï¿œ arrivare a costruire la stringa in quel modo?
perchï¿œ in realtï¿œ l'ho giï¿œ fatto, ma quello che ottengo da access ï¿œ NULL 
nel campo data mentre da mngmn studio inserisco correttamenjte la data.
E' questo comportamento diverso tra la query PT e quella 'interattiva' 
che mi lascia perplessa!
Nicoletta

 
 >
Giorgio ho trovato il mio errore!!!
quando eseguo la query non uso l'opzione  dbSQLPassThrough.
In realtï¿œ credevo erroneamente che avendo definito la stringa di 
connessione all'atto della definizione dell'oggetto database della 
workspace, automaticamente tutto ciï¿œ che riguardava quell'oggetto fosse 
passthrough
grazie per il prezioso aiuto datomi
Nicky

 grazie per il prezioso aiuto datomi
prego, se vuoi un consiglio abbandona il metodo che stai usando, in 
Access2007 ODBCdirect � stato rimosso e se in futuro passerai alla nuova 
versione otterrai un errore di runtime.
Ciao
Giorgio Rancati 

 
quale metodo?
quello delle transazioni?
dammi per cortesia un'indicazione di come fare e la seguirï¿œ.
Ho letto il documento Risorse Access + ODBC di Alex e ho seguito quello 
perchï¿œ dovevo fare una insert massiva su un db sql server e validarla 
solo al termine del ciclo
Nicky

 
Non ci voleva!!!
Ho cantato vittoria troppo presto!!!
Finchï¿œ scrivevo un record soltanto tutto andava correttamente (le prove 
le facevo cosï¿œ)
Quando i record sono stati 2 da scrivere, alla seconda insert mi ritorna
3146 ODBC: chiamata non riuscita
L'indice ï¿œ univoco ma i campi in chiave contengono valori diversi per i 
due record.
Nicky

 due record.
Ciao Nicoletta,
"chiamata non riuscita" � un errore generico, per capire cosa � successo 
devi vedere il messaggio di errore che restituisce il server.
Qui il modo per recuperarlo
----
ACC2000: How to Trap Specific ODBC Error Messages
http://support.microsoft.com/kb/209855/en-us
----
Ciao
Giorgio Rancati

 
Fatto e mi esce quanto segue
ODBC Error
  0
[Microsoft][SQL Server Native Client 10.0]Timeout query scaduto
ODBC Error
  3146
ODBC: chiamata non riuscita.
In pratica dopo aver fatto la prima insert che vedo eseguita dal debug, 
alla seconda esecuzione si ferma fino al temine del timeout e poi esce 
l'errore. Ovviamente mi fa il rollback e non vedo nessuna riga scritta.
Ho risposto anche al tuo post di A2007. Fammi sapere come mi dovrï¿œ 
muovere per il futuro
Nicky

 quale metodo?
no, non farci caso, a prima vista avevo scambiato la Opendatabase con la 
Openconnection.
Ciao
Giorgio Rancati

 ha scritto nel messaggio 
news:4acee284$0$1112$4faf...@reader2.news.tin.it...

Togliti tutti i problemi di conversione che tra a americano ed italiano sono 
sempre dolori
usa long
VALUES Clng(tuadata)

 l'errore. Ovviamente mi fa il rollback e non vedo nessuna riga scritta.
bisogna capire se � effettivamente un problema di timeout o se � un problema 
di blocco record.
Se � effettivamente un problema di timeout lo risolvi eseguendo i comandi 
non tramite Db.Execute ma tramite un oggetto querydef in cui andrai ad 
impostare un ODBCTimeout pi� alto.
Se � un problema di blocco dei record devi scoprire chi blocca cosa e vedere 
come risolvere.
Pu� essere d'aiuto la stored procedure sp_lock da eseguire con management 
studio nel contesto del tuo database, per come interpretarla ti rimando al 
manuale di sql server.
Ciao
Giorgio Rancati

 VALUES Clng(tuadata)
Ma, stiamo parlando di Sql server e di query Pass-Through
In Sql server non esiste la funzione Clng()
:-)
Giorgio Rancati 

 vedere come risolvere.
ad esempio: quel recordset che apri
----
'leggo dati da altre tabelle
   qdf.SQL = StringaSql
   qdf.ReturnsRecords = True
    Set rst = qdf.OpenRecordset(dbOpenSnapshot)
----
legge anche dalla tabella GWENXRIPPAG ?
Se s�, potrebbe bloccare le pagine della tabella fino a che tutti i dati non 
sono stati recuperati.
visto che il recordset � di tipo SnapShot puoi risolvere con:
----
If rst.Eof = False Then
   rst.Movelast
   rst.Movefirst
End If
----
subito dopo l'apertura del recordset
poi inizi il ciclo
----
do while not rst.EOF
...
...
ecc ecc
----
Ciao
Giorgio Rancati

 
Sono basita!!!
Sembra funzionare il movelast e movefirst.
Riesci a spiegarmelo in due parole visto che non comprendo il 
ragionamento che ci sta dietro?

 che ci sta dietro?
Ciao nicoletta,
Quando apri un recordset, il driver odbc comincia a richiedere una parte di 
dati poi sospende il flusso fino a quando non viene richiesto, la 
sospensione del flusso blocca la pagina (dell'indice o della tabella) che 
deve essere ancora letta.
Per verificarlo metti un punto di interruzione subito dopo l'apertura del 
recordset, esegui il codice, quando il codice si ferma al punto di 
interruzione apri Management studio, apri una nuova query sul tuo database e 
scrivi:
----
Exec sp_who2
----
tra le tante righe ne troverai una con SPID >50 (Spid Id) avente la colonna 
Status = SUSPENDED , nella colonna HostName troverai il nome del tuo 
computer, nella colonna DbName il nome del database e nella colona Command 
troverai SELECT.
Poi esegui
----
Exec sp_lock
----
nelle righe con SPID uguale a quello indicato da sp_who2 individua la/le 
righe con la colonna Type = PAG , nella colonna resource vi troverai i 
numeri di pagina bloccati. La colonna ObjId indica la tabella, puoi 
conoscerne il nome eseguendo:
----
SELECT OBJECT_NAME(xxxxxxxx)
----
dove xxxxxxxx � il valore che vedi in ObjId
se il blocco � a livello di pagine dell'indice, nella colonna IndId trovi il 
numero dell'indice, puoi conoscere il nome dell'indice eseguendo:
----
SELECT Name FROM sys.indexes
WHERE  Object_Id=xxxxxxxx AND index_id = y
----
dove xxxxxxxx � il valore che vedi in ObjId e y � il valore che vedi in 
IndId
Adesso torna in VBA ed esegui la riga con rst.Movelast, torna in management 
studio e riesegui la Exec sp_who2, vedrai che i blocchi a livello di pagina 
non ci sono pi� perch� il client ha recuperato tutti i records.
Spero di aver chiarito, quello che rimane da capire � il perch� di un blocco 
sulla tabella GWENXRIPPAG quando la stessa non fa parte della select di rst, 
con queste informazioni e indagando sui risultati di sp_lock dovresti capire 
il perch�.
Ciao
Giorgio Rancati

 
Grazie mille!
Ora faccio queste verifiche.
Intanto apro un altro post sulle query pt
Nicky